2018年4月10日火曜日

YouTube生放送の検出

前回の記事でのコードを修正してYouTuve Live(生放送)の検出を行います。

生放送検出コードのバージョン1の仕様は
・指定したチャンネルが放送中の場合は1秒毎にブザー音を鳴らす。
・確認間隔を60秒として検出を行う。
・起動開始した時間と生放送を検出した時間を表示する。
以下がそのコードになります。
①にはAPIキー②には対象のチャンネルのID(UCで始まる文字列)が入ります。
適当な生放送中のチャンネルや開始時間がわかっているチャンネルなどで動作を確認してみてください。
使用するAPIの情報はこちらです。


注釈として
10行目と19行目はdate関数で時間を取得しています。タイムゾーンを変更しないと日本時間で表示されないので9行目で変更しています。
17行目は、APIで「&eventType=live」を条件として検索をしているので生放送をしていない場合["items"]の配列は存在しません。逆にFALSEの場合は生放送中です。
このコードを終了する場合はキーボードで「Ctrl+c」と入力して強制停止してください。
以降の記事でも無限ループがあるものの停止方法は同様です。(そういうところが雑なので。。。)




次にバージョン1の仕様を拡張し複数のチャンネルの生放送の検出を行えるようにします。
生放送検出コードのバージョン2の仕様は
・起動時に生放送を検出したら検出したチャンネル名を表示する。この時はブザー音を鳴らさない。
・起動時に生放送をしていなかった残りのチャンネルについて確認間隔を60秒として検出を行う。
・検出した場合は1秒毎にブザーを鳴らす。
・ その後も残りのチャンネルについての検出を継続する。
(ブザーは鳴り続けているため運用として強制停止後に再度起動を想定)

・検出した場合そのチャンネル名を表示する。
・起動開始した時間と生放送を検出した時間を表示する。
です。

以下がそのコードになります。行数が増えましたが前半と後半にわけて考えればそれほど難しくないと思います。




出力例としてはこんな感じになると思います。


注釈として
 ・$channelId_Listに検出したいチャンネルを登録してできるようにしています。今回は手作業でおこなってください。自分のアカウントから登録チャンネルの情報から作成したいところですがその場合「OAuth 2.0のトークン」が必要になってくるため別途説明します。
・放送中のチャンネルを何回もチェックしないようにunset関数を使いchannelId_List配列からの削除を行っています。
・ブザーが鳴った条件を満たしたあと再度検出処理中はブザーが鳴らないため
ポッ*60回・無音区間・ポッ*60回・無音区間の繰り返しになります。
登録しているチャンネル数をが多くなればなるほど無音区間が増えてしまいます。(例:40個で約20秒無音区間)



簡易的なYouTube生放送検出コードの仕様は以上となります。役に立ちそうですかね?
最近バーチャルユーチューバーを複数チャンネル登録したんですけどYouTubeのページの左側の生放送のマークがなんかたよりないので作ってみました。PHPは触ったばかりで詳しくないですが今回やっていることは難しいことしてないので他の言語を触ったことがあれば理解できると思います。
限定公開の生放送は検出できないためツイッターを見るなりしなければいけないのは変わりませんが、それ以外のゲリラ放送の検出に少しは役に立つのではないかと思っています。


このコードの改善点・弱点としては
・100秒毎のAPI使用量の制限を考えると登録数と検出間隔に気をつけなければいけないのでAPIを投げるタイミングを分散する方がよい。少ないチャンネルなら10秒間隔でも大丈夫かも。実際の使用量を確認して調整すべし。
・無音区間ができるだけ短くなるように工夫する。
・「&eventType=live」としていますが「&eventType=upcoming」として「今後配信予定」(○○時間後にライブ配信っていう画面のやつです)を引っかけることです。しかしAPI使用量が単純に2倍になってしまいます。&eventTypeが複数指定できるといいのですがね。
それに近々の放送とも限りませんので前半部分で検出するぐらいでよいかもしれません。
・Ctrl+cした後再起動ってもエレガントではないですがちょっとした確認用がですのでこんなものでしょうか。あと起動中の生放送終了後また生放送開始とかは配列から削除してしまっているので検出は無理です。ちょいちょい再起動するか配列から削除ではなく状態管理とかが必要かと思います。
・生放送URLをブラウザ に渡して起動もできそうですね

0 件のコメント:

コメントを投稿