From 8704a17b4f6fa2045b02b6047b2dc35ae63f6353 Mon Sep 17 00:00:00 2001 From: Honey Date: Sat, 6 Jun 2026 00:09:13 +0200 Subject: [PATCH] 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 --- src/api.js | 6 +++--- src/components.js | 2 +- src/main.js | 6 +++--- src/player.js | 4 ++-- src/views.js | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/api.js b/src/api.js index 6a73194..69f15b3 100644 --- a/src/api.js +++ b/src/api.js @@ -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) { diff --git a/src/components.js b/src/components.js index 14264d4..8994833 100644 --- a/src/components.js +++ b/src/components.js @@ -45,7 +45,7 @@ export function makeSongItem(s, idx, list, { noArtistLink = false } = {}) { const artistHtml = artistParts.length ? artistParts.map(a => noArtistLink ? `${esc(a.name)}` - : `${esc(a.name)}` + : `${esc(a.name)}` ).join(' • ') : ''; diff --git a/src/main.js b/src/main.js index ff6e651..ea9259f 100644 --- a/src/main.js +++ b/src/main.js @@ -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; diff --git a/src/player.js b/src/player.js index 9a86778..27cb365 100644 --- a/src/player.js +++ b/src/player.js @@ -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 => `${esc(a.name)}`) + ? artistParts.map(a => `${esc(a.name)}`) .join(' • ') : '—'; 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 => `${esc(a.name)}`) + ? parts.map(a => `${esc(a.name)}`) .join(' • ') : '—'; } diff --git a/src/views.js b/src/views.js index 374f40d..df384f1 100644 --- a/src/views.js +++ b/src/views.js @@ -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 => `${esc(a.name)}`) + .map(a => `${esc(a.name)}`) .join(' • ') || ''; const cw = document.getElementById('album-cover-wrap'); const cv = coverUrl(album.coverArt, 512);