Commit graph

2 commits

Author SHA1 Message Date
7fa28ea4f7 feat: téléchargement groupé en zip
Remplace le "tout télécharger" par téléchargements individuels décalés
(PR précédente) par une unique archive zip, streamée sans être bufferisée
en mémoire (paquet `archiver`).

- server/src/routes/queue.ts : GET /api/queue/download-all, construit le
  zip à la volée depuis les fichiers des éléments `completed`, noms
  dédupliqués en cas de titres identiques. Point d'attention : le flux
  est envoyé à la réponse AVANT archive.finalize(), pas l'inverse -
  finalize() n'aboutit qu'une fois tout le contenu écrit dans le flux, ce
  qui bloquerait indéfiniment sur une grosse archive si rien ne la lit
  encore.
- QueueService : buildDelivery() factorise la logique de livraison
  (chemin + nettoyage post-envoi) entre consumeCompletedFile (un fichier)
  et le nouveau consumeAllCompletedFiles (tous les fichiers prêts).
- QueuePanel : le bouton "Tout télécharger" déclenche maintenant un seul
  lien vers /api/queue/download-all. Tous les liens de téléchargement
  (individuel et groupé) portent target="_blank" : si jamais rien n'est
  disponible côté serveur au moment du clic, l'erreur s'ouvre dans un
  nouvel onglet plutôt que de remplacer l'application.
- test/helpers.ts : extractOutputDir et waitFor factorisés (dupliqués
  entre deux fichiers de test) ; waitFor accepte maintenant un prédicat
  async (la version précédente, sync uniquement, aurait toujours vu un
  prédicat async comme "vrai" immédiatement - une Promise est truthy).

4 nouveaux tests, dont un qui vérifie la signature zip réelle (PK\x03\x04)
sur une archive construite à partir de vrais fichiers temporaires (pas
juste des mocks) - 65 tests serveur au total. Vérifié aussi sur le
serveur réel en cours d'exécution (pas seulement les tests automatisés) :
GET /api/queue/download-all répond bien 404 sur une file vide, bouton
correctement cablé et masqué côté client.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 23:39:18 +02:00
29aadd28a4 feat: squelette serveur/client + Docker + CI de build/release
All checks were successful
Publier l'image Docker / test (push) Successful in 30s
Publier l'image Docker / publish (push) Successful in 1m10s
Pose l'infrastructure de base avant l'implémentation des fonctionnalités :
- server/ : Fastify + TypeScript (ESM), route /health, sert client/dist
- client/ : TypeScript vanilla + esbuild/sass, vue placeholder (shell)
- server/Dockerfile : image multi-étapes avec yt-dlp + ffmpeg embarqués
- .forgejo/workflows/publish-docker.yml : test puis publication sur le
  registre de conteneurs Forgejo (nécessite le secret REGISTRY_TOKEN)
- biome.json : lint du repo entier (downloader/ exclu)
- spec/architecture.md : documentation de ces choix

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 07:55:43 +02:00