diff --git a/public/sw.js b/public/sw.js index a26e99c..c00359f 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,4 +1,4 @@ -const CACHE = 'ns-v72'; +const CACHE = 'ns-v73'; const PRECACHE = ['/', 'index.html', 'manifest.json', 'icon.svg']; const SKIP_PATHS = ['/rest/stream', '/rest/download', '/config.js']; // Auth token params stripped from cache keys so artwork survives across sessions/token refreshes. diff --git a/src/api.js b/src/api.js index 4c45374..9b92d90 100644 --- a/src/api.js +++ b/src/api.js @@ -198,6 +198,9 @@ export function dispArtistById(id, name) { if (!S.cfg.showRomaji) return name || ''; const ov = getRomajiOverrides(); if (name && ov[name]) return ov[name]; + // Only romanize Japanese names — for non-JP names the sort tag is a sort key (symbols/articles + // stripped, e.g. "☆NoAki☆" → "NoAki"), not a romaji, so it must not replace the display name. + if (!_isJp(name || '')) return name || ''; const sort = _artistSortMap?.get(String(id)); if (sort) return sort; return _artistRomajiMap?.get(String(id)) || name || ''; @@ -225,6 +228,7 @@ export function dispTitle(s) { if (!S.cfg.showRomaji) return s.title || ''; const ov = getRomajiOverrides(); if (s.title && ov[s.title]) return ov[s.title]; + if (!_isJp(s.title || '')) return s.title || ''; // non-JP title → sort tag is not a romaji const st = s.sortName || s.titleSort; if (st && !_isJp(st)) return st; return romajiLookup(s.id)?.titleRomaji || s.title || ''; @@ -236,6 +240,7 @@ 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]; + if (!_isJp(s.artist || '')) return s.artist || ''; // non-JP artist → no romaji substitution return romajiLookup(s.id)?.artistRomaji || s.artist || ''; } // Songs don't carry album sort — Navidrome only puts sortName on album objects. @@ -254,6 +259,7 @@ 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 || '' }]; + if (!_isJp(s.artist || parts[0]?.name || '')) return parts; // non-JP artist → keep original (e.g. ☆NoAki☆) 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);