先日、Youtubeの動画をダウンロードしてmp3に変換するシェルスクリプトを作ったという記事を書きました。

しかし、プレイリストを一括でダウンロードしたいと思い、youtube-dlを使って一括ダウンロードを試みましたのでメモ。

youtube-dl

まずはyoutube-dl(https://rg3.github.io/youtube-dl/)を使えるようにします。

詳細はREADME.mdをみてください。

シェルスクリプト1

シンプルに1曲のみダウンロードするためのシェルスクリプトを作りました。

ファイル名はお任せ。

youtube-dl.shなど

chmodも忘れずに。

Gistからダウンロード

(cmd) /var/tmp $ curl -o youtube-dl.sh "https://gist.githubusercontent.com/teruhirokomaki/8f0333c35cb8aa1ba8692a25a8a04336/raw/6d53ea298f6c2e5dde2f5de1949f76747ec48fa3/youtube-dl.sh"

補足

最初はv=YOUTUBEIDYOUTUBEIDを引数として使っていましたが、一括ダウンロードの途中で、エラーになってしまいました。

URLを確認するとhttps://www.youtube.com/watch?v=-FyjEnoIgTMとなっており、引数が-FyjEnoIgTMとなることが原因でした。

ということで、URLを引数にするように修正しました。

#!/usr/bin/env bash
set -Ceuo pipefail

# set youtube id from param
YOUTUBEID="$1"

if [ x$YOUTUBEID = "x" ]; then
  echo "Youtube id is required."
  exit 1
fi

# set url
YDLURL="https://www.youtube.com/watch?v=$YOUTUBEID"

# set music dir
MUSICDIR="$HOME/Music/cmus"

# mkdir music dir
if [ ! -d $MUSICDIR ]; then
  mkdir -p $MUSICDIR
fi

# get filename
YDLGETFILENAME=$(youtube-dl --get-filename --restrict-filenames -o '%(creator)s/%(title)s.%(ext)s' "$YDLURL")

# creator from filename
YDLCREATOR=$(echo $YDLGETFILENAME | awk -F "/" '{print $1}')

# title and ext from filename
YDLTITLEEXT=$(echo $YDLGETFILENAME | awk -F "/" '{print $2}')

# mkdir author dir
if [ ! -d "$MUSICDIR/$YDLCREATOR" ]; then
  mkdir -p "$MUSICDIR/$YDLCREATOR"
fi

# file pah
YDLFILE="$MUSICDIR/$YDLCREATOR/$YDLTITLEEXT"

# check file exist
if [ -f "$YDLFILE" ]; then
  echo "File '$YDLFILE' already exists ($YOUTUBEID)."
else
  # download audio
  youtube-dl --ignore-errors --format bestaudio -o "$YDLFILE" "$YDLURL"

  # done
  echo "Downloaded to '$YDLFILE' ($YOUTUBEID)."
fi

使ってみる

(ins) /var/tmp $ youtube-dl.sh QJO3ROT-A4E
[youtube] QJO3ROT-A4E: Downloading webpage
[youtube] QJO3ROT-A4E: Downloading video info webpage
[download] Destination: /home/teruhiro/Music/cmus/One_Direction/One_Direction_-_What_Makes_You_Beautiful_Official_Video.mp4
[download] 100% of 3.12MiB in 00:00
Downloaded to '/home/teruhiro/Music/cmus/One_Direction/One_Direction_-_What_Makes_You_Beautiful_Official_Video.mp4'

プレイリストのidを取得する

youtube-dlの--get-idオプションで、プレイリストのidを取得できますので、テキストファイルに書き出します。

(ins) /var/tmp $ youtube-dl --get-id  https://www.youtube.com/playlist?list=PLL0WmM0pDa_8oUWlErcd1KHhp1UoWe0q2 >> ydlids.txt

シェルスクリプト2

先ほど作成したydlids.txtのidを1行づつ処理するためのシェルスクリプトを作成しました。

こちらもファイル名はお任せ。

youtube-dl_fromfile.shなど

Gistからダウンロード

(cmd) /var/tmp $ curl -o youtube-dl_fromfile.sh "https://gist.githubusercontent.com/teruhirokomaki/2506b0b6e5b345ec0daa6955f69b87ce/raw/571e5a2c8d346e16a14c5f13fd778612dda0c606/youtube-dl_fromfile.sh"
#!/usr/bin/env bash
set -Ceuo pipefail

FILEPATH=$1

CNT=0
cat $FILEPATH | while read LINE
do
  CNT=$(expr $CNT + 1)
  youtube-dl.sh $LINE
done

使ってみる

(ins) /var/tmp $ cat ydlids.txt
YqeW9_5kURI
UA8rcLvS1BY
CdXesX6mYUE
(ins) /var/tmp $ youtube-dl_fromfile.sh ydlids.txt
[youtube] YqeW9_5kURI: Downloading webpage
[youtube] YqeW9_5kURI: Downloading video info webpage
[download] Destination: /home/teruhiro/Music/cmus/Major_Lazer_feat._MO_DJ_Snake/Major_Lazer_DJ_Snake_-_Lean_On_feat._MO_Official_Music_Video.mp4
[download] 100% of 2.95MiB in 00:00
Downloaded to '/home/teruhiro/Music/cmus/Major_Lazer_feat._MO_DJ_Snake/Major_Lazer_DJ_Snake_-_Lean_On_feat._MO_Official_Music_Video.mp4'
[youtube] UA8rcLvS1BY: Downloading webpage
[youtube] UA8rcLvS1BY: Downloading video info webpage
[download] Destination: /home/teruhiro/Music/cmus/LMFAO/LMFAO_-_Champagne_Showers_ft._Natalia_Kills.mp4
[download] 100% of 5.86MiB in 00:00
Downloaded to '/home/teruhiro/Music/cmus/LMFAO/LMFAO_-_Champagne_Showers_ft._Natalia_Kills.mp4'
[youtube] CdXesX6mYUE: Downloading webpage
[youtube] CdXesX6mYUE: Downloading video info webpage
[download] Destination: /home/teruhiro/Music/cmus/Pitbull/Pitbull_-_International_Love_ft._Chris_Brown.mp4
[download] 100% of 3.76MiB in 00:00
Downloaded to '/home/teruhiro/Music/cmus/Pitbull/Pitbull_-_International_Love_ft._Chris_Brown.mp4'
(ins) /var/tmp $

あとがき

ytdlyoutube-dlを使いましたが、youtube-dlのほうがオススメです。

最初から素直にyoutube-dl使ったほうが良かったなと。