YouTube Data APIで動画一覧を取得【Clojure】

概要

YouTubeの特定チャンネルの動画一覧を取得・表示するプログラムをClojureで作りました。 プログラムはGitHubにホストしてあります。

このプログラムでは、取得した動画情報をSQLiteに保存します。 そして、SQLiteに保存された動画情報をHTMLに出力して表示します。

2023/04/22 追記

下の画像のような並べ替えボタンを実装しました。

並べ替えボタン
並べ替えボタン

なお、このプログラムの下書きはChatGPTに書かせました。

API Keyの作成

以下の手順でYouTube Data APIで使用するAPI Keyを作成します。

  1. Googleアカウントを作成する
  2. Google Cloud Platformのプロジェクトを作成する
  3. YouTube Data APIを有効化する
  4. API Keyを作成する
  5. API KeyをYouTube Data APIのみに制限する

手順1のGoogleアカウントの作成方法は以下のサイトに書いてあります。

gmotech.jp

手順2~5のやり方は以下のサイトに書いてあります。 作成したAPI Keyは後で使うのでメモしておいてください。

qiita.com

YouTubeチャンネルIDの取得

YouTubeチャンネルIDの取得方法は以下のサイトに書いてあります。 取得したチャンネルIDは後で使うのでメモしておいてください。

www.naporitansushi.com

プログラムのダウンロード

プログラムはGitHubにホストしてあります。リンクは以下になります。

github.com

インストール手順や設定方法は、GitHubに書いてあります。

GitHubにも書いてありますが、以下のコマンドでYouTube動画を取得してHTMLを生成します。

$ lein run -- --fetch --load --generate-html

.lein-env:html-dirチャンネル名.htmlというファイル名でHTMLが生成されています。 それをブラウザで見ると動画一覧を以下のように見ることができます。

YouTubeチャンネル動画一覧
YouTubeチャンネル動画一覧

注意点

YouTube Data APIには1日あたり10,000[Quota]の利用制限があります。 https://www.googleapis.com/youtube/v3/searchAPIは1回あたり100[Quota]かかります。 searchAPIの1回あたりの最大取得件数は50件になります。 したがって、1日あたり5,000件の動画情報を取得できます。 ただし、searchAPIのレスポンスには同じ動画が重複して帰ってくることがあるので注意が必要です。

searchAPIには、publishedAfterpublishedBeforeで開始日時と終了日時を指定してその期間内の動画を取得することができます。しかし、チャンネル登録日から今日までの全ての期間の動画を取得する場合でも、例えば、3ヶ月間ごとに取得する場合と8ヶ月間ごとに取得する場合でレスポンスに含まれる動画情報に違いが出る場合があります。そのため、本プログラムでは、SQLiteに動画を保存し重複を回避したり後から最新動画を追加保存できるように作ってあります。取りこぼした動画を取得するために.lein-env:interval-monthを適宜変更して新しい動画を取得できないか試してみてください。

searchAPIではpageTokenを使用することで1リクエストあたりの最大件数50件を超えて動画情報を取得することができます。 しかし、searchAPIはレスポンスが500件を超えたあたりでレスポンスを返さなくなりpageTokenを返さなくなります。 そのため、500件以上の動画情報を取得する場合は、publishedAfterpublishedBeforeで取得する期間を指定して期間あたりの動画件数が500件以下になるように調節する必要があります。本プログラムでは、設定ファイル.lein-env:interval-monthで取得する最小期間(月)を設定できます。この期間あたりの件数が500件以下になるように設定してください。

なお、チャンネルの全動画を取得する場合チャンネル登録日が必要になります。チャンネル登録日は、YouTubeチャンネルページの「概要」タブの「統計情報」に書いてあります。

SQLiteのテーブルにはチャンネルIDをカラムに持たせているので、複数のチャンネルの動画を保存することができます。 また、本プログラムは、チャンネルごとにHTMLを出力できます。

参考