diff --git a/backend/lib/metadata.js b/backend/lib/metadata.js index 0d6e2cd..1b75840 100644 --- a/backend/lib/metadata.js +++ b/backend/lib/metadata.js @@ -103,19 +103,23 @@ async function lookupItunesTrackMeta(artist, title) { res.on('end', () => { try { resolve(JSON.parse(d).results || []); } catch { reject(new Error('parse')); } }); }).on('error', reject); }); - let results = await fetchItunes('jp'); - if (!results.length) results = await fetchItunes('us'); - const normT = normalizeTitle(title); - const normA = (artist || '').toLowerCase().trim(); + const normT = normalizeTitle(title); + const normA = (searchArtist || '').toLowerCase().trim(); // Split by space OR comma/semicolon/slash so "VXLLAIN, iGRES" → "vxllain" not "vxllain," const firstWord = s => (s || '').toLowerCase().split(/[\s,;/]/)[0]; - // Prefer strict match (title + first-word artist), fall back to title-only. - // Title-only fallback handles cases where kuromoji gave a wrong artist romanization - // (e.g. "Terui Jun Sei" vs iTunes "Yoshimasa Terui" — different first word). - const match = results.find(t => - normalizeTitle(t.trackName) === normT && - firstWord(t.artistName) === firstWord(normA) - ) || results.find(t => normalizeTitle(t.trackName) === normT); + const strictMatch = results => results.find(t => + normalizeTitle(t.trackName) === normT && firstWord(t.artistName) === firstWord(normA) + ); + const titleOnlyMatch = results => results.find(t => normalizeTitle(t.trackName) === normT); + + // Strategy: JP strict → US strict → US title-only (never JP title-only to avoid + // false positives where JP returns a different Japanese song with the same English title) + const jpResults = await fetchItunes('jp'); + let match = strictMatch(jpResults); + if (!match) { + const usResults = await fetchItunes('us'); + match = strictMatch(usResults) || titleOnlyMatch(usResults); + } if (!match) return {}; return { album: match.collectionName || '', diff --git a/src/ui.js b/src/ui.js index 417ef24..e430ad0 100644 --- a/src/ui.js +++ b/src/ui.js @@ -450,7 +450,7 @@ export async function autofillItunes() { if (d.genre) document.getElementById('ie-genre').value = d.genre; if (d.year) document.getElementById('ie-year').value = d.year; if (d.trackNum) document.getElementById('ie-track').value = d.trackNum; - if (d.totalTracks) document.getElementById('ie-total').value = d.totalTracks; + if (d.totalTracks) document.getElementById('ie-totaltracks').value = d.totalTracks; if (d.coverUrl) { S._infoArtData = { url: d.coverUrl }; document.getElementById('info-edit-art-preview').innerHTML =