feat: use file sort tags (sortAlbum/sortArtist/sortName) as display override when romaji is on

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-06-06 00:51:22 +02:00
1 parent 961511b3d0
commit 25d80eb559
1 file changed
+10 -1
+10 -1
View File
@@ -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, // Display helpers — return romaji when showRomaji is on and the song is in the index,
// otherwise fall back to the original Navidrome values. // 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) { export function dispTitle(s) {
if (!S.cfg.showRomaji) return s.title || ''; if (!S.cfg.showRomaji) return s.title || '';
const ov = getRomajiOverrides(); const ov = getRomajiOverrides();
if (s.title && ov[s.title]) return ov[s.title]; 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 || ''; return romajiLookup(s.id)?.titleRomaji || s.title || '';
} }
export function dispArtist(s) { export function dispArtist(s) {
@@ -164,12 +167,16 @@ export function dispArtist(s) {
const ov = getRomajiOverrides(); const ov = getRomajiOverrides();
if (s.artist && ov[s.artist]) return ov[s.artist]; if (s.artist && ov[s.artist]) return ov[s.artist];
if (s.albumArtist && ov[s.albumArtist]) return ov[s.albumArtist]; 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 || ''; return romajiLookup(s.id)?.artistRomaji || s.artist || '';
} }
export function dispAlbum(s) { export function dispAlbum(s) {
if (!S.cfg.showRomaji) return s.album || ''; if (!S.cfg.showRomaji) return s.album || '';
const ov = getRomajiOverrides(); const ov = getRomajiOverrides();
if (s.album && ov[s.album]) return ov[s.album]; 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 || ''; return romajiLookup(s.id)?.albumRomaji || s.album || '';
} }
// Returns [{name, id}] like parseArtists but with romaji display names when showRomaji is on. // 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(); const ov = getRomajiOverrides();
if (s.artist && ov[s.artist]) return [{ name: ov[s.artist], originalName: s.artist, id: parts[0]?.id || '' }]; 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 || '' }]; 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); const info = romajiLookup(s.id);
if (!info?.artistRomaji) return parts; if (!info?.artistRomaji) return parts;
return [{ name: info.artistRomaji, originalName: s.artist || parts[0]?.name || '', id: parts[0]?.id || '' }]; return [{ name: info.artistRomaji, originalName: s.artist || parts[0]?.name || '', id: parts[0]?.id || '' }];