From d06ce1f1e035d4630121f45dcadbdebc95cb07e2 Mon Sep 17 00:00:00 2001
From: JQ <81431263+scampower3@users.noreply.github.com>
Date: Thu, 27 Mar 2025 10:26:47 +0800
Subject: Fix only returning one item from /Item/Latest api. (#12492)
* Updated to EFcore
* Remove unused using
* Dont use DateCreated not from episode type or music type
* use TranslateQuery to filter out instead and then do the grouping and retrival of min and max datecreated instead
* Album also
---
.../Item/BaseItemRepository.cs | 42 ++++++++++++++++++++++
1 file changed, 42 insertions(+)
(limited to 'Jellyfin.Server.Implementations/Item/BaseItemRepository.cs')
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index 4f6902244..7b5b6b94d 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -264,6 +264,48 @@ public sealed class BaseItemRepository
return dbQuery.AsEnumerable().Where(e => e is not null).Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToArray();
}
+ ///
+ public IReadOnlyList GetLatestItemList(InternalItemsQuery filter, CollectionType collectionType)
+ {
+ ArgumentNullException.ThrowIfNull(filter);
+ PrepareFilterQuery(filter);
+
+ // Early exit if collection type is not tvshows or music
+ if (collectionType != CollectionType.tvshows && collectionType != CollectionType.music)
+ {
+ return Array.Empty();
+ }
+
+ using var context = _dbProvider.CreateDbContext();
+
+ // Subquery to group by SeriesNames/Album and get the max Date Created for each group.
+ var subquery = PrepareItemQuery(context, filter);
+ subquery = TranslateQuery(subquery, context, filter);
+ var subqueryGrouped = subquery.GroupBy(g => collectionType == CollectionType.tvshows ? g.SeriesName : g.Album)
+ .Select(g => new
+ {
+ Key = g.Key,
+ MaxDateCreated = g.Max(a => a.DateCreated)
+ })
+ .OrderByDescending(g => g.MaxDateCreated)
+ .Select(g => g);
+
+ if (filter.Limit.HasValue)
+ {
+ subqueryGrouped = subqueryGrouped.Take(filter.Limit.Value);
+ }
+
+ filter.Limit = null;
+
+ var mainquery = PrepareItemQuery(context, filter);
+ mainquery = TranslateQuery(mainquery, context, filter);
+ mainquery = mainquery.Where(g => g.DateCreated >= subqueryGrouped.Min(s => s.MaxDateCreated));
+ mainquery = ApplyGroupingFilter(mainquery, filter);
+ mainquery = ApplyQueryPaging(mainquery, filter);
+
+ return mainquery.AsEnumerable().Where(e => e is not null).Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToArray();
+ }
+
///
public IReadOnlyList GetNextUpSeriesKeys(InternalItemsQuery filter, DateTime dateCutoff)
{
--
cgit v1.2.3