aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server.Implementations
diff options
context:
space:
mode:
authorShadowghost <Ghost_of_Stone@web.de>2026-02-09 09:13:31 +0100
committerShadowghost <Ghost_of_Stone@web.de>2026-02-09 09:13:31 +0100
commit5dcec831f3bc83761d8170d25eab2cca310ae7cb (patch)
treef38bdefeea4c11abe7bb3d62ecab48c8c002c62b /Jellyfin.Server.Implementations
parent737abe6f3a48a1fa792ff2d24dad45a04880717f (diff)
Fix naming filter when collapsing into boxsets
Diffstat (limited to 'Jellyfin.Server.Implementations')
-rw-r--r--Jellyfin.Server.Implementations/Item/BaseItemRepository.cs48
1 files changed, 33 insertions, 15 deletions
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 46564b24cb..97263e97ee 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -998,6 +998,10 @@ public sealed class BaseItemRepository
if (filter.CollapseBoxSetItems == true)
{
dbQuery = ApplyBoxSetCollapsing(context, dbQuery, filter.CollapseBoxSetItemTypes);
+
+ // Apply name-range filters after collapse so BoxSets are filtered by their own name,
+ // not by their children's names.
+ dbQuery = ApplyNameFilters(dbQuery, filter);
}
dbQuery = ApplyOrder(dbQuery, filter, context);
@@ -1078,6 +1082,29 @@ public sealed class BaseItemRepository
return context.BaseItems.Where(e => collapsedIds.Contains(e.Id));
}
+ private static IQueryable<BaseItemEntity> ApplyNameFilters(IQueryable<BaseItemEntity> dbQuery, InternalItemsQuery filter)
+ {
+ if (!string.IsNullOrWhiteSpace(filter.NameStartsWith))
+ {
+ var nameStartsWithLower = filter.NameStartsWith.ToLowerInvariant();
+ dbQuery = dbQuery.Where(e => e.SortName!.ToLower().StartsWith(nameStartsWithLower));
+ }
+
+ if (!string.IsNullOrWhiteSpace(filter.NameStartsWithOrGreater))
+ {
+ var startsOrGreaterLower = filter.NameStartsWithOrGreater.ToLowerInvariant();
+ dbQuery = dbQuery.Where(e => e.SortName!.ToLower().CompareTo(startsOrGreaterLower) >= 0);
+ }
+
+ if (!string.IsNullOrWhiteSpace(filter.NameLessThan))
+ {
+ var lessThanLower = filter.NameLessThan.ToLowerInvariant();
+ dbQuery = dbQuery.Where(e => e.SortName!.ToLower().CompareTo(lessThanLower) < 0);
+ }
+
+ return dbQuery;
+ }
+
private static IQueryable<BaseItemEntity> ApplyNavigations(IQueryable<BaseItemEntity> dbQuery, InternalItemsQuery filter)
{
if (filter.TrailerTypes.Length > 0 || filter.IncludeItemTypes.Contains(BaseItemKind.Trailer))
@@ -3073,22 +3100,13 @@ public sealed class BaseItemRepository
}
}
- if (!string.IsNullOrWhiteSpace(filter.NameStartsWith))
- {
- var nameStartsWithLower = filter.NameStartsWith.ToLowerInvariant();
- baseQuery = baseQuery.Where(e => e.SortName!.ToLower().StartsWith(nameStartsWithLower));
- }
-
- if (!string.IsNullOrWhiteSpace(filter.NameStartsWithOrGreater))
- {
- var startsOrGreaterLower = filter.NameStartsWithOrGreater.ToLowerInvariant();
- baseQuery = baseQuery.Where(e => e.SortName!.ToLower().CompareTo(startsOrGreaterLower) >= 0);
- }
-
- if (!string.IsNullOrWhiteSpace(filter.NameLessThan))
+ // When box set collapsing is active, defer name-range filters to after the collapse.
+ // Otherwise, items are filtered by their own name but then collapsed into a BoxSet
+ // whose name may fall in a different range (e.g. "21 Jump Street" is under "#"
+ // but its BoxSet "Jump Street Collection" should appear under "J").
+ if (filter.CollapseBoxSetItems != true)
{
- var lessThanLower = filter.NameLessThan.ToLowerInvariant();
- baseQuery = baseQuery.Where(e => e.SortName!.ToLower().CompareTo(lessThanLower) < 0);
+ baseQuery = ApplyNameFilters(baseQuery, filter);
}
if (filter.ImageTypes.Length > 0)