nasneのエラーを監視してslackに通知するツールを作った

nasneを使って毎週録画とかにしてると、たまに放送時間がずれて番組が被ったり番組情報を取得できなくなったりしますよね。 毎週手動でチェックするのもしんどいので、slackとかに通知したいなーと思って作ってみました。

www.npmjs.com

github.com

インストール

npmとして公開してるので簡単にインストールできます。 Node.js v6.0以上が必要になります。

$ npm install nasne-checker -g

起動

$ nasne-checker --nasne 192.168.10.10 \
  --slack https://hooks.slack.com/services/XXX/XXX/XXXXX \
  --interval 24
  • --nasne: nasneのホスト名(またはIPアドレス)を指定
  • --slack: slackのWebhook URLを指定
  • --interval: 予約エラーをチェックして投稿する間隔

Webhook URLの取得方法は以下のサイトが参考になると思います。 また、アイコンやbotの名前を設定しておいてください。

support.smrtbeat.com

このコマンドで実行した場合、24時間ごとに予約エラーがチェックされるようになります。 定期的にチェックしたい場合は、Raspberry Piなどを常時起動させておいて実行するといいと思います。

エラーなどがあると下の画像のようなメッセージが投稿されます。 この画像にはありませんが、HDDの容量が少なくなった場合もエラーメッセージが投稿されます。

f:id:abcang:20160901223207p:plain

開発のお話

nasneには一応APIがあるので、それを利用しています。

ざっくり使ってみたい人は下のリポジトリを見てみるといいと思います。 (今回作ったツールでは最終的に自前で実装しましたが)

github.com

予約エラーの判断方法

今回ツールを作る上でググっても全然情報が出てこなかった、予約エラーの判断方法について書いておこうと思います。 まず、予約一覧の情報は/schedule/reservedListGetを使って取得します。

http://(nasneのIPアドレス):64220/schedule/reservedListGet?searchCriteria=0&filter=0&startingIndex=0&requestedCount=0&sortCriteria=0&withDescriptionLong=0&withUserData=1にアクセスすると以下のようなJSONが取得できます。(長いので一部省略)

{
  "errorcode": 0
  "item": [
    {
      "id": "14593626670000000138",
      "title": "シネマクラッシュ『コマンドー』",
      "conflictId": 0,
      "eventId": 59729,
      ...
    },
    ...
  ],
  "numberReturned": 24,
  "totalMatches": 24
}

このJSONitemの配列が予約情報の本体となります。 予約情報にはidtitleなどの情報があります。(他にどんなものがあるのか知りたい人は自分の目で確かめてください)

予約エラーのチェックで重要になるパラメータはconflictIdeventIdの2つです。

conflictIdからはその名の通り予約の衝突していることが判別可能です。 conflictIdが0のときは衝突がありません。 1以上の場合は衝突が起きていることを表します。 この時、衝突しているもう一方の予約情報のconflictIdも1以上になります。

1以上の値は、録画の優先順位を意味します。 例えば、予約Aが1で予約Bが2の場合は、予約Aが優先的に予約される形になります。 どの予約と衝突しているかを調べるには、おそらく/schedule/conflictListGetを使えばいいと思います。 (あまり調べてないので正しいかわからないですが)

次にeventIdです。 このパラメータでは繰り返し予約の番組が見つからなかった場合を判別することができます。 繰り返し予約の番組が見つからなかった場合、eventIdの値は65536になります。 このパラメータが何を示すものかは分かっていませんが、 2つの番組で繰り返し予約の番組が見つからなかった場合を検証したので多分合っていると思います。

このツールではconflictIdeventIdをチェックして予約エラーかどうか判断しています。

エンドポイントや送信するパラメータの調べ方

nasneのクライアントアプリはAPIにアクセスして情報を取得しています。 しかも、APIはhttpなので、パケットキャプチャをすれば見放題なわけです。

PC TV Plusやtorne mobileなどのクライアントアプリを動作させることで、 エンドポイントや送信するパラメータなどを調べることができます。

今回はiPhone上でtorne mobileを動作させてキャプチャしてみました。 iPhone上でのパケットキャプチャは以下の記事が参考になりました。

qiita.com

Wiresharkのフィルタにhttp and ip.addr == nasneのIPアドレスを指定してあげるといい感じに見れます。

f:id:abcang:20160901235348p:plain

おわりに

nasneAPIをうまく使えば自動録画機能とかも作れるかもしれませんね。 (番組情報の取得は別APIを使う必要がありそうですが)

予約エラーに気づかず録画失敗してしまう経験をしたことがある人は、 是非今回のツールを使ってみてください。

www.npmjs.com

github.com

nasne 1TBモデル (CECH-ZNR2J01)

nasne 1TBモデル (CECH-ZNR2J01)