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:
1 parent
21159ad2c5
commit
67f4be272a
2 files changed
+15
-11
No files matched your search
+14
-10
@@ -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 || '',
|
||||||
|
|||||||
@@ -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 =
|
||||||
|
|||||||
Reference in new issue
Block a user