Comment j'ai fait capituler YouTube face à mon instance PeerTube

Ou comment une simple importation de vidéo s'est transformée en partie d'échecs avec Google


Le problème : “Sign in to confirm you're not a bot”

Tout a commencé par une erreur banale. Mon instance PeerTube, hébergée sur video.ut0pia.org, refusait obstinément d'importer des vidéos YouTube. Dans les logs, un message laconique :

Sign in to confirm you're not a bot

YouTube, dans sa croisade contre le scraping, bloque désormais systématiquement les requêtes provenant de serveurs. Peu importe que PeerTube utilise yt-dlp, l'excellent outil open-source de téléchargement — sans authentification, c'est un mur.

Première idée : les cookies

La solution classique avec yt-dlp est d'utiliser des cookies d'une session YouTube authentifiée. Simple en théorie :

  1. Exporter les cookies depuis le navigateur
  2. Les donner à yt-dlp via --cookies fichier.txt
  3. Profit

J'exporte donc mes cookies YouTube au format Netscape (le format standard pour yt-dlp) et je les place dans /data/peertube/config/youtube-cookies.txt.

Le piège du wrapper Python

PeerTube n'appelle pas yt-dlp directement. Il l'exécute via Python :

/usr/bin/python3 /data/bin/yt-dlp [arguments...]

Ma première idée “brillante” : créer un wrapper bash qui injecte automatiquement l'option --cookies. Je remplace le binaire yt-dlp par un script :

#!/bin/bash
exec /data/bin/yt-dlp.real --cookies /config/youtube-cookies.txt "$@"

Résultat ? Une magnifique erreur Python :

SyntaxError: invalid syntax

Évidemment. Python essaie d'interpréter mon script bash comme du code Python. Retour à la case départ.

La solution native : le fichier de config yt-dlp

yt-dlp supporte nativement un fichier de configuration dans ~/.config/yt-dlp/config. Chaque ligne est un argument. Je crée donc :

--cookies /config/youtube-cookies.txt

Je place ce fichier dans /root/.config/yt-dlp/config, je relance l'import... et ça échoue toujours.

YouTube contre-attaque : l'invalidation des cookies

Les logs montrent maintenant une erreur différente. YouTube a détecté que les cookies, exportés depuis mon PC, sont soudainement utilisés depuis un serveur avec une IP différente.

Résultat : cookies invalidés. Session terminée. Retour au message “Sign in to confirm you're not a bot”.

La danse des cookies

S'ensuit une série de tentatives :

  1. Export classique → Cookies invalidés après quelques minutes
  2. Nouvel export → Même résultat
  3. Export sans naviguer sur YouTube après → Toujours invalidé

YouTube est paranoïaque. Dès que les cookies sont utilisés depuis une nouvelle IP, il les révoque. Et le simple fait de continuer à naviguer sur YouTube après l'export semble accélérer le processus.

La méthode qui fonctionne (enfin !)

Après plusieurs échecs, je découvre la procédure recommandée par les développeurs de yt-dlp :

  1. Ouvrir une fenêtre de navigation privée (incognito)
  2. Se connecter à YouTube
  3. Aller directement sur https://www.youtube.com/robots.txt — une page statique qui ne déclenche pas de tracking
  4. Exporter immédiatement les cookies avec une extension dédiée
  5. Fermer la fenêtre sans naviguer ailleurs

L'idée est de créer une session “propre” qui n'a jamais vraiment été utilisée. YouTube ne peut pas détecter de comportement suspect puisqu'il n'y a eu aucune activité.

Je suis la procédure à la lettre. J'injecte les nouveaux cookies. Je lance l'import.

Notifying user root its video import https://www.youtube.com/watch?v=xxx is finished.
Creating transcription job for video...

Victoire.

Rendre la configuration persistante

Le problème avec Docker, c'est que tout ce qui est dans le conteneur disparaît au redémarrage. Il faut monter les fichiers de configuration depuis l'hôte.

Dans services/peertube.yml, j'ajoute les volumes :

volumes:
  - /data/peertube/yt-dlp-config-peertube:/home/peertube/.config/yt-dlp:ro
  - /data/peertube/config:/config

Le fichier de config yt-dlp pointe vers les cookies :

--cookies /config/youtube-cookies.txt

Et les cookies sont dans /data/peertube/config/youtube-cookies.txt sur l'hôte.

Ainsi, même après un docker compose down && docker compose up -d, la configuration survit.

Leçons apprises

  1. Les cookies sont fragiles — YouTube les invalide dès qu'il détecte une anomalie
  2. La méthode incognito + robots.txt fonctionne — elle crée des cookies “vierges” moins susceptibles d'être invalidés
  3. Docker nécessite des montages explicites — ce qui n'est pas monté disparaît au redémarrage
  4. Lire les logs, encore et encore — chaque message d'erreur est un indice

Pour le futur

Les cookies finiront par expirer ou être invalidés. Quand ça arrivera, il suffira de :

  1. Refaire la procédure incognito + robots.txt
  2. Mettre à jour /data/peertube/config/youtube-cookies.txt
  3. Aucun redémarrage nécessaire — yt-dlp relit le fichier à chaque exécution

C'est le prix à payer pour héberger sa propre plateforme vidéo. Mais au moins, mes vidéos sont chez moi.

#tech