fix: ie-totaltracks element id + JP-strict/US-fallback iTunes matching

Prevent false Japanese matches by never using JP title-only fallback.
Strategy: JP strict → US strict → US title-only so niche Western tracks
still resolve but same-English-title Japanese songs don't pollute results.

Also fix JS error in autofillItunes: ie-total → ie-totaltracks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-05-27 18:15:04 +02:00
1 parent 21159ad2c5
commit 67f4be272a
2 files changed
+15 -11

No files matched your search

+14 -10
View File
@@ -103,19 +103,23 @@ async function lookupItunesTrackMeta(artist, title) {
res.on('end', () => { try { resolve(JSON.parse(d).results || []); } catch { reject(new Error('parse')); } }); res.on('end', () => { try { resolve(JSON.parse(d).results || []); } catch { reject(new Error('parse')); } });
}).on('error', reject); }).on('error', reject);
}); });
let results = await fetchItunes('jp');
if (!results.length) results = await fetchItunes('us');
const normT = normalizeTitle(title); const normT = normalizeTitle(title);
const normA = (artist || '').toLowerCase().trim(); const normA = (searchArtist || '').toLowerCase().trim();
// Split by space OR comma/semicolon/slash so "VXLLAIN, iGRES" → "vxllain" not "vxllain," // Split by space OR comma/semicolon/slash so "VXLLAIN, iGRES" → "vxllain" not "vxllain,"
const firstWord = s => (s || '').toLowerCase().split(/[\s,;/]/)[0]; const firstWord = s => (s || '').toLowerCase().split(/[\s,;/]/)[0];
// Prefer strict match (title + first-word artist), fall back to title-only. const strictMatch = results => results.find(t =>
// Title-only fallback handles cases where kuromoji gave a wrong artist romanization normalizeTitle(t.trackName) === normT && firstWord(t.artistName) === firstWord(normA)
// (e.g. "Terui Jun Sei" vs iTunes "Yoshimasa Terui" — different first word). );
const match = results.find(t => const titleOnlyMatch = results => results.find(t => normalizeTitle(t.trackName) === normT);
normalizeTitle(t.trackName) === normT &&
firstWord(t.artistName) === firstWord(normA) // Strategy: JP strict → US strict → US title-only (never JP title-only to avoid
) || results.find(t => normalizeTitle(t.trackName) === normT); // 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 {}; if (!match) return {};
return { return {
album: match.collectionName || '', album: match.collectionName || '',
+1 -1
View File
@@ -450,7 +450,7 @@ export async function autofillItunes() {
if (d.genre) document.getElementById('ie-genre').value = d.genre; if (d.genre) document.getElementById('ie-genre').value = d.genre;
if (d.year) document.getElementById('ie-year').value = d.year; if (d.year) document.getElementById('ie-year').value = d.year;
if (d.trackNum) document.getElementById('ie-track').value = d.trackNum; 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) { if (d.coverUrl) {
S._infoArtData = { url: d.coverUrl }; S._infoArtData = { url: d.coverUrl };
document.getElementById('info-edit-art-preview').innerHTML = document.getElementById('info-edit-art-preview').innerHTML =