Télécharger une vidéo YouTube en Full HD en ligne de commande

logo_small_2x-vfl4_cFqn
On a parfois besoin de télécharger une vidéo sur YouTube. Il existe différents moyens pour cela.
Je vais vous présenter une méthode utilisant des outils en ligne de commande. Ces outils ont l’avantage de disposer de nombreuses options.

Formats audio et vidéo

Le format de la vidéo est évidemment un critère essentiel. On pourra par exemple choisir une résolution pour la vidéo, comme HD avec 720 lignes, Full HD (FHD) avec 1080 lignes, Ultra HD (UHD ou 4K) avec 2160 lignes, etc. Voir Résolutions et formats recommandés par YouTube pour les formats recommandés en entrée.
Pour l’extension du fichier avec YouTube on aura généralement le choix entre mp4, 3gp ou webm.
Plusieurs codecs vidéo sont proposés au téléchargement, comme VP9, VP8, AV1.
Pour le flux audio, il est également possible de choisir le codec utilisé, ainsi que le bitrate (débit).

Outil de téléchargement des flux audio et vidéo

Pour télécharger une vidéo YouTube, il existe un outil génial qui s’appelle youtube-dl, disponible pour Windows, Mac, Linux. Cet outil est écrit en Python, le projet est en open source et hébergé sur GitHub : https://github.com/rg3/youtube-dl.
Tout un tas d’options sont disponibles.
Tout d’abord, on va installer l’outil en suivant ces instructions.
Ensuite on va pouvoir télécharger une première vidéo. Pour commencer on va simplement utiliser les options par défaut, pour obtenir une vidéo contenant un flux audio. Cette vidéo devrait être au format HD 720p, avec une extension MP4.
Exemple :
$ youtube-dl https://www.youtube.com/watch?v=sXsr_7Una_A
[youtube] sXsr_7Una_A: Downloading webpage
[youtube] sXsr_7Una_A: Downloading video info webpage
[download] Destination: Les Indestructibles 2 - Bande-annonce officielle-sXsr_7Una_A.mp4
[download] 100% of 16.62MiB in 00:14
Notez que si vous êtes en entreprise, la plupart du temps un proxy va vous embêter. Pour cela l’option –proxy https://hote:port pourra vous être utile.
Si vous voulez obtenir la liste des formats disponibles, rajoutez l’option -F :
$ youtube-dl -F https://www.youtube.com/watch?v=sXsr_7Una_A
[youtube] sXsr_7Una_A: Downloading webpage
[youtube] sXsr_7Una_A: Downloading video info webpage
[info] Available formats for sXsr_7Una_A:
format code extension resolution note
249 webm audio only DASH audio 53k , opus @ 50k, 799.86KiB
250 webm audio only DASH audio 67k , opus @ 70k, 1.02MiB
171 webm audio only DASH audio 122k , vorbis@128k, 1.87MiB
140 m4a audio only DASH audio 128k , m4a_dash container, mp4a.40.2@128k, 2.09MiB
251 webm audio only DASH audio 136k , opus @160k, 2.00MiB
278 webm 256x144 144p 94k , webm container, vp9, 24fps, video only, 1.50MiB
160 mp4 256x144 144p 110k , avc1.4d400c, 24fps, video only, 1.19MiB
242 webm 426x240 240p 189k , vp9, 24fps, video only, 2.29MiB
133 mp4 426x240 240p 273k , avc1.4d4015, 24fps, video only, 2.71MiB
243 webm 640x360 360p 344k , vp9, 24fps, video only, 4.48MiB
134 mp4 640x360 360p 633k , avc1.4d401e, 24fps, video only, 5.84MiB
244 webm 854x480 480p 648k , vp9, 24fps, video only, 7.99MiB
135 mp4 854x480 480p 1160k , avc1.4d401e, 24fps, video only, 10.11MiB
247 webm 1280x720 720p 1344k , vp9, 24fps, video only, 12.96MiB
136 mp4 1280x720 720p 1885k , avc1.4d401f, 24fps, video only, 14.53MiB
248 webm 1920x1080 1080p 2262k , vp9, 24fps, video only, 22.18MiB
137 mp4 1920x1080 1080p 2801k , avc1.640028, 24fps, video only, 23.42MiB
17 3gp 176x144 small , mp4v.20.3, mp4a.40.2@ 24k, 1.36MiB
36 3gp 320x180 small , mp4v.20.3, mp4a.40.2, 3.72MiB
18 mp4 640x360 medium , avc1.42001E, mp4a.40.2@ 96k, 8.86MiB
43 webm 640x360 medium , vp8.0, vorbis@128k, 11.89MiB
22 mp4 1280x720 hd720 , avc1.64001F, mp4a.40.2@192k (best)
Ainsi on peut remarquer que la vidéo téléchargée précédemment est celle avec le code 22. Si l’on souhaite télécharger une vidéo en 1080p, on pourra utiliser le code 137 en rajoutant l’option -f 137 devant l’URL en ligne de commande. Seul problème, cette vidéo ne contient pas de flux audio comme indiqué (video only).

