Télécharger facilement des vidéos YouTube avec yt-dlp

Télécharger des vidéos YouTube, c’est une très longue histoire depuis l’apparition de ce service. Cela a toujours existé. C’est une histoire faite de rebondissement avec des hauts et des bas pour beaucoup d’entre nous. Qui n’a jamais cherché à faire ça ? Bon si vous êtes arrivés ici, c’est que vous avez sûrement déjà essayé et que cela ne s’est pas passé comme prévu.

Dans des temps maintenant révolus, il y avait le célèbre Youtube MP3 qui a été actif pendant de très longues années et qui répondait parfaitement au besoin sans trop de contraintes. Vous aviez un site web avec un formulaire tout simple, vous collez le lien de votre vidéo Youtube et après quelques secondes d’attente vous récupérez votre fichier .mp3 avec le contenu audio de la vidéo. Il existait de nombreux clones qui proposaient la même chose et qui étaient plus ou moins douteux. Bien évidemment, il y avait des services qui allaient encore plus loin et vous pouviez récupérer la vidéo complète en .mp4 avec son et vidéo. Comme un bon vieux DivX de l’époque, le genre de fichiers qui était échangé via les torrents.

Aujourd’hui, le paysage a un peu changé. Les sites centralisés qui n’ont pas su s’adapter ont rapidement fermé, car c’était impossible pour eux de répondre à la demande. Google a largement musclé sa défense contre ce type de pratique. Ceux qui persistent dans ce genre d’entreprise ont dû innover et utiliser des techniques un peu plus sophistiquées pour masquer leur identité et leurs actions aux yeux de Youtube. Cela passe notamment par l’utilisation de proxy en masse et d’autres techniques pour ne pas se faire repérer par Google. Mais ici, on parle bien de services centralisés avec des sites qui vous proposent ce genre de fonctionnalité clé en main. Vous arrivez, vous payez, vous copier coller votre lien et c’est terminé, vous avez votre mp3 ou mp4.

Pour répondre à cette demande et à ce besoin qui reste malgré tout présent, ne serait-ce que pour sauvegarder des ressources d’une suppression arbitraire ; une autre branche a émergée. Celle des logiciels « classiques » à faire tourner directement sur sa machine. L’avantage, c’est que c’est votre adresse IP qui est affichée aux yeux de Youtube et donc Google ce qui renforce la confiance pour les algorithmes de défense. Le problème, c’est qu’encore une fois, ils sont plus ou moins douteux pour certains. Au-delà de ça, beaucoup sont maintenant devenus payants …

Certains étaient gratuits avec de la publicité affichée ici et là, mais ça n’a pas suffi donc ils sont devenus totalement payants. Il faut passer par la caisse pour continuer à utiliser le logiciel. D’autres sont encore gratuits, mais sont très limités avant d’inciter très rapidement à sortir la carte bleue. Force de ce constat, on a toujours besoin de télécharger des vidéos Youtube, librement, sans contraintes, gratuitement et surtout relativement facilement

La solution libre YT-DLP

Alors évidemment, si vous êtes arrivés ici, je préfère vous prévenir, on va utiliser du logiciel libre comme on aime et vous n’allez pas avoir une belle interface pour vous tenir la main. Sauf que c’est open source, gratuit, mis constant à jour et surtout, ça marche parfaitement bien ! Il s’agit d’un projet extrêmement actif depuis de nombreuses années et il est très populaire dans la communauté du monde libre.

Il faut savoir qu’il y a tout un écosystème autour de ça, mais j’en parlerai dans un futur article. Tout ça pour dire que c’est une brique de base très importante, si vous maîtrisez yt-dlp vous n’avez pas besoin du reste ou d’autres outils pour télécharger des vidéos Youtube. L’open source est toujours là à la rescousse. Dans le cas de YT-DLP, forcément par défaut, le logiciel est fourni tel quel et n’est pas emballé proprement dans un outil clé en main. Rassurez-vous, il existe des surcouches avec de belles interfaces graphiques que je vous présenterai prochainement dans un autre article.

Deux approches pour utiliser yt-dlp : pourquoi j’ai choisi Python

Avant de plonger dans le vif du sujet, il est important de savoir qu’il existe principalement deux manières d’utiliser yt-dlp. Chacune a ses avantages, mais pour ce tutoriel, j’ai opté pour une méthode spécifique que je trouve plus flexible et universelle. C’est finalement souvent le cas et il s’agit surtout d’une question de choix et d’environnement, car le logiciel s’utilise finalement de la même manière.

