メインコンテンツに移動

FeedAPI+FeedAPI Mapper+Embedded Media Field

まだ、レイアウトの編集中ですが、自分で作成した動画だけではなんだか寂しかったので、Youtubeの動画も貼り付けることにしました。

やりたい事は、フロントページに自分の動画のPickUP動画とあとYoutubeの動画を配置することです。

具体的には、
PickUP動画は、以下4種になります。
①最新の動画
②投票結果が一番高得点の動画
③総アクセス数が一番多い動画
④今日のアクセス数が一番多い動画

Youtubeの動画は、以下3種類になります。
①タグに"リネージュ2"を含みかつ最新の動画
②タグに"リオナ"を含みかつ最新の動画
③タグに"AION"を含みかつ最新の動画

これらをフロントページ1ページに配置するために、panelsモジュールを使いました。
panelsモジュールについては別記事で紹介したいと思います。

YouTubeの動画を貼り付ける方法ですが、先日使用したURLを入力しただけでブログに動画を埋め込めるEmbedded Media Field(+Embedded Video Field)モジュールを使うことにしました。
ただ問題なのが、これだけだと最新の動画がアップされるとその都度、手動で1動画づつ登録しなくてはいけません。
かなり面倒です。
そこで、RSSフィードを使います。

RSSフィードからタイトル、日時、本文、や動画のURLを抽出し、それを入力にビデオノードの作成ができれば問題は解決します。
これを実行してくれるのが、FeedAPIモジュールです。
有効にしたモジュールは、FeedAPI、FeedAPI Node、SimplePie parser、Common syndication parserになります。

FeedAPIモジュールは、主としてParserとProcessorで構成されます。
Parserは、フィードを扱い安いように変換してくれるものですが、SimplePieとCommon Syndication (only for PHP5)が使用できます。
ほかにも使用できると思いますが、あれこれしたいわけではないので、私は、SimplePieを使うことにしました。
SimplePieを使用する場合は、別途本体をダウンロードする必要があります。ダウンロード先のURLは、モジュールに添付のREADME.txtに記載があります。
Processorは、そのフィードを使って何をさせるかを担う部分でAddONを追加すればがいろいろできそうです。
先ほど有効にしたFeedAPI Nodeモジュールもそのひとつで、フィードからノードを作成してくれます。
どのノードタイプを作成するかを選択しなくてはいけませんので、事前に使用するコンテンツタイプの作成を済ませておく必要があります。
ここで選択するコンテンツタイプは、URLから動画の貼り付けをするEmbedded Video Fieldの機能を使用するようセットアップ済みです。

ただFeedノードに入力するURLですが、YouTubeのRSSをどう取得するかでハマリました。

基本的な事項としては、http://www.youtube.com/rsslsに記載があるとおりです。
私の場合はタグ検索のケースを使用すればよいので、①のリネージュ2の場合は次の様になります。

http://gdata.youtube.com/feeds/base/videos/-/リネージュ2?client=ytapi-youtube-browse&v=2 

しかし、取得する一覧の日付が更新日時になっているようで、投稿日(アップロード日)ではありません。
そのため何年も前の動画が表示されてしまいます。
そこでもう1つの、全文検索のケースを試してみました。

http://gdata.youtube.com/feeds/base/videos?q=%E3%83%AA%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A52&client=ytapi-youtube-search&v=2 


表示される結果は"このページのRSSフィード"のボタンを押して表示されるものと同じですが、アドレスバーのアドレスをそのままコピペしてもダメです。試しにそのままリロード(最新の情報に更新)してみればお分かりいただけます。
※q=の箇所すなわち検索キーワードは"リネージュ2"ではなく"URL エンコードされた検索キーワード"になります。
URL エンコードされた検索キーワードは、キーワード検索後にアドレスバーに表示されているsearch_query以降の該当箇所をコピペしました。ブラウザがIEの場合にできることだと思います。

結果は、やはり更新日時が最新である動画の一覧でした。

いろいろ調査していると、ある記述を見つけたのでそれを試すことにしました。

http://www.youtube.com/rss/tag/リネージュ2.rss


その記事には、タグ検索と説明がありましたが、YouTubeでキーワード検索した結果と一致するので全文検索と思われます。※リネージュ2というタグがないので全文検索の結果になっているのかもしれません。
これなら投稿日時で最新の一覧を取得できました。

結局、Youtubeの動画は、以下3種類になります。
①全文検索で"リネージュ2"と一致する最新の動画
②全文検索で"リオナ"と一致する最新の動画
③全文検索で"AION"と一致する最新の動画

そもそもYouTubeの全文検索の仕様なのか、"リネージュ2”という単語を細切れにしたものと一致するようで、"リネ"とか"2"とかでも一致し、全く違った動画も含まれてしまいます。
そこは愛嬌ということで、現時点ではご了承ください。

あとは、FeedAPI Mapperの機能を使ってマッピングを設定します。
上に表示されているMAPタグをクリックして、
Feed Itemのoption⇒original_urlをノードのMap to embed movie(emvideo)を追加するだけです。
これで取得したRSSフィードからビデオのURLをEmbedded Video FieldのURLとして使いビデオノードを作成してくれます。
parserの結果は、Feed item exampleで確認できますので、うまくいかない場合はいろいろ変えてみてください。

以上で、設定は完了ですが、あとは定期的にRSSフィードの最新を取得しなければいけません。
簡単に言うと、refreshボタンを自動で押すにはどうすればよいかです。

FeedAPIでは、何分おきに実行するかの設定はできるますが、このタイミングで取得までしてくれているようには思いません。
恐らく、cron.phpが実行されたときに、実行され次のスケジュールが表示されるのだと思いますが、イマイチ理解できていません。
そもそもcron.php自体がちゃんとcronから動いているか確認がまだだったので、この際に確認しようと思います。

あと、YouTubeの場合は、RSSフィードに含まれる一覧の動画は25個ですが、サイトによっては個数は異なります。
この個数だけ新しくノードが作成されますのでその点は意識しておいてください。
YouTubeの場合は、最初は25ノード作成されるでしょうがその後の更新時はどうなるのでしょうか
①追加分だけ新規作成される。※総ノード数=Feedノードの数×各RSSフィードに含まれる記事の数+差分の数
②毎回、既存のノードを削除して新規ノードを作成する。※総ノード数=Feedノードの数×各RSSフィードに含まれる記事の数
③毎回、新規でノードが追加される。※総ノード数=Feedノードの数×各RSSフィードに含まれる記事の数×更新回数
現在の認識では②だと思っていますが、もし③であった場合とんでもないことになりそうなので、しばらく様子を見たいと思います。

とりあえず、今回はここまでです。
レイアウトを編集中で、まだまだやることがいっぱいな状態です。

Drupalバージョン