From d438c802a474f4ecafec919290b7e862b1ec3a13 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Fri, 27 Mar 2026 18:46:12 -0700 Subject: [PATCH] fix(normalize): do not duplicate remixer when included in credit --- src/shared/api/jellyfin/jellyfin-normalize.ts | 7 ++++++- .../api/navidrome/navidrome-normalize.ts | 18 ++++++++++++------ src/shared/api/subsonic/subsonic-normalize.ts | 7 ++++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/shared/api/jellyfin/jellyfin-normalize.ts b/src/shared/api/jellyfin/jellyfin-normalize.ts index 67313c90e..b9e181cab 100644 --- a/src/shared/api/jellyfin/jellyfin-normalize.ts +++ b/src/shared/api/jellyfin/jellyfin-normalize.ts @@ -128,7 +128,12 @@ const getArtists = ( }); if (participants?.['Remixer']) { - result.push(...participants['Remixer']); + const existingIds = new Set(result.map((artist) => artist.id)); + for (const participant of participants['Remixer']) { + if (!existingIds.has(participant.id)) { + result.push(participant); + } + } } return result; diff --git a/src/shared/api/navidrome/navidrome-normalize.ts b/src/shared/api/navidrome/navidrome-normalize.ts index 4e00b0337..76ca2555a 100644 --- a/src/shared/api/navidrome/navidrome-normalize.ts +++ b/src/shared/api/navidrome/navidrome-normalize.ts @@ -153,6 +153,7 @@ const getArtists = ( albumArtists = roleList; } else if (role === 'remixer' && includeRemixers) { remixers = roleList; + participants['remixer'] = remixers; } else { artists = roleList; } @@ -200,7 +201,7 @@ const getArtists = ( ]; } - if (artists === undefined && (includeRemixers ? remixers === undefined : true)) { + if (artists === undefined) { artists = [ { id: item.artistId, @@ -213,11 +214,16 @@ const getArtists = ( ]; } - return { - albumArtists, - artists: [...(artists || []), ...(includeRemixers ? remixers || [] : [])], - participants, - }; + if (remixers?.length && includeRemixers) { + const existingIds = new Set(artists.map((artist) => artist.id)); + for (const remixer of remixers) { + if (!existingIds.has(remixer.id)) { + artists.push(remixer); + } + } + } + + return { albumArtists, artists, participants }; }; const normalizeSong = ( diff --git a/src/shared/api/subsonic/subsonic-normalize.ts b/src/shared/api/subsonic/subsonic-normalize.ts index 094869e66..4835c89fd 100644 --- a/src/shared/api/subsonic/subsonic-normalize.ts +++ b/src/shared/api/subsonic/subsonic-normalize.ts @@ -50,7 +50,12 @@ const getArtistList = ( }); if (participants?.['remixer']) { - result.push(...participants['remixer']); + const existingIds = new Set(result.map((artist) => artist.id)); + for (const participant of participants['remixer']) { + if (!existingIds.has(participant.id)) { + result.push(participant); + } + } } return result;