読者です 読者をやめる 読者になる 読者になる

メモ帳DPA

ぐぐってあまり引っかからないような何かがあったら書いたりする

PC TV with nasneとニコニコ実況の時刻合わせを半自動化する

webサービス ガジェット 制作物

背景

TV録画にnasneを使っている。
PCからはPC TV with nasneで視聴しているが、torneにあるような実況連動機能がない。

素直にtorneを使えば済むことではあるのだけれど、コントローラに持ち替え、映像出力を切り替え、PSとtorneの起動を待ち...という動作が都度発生するのも面倒に思える。
Androidエミュレータtorne mobileを動かすことも考えたが、どれもnasneの認識がうまくいかなかった。

課題

現実的な方法としては、ニコニコ実況アプリ起動して再生画面に重ねる方法がある。
しかし、過去ログを参照する場合は、以下のようなフォームで6箇所も手動で正しい値を都度合わせる必要があり、時刻合わせがかなり面倒だった。これを常用しようとは思えない。
f:id:de0:20161025202714j:plain
過去ログはおまけ機能であって基本はリアルタイムで使えということなのかもしれないけど、番組表から選択するとか時刻ピッカー的な物付けるとかもうちょっと何とかならなかったんだろうか。

ニコニコ実況の仕様

まずフォームを調べてみた。
過去ログ呼び出しは上記のフォームから時刻指定してpostすると、以下のURLスキームが返され、それをローカルで叩くことで実況アプリが起動するようだった。わかりやすい。

nicojk:jk【チャンネルID】&start_time=【指定時刻のunix時間】&end_time=【指定時刻+1h後のunix時間】

例
nicojk:jk7&start_time=1477326840&end_time=1477328640

nasneapi

nasneにはapiが用意されており各種情報が拾えるようになっているらしい。仕様自体は非公開ではあるものの、自力で調べた人達のおかげで主要なところは判明してるようだ。

参考
github.com


再生中情報

"/status/dtcpipClientListGet" を叩いたら再生中の動画IDが拾えた。なお何も再生していない場合は何も帰ってこない。

$ curl -s "http://192.168.1.2:64210/status/dtcpipClientListGet" | jq -M '.'
{
  "errorcode": 0,
  "number": 1,
  "client": [
    {
      "id": 871,
      "macAddr": "BC:5F:F4:xx:xx:xx",
      "ipAddr": "192.168.1.1",
      "name": "PC TV Plus",
      "purpose": 2,
      "content": {
        "id": "14772275870000000213" ←再生中の動画ID
      },
      "encryptType": 1
    }
  ]
}

参考
pocketstudio.jp



動画情報

"/recorded/titleListGet"から録画済みのデータが参照できた。上記で取得したIDで検索すると再生中の各種動画情報が得られた。

$ curl -s 'http://192.168.1.2:64220/recorded/titleListGet?searchCriteria=0&filter=0&startingIndex=0&requestedCount=0&sortCriteria=0&withDescriptionLong=0&withUserData=0' \
 | jq -M '.item[] | select(.id == "14772275870000000213" )'
{
  "id": "14772275870000000213",
  "title": "SHOW BY ROCK!!#",
  "description": "#4「ドキィッ!?がーるずだらけのふわっふわ水泳大会!ですぞ?ポ(以下略)」",
  "startDateTime": "2016-10-23T21:59:47+09:00",  ←使う箇所1
  "duration": 1696,
  "conditionId": "w7",
  "quality": 101,
  "channelName": "TOKYO MX1", ←使う箇所2
  "channelNumber": 90910,
  "broadcastingType": 2,
  "serviceId": 23608,
  "eventId": 51728,
  "genre": [
    {
      "id": 28927,
      "type": 2
    }
  ],
  "audioInfo": [
    {
      "componentTag": 16,
      "componentType": 3
    }
  ],
  "captionInfo": 0,
  "componentType": 179,
  "protectFlag": 0,
  "newFlag": 0,
  "playCount": 5,
  "creatorId": 133072,
  "storageId": 0,
  "recordingFlag": 0,
  "copyControl": 1,
  "copyCount": 10,
  "parentalRating": 0,
  "resumePosition": 278212,
  "containerSize": {
    "main": 1479377904,
    "mobile": 387858480,
    "thumb": 19703308
  },
  "bitrateMobile": 0
}

参考
tateren.hateblo.jp


完成

channelNameとstartDateTimeが動画情報に有るので、抽出してこれを元に整形すれば呼び出し用のURLスキームが作れる。

#!/bin/bash
NASNEADDR=192.168.1.2


#再生中の動画ID取得
CONTENTID=\
`curl -s "http://$NASNEADDR:64210/status/dtcpipClientListGet" \
| jq '.client[0].content.id'`

if [[ "$CONTENTID" == "null" ]];then
        exit 1
fi


#動画情報取得
CONTENTINFO=\
`curl -s "http://$NASNEADDR:64220/recorded/titleListGet?searchCriteria=0&filter=0&startingIndex=0&requestedCount=0&sortCriteria=0&withDescriptionLong=0&withUserData=0" \
| jq -M ".item[] | select(.id == $CONTENTID )" `

CHANNELNAME=`echo $CONTENTINFO | jq -r -M '.channelName'`

# IDに変換 ( ref: http://jk.nicovideo.jp/rankings )
case "$CHANNELNAME" in
        *NHK* ) CHANNELID=1;;
        *Eテレ* ) CHANNELID=2;;
        *日テレ* ) CHANNELID=4;;
        *ビ朝日* ) CHANNELID=5;;
        *TBS* ) CHANNELID=6;;
        *ビ東京* ) CHANNELID=7;;
        *フジテ* ) CHANNELID=8;;
        *MX* )   CHANNELID=9;;
        *テレ玉* ) CHANNELID=10;;
        *TVK* ) CHANNELID=11;;
        *チバテ* ) CHANNELID=12;;
esac


# 時刻変換
DATETIME=`echo $CONTENTINFO | jq -r -M '.startDateTime'`

STARTTIME=`date -d "$DATETIME" +%s`
ENDTIME=`date -d "$DATETIME 1 hour" +%s`


# URLスキーム生成
echo "nicojk:jk${CHANNELID}&start_time=${STARTTIME}&end_time=${ENDTIME}"


Windowsから叩けるようにしたら完成。
バッククォートが使えないことはbatの最低ポイントの一つであると思う。

@echo off

cd %~dp0

set ADDR=192.168.xx.yy
set KEY=ubuntu_privatekey.ppk
set USR=root

for /f %%a in ('ssh %USR%@%ADDR% -i %KEY% nasne2nico.sh') do start %%a


PC TV~ で動画を再生しbatを実行すると、時刻合わせされたニコニコ実況アプリが起動する。

制約

  • batは再生開始後に手動で叩く必要がある (ここ自動化するのは結構手間かかりそうなので妥協する)
  • 開始時刻しか拾えないのでリジュームは使えない
  • 停止や早送り巻き戻しもずれるので使えない

おわり

公式に機能をつけてくれ頼む