feat(server): file d'attente + téléchargement (vidéo/audio/miniature) #2
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/download-queue"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Résumé
Empilée sur #1 (réutilise et étend
ytDlpRunner.ts) — à merger après elle, base ajustée automatiquement par Forgejo une fois #1 mergée.Cœur du pipeline décrit pour l'app : file d'attente de téléchargements (vidéo/audio/miniature), exécutés avec une concurrence bornée, fichier livré au navigateur (pas de dépôt durable côté serveur).
Détails
server/src/services/downloadPlan.ts: fonctions pures construisant les arguments yt-dlp par mode — vidéo (sous-titres fr/en + miniature embarquée en option), audio (mp3/m4a/opus), miniature seule. Toujours un séparateur--avant l'URL. Parsing de la progression ([download] NN.N% ...) depuis stdout.server/src/services/videoUrl.ts: valide qu'une URL cible bienyoutube.com/youtu.be(watch/shorts/live/court) avant de la transmettre à yt-dlp — ferme le risque de relais SSRF via l'extracteur générique de yt-dlp (qui sait suivre des centaines de sites) si une URL arbitraire était acceptée.server/src/services/QueueService.ts: file en mémoire,MAX_CONCURRENT_DOWNLOADStéléchargements simultanés (défaut 2), annulation viaAbortSignal, dossier de sortie par élément supprimé après échec/annulation ou après livraison du fichier au client.server/src/services/ytDlpRunner.ts: étendu (signature en objet d'options) pour le suivi ligne par ligne de stdout (progression) et l'annulation.server/src/routes/queue.ts:POST /api/queue,GET /api/queue,DELETE /api/queue/:id,GET /api/queue/:id/file(streaming, nettoyage après envoi).spec/architecture.mdmis à jour.Tests
45 nouveaux tests (59 au total) sur 3 niveaux : fonctions pures (
downloadPlan,videoUrl), service avecytDlpRunnermocké mais un vrai système de fichiers temporaire (plus réaliste qu'un mock fs — couvre concurrence, annulation, nettoyage), routes viaapp.inject().Vérifié aussi en conditions réelles (serveur démarré localement, pas seulement les tests) : validation d'URL rejetée en
400, ajout en file, et passage propre àfailed+ nettoyage du dossier quand le binaire yt-dlp est absent (ENOENT) — pas de crash serveur.Vérifications locales
npm run lint(Biome, racine) : cleannpm run typecheck+npm test+npm run build(server) : clean, 59/59 tests passent🤖 Generated with Claude Code