diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 5d97c511f5..8fad4915f4 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); }