録画サーバーをChinachuに更新した時の備忘録

#EpegrecからChinachuへ
数年前に組んだPT2の録画サーバーはEpgrecを使っていたが、さすがに時代遅れもいいところなのでHDDの入れ替えついでにChinachuへ移行することにした。使用環境は CentOS 6.9。

#準備
標準リポジトリの gcc 及び g++ は 4.4.x と少々古く C++11 をサポートしていない。導入スクリプトが失敗してしまうので 4.8 とか 4.9 を入れておく。
またgitも必要になるが、これもやはり 1.x 系の古いやつが入る。yum に IUS リポジトリを追加するなどして 2.x 系を入れる。
それぞれ分かりやすい導入記事がたくさんあるので、ここでは手順を割愛。

#recpt1
DVBはCentOS 7からなので、DVB版ドライバの導入はなし。カーネルの更新の度に再ビルドが必要になって面倒だったのだが仕方ない。なので録画も引き続きrecpt1で行う。

##Node.js
現行のRivarunが要求するNode.jsは8.9.4以上9未満。yumで普通に入れると恐ろしく古いバージョンがやって来るので、nvmを使って任意のバージョンを入れる。バージョンの切り替えが簡単に行えるのが良い点なのだが、これが後で役に立つことに。

```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm install v8.12.0
```

#Rivarun ＆ Mirakurun
pm2はプロセスマネージャー。自動起動とかを管理してくれる。

```
root# npm install pm2 -g
root# npm install mirakurun -g --unsafe --production
root# npm install rivarun -g
root# npm install arib-b25-stream-test -g --unsafe
```

###チューナー設定

```
root# mirakurun config tuners
```

command の DevicePath を /dev/ の中を確認して適宜変更。isDisabled は false にしておかないとデバイスが無効になる。
PT2は二枚刺ししているので、下記の設定をもう1セット用意した。

```
- name: PT2A-S1
  types:
    - BS
    - CS
  command: recpt1 --device /dev/pt1video0 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2A-S2
  types:
    - BS
    - CS
  command: recpt1 --device /dev/pt1video1 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2A-T1
  types:
    - GR
  command: recpt1 --device /dev/pt1video2 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2A-T2
  types:
    - GR
  command: recpt1 --device /dev/pt1video3 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
```

###チャンネル設定

```
root# mirakurun config channels
```

チャンネルスキャンもできるが時間がかかるようなので、epgrec の config を元に自分で書いた。

###動作確認

一通り設定したらサービスを再起動し、EPGが更新されるのを待つ。

```
root# mirakurun restart
```

rivarun コマンドを叩いてチャンネル情報が取れていればOK。

```
root# rivarun --list | sed 's/},/},\n/g'
status: 200
headers: {"server":"Mirakurun/2.7.1","content-type":"application/json; charset=utf-8","date":"Wed, 26 Sep 2018 06:55:56 GMT","connection":"close","content-length":"3100"}
[{"type":"GR","channel":"24","name":"NHK","services":[{"id":3211240960,"serviceId":40960,"networkId":32112,"name":"ＮＨＫ総合１・大阪"},
{"id":3211240961,"serviceId":40961,"networkId":32112,"name":"ＮＨＫ総合２・大阪"},
{"id":3211241344,"serviceId":41344,"networkId":32112,"name":"ＮＨＫ携帯Ｇ・大阪"}]},
{"type":"GR","channel":"13","name":"教育","services":[{"id":3272102056,"serviceId":2056,"networkId":32721,"name":"ＮＨＫＥテレ１大阪"},
{"id":3272102057,"serviceId":2057,"networkId":32721,"name":"ＮＨＫＥテレ２大阪"},
{"id":3272102058,"serviceId":2058,"networkId":32721,"name":"ＮＨＫＥテレ３大阪"},
{"id":3272102440,"serviceId":2440,"networkId":32721,"name":"ＮＨＫ携帯２"}]},
{"type":"GR","channel":"26","name":"サンテレビ","services":[{"id":3208643056,"serviceId":43056,"networkId":32086,"name":"サンテレビ１"},
{"id":3208643057,"serviceId":43057,"networkId":32086,"name":"サンテレビ２"},
{"id":3208643440,"serviceId":43440,"networkId":32086,"name":"サンテレビ携帯"}]},
*以下略*
```

