From 2ccf08f547346d81de39fac5b3ff680d49f15d28 Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Wed, 17 Dec 2025 01:07:36 -0500 Subject: [PATCH 1/4] Fix artist display order --- .../Item/BaseItemRepository.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs index 289ead11d7..f477d8aa8a 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs @@ -2629,6 +2629,12 @@ public sealed class BaseItemRepository .Where(e => artistNames.Contains(e.Name)) .ToArray(); - return artists.GroupBy(e => e.Name).ToDictionary(e => e.Key!, e => e.Select(f => DeserializeBaseItem(f)).Cast().ToArray()); + var lookup = artists + .GroupBy(e => e.Name!) + .ToDictionary( + g => g.Key, + g => g.Select(f => DeserializeBaseItem(f)).Cast().ToArray()); + + return artistNames.Where(lookup.ContainsKey).ToDictionary(name => name, name => lookup[name]); } } From a8d1cdefaca1dd0ce3dc6efa63461643e18f6116 Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Sat, 17 Jan 2026 10:05:45 -0500 Subject: [PATCH 2/4] Address review comments --- .../Item/BaseItemRepository.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs index f477d8aa8a..600b646023 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs @@ -2633,8 +2633,17 @@ public sealed class BaseItemRepository .GroupBy(e => e.Name!) .ToDictionary( g => g.Key, - g => g.Select(f => DeserializeBaseItem(f)).Cast().ToArray()); + g => g.Select(f => DeserializeBaseItem(f)).Where(dto => dto is not null).Cast().ToArray()); - return artistNames.Where(lookup.ContainsKey).ToDictionary(name => name, name => lookup[name]); + var result = new Dictionary(artistNames.Count); + foreach (var name in artistNames) + { + if (lookup.TryGetValue(name, out var artistArray)) + { + result[name] = artistArray; + } + } + + return result; } } From 94edcbd2d1c8130cf728ed7566694e161dd12b39 Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Sat, 17 Jan 2026 10:10:06 -0500 Subject: [PATCH 3/4] Fix artist ordering DtoServices --- Emby.Server.Implementations/Dto/DtoService.cs | 55 +++++++++---------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index c5dc3b054c..b465ae8ee9 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -1051,16 +1051,22 @@ namespace Emby.Server.Implementations.Dto // Include artists that are not in the database yet, e.g., just added via metadata editor // var foundArtists = artistItems.Items.Select(i => i.Item1.Name).ToList(); - dto.ArtistItems = _libraryManager.GetArtists([.. hasArtist.Artists.Where(e => !string.IsNullOrWhiteSpace(e))]) - .Where(e => e.Value.Length > 0) - .Select(i => + var artistsLookup = _libraryManager.GetArtists([.. hasArtist.Artists.Where(e => !string.IsNullOrWhiteSpace(e))]); + + var artistItems = new List(hasArtist.Artists.Count); + foreach (var name in hasArtist.Artists) + { + if (!string.IsNullOrWhiteSpace(name) && artistsLookup.TryGetValue(name, out var artists) && artists.Length > 0) { - return new NameGuidPair + artistItems.Add(new NameGuidPair { - Name = i.Key, - Id = i.Value.First().Id - }; - }).Where(i => i is not null).ToArray(); + Name = name, + Id = artists[0].Id + }); + } + } + + dto.ArtistItems = artistItems.ToArray(); } if (item is IHasAlbumArtist hasAlbumArtist) @@ -1085,31 +1091,22 @@ namespace Emby.Server.Implementations.Dto // }) // .ToList(); - dto.AlbumArtists = hasAlbumArtist.AlbumArtists - // .Except(foundArtists, new DistinctNameComparer()) - .Select(i => + var albumArtistsLookup = _libraryManager.GetArtists([.. hasAlbumArtist.AlbumArtists.Where(e => !string.IsNullOrWhiteSpace(e))]); + + var albumArtistItems = new List(hasAlbumArtist.AlbumArtists.Count); + foreach (var name in hasAlbumArtist.AlbumArtists) + { + if (!string.IsNullOrWhiteSpace(name) && albumArtistsLookup.TryGetValue(name, out var albumArtists) && albumArtists.Length > 0) { - // This should not be necessary but we're seeing some cases of it - if (string.IsNullOrEmpty(i)) + albumArtistItems.Add(new NameGuidPair { - return null; - } - - var artist = _libraryManager.GetArtist(i, new DtoOptions(false) - { - EnableImages = false + Name = albumArtists[0].Name, + Id = albumArtists[0].Id }); - if (artist is not null) - { - return new NameGuidPair - { - Name = artist.Name, - Id = artist.Id - }; - } + } + } - return null; - }).Where(i => i is not null).ToArray(); + dto.AlbumArtists = albumArtistItems.ToArray(); } // Add video info From 2df546af6d33f079f9b1d7a85a9e6b10c09e1fb4 Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Sun, 18 Jan 2026 18:16:45 -0500 Subject: [PATCH 4/4] Deduplicate using Distinct --- Emby.Server.Implementations/Dto/DtoService.cs | 44 +++++++------------ 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index b465ae8ee9..b392340f71 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -1053,20 +1053,14 @@ namespace Emby.Server.Implementations.Dto // var foundArtists = artistItems.Items.Select(i => i.Item1.Name).ToList(); var artistsLookup = _libraryManager.GetArtists([.. hasArtist.Artists.Where(e => !string.IsNullOrWhiteSpace(e))]); - var artistItems = new List(hasArtist.Artists.Count); - foreach (var name in hasArtist.Artists) - { - if (!string.IsNullOrWhiteSpace(name) && artistsLookup.TryGetValue(name, out var artists) && artists.Length > 0) - { - artistItems.Add(new NameGuidPair - { - Name = name, - Id = artists[0].Id - }); - } - } - - dto.ArtistItems = artistItems.ToArray(); + dto.ArtistItems = hasArtist.Artists + .Where(name => !string.IsNullOrWhiteSpace(name)) + .Distinct() + .Select(name => artistsLookup.TryGetValue(name, out var artists) && artists.Length > 0 + ? new NameGuidPair { Name = name, Id = artists[0].Id } + : null) + .Where(item => item is not null) + .ToArray(); } if (item is IHasAlbumArtist hasAlbumArtist) @@ -1093,20 +1087,14 @@ namespace Emby.Server.Implementations.Dto var albumArtistsLookup = _libraryManager.GetArtists([.. hasAlbumArtist.AlbumArtists.Where(e => !string.IsNullOrWhiteSpace(e))]); - var albumArtistItems = new List(hasAlbumArtist.AlbumArtists.Count); - foreach (var name in hasAlbumArtist.AlbumArtists) - { - if (!string.IsNullOrWhiteSpace(name) && albumArtistsLookup.TryGetValue(name, out var albumArtists) && albumArtists.Length > 0) - { - albumArtistItems.Add(new NameGuidPair - { - Name = albumArtists[0].Name, - Id = albumArtists[0].Id - }); - } - } - - dto.AlbumArtists = albumArtistItems.ToArray(); + dto.AlbumArtists = hasAlbumArtist.AlbumArtists + .Where(name => !string.IsNullOrWhiteSpace(name)) + .Distinct() + .Select(name => albumArtistsLookup.TryGetValue(name, out var albumArtists) && albumArtists.Length > 0 + ? new NameGuidPair { Name = name, Id = albumArtists[0].Id } + : null) + .Where(item => item is not null) + .ToArray(); } // Add video info