diff --git a/src/shared/api/jellyfin/jellyfin-normalize.ts b/src/shared/api/jellyfin/jellyfin-normalize.ts index cb522f63..c6eefb69 100644 --- a/src/shared/api/jellyfin/jellyfin-normalize.ts +++ b/src/shared/api/jellyfin/jellyfin-normalize.ts @@ -88,7 +88,8 @@ const getSongCoverArtUrl = (args: { `/${args.item.Id}` + '/Images/Primary' + `?width=${size}` + - '&quality=96' + '&quality=96' + + `&tag=${args.item.ImageTags.Primary}` ); } diff --git a/src/shared/api/navidrome/navidrome-normalize.ts b/src/shared/api/navidrome/navidrome-normalize.ts index af5f9e61..05248979 100644 --- a/src/shared/api/navidrome/navidrome-normalize.ts +++ b/src/shared/api/navidrome/navidrome-normalize.ts @@ -30,6 +30,7 @@ const getCoverArtUrl = (args: { coverArtId: string; credential: string | undefined; size: number; + updated: string; }) => { const size = args.size ? args.size : 250; @@ -43,7 +44,10 @@ const getCoverArtUrl = (args: { `&${args.credential}` + '&v=1.13.0' + '&c=Feishin' + - `&size=${size}` + `&size=${size}` + + // A dummy variable to invalidate the cached image if the item is updated + // This is adapted from how Navidrome web does it + `&_=${args.updated}` ); }; @@ -140,6 +144,7 @@ const normalizeSong = ( coverArtId: id, credential: server?.credential, size: imageSize || 100, + updated: item.updatedAt, }); const imagePlaceholderUrl = null; @@ -216,6 +221,7 @@ const normalizeAlbum = ( coverArtId: item.coverArtId || item.id, credential: server?.credential, size: imageSize || 300, + updated: item.updatedAt, }); const imagePlaceholderUrl = null; @@ -282,6 +288,7 @@ const normalizeAlbumArtist = ( coverArtId: `ar-${item.id}`, credential: server?.credential, size: 300, + updated: item.updatedAt || '', }); } @@ -344,6 +351,7 @@ const normalizePlaylist = ( coverArtId: item.id, credential: server?.credential, size: imageSize || 300, + updated: item.updatedAt, }); const imagePlaceholderUrl = null; diff --git a/src/shared/api/navidrome/navidrome-types.ts b/src/shared/api/navidrome/navidrome-types.ts index 39a0c002..0e3a3585 100644 --- a/src/shared/api/navidrome/navidrome-types.ts +++ b/src/shared/api/navidrome/navidrome-types.ts @@ -80,6 +80,7 @@ const stats = z.object({ const albumArtist = z.object({ albumCount: z.number(), biography: z.string(), + createdAt: z.string().optional(), externalInfoUpdatedAt: z.string(), externalUrl: z.string(), fullText: z.string(), @@ -99,6 +100,7 @@ const albumArtist = z.object({ starred: z.boolean(), starredAt: z.string(), stats: z.record(z.string(), stats).optional(), + updatedAt: z.string().optional(), }); const albumArtistList = z.array(albumArtist);