From 4b36146b34b87d04429077e812a55931687a041b Mon Sep 17 00:00:00 2001 From: Aubrey Benedetti Date: Thu, 15 May 2025 01:38:59 -0400 Subject: [PATCH 1/3] Fix play all & shuffle not working on Person --- src/components/playback/playbackmanager.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index e8a1095b6..5d97c511f 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1882,6 +1882,15 @@ export class PlaybackManager { SortBy: options.shuffle ? 'Random' : 'SortName', MediaTypes: 'Video' }, queryOptions)); + case 'Person': + return getItemsForPlayback(serverId, mergePlaybackQueries({ + PersonIds: firstItem.Id, + ParentId: firstItem.ParentId, + Filters: 'IsNotFolder', + Recursive: true, + SortBy: options.shuffle ? 'Random' : 'SortName', + MediaTypes: 'Video' + }, queryOptions)); case 'Series': case 'Season': return getSeriesOrSeasonPlaybackPromise(firstItem, options, items); From d5423d2d563fd0ae4aca9714a04efc06688973c6 Mon Sep 17 00:00:00 2001 From: Aubrey Benedetti Date: Thu, 15 May 2025 01:39:40 -0400 Subject: [PATCH 2/3] Add qm3jp to contributors list --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a7b330971..574212fc8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -101,6 +101,7 @@ - [diegoeche](https://github.com/diegoeche) - [Free O'Toole](https://github.com/freeotoole) - [TheBosZ](https://github.com/thebosz) +- [qm3jp](https://github.com/qm3jp) ## Emby Contributors From a516de5fc7e65456c258b7b67b339b165ad88b16 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 30 Sep 2025 08:24:00 -0400 Subject: [PATCH 3/3] Use enum values in getPlaybackPromise --- src/components/playback/playbackmanager.js | 76 ++++++++++++---------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 5d97c511f..8fad4915f 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,7 +1,9 @@ -import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind.js'; -import { PlaybackErrorCode } from '@jellyfin/sdk/lib/generated-client/models/playback-error-code.js'; -import { getMediaInfoApi } from '@jellyfin/sdk/lib/utils/api/media-info-api'; +import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; +import { ItemFilter } from '@jellyfin/sdk/lib/generated-client/models/item-filter'; +import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; +import { PlaybackErrorCode } from '@jellyfin/sdk/lib/generated-client/models/playback-error-code'; +import { getMediaInfoApi } from '@jellyfin/sdk/lib/utils/api/media-info-api'; import merge from 'lodash-es/merge'; import Screenfull from 'screenfull'; @@ -166,9 +168,9 @@ function createStreamInfoFromUrlItem(item) { function mergePlaybackQueries(obj1, obj2) { const query = merge({}, obj1, obj2); - const filters = query.Filters ? query.Filters.split(',') : []; - if (filters.indexOf('IsNotFolder') === -1) { - filters.push('IsNotFolder'); + const filters = query.Filters?.split(',') || []; + if (!filters.includes(ItemFilter.IsNotFolder)) { + filters.push(ItemFilter.IsNotFolder); } query.Filters = filters.join(','); return query; @@ -1828,73 +1830,75 @@ export class PlaybackManager { } function getPlaybackPromise(firstItem, serverId, options, queryOptions, items) { + const SortBy = options.shuffle ? ItemSortBy.Random : ItemSortBy.SortName; + switch (firstItem.Type) { - case 'Program': + case BaseItemKind.Program: return getItemsForPlayback(serverId, { Ids: firstItem.ChannelId }); - case 'Playlist': + case BaseItemKind.Playlist: return getItemsForPlayback(serverId, { ParentId: firstItem.Id, - SortBy: options.shuffle ? 'Random' : null + SortBy: options.shuffle ? SortBy : undefined }); - case 'MusicArtist': + case BaseItemKind.MusicArtist: + return getItemsForPlayback(serverId, mergePlaybackQueries({ ArtistIds: firstItem.Id, - Filters: 'IsNotFolder', Recursive: true, - SortBy: options.shuffle ? 'Random' : 'Album,ParentIndexNumber,IndexNumber,SortName', - MediaTypes: 'Audio' + SortBy: options.shuffle ? SortBy : [ + ItemSortBy.Album, + ItemSortBy.ParentIndexNumber, + ItemSortBy.IndexNumber, + ItemSortBy.SortName + ].join(','), + MediaTypes: MediaType.Audio }, queryOptions)); - case 'PhotoAlbum': + case BaseItemKind.PhotoAlbum: return getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.Id, - Filters: 'IsNotFolder', // Setting this to true may cause some incorrect sorting Recursive: false, - SortBy: options.shuffle ? 'Random' : 'SortName', + SortBy, // Only include Photos because we do not handle mixed queues currently - MediaTypes: 'Photo', + MediaTypes: MediaType.Photo, Limit: UNLIMITED_ITEMS }, queryOptions)); - case 'MusicGenre': + case BaseItemKind.MusicGenre: return getItemsForPlayback(serverId, mergePlaybackQueries({ GenreIds: firstItem.Id, - Filters: 'IsNotFolder', Recursive: true, - SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: 'Audio' + SortBy, + MediaTypes: MediaType.Audio }, queryOptions)); - case 'Genre': + case BaseItemKind.Genre: return getItemsForPlayback(serverId, mergePlaybackQueries({ GenreIds: firstItem.Id, ParentId: firstItem.ParentId, - Filters: 'IsNotFolder', Recursive: true, - SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: 'Video' + SortBy, + MediaTypes: MediaType.Video }, queryOptions)); - case 'Studio': + case BaseItemKind.Studio: return getItemsForPlayback(serverId, mergePlaybackQueries({ StudioIds: firstItem.Id, - Filters: 'IsNotFolder', Recursive: true, - SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: 'Video' + SortBy, + MediaTypes: MediaType.Video }, queryOptions)); - case 'Person': + case BaseItemKind.Person: return getItemsForPlayback(serverId, mergePlaybackQueries({ PersonIds: firstItem.Id, ParentId: firstItem.ParentId, - Filters: 'IsNotFolder', Recursive: true, - SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: 'Video' + SortBy, + MediaTypes: MediaType.Video }, queryOptions)); - case 'Series': - case 'Season': + case BaseItemKind.Series: + case BaseItemKind.Season: return getSeriesOrSeasonPlaybackPromise(firstItem, options, items); - case 'Episode': + case BaseItemKind.Episode: return getEpisodePlaybackPromise(firstItem, options, items); }