diff options
| author | Shadowghost <Ghost_of_Stone@web.de> | 2026-06-09 23:23:03 +0200 |
|---|---|---|
| committer | Shadowghost <Ghost_of_Stone@web.de> | 2026-06-09 23:23:03 +0200 |
| commit | 0874a26131a5a1e9d62fb7231acbaf9eb921b5c8 (patch) | |
| tree | 95dd2ed86e5afa7429afb4ceffe0e59bea349726 /Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs | |
| parent | fe1d8d88401a5536b03bb99bd0f4f126665bf3a0 (diff) | |
Coalesce alternate-version progress onto primary in resume filter
Diffstat (limited to 'Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs')
| -rw-r--r-- | Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs index 22f7cc3550..a9856f2e76 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.TranslateQuery.cs @@ -519,7 +519,6 @@ public sealed partial class BaseItemRepository // In-progress user data rows; alternate versions track their own progress. var inProgress = context.UserData .Where(ud => ud.UserId == userId && ud.PlaybackPositionTicks > 0); - var resumableItemIds = inProgress.Select(ud => ud.ItemId); if (hasSeries) { @@ -544,13 +543,26 @@ public sealed partial class BaseItemRepository .Where(s => s.HasInProgress || (s.HasPlayed && s.HasUnplayed)) .Select(s => s.SeriesId); + // Non-series items: resumable if the item or any of its alternate versions has + // PlaybackPositionTicks > 0. Alternate versions (PrimaryVersionId set) are excluded + // from the base query, so coalesce their progress onto the primary's id. + var resumableMovieIds = context.BaseItems + .Where(bi => bi.UserData!.Any(ud => ud.UserId == userId && ud.PlaybackPositionTicks > 0)) + .Select(bi => bi.PrimaryVersionId ?? bi.Id); + baseQuery = baseQuery.Where(e => (e.Type == seriesTypeName && resumableSeriesIds.Contains(e.Id) == isResumable) - || (e.Type != seriesTypeName && resumableItemIds.Contains(e.Id) == isResumable)); + || (e.Type != seriesTypeName && resumableMovieIds.Contains(e.Id) == isResumable)); } else { - baseQuery = baseQuery.Where(e => resumableItemIds.Contains(e.Id) == isResumable); + // Resumable if the item or any of its alternate versions has PlaybackPositionTicks > 0. + // Alternate versions (PrimaryVersionId set) are excluded from the base query, so + // coalesce their progress onto the primary's id. + var resumableMovieIds = context.BaseItems + .Where(bi => bi.UserData!.Any(ud => ud.UserId == userId && ud.PlaybackPositionTicks > 0)) + .Select(bi => bi.PrimaryVersionId ?? bi.Id); + baseQuery = baseQuery.Where(e => resumableMovieIds.Contains(e.Id) == isResumable); } if (isResumable) |
