fix: use exact expected filename instead of newest-file heuristic
Parallel downloads to the same album dir (e.g. two tracks from same album) both resolved to the last-written file, causing wrong metadata to be embedded. Now each download targets its known output path (trackPrefix + safeTitle + audioFmt) directly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
3962a90b0d
commit
f831e1fd8f
1 file changed
+6
-13
@@ -289,14 +289,10 @@ async function downloadTrack({ jobId, artist, albumArtist, title, album, year, t
|
|||||||
// Without it yt-dlp gets a mixed feed of videos, channels, and playlists as well.
|
// Without it yt-dlp gets a mixed feed of videos, channels, and playlists as well.
|
||||||
const YTM_SONGS_PARAM = 'EgWKAQIIAWoKEAkQBRAKEAMQBA%3D%3D';
|
const YTM_SONGS_PARAM = 'EgWKAQIIAWoKEAkQBRAKEAMQBA%3D%3D';
|
||||||
const ytmUrl = `https://music.youtube.com/search?q=${encodeURIComponent(query)}¶ms=${YTM_SONGS_PARAM}`;
|
const ytmUrl = `https://music.youtube.com/search?q=${encodeURIComponent(query)}¶ms=${YTM_SONGS_PARAM}`;
|
||||||
// Snapshot files already in dir before we start — so hasAudio() only detects NEW files
|
// We know the exact output filename before yt-dlp runs — no snapshot heuristic needed.
|
||||||
// from the current download attempt, not pre-existing files from parallel jobs.
|
const expectedAudio = path.join(dir, `${trackPrefix}${safeTitle}.${CONFIG.audioFmt}`);
|
||||||
let snapBefore = new Set(fs.readdirSync(dir));
|
const hasAudio = () => fs.existsSync(expectedAudio);
|
||||||
const resetSnap = () => { snapBefore = new Set(fs.readdirSync(dir)); };
|
const tryYtdlp = async (args) => { await spawnYtdlp(args); };
|
||||||
const hasAudio = () => fs.readdirSync(dir).some(
|
|
||||||
f => !snapBefore.has(f) && AUDIO_EXTS.some(e => f.endsWith(`.${e}`))
|
|
||||||
);
|
|
||||||
const tryYtdlp = async (args) => { resetSnap(); await spawnYtdlp(args); };
|
|
||||||
|
|
||||||
const variantFilter = buildVariantFilter(title);
|
const variantFilter = buildVariantFilter(title);
|
||||||
const titleKws = buildTitleKeywords(title);
|
const titleKws = buildTitleKeywords(title);
|
||||||
@@ -387,11 +383,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)
|
// Step 2: locate the audio file yt-dlp wrote (exact expected path)
|
||||||
const audioFile = fs.readdirSync(dir)
|
const audioFile = hasAudio() ? expectedAudio : null;
|
||||||
.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];
|
|
||||||
|
|
||||||
if (!audioFile) {
|
if (!audioFile) {
|
||||||
log(jobId, '⚠️ Keine Audio-Datei gefunden');
|
log(jobId, '⚠️ Keine Audio-Datei gefunden');
|
||||||
|
|||||||
Reference in new issue
Block a user