Donc si l’on souhaite aussi obtenir la piste audio, on pourra choisir le code 140, en procédant comme pour le flux vidéo, pour obtenir un fichier en extension M4A :

$ youtube-dl -f 140 https://www.youtube.com/watch?v=sXsr_7Una_A
[youtube] sXsr_7Una_A: Downloading webpage
[youtube] sXsr_7Una_A: Downloading video info webpage
[download] Destination: Les Indestructibles 2 - Bande-annonce officielle-sXsr_7Una_A.m4a
[download] 100% of 2.09MiB in 00:02
WARNING: sXsr_7Una_A: writing DASH m4a. Only some players support this container. Install ffmpeg or avconv to fix this automatically.

Il restera ensuite à assembler ces 2 fichiers (MP4 + M4A), pour n’en avoir qu’un seul.

Outil d’assemblage des flux audio et vidéo

Pour cela on va utiliser un outil : FFmpeg. En réalité il s’agit d’un ensemble d’outils, ayant pour but de traiter des contenus multimédia, comme des flux audio ou vidéo.
Le projet FFmpeg est open source, on peut le trouver sur GitHub.
La documentation fournie est abondante.
Pour assembler le flux vidéo 1080p, et le flux audio m4a, on va utiliser cette commande :
$ ffmpeg -i video_file.1080p.mp4 -i audio_file.m4a -acodec copy -vcodec copy output.mp4

On obtient donc un fichier output.mp4 en sortie, contenant les 2 flux.

Les fichiers de sous-titres

Maintenant on souhaiterait aussi récupérer les sous-titres de la vidéo, qu’ils soient générés automatiquement par YouTube ou non. Il existe une option pour cela.

On avait l’habitude des fichiers en extension SRT (SubRip). Cependant un nouveau format, adapté au web et HTML5, a vu le jour : WebVTT. C’est ce dernier format qui sera préféré par YouTube. Pour information, VLC 3.0 reconnaît ce format.

Pour télécharger un fichier vtt, on va utiliser la commande suivante :

$ youtube-dl --write-sub --skip-download https://www.youtube.com/watch?v=sXsr_7Una_A

L’option –skip-download permet de ne pas re-télécharger la vidéo.

L’option –list-subs permet de lister les sous-titres disponibles.

Et les pubs ?

Normalement il ne devrait pas y avoir de publicités dans les vidéos téléchargées, la publicité étant réservée aux vidéos en ligne.

Voir plus de détails sur https://www.youtube.com/yt/advertise/.

Métadonnées

Il peut être utile d’extraire les métadonnées d’une vidéo, ou de les rajouter lors du téléchargement.
Voir options : –write-info-json ou –add-metadata
Exemple :
$ youtube-dl --write-info-json https://www.youtube.com/watch?v=sXsr_7Una_A
...
[info] Writing video description metadata as JSON to: Les Indestructibles 2 - Bande-annonce officielle-sXsr_7Una_A.info.json

Personnaliser le nom de fichier en sortie

Il est possible d’utiliser des variables correspondant aux métadonnées (titre, date d’upload, format, résolution, extension, etc.), pour personnaliser le nom du fichier téléchargé. Voir la documentation : output template.

Références externes

Publicités

How to update Docker CLI client for Windows

Sometimes you need to update your Docker Client for Windows, which was installed with Docker Toolbox. But you can’t find an easy way to do that (see this thread for example).

Docker Toolbox is the legacy way to use Docker on Windows, using VirtualBox, but it’s still useful when :

Upgrading the Docker Engine (server side) is easy with docker-machine. Just use :

docker-machine upgrade <machine_name>

and it will try to download the latest release (boot2docker.iso, working on VirtualBox) on https://github.com/boot2docker/boot2docker/releases/latest .

To update Docker Client, you could reinstall Docker Toolbox, but it’s quite cumbersome. In fact you can rebuild docker.exe from sources. After Docker Toolbox installation, this file can normally be found in « C:\Program Files\Docker Toolbox\docker.exe« .

How to build an exe for Windows

I found in Docker Toolbox sources how docker.exe was built and embedded.
It’s partly in this line :

RUN cp /go/src/github.com/docker/cli/build/docker-windows-amd64 docker.exe

Then I found that the CLI tool is in this repo : https://github.com/docker/docker-ce, under components/cli . So we can follow the instructions to build it.

For example, if you want to build docker.exe for a given version, let’s say « 18.05.0-ce », you can follow this script :

Install the new exe

Then you can backup your old docker.exe in « C:\Program Files\Docker Toolbox\docker.exe » and replace it with the new one.

Test the new version

Check that the new version is working :

> docker --version
Docker version 18.05.0-ce, build

Docker : my container was OOMKilled

Intro

Un container Docker dispose de ressources limitées à sa création (cpu, mémoire…). Il se peut que le container crashe subitement s’il dispose de ressources insuffisantes. Dans le cas d’un manque de mémoire, on aura donc une erreur du type OOMKilled.

Vérification de l’état du container

