自分が作成したYouTube Playlistsのデータを取得する手順

"youtube api playlist 取得"などでGoogle検索すると、指定したYouTube Playlistの動画情報を取得する方法(<font color=orange>プレイリストの中身はなにか</font> etc.)はいくつか見つかるのですが、自分のGoogleアカウントで作成したプレイリストの情報を取得する方法(<font color=orange>自分は一体プレイリストをいくつ作成してそれぞれ名前は何か</font> etc.)が調べた限りでは見つからなかったので、ここにやり方を書いておきます。

## 分かりずらい・面倒くさい
YouTubeのデータを取得するためには**YouTube Data API**を利用する必要があります。指定したプレイリストの動画情報を取得するだけであれば、API Keyを発行しそれを利用することで達成できます。しかし、自分が作成したプレイリスト情報にアクセスするためには、API Keyは使えず、OAuthによる認証が必要です。OAuth認証を利用する場合はAPI Keyは要りません。
これを踏まえて、手順は以下です:

- [Google Cloud console](https://console.cloud.google.com/apis/credentials)でOAuth クライアント IDを作成
- [Google Cloud CLI](https://cloud.google.com/sdk/docs/downloads-interactive?hl=ja)(gcloud CLI)のインストールと設定
- シェルスクリプトの作成

# Google Cloud console でOAuth Client IDを作成
上のリンクからアクセスするとプロジェクトの作成を要求されると思います。プロジェクトを作成後OAuth Client IDを作成して下さい。作成の際の留意点は以下:

- <font color=blue>有効なAPIとサービス</font>で<ins>YouTube Data API</ins>を有効にします
- <font color=blue>OAuth同意画面</font>を設定します
    - スコープに`youtube.readonly`を含めます
- OAuth Client ID作成の際には、最初の<ins>アプリケーションの種類</ins>選択プルダウンでは<ins>デスクトップ アプリ</ins>を選択します

### クレデンシャルJSONファイルのダウンロード
OAuth Client IDを作成すると、その情報のJSONファイルがダウンロードできる状態になります。ダウンロードします。以降のセクションで`/path/to/oauth.json`として利用します。

# Google Cloud CLIのインストールと設定
### インストール
上のリンクからアクセスすると下記のコードとその説明などがあると思います。他の方法でインストールされる場合はそうして下さい。
```bash
$ curl https://sdk.cloud.google.com | bash
```

### 設定
インストール作業終了後、ブラウザを起動させた状態にしてターミナルで以下のコードを実行します:
```bash
$ gcloud auth application-default login --client-id-file /path/to/oauth.json --scopes https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/youtube.readonly
```
[コチラ](https://cloud.google.com/docs/authentication/application-default-credentials?hl=ja)の<font color=blue>アプリケーションのデフォルト認証情報の仕組み</font>の解説ページに記載があります。
ブラウザで許可を与えると、ターミナルのメッセージのように`~/.config/gcloud/application_default_credentials.json`にOAuth Client IDの情報が格納されます。

# シェルスクリプトの作成
[コチラ](https://developers.google.com/youtube/v3/docs/playlists?hl=ja)のYouTube Data APIのリファレンスページを基に、以下のようなスクリプトを作成します。(こちらのコードはご自身のニーズに合わせて改変して下さい。)
```sh
#!/usr/bin/env zsh

export PATH="$PATH:$HOME/.local/opt/google-cloud-sdk/bin" # gcloud 実行ファイルがあるディレクトリをパスに追加. 今回は ~/.local/opt/google-cloud-sdk/bin にあると仮定
mkdir -p ~/.cache/ytpl-list
prefix="https://youtube.googleapis.com/youtube/v3/playlists"
part="snippet%2CcontentDetails%2Cid%2Cstatus%2Clocalizations" # ご自分のニーズに合わせて変更
page=''

gcloud auth application-default print-access-token |
sponge |
awk '{print "Authorization: Bearer "$1}' |
read field1 # doesn't work in bash
field2="Accept: application/json"

timestamp=$(date +"%Y%m%d-%H%M%S")
while true
do
# maxResults は仕様上最大50
echo $prefix'?part='$part'&maxResults=50&mine=true&pageToken='$page |
xargs curl -sL -H $field1 -H $field2 --compressed |
tee -a ~/.cache/ytpl-list/$timestamp.json |
sponge |
jq -r '.nextPageToken // empty' |
read page
test -z "$page" && exit 1
done
```
`id`は以下で抽出可能:
```sh
jq -r '.items.[].id' ~/.cache/ytpl-list/20******-******.json
```
`title`は以下で抽出可能:
```sh
jq -r '.items.[].snippet.title' ~/.cache/ytpl-list/20******-******.json
```
全プレイリスト数は以下で抽出可能:
```sh
jq -r '.pageInfo.totalResults' ~/.cache/ytpl-list/20******-******.json | head -n 1
```
このコードは[alpineyahoo/ytpl-list](https://github.com/alpineyahoo/ytpl-list)で使いやすく改良していくつもりです。

https://github.com/alpineyahoo/ytpl-list

# 余談
`gcloud`以外にGoogleのOAuthを扱えるツールとして[oauth2l](https://github.com/google/oauth2l)がありこちらも使えそうでしたが、re-authorizeの必要性をチェックする機能が実装されておらず、access-tokenの変数代入のプロセスでエラーとなるケースが起こりそうで少し不満だったので今回は使いませんでした。
今回は<font color=orange>自分は一体プレイリストをいくつ作成してそれぞれ名前は何か</font>を知るための話でしたが、<font color=orange>プレイリストの中身はなにか</font>を知る用途だけであれば[youtube-playlist-export](https://github.com/AnsonH/youtube-playlist-export)が便利です。[Google Cloud console](https://console.cloud.google.com/apis/credentials)でAPI Keyを発行して利用できます。

https://github.com/AnsonH/youtube-playlist-export

# 参考記事

- [Bash と cURL で YouTube DATA API からプレイリストを取得するサンプル](https://qiita.com/KEINOS/items/e87017e47cea7165a844)

# 最後に
不明点や内容の誤りがありましたらお知らせ下さい。