RubyからYoutubeAPIを使ってクラロワ動画を概要欄で絞り込んでみた
はじめに
私はクラッシュロワイヤル(通称クラロワ)というスマホゲームでよく遊んでいます。クラロワは8枚のカードでデッキを組んで相手と戦うカードゲームです。
そのクラロワのスキルアップのために、 YouTube で 『Stats Royal』というチャンネルの動画をよく観ています。クラロワの試合の動画がひたすらアップされているチャンネルです。
私はクラロワで『ゴーレム』というカードが好きなので、『Stats Royal』の動画のうちゴーレムが使われている試合の動画だけを観たいなと思いました。
動画のサムネイルには一応デッキの画像が載っていますが、ひとつひとつ『ゴーレム』の動画を探していくのは疲れるため辛いです。 また、YouTubeで「Stats Royale ゴーレム」などと検索しても、他の動画が出てしまったりしてうまく絞り込むことができませんでした。
ただし、動画の概要欄には親切にも、その動画の試合に使われているデッキのカードが載っていました!
概要欄に情報があるなら、YouTube API を使えばうまく絞り込めそうだなと思いました。
YouTube APIを使ってみた
そこで YouTube API を使って『Stats Royal』チャンネルの内、『ゴーレム』が利用されている動画だけ検索してみることにしました。
チャンネルID
まず必要になるのが 『Stats Royale』 のチャンネルIDです。チャンネルIDはチャンネルページのURLのパスの末尾になります。
https://www.youtube.com/channel/UC698QxCg2KVVWh4G6NQLX_w の UC698QxCg2KVVWh4G6NQLX_w
の部分です。
APIキーの作成
YoutubeAPI を利用するには APIキーを作成しないといけません。 API キーの作り方などはこちらの記事を参考にしました。
利用した Gem
RubyからAPIを楽に利用するため google-api-ruby-client というGemを用いました。
Gemfile には以下の様に書きました。
gem 'google-api-client'
実際に書いたスクリプト
YouTube API から取得できるデータはこちらのドキュメントを参考にしました。
処理の手順は以下になります。
YouTubeService
オブジェクトを作る。- チャンネルIDを使って「Channels: list」のAPIを叩いて、チャンネルのアップロード動画のプレイリストIDを取得する。
- 取得したプレイリストIDを使って「PlaylistItems: list」のAPIを叩いて、アップロードリスト内の動画の概要欄と動画IDを取得する。
- 概要欄のテキストから、デッキに『ゴーレム』が入っている動画だけに絞り込む。
- 絞り込んだ動画の動画IDから動画のURLを作成してHTMLに埋め込む。
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です。 『ゴーレム』の試合の動画ばかりが並べることができ、目的を達成することができました。
おわりに
YouTubeAPI は初めて触ったので利用の仕方など勉強になりました。趣味のゲームを対象にしましたが、技術で楽にすることができたのでよかったです。