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

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

今回は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のエンドポイントにアクセスしてデータを取得してみましょう。

https://api.dailymotion.com/videos?search=こぶしファクトリー&fields=title,description,owner.username,owner.url,url,duration,created_time,thumbnail_medium_url&created_after=1536632401&limit=10

上記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

実際に使用したコード

コードを順番に解説していきます。

まず、dailymotionAPIでエンドポイントにアクセスする際、時間の表記は「UNIXタイム」式にする必要があります。

UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。

https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93

UNIXタイムについては、下記サイトで色々遊んでもらえると分かりやすいと思います。

https://url-c.com/tc/

また、エンドポイントにアクセスして動画の投稿日時を取得した場合も、UNIXタイムで取得します。

例:”created_time”=>1563649429

Rubyでは、整数をTime.at()メソッドで時間形式に変換できるため、データベースに格納する際には、このメソッドで修正した値を格納するのも有りです。

 

次に、取得したデータについて、エンドポイントにアクセスした際に表示された内容のとおり、日本語は文字化けした状態で取得されてしまいます。

しかし、ありがたいことにRubyでは、JSON.parseを使用すると文字化けした日本語も自動的に変換されるため、ハッシュへの変換及び、日本語文字列への変換を同時に行います。

さて、この時点で、find_nicovideos(“こぶしファクトリー”)を実行した結果のputs dailyitemsの中身を見てみましょう。

あれ、まったく関係ない検索結果が表示されています。。。

そうです、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された内容を確認してみましょう。

これでうまく動画の抽出を行うことが出来ました。

※今回たまたま、動画説明文が一切記載されていない動画を拾ってきたため、こんな感じになってますが、本来なら動画説明文も表示されるはずです。。。

最後に、取得したデータをViewで良い感じに表示させると、下記のようになります。

良い感じに表示できました。