youtubeDownloader/README.md
Nicolas f0dec86b19
Some checks failed
Publier l'image Docker / test (pull_request) Failing after 4s
Publier l'image Docker / publish (pull_request) Has been skipped
feat: playlists YouTube (parcourir, ajouter une par une ou d'un coup)
Coller un lien de playlist (youtube.com/playlist?list=...) dans le champ
URL affiche toutes ses videos dans la meme zone de resultats que la
recherche de chaine ; chaque ligne a son bouton "Ajouter", et un bouton
"Tout ajouter a la file" ajoute le reste d'un coup.

Serveur :
- GET /api/playlist (PlaylistDiscoveryService) : yt-dlp --flat-playlist
  -J. -J plutot que -j : le titre de la playlist n'existe qu'a la racine,
  et une playlist vide reste un resultat valide.
- playlistUrl.ts : n'accepte que les liens youtube.com/playlist?list=<id>
  et reconstruit l'URL canonique depuis le seul identifiant valide (rien
  d'autre de l'entree n'atteint yt-dlp). Un lien watch?v=...&list=...
  reste une video (--no-playlist etait deja passe au telechargement).
- videoSummary.ts : conversion d'une entree --flat-playlist en resume de
  video, extraite de ChannelDiscoveryService pour etre partagee (chaine
  et playlist parsent desormais identiquement). ChannelVideoSummary
  devient VideoSummary (et ChannelVideoDto -> VideoDto cote client).

Client :
- Le champ URL accepte video ou playlist (isPlaylistUrl aiguille) ; zone
  de resultats partagee (createResultsView).
- "Tout ajouter" : POST /api/queue sequentiels (ordre conserve, pas de
  doublon avec les lignes deja ajoutees). Un echec n'interrompt pas le
  lot : nombre d'echecs + premier message affiches, seules les lignes en
  echec redeviennent ajoutables. Le mode est lu une seule fois pour tout
  le lot.
- Miniatures de resultats en loading="lazy" (une playlist peut compter
  des centaines de videos).

Verifie contre le vrai yt-dlp (2026.07.04) : forme reelle de -J relevee
(fixtures de test calquees dessus), playlist de 1607 videos listee en
~11 s (delai fixe a 120 s). Teste dans le navigateur reel : playlist de
13 videos, ajout unitaire, "tout ajouter" (13 elements, aucun doublon),
echec partiel simule + reprise, playlist inexistante, lien video avec
list=, recherche de chaine (non-regression).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-19 14:55:38 +02:00

61 lines
3.2 KiB
Markdown

# youtubeDownloader
Application web self-hosted pour parcourir, mettre en file d'attente et extraire des vidéos/audios YouTube, en s'appuyant sur [yt-dlp](https://github.com/yt-dlp/yt-dlp) et [ffmpeg](https://ffmpeg.org/).
Ce projet reprend et remplace une série de scripts `.cmd` (téléchargement vidéo, récupération de miniatures, recherche de streams par chaîne) par une interface web unique.
## Fonctionnalités prévues
- **Parcourir une chaîne** : recherche par chaîne (URL ou `@handle`), liste de ses vidéos/streams avec filtre par mots-clés dans le titre.
- **Ajout par URL** : ajout direct d'une ou plusieurs URLs YouTube.
- **Playlists** : coller un lien de playlist (`youtube.com/playlist?list=...`) affiche toutes ses vidéos, à ajouter une par une ou d'un coup (« Tout ajouter à la file »).
- **File d'attente** : chaque élément ajouté est configurable individuellement :
- **Vidéo** : qualité, sous-titres (fr/en), miniature intégrée, métadonnées.
- **Audio seul** : extraction dans un format courant (mp3/m4a/opus).
- **Miniature seule** : récupération du poster uniquement.
- **Exécution en parallèle** : plusieurs téléchargements simultanés (concurrence configurable), avec suivi de progression en temps réel.
- **Livraison au navigateur** : les fichiers terminés sont téléchargés directement par l'utilisateur (pas de dépôt sur une bibliothèque partagée type Emby).
- **Accès** : aucune authentification, usage LAN uniquement.
## Stack technique (prévue)
- **Backend** : TypeScript / Fastify, organisé en services modulaires (découverte de chaîne, gestion de la file d'attente, exécution des téléchargements, notifications temps réel).
- **Frontend** : TypeScript vanilla, vues séparées en `.ts` / `.html` / `.scss`.
- **Moteur** : `yt-dlp` + `ffmpeg` (installés dans l'image Docker, non versionnés).
- **Déploiement** : Docker / docker-compose.
- **Linting** : Biome.js.
## Développement
Squelette actuel : serveur Fastify (`server/`) + client minimal (`client/`), sans encore la logique de découverte/file d'attente/téléchargement.
```bash
# Racine : lint (Biome) sur tout le repo
npm install && npm run lint
# Client : build (esbuild + sass) -> client/dist
cd client && npm install && npm run build
# Serveur : typecheck, tests, dev (sert client/dist)
cd server && npm install
npm run typecheck
npm test
npm run dev
```
Le serveur écoute par défaut sur `http://localhost:3000` (`/health` pour la vérification de santé) et sert les fichiers statiques de `client/dist` (variable `CLIENT_DIST_PATH`).
### Docker
```bash
docker build -f server/Dockerfile -t youtubedownloader .
docker run -p 3000:3000 youtubedownloader
```
### CI/CD
`.forgejo/workflows/publish-docker.yml` teste (lint + typecheck + tests + build) puis publie l'image sur `git.dev.kyuno.fr/kyuno/youtubedownloader` (push sur `main` -> `latest` + sha court, tag `vX.Y.Z` -> version). Nécessite un secret `REGISTRY_TOKEN` sur le dépôt (voir l'en-tête du workflow).
## Statut
Squelette d'infrastructure en place (serveur/client minimaux, Docker, CI). Fonctionnalités listées ci-dessus pas encore implémentées. Voir les issues et PR pour le suivi du développement.