fix: romaji display race on reload; iTunes search uses original Japanese name

- Await romaji overrides before restoring player bar so disp* functions
  have the cache ready on first render after reload
- dispArtistParts now carries originalName so artist clicks pass the
  Japanese name to Navidrome/iTunes search while displaying romaji

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-06-06 00:09:13 +02:00
1 parent ccdcda74ec
commit 8704a17b4f
5 files changed
+10 -10

No files matched your search

+3 -3
View File
@@ -178,11 +178,11 @@ export function dispArtistParts(s, parseArtistsFn) {
const parts = parseArtistsFn(s);
if (!S.cfg.showRomaji) return parts;
const ov = getRomajiOverrides();
if (s.artist && ov[s.artist]) return [{ name: ov[s.artist], id: parts[0]?.id || '' }];
if (s.albumArtist && ov[s.albumArtist]) return [{ name: ov[s.albumArtist], 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 || '' }];
const info = romajiLookup(s.id);
if (!info?.artistRomaji) return parts;
return [{ name: info.artistRomaji, id: parts[0]?.id || '' }];
return [{ name: info.artistRomaji, originalName: s.artist || parts[0]?.name || '', id: parts[0]?.id || '' }];
}
export async function romajiConvert(texts) {
+1 -1
View File
@@ -45,7 +45,7 @@ export function makeSongItem(s, idx, list, { noArtistLink = false } = {}) {
const artistHtml = artistParts.length
? artistParts.map(a => noArtistLink
? `<span style="color:var(--text2)">${esc(a.name)}</span>`
: `<span class="song-link" onclick="event.stopPropagation();s_goArtist(event,'${esc(a.name)}','${a.id||''}')">${esc(a.name)}</span>`
: `<span class="song-link" onclick="event.stopPropagation();s_goArtist(event,'${esc(a.originalName||a.name)}','${a.id||''}')">${esc(a.name)}</span>`
).join('<span style="color:var(--text3)"> • </span>')
: '';
+3 -3
View File
@@ -96,8 +96,7 @@ async function startApp() {
if (bnav) bnav.style.display = '';
absLoadSettingsLibraries();
}
loadRomajiOverrides().catch(() => {}); // fire-and-forget — cache for dispArtist/dispAlbum/dispTitle
if (S.cfg.showRomaji) fetchRomajiIndex().catch(() => {}); // fire-and-forget — don't block navigation
if (S.cfg.showRomaji) fetchRomajiIndex().catch(() => {});
if(_navLoad() && S._navCursor >= 0 && S._navStack[S._navCursor]) {
const last = S._navStack[S._navCursor];
S._navJumping = true;
@@ -107,7 +106,8 @@ async function startApp() {
navigate('home');
}
initNotifBell();
_restoreLastPlayed();
// Wait for overrides before restoring player bar so disp* functions have the cache ready
loadRomajiOverrides().catch(() => {}).then(() => { _restoreLastPlayed(); });
if(localStorage.getItem('ns_radio')==='1') { S.radioMode=true; _applyRadioBtn(); }
const sr = localStorage.getItem('ns_repeat');
if(sr === 'all' || sr === 'one') S.repeat = sr;
+2 -2
View File
@@ -447,7 +447,7 @@ export function updatePlayerUI(s, _skipMediaSession = false) {
document.getElementById('player-title').textContent = dispTitle(s);
const artistParts = dispArtistParts(s, parseArtists);
document.getElementById('player-artist-name').innerHTML = artistParts.length
? artistParts.map(a => `<span style="cursor:pointer" onclick="s_goArtist(event,'${esc(a.name)}','${a.id||''}')">${esc(a.name)}</span>`)
? artistParts.map(a => `<span style="cursor:pointer" onclick="s_goArtist(event,'${esc(a.originalName||a.name)}','${a.id||''}')">${esc(a.name)}</span>`)
.join('<span style="color:var(--text3)"> • </span>')
: '—';
document.getElementById('player-album-name').textContent = dispAlbum(s);
@@ -569,7 +569,7 @@ export function _syncNpDirect(s) {
if(an) {
const parts = dispArtistParts(s, parseArtists);
an.innerHTML = parts.length
? parts.map(a => `<span style="cursor:pointer" onclick="closeNowPlaying();s_goArtist(event,'${esc(a.name)}','${a.id||''}')">${esc(a.name)}</span>`)
? parts.map(a => `<span style="cursor:pointer" onclick="closeNowPlaying();s_goArtist(event,'${esc(a.originalName||a.name)}','${a.id||''}')">${esc(a.name)}</span>`)
.join('<span style="opacity:.5"> • </span>')
: '—';
}
+1 -1
View File
@@ -653,7 +653,7 @@ export async function loadAlbumDetail(album) {
document.getElementById('album-detail-name').textContent = album.name;
const artistEl = document.getElementById('album-detail-artist');
artistEl.innerHTML = parseArtists(album)
.map(a => `<span class="song-link" onclick="event.stopPropagation();s_goArtist(event,'${esc(a.name)}','${esc(a.id||'')}')">${esc(a.name)}</span>`)
.map(a => `<span class="song-link" onclick="event.stopPropagation();s_goArtist(event,'${esc(a.originalName||a.name)}','${esc(a.id||'')}')">${esc(a.name)}</span>`)
.join('<span style="color:var(--text3)"> • </span>') || '';
const cw = document.getElementById('album-cover-wrap');
const cv = coverUrl(album.coverArt, 512);