Pour ceux qui préfèrent un outil en ligne de commande classique, il est tout à fait possible d’installer yt-dlp directement sur votre système. Que vous soyez sur Windows, macOS ou Linux, le processus est simple. Il suffit de se rendre sur la page des versions releases du projet yt-dlp sur GitHub. Vous y trouverez des fichiers binaires compilés pour chaque système d’exploitation (yt-dlp.exe pour Windows, yt-dlp_macos pour macOS, etc.).

Une fois le fichier téléchargé, il vous suffira de le rendre exécutable et, idéalement, de le placer dans un répertoire inclus dans le PATH de votre système pour pouvoir l’appeler depuis n’importe quel terminal. C’est une méthode rapide et efficace si votre objectif est simplement d’utiliser yt-dlp manuellement depuis une invite de commandes.

Dans ce tutoriel, nous allons aborder yt-dlp d’une manière différente. En tant que bibliothèque Python. En l’installant via pip, le gestionnaire de paquets de Python, avec une simple commande comme pip install yt-dlp, nous intégrons toutes les fonctionnalités de yt-dlp directement dans nos scripts Python. Pourquoi ce choix ?

  • Indépendance de la plateforme : Le principal avantage est la portabilité. Un script Python qui utilise la bibliothèque yt-dlp fonctionnera à l’identique sur Windows, macOS et Linux sans aucune modification. Cela garantit que le tutoriel sera accessible à tous, peu importe le système d’exploitation.
  • Automatisation et flexibilité : Utiliser yt-dlp en Python ouvre la porte à des possibilités d’automatisation bien plus poussées. Nous pouvons créer des programmes qui, par exemple, lisent une liste d’URL depuis un fichier, téléchargent les vidéos, les convertissent et les organisent dans des dossiers, le tout sans intervention manuelle.
  • Contrôle total depuis le code : Toutes les options de yt-dlp (choix du format, de la qualité, téléchargement des sous-titres, etc.) peuvent être définies et gérées directement dans le code Python. Cela permet de créer des logiques complexes et de gérer les erreurs de manière plus fine qu’avec un simple script shell.
  • Intégration facile : Cette approche permet d’intégrer facilement les capacités de téléchargement de vidéos dans des projets Python plus vastes, comme des applications web, des bots ou des outils d’archivage de données.

Bien que l’installation d’un binaire soit parfaitement valable pour une utilisation en ligne de commande, l’approche via Python que nous allons explorer ensemble nous offre une puissance et une universalité bien supérieures pour construire des outils automatisés et multiplateformes.

Utiliser yt-dlp avec un script Python pour télécharger des vidéos en MP4 ou WebM

Je ne vais pas vous faire l’affront de vous expliquer comment installer Python sur votre machine et vous devriez facilement trouver les ressources nécessaires sur Internet. Si vous êtes un habitué de Python, la première étape est bien sur de créer un environnement virtuel avec venv ou uv.

Une fois que c’est fait, vous allez pouvoir installer les dépendances dont nous avons besoin pour faire fonctionner notre script. Pour cela, lancez la commande suivante dans votre environnement virtuel Python :

pip install yt-dlp

Une fois que c’est installé, on peut s’attaquer au script que vous allez le voir est extrêmement simple pour commencer. Avec cette version, on se contente simplement de télécharger la vidéo YouTube tel quel avec le son et surtout l’image :

import sys
import yt_dlp

# 1. Vérifier si une URL a été passée en argument
if len(sys.argv) < 2:
    print("Erreur : Veuillez fournir une URL de vidéo en argument.")
    print("Usage: python download_video.py <URL>")
    sys.exit(1) # Quitte le script car il manque l'URL

# 2. Récupérer l'URL depuis les arguments de la ligne de commande
video_url = sys.argv[1]

print(f"Démarrage du téléchargement pour l'URL : {video_url}")

# 3. Lancer le téléchargement avec yt-dlp
try:
    # Les options peuvent être laissées vides pour un téléchargement simple
    # Pour des options plus complexes, consultez la documentation de yt-dlp
    ydl_opts = {}
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([video_url])
    print("Téléchargement terminé avec succès !")
except Exception as e:
    print(f"Une erreur est survenue : {e}")

Enregistrez votre script, par exemple sous le nom dl.py. Pour le lancer et télécharger une vidéo YouTube, il vous suffit d’appeler la commande suivante :

