~ / Blog / Télécharger des vidéos YouTube en Python

Astuce : télécharger des vidéos YouTube en Python (avec yt-dlp)

En ce moment je bosse sur Hyperclip, un petit SaaS pour les YouTubeurs qui veulent produire des clips de leurs vidéos YouTube. L'idée est simple : tu colles l'URL de ta vidéo, tu choisis les moments forts, et hop, tu récupères des clips prêts à poster sur TikTok, Instagram Reels ou YouTube Shorts.

La première brique du projet, c'est de télécharger la vidéo source. Et pour ça, il y a yt-dlp, un fork de youtube-dl qui est activement maintenu. Le truc cool, c'est qu'il a un binding Python natif. Pas besoin de subprocess, pas de shell. Tout se fait en quelques lignes.

Setup du projet

J'utilise uv pour gérer mes projets Python. C'est rapide, c'est propre, je recommande.

uv init hyperclip
cd hyperclip
uv add yt-dlp

C'est tout. Le pyproject.toml généré ressemble à ça :

[project]
name = "hyperclip"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "yt-dlp>=2026.3.13",
]

Le script

20 lignes, pas une de plus :

import sys

import yt_dlp


def download_video(url: str, output_dir: str = ".") -> None:
    """Download a YouTube video from the given URL."""
    opts = {
        "outtmpl": f"{output_dir}/%(title)s.%(ext)s",
        "format": "bestvideo+bestaudio/best",
        "merge_output_format": "mp4",
    }
    with yt_dlp.YoutubeDL(opts) as ydl:
        ydl.download([url])


def main():
    if len(sys.argv) < 2:
        print("Usage: uv run main.py ")
        sys.exit(1)
    download_video(sys.argv[1])


if __name__ == "__main__":
    main()

Ce qui se passe

Utilisation

uv run main.py https://www.youtube.com/watch?v=dQw4w9WgXcQ

Et voilà, la vidéo se télécharge dans le dossier courant. Pas besoin d'activer un venv, uv run gère tout.

La suite pour Hyperclip

C'est la première étape. L'idée maintenant c'est d'enchaîner avec la détection des moments forts (transcription + analyse), puis le découpage automatique des clips. Stay tuned ;)