From 8ed586e2f3bcafb7d4ae0872468cfef835460faa Mon Sep 17 00:00:00 2001 From: marank Date: Sat, 24 Jan 2026 06:30:09 +0100 Subject: [PATCH] add support for disc subtitles from subsonic discTitles field (#1609) --- src/shared/api/subsonic/subsonic-normalize.ts | 11 +++++++++-- src/shared/api/subsonic/subsonic-types.ts | 8 ++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/shared/api/subsonic/subsonic-normalize.ts b/src/shared/api/subsonic/subsonic-normalize.ts index 293b19461..a1b110933 100644 --- a/src/shared/api/subsonic/subsonic-normalize.ts +++ b/src/shared/api/subsonic/subsonic-normalize.ts @@ -134,6 +134,7 @@ const normalizeSong = ( pathReplace?: string, pathReplaceWith?: string, playlistIndex?: number, + discTitleMap?: Map, ): Song => { const participants = getParticipants(item); @@ -156,7 +157,7 @@ const normalizeSong = ( container: item.contentType, createdAt: item.created, discNumber: item.discNumber || 1, - discSubtitle: null, + discSubtitle: discTitleMap?.get(item.discNumber ?? 1) ?? null, duration: item.duration ? item.duration * 1000 : 0, explicitStatus: item.explicitStatus === 'explicit' @@ -267,6 +268,12 @@ const normalizeAlbum = ( pathReplace?: string, pathReplaceWith?: string, ): Album => { + const discTitleMap = new Map(); + + (item as z.infer).discTitles?.forEach((discTitle) => { + discTitleMap.set(discTitle.disc, discTitle.title); + }); + const releaseDate = item.releaseDate && typeof item.releaseDate.year === 'number' && @@ -312,7 +319,7 @@ const normalizeAlbum = ( songCount: item.songCount, songs: (item as z.infer).song?.map((song) => - normalizeSong(song, server, pathReplace, pathReplaceWith), + normalizeSong(song, server, pathReplace, pathReplaceWith, undefined, discTitleMap), ) || [], tags: null, updatedAt: item.created, diff --git a/src/shared/api/subsonic/subsonic-types.ts b/src/shared/api/subsonic/subsonic-types.ts index f6ae0cbad..33a24cb70 100644 --- a/src/shared/api/subsonic/subsonic-types.ts +++ b/src/shared/api/subsonic/subsonic-types.ts @@ -153,6 +153,14 @@ const album = z.object({ contributors: z.array(contributor).optional(), coverArt: z.string(), created: z.string(), + discTitles: z + .array( + z.object({ + disc: z.number(), + title: z.string(), + }), + ) + .optional(), duration: z.number(), explicitStatus: z.string().optional(), genre: z.string().optional(),