/** * Extrait le dossier de sortie passé à yt-dlp via `-o` (voir downloadPlan.ts). * * @param args - Arguments passés au mock de `runYtDlp`. * @returns Le dossier de sortie déduit du gabarit `-o`. */ export function extractOutputDir(args: readonly string[]): string { const oIndex = args.indexOf('-o'); const template = args[oIndex + 1] ?? ''; const withoutPrefix = template.replace(/^thumbnail:/, ''); return withoutPrefix.slice(0, withoutPrefix.lastIndexOf('/')); } /** * Attend qu'une condition devienne vraie, en pollant (pas de timers * factices : vraie I/O fichier/réseau en jeu dans les tests qui l'utilisent). * Accepte un prédicat synchrone ou asynchrone. * * @param predicate - Condition à satisfaire. * @param timeoutMs - Délai maximal avant d'abandonner. * @throws {Error} Si le délai est dépassé sans que la condition ne devienne vraie. */ export async function waitFor( predicate: () => boolean | Promise, timeoutMs = 2000, ): Promise { const start = Date.now(); while (!(await predicate())) { if (Date.now() - start > timeoutMs) { throw new Error('waitFor: timeout'); } await new Promise((resolve) => setTimeout(resolve, 10)); } }