Youtubeの動画をダウンロードしてmp3に変換するシェルスクリプトを作った
今まで、mpsyt(https://github.com/mps-youtube/mps-youtube)で、Youtubeのプレイリストを再生してました。
しかし、Debianではうまく動かないため、mpsytをやめて別のCLIクライアントを探すことにしました。
更新
2019-01-02
-
やはり「Youtubeのプレイリストをまとめてダウンロードしたい」と思い、youtube-dlを使ってプレイリストを一括ダウンロードしたというブログを書きました。
-
この記事では
ytdl
を使っていますが、上の記事ではyoutube-dl
を使いました。どちらとも使いましたが、youtube-dl
の方が良いと思います。 -
シェルスクリプトについても、
youtube-dl
を使ったシェルスクリプトのほうがシンプルなため、この記事のシェルスクリプトは、見なくて良いと思います。
cmus
色々と探しましたが、良さそうなCLIクライントがなかったので、mp3をローカルで管理することにしました。
ということで、cmus(https://cmus.github.io/)を使うことにしました。
評判通り、快適ですね。
Youtubeの動画をダウンロード
YoutubeからダウンロードするCLIツールをググると、youtube-dl(https://rg3.github.io/youtube-dl/)が出てきますが、Go製のCLIツールを探すことにしました。
ytdl(https://github.com/rylio/ytdl)というCLIツールを見つけました。
パッケージとしも使えるし、使う前から、良いはずと。
rylio/ytdl
こんな感じでダウンロードできる。
1(cmd) ~ $ ytdl https://www.youtube.com/watch?v=3OnnDqH6Wj8
2INFO[0000] Fetching video info...
3INFO[0000] Downloading to Flo Rida - Good Feeling [Official Video].mp4
4 22.38 MiB / 22.38 MiB [======================================================================================================================================================================] 100.00% 9.98 MiB/s 2s
-o
オプションで指定できる。
1(cmd) ~ $ ytdl -o /var/tmp/{{.Title}}.{{.Ext}} https://www.youtube.com/watch?v=3OnnDqH6Wj8
2INFO[0000] Fetching video info...
3INFO[0000] Downloading to /var/tmp/Flo Rida - Good Feeling [Official Video].mp4
4 22.38 MiB / 22.38 MiB [======================================================================================================================================================================] 100.00% 9.08 MiB/s 2s
-j
オプションでjsonを取得できる。jq(jqはインストールしてね)
でtitleを取得できる。
1(cmd) ~ $ ytdl -j https://www.youtube.com/watch?v=3OnnDqH6Wj8 | jq ".title"
2"Flo Rida - Good Feeling [Official Video]"
シェルスクリプト作った
必須コマンド
各自インストールしてください。
- rylio/ytdl
- jq
- ffmpeg
コード
ファイル名は何でもよいです。(私はytdl2mp3.sh
というファイルにしました。)
パスの通っているフォルダに保存してchmod
してください。
1#!/usr/bin/env bash
2set -Ceuo pipefail
3
4# export
5export LC_ALL=C
6export LANG=C
7
8# set youtube id from param
9YOUTUBEID=$(echo $1 | awk -F "v=" '{print $2}' | awk -F "&" '{print $1}')
10
11if [ x$YOUTUBEID = "x" ]; then
12 echo "youtube id(v=ABCD) not found."
13 exit 1
14fi
15
16# set url
17URL="https://www.youtube.com/watch?v=$YOUTUBEID"
18
19# set music dir
20MUSICDIR="$HOME/Music/cmus"
21
22# mkdir music dir
23if [ ! -d $MUSICDIR ]; then
24 mkdir -p $MUSICDIR
25fi
26
27# get ytdl json
28YTDLJSON=$(ytdl -j $URL)
29
30# get author from json
31YTDLAUTHOR=$(echo $YTDLJSON | jq ".author" | sed "s/\"//g")
32
33# get title from json
34YTDLTITLE=$(echo $YTDLJSON | jq ".title" | sed "s/\"//g")
35
36# set file path
37FILEMP4="$MUSICDIR/$YTDLAUTHOR/$YTDLTITLE.mp4"
38FILEMP3="$MUSICDIR/$YTDLAUTHOR/$YTDLTITLE.mp3"
39
40# mkdir author dir
41if [ ! -d "$MUSICDIR/$YTDLAUTHOR" ]; then
42 mkdir -p "$MUSICDIR/$YTDLAUTHOR"
43fi
44
45# check file exist
46if [ -f "$FILEMP3" ]; then
47 echo "File '$FILEMP3' already exists."
48 exit 1
49fi
50
51# download mp4 file
52ytdl --silent -o "$FILEMP4" $URL
53
54# convert mp4 2 mp3
55ffmpeg -loglevel panic -i "$FILEMP4" -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 "$FILEMP3"
56
57#rm $FILEMP4
58if [ -f "$FILEMP4" ]; then
59 rm -f "$FILEMP4"
60fi
61
62# done
63echo "Downloaded to '$FILEMP3'"
使ってみた
こんな感じになります。
URLをコピって、以下のように実行すればうまいこといくはずです。
1(ins) ~ $ ytdl2mp3.sh "https://www.youtube.com/watch?v=2vjPBrBU-TM&list=ALL0WmM0pDa_8oUWlErcd1KHhp1UoWe0q2&index=115"
2Downloaded to '/home/teruhiro/Music/cmus/SiaVEVO/Sia - Chandelier (Official Music Video).mp3'
1(ins) ~/Music/cmus $ tree
2.
3├── AdeleVEVO
4│ ├── Adele - Chasing Pavements.mp3
5│ ├── Adele - Hello.mp3
6│ ├── Adele - Rolling in the Deep.mp3
7│ ├── Adele - Send My Love (To Your New Lover).mp3
8│ ├── Adele - Someone Like You.mp3
9│ └── Adele - When We Were Young (Live at The Church Studios).mp3
10├── BeyoncéVEVO
11│ └── Beyoncé - Halo.mp3
12├── Ed Sheeran
13│ └── Ed Sheeran - Perfect (Official Music Video).mp3
14├── Galantis
15│ ├── Galantis - Don't Care (Official Audio).mp3
16│ ├── Galantis & Hook N Sling - Love On Me (Official Video).mp3
17│ ├── Galantis - Spaceship feat. Uffie (Official Music Video).mp3
18│ └── Galantis & Throttle - Tell Me You Love Me (Official Music Video).mp3
19├── KygoOfficialVEVO
20│ ├── Kygo - Firestone ft. Conrad Sewell (Official Video).mp3
21│ └── Kygo & Justin Jesso - Stargazing (Official Video).mp3
22└── LadyGagaVEVO
23 └── Lady Gaga, Bradley Cooper - Shallow (A Star Is Born).mp3
24
256 directories, 15 files
あとがき
これでcmusで再生できるようになりました。