feat: playlists YouTube (parcourir, ajouter une par une ou d'un coup) #10
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/playlist-support"
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é
Coller un lien de playlist (
youtube.com/playlist?list=...) dans le champ URL affiche toutes ses vidéos dans la même zone de résultats que la recherche de chaîne. Chaque ligne a son bouton « Ajouter », et un bouton « Tout ajouter à la file » ajoute le reste d'un coup.Le champ « URL directe » devient « URL (vidéo ou playlist) » : un lien de vidéo est ajouté directement à la file comme avant, un lien de playlist charge ses vidéos. Le bouton passe de « Ajouter à la file » à « Ajouter » puisqu'il fait désormais l'un ou l'autre.
Serveur
GET /api/playlist?url=(PlaylistDiscoveryService) :yt-dlp --flat-playlist -J.-J(un seul objet JSON) plutôt que-j: le titre de la playlist n'existe qu'à la racine, et une playlist vide reste un résultat valide avec son titre.200 { title, videos },400si le lien n'est pas une playlist,502si yt-dlp échoue (introuvable/privée, binaire absent, sortie illisible).playlistUrl.ts: n'accepte que les liensyoutube.com/playlist?list=<id>(https, domaines YouTube, sans port ni identifiants) et reconstruit l'URL canonique depuis le seul identifiant validé — rien d'autre de l'entrée n'atteint yt-dlp. Même garde anti-SSRF quevideoUrl.ts.videoSummary.ts: la conversion d'une entrée--flat-playlisten résumé de vidéo est extraite deChannelDiscoveryServicepour être partagée (chaîne et playlist parsent identiquement, y compris le repli surthumbnailsdu correctif précédent).ChannelVideoSummary→VideoSummarycôté serveur,ChannelVideoDto→VideoDtocôté client (le type ne désigne plus uniquement des vidéos de chaîne).Client
isPlaylistUrl()(fonction pure, testée) aiguille la saisie ; le serveur reste l'autorité de validation.createResultsView), avec statut (« Playlist « X » : 13 vidéo(s). »), erreurs d'ajout et bouton « Tout ajouter ».POST /api/queueséquentiels : l'ordre de la playlist est conservé dans la file, les lignes déjà ajoutées sont ignorées (aucun doublon), un échec n'interrompt pas la suite — en fin de lot le nombre d'échecs et le premier message sont affichés, seules les lignes en échec redeviennent ajoutables, et relancer le bouton ne réajoute que celles-là. Le mode est lu une seule fois pour tout le lot.loading="lazy"(une playlist peut compter des centaines de vidéos).Choix à connaître
watch?v=…&list=…(vidéo vue depuis une playlist) reste traité comme une seule vidéo, côté client comme côté serveur (et le téléchargement passait déjà--no-playlist). C'est la règle la plus prévisible, mais si tu préfères qu'un tel lien ouvre la playlist, c'est un changement isolé dans les deuxplaylistUrl.ts.allowAddAll: truedanswireChannelForm).Vérifications
npm run lint(Biome) + typecheck + build serveur/client : clean ; tests : 127 serveur (dont 60 nouveaux : validation d'URL par cas limites/anti-SSRF, service, route, résumé d'entrée) + 22 client.-Jrelevée et fixtures de test calquées dessus (après le bug des miniatures, ne plus se fier à la forme théorique). Playlist de 1607 vidéos listée en ~11 s (2 Mo de JSON) → délai fixé à 120 s. Playlist inexistante → 502 avec message clair ; lien noyé de paramètres (music.youtube.com…&si=…&index=…) → canonicalisé.watch?v=…&list=…→ ajouté comme vidéo seule ; recherche de chaîne (non-régression : 60 résultats avec miniatures, sans bouton « Tout ajouter », pas de débordement de page) ; thèmes clair et sombre.🤖 Generated with Claude Code