Ruby on RailsでDailymotionのAPIを使用して、動画の検索を行う
- 2019.08.04
- Rails

今回はDailymotionのapiをRubyで使用する方法について紹介します。
※下記でYoutubeやニコニコ動画のAPIについても紹介しています
Ruby on RailsでYouTube Data API (v3)を使用して、動画の検索を行う
Ruby on Railsでニコニコ動画のコンテンツ検索APIを使用して、動画の検索を行う
Dailymotionのapiを使用して動画の検索結果を取得する
使用するApiは下記です。
https://developer.dailymotion.com/api
こちらも、ニコニコ動画のapiと同様、動画検索機能を使用する場合、事前登録やApiキーの取得は必要なくエンドポイントにアクセスしてデータを取得する形式です。
では早速、検索キーワード「こぶしファクトリー」でApiのエンドポイントにアクセスしてデータを取得してみましょう。
上記URLにアクセスすると、何やらデータは取得できてそうですが、文字化けを起こしています。
これは日本語の部分が文字化けを起こしている状態であり、JSON-Encodeを行うことで、正常に表示されます。
エンドポイントにアクセスして得たデータを、下記ページにてJSON-Encodeを行うと分かりやすいです。
http://lab.kiki-verb.com/mojibakeratta/
URLに記載できる値について
こちらのAPIについても、ニコニコ動画のコンテンツ検索APIと同様、URLに検索キーワードやフィルターの指定を記載します。
上記に記載したエンドポイントのURLの場合、以下のように分解できます。
・search=こぶしファクトリー
→検索キーワード
・fields=title,description,owner.username,owner.url,url,duration,created_time,thumbnail_medium_url
→取得したいデータの指定
・created_after=1536632401
→投稿日時のフィルター
・limit=10
→取得するコンテンツの最大数。最大:100
フィルターについては下記で紹介されており、&created_after=1536632401のように、「&」で区切りながら指定していきます。
https://developer.dailymotion.com/api#video-filters
また、ApiExplorerから「fields」欄で取得したい項目の指定や、フィルターの指定などを試すこともできます。
https://developer.dailymotion.com/tools
実際に使用したコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def find_dailymotionvideo(serch_keyword) #dailymotionAPIで検索をかける際、時間の表記はUNIXタイムスタンプ式じゃないといけないため、.to_iで整数に変換 unix_onemonth_ago = Time.current.ago(1.months).to_i daily = URI.encode("https://api.dailymotion.com/videos?search=#{serch_keyword}&fields=title,description,owner.username,owner.url,url,duration,created_time,thumbnail_medium_url&created_after=#{unix_onemonth_ago}&limit=100") dailyjson = Net::HTTP.get(URI.parse(daily)) #JSON.parseを使用すると文字化けした日本語も自動的に変換される dailyhash = JSON.parse(dailyjson) dailyitems = dailyhash["list"] puts "dailyitemsの結果は下記です。" puts dailyitems #■DailymotionAPIで日本語で検索すると、関係ない結果も多数表示される、英語だと表示されない。 #そのため取得したハッシュから、タイトルか説明文にserch_keywordが含まれているデータのみを抽出する #includeでは大文字小文字まで完全一致で判定するため、正規表現+.matchで条件分岐(が上手く検索に引っかからないのよ。) #https://blog.codecamp.jp/ruby-regex dailyitems.each do |dailyitem| if dailyitem["title"].match(/#{serch_keyword}/i) || dailyitem["description"].match(/#{serch_keyword}/i) puts "#{serch_keyword}で抽出した結果です" puts dailyitem["title"] puts dailyitem["description"] end end end |
コードを順番に解説していきます。
まず、dailymotionAPIでエンドポイントにアクセスする際、時間の表記は「UNIXタイム」式にする必要があります。
UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。
UNIXタイムについては、下記サイトで色々遊んでもらえると分かりやすいと思います。
また、エンドポイントにアクセスして動画の投稿日時を取得した場合も、UNIXタイムで取得します。
例:”created_time”=>1563649429
Rubyでは、整数をTime.at()メソッドで時間形式に変換できるため、データベースに格納する際には、このメソッドで修正した値を格納するのも有りです。
次に、取得したデータについて、エンドポイントにアクセスした際に表示された内容のとおり、日本語は文字化けした状態で取得されてしまいます。
しかし、ありがたいことにRubyでは、JSON.parseを使用すると文字化けした日本語も自動的に変換されるため、ハッシュへの変換及び、日本語文字列への変換を同時に行います。
さて、この時点で、find_nicovideos(“こぶしファクトリー”)を実行した結果のputs dailyitemsの中身を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dailyitemsの結果は下記です。 {"title"=>"190725 こぶしファクトリー", "description"=>"", "owner.username"=>"h_d_190120", "owner.url"=>"https://www.dailymotion.com/h_d_190120", "url"=>"https://www.dailymotion.com/video/x7eh43w", "duration"=>302, "created_time"=>1564241455, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/QhNaC1TGmlQmpMSeJ/160x120"} {"title"=>"190718 こぶしファクトリー", "description"=>"", "owner.username"=>"h_d_190110", "owner.url"=>"https://www.dailymotion.com/h_d_190110", "url"=>"https://www.dailymotion.com/video/x7drs6p", "duration"=>161, "created_time"=>1563649293, "thumbnail_medium_url"=>"https://s2.dmcdn.net/v/Qct1n1TCtDBi3bvg_/160x120"} {"title"=>"190719 こぶしファクトリー", "description"=>"", "owner.username"=>"h_d_190110", "owner.url"=>"https://www.dailymotion.com/h_d_190110", "url"=>"https://www.dailymotion.com/video/x7drs6r", "duration"=>206, "created_time"=>1563651487, "thumbnail_medium_url"=>"https://s2.dmcdn.net/v/Qct1p1TCt-Ukun4V6/160x120"} {"title"=>"181025こぶしファクトリー", "description"=>"", "owner.username"=>"h_d_190127", "owner.url"=>"https://www.dailymotion.com/h_d_190127", "url"=>"https://www.dailymotion.com/video/x7dftru", "duration"=>1110, "created_time"=>1563292431, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/Qakrw1TBVN6uid8G9/160x120"} {"title"=>"190718 こぶしファクトリー", "description"=>"", "owner.username"=>"h_d_190110", "owner.url"=>"https://www.dailymotion.com/h_d_190110", "url"=>"https://www.dailymotion.com/video/x7drs6q", "duration"=>2974, "created_time"=>1563649429, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/Qct1o1TCwyw3mIz4y/160x120"} {"title"=>"Manpuku - まんぷく - 6 English Subtitles - Japan Drama", "description"=>"Manpuku - まんぷく - 6 English Subtitles - Japan Drama", "owner.username"=>"BubataKaoco", "owner.url"=>"https://www.dailymotion.com/BubataKaoco", "url"=>"https://www.dailymotion.com/video/x7f0p5u", "duration"=>900, "created_time"=>1564783059, "thumbnail_medium_url"=>"https://s2.dmcdn.net/v/QksfY1THBIRI5oldb/160x120"} {"title"=>"Manpuku - まんぷく - 8 English Subtitles - Japan Drama", "description"=>"Manpuku - まんぷく - 8 English Subtitles - Japan Drama", "owner.username"=>"BubataKaoco", "owner.url"=>"https://www.dailymotion.com/BubataKaoco", "url"=>"https://www.dailymotion.com/video/x7f0p5z", "duration"=>900, "created_time"=>1564783351, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/Qksfd1THBJRiBf5vA/160x120"} {"title"=>"8月30日シェリー", "description"=>"", "owner.username"=>"dm_f6ea5d4733dcb0193a739298e21cdc6c", "owner.url"=>"https://www.dailymotion.com/dm_f6ea5d4733dcb0193a739298e21cdc6c", "url"=>"https://www.dailymotion.com/video/x7evnc1", "duration"=>19, "created_time"=>1564628394, "thumbnail_medium_url"=>"https://s2.dmcdn.net/v/Qjz7X1TGdw3Pi-ULe/160x120"} {"title"=>"変身するぞっ!!", "description"=>"", "owner.username"=>"dm_f6ea5d4733dcb0193a739298e21cdc6c", "owner.url"=>"https://www.dailymotion.com/dm_f6ea5d4733dcb0193a739298e21cdc6c", "url"=>"https://www.dailymotion.com/video/x7dwvhf", "duration"=>61, "created_time"=>1563781894, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/Qdn1Z1TGrTkGIEzJ7/160x120"} {"title"=>"変顔じゃん⁉️", "description"=>"", "owner.username"=>"dm_f6ea5d4733dcb0193a739298e21cdc6c", "owner.url"=>"https://www.dailymotion.com/dm_f6ea5d4733dcb0193a739298e21cdc6c", "url"=>"https://www.dailymotion.com/video/x7dwvh8", "duration"=>74, "created_time"=>1563782070, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/Qdn1S1TGbJyOGAeOy/160x120"} {"title"=>"面白い放送事故!!", "description"=>"", "owner.username"=>"dm_f6ea5d4733dcb0193a739298e21cdc6c", "owner.url"=>"https://www.dailymotion.com/dm_f6ea5d4733dcb0193a739298e21cdc6c", "url"=>"https://www.dailymotion.com/video/x7evrrn", "duration"=>160, "created_time"=>1564634677, "thumbnail_medium_url"=>"https://s2.dmcdn.net/v/Qj-XJ1TH1QHSZdjAK/160x120"} {"title"=>"魔法のラーメン屋だぞ!!", "description"=>"", "owner.username"=>"dm_f6ea5d4733dcb0193a739298e21cdc6c", "owner.url"=>"https://www.dailymotion.com/dm_f6ea5d4733dcb0193a739298e21cdc6c", "url"=>"https://www.dailymotion.com/video/x7dwvhs", "duration"=>346, "created_time"=>1563781824, "thumbnail_medium_url"=>"https://s1.dmcdn.net/v/Qdn1m1TGbKvEguWlg/160x120"} |
あれ、まったく関係ない検索結果が表示されています。。。
そうです、Dailymotionで日本語検索を実行すると、このように全く関係ない動画も取得してしまうのです。。。
※記載したキーワードのデータを優先的に取得し、limitに達しない場合、関係ない動画も拾ってくるみたいな感じでした
※ローマ字での検索の場合、この状況は発生しませんでした
こちらについて、色々改善策を探してみましたが、どうしてもエンドポイントアクセス時にはじく方法はわかりませんでした。。。
API explore(https://developer.dailymotion.com/tools/apiexplorer#/video/list)で日本語検索を試しても関係ないデータが表示されるし、日本語検索の限界なの。。。?
そのため、一度データを取得した後に、Ruby側ではじく方法を取りました。
関係ない検索結果の除去
検索結果の除去では、「動画タイトルか動画の説明文に指定したキーワードが含まれていない場合、その動画をはじく」方法を取りました。
.matchメソッドを使用すると、指定した文字列に○○が含まれるかどうかを判断できます。
https://ref.xaio.jp/ruby/classes/string/match
include?でも似たようなことができるのですが、判定が完全一致になり、ローマ字での検索を行う場合に大文字小文字を区別してしまうという状況になるため、matchを採用しました。(ハロプロには「juice=juice」というローマ字のアイドルグループも在籍しているじゃないですか。大文字で投稿されていた場合でもちゃんと拾ってきてほしいじゃないですか。ね?)
今度は、find_nicovideos(“こぶしファクトリー”)実行時のdailyitems.each do |dailyitem|以下でputsされた内容を確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
こぶしファクトリーで抽出した結果です 190725 こぶしファクトリー こぶしファクトリーで抽出した結果です 190718 こぶしファクトリー こぶしファクトリーで抽出した結果です 190719 こぶしファクトリー こぶしファクトリーで抽出した結果です 181025こぶしファクトリー こぶしファクトリーで抽出した結果です 190718 こぶしファクトリー |
これでうまく動画の抽出を行うことが出来ました。
※今回たまたま、動画説明文が一切記載されていない動画を拾ってきたため、こんな感じになってますが、本来なら動画説明文も表示されるはずです。。。
最後に、取得したデータをViewで良い感じに表示させると、下記のようになります。
良い感じに表示できました。
-
前の記事
Ruby on Railsでニコニコ動画のコンテンツ検索APIを使用して、動画の検索を行う 2019.08.03
-
次の記事
OnesignalでRailsのWebプッシュ通知(個別通知)を実装する 2019.08.11