From 25d80eb559781e21021e65b50fa71aaa0bddb77d Mon Sep 17 00:00:00 2001 From: Honey Date: Sat, 6 Jun 2026 00:51:22 +0200 Subject: [PATCH] feat: use file sort tags (sortAlbum/sortArtist/sortName) as display override when romaji is on Co-Authored-By: Claude Sonnet 4.6 --- src/api.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/api.js b/src/api.js index 69f15b3..8cf0e58 100644 --- a/src/api.js +++ b/src/api.js @@ -152,11 +152,14 @@ export function romajiLookup(id) { return _romajiMap?.get(String(id)) ?? null; } // Display helpers — return romaji when showRomaji is on and the song is in the index, // otherwise fall back to the original Navidrome values. -// Overrides (localStorage) always take priority over auto-converted index values. +// Priority: override list > file sort tag (OpenSubsonic) > auto-romaji index > original +const _isJp = (s) => /[ぁ-んァ-ン一-龯]/.test(s); export function dispTitle(s) { if (!S.cfg.showRomaji) return s.title || ''; const ov = getRomajiOverrides(); if (s.title && ov[s.title]) return ov[s.title]; + const st = s.sortName || s.titleSort; + if (st && !_isJp(st)) return st; return romajiLookup(s.id)?.titleRomaji || s.title || ''; } export function dispArtist(s) { @@ -164,12 +167,16 @@ export function dispArtist(s) { const ov = getRomajiOverrides(); if (s.artist && ov[s.artist]) return ov[s.artist]; if (s.albumArtist && ov[s.albumArtist]) return ov[s.albumArtist]; + const st = s.sortArtist || s.artistSort; + if (st && !_isJp(st)) return st; return romajiLookup(s.id)?.artistRomaji || s.artist || ''; } export function dispAlbum(s) { if (!S.cfg.showRomaji) return s.album || ''; const ov = getRomajiOverrides(); if (s.album && ov[s.album]) return ov[s.album]; + const st = s.sortAlbum || s.albumSort; + if (st && !_isJp(st)) return st; return romajiLookup(s.id)?.albumRomaji || s.album || ''; } // Returns [{name, id}] like parseArtists but with romaji display names when showRomaji is on. @@ -180,6 +187,8 @@ export function dispArtistParts(s, parseArtistsFn) { const ov = getRomajiOverrides(); if (s.artist && ov[s.artist]) return [{ name: ov[s.artist], originalName: s.artist, id: parts[0]?.id || '' }]; if (s.albumArtist && ov[s.albumArtist]) return [{ name: ov[s.albumArtist], originalName: s.albumArtist, id: parts[0]?.id || '' }]; + const st = s.sortArtist || s.artistSort; + if (st && !_isJp(st)) return [{ name: st, originalName: s.artist || parts[0]?.name || '', id: parts[0]?.id || '' }]; const info = romajiLookup(s.id); if (!info?.artistRomaji) return parts; return [{ name: info.artistRomaji, originalName: s.artist || parts[0]?.name || '', id: parts[0]?.id || '' }];