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 || '' }];