---
title: ytdl-sub
created: 2026-06-07
updated: 2026-06-07
type: app
tags: [catalogue, downloads, youtube, yt-dlp, subscriptions, python, media-library]
confidence: high
contested: false
sources: [https://selfh.st/apps/?tag=downloads, https://github.com/jmbannon/ytdl-sub]
---

# 📥 ytdl-sub

> **Gestionnaire de téléchargements YouTube piloté par fichiers de configuration YAML** : définissez vos abonnements une fois (`channels.yml`, `subscriptions.yml`), ytdl-sub synchronise, télécharge, **renomme et enrichit** chaque vidéo avec métadonnées et jaquettes pour les **\*arr et Jellyfin/Plex**. L'outil des power-users qui aiment l'Infrastructure-as-Code.

| Métadonnée | Valeur |
| :--- | :--- |
| **Site web** | [https://ytdl-sub.readthedocs.io](https://ytdl-sub.readthedocs.io) |
| **GitHub** | [https://github.com/jmbannon/ytdl-sub](https://github.com/jmbannon/ytdl-sub) |
| **License** | GPL-3.0 |
| **Langage** | Python |
| **Étoiles** | 101 ⭐ |
| **Dernière MAJ** | 2025-11 |
| **Catégorie** | [[cat-downloads\|Downloads]] |

## Description

**ytdl-sub** est né d'un besoin très précis : transformer un dossier de téléchargements YouTube bruts en une **vraie médiathèque** lisible par Sonarr/Radarr/Lidarr/Jellyfin/Plex, **sans dépendre d'une UI web**. L'idée : tout se décrit dans un **fichier YAML** (subscriptions, overrides, plugins), ytdl-sub fait le reste — téléchargement via `yt-dlp`, **renommage selon des presets** (Series, Movie, Music), **fetching de métadonnées** (TMDB, TVDB, MusicBrainz, Spotify), **génération de fichiers `.nfo`** (Kodi/Jellyfin), **placement dans la bonne arborescence** (hardlink possible), et **notifications**.

Les **overrides** sont le cœur du système : on décrit un *handler* par chaîne YouTube ("TechLinked" = émission type TV, "Veritasium" = documentaire, "Alice in Chains" = groupe) et ytdl-sub applique un **preset** (Series, Movie, Music) avec les bons champs (saison, épisode, album, artiste). On peut par exemple générer automatiquement :
- `/tv/TechLinked/Season 2024/S2024E12 - Titre.mkv` + `.nfo`
- `/movies/A Camera Film (2023)/A Camera Film (2023).mkv` + `poster.jpg`
- `/music/Alice in Chains/Dirt/01 - Them Bones.opus`

Tout est **reproductible** : le YAML est versionnable dans Git, on peut dry-run, et ytdl-sub est **idempotent** (relancer n'écrase rien). Supporte aussi les **chapters**, **SponsorBlock**, **sous-titres** (multi-langues), **cookies YouTube**, et **CLI complète** (`ytdl-sub sub`, `ytdl-sub refresh`, `ytdl-sub view`).

**Points forts** : IaC, plugins très riches, métadonnées Tier-1, intégration *arr native, **GPL-3.0**.

**Points faibles** : pas d'UI web (CLI only), courbe d'apprentissage YAML, mono-langue par défaut (anglais) pour les métadonnées, maintenance moins active que Pinchflat.

## Installation

### Via Docker (recommandé)

```yaml
# docker-compose.yml
services:
  ytdl-sub:
    image: ghcr.io/jmbannon/ytdl-sub:latest
    container_name: ytdl-sub
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris
      - PUID=1000
      - PGID=1000
    volumes:
      - ./config:/config
      - /mnt/media/tv:/tv
      - /mnt/media/movies:/movies
      - /mnt/media/music:/music
      - /mnt/media/youtube:/youtube
    # Pas de port exposé : CLI only
```

Exemple de `config/subscriptions.yaml` minimal :
```yaml
__preset__:
  preset: "tv_show"
  tv_show_directory: "/tv"
  tv_show_name: "{title}"
overrides:
  TechLinked:
    TVShowTitle: "TechLinked"
    TVShowDate: "{upload_date>%Y}"
```

### Installation manuelle

Python 3.10+, `ffmpeg`. `pip install ytdl-sub`, créer le dossier de config, `ytdl-sub sub config/subscriptions.yaml`.

## Configuration

1. **Choisir un preset** (`series`, `tv_show`, `movie`, `music_video`, `music`, `audio`) — chacun a ses propres variables.
2. **Écrire le YAML** : pour chaque source (chaîne, playlist, URL) on définit un **override** avec les champs à matcher.
3. **Credentials metadata** (optionnel) : API keys TMDB, TVDB, MusicBrainz, Spotify pour enrichir.
4. **Cookies YouTube** : `./config/cookies.txt` monté en read-only.
5. **Cron externe** : `ytdl-sub sub` doit tourner périodiquement (cron, systemd-timer, ou un sidecar).
6. **Webhooks** : `ytdl-sub` peut appeler une URL après chaque import → rafraîchir Jellyfin.
7. **Pas de reverse-proxy** : application CLI/headless, on s'y connecte via SSH ou un wrapper UI.

## Alternatives

### Open source
- [[app-tubesync]] — UI web intégrée, plus "presse-bouton"
- [[app-pinchflat]] — UI web moderne Elixir/LiveView
- [[app-metube]] — wrapper web ponctuel `yt-dlp`
- [[app-hometube]] — pont YouTube ↔ Jellyfin
- [[app-sonarr]] / [[app-radarr]] / [[app-lidarr]] — les **consommateurs** de la sortie de ytdl-sub
- **youtube-dl-server** — abandonné

### Propriétaires
- **Plex Watch Later** — fermé, lié au compte Plex
- **iCloud + YouTube Premium** — pas d'équivalent hors-ligne persistant
- **Jellyfin YouTube Plugin** — lecture seule, pas de download

## Sécurité

- ⚠️ **Cookies YouTube** : critique, à monter en read-only 0400.
- ⚠️ **API keys** (TMDB, TVDB…) : dans `./config` ou variables d'environnement, jamais dans Git en clair — utiliser **git-crypt** ou **SOPS**.
- ✅ **Aucune exposition réseau** : ytdl-sub est headless/CLI, surface d'attaque nulle.
- ⚠️ **Espace disque** : les presets `tv_show` et `movie` répliquent les fichiers (hardlink recommandé) — sinon doubler l'espace.
- ⚠️ **Cron output** : rediriger les logs vers un fichier, surveiller les erreurs `yt-dlp` (changements d'API YouTube fréquents).
- ✅ **Sauvegardes** : `./config` (YAML versionné) + `cookies.txt`.

## Ressources
- [Documentation officielle](https://ytdl-sub.readthedocs.io)
- [Wiki / Presets](https://ytdl-sub.readthedocs.io/en/latest/config.html)
- [GitHub](https://github.com/jmbannon/ytdl-sub)
- [selfh.st — Downloads](https://selfh.st/apps/?tag=downloads)

## Pages Liées
- [[cat-downloads]] — Catégorie parente
- [[app-tubesync]] — Concurrent UI web
- [[app-pinchflat]] — Concurrent UI web moderne
- [[app-sonarr]] / [[app-radarr]] / [[app-lidarr]] — Consommateurs
- [[app-jellyfin]] — Media server cible
- [[recettes-docker-compose]] — Templates Docker
- [[securisation-home-lab]] — Bonnes pratiques
