From edc6caf255da2cb5fd5aef51d58a168ae0f39cb3 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Mon, 9 Feb 2026 00:45:48 +0100 Subject: [PATCH] Cleanup and fix version ordering --- .../Playlists/PlaylistsFolder.cs | 5 +- .../Item/BaseItemRepository.cs | 7 +- MediaBrowser.Controller/Entities/Folder.cs | 30 +------- .../Entities/InternalItemsQuery.cs | 73 +++++++++---------- 4 files changed, 49 insertions(+), 66 deletions(-) diff --git a/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs b/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs index a5be2b616e..3bbbdd43a0 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs @@ -43,8 +43,9 @@ namespace Emby.Server.Implementations.Playlists } query.Recursive = true; - query.IncludeItemTypes = new[] { BaseItemKind.Playlist }; - return QueryWithPostFiltering2(query); + query.IncludeItemTypes = [BaseItemKind.Playlist]; + + return QueryWithPostFiltering(query); } public override string GetClientTypeName() diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs index c962979b17..46564b24cb 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs @@ -1719,6 +1719,7 @@ public sealed class BaseItemRepository : []; // Add or update LinkedChildren entries + int sortOrder = 0; foreach (var (childId, childType) in newLinkedChildren) { if (!existingChildIds.Contains(childId)) @@ -1739,14 +1740,17 @@ public sealed class BaseItemRepository ParentId = video.Id, ChildId = childId, ChildType = (DbLinkedChildType)childType, - SortOrder = null + SortOrder = sortOrder }); } else { existingLink.ChildType = (DbLinkedChildType)childType; + existingLink.SortOrder = sortOrder; existingLinkedChildren.Remove(existingLink); } + + sortOrder++; } // Remove orphaned alternate version links and their items @@ -3953,6 +3957,7 @@ public sealed class BaseItemRepository } return query + .OrderBy(lc => lc.SortOrder) .Select(lc => lc.ChildId) .ToList(); } diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 0c0558b4c1..4916ead69a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -730,7 +730,7 @@ namespace MediaBrowser.Controller.Entities public QueryResult QueryRecursive(InternalItemsQuery query) { - if (!query.ForceDirect && RequiresPostFiltering(query)) + if (!query.ForceDirect && CollapseBoxSetItems(query, this, query.User, ConfigurationManager)) { query.CollapseBoxSetItems = true; SetCollapseBoxSetItemTypes(query); @@ -743,15 +743,15 @@ namespace MediaBrowser.Controller.Entities query.Parent = this; } - if (RequiresPostFiltering2(query)) + if (query.IncludeItemTypes.Length == 1 && query.IncludeItemTypes[0] == BaseItemKind.BoxSet) { - return QueryWithPostFiltering2(query); + return QueryWithPostFiltering(query); } return LibraryManager.GetItemsResult(query); } - protected QueryResult QueryWithPostFiltering2(InternalItemsQuery query) + protected QueryResult QueryWithPostFiltering(InternalItemsQuery query) { var startIndex = query.StartIndex; var limit = query.Limit; @@ -797,28 +797,6 @@ namespace MediaBrowser.Controller.Entities returnItems.ToArray()); } - private bool RequiresPostFiltering2(InternalItemsQuery query) - { - if (query.IncludeItemTypes.Length == 1 && query.IncludeItemTypes[0] == BaseItemKind.BoxSet) - { - Logger.LogDebug("Query requires post-filtering due to BoxSet query"); - return true; - } - - return false; - } - - private bool RequiresPostFiltering(InternalItemsQuery query) - { - if (CollapseBoxSetItems(query, this, query.User, ConfigurationManager)) - { - Logger.LogDebug("Query requires post-filtering due to CollapseBoxSetItems"); - return true; - } - - return false; - } - private static BaseItem[] SortItemsByRequest(InternalItemsQuery query, IReadOnlyList items) { return items.OrderBy(i => Array.IndexOf(query.ItemIds, i.Id)).ToArray(); diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index 2824fb6954..23fce3f368 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -17,46 +17,45 @@ namespace MediaBrowser.Controller.Entities { public InternalItemsQuery() { - AlbumArtistIds = Array.Empty(); - AlbumIds = Array.Empty(); - AncestorIds = Array.Empty(); - ArtistIds = Array.Empty(); - BlockUnratedItems = Array.Empty(); - BoxSetLibraryFolders = Array.Empty(); - ChannelIds = Array.Empty(); - ContributingArtistIds = Array.Empty(); + AlbumArtistIds = []; + AlbumIds = []; + AncestorIds = []; + ArtistIds = []; + BlockUnratedItems = []; + BoxSetLibraryFolders = []; + ChannelIds = []; + ContributingArtistIds = []; DtoOptions = new DtoOptions(); EnableTotalRecordCount = true; - ExcludeArtistIds = Array.Empty(); - ExcludeInheritedTags = Array.Empty(); - IncludeInheritedTags = Array.Empty(); - ExcludeItemIds = Array.Empty(); - ExcludeItemTypes = Array.Empty(); - ExcludeTags = Array.Empty(); - ExtraTypes = Array.Empty(); - GenreIds = Array.Empty(); - Genres = Array.Empty(); + ExcludeArtistIds = []; + ExcludeInheritedTags = []; + IncludeInheritedTags = []; + ExcludeItemIds = []; + ExcludeItemTypes = []; + ExcludeTags = []; + GenreIds = []; + Genres = []; GroupByPresentationUniqueKey = true; - ImageTypes = Array.Empty(); - IncludeItemTypes = Array.Empty(); - ItemIds = Array.Empty(); - OwnerIds = Array.Empty(); - ExtraTypes = Array.Empty(); - MediaTypes = Array.Empty(); - OfficialRatings = Array.Empty(); - OrderBy = Array.Empty<(ItemSortBy, SortOrder)>(); - OwnerIds = Array.Empty(); - PersonIds = Array.Empty(); - PersonTypes = Array.Empty(); - PresetViews = Array.Empty(); - SeriesStatuses = Array.Empty(); - SourceTypes = Array.Empty(); - StudioIds = Array.Empty(); - Tags = Array.Empty(); - TopParentIds = Array.Empty(); - TrailerTypes = Array.Empty(); - VideoTypes = Array.Empty(); - Years = Array.Empty(); + ImageTypes = []; + IncludeItemTypes = []; + ItemIds = []; + OwnerIds = []; + ExtraTypes = []; + MediaTypes = []; + OfficialRatings = []; + OrderBy = []; + OwnerIds = []; + PersonIds = []; + PersonTypes = []; + PresetViews = []; + SeriesStatuses = []; + SourceTypes = []; + StudioIds = []; + Tags = []; + TopParentIds = []; + TrailerTypes = []; + VideoTypes = []; + Years = []; SkipDeserialization = false; }