From ee791f9d0d2b7c0bc96e6109415c1032d92f2a24 Mon Sep 17 00:00:00 2001 From: MrK Date: Wed, 20 Sep 2023 17:44:55 +0100 Subject: [PATCH] Changed from using sortOptions to using already implemented queryOptions Null verification for parentid on shortcuts.js itemContextMenu is now obeying to sorting --- src/components/itemContextMenu.js | 30 +++++++++++- src/components/playback/playbackmanager.js | 55 +++++++--------------- src/components/shortcuts.js | 4 +- src/controllers/list.js | 4 +- src/scripts/settings/userSettings.js | 24 ++++++++-- 5 files changed, 70 insertions(+), 47 deletions(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 0ec982f15a..fe01437b9d 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -9,6 +9,8 @@ import itemHelper from './itemHelper'; import { playbackManager } from './playback/playbackmanager'; import ServerConnections from './ServerConnections'; import toast from './toast/toast'; +import * as userSettings from '../scripts/settings/userSettings'; +import libraryMenu from '../scripts/libraryMenu'; export function getCommands(options) { const item = options.item; @@ -567,6 +569,29 @@ function deleteSeriesTimer(apiClient, item, resolve, command) { }); } +function getSettingsKey(item) { + if (item.IsFolder) { + return 'Folder'; + } + const itemType = item.MediaType; + switch (itemType) { + case 'Movie': + case 'BoxSet': + case 'Video': + return 'movies'; + case 'Audio': + return 'songs'; + case 'MusicAlbum': + return 'musicalbums'; + case 'MusicArtist': + return 'musicartists'; + case 'MusicGenre': + return 'genres'; + case 'MusicPlaylist': + return 'musicplaylists'; + } +} + function play(item, resume, queue, queueNext) { let method = 'play'; if (queue) { @@ -589,9 +614,12 @@ function play(item, resume, queue, queueNext) { serverId: item.ServerId }); } else { + const sortParentId = item.IsFolder ? ('items-' + item.Id) : libraryMenu.getTopParentId() + '-' + getSettingsKey(item); + const sortValues = userSettings.getSortValues(sortParentId); playbackManager[method]({ items: [item], - startPositionTicks: startPosition + startPositionTicks: startPosition, + queryOptions: sortValues }); } } diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 60173e8ed2..1981fdc57e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -145,7 +145,10 @@ function createStreamInfoFromUrlItem(item) { } function mergePlaybackQueries(obj1, obj2) { - const query = Object.assign(obj1, obj2); + const query = obj1; + for (const key in obj2) { + if (obj2[key] !== undefined) query[key] = obj2[key]; + } const filters = query.Filters ? query.Filters.split(',') : []; if (filters.indexOf('IsNotFolder') === -1) { @@ -1773,18 +1776,6 @@ class PlaybackManager { }); } - function getSortOptions(options) { - const sortOptions = options.sortOptions || {}; - let sortByValue = options.shuffle ? 'Random' : sortOptions.sortBy; - if (sortByValue == null) { - sortByValue = 'SortName'; - } - return { - sortBy: sortByValue, - sortOrder: sortOptions.sortOrder - }; - } - function translateItemsForPlayback(items, options) { if (items.length > 1 && options && options.ids) { // Use the original request id array for sorting the result in the proper order @@ -1800,8 +1791,6 @@ class PlaybackManager { const queryOptions = options.queryOptions || {}; - const sortOptions = getSortOptions(options); - if (firstItem.Type === 'Program') { promise = getItemsForPlayback(serverId, { Ids: firstItem.ChannelId @@ -1812,25 +1801,23 @@ class PlaybackManager { SortBy: options.shuffle ? 'Random' : null }); } else if (firstItem.Type === 'MusicArtist') { - promise = getItemsForPlayback(serverId, { + promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ArtistIds: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, - SortBy: sortOptions.sortBy, - SortOrder: sortOptions.sortOrder, + SortBy: options.shuffle ? 'Random' : 'SortName', MediaTypes: 'Audio' - }); + }, queryOptions)); } else if (firstItem.MediaType === 'Photo') { - promise = getItemsForPlayback(serverId, { + promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.ParentId, Filters: 'IsNotFolder', // Setting this to true may cause some incorrect sorting Recursive: false, - SortBy: sortOptions.sortBy, - SortOrder: sortOptions.sortOrder, MediaTypes: 'Photo,Video', + sortBy: options.shuffle ? 'Random' : 'SortName', Limit: UNLIMITED_ITEMS - }).then(function (result) { + }, queryOptions)).then(function (result) { const playbackItems = result.Items; let index = playbackItems.map(function (i) { @@ -1846,45 +1833,40 @@ class PlaybackManager { return Promise.resolve(result); }); } else if (firstItem.Type === 'PhotoAlbum') { - promise = getItemsForPlayback(serverId, { + promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.Id, Filters: 'IsNotFolder', // Setting this to true may cause some incorrect sorting Recursive: false, - SortBy: sortOptions.sortBy, - SortOrder: sortOptions.sortOrder, + SortBy: options.shuffle ? 'Random' : 'SortName', // Only include Photos because we do not handle mixed queues currently MediaTypes: 'Photo', Limit: UNLIMITED_ITEMS - }); + }, queryOptions)); } else if (firstItem.Type === 'MusicGenre') { - promise = getItemsForPlayback(serverId, { + promise = getItemsForPlayback(serverId, mergePlaybackQueries({ GenreIds: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, - SortBy: sortOptions.sortBy, - SortOrder: sortOptions.sortOrder, + SortBy: options.shuffle ? 'Random' : 'SortName', MediaTypes: 'Audio' - }); + })); } else if (firstItem.IsFolder && firstItem.CollectionType === 'homevideos') { promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.Id, Filters: 'IsNotFolder', Recursive: true, - SortBy: sortOptions.sortBy, - SortOrder: sortOptions.sortOrder, + SortBy: options.shuffle ? 'Random' : 'SortName', // Only include Photos because we do not handle mixed queues currently MediaTypes: 'Photo', Limit: UNLIMITED_ITEMS }, queryOptions)); } else if (firstItem.IsFolder) { let sortBy = null; - let sortOrder = null; if (options.shuffle) { sortBy = 'Random'; } else if (firstItem.Type !== 'BoxSet') { - sortBy = sortOptions.sortBy; - sortOrder = sortOptions.sortOrder; + sortBy = 'SortName'; } promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.Id, @@ -1892,7 +1874,6 @@ class PlaybackManager { Recursive: true, // These are pre-sorted SortBy: sortBy, - SortOrder: sortOrder, MediaTypes: 'Audio,Video' }, queryOptions)); } else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) { diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 70bf264fc3..0fca127afa 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -180,7 +180,7 @@ function executeAction(card, target, action) { const itemsContainer = dom.parentWithClass(card, 'itemsContainer'); - const sortParentId = 'items-' + (item.IsFolder ? item.Id : itemsContainer.getAttribute('data-parentid')) + '-Folder'; + const sortParentId = 'items-' + (item.IsFolder ? item.Id : itemsContainer?.getAttribute('data-parentid')) + '-Folder'; const serverId = item.ServerId; const type = item.Type; @@ -211,7 +211,7 @@ function executeAction(card, target, action) { ids: [playableItemId], startPositionTicks: startPositionTicks, serverId: serverId, - sortOptions: userSettings.getSortValues(sortParentId) + queryOptions: userSettings.getSortValuesLegacy(sortParentId, 'SortName') }); } else { console.warn('Unable to play item', item); diff --git a/src/controllers/list.js b/src/controllers/list.js index ded9d921ed..31f3d5000e 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -728,7 +728,7 @@ class ItemsView { playbackManager.play({ items: [currentItem], autoplay: true, - sortOptions: values + queryOptions: values }); } else { getItems(self, self.params, currentItem, null, 0, 300).then(function (result) { @@ -962,7 +962,7 @@ class ItemsView { getSortValues() { const basekey = this.getSettingsKey(); - return userSettings.getSortValues(basekey); + return userSettings.getSortValuesLegacy(basekey, this.getDefaultSortBy()); } getDefaultSortBy() { diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 26fc2100e5..339da9687c 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -624,15 +624,28 @@ export class UserSettings { } /** - * Gets the current sort values + * Gets the current sort values (Legacy - Non-JSON) + * (old views such as list.js [Photos] will + * use this one) + * @param {string} key - Filter key. + * @return {Object} sortOptions object + */ + getSortValuesLegacy(key, defaultSortBy) { + return { + sortBy: this.getFilter(key + '-sortby') || defaultSortBy, + sortOrder: this.getFilter(key + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending' + }; + } + + /** + * Gets the current sort values (JSON) + * (new views such as MoviesView will use + * this one) * @param {string} key - Filter key. * @return {Object} sortOptions object */ getSortValues(key) { - return { - sortBy: this.getFilter(key + '-sortby'), - sortOrder: this.getFilter(key + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending' - }; + return this.loadQuerySettings(key, {}); } } @@ -684,4 +697,5 @@ export const customCss = currentSettings.customCss.bind(currentSettings); export const disableCustomCss = currentSettings.disableCustomCss.bind(currentSettings); export const getSavedView = currentSettings.getSavedView.bind(currentSettings); export const saveViewSetting = currentSettings.saveViewSetting.bind(currentSettings); +export const getSortValuesLegacy = currentSettings.getSortValuesLegacy.bind(currentSettings); export const getSortValues = currentSettings.getSortValues.bind(currentSettings);