From 173e00af3d897b661c3a5af0fdc38e882ff997bd Mon Sep 17 00:00:00 2001 From: jeffvli Date: Thu, 13 Nov 2025 21:50:11 -0800 Subject: [PATCH] refactor Genre domain type to include serverType and serverId --- .../api/navidrome/navidrome-controller.ts | 2 +- src/renderer/api/subsonic/subsonic-controller.ts | 2 +- src/shared/api/jellyfin/jellyfin-normalize.ts | 2 ++ src/shared/api/navidrome/navidrome-normalize.ts | 7 ++++++- src/shared/api/subsonic/subsonic-normalize.ts | 16 +++++++++++++--- src/shared/types/domain-types.ts | 2 ++ 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/renderer/api/navidrome/navidrome-controller.ts b/src/renderer/api/navidrome/navidrome-controller.ts index f7063007a..ffdfed981 100644 --- a/src/renderer/api/navidrome/navidrome-controller.ts +++ b/src/renderer/api/navidrome/navidrome-controller.ts @@ -370,7 +370,7 @@ export const NavidromeController: InternalControllerEndpoint = { } return { - items: res.body.data.map((genre) => ndNormalize.genre(genre)), + items: res.body.data.map((genre) => ndNormalize.genre(genre, apiClientProps.server)), startIndex: query.startIndex || 0, totalRecordCount: Number(res.body.headers.get('x-total-count') || 0), }; diff --git a/src/renderer/api/subsonic/subsonic-controller.ts b/src/renderer/api/subsonic/subsonic-controller.ts index 60d5f0748..0b9c8ac5f 100644 --- a/src/renderer/api/subsonic/subsonic-controller.ts +++ b/src/renderer/api/subsonic/subsonic-controller.ts @@ -647,7 +647,7 @@ export const SubsonicController: InternalControllerEndpoint = { break; } - const genres = results.map(ssNormalize.genre); + const genres = results.map((genre) => ssNormalize.genre(genre, apiClientProps.server)); return { items: genres, diff --git a/src/shared/api/jellyfin/jellyfin-normalize.ts b/src/shared/api/jellyfin/jellyfin-normalize.ts index 19f47302f..b0a58a5c3 100644 --- a/src/shared/api/jellyfin/jellyfin-normalize.ts +++ b/src/shared/api/jellyfin/jellyfin-normalize.ts @@ -504,6 +504,8 @@ const normalizeGenre = ( server: null | ServerListItem, ): Genre => { return { + _serverId: server?.id || '', + _serverType: ServerType.JELLYFIN, albumCount: undefined, id: item.Id, imageUrl: getGenreCoverArtUrl({ baseUrl: server?.url || '', item, size: 200 }), diff --git a/src/shared/api/navidrome/navidrome-normalize.ts b/src/shared/api/navidrome/navidrome-normalize.ts index 78124a522..ae712af1b 100644 --- a/src/shared/api/navidrome/navidrome-normalize.ts +++ b/src/shared/api/navidrome/navidrome-normalize.ts @@ -430,8 +430,13 @@ const normalizePlaylist = ( }; }; -const normalizeGenre = (item: z.infer): Genre => { +const normalizeGenre = ( + item: z.infer, + server: null | ServerListItem, +): Genre => { return { + _serverId: server?.id || 'unknown', + _serverType: ServerType.NAVIDROME, albumCount: undefined, id: item.id, imageUrl: null, diff --git a/src/shared/api/subsonic/subsonic-normalize.ts b/src/shared/api/subsonic/subsonic-normalize.ts index dc1f46900..f66295c34 100644 --- a/src/shared/api/subsonic/subsonic-normalize.ts +++ b/src/shared/api/subsonic/subsonic-normalize.ts @@ -94,9 +94,12 @@ const getGenres = ( | z.infer | z.infer | z.infer, + server?: null | ServerListItemWithCredential, ): Genre[] => { return item.genres ? item.genres.map((genre) => ({ + _serverId: server?.id || 'unknown', + _serverType: ServerType.SUBSONIC, id: genre.name, imageUrl: null, itemType: LibraryItem.GENRE, @@ -105,6 +108,8 @@ const getGenres = ( : item.genre ? [ { + _serverId: server?.id || 'unknown', + _serverType: ServerType.SUBSONIC, id: item.genre, imageUrl: null, itemType: LibraryItem.GENRE, @@ -161,7 +166,7 @@ const normalizeSong = ( track: item.replayGain.trackGain, } : null, - genres: getGenres(item), + genres: getGenres(item, server), id: item.id.toString(), imagePlaceholderUrl: null, imageUrl, @@ -260,7 +265,7 @@ const normalizeAlbum = ( : item.explicitStatus === 'clean' ? ExplicitStatus.CLEAN : null, - genres: getGenres(item), + genres: getGenres(item, server), id: item.id.toString(), imagePlaceholderUrl: null, imageUrl, @@ -320,8 +325,13 @@ const normalizePlaylist = ( }; }; -const normalizeGenre = (item: z.infer): Genre => { +const normalizeGenre = ( + item: z.infer, + server: null | ServerListItemWithCredential, +): Genre => { return { + _serverId: server?.id || 'unknown', + _serverType: ServerType.SUBSONIC, albumCount: item.albumCount, id: item.value, imageUrl: null, diff --git a/src/shared/types/domain-types.ts b/src/shared/types/domain-types.ts index d0a8bf46c..121b511be 100644 --- a/src/shared/types/domain-types.ts +++ b/src/shared/types/domain-types.ts @@ -262,6 +262,8 @@ export type GainInfo = { }; export type Genre = { + _serverId: string; + _serverType: ServerType; albumCount?: number; id: string; imageUrl: null | string;