diff options
| author | Cody Robibero <cody@robibe.ro> | 2026-08-04 18:01:13 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-04 18:01:13 -0400 |
| commit | d9d9efc96e512330de6a48916fd0dbf213affc95 (patch) | |
| tree | 4837da23103dbf009343820f83af21bd2e8f17f5 /Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs | |
| parent | dd1380e562024de04f95f6c06f3c0aa2b1a6986c (diff) | |
| parent | 55518c06ee5cc7d7e063a46233f4671476a3e337 (diff) | |
Only treat series and seasons as resumable folders
Diffstat (limited to 'Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs')
| -rw-r--r-- | Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs index d1af8e3527..ca60085e4d 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs @@ -499,16 +499,21 @@ public sealed partial class BaseItemRepository var inProgress = context.UserData .Where(ud => ud.UserId == userId && ud.PlaybackPositionTicks > 0); - // Folders are resumable when a descendant is in progress, or when they hold both played and - // unplayed descendants (partially watched). Alternate versions keep their own progress, so - // they count towards the in-progress check but not towards the played/unplayed one. + // Series and Seasons are resumable when a descendant is in progress, or when they hold both + // played and unplayed descendants (partially watched). Alternate versions keep their own + // progress, so they count towards the in-progress check but not towards the played/unplayed one. var leafItems = GetAccessFilteredLeafItemsQuery(context, filter.User!); var inProgressLeafItems = GetAccessFilteredLeafItemsQuery(context, filter.User!, includeOwnedItems: true) .Where(e => e.UserData!.Any(ud => ud.UserId == userId && ud.PlaybackPositionTicks > 0)); - var folderResumableFilter = BuildHasDescendantFilter(context, inProgressLeafItems) - .Or(BuildHasDescendantFilter(context, leafItems.Where(e => e.UserData!.Any(ud => ud.UserId == userId && ud.Played))) - .And(BuildHasDescendantFilter(context, leafItems.Where(e => !e.UserData!.Any(ud => ud.UserId == userId && ud.Played))))); + // Every other folder kind is a container rather than one continuous piece of media + var resumableFolderTypes = _resumableFolderKinds + .Select(kind => _itemTypeLookup.BaseItemKindNames.GetValueOrDefault(kind)) + .ToArray(); + var folderIsResumableFilter = IsFolderFilter.And(e => resumableFolderTypes.Contains(e.Type)) + .And(BuildHasDescendantFilter(context, inProgressLeafItems) + .Or(BuildHasDescendantFilter(context, leafItems.Where(e => e.UserData!.Any(ud => ud.UserId == userId && ud.Played))) + .And(BuildHasDescendantFilter(context, leafItems.Where(e => !e.UserData!.Any(ud => ud.UserId == userId && ud.Played)))))); if (isResumable) { @@ -516,7 +521,7 @@ public sealed partial class BaseItemRepository // Match each version on its own progress rather than coalescing onto the primary. var inProgressIds = inProgress.Select(ud => ud.ItemId); - baseQuery = baseQuery.Where(IsFolderFilter.And(folderResumableFilter) + baseQuery = baseQuery.Where(folderIsResumableFilter .Or(IsFolderFilter.Not().And(e => inProgressIds.Contains(e.Id)))); // When several versions of the same item are in progress, keep only the most recently played one, use id as tiebreaker. @@ -543,7 +548,7 @@ public sealed partial class BaseItemRepository var resumableMovieIds = inProgress .Join(context.BaseItems, ud => ud.ItemId, bi => bi.Id, (ud, bi) => bi.PrimaryVersionId ?? bi.Id); - baseQuery = baseQuery.Where(IsFolderFilter.And(folderResumableFilter.Not()) + baseQuery = baseQuery.Where(IsFolderFilter.And(folderIsResumableFilter.Not()) .Or(IsFolderFilter.Not().And(e => !resumableMovieIds.Contains(e.Id)))); } } |
