YouTube の動画をアラームにして、推しの声で目覚める

はじめに

私は VTuber をしばしば観る人なのですが、寝る前に「朝配信」の予約枠を開きっぱなしにしてアラーム代わりにすることで、快適に起床できた経験がありました。 (人の声が良い感じなのでしょうか…?)

しかしこの手法には、朝の時間帯に配信がないことが多い(特定の時刻ならなおさら)、配信者側が寝坊して一緒に寝坊する可能性もある、などの難点がありました。 *1

もちろん生配信を任意に開始することはできないので、アーカイブを適当に再生することでアラームにするプログラムを作成し、この問題の解決を図ります。

目標

  • YouTube のプレイリストを取得する
  • 指定された時刻になったら、プレイリストからランダムに動画を選択し、再生する
  • 一日で動くところまで実装できる

という感じの、とりあえず動くクライアントプログラムを作成します。

実装(インストール手順)

YouTube の情報にアクセスする API のライブラリが幸い C# (.NET) に対応していたので、使い慣れている C# (と WinForms) で作成することにします。開発環境は Visual Studio 2019 です。 とりあえず動く目標で作ったので汚いのはご容赦ください…

https://github.com/andanteyk/YouTubeAsAlerm

f:id:andantesoft:20201216002338p:plain

なお、クライアントキーは安直に公開すると危ないということしか知らないので、自前で用意していただく方式としました。そしてキーをご用意できる方ならバイナリもビルドできるだろうということで、ソースのみの公開となります。 文字通りの日曜プログラミングの成果ですのでご容赦いただければ… あと万が一まずいものがあればこっそり教えてください…

また、YouTube のチャンネルを持っている(自分のプレイリストを追加・編集できる状態にある)ことが前提となります。

ビルド方法

インストール(ビルド?)方法とともに、開発で引っかかった点などを書いていければと思います。

まず、リポジトリhttps://github.com/andanteyk/YouTubeAsAlerm.git から clone して Visual Studio で開き、プロジェクト→NuGet パッケージの管理からパッケージの復元を行います。YouTube API を使用するため Google.Apis.YouTube.v3 を使っています。

加えて、 YouTube のアカウント情報にアクセスするため、認証情報が必要になります。ビルドする前に以下の手順で認証情報を取得します。

認証情報の作成

※予防線:使用歴 6 時間の人間が書いています。以下手順でとりあえず動きますが、管理的に危険などあれば突っ込んでいただけると幸いです。

https://console.cloud.google.com/apis/dashboard にアクセスして、「プロジェクトを作成」します。 適当なプロジェクト名をつけて作成したら、「+ API とサービスの有効化」から「YouTube Data API v3」を選択して有効にします。

すると、以下のように表示されるので、

この API を使用するには、認証情報が必要になる可能性があります。開始するには、[認証情報を作成] をクリックしてください。

「認証情報を作成」します。

使用する API は先程追加した「YouTube Data API v3」, API を呼び出す場所は今回の用途的に「その他の UI (Windows, CLI ツールなど)」を選択します。 アクセスするデータの種類については、今回はプレイリストにアクセスしたいので「ユーザーデータ」とします。

すると、「OAuth 同意画面の設定」をしろと言われるので、設定します。

User Type は「外部」にします。 *2

次に、アプリ情報を適当に入力します。ガイドにあるように、同意画面(このアプリケーションによる操作を許可しますか?的な画面)でこれらの情報が表示されます。

次に、スコープ(許可される操作)を指定します。今回は「YouTube プレイリストの取得」だけできればよいので、 .../auth/youtube.readonly を追加して「保存して次へ」移動します。

次に、テストユーザの指定があるので、お使いの Google アカウント(使いたい YouTube チャンネルがあるアカウント)を登録します。削除はできないらしいので注意してください。(とはいえ、100 枠もあるのでひとりで使う分には問題なさそうです。)

以上が完了したら、元の「プロジェクトへの認証情報の追加」ページに戻ります。 OAuth 2.0 クライアント ID に適当なものを設定し、「作成」ボタンを押します。

以上が完了したら、「認証情報」画面に移動し、OAuth 2.0 クライアント ID から作成した項目のダウンロードボタンを押すと client_secret_<ClientID>.json ファイルが入手できます。これを認証に使います。 なお、このファイルは秘密なので、git リポジトリに含めたりしないよう十分注意してください。 私の理解の範囲では、API を無限に叩いてリミットを使い果たすとか悪いことをされる可能性があります。

以上で認証情報の取得が完了しました。

実行

アプリを一度ビルドした後、exe と同じ場所 (…/bin/Debug など) に先程の JSON ファイルを client_secrets.json にリネームして配置します。

実行すると初回はブラウザで認証画面が開くので、使いたいチャンネルを指定して許可してください。信用されていないので警告が出ますが、自分自身がユーザなので大丈夫だと思います。多分…

うまくいけばプレイリストが勝手に取得されるので、Alerm タブで適宜アラームを設定すれば、指定した時刻にプレイリスト内のランダムな動画がブラウザで開かれます。これで快適な朝が迎えられますね…?

あとは、開発で得られた知見(つまづきポイント)を書いていきます。

データ取得の流れ

Channels.List   - チャンネル取得
    Playlists.List    - チャンネル内のプレイリスト取得
        PlaylistItems.List   - プレイリスト内の各項目(動画)取得

上から順に取得してサーチしていくイメージです。 具体的な処理は ApiManager.cs を参照してください。

後で見る (Watch Later) は取得できない

「後で見る」のプレイリストは API から取得できないようです。元々の目標はこのリストから再生することだったので、最初から知っていれば実装しなかったかもしれません……

プレイリスト内容取得 API のリファレンス を見ると、確かに

forbidden (403)
watchLaterNotAccessible
Items in "watch later" playlists cannot be retrieved through the API.

とあります…

これが載っているのは英語版だけで、日本語版にアクセスすると書いていません。古い翻訳が残っている感じでしょうか… 軽くググった限りでもそこそこ差分があるようなので、英語版を翻訳して読んだほうがよさそうです。

非公開・削除済み動画を検出する

非公開・削除済みの動画が再生されるとアラームにならないので、ランダム再生から除外する必要があります。

公式のフラグは 3 秒で見つけられなかったので、サムネイルが存在するかどうかで判定しました。 *3 playlistItem.Snippet.Thumbnails.Standard == null なら、非公開か削除されている…はずです。

*4

参考文献

https://developers.google.com/youtube/v3/getting-started
こんな記事を読まなくても、公式のドキュメントを見ると雰囲気で分かります。サンプルも充実しているのでとりあえず動かしてみることができます。(最新版のコードである保証はないですが…?)

https://developers.google.com/youtube/v3/docs
API リファレンスです。何が返ってくるかはこちらを参照してください。

おわりに

思っていたよりだいぶ簡単に YouTube の情報にアクセスできることが分かりました。
ここ 2 日ほど稼働試験してみていますが、普通のアラーム音より快適に起きられます。とりあえずお歌リストを突っ込んだところ、朝一番でイントロクイズを楽しむことができています。(?)

内容がだいぶ薄い感じなので参考になるか微妙ですが、インストール手順の記録がてら残しておきます。

*1:それで何度かお昼になっていたことがあります……

*2:普通のアカウントでは 外部 しか選べなさそうです。

*3:後で調べたところ status.privacyStatus がそれらしいですが、試せていません

*4:完全に余談ですが、この検証の際に 湊あくあ さんの magnet が非公開になっているのに気づいてしまいました…