python3 dl.py "https://www.youtube.com/watch?v=xvFZjo5PgG0"

Normalement, vous devriez obtenir une sortie qui ressemble à ceci dans votre terminal :

Démarrage du téléchargement pour l'URL : https://www.youtube.com/watch?v=xvFZjo5PgG0
[youtube] Extracting URL: https://www.youtube.com/watch?v=xvFZjo5PgG0
[youtube] xvFZjo5PgG0: Downloading webpage
[youtube] xvFZjo5PgG0: Downloading tv client config
[youtube] xvFZjo5PgG0: Downloading tv player API JSON
[youtube] xvFZjo5PgG0: Downloading web safari player API JSON
[youtube] xvFZjo5PgG0: Downloading m3u8 information
[info] xvFZjo5PgG0: Downloading 1 format(s): 396+251
[download] Destination: VideoZT [xvFZjo5PgG0].f396.mp4
[download] 100% of  133.09KiB in 00:00:00 at 1.81MiB/s
[download] Destination: VideoZT [xvFZjo5PgG0].f251.webm
[download] 100% of  122.84KiB in 00:00:00 at 1.61MiB/s
[Merger] Merging formats into "VideoZT [xvFZjo5PgG0].webm"
Deleting original file VideoZT [xvFZjo5PgG0].f251.webm (pass -k to keep)
Deleting original file VideoZT [xvFZjo5PgG0].f396.mp4 (pass -k to keep)
Téléchargement terminé avec succès !

Voilà vous avez récupéré votre vidéo, mais une chose vous intrigue peut être, il est possible qu’elle soit au format WebM. Certaines vidéos sont sauvegardées en .mp4, tandis que d’autres apparaissent en .webm quand elles sont téléchargés avec yt-dlp. Ce n’est ni une erreur de votre part, ni un bug du script. Ce comportement est tout à fait normal et s’explique par la manière dont yt-dlp interagit avec la grande variété de formats proposés par YouTube. Mon script est conçu pour être simple. Il demande la « meilleure qualité disponible », et yt-dlp s’adapte ensuite intelligemment à la source.

Dans la plupart des situations, souvent pour des vidéos en résolution standard comme le 1080p, YouTube met à disposition un unique fichier .mp4 « tout-en-un » qui contient déjà la vidéo et l’audio. Face à cette option, yt-dlp choisit logiquement cette voie directe. Il télécharge ce seul fichier, et vous obtenez sans surprise un .mp4 sur votre ordinateur. C’est le scénario le plus transparent pour l’utilisateur.

Cependant, pour les contenus plus récents ou en très haute définition, YouTube opte pour une technologie plus moderne qui sépare les pistes vidéo et audio afin d’optimiser la diffusion. Un excellent exemple est visible dans le journal de téléchargement que vous avez observé. On y voit que yt-dlp a d’abord identifié les meilleurs flux disponibles : une piste vidéo qui se trouvait être un fichier .mp4 et une piste audio séparée, qui était un fichier .webm. yt-dlp a donc téléchargé ces deux éléments distinctement.

Ayant en sa possession ces deux fichiers, yt-dlp doit les assembler en un seul. Par défaut, lorsqu’il doit combiner des formats de nature différente, comme ici un conteneur MP4 pour la vidéo et un WEBM pour l’audio, il privilégie souvent le conteneur le plus moderne et flexible pour le fichier final, qui est le .webm. C’est donc la raison pour laquelle le fichier final devient un .webm, même si le flux vidéo d’origine était bien un .mp4. Le format de sortie est donc le résultat de cette fusion intelligente, et non le reflet d’un seul fichier source.

Si, pour des raisons de compatibilité avec certains logiciels ou appareils, vous préférez obtenir systématiquement un fichier .mp4, une solution existe. Il est possible de donner une instruction supplémentaire à yt-dlp pour qu’il effectue une opération appelée « remuxage » après le téléchargement. Ce processus rapide change simplement le conteneur du fichier final en .mp4 sans ré-encoder la vidéo, préservant ainsi 100% de la qualité originale. Pour cela, votre système doit disposer de l’outil FFmpeg, que yt-dlp utilise en coulisses pour toutes ses manipulations vidéo.

Voici le script Python optimisé pour forcer la sortie en MP4 si c’est ce que vous voulez absolument :

import sys
import yt_dlp

# 1. Vérifier si une URL a été passée en argument
if len(sys.argv) < 2:
    print("Erreur : Veuillez fournir une URL de vidéo en argument.")
    print("Usage: python download_video.py <URL>")
    sys.exit(1)