Toutes les informations sur l’état du container :

docker inspect --format="{{json .State}}" $INSTANCE_ID

Retourne par exemple :

{"Status":"running","Running":true,"Paused":false,"Restarting":false,
"OOMKilled":false,"Dead":false,"Pid":2862,"ExitCode":0,"Error":"",
"StartedAt":"2018-06-13T13:41:47.205270058Z","FinishedAt":"2018-06-13T13:39:41.797869481Z"}

Flag OOMKilled :

docker inspect --format='{{.State.OOMKilled}}' $INSTANCE_ID

Retourne true si OOM

Flag ExitCode :

docker inspect --format='{{.State.ExitCode}}' $INSTANCE_ID

Retourne 137 en cas de crash dû à OOM.
137 = (128+9) Container received a SIGKILL

Tracer le problème dans une JVM

Au sein d’une JVM, on peut essayer de tracer l’erreur.

Voir par exemple les paramètres :

java -XX:+PrintFlagsFinal -version | grep -i outofmemoryerror

bool CrashOnOutOfMemoryError = false {product}
bool ExitOnOutOfMemoryError = false {product}
bool HeapDumpOnOutOfMemoryError = false {manageable}
ccstrlist OnOutOfMemoryError = {product}

Une version de JVM container-friendly

Des paramètres ont été rajoutés dans les versions récentes de la JVM, pour essayer d’adapter les paramètres mémoire de la JVM (Xms, Xmx) avec ceux du container dans lequel elle s’exécute.

A partir de JDK 8u131+ et JDK 9 on trouve donc de nouveaux paramètres, notamment pour la mémoire :

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap

Tickets concernés

Références

Configure Git to use with a proxy and switching back

git-logo-2color

Sometimes it can be useful and even necessary to configure Git to use a proxy in the global configuration.
It’s a easy as (https://git-scm.com/docs/git-config#git-config-httpproxy) :
git config --global http.proxy host:port

This configuration will then be written in ~/.gitconfig.

You will then have something like that :

[user]
	name = Me
	email = me@company.com
[http]
	proxy = host:port

Then one day you want to switch and use a different proxy, or none.

But it’s not obvious to configure, regarding the official documentation (https://git-scm.com/docs/git-config).

I could simply unset the proxy if I want to use none, like this :
git config --global --unset http.proxy

I also tried to create aliases to switch to another configuration, like :

  1. git config --global alias.proxy-local 'config --local http.proxy host:port'
  2. git config --global alias.noproxy-local 'config --local http.proxy none'

So I can use ‘git proxy-local’ or ‘git noproxy-local’ depending of the project.

But it could be more practical. By searching further I found a way to configure the proxy depending on the URL. Within the configuration we can use this format to configure options : http.<url>.* (https://git-scm.com/docs/git-config#git-config-httplturlgt).
Some examples are also documented like this :

; HTTP
[http]
	sslVerify
[http "https://weak.example.com"]
	sslVerify = false
	cookieFile = /tmp/cookie.txt

So that way you can configure a proxy by default, and for some URL use another proxy or none :

; Use a proxy by default
[http]
	proxy = host:port
; Use no proxy on internal server
[http "http://myserver.mycompany/"]
	proxy = 

That’s it !

Generating a link to your issue tracker with IntelliJ

Sometimes it’s a good practice to post a commit message to your VCS (version control system), including a pattern with the issue number.

For example, you could commit changes towards Git or Subversion, with this commit message : « I fixed this nasty bug : #123 ».

And it could be nice to automatically generate a link to your issue tracker directly inside your favorite Java IDE.

Here’s how to do with IntelliJ IDEA :

  • Go to File > Settings > Version Control > Issue Navigation
  • Then add an item : here you have to fill in the issue ID (regex), and the issue link that will be generated (regex with replacement of the capturing group)

The dialog box you’ll get looks like this :

add-issue-nav-link

If you want to capture just a part of the regex, you can use the capturing groups.
Let’s say the pattern you use is « #issue-number », but you want to exclude the « # » from the URL generated. So in this case you will use a regex with one non-capturing group, and a capturing group.
So the issue ID regex will be : (?:#)([0-9]+)
And the issue link will be : http://my-issue-tracker/$1

That way, you’ll be able so see a clickable link in the Version Control window (ALT+9).

See also :

JMX MBean provided with Oracle JDBC Driver

I discovered that Oracle added a JMX MBean in Oracle JDBC Driver.
It’s called « Diagnosability Management ».

Doc for version 11g :
https://docs.oracle.com/cd/B28359_01/java.111/b31224/diagnose.htm#CIAIEEFF

Resume :

The JDBC diagnosability management feature introduces an MBean, oracle.jdbc.driver.OracleDiagnosabilityMBean. This MBean provides means to enable and disable JDBC logging.

Description of the MBean :

  • Name :
    • Domain : com.oracle.jdbc
    • Name : org.jboss.classloader.spi.base.BaseClassLoader
    • Type : diagnosability
  • Attribute Name : LoggingEnabled (boolean)