feat: téléchargement groupé en zip #7

Merged
kyuno merged 1 commit from feat/queue-zip-download into fix/layout-scroll-and-thumbnails 2026-09-16 23:41:33 +02:00
Owner

Résumé

Empilée sur #6 (toujours ouverte) — à merger après elle. Remplace le "tout télécharger" par téléchargements individuels décalés (introduit dans #5) par une unique archive zip.

Détails

  • server/src/routes/queue.ts : GET /api/queue/download-all, construit le zip à la volée depuis les fichiers des éléments completed (paquet archiver, jamais bufferisé en mémoire), noms dédupliqués en cas de titres identiques (Vidéo (2).mp4). 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 (.zip)" 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/waitFor factorisés (dupliqués entre deux fichiers de test) ; waitFor accepte désormais 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).

Tests

4 nouveaux tests (65 au total), 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.

Vérifications locales

  • npm run lint (Biome) + tests + typecheck + build, serveur et client : clean
  • Testé 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 "Tout télécharger" correctement câblé et masqué côté client

🤖 Generated with Claude Code

## Résumé Empilée sur #6 (toujours ouverte) — à merger après elle. Remplace le "tout télécharger" par téléchargements individuels décalés (introduit dans #5) par une unique archive zip. ## Détails - `server/src/routes/queue.ts` : `GET /api/queue/download-all`, construit le zip à la volée depuis les fichiers des éléments `completed` (paquet `archiver`, jamais bufferisé en mémoire), noms dédupliqués en cas de titres identiques (`Vidéo (2).mp4`). 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 (.zip)" 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`/`waitFor` factorisés (dupliqués entre deux fichiers de test) ; `waitFor` accepte désormais 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). ## Tests 4 nouveaux tests (65 au total), 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. ## Vérifications locales - `npm run lint` (Biome) + tests + typecheck + build, serveur et client : clean - Testé 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 "Tout télécharger" correctement câblé et masqué côté client 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-16 23:39:36 +02:00
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>
kyuno merged commit 97e14d97e5 into fix/layout-scroll-and-thumbnails 2026-09-16 23:41:33 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/youtubeDownloader#7
No description provided.