次に録画できるかをテスト。

```
root# rivarun --b25 --sid 2088 --ch GR/14 10 ./test.ts
```

チャンネル GR/14 のサービスID 2088 を 10 秒間録画するコマンド。チャンネルやサービスの値は先ほどの rivarun コマンドの結果から拾えるので、環境に合わせて適宜変える。

#Chinachu
動作用にroot以外のユーザーが必要。なければ適宜作成する。
録画したファイルはsambaでネットワーク共有しているので、アクセス権で難儀しないようそれ用のユーザーを使い回すことにした。

```
samba# git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
samba# cd ~/chinachu/
samba# ./chinachu installer
samba# Auto を選択
```

録画条件は自分で設定するので、空のルールを入れておく。

```
samba# echo "[]" > rules.json
```

テンプレートをコピーして設定ファイルを作成し、編集。

```
samba# cp config.sample.json config.json
samba# vim config.json
```

とりあえず変えておくべき項目は uid と recordedDir。uid には chinachu 用ユーザーを設定し、recordedDir には録画データの保存パスを入れる。

###起動テスト

```
samba# ./chinachu service wui execute
samba# ./chinachu service operator execute
```

それぞれのコマンドを試し、エラーが出なければOK。その場合制御が返ってこないはずなので、Ctrl+Cで終了させる。

…のだが、後者のコマンドのみ下記のようなエラーを吐いて動作しなかった。

> Error: Module version mismatch. Expected 48, got 57.

ちなみに pm2 から起動させると operator も status=online となり一見問題なく動作するように見えるが、/usr/local/var/log/chinachu-operator.stderr.log にはエラーが記録されており実際には動作していないので注意。

どうも Chinachu が要求する Node.js バージョンは6.11.2であるにも関わらず、実際には別のバージョン（ここでは8.12.0）がChinachuにインストールされていることでエラーになっている模様。
要求される Node.js バージョンは以下のコマンドで確認可能。もし別の値になっていたら、以降は 6.11.2 の部分をその値に読み替える。

```
root# pm2 show chinachu-operator
*中略*
│ node.js version   │ 6.11.2
│ node env          │ production
│ watch & reload    │ ✘
│ unstable restarts │ 0
```

###Chinachuにv6.11.2のNode.jsモジュールを入れる

Node.js の導入方法の問題なのかもしれないが、解決方法が分からなかったので対症療法で解決。
まず nvm で v6.11.2を入れる。動作バージョンを確認し、v6.11.2に切り替わっていることを確認。

```
root# nvm install v6.11.2
root# nvm ls
->      v6.11.2
        v8.12.0
```

chinachu のインストールディレクトリに移動し、node_modules ディレクトリを削除。

```
root@chinachu# rm -rf node_modules
```

続いて再インストール。これで v6.11.2 のモジュールが入る。
なお node_modules 以下の所有権が root になってしまうので、chown しておくか、ユーザーを切り替えて sudo を付けてコマンドを叩いた方がいいかもしれない。

```
root@chinachu# npm install
```

再度コマンドを叩いて動くかどうかを確認。

```
root@chinachu# ./chinachu service operator execute
```

問題が無ければ Node.js のバージョンを元に戻す。

```
root@# nvm use v8.12.0
root@# nvm ls
        v6.11.2
->      v8.12.0
```

諸々も入れ直す。設定は消えていないので大丈夫。

```
root# npm install pm2 -g
root# npm install mirakurun -g --unsafe --production
root# npm install rivarun -g
root# npm install arib-b25-stream-test -g --unsafe
```

###起動テスト（の続き）
Mirakurun から EPG が取れることを確認。

```
root# ./chinachu update
```


###起動設定

pm2 に登録して保存。

```
sudo pm2 start processes.json
sudo pm2 save
```

#動作確認
ブラウザから http://Server-IP:20772 を叩いてウェブページが表示されるかを確認。

#Epgrecの停止
cron に登録してある EPG の更新スクリプトを停止させ、ウェブページ上から録画予約と自動録画キーワードを全て削除すればOK。