mbedとニコニコ検索APIで新着動画表示器を作った

前回の記事で作成した、mbedでheroku上のデータを有機ELモジュールに表示するというデバイスの続きです。

今回は、heroku上のアプリケーションからニコニコ新検索βのAPI(以下、ニコニコ検索API)を叩いて、カテゴリごとの新着動画を取得して表示できるようにします。

全体の構成

mbed <-> heroku <-> ニコニコ検索API

上記のようにmbedからheroku上のアプリケーションへアクセスし、さらにそのアプリケーションからニコニコ検索APIを叩くという構成です。

herokuを挟まずにmbedから直接ニコニコ検索APIを叩くという方法もできると思いますが、文字コード変換やJSONのパースなど、面倒なことが多そうだったので、こういう構成にしています。

  • herokuでやっていること

    1. ニコニコ検索APIを適切なパラメータで叩いてデータを取得する。
    2. 取得したデータのパース。
    3. 表示する形式に加工して出力。
  • mbedでやっていること

    1. heroku上のアプリケーションへアクセスしデータの取得。
    2. 取得したデータを有機ELモジュールへ表示。

heroku上のアプリケーションの作成

heroku上のアプリケーションでやることは先ほど述べた以下の3つの処理です。

  1. ニコニコ検索APIを適切なパラメータで叩いてデータを取得する。
  2. 取得したJSONデータのパース。
  3. 表示する形式に加工して出力。

1については、APIガイドを参照してもらうのが早いです。

例えば以下のようなリクエストボディを指定してAPIへPOSTすると、レスポンスが返ってきます。

リクエストボディ例:

{
  "query" : "ニコニコ技術部",
  "service" : ["video"],
  "search" : ["tags"],
  "join" : ["cmsid", "title", "start_time"],
  "from" : 0,
  "size" : 1,
  "sort_by" : "start_time",
  "order"  : "desc",
  "issuer" : "apiguide",
  "reason" : "mbed"
}

レスポンス例:

{"dqnid":"0de8aa15-90ba-47d2-a61c-7da950bbe3bc","type":"stats","values":[{"_rowid":0,"service":"video","total":29260}]}
{"dqnid":"0de8aa15-90ba-47d2-a61c-7da950bbe3bc","endofstream":true,"type":"stats"}
{"dqnid":"0de8aa15-90ba-47d2-a61c-7da950bbe3bc","type":"hits","values":[{"_rowid":0,"cmsid":"sm24113085","start_time":"2014-07-29 11:13:21","title":"【物理エンジン】 骨付きSoftBodyによる挙動制御"}]}
{"dqnid":"0de8aa15-90ba-47d2-a61c-7da950bbe3bc","endofstream":true,"type":"hits"}

他のカテゴリの新着動画を検索するときは、上記のリクエストボディ例のニコニコ技術部の部分を各カテゴリタグに変えてリクエストすればOKです。

2については、レスポンス例を見ると3行目に表示に必要な動画情報が入っていることがわかります。 その3行目のvaluesのキーの中に配列が入っており、その各要素が1つの動画情報になっています。

今回は最新の1つが取れればいいので、配列の要素は1つだけです。 複数取得した場合は、この配列の中に複数要素が入ることになります。

3については、動画情報の中のcmsidtitle、検索の際に指定したカテゴリタグを使って以下のような形式に加工します。

sm24113085|ニコニコ技術部|【物理エンジン】 骨付きSoftBodyによる挙動制御

カテゴリタグは表示領域の関係から半角カタカナにしています。

また、有機ELモジュールのライブラリはShift-JISのみの対応となるので、カテゴリタグとタイトルについては文字コードをShift-JISへ変更しておく必要があります。

さらにタイトルには、HTMLエンティティ(&amp;など)が含まれるため、これをデコードする処理が必要になります。

以上の処理を入れてheroku上で動くようにしたコードは以下のリポジトリに公開しています。

mia-0032/nico-category-recent-videos-for-mbed · GitHub

mbedのプログラム

mbedのプラグラムは前回の記事からいくつか変更を行っています。

大きな変更としては、heroku上のアプリケーションにアクセスするときに、カテゴリ名を指定できるようにしました。 8秒ごとに次のカテゴリに切り替わるようにしています。

他にも有機ELモジュールで表示できる文字数に文字列を制限したり、いくつかの定数の切り出しなどの変更を行っています。

インポートしているライブラリは前回の記事と同じく以下のライブラリです。

またmbedと有機ELモジュールの接続も前回と同じ接続です。

有機ELモジュール <-> mbed

1(VDD) <-> VOUT

2(VSS) <-> GND

4(RS) <-> p24

6(E) <-> p26

11(DB4) <-> p27

12(DB5) <-> p28

13(DB6) <-> p21

14(DB7) <-> p22

書き込んでいるコードは以下に記載しています。

ニコニコ動画新着動画表示器

your-app.herokuapp.comの部分は自分のサーバーに書き換えて使ってください。

mbedに書き込むと、以下のようにカテゴリごとの新着動画が表示されます。 8秒ごとに次のカテゴリになり、また一周すると最初のカテゴリに戻ります。

f:id:mia_0032:20140728001404j:plain

f:id:mia_0032:20140728001436j:plain

最初、mbedのループ処理の中でEthernetの初期化〜クローズしていたらうまく動かなくて、だいぶ悩みました。 ループの外に出してやると、うまく動くようになりました。 原因はよくわかっていません。

感想

有機ELモジュールの色がとても良いです。キャラクタ液晶のフォントのレトロ感も相まって、雰囲気の良いものができました。

もう少し拡張しようかと思っていましたが、このデバイスはこれでシンプルかつコンパクトにまとまったので、ケースに入れようと思っています。