From d6dc880ef4b0ddc5ac54394556722a9895353087 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Mon, 2 Jan 2023 01:58:31 -0800 Subject: [PATCH] Add playlist image to type --- src/renderer/api/jellyfin.api.ts | 36 ++++++++++++++++++++++++++++- src/renderer/api/navidrome.api.ts | 26 ++++++++++++++++++--- src/renderer/api/navidrome.types.ts | 4 ++-- src/renderer/api/normalize.ts | 8 +++---- src/renderer/api/types.ts | 2 ++ 5 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/renderer/api/jellyfin.api.ts b/src/renderer/api/jellyfin.api.ts index 5595dac6..96267f24 100644 --- a/src/renderer/api/jellyfin.api.ts +++ b/src/renderer/api/jellyfin.api.ts @@ -582,6 +582,22 @@ const getSongCoverArtUrl = (args: { baseUrl: string; item: JFSong; size: number ); }; +const getPlaylistCoverArtUrl = (args: { baseUrl: string; item: JFPlaylist; size: number }) => { + const size = args.size ? args.size : 300; + + if (!args.item.ImageTags?.Primary) { + return null; + } + + return ( + `${args.baseUrl}/Items` + + `/${args.item.Id}` + + '/Images/Primary' + + `?width=${size}&height=${size}` + + '&quality=96' + ); +}; + const normalizeSong = ( item: JFSong, server: ServerListItem, @@ -698,10 +714,28 @@ const normalizeAlbumArtist = ( }; }; -const normalizePlaylist = (item: JFPlaylist): Playlist => { +const normalizePlaylist = ( + item: JFPlaylist, + server: ServerListItem, + imageSize?: number, +): Playlist => { + const imageUrl = getPlaylistCoverArtUrl({ + baseUrl: server.url, + item, + size: imageSize || 300, + }); + + const imagePlaceholderUrl = getPlaylistCoverArtUrl({ + baseUrl: server.url, + item, + size: 1, + }); + return { duration: item.RunTimeTicks / 10000000, id: item.Id, + imagePlaceholderUrl, + imageUrl, name: item.Name, public: null, rules: null, diff --git a/src/renderer/api/navidrome.api.ts b/src/renderer/api/navidrome.api.ts index ae813fa5..6e0b7c8f 100644 --- a/src/renderer/api/navidrome.api.ts +++ b/src/renderer/api/navidrome.api.ts @@ -512,14 +512,14 @@ const normalizeSong = ( const normalizeAlbum = (item: NDAlbum, server: ServerListItem, imageSize?: number): Album => { const imageUrl = getCoverArtUrl({ baseUrl: server.url, - coverArtId: item.coverArtId, + coverArtId: item.coverArtId || item.id, credential: server.credential, size: imageSize || 300, }); const imagePlaceholderUrl = getCoverArtUrl({ baseUrl: server.url, - coverArtId: item.coverArtId, + coverArtId: item.coverArtId || item.id, credential: server.credential, size: 1, }); @@ -571,10 +571,30 @@ const normalizeAlbumArtist = (item: NDAlbumArtist): AlbumArtist => { }; }; -const normalizePlaylist = (item: NDPlaylist): Playlist => { +const normalizePlaylist = ( + item: NDPlaylist, + server: ServerListItem, + imageSize?: number, +): Playlist => { + const imageUrl = getCoverArtUrl({ + baseUrl: server.url, + coverArtId: item.id, + credential: server.credential, + size: imageSize || 300, + }); + + const imagePlaceholderUrl = getCoverArtUrl({ + baseUrl: server.url, + coverArtId: item.id, + credential: server.credential, + size: 1, + }); + return { duration: item.duration, id: item.id, + imagePlaceholderUrl, + imageUrl, name: item.name, public: item.public, rules: item?.rules || null, diff --git a/src/renderer/api/navidrome.types.ts b/src/renderer/api/navidrome.types.ts index 45d53e26..86653e02 100644 --- a/src/renderer/api/navidrome.types.ts +++ b/src/renderer/api/navidrome.types.ts @@ -20,8 +20,8 @@ export type NDAlbum = { artist: string; artistId: string; compilation: boolean; - coverArtId: string; - coverArtPath: string; + coverArtId?: string; // Removed after v0.48.0 + coverArtPath?: string; // Removed after v0.48.0 createdAt: string; duration: number; fullText: string; diff --git a/src/renderer/api/normalize.ts b/src/renderer/api/normalize.ts index 2e9345a7..e5343fa6 100644 --- a/src/renderer/api/normalize.ts +++ b/src/renderer/api/normalize.ts @@ -176,10 +176,10 @@ const playlistList = (data: RawPlaylistListResponse | undefined, server: ServerL let playlists; switch (server?.type) { case 'jellyfin': - playlists = data?.items.map((item) => jfNormalize.playlist(item as JFPlaylist)); + playlists = data?.items.map((item) => jfNormalize.playlist(item as JFPlaylist, server)); break; case 'navidrome': - playlists = data?.items.map((item) => ndNormalize.playlist(item as NDPlaylist)); + playlists = data?.items.map((item) => ndNormalize.playlist(item as NDPlaylist, server)); break; case 'subsonic': break; @@ -199,10 +199,10 @@ const playlistDetail = ( let playlist; switch (server?.type) { case 'jellyfin': - playlist = jfNormalize.playlist(data as JFPlaylist); + playlist = jfNormalize.playlist(data as JFPlaylist, server); break; case 'navidrome': - playlist = ndNormalize.playlist(data as NDPlaylist); + playlist = ndNormalize.playlist(data as NDPlaylist, server); break; case 'subsonic': break; diff --git a/src/renderer/api/types.ts b/src/renderer/api/types.ts index 9c6c406b..b7128a2a 100644 --- a/src/renderer/api/types.ts +++ b/src/renderer/api/types.ts @@ -237,6 +237,8 @@ export type MusicFolder = { export type Playlist = { duration: number | null; id: string; + imagePlaceholderUrl: string | null; + imageUrl: string | null; name: string; public: boolean | null; rules?: Record | null;