diff --git a/backend/novasonic-server.js b/backend/novasonic-server.js index cb39f2d..dac9870 100644 --- a/backend/novasonic-server.js +++ b/backend/novasonic-server.js @@ -107,6 +107,14 @@ async function downloadArtwork(url, dir) { }); } +const AUDIO_EXTS = ['mp3', 'flac', 'opus', 'm4a', 'ogg', 'wav']; + +function findExistingTrack(dir, trackPrefix, safeTitle) { + return AUDIO_EXTS + .map(ext => path.join(dir, `${trackPrefix}${safeTitle}.${ext}`)) + .find(f => fs.existsSync(f)) || null; +} + // Download a single track: yt-dlp audio + ffmpeg clean metadata + iTunes cover embedded async function downloadTrack({ jobId, artist, albumArtist, title, album, year, trackNum, totalTracks, discNum, discTotal, compilation, genre, artworkUrl, outputDir }) { const mainArtist = albumArtist || artist; @@ -115,8 +123,15 @@ async function downloadTrack({ jobId, artist, albumArtist, title, album, year, t const dir = path.join(outputDir || CONFIG.musicPath, safeArtist, safeAlbum); fs.mkdirSync(dir, { recursive: true }); - const safeTitle = sanitize(title); - const trackPrefix = trackNum ? String(trackNum).padStart(2, '0') + ' - ' : ''; + const safeTitle = sanitize(title); + const trackPrefix = trackNum ? String(trackNum).padStart(2, '0') + ' - ' : ''; + + const existing = findExistingTrack(dir, trackPrefix, safeTitle); + if (existing) { + log(jobId, `⏭ Bereits vorhanden: ${path.basename(existing)} — übersprungen`); + return { success: true, dir, skipped: true }; + } + const outputTemplate = path.join(dir, `${trackPrefix}${safeTitle}.%(ext)s`); const query = `${mainArtist} - ${title} official audio`; log(jobId, `🔍 Suche: "${query}"`); @@ -156,9 +171,8 @@ async function downloadTrack({ jobId, artist, albumArtist, title, album, year, t }); // Step 2: find the audio file yt-dlp wrote (newest audio file in dir) - const audioExts = ['mp3', 'flac', 'opus', 'm4a', 'ogg', 'wav']; const audioFile = fs.readdirSync(dir) - .filter(f => audioExts.some(e => f.endsWith(`.${e}`))) + .filter(f => AUDIO_EXTS.some(e => f.endsWith(`.${e}`))) .map(f => path.join(dir, f)) .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs)[0];