From f016d2cdf4e0081080e31fb83eb27d81d713cce7 Mon Sep 17 00:00:00 2001 From: marank Date: Sat, 24 Jan 2026 06:26:51 +0100 Subject: [PATCH] Cover art support for folder view (Subsonic servers only) (#1608) * add coverArt support for subsonic folders --- src/renderer/api/subsonic/subsonic-controller.ts | 1 + .../item-list/item-table-list/columns/image-column.tsx | 5 ++++- src/shared/api/subsonic/subsonic-normalize.ts | 2 ++ src/shared/api/subsonic/subsonic-types.ts | 1 + src/shared/types/domain-types.ts | 2 ++ 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/renderer/api/subsonic/subsonic-controller.ts b/src/renderer/api/subsonic/subsonic-controller.ts index 4ac719dfd..2ee225ce8 100644 --- a/src/renderer/api/subsonic/subsonic-controller.ts +++ b/src/renderer/api/subsonic/subsonic-controller.ts @@ -778,6 +778,7 @@ export const SubsonicController: InternalControllerEndpoint = { res.body.indexes?.index?.flatMap((idx) => idx.artist.map((artist) => ({ artist: artist.name, + coverArt: artist.coverArt, id: artist.id.toString(), isDir: true, title: artist.name, diff --git a/src/renderer/components/item-list/item-table-list/columns/image-column.tsx b/src/renderer/components/item-list/item-table-list/columns/image-column.tsx index a89306825..217a1ad41 100644 --- a/src/renderer/components/item-list/item-table-list/columns/image-column.tsx +++ b/src/renderer/components/item-list/item-table-list/columns/image-column.tsx @@ -27,6 +27,9 @@ const ImageColumnBase = (props: ItemTableListInnerColumn) => { const internalState = (props as any).internalState; const [isHovered, setIsHovered] = useState(false); + const isFolder = (rowItem as unknown as Folder)?._itemType === LibraryItem.FOLDER; + const shouldShowFolderIcon = isFolder && !item?.imageId && !item?.imageUrl; + const handlePlay = (playType: Play, event: React.MouseEvent) => { if (!item) { return; @@ -114,7 +117,7 @@ const ImageColumnBase = (props: ItemTableListInnerColumn) => { ); } - if ((rowItem as unknown as Folder)?._itemType === LibraryItem.FOLDER) { + if (shouldShowFolderIcon) { return ( diff --git a/src/shared/api/subsonic/subsonic-normalize.ts b/src/shared/api/subsonic/subsonic-normalize.ts index d19b9d316..293b19461 100644 --- a/src/shared/api/subsonic/subsonic-normalize.ts +++ b/src/shared/api/subsonic/subsonic-normalize.ts @@ -399,6 +399,8 @@ const normalizeFolder = ( songs: results?.songs || [], }, id: item.id.toString(), + imageId: item.coverArt?.toString() || null, + imageUrl: null, name: item.title, parentId: item.parent, }; diff --git a/src/shared/api/subsonic/subsonic-types.ts b/src/shared/api/subsonic/subsonic-types.ts index 081ce2217..f6ae0cbad 100644 --- a/src/shared/api/subsonic/subsonic-types.ts +++ b/src/shared/api/subsonic/subsonic-types.ts @@ -613,6 +613,7 @@ const getIndexes = z.object({ .object({ artist: z .object({ + coverArt: z.string().optional(), id: z.string(), name: z.string(), }) diff --git a/src/shared/types/domain-types.ts b/src/shared/types/domain-types.ts index d158f1feb..0d41e1844 100644 --- a/src/shared/types/domain-types.ts +++ b/src/shared/types/domain-types.ts @@ -257,6 +257,8 @@ export type Folder = { songs: Song[]; }; id: string; + imageId?: null | string; + imageUrl?: null | string; name: string; parentId?: string; };