fix(backend): don't tag Western artists with the JP store's katakana album-artist

The iTunes lookup is JP-first (for correct Japanese titles/artwork), but the Japanese
store returns katakana-localized names for Western artists — so DJ Snake's single got
album_artist / folder "DJスネイク • アルーナジョージ" while the title/artist stayed English.

- lookupItunesTrackMeta: take the NAMES (album, album-artist, track, artist) from the US
  store when the search isn't Japanese; keep JP names for actual Japanese songs.
- album & artist download paths: if iTunes' collectionArtistName is Japanese but the
  request artist isn't, keep the request's English name for the tag and folder.

Already-downloaded files aren't rewritten — re-download or fix via the editor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Opus 4.8 committed 2026-07-26 22:54:15 +02:00
1 parent 8cd3e9ac23
commit 72b612f5ff
2 files changed
+19 -7

No files matched your search

+10 -5
View File
@@ -179,22 +179,27 @@ async function lookupItunesTrackMeta(artist, title) {
let usMatch = strictMatch(usResults) || (!isJpSearch && titleOnlyMatch(usResults));
if (!match) match = usMatch;
if (!match) return {};
// For non-Japanese songs, take the NAMES from the US store: the JP store returns katakana-
// localized artist / album-artist names for Western artists (e.g. "DJスネイク" for DJ Snake),
// which would otherwise become the album_artist tag and the on-disk folder. Japanese songs keep
// the JP names (correct kanji). Numeric fields (year, track#, duration) are store-agnostic.
const naming = (!isJpSearch && usMatch) ? usMatch : match;
// JP genre names are localized (e.g. イージーリスニング); prefer US genre, map JP→EN as fallback
const rawGenre = (usMatch || match).primaryGenreName;
const genre = rawGenre ? toEnglishGenre(rawGenre) : undefined;
return {
album: match.collectionName || '',
albumArtist: match.collectionArtistName || undefined,
trackName: match.trackName || undefined,
album: naming.collectionName || '',
albumArtist: naming.collectionArtistName || undefined,
trackName: naming.trackName || undefined,
year: match.releaseDate ? new Date(match.releaseDate).getFullYear() : undefined,
trackNum: match.trackNumber || undefined,
totalTracks: match.trackCount || undefined,
discNum: match.discNumber || undefined,
discTotal: match.discCount || undefined,
genre: genre,
artworkUrl: (match.artworkUrl100 || '').replace('100x100bb', '1000x1000bb'),
artworkUrl: (naming.artworkUrl100 || match.artworkUrl100 || '').replace('100x100bb', '1000x1000bb'),
durationMs: match.trackTimeMillis || undefined,
itunesArtistName: match.artistName || undefined,
itunesArtistName: naming.artistName || undefined,
};
} catch { return {}; }
}