aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2026-02-21 19:58:00 +0100
committerShadowghost <Ghost_of_Stone@web.de>2026-02-21 19:58:00 +0100
commit0f1a6fe4c27fa4c91b7e8dcd577960c568fa3c03 (patch)
tree4001c37074b8efc538f68c85147b6165b7b1125c
parent561e78efb40c2025bdd02df87da7d456cf97c045 (diff)
Fix IsPlayed filter and setting BoxSet played/unplayed
-rw-r--r--Jellyfin.Server.Implementations/Item/BaseItemRepository.cs27
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs28
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs9
3 files changed, 64 insertions, 0 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 2c0ec69941..c0476b00e7 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -3323,6 +3323,33 @@ public sealed class BaseItemRepository
baseQuery = baseQuery.Where(s => !playedSeriesIdList.Contains(s.Id));
}
}
+ else if (filter.IncludeItemTypes.Length == 1 && filter.IncludeItemTypes[0] == BaseItemKind.BoxSet)
+ {
+ var boxSetIds = baseQuery.Select(e => e.Id).ToList();
+ var userId = filter.User!.Id;
+ var playedBoxSetIds = new List<Guid>(boxSetIds.Count);
+ foreach (var boxSetId in boxSetIds)
+ {
+ var descendantIds = DescendantQueryHelper.GetAllDescendantIds(context, boxSetId);
+ var leafItems = context.BaseItems
+ .Where(e => descendantIds.Contains(e.Id) && !e.IsFolder && !e.IsVirtualItem);
+
+ if (leafItems.Any()
+ && leafItems.All(f => f.UserData!.Any(ud => ud.UserId == userId && ud.Played)))
+ {
+ playedBoxSetIds.Add(boxSetId);
+ }
+ }
+
+ if (filter.IsPlayed.Value)
+ {
+ baseQuery = baseQuery.Where(s => playedBoxSetIds.Contains(s.Id));
+ }
+ else
+ {
+ baseQuery = baseQuery.Where(s => !playedBoxSetIds.Contains(s.Id));
+ }
+ }
else
{
var playedItemIds = context.UserData
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index 2166a58024..8216937cad 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -194,6 +194,34 @@ namespace MediaBrowser.Controller.Entities.Movies
return true;
}
+ public override void MarkPlayed(User user, DateTime? datePlayed, bool resetPosition)
+ {
+ if (IsLegacyBoxSet)
+ {
+ base.MarkPlayed(user, datePlayed, resetPosition);
+ return;
+ }
+
+ foreach (var item in GetLinkedChildren(user))
+ {
+ item.MarkPlayed(user, datePlayed, resetPosition);
+ }
+ }
+
+ public override void MarkUnplayed(User user)
+ {
+ if (IsLegacyBoxSet)
+ {
+ base.MarkUnplayed(user);
+ return;
+ }
+
+ foreach (var item in GetLinkedChildren(user))
+ {
+ item.MarkUnplayed(user);
+ }
+ }
+
public override bool IsVisibleStandalone(User user)
{
if (IsLegacyBoxSet)
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 47d732c745..81b0fe1c8c 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -539,6 +539,15 @@ namespace MediaBrowser.Controller.Entities
}
}
+ if (query.IsPlayed.HasValue)
+ {
+ userData ??= userDataManager.GetUserData(user, item);
+ if (item.IsPlayed(user, userData) != query.IsPlayed.Value)
+ {
+ return false;
+ }
+ }
+
if (query.IsLocked.HasValue)
{
var val = query.IsLocked.Value;