RubyからYoutubeAPIを使ってクラロワ動画を概要欄で絞り込んでみた

はじめに

私はクラッシュロワイヤル(通称クラロワ)というスマホゲームでよく遊んでいます。クラロワは8枚のカードでデッキを組んで相手と戦うカードゲームです。

clashroyale.com

そのクラロワのスキルアップのために、 YouTube で 『Stats Royal』というチャンネルの動画をよく観ています。クラロワの試合の動画がひたすらアップされているチャンネルです。

www.youtube.com

私はクラロワで『ゴーレム』というカードが好きなので、『Stats Royal』の動画のうちゴーレムが使われている試合の動画だけを観たいなと思いました。

f:id:wai-doi:20211020000034p:plain
ゴーレム

動画のサムネイルには一応デッキの画像が載っていますが、ひとつひとつ『ゴーレム』の動画を探していくのは疲れるため辛いです。 また、YouTubeで「Stats Royale ゴーレム」などと検索しても、他の動画が出てしまったりしてうまく絞り込むことができませんでした。

ただし、動画の概要欄には親切にも、その動画の試合に使われているデッキのカードが載っていました!

f:id:wai-doi:20211020002600p:plain

概要欄に情報があるなら、YouTube API を使えばうまく絞り込めそうだなと思いました。

YouTube APIを使ってみた

そこで YouTube API を使って『Stats Royal』チャンネルの内、『ゴーレム』が利用されている動画だけ検索してみることにしました。

チャンネルID

まず必要になるのが 『Stats Royale』 のチャンネルIDです。チャンネルIDはチャンネルページのURLのパスの末尾になります。

https://www.youtube.com/channel/UC698QxCg2KVVWh4G6NQLX_wUC698QxCg2KVVWh4G6NQLX_w の部分です。

APIキーの作成

YoutubeAPI を利用するには APIキーを作成しないといけません。 API キーの作り方などはこちらの記事を参考にしました。

qiita.com

利用した Gem

RubyからAPIを楽に利用するため google-api-ruby-client というGemを用いました。

github.com

Gemfile には以下の様に書きました。

gem 'google-api-client'

実際に書いたスクリプト

YouTube API から取得できるデータはこちらのドキュメントを参考にしました。

developers.google.cn

処理の手順は以下になります。

  1. YouTubeService オブジェクトを作る。
  2. チャンネルIDを使って「Channels: list」のAPIを叩いて、チャンネルのアップロード動画のプレイリストIDを取得する。
  3. 取得したプレイリストIDを使って「PlaylistItems: list」のAPIを叩いて、アップロードリスト内の動画の概要欄と動画IDを取得する。
  4. 概要欄のテキストから、デッキに『ゴーレム』が入っている動画だけに絞り込む。
  5. 絞り込んだ動画の動画IDから動画のURLを作成してHTMLに埋め込む。

以下が実際に書いた Ruby スクリプトです。

require 'google/apis/youtube_v3'

# `YouTubeService` オブジェクトを作ります
youtube = Google::Apis::YoutubeV3::YouTubeService.new
youtube.key = "API Key"

# 『Stats Royale』のチャンネルIDです
channnel_id = "UC698QxCg2KVVWh4G6NQLX_w"

# チャンネルIDを使って「Channels: list」のAPIを叩いて、チャンネルのアップロード動画のプレイリストIDを取得します
response = youtube.list_channels('contentDetails', id: channnel_id)
uploads_playlist_id = response.items.first.content_details.related_playlists.uploads


# 取得したプレイリストIDを使って「PlaylistItems: list」のAPIを叩いて、アップロードリスト内の動画の概要欄と動画IDを取得します
# 10 * 50件の動画の情報を取得する
uploaded_video_items = []
next_page_token = nil
10.times do
  response = youtube.list_playlist_items('snippet', playlist_id: uploads_playlist_id, max_results: 50, page_token: next_page_token)
  uploaded_video_items += response.items
  puts "#{uploaded_video_items.size} 件取得"
  next_page_token = response.next_page_token
  break if next_page_token.nil?
  sleep 0.1
end


# 概要欄のテキストから、デッキに『ゴーレム』が入っている動画だけに絞り込みます
golem_video_items = uploaded_video_items
  .select { |item| item.snippet.description.scan(/deck:\n(.+)\n/).flatten.any? { |m| m.split(", ").include?("Golem")} }

# 埋め込み式の動画タグをHTMLにして出力します
div_tags = golem_video_items.map do |item|
  published_at = Time.parse(item.snippet.published_at).localtime.strftime('%F %T')
  id = item.snippet.resource_id.video_id

  <<~DIV
    <div style="margin-bottom: 100px">
      <p> #{published_at} </p>
      <iframe width="1120" height="630" src="https://www.youtube.com/embed/#{id}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
    </div>
  DIV
end.join("\n")


html = <<~HTML
  <!DOCTYPE html>
  <html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    #{div_tags}
  </body>
  </html>
HTML

File.write("output.html", html)

出力したHTML

スクリプトで最後に出力されたHTMLです。 『ゴーレム』の試合の動画ばかりが並べることができ、目的を達成することができました。

f:id:wai-doi:20211020011128p:plain
出力したHTML

おわりに

YouTubeAPI は初めて触ったので利用の仕方など勉強になりました。趣味のゲームを対象にしましたが、技術で楽にすることができたのでよかったです。

今回はRubyスクリプトから使ってみましたが、今後はRailsアプリなどにして動画検索をしやすくしてみたいです。