labunix's blog

labunixのラボUnix

youtube-dlを使ってみる。

■youtube-dlを使ってみる。

$ apt-get install -y youtube-dl

$ dpkg -l | awk '/^ii/&&/youtube-dl/{print $2,$3}'
youtube-dl 2017.05.18.1-1

■youtubeのURLを以下のように引数として与えると一覧が出て、
 フォーマットコードを使ってダウンロードできる。

$ youtube-dl -F https://www.youtube.com/watch?v=abcDEF123
[youtube] abcDEF123: Downloading webpage
[youtube] abcDEF123: Downloading video info webpage
[youtube] abcDEF123: Extracting video information
WARNING: unable to extract uploader nickname
[info] Available formats for abcDEF123:
format code  extension  resolution note
249          webm       audio only DASH audio   59k , opus @ 50k, 16.95MiB
250          webm       audio only DASH audio   79k , opus @ 70k, 20.54MiB
140          m4a        audio only DASH audio  130k , m4a_dash container, mp4a.40.2@128k, 51.25MiB
251          webm       audio only DASH audio  138k , opus @160k, 38.76MiB
171          webm       audio only DASH audio  141k , vorbis@128k, 35.37MiB
160          mp4        256x144    144p  113k , avc1.4d400c, 30fps, video only, 20.13MiB
278          webm       256x144    144p  131k , webm container, vp9, 30fps, video only, 36.29MiB
242          webm       426x240    240p  259k , vp9, 30fps, video only, 51.64MiB
133          mp4        426x240    240p  285k , avc1.4d4015, 30fps, video only, 53.62MiB
243          webm       640x360    360p  488k , vp9, 30fps, video only, 94.85MiB
134          mp4        640x360    360p  634k , avc1.4d401e, 30fps, video only, 82.10MiB
17           3gp        176x144    small , mp4v.20.3, mp4a.40.2@ 24k
36           3gp        320x180    small , mp4v.20.3, mp4a.40.2
43           webm       640x360    medium , vp8.0, vorbis@128k
18           mp4        640x360    medium , avc1.42001E, mp4a.40.2@ 96k (best)

$ youtube-dl -f 18 https://www.youtube.com/watch?v=abcDEF123
WARNING: unable to extract uploader nickname
[download] Destination: Dummy Youtube-abcDEF123.mp4
[download] 100% of 185.74MiB in 00:50

■毎回(と言ってもそんなに使わないが)「format code」を入れるのは面倒。
 常に一番下が最高画質のため、ダウンロードのためのワンライナーを書いてみる。

 2列目が「mp4」だったら1列目の文字列を「160」「133」「134」「18」の順に上書きで入れていく。
 最後の「18」を指定してダウンロードされるようにコマンドを出力して「sh」に動作渡す。
 「(best)」も入れたり、引数のチェックをした方が確実かも知れないがそこまで深入りはしないでおく。

$ cat myscripts/you2be.sh 
#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usege $0 [youtube-url]"
  exit 1
fi
Y2B_URL="$1"

youtube-dl -F "${Y2B_URL}" | \
  awk -v u="${Y2B_URL}" '{if($2=="mp4"){mp4=$1}}END{print "youtube-dl -f "mp4" \042"u"\042"}' | sh

■例えば以下のように使う。

$ ./myscripts/you2be.sh 
Usege ./myscripts/you2be.sh [youtube-url]

■「youtube-url」を指定してダウンロードする条件の例

 「Dummy Youtube」というタイトル
 「abcDEF123」のURL動画

$ ./myscripts/you2be.sh https://www.youtube.com/watch?v=abcDEF123
WARNING: unable to extract uploader nickname
[youtube] abcDEF123: Downloading webpage
[youtube] abcDEF123: Downloading video info webpage
[youtube] abcDEF123: Extracting video information
WARNING: unable to extract uploader nickname
[download] Destination: Dummy Youtube-abcDEF123.mp4
[download] 100% of 185.74MiB in 00:50

$ file Dummy\ Youtube-abcDEF123.mp4 
Dummy Youtube-abcDEF123.mp4: ISO Media, MP4 v2 [ISO 14496-14]

■ffmpegがあればダウンロードしたファイルが、
 以下のように「640x360」、「96kbps」であることが確認出来る。

$ apt-file search bin/ffprobe | grep be$
ffmpeg: /usr/bin/ffprobe

$ ffprobe -hide_banner Dummy\ Youtube-abcDEF123.mp4 2>&1 | awk '/Stream/{gsub(",","\n\t",$0);print $0}'
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661)
	 yuv420p
	 640x360 [SAR 1:1 DAR 16:9]
	 301 kb/s
	 29.93 fps
	 29.93 tbr
	 14967 tbn
	 59.87 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D)
	 44100 Hz
	 stereo
	 fltp
	 96 kb/s (default)