【Youtube Data API最適化】12000本以上の動画再生数通知のタイムラグを1分以内に抑えるやり方

雑記

おそらくほとんどの方にとってハードルが高いです。理由はすぐわかります。

 

 

うちのBOT、1万本以上あるほぼすべての動画の再生数キリ番通知のタイムラグを1分以内に抑えています。ではどうやってタイムラグを抑えているのか、かんたんに解説していきます。

アルゴリズム+αメインですが、SQLのかんたんな知識はあったほうがいいかもです。

Youtube Data APIクォータの増加申請をする

ハードルが高い理由がこれです。Youtube Data APIの増加申請は必須です。

1万本以上の動画を監視しつつタイムラグを1分以内に抑える場合、1万Quota/日じゃどうやってもできません。最適化してもせいぜい2時間ごとのチェックが限界でしょう。

増加申請するといってもそこまで大量には必要ないです。13000本程度なら8~9万クォータあれば十分です(うちは余裕を持って20万クォータ割り当ててもらって他の処理も組んでいます)。

Youtube Data API申請で送付する動画

リクエスト量があまりにも大きくない限りはめちゃかんたんなやつでオーケーです。うちはcronで自動化しているので、

  1. crontab見せる(Youtubeの担当がシステムにかんたんにアクセスできるようREST APIを実装してた)
  2. そのままTwitter BOTのツイート状況見せる
  3. かんたんに日本語の字幕をつける
  4. メールで送る
  5. おわり

で審査通過です。

複数アカウントはNG

普通にバレるしブチ切れられます(開発初期で体験済み)。

利用規約はちゃんと読みましょう。うちのように冷や汗かくことになります。

ブチ切れられたあとでもちゃんと対応して申請すればアカウントを止められることなくクォータを増やしてもらえるので、ちゃんと申請を行いましょう(申請自体は全文日本語で通ります)

再生数通知を1分以内に抑えるには

うちのBOTでは1分~30分間隔で全動画をチェックしています。チェック間隔を動的に変更することで、Youtube Data API消費を最小限に抑えながら10万再生や20万再生などのキリ番突破をいち早く取得・通知しています。

30分周期でチェックしている動画

ホロライブにある全動画をチェックしています。BANや非公開・限定公開で取得できないといったチェック不可能な動画を除いた全動画が対象です。

仮にチェックする動画13000本だった場合は最小値で37440Quota/日、snippet,statistics両方を取得した場合で62400Quota/日となります。

 

5分周期でチェックしている動画

次にチェック感覚が短いのが5分周期。

SELECT * 
FROM `table_name`
WHERE
    ((`views` BETWEEN 100000 AND 949999) AND ((`views`%100000) BETWEEN 90000 AND 97500))
 OR	(`views` < 100000 AND (`views` BETWEEN 90000 AND 97500))
 OR	(`views` > 1000000 AND ((`views`%1000000) BETWEEN 900000 AND 975000))

データベースにキャッシュ済みの再生数(うちの場合はviews)を使って、キリ番に近づいている動画を絞り込んでいます。

実際はもう少し複雑なSQLですが、重要な箇所は上記の再生数に関する条件式です。これで全体の2%程度(今のところは300本未満)に絞り込めます。

仮に300本だとするとVideo:listを6回呼べばいいだけですので、最小値で5184Quota/日。snippet,statistics両方を取得した場合でも一日あたり8640Quota/日です。全動画チェックと比べると全然余裕ですね。

1分周期でチェックしている動画

5分周期よりもさらに絞り込みます。

SELECT *
FROM `table_name`
WHERE
    ((`views` BETWEEN 100000 AND 949999) AND ((`views`%100000) BETWEEN 97501 AND 99999))
 OR	((`views` BETWEEN 950000 AND 999999) AND ((`views`%100000) BETWEEN 50000 AND 99999))
 OR	(`views` < 100000 AND (`views` BETWEEN 97501 AND 99999))
 OR	(`views` > 1000000 AND ((`views`%1000000) BETWEEN 975001 AND 999999)

絞り込み条件の数値が異なるだけでやってることは5分周期でチェックする動画の絞り込みと同じです。

数日分データを保持している場合は日付も使って絞り込みを行うようにしましょう

上記条件だと100本以下(全体の1%未満)にまで絞り込めます。Video:listを毎分2回呼ぶとすると、最小値で4320Quota/日。snippet,statistics両方を取得した場合でも7200Quota/日で済みます。

 

ここまで1日あたりの消費クォータを合計すると

  • statisticsのみ:37440+5184+4320=46944Quota/日
  • snippet,statistocs両方:62400+8640+7200=78240Quota/日

です。

冒頭では8万クォータあれば十分と言いましたが、最適化するなら5万クォータすらかからなかったりします。

 

1分以内に通知できない例外動画はある

キリ番に遠い動画は30分周期、それ以外は5分~1分でチェックするとほとんどタイムラグが起きませんが、例外はあります(再生数ぶっ飛びまくったおちゃめ機能とか)。

流石にそれはもっとYoutube Data APIのクォータを贅沢に使ってチェック間隔狭めるか、再生数推移を絞り込み条件に加えないといけず面倒なので、うちではやってません。

ただ、そういう動画がでてくる事自体がめったにないので、急いで実装する必要もSQLを必要以上に最適化する必要もないでしょう。

配信中の再生数も取得して通知するには

こちらで解説しています。動画IDさえ判明すればほかの動画と同じように再生数を取得できます。

https://eliseri.com/bottotototo/

Search:listは選択肢に入れること自体が論外なので、Search:listを使わない前提で設計してください。

ごく一部の条件下でのみSearch:Listを使うほうが効果的であることがわかりました。

タイトルとURLをコピーしました