Dans mon usage de YouTube, et des autres plateformes de vidéo, j’aime bien regarder les vidéos hors de mon navigateur. Principalement car je préfère utiliser mon lecteur de vidéos pour cela, mais également car ça me protège de l’encouragement à la consommation que YouTube (et autres) fait avec les suggestions sur le côté.

Pour faire cela, il est nécessaire de télécharger la vidéo1 et de la jouer ensuite avec notre lecteur multimédia préféré.

# Youtube-dl

Il existe un super outil pour télécharger les vidéos d’un peu partout, youtube-dl. Je parlerai dans cet article en permanence de YouTube, mais je vous laisse tester l’outil un peu partout, la liste des sites compatibles est longue comme le bras.

Grâce à cet outil, une simple commande du style youtube-dl https://www.youtube.com/watch?v=C_UTlTiVQ_0 permet de télécharger la superbe vidéo de Rodolphe Meyer (Le Réveilleur) sur le dernier rapport du GIEC. C’est super utile pour archiver du contenu ou pour économiser des ressources si c’est une vidéo qu’on a prévu de revisionner plus tard.

Avec l’option -F, on peut savoir quelles sont les définitions2 possibles. Sans s’éterniser sur tous les formats proposés ici, on voit différentes vidéos aux formats 1080p3 ou 720p3, et d’autres options de plus faible définition. On peut par exemple utiliser une vidéo de faible définition si c’est une conférence dont le contenu visuel est peu important. On y voit également des formats audio, les formats vidéos étant muets, il faudra télécharger les deux fichiers et les fusionner, c’est fait automatiquement par youtube-dl mais il est possible d’avoir plusieurs fichiers audio, dans le cas d’une traduction par exemple.

Exemple d'utilisation de l'option -F
$ youtube-dl -F https://www.youtube.com/watch?v=C_UTlTiVQ_0
[youtube] C_UTlTiVQ_0: Downloading webpage
[info] Available formats for C_UTlTiVQ_0:
format code  extension  resolution note
249   webm   audio only tiny   49k , webm_dash container, opus @ 49k (48000Hz), 18.18MiB
250   webm   audio only tiny   60k , webm_dash container, opus @ 60k (48000Hz), 22.28MiB
251   webm   audio only tiny  109k , webm_dash container, opus @109k (48000Hz), 40.59MiB
140   m4a    audio only tiny  129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 47.93MiB
160   mp4    256x144    144p   42k , mp4_dash container, avc1.4d400c@  42k, 30fps, video only, 15.86MiB
394   mp4    256x144    144p   59k , mp4_dash container, av01.0.00M.08@  59k, 30fps, video only, 21.84MiB
278   webm   256x144    144p   79k , webm_dash container, vp9@  79k, 30fps, video only, 29.34MiB
133   mp4    426x240    240p   74k , mp4_dash container, avc1.4d4015@  74k, 30fps, video only, 27.47MiB
242   webm   426x240    240p  107k , webm_dash container, vp9@ 107k, 30fps, video only, 39.88MiB
395   mp4    426x240    240p  109k , mp4_dash container, av01.0.00M.08@ 109k, 30fps, video only, 40.52MiB
134   mp4    640x360    360p  144k , mp4_dash container, avc1.4d401e@ 144k, 30fps, video only, 53.48MiB
243   webm   640x360    360p  184k , webm_dash container, vp9@ 184k, 30fps, video only, 68.33MiB
396   mp4    640x360    360p  205k , mp4_dash container, av01.0.01M.08@ 205k, 30fps, video only, 76.04MiB
135   mp4    854x480    480p  207k , mp4_dash container, avc1.4d401f@ 207k, 30fps, video only, 77.00MiB
244   webm   854x480    480p  261k , webm_dash container, vp9@ 261k, 30fps, video only, 96.89MiB
397   mp4    854x480    480p  347k , mp4_dash container, av01.0.04M.08@ 347k, 30fps, video only, 128.61MiB
298   mp4    1280x720   720p60  350k , mp4_dash container, avc1.4d4020@ 350k, 60fps, video only, 129.75MiB
302   webm   1280x720   720p60  558k , webm_dash container, vp9@ 558k, 60fps, video only, 206.84MiB
136   mp4    1280x720   720p  617k , mp4_dash container, avc1.4d401f@ 617k, 30fps, video only, 228.78MiB
247   webm   1280x720   720p  723k , webm_dash container, vp9@ 723k, 30fps, video only, 267.66MiB
398   mp4    1280x720   720p60 1002k , mp4_dash container, av01.0.08M.08@1002k, 60fps, video only, 371.01MiB
299   mp4    1920x1080  1080p60 1244k , mp4_dash container, avc1.64002a@1244k, 60fps, video only, 460.56MiB
303   webm   1920x1080  1080p60 2013k , webm_dash container, vp9@2013k, 60fps, video only, 745.52MiB
399   mp4    1920x1080  1080p60 2082k , mp4_dash container, av01.0.09M.08@2082k, 60fps, video only, 770.91MiB
18    mp4    640x360    360p  395k , avc1.42001E, 30fps, mp4a.40.2 (44100Hz), 146.43MiB
22    mp4    1280x720   720p  746k , avc1.64001F, 30fps, mp4a.40.2 (44100Hz) (best)

Il est évidemment possible de spécifier le format dans lequel nous voulons regarder la vidéo en utilisant l’option -f suivie du format désiré. Avec l’exemple précédent, je peux obtenir le fichier vidéo 1080p sans audio grâce à la commande suivante:

