diff --git a/backend/lib/metadata.js b/backend/lib/metadata.js index 57e5f95..502b027 100644 --- a/backend/lib/metadata.js +++ b/backend/lib/metadata.js @@ -103,21 +103,25 @@ async function lookupItunesTrackMeta(artist, title) { const normA = (artist || '').toLowerCase().trim(); // Split by space OR comma/semicolon/slash so "VXLLAIN, iGRES" → "vxllain" not "vxllain," const firstWord = s => (s || '').toLowerCase().split(/[\s,;/]/)[0]; - const match = results.find(t => + // 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); if (!match) return {}; return { - album: match.collectionName || '', - 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: match.primaryGenreName || undefined, - artworkUrl: (match.artworkUrl100 || '').replace('100x100bb', '1000x1000bb'), - durationMs: match.trackTimeMillis || undefined, + album: match.collectionName || '', + 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: match.primaryGenreName || undefined, + artworkUrl: (match.artworkUrl100 || '').replace('100x100bb', '1000x1000bb'), + durationMs: match.trackTimeMillis || undefined, + itunesArtistName: match.artistName || undefined, }; } catch { return {}; } } diff --git a/backend/novasonic-server.js b/backend/novasonic-server.js index ef19e11..306c31f 100644 --- a/backend/novasonic-server.js +++ b/backend/novasonic-server.js @@ -364,7 +364,8 @@ app.post('/api/download', async (req, res) => { } else { log(jobId, `📋 Album aus Spotify: "${meta.album}"`); } - const result = await downloadTrack({ jobId, artist, title, ...meta, sourceUrl: sourceUrl || sp.sourceUrl || undefined }); + const finalArtist = meta.itunesArtistName || artist; + const result = await downloadTrack({ jobId, artist: finalArtist, title, ...meta, sourceUrl: sourceUrl || sp.sourceUrl || undefined }); if (result?.skipped) { updateJob(jobId, { status: 'done', progress: 100, message: 'Bereits vorhanden – übersprungen', skipped: true }); } else { @@ -438,10 +439,11 @@ app.post('/api/download', async (req, res) => { log(jobId, `📋 iTunes: "${trackArtist} – ${trackTitle}"`); itunes = await lookupItunesTrackMeta(searchArtist, trackTitle); } + const resolvedArtist = itunes.itunesArtistName || trackArtist; return downloadTrack({ jobId, - artist: trackArtist, - albumArtist: trackArtist, + artist: resolvedArtist, + albumArtist: resolvedArtist, title: trackTitle, album: itunes.album || track.collectionName || track.album || '', year: itunes.year || (track.releaseDate ? new Date(track.releaseDate).getFullYear() : undefined) || track.year, diff --git a/src/spotify.js b/src/spotify.js index 1aa88f7..70220ba 100644 --- a/src/spotify.js +++ b/src/spotify.js @@ -295,10 +295,8 @@ async function _loadSpotifyTrackArtwork(tracks, listEl) { if (match.trackExplicitness) t.trackExplicitness = match.trackExplicitness; if (match.previewUrl) t.previewUrl = match.previewUrl; if (match.trackTimeMillis) t.durationMs = match.trackTimeMillis; - // Use iTunes canonical English/romaji names — more accurate than Spotify (which may use Japanese) - if (match.artistName) t.artistName = match.artistName; - const JP_RE = /[぀-ヿ一-鿿]/; - if (JP_RE.test(t.trackName) && match.trackName) t.trackName = match.trackName; + // Use iTunes canonical English/romaji artist name (Spotify may have Japanese or wrong order) + if (match.artistName) t.artistName = match.artistName; if (window._spotifyResolved?.tracks?.[idx]) Object.assign(window._spotifyResolved.tracks[idx], t); const url = match.artworkUrl100 || match.artworkUrl60 || ''; if (url) _setArt(artEls[idx], url);