Raspberry Pi 3 で TV チューナー鯖構築

Raspberry Pi 3 で Mirakurun を動かして TV チューナー鯖にします。

用意するもの
===
- Raspberry Pi 3 Model B
- Ubuntu or Raspbian (kernel 3.16 以上)
- [PX-S1UD V2.0](http://www.plex-net.co.jp/product/px-s1udv2/)
- USB 接触型 IC カードリーダー
- 地上デジタルテレビ放送波が受信できる環境
- TV 用同軸ケーブル

USB 接触型 IC カードリーダーは大体何でも大丈夫ですが、迷ったらこちらを買いましょう。
https://www.amazon.co.jp/dp/B017Y8QV4O/

OS (ディストリビューション) は Raspbian が安定するため、お勧めです。録画中に Raspberry Pi が死んでしまっては、 TV チューナー鯖として致命的なので、特に強いこだわりが無ければ冒険しない方が賢明です。(一度失敗したので…)

ここでは、手元のマシンから SSH で Raspberry Pi 3 に接続可能で、インターネットに繋がっている状態という前提で進めていきます。

⚠免責事項
===
この記事は学術研究目的で記載されています。
学術研究の範囲を逸脱した利用はご遠慮ください。

地上波デジタル放送及び、受信した映像音声データは放送法、著作権法などにより保護されています。インターネットを介した再送信等の行為は犯罪です。取り扱いには十分ご注意ください。

この記事を参考にしたことにより生じたあらゆる損害について、著者は一切責任を負いません。

準備
===
アンテナと B-CAS
---
壁面のアンテナ線差込口と PX-S1UD を TV 用同軸ケーブルで繋ぎ、 PX-S1UD を Raspberry Pi 3 に繋ぎます。

USB 接触型 IC カードリーダーに B-CAS カードを挿入し、 Raspberry Pi 3 に繋ぎます。

どちらのデバイスも、 kernel 3.16 以上であれば標準のドライバで認識される筈です。

### 確認方法
```
$ lsusb | grep VidzMedia
Bus 001 Device 006: ID 3275:0080 VidzMedia Pte Ltd

$ ls /dev/dvb
adapter0
```

ビルド環境構築
---
```
sudo apt -y install build-essential automake pkg-config
```

PX-S1UD firmware のインストール
===
ドライバは kernel に組み込まれていますが、別途 firmware が必要なので配置します。

```shell-session
sudo apt -y install unzip
wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
unzip PX-S1UD_driver_Ver.1.0.1.zip
sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware
```

`PX-S1UD` を抜き差しするか、 Raspberry Pi 3 を再起動します。

再起動すると立ち上がらない場合があるので、モニタを繋げて原因を探りましょう。と言っても kernel で死ぬので、最悪原因を特定できない場合はイメージを焼く所からやり直す方が早いかもしれません。(それでも解決できない場合は、インターネットで検索検索。)

arib25 のインストール
===
B-CAS カードでデコードする際に必要です。

### 必要なパッケージのインストール
```
sudo apt -y install pcscd libpcsclite-dev pcsc-tools
```

#### 確認
```shell-session
pcsc_scan
```

次の表示が出れば認識できています。(Ctrl+Cで停止)

```:標準出力
Japanese Chijou Digital B-CAS Card (pay TV)
```

pcscd が起動していなければ起動します。

```shell-session
sudo systemctl status pcscd
sudo systemctl start pcscd
```

### インストール
```shell-session
cd /usr/local/src
curl -sL https://github.com/stz2012/libarib25/archive/09770e3.tar.gz | sudo tar zxv
cd libarib25-09770e334837f6c67268c41c1c15784373d35e5b
sudo chown -R $(whoami) .
make
sudo make install
```

recdvb のインストール
===
チューナーデバイスを扱うコマンドです。

参考: http://cgi1.plala.or.jp/~sat/?x=entry:entry160313-022002

```shell-session
cd /usr/local/src
curl -sL http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.1.tgz | sudo tar zxv
cd recdvb-1.3.1
sudo chown -R $(whoami) .
./autogen.sh
./configure --enable-b25
make
sudo make install
```

### 確認
```
recdvb --b25 --strip --sid hd 25 10 test.m2ts
```

次のような表示になれば録画に成功しています。

```:標準出力
using B25...
enable B25 strip
pid = 7305
device = /dev/dvb/adapter0/frontend0
Using DVB card "Siano Mobile Digital MDTV Receiver"
tuning to 545143 kHz
polling..ok
SNR: 0

Recording...
Available sid = 1040 1041 1424
Chosen sid    = 1040
Available PMT = 0x110 0x120 0x1fc8
Recorded 10sec
```

`test.m2ts` は [VLC](https://www.videolan.org/vlc/) 等で再生して確認しましょう。

### トラブルシューティング
```
bcas->init failed
Cannot start b25 decoder
Fall back to encrypted recording
```

このような表示が出る場合は、以下の項目を確認してください。

- B-CAS カードが挿入されていない
- カードリーダーが接続されていない
- pcscd.service がインストール、起動されていない
- arib25 がインストールされていない
- recdvb のビルド時に `--enable-b25` オプションが指定されていない

Mirakurun と Rivarun のインストール
===
Node.js
---
Mirakurun は Node.js 6.5.0 以上 (7.0.0 未満) で動作します。

```shell-session
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
```

pm2
---
pm2 は Node.js で書かれたアプリケーション用のプロセスマネージャーです。

```shell-session
sudo npm install pm2 -g
```

Mirakurun と Rivarun
---
Rivarun は Mirakurun の client です。
Mirakurun と同一の物理マシンにインストールする必要はありませんが、動作確認の為に入れます。

この情報は古くなる可能性があるため、基本的に**公式ドキュメントを参考にしてください。**
https://github.com/Chinachu/Mirakurun
https://github.com/Chinachu/Rivarun

```
sudo npm install mirakurun -g --unsafe --production
sudo npm install rivarun -g
```

Mirakurun の設定
---
```shell-session
sudo mirakurun config tuners
```

`PX-S1UD` 用の設定を追記します。
※ `--sid` オプションを指定すると失敗するので注意。

```yaml
- name: PX-S1UD-1
  types:
    - GR
  command: recdvb --b25 --strip <channel> - -
```

Mirakurun を再起動します。

```shell-session
sudo mirakurun restart
```

Mirakurun のログを確認します。

```shell-session
sudo mirakurun log server
```

ログの実体は `/usr/local/var/log/` にあります。

### トラブルシューティング
次のようなエラーが出ている場合は tuners の設定に不備がある可能性が高いです。

```:標準エラー出力
2016-08-28T12:05:14.909Z error: ChannelItem#'NTV' service scan has failed [Error: stream has closed before get services]
```

### 確認
```shell-session
rivarun --ch GR/25 10 test.m2ts
```

次のような表示になれば成功です。

```:標準出力
status: 200
headers: {"server":"Mirakurun/1.4.1","date":"Sat, 27 Aug 2016 15:26:11 GMT","connection":"close","transfer-encoding":"chunked"}
```

リモートから Rivarun を使う際は Mirakurun で TCP 接続を有効(デフォルトで有効)にし、 `--mirakurun` オプションを指定して実行します。

```shell-session:実行例
rivarun --mirakurun 192.168.0.100:40772 --ch GR/25 10 test.m2ts
```

PX-S1UD を2つ以上刺してマルチチューナー環境にする
===
PX-S1UD は Amazon で5,000円もしないので、手軽に同時試聴(録画)チャンネルが増やせます。

必要な物
---
- PX-S1UD
- __分配器__ (分波器ではないので注意)

分配すると信号が弱まるので、別途増幅器(ブースター)が必要になる場合があります。

PX-S1UD 増設
---
既に1つ認識されていれば、特に意識すること無く USB ポートに繋ぐだけです。

### 確認
```shell-session
ls /dev/dvb
```

この結果が次のようになれば認識されています。

```
adapter0  adapter1
```

次のコマンドを同時に実行して、同時に録画できるチャンネルが増えているか確認してみてください。

```shell-session
recdvb --b25 --strip --dev 0 --sid hd 24 10 test0.m2ts
```

```shell-session
recdvb --b25 --strip --dev 1 --sid hd 25 10 test1.m2ts
```

`--dev` オプションで 0 から始まる数字を指定することで使用するチューナーデバイスを選択できます。
この数字は `/dev/dvb/adapter0`, `/dev/dvb/adapter1` の `0` や `1` と対応しています。

Mirakurun の設定変更
---
チューナーの設定を少しだけ変更する必要があります。

```shell-session
sudo mirakurun config tuners
```

```yaml
- name: PX-S1UD-1
  types:
    - GR
  command: recdvb --b25 --strip --dev 0 <channel> - -
- name: PX-S1UD-2
  types:
    - GR
  command: recdvb --b25 --strip --dev 1 <channel> - -
```

### 確認
物理的なチューナーデバイスの割当は Mirakurun が抽象化してよしなに処理してくれるので、 `rivarun` コマンドを叩く時は物理チューナーデバイスを意識することは殆どありません。

次のコマンドを同時に実行して確認できます。

```shell-session
rivarun --mirakurun 192.168.0.100:40772 --b25 --priority 1 --ch GR/24 10 test24.m2ts
```
```shell-session
rivarun --mirakurun 192.168.0.100:40772 --b25 --priority 1 --ch GR/25 10 test25.m2ts
```

最後に
===
Mirakurun のお陰でリモートから録画コマンドが使えるようになり、非常に便利になりました。

Raspberry Pi 3 でも動くので、諭吉1人分で録画環境が構築できます。素晴らしい時代ですね。

これで、 TV チューナーの環境は整ったのですが、録画や視聴をするためには Chinachu を利用するのが便利です。

Chinachu は開発が活発なため、**導入方法は公式サイトを参考にすることが強く推奨されています。**
https://chinachu.moe/

参考 LINK
===
- https://blog.lablus.com/2015/03/10/162702/
- http://cgi1.plala.or.jp/~sat/?x=entry:entry140127-152301
- https://github.com/stz2012/libarib25