From 268d88a5fb8f0f71c96ba5abcef250d1f7e049ff Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sat, 7 Feb 2026 00:56:55 +0100 Subject: Optimize Collection Grouping, NextUp and Latest queries --- Jellyfin.Api/Controllers/UserLibraryController.cs | 32 +++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'Jellyfin.Api/Controllers/UserLibraryController.cs') diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index 3ba7cc3169..c778d3f448 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -564,25 +564,35 @@ public class UserLibraryController : BaseJellyfinApiController }, dtoOptions); - var dtos = list.Select(i => + var resolvedItems = new BaseItem[list.Count]; + var childCounts = new int[list.Count]; + for (int i = 0; i < list.Count; i++) { - var item = i.Item2[0]; + var tuple = list[i]; + var item = tuple.Item2[0]; var childCount = 0; - if (i.Item1 is not null && (i.Item2.Count > 1 || i.Item1 is MusicAlbum || i.Item1 is Series )) + if (tuple.Item1 is not null && (tuple.Item2.Count > 1 || tuple.Item1 is MusicAlbum || tuple.Item1 is Series)) { - item = i.Item1; - childCount = i.Item2.Count; + item = tuple.Item1; + childCount = tuple.Item2.Count; } - var dto = _dtoService.GetBaseItemDto(item, dtoOptions, user); - - dto.ChildCount = childCount; + resolvedItems[i] = item; + childCounts[i] = childCount; + } - return dto; - }); + // Fetch DTOs without visibility check since we've already done that in GetLatestItems and restore child counts afterwards + var dtos = _dtoService.GetBaseItemDtos(resolvedItems, dtoOptions, user, skipVisibilityCheck: true); + for (int i = 0; i < dtos.Count; i++) + { + if (childCounts[i] > 0) + { + dtos[i].ChildCount = childCounts[i]; + } + } - return Ok(dtos); + return Ok(dtos.AsEnumerable()); } /// -- cgit v1.2.3