yt-dlpインストール・使用方法（Mac版）

## 【概要】
Youtubeの動画をダウンロードするためにyt-dlpを導入したので、自分が使用したオプションなども含めてメモとして残しておきます。
初めはyoutube-dlを使用しようと思っていましたが、調べてみると既に開発は終了して現在は改良版のyt-dlpがあるということで改めてインストールしました。
youtube-dlと使い勝手はあまり変わらず、ダウンロード速度が速いなど利点が結構あるようです。

### 対象環境
* MacBook Pro (M1, 2020）
* MacOS Monterey ver.12.6


## 【手順説明】

### 導入
基本的には下記GitHubのReadmeに書いてある説明の通りです。

https://github.com/yt-dlp/yt-dlp


yt-dlpのインストール方法は複数あるようですが、今回は[HomeBrew](https://brew.sh/index_ja)を使用してインストールします。
インストール後にバージョンが確認できれば成功です。
```
brew install yt-dlp
yt-dlp --version
```

単純に動画をダウンロードするだけであれば上記のみで良いですが、画質・音質を指定する場合などは動画処理が必要になるのでffmpegもインストールしておきましょう。
```
brew install ffmpeg
```
これで導入は完了です。

### 使用方法
基本的には下記のみでダウンロードは可能です。
ただしこのままだとファイル形式がwebmだったりタイトルに動画IDが含まれたりするので、望む形でダウンロードするにはオプション指定が必要です。

```
yt-dlp [動画URL]
```

#### オプション

* `--list-extractors`：対応サイト一覧
* `-f (--format)`：ダウンロードする解像度などを指定（後述）
* `-F (--list-formats)`：ダウンロード可能な画質・音質などの種類を一覧で出力
* `--merge-output-format`：ダウンロードした動画と音声を結合するときのフォーマットを指定
* `-o (--output)`：アウトプットするファイル名を指定。タイトルやチャンネル名など組み合わせて指定可能
    * %(title)s：動画タイトル
    * %(channel)s：チャンネル名
    * %(ext)s：最適な拡張子
    [その他使えるフィールド名](https://github.com/yt-dlp/yt-dlp#output-template)

#### 使用例
オプションについて順に説明していくので、読むのが面倒であれば下記の内容を使用してください。
```
yt-dlp [動画URL] -o "~/%(channel)s/%(title)s.%(ext)s" -f bv+ba/b --merge-output-format mp4 
# チャンネルごとにディレクトリを作って動画を保存、画質・音声は最良、出力形式はmp4
```

##### オプション説明
試しにオプションを付けずに動画をダウンロードしてみます。
```
yt-dlp "https://www.youtube.com/watch?v=8bX5ASmVh4Q" 
```
この動画の場合、特に何も指定しない場合はwebm形式で出力されました。
`-F`を付けてダウンロード可能なファイル形式を見てみます。
```
yt-dlp "https://www.youtube.com/watch?v=8bX5ASmVh4Q" -F

[youtube] 8bX5ASmVh4Q: Downloading webpage
[youtube] 8bX5ASmVh4Q: Downloading android player API JSON
[info] Available formats for 8bX5ASmVh4Q:
ID  EXT   RESOLUTION FPS CH │   FILESIZE   TBR PROTO │ VCODEC          VBR ACODEC      ABR ASR MORE INFO
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb2 mhtml 48x27        2    │                  mhtml │ images                                  storyboard
sb1 mhtml 80x45        1    │                  mhtml │ images                                  storyboard
sb0 mhtml 160x90       1    │                  mhtml │ images                                  storyboard
599 m4a   audio only      2 │  227.05KiB   31k https │ audio only          mp4a.40.5   31k 22k ultralow, m4a_dash
600 webm  audio only      2 │  251.32KiB   34k https │ audio only          opus        34k 48k ultralow, webm_dash
139 m4a   audio only      2 │  359.17KiB   49k https │ audio only          mp4a.40.5   49k 22k low, m4a_dash
249 webm  audio only      2 │  368.65KiB   50k https │ audio only          opus        50k 48k low, webm_dash
250 webm  audio only      2 │  488.16KiB   67k https │ audio only          opus        67k 48k low, webm_dash
140 m4a   audio only      2 │  950.87KiB  130k https │ audio only          mp4a.40.2  130k 44k medium, m4a_dash
251 webm  audio only      2 │  967.14KiB  132k https │ audio only          opus       132k 48k medium, webm_dash
17  3gp   176x144      8  1 │  583.24KiB   79k https │ mp4v.20.3       79k mp4a.40.2    0k 22k 144p
597 mp4   256x144     15    │  242.88KiB   33k https │ avc1.4d400b     33k video only          144p, mp4_dash
598 webm  256x144     15    │  202.67KiB   28k https │ vp9             28k video only          144p, webm_dash
394 mp4   256x144     30    │  481.98KiB   66k https │ av01.0.00M.08   66k video only          144p, mp4_dash
160 mp4   256x144     30    │  476.95KiB   65k https │ avc1.4d400c     65k video only          144p, mp4_dash
278 webm  256x144     30    │  601.49KiB   82k https │ vp9             82k video only          144p, webm_dash
395 mp4   426x240     30    │  895.57KiB  122k https │ av01.0.00M.08  122k video only          240p, mp4_dash
133 mp4   426x240     30    │  769.59KiB  105k https │ avc1.4d4015    105k video only          240p, mp4_dash
242 webm  426x240     30    │    1.03MiB  144k https │ vp9            144k video only          240p, webm_dash
396 mp4   640x360     30    │    1.71MiB  238k https │ av01.0.01M.08  238k video only          360p, mp4_dash
134 mp4   640x360     30    │    1.38MiB  192k https │ avc1.4d401e    192k video only          360p, mp4_dash
18  mp4   640x360     30  2 │ ~  2.35MiB  321k https │ avc1.42001E    321k mp4a.40.2    0k 44k 360p
243 webm  640x360     30    │    1.75MiB  244k https │ vp9            244k video only          360p, webm_dash
397 mp4   854x480     30    │    2.95MiB  411k https │ av01.0.04M.08  411k video only          480p, mp4_dash
135 mp4   854x480     30    │    1.90MiB  266k https │ avc1.4d401f    266k video only          480p, mp4_dash
244 webm  854x480     30    │    2.53MiB  353k https │ vp9            353k video only          480p, webm_dash
22  mp4   1280x720    30  2 │ ~ 11.07MiB 1511k https │ avc1.64001F   1511k mp4a.40.2    0k 44k 720p
398 mp4   1280x720    30    │    5.68MiB  793k https │ av01.0.05M.08  793k video only          720p, mp4_dash
136 mp4   1280x720    30    │    3.17MiB  443k https │ avc1.4d401f    443k video only          720p, mp4_dash
247 webm  1280x720    30    │    4.19MiB  585k https │ vp9            585k video only          720p, webm_dash
399 mp4   1920x1080   30    │   10.16MiB 1419k https │ av01.0.08M.08 1419k video only          1080p, mp4_dash
137 mp4   1920x1080   30    │   10.72MiB 1498k https │ avc1.640028   1498k video only          1080p, mp4_dash
248 webm  1920x1080   30    │   10.87MiB 1519k https │ vp9           1519k video only          1080p, webm_dash
```
多数の形式で出力可能なことがわかります。
この中から最高画質・音質で出力する場合は`-f bestvideo+bestaudio/b`を付けます。
このオプションは「video onlyの最高画質とaudio onlyの最高音質をそれぞれダウンロード / video onlyが存在しなければ映像と音声両方を含む最高品質をダウンロード」となります。
ffmpegがインストールされていれば動画と音声をそれぞれダウンロードした後にマージしてくれます。

ちなみにこのオプションはデフォルトなのでこのままだと付ける必要はありませんが、形式指定をするときにこの形式を指定します。
再生端末によっては形式を指定しないとそのままでは見られなかったりします。
例えばID:137の映像とID:140の音声を指定する場合は下記のようになります。
```
yt-dlp "https://www.youtube.com/watch?v=8bX5ASmVh4Q" -f 137+140
```
実行すると映像と音声が別々でダウンロードされます。
これを一つの動画にするには`--merge-output-format mp4`で出力します。
```
yt-dlp "https://www.youtube.com/watch?v=8bX5ASmVh4Q" -f 137+140 --merge-output-format mp4 
```
これで希望する品質と形式で出力できました。

後はファイル形式を指定するオプションを付けます。
自由に指定して良いのでここでは`--output '~/%(channel)s/%(title)s.%(ext)s'`としてチャンネルごとに保存することにします。
```
yt-dlp "https://www.youtube.com/watch?v=8bX5ASmVh4Q" -f 137+140 --merge-output-format mp4 --output '~/%(channel)s/%(title)s.%(ext)s'
```
これでオプションの指定は完了です。
URLには再生リストやチャンネルURLも指定でき、その中に含まれる動画を一度にダウンロードすることも可能です。
その他にもオプションがかなりあるので利用方法に合わせて使ってみましょう。

### ログインが必要な場合
作成した非公開の再生リストを読み込ませる時など、URLのアクセスにログインが必要な場合があります。
その場合はサイトに一度アクセスをして、保存されたCookieを読み込ませます。

ブラウザで使用しているCookie情報を直接利用することができます。
例えばchromeを使用する場合は下記の通りで、他にもchromium、edge、firefox、opera、safariなどをサポートしています。
```
yt-dlp [動画URL] --cookies-from-browser chrome
```

また、ブラウザのCookieを直接使う以外にもファイルとして保存して読み込ませることもできます。
Chromeの場合はアドオンの[EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg)を使用することでCookieファイルをローカルに保存できます。
対象のサイトにログインした状態で【Cookieのエクスポート】でコピーされた内容を適当な名前を付けて保存してください。
使用するときは`--cookies`を付けてファイルの場所を指定します。
```
yt-dlp [動画URL] --cookies cookie.txt
```


### 参考サイト

https://github.com/yt-dlp/yt-dlp
https://zenn.dev/almon/articles/f5952bf9047608
https://masayoshi-9a7ee.hatenablog.com/entry/2021/11/06/112639