diff --git a/backend/app.js b/backend/app.js index 20cd52d..ef9bdf1 100644 --- a/backend/app.js +++ b/backend/app.js @@ -2399,14 +2399,17 @@ app.get('/api/stream', optionalJwt, async (req, res) => { let uid = decodeURIComponent(req.query.uid); let file_path = null; + let file_obj = null; const multiUserMode = config_api.getConfigItem('ytdl_multi_user_mode'); if (!multiUserMode || req.isAuthenticated() || req.can_watch) { - const file_obj = await db_api.getVideo(uid, uuid, sub_id); + file_obj = await db_api.getVideo(uid, uuid, sub_id); if (file_obj) file_path = file_obj['path']; else file_path = null; } - + if (!fs.existsSync(file_path)) { + logger.error(`File ${file_path} could not be found! UID: ${uid}, ID: ${file_obj.id}`); + } const stat = fs.statSync(file_path) const fileSize = stat.size const range = req.headers.range diff --git a/backend/db.js b/backend/db.js index 84032dd..02bcea5 100644 --- a/backend/db.js +++ b/backend/db.js @@ -413,6 +413,7 @@ exports.createPlaylist = async (playlist_name, uids, type, thumbnail_url, user_u thumbnailURL: thumbnail_url, type: type, registered: Date.now(), + randomize_order: false }; const duration = await exports.calculatePlaylistDuration(new_playlist, user_uid); diff --git a/src/app/dialogs/modify-playlist/modify-playlist.component.html b/src/app/dialogs/modify-playlist/modify-playlist.component.html index a8471bb..6c234c3 100644 --- a/src/app/dialogs/modify-playlist/modify-playlist.component.html +++ b/src/app/dialogs/modify-playlist/modify-playlist.component.html @@ -9,6 +9,10 @@ +
+ Randomize order when playing +
+
Normal order  diff --git a/src/app/dialogs/modify-playlist/modify-playlist.component.ts b/src/app/dialogs/modify-playlist/modify-playlist.component.ts index b482bb8..56b123b 100644 --- a/src/app/dialogs/modify-playlist/modify-playlist.component.ts +++ b/src/app/dialogs/modify-playlist/modify-playlist.component.ts @@ -85,6 +85,7 @@ export class ModifyPlaylistComponent implements OnInit { index = this.playlist_file_objs.length - 1 - index; } this.playlist_file_objs.splice(index, 1); + this.playlist.uids.splice(index, 1); this.processFiles(); } diff --git a/src/app/player/player.component.html b/src/app/player/player.component.html index a0dd7d2..c39afed 100644 --- a/src/app/player/player.component.html +++ b/src/app/player/player.component.html @@ -55,13 +55,13 @@ -
+
diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index c4a0527..e6f6767 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -233,6 +233,9 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { } this.playlist.push(mediaObject); } + if (this.db_playlist && this.db_playlist['randomize_order']) { + this.shuffleArray(this.playlist); + } this.currentItem = this.playlist[this.currentIndex]; this.original_playlist = JSON.stringify(this.playlist); this.show_player = true; @@ -409,6 +412,13 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { this.api.playbackRate = speed; } + shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + } + // snackbar helper public openSnackBar(message: string, action: string) { this.snackBar.open(message, action, {