$ youtube-dl -f 303 https://www.youtube.com/watch?v=C_UTlTiVQ_0

Si on désire avoir le son, soit il faut spécifier le format à utiliser, soit laisser choisir youtube-dl avec le paramètre bestaudio:

$ youtube-dl -f 303+bestaudio https://www.youtube.com/watch?v=C_UTlTiVQ_0

Je vous laisse regarder la documentation officielle pour avoir plus d’infos si cela vous intéresse.

# Le visionnage unique

Dans le cas d’un visionnage unique, c’est un peu lourd comme technique, il faut:

  1. télécharger la vidéo complète, ce qui prend du temps;
  2. l’ouvrir avec notre lecteur multimédia;
  3. supprimer la vidéo.

C’est donc le moment de vous présenter mon lecteur multimédia, très sobre mais ultra complet, mpv. Il est parfait comme lecteur de tous les jours et il permet de faire un peu plus. Par exemple, je peux lui passer l’adresse d’une vidéo et il appellera youtube-dl pour la télécharger pendant la lecture, comme lors du visionnage depuis le site de YouTube bien évidemment.

mpv https://www.youtube.com/watch?v=C_UTlTiVQ_0

# Paramétrer youtube-dl dans mpv

Il y a moyen de passer des paramètres à youtube-dl lors de l’utilisation de mpv. Pour cela, il faut utiliser l’option --ytdl-format, par exemple pour voir la même vidéo que précédemment:

mpv --ytdl-format=303+bestaudio https://www.youtube.com/watch?v=C_UTlTiVQ_0

# La problématique

YouTube n’a pas intérêt à ce que nous regardions son contenu en dehors de leur plateforme (ou leur application) et encore moins de nous laisser le télécharger. Du coup c’est une constante lute pour réussir à avoir un logiciel qui fonctionne.

Depuis peu, avec youtube-dl j’ai une vitesse de téléchargement très faible, de l’ordre de moins de 100 ko/s, ce qui ne permet pas de regarder des vidéos haute-définition. Youtube-dl semble faiblement maintenu ces derniers mois et ne propose donc pas de solution. Heureusement, le monde des logiciels libre est toujours plein de ressources. Lorsqu’un logiciel n’est plus vraiment maintenu il suffit de le copier (on dit “forker”, de l’anglais fork) et de le faire évoluer dans la direction qui nous intéresse. C’est ce qui s’est passé ici, d’abord avec yt-dlc, puis avec ma solution du moment: yt-dlp.

Globalement, yt-dlp est une amélioration de youtube-dl, qui fonctionne donc de manière très similaire. Par contre, mpv continue à utiliser youtube-dl, heureusement on peut lui préciser quel “youtube-dl” utiliser grâce au paramètre --script-opts=ytdl_hook-ytdl_path, avec donc l’usage suivant:

mpv --script-opts=ytdl_hook-ytdl_path=yt-dlp https://www.youtube.com/watch?v=C_UTlTiVQ_0

Et voilà, tout rentre dans l’ordre et je peux continuer à regarder mes vidéos hors de YouTube.

# Mes usages

J’aime bien pouvoir facilement regarder des vidéos en moyenne définition, à savoir 480p, pour éviter d’utiliser trop de bande passante lorsque cela n’est pas nécessaire. J’ai donc créé un alias qui appelle la commande suivante:

mpv --script-opts=ytdl_hook-ytdl_path=yt-dlp --ytdl-format=worstvideo[height\>=480]+bestaudio/480p/worst

Je demande donc la pire vidéo qui a un nombre de lignes supérieur ou égal à 480 avec le meilleur audio, s’il ne trouve rien il prend le format 480p qu’il trouve, et sinon le pire format.

J’ai également un moyen d’avoir uniquement l’audio, pour économiser au maximum ma consommation de données:

mpv --script-opts=ytdl_hook-ytdl_path=yt-dlp --no-video --force-window=yes

L’option --force-window est là pour avoir quand même la fenêtre avec les contrôles, sinon mpv tourne en arrière plan ce qui peut être dérangeant.

# Correction après quelques recherches

C’est toujours lors de la rédaction de ce genre d’articles que j’en apprends le plus. Du coup, avec yt-dlp il y a un super paramètre -S, ou --format-sort, qui permet de trier les formats en fonction de certains filtres. Du coup, j’ai modifié ma commande 480p pour une bien plus simple et qui fonctionne partout (J’avais de la peine à avoir une config qui fonctionnait sur PeerTube):

mpv --script-opts=ytdl_hook-ytdl_path=yt-dlp --ytdl-raw-options=format-sort=height:480

Vous pouvez jouer avec toutes ses options, je vous laisse la joie de découvrir ce qui est faisable.

Bons tests et bon visionnage.


  1. Alors qu’on ne me fasse pas dire ce que je n’ai pas dit, lorsqu’on regarde une vidéo dans notre navigateur préféré, elle est également téléchargée et sera supprimée ensuite pour libérer de l’espace sur votre disque. Quelle que soit la ressource, pour pouvoir en faire quelque chose notre ordinateur a besoin de la récupérer d’une manière ou d’une autre. ↩︎

  2. La définition d’une vidéo, ou d’une image, c’est le nombre de pixel qui la compose, représenté en nombre de colonnes et de lignes, comme 1920x1080, définition full HD qui contient donc 1920 colonnes chacune de 1080 pixels. ↩︎

  3. Le format 1080p correspond à 1920x1080, et son équivalent 720p au format 1280x720. ↩︎