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