const { log, updateJob } = require('./jobs'); const ytdlp = require('./ytdlp'); const CONFIG = require('./config'); // Download a single track via yt-dlp. async function downloadTrack(opts) { return ytdlp.downloadTrack(opts); } // Download all tracks of an album sequentially, updating job progress. async function downloadAlbumTracks({ jobId, artist, albumTitle, tracks, artworkUrl }) { const total = tracks.length; log(jobId, `📀 Album "${albumTitle}" — ${total} Tracks`); let done = 0, skipped = 0; for (const track of tracks) { try { const result = await downloadTrack({ jobId, artist: track.artistName || artist, albumArtist: artist, title: track.trackName || track.title, album: albumTitle, year: track.releaseDate ? new Date(track.releaseDate).getFullYear() : undefined, trackNum: track.trackNumber || undefined, totalTracks: total, discNum: track.discNumber || undefined, discTotal: track.discCount || undefined, compilation: track.collectionType === 'Compilation' || undefined, genre: track.primaryGenreName || undefined, artworkUrl: artworkUrl || track.artworkUrl100, explicit: track.trackExplicitness === 'explicit', outputDir: CONFIG.musicPath, durationMs: track.trackTimeMillis || undefined, }); if (result?.skipped) skipped++; else done++; updateJob(jobId, { progress: Math.round(((done + skipped) / total) * 90) }); } catch (e) { log(jobId, `⚠️ Fehler bei "${track.trackName || track.title}": ${e.message}`); } } return { done, skipped }; } module.exports = { downloadTrack, downloadAlbumTracks };