mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-02-09 23:55:10 -05:00
fix: deduplicate external artists in search results, prioritizing local artists
This commit is contained in:
@@ -683,9 +683,26 @@ public class SubsonicController : ControllerBase
|
|||||||
var mergedAlbums = localAlbums
|
var mergedAlbums = localAlbums
|
||||||
.Concat(externalResult.Albums.Select(a => ConvertAlbumToSubsonicJson(a)))
|
.Concat(externalResult.Albums.Select(a => ConvertAlbumToSubsonicJson(a)))
|
||||||
.ToList();
|
.ToList();
|
||||||
var mergedArtists = localArtists
|
|
||||||
.Concat(externalResult.Artists.Select(a => ConvertArtistToSubsonicJson(a)))
|
// Deduplicate artists by name - prefer local artists over external ones
|
||||||
.ToList();
|
var localArtistNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
foreach (var artist in localArtists)
|
||||||
|
{
|
||||||
|
if (artist is Dictionary<string, object> dict && dict.TryGetValue("name", out var nameObj))
|
||||||
|
{
|
||||||
|
localArtistNames.Add(nameObj?.ToString() ?? "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var mergedArtists = localArtists.ToList();
|
||||||
|
foreach (var externalArtist in externalResult.Artists)
|
||||||
|
{
|
||||||
|
// Only add external artist if no local artist with same name exists
|
||||||
|
if (!localArtistNames.Contains(externalArtist.Name))
|
||||||
|
{
|
||||||
|
mergedArtists.Add(ConvertArtistToSubsonicJson(externalArtist));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return CreateSubsonicJsonResponse(new
|
return CreateSubsonicJsonResponse(new
|
||||||
{
|
{
|
||||||
@@ -705,15 +722,26 @@ public class SubsonicController : ControllerBase
|
|||||||
|
|
||||||
var searchResult3 = new XElement(ns + "searchResult3");
|
var searchResult3 = new XElement(ns + "searchResult3");
|
||||||
|
|
||||||
|
// Deduplicate artists by name - prefer local artists over external ones
|
||||||
|
var localArtistNamesXml = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
foreach (var artist in localArtists.Cast<XElement>())
|
foreach (var artist in localArtists.Cast<XElement>())
|
||||||
{
|
{
|
||||||
|
var name = artist.Attribute("name")?.Value;
|
||||||
|
if (!string.IsNullOrEmpty(name))
|
||||||
|
{
|
||||||
|
localArtistNamesXml.Add(name);
|
||||||
|
}
|
||||||
artist.Name = ns + "artist";
|
artist.Name = ns + "artist";
|
||||||
searchResult3.Add(artist);
|
searchResult3.Add(artist);
|
||||||
}
|
}
|
||||||
foreach (var artist in externalResult.Artists)
|
foreach (var artist in externalResult.Artists)
|
||||||
|
{
|
||||||
|
// Only add external artist if no local artist with same name exists
|
||||||
|
if (!localArtistNamesXml.Contains(artist.Name))
|
||||||
{
|
{
|
||||||
searchResult3.Add(ConvertArtistToSubsonicXml(artist, ns));
|
searchResult3.Add(ConvertArtistToSubsonicXml(artist, ns));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var album in localAlbums.Cast<XElement>())
|
foreach (var album in localAlbums.Cast<XElement>())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user