# 2. Récupérer l'URL
video_url = sys.argv[1]

print(f"Démarrage du téléchargement pour l'URL : {video_url}")

# 3. Définir les options pour yt-dlp
ydl_opts = {
    # Sélectionne la meilleure vidéo et le meilleur audio, puis fusionne.
    # '/best' est une solution de repli si les flux séparés ne sont pas trouvés.
    'format': 'bestvideo+bestaudio/best',

    # Nom du fichier de sortie : utilise le titre de la vidéo.
    'outtmpl': '%(title)s.%(ext)s',

    # Section de post-traitement pour forcer le conteneur MP4
    'postprocessors': [{
        # Utilise l'outil de remuxage de FFmpeg
        'key': 'FFmpegVideoRemuxer',
        # Spécifie que le conteneur final souhaité est 'mp4'
        'preferedformat': 'mp4',
    }],
}

# 4. Lancer le téléchargement
try:
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([video_url])
    print("\nTéléchargement et conversion en MP4 terminés avec succès !")

# Gère les erreurs spécifiques à yt-dlp, notamment l'absence de FFmpeg
except yt_dlp.utils.DownloadError as e:
    print(f"\nUne erreur est survenue lors du téléchargement : {e}")
    print("CONSEIL : Assurez-vous que FFmpeg est bien installé et accessible sur votre système.")
except Exception as e:
    print(f"\nUne erreur inattendue est survenue : {e}")

Si je relance ce script sur la même vidéo j’ai maintenant une sortie différente qui m’indique que la sortie est bien forcée au format .mp4 :

Démarrage du téléchargement pour l'URL : https://www.youtube.com/watch?v=xvFZjo5PgG0
[youtube] Extracting URL: https://www.youtube.com/watch?v=xvFZjo5PgG0
[youtube] xvFZjo5PgG0: Downloading webpage
[youtube] xvFZjo5PgG0: Downloading tv client config
[youtube] xvFZjo5PgG0: Downloading tv player API JSON
[youtube] xvFZjo5PgG0: Downloading web safari player API JSON
[youtube] xvFZjo5PgG0: Downloading m3u8 information
[info] xvFZjo5PgG0: Downloading 1 format(s): 396+251
[download] Sleeping 4.00 seconds as required by the site...
[download] Destination: VideoZT.f396.mp4
[download] 100% of  133.09KiB in 00:00:00 at 1.06MiB/s
[download] Destination: VideoZT.f251.webm
[download] 100% of  122.84KiB in 00:00:00 at 1.08MiB/s
[Merger] Merging formats into "VideoZT.webm"
Deleting original file VideoZT.f396.mp4 (pass -k to keep)
Deleting original file VideoZT.f251.webm (pass -k to keep)
[VideoRemuxer] Remuxing video from webm to mp4; Destination: VideoZT.mp4
Deleting original file VideoZT.webm (pass -k to keep)
Téléchargement et conversion en MP4 terminés avec succès !

Voilà, vous savez maintenant comment télécharger des vidéos YouTube en toute autonomie à l’aide de Python, sans avoir besoin de recourir à un service tiers. Cela fait des années que je l’utilise et je n’ai jamais eu de problème, je remercie vraiment l’équipe de volontaire en charge du logiciel yt-dlp pour son formidable travail.

Je me permets ce petit ajout, si vous rencontrez ce genre d’erreur :

WARNING: [youtube] IxX_QHay02M: Signature extraction failed: Some formats may be missing
         player = https://www.youtube.com/s/player/3dfa10c2/player_ias.vflset/en_US/base.js
         Please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
WARNING: [youtube] IxX_QHay02M: Some web client https formats have been skipped as they are missing a url. YouTube is forcing SABR streaming for this client. See  https://github.com/yt-dlp/yt-dlp/issues/12482  for more details
WARNING: Only images are available for download. use --list-formats to see them
ERROR: [youtube] IxX_QHay02M: Requested format is not available. Use --list-formats for a list of available formats
Une erreur est survenue : ERROR: [youtube] IxX_QHay02M: Requested format is not available. Use --list-formats for a list of available formats

Je vous conseille fortement de mettre à jour yt-dlp ce qui devrait résoudre dans la majorité des cas votre problème. Dans notre stack Python, la simple commande suivante sera suffisante :

pip install --upgrade yt-dlp

Laisser un commentaire