diff --git a/backend/novasonic-server.js b/backend/novasonic-server.js index d54d4cd..0a62f63 100644 --- a/backend/novasonic-server.js +++ b/backend/novasonic-server.js @@ -276,9 +276,18 @@ app.post('/api/download', async (req, res) => { const batchResults = await Promise.allSettled(batch.map(async track => { const trackTitle = track.trackName || ''; const trackArtist = track.artistName || artist || ''; - const searchArtist = trackArtist.split(',')[0].trim(); - log(jobId, `📋 iTunes: "${trackArtist} – ${trackTitle}"`); - const itunes = await lookupItunesTrackMeta(searchArtist, trackTitle); + // If the frontend already enriched this track with iTunes data (collectionName + + // trackNumber + durationMs all present), skip the re-lookup to avoid a different + // iTunes result overriding the already-correct enriched metadata. + const alreadyEnriched = !!(track.collectionName && track.trackNumber && track.durationMs); + let itunes = {}; + if (alreadyEnriched) { + log(jobId, `📋 Frontend-Metadaten: "${trackArtist} – ${trackTitle}" (${track.collectionName})`); + } else { + const searchArtist = trackArtist.split(',')[0].trim(); + log(jobId, `📋 iTunes: "${trackArtist} – ${trackTitle}"`); + itunes = await lookupItunesTrackMeta(searchArtist, trackTitle); + } return downloadTrack({ jobId, artist: trackArtist, diff --git a/src/spotify.js b/src/spotify.js index 8a4cfb1..73e2f25 100644 --- a/src/spotify.js +++ b/src/spotify.js @@ -219,6 +219,7 @@ async function _loadSpotifyTrackArtwork(tracks, listEl) { if (match.trackNumber) t.trackNumber = match.trackNumber; if (match.trackExplicitness) t.trackExplicitness = match.trackExplicitness; if (match.previewUrl) t.previewUrl = match.previewUrl; + if (match.trackTimeMillis) t.durationMs = match.trackTimeMillis; if (window._spotifyResolved?.tracks?.[idx]) Object.assign(window._spotifyResolved.tracks[idx], t); const url = match.artworkUrl100 || match.artworkUrl60 || ''; if (url) _setArt(artEls[idx], url);