"youtube api playlist 取得"などでGoogle検索すると、指定したYouTube Playlistの動画情報を取得する方法(プレイリストの中身はなにか etc.)はいくつか見つかるのですが、自分のGoogleアカウントで作成したプレイリストの情報を取得する方法(自分は一体プレイリストをいくつ作成してそれぞれ名前は何か etc.)が調べた限りでは見つからなかったので、ここにやり方を書いておきます。
分かりずらい・面倒くさい
YouTubeのデータを取得するためにはYouTube Data APIを利用する必要があります。指定したプレイリストの動画情報を取得するだけであれば、API Keyを発行しそれを利用することで達成できます。しかし、自分が作成したプレイリスト情報にアクセスするためには、API Keyは使えず、OAuthによる認証が必要です。OAuth認証を利用する場合はAPI Keyは要りません。
これを踏まえて、手順は以下です:
- Google Cloud consoleでOAuth クライアント IDを作成
- Google Cloud CLI(gcloud CLI)のインストールと設定
- シェルスクリプトの作成
Google Cloud console でOAuth Client IDを作成
上のリンクからアクセスするとプロジェクトの作成を要求されると思います。プロジェクトを作成後OAuth Client IDを作成して下さい。作成の際の留意点は以下:
- 有効なAPIとサービスでYouTube Data APIを有効にします
-
OAuth同意画面を設定します
- スコープに
youtube.readonly
を含めます
- スコープに
- OAuth Client ID作成の際には、最初のアプリケーションの種類選択プルダウンではデスクトップ アプリを選択します
クレデンシャルJSONファイルのダウンロード
OAuth Client IDを作成すると、その情報のJSONファイルがダウンロードできる状態になります。ダウンロードします。以降のセクションで/path/to/oauth.json
として利用します。
Google Cloud CLIのインストールと設定
インストール
上のリンクからアクセスすると下記のコードとその説明などがあると思います。他の方法でインストールされる場合はそうして下さい。
$ curl https://sdk.cloud.google.com | 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
コチラのアプリケーションのデフォルト認証情報の仕組みの解説ページに記載があります。
ブラウザで許可を与えると、ターミナルのメッセージのように~/.config/gcloud/application_default_credentials.json
にOAuth Client IDの情報が格納されます。
シェルスクリプトの作成
コチラのYouTube Data APIのリファレンスページを基に、以下のようなスクリプトを作成します。(こちらのコードはご自身のニーズに合わせて改変して下さい。)
#!/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
は以下で抽出可能:
jq -r '.items.[].id' ~/.cache/ytpl-list/20******-******.json
title
は以下で抽出可能:
jq -r '.items.[].snippet.title' ~/.cache/ytpl-list/20******-******.json
全プレイリスト数は以下で抽出可能:
jq -r '.pageInfo.totalResults' ~/.cache/ytpl-list/20******-******.json | head -n 1
このコードはalpineyahoo/ytpl-listで使いやすく改良していくつもりです。
余談
gcloud
以外にGoogleのOAuthを扱えるツールとしてoauth2lがありこちらも使えそうでしたが、re-authorizeの必要性をチェックする機能が実装されておらず、access-tokenの変数代入のプロセスでエラーとなるケースが起こりそうで少し不満だったので今回は使いませんでした。
今回は自分は一体プレイリストをいくつ作成してそれぞれ名前は何かを知るための話でしたが、プレイリストの中身はなにかを知る用途だけであればyoutube-playlist-exportが便利です。Google Cloud consoleでAPI Keyを発行して利用できます。
参考記事
最後に
不明点や内容の誤りがありましたらお知らせ下さい。