【2022年版】Raspberry Pi 4とChinachuで録画サーバーを立てる

# はじめに
Chinachuを使って、ここ2年ほど録画サーバーを運用していました。2022年1月に、Raspberry Piの新しいOS「Bullseye」の安定版がリリースされました。OSのアップデートでは、MicroSDを書き直す必要があり、その再構築をした記録です。

以下の記事を参考に、2022年の環境での違いなどを交えつつ書いていきます。
[Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築](https://qiita.com/tomtwinkle/items/99fe34140fa5b1a70e7b)
[知識0からRaspberryPi4で録画機を作る！](https://zenn.dev/ryomm/articles/332bf27f8561da)

# おねがい
他の記事でも言われていることですが、自己責任でサーバーの構築をしてください。
趣味の範囲で、個人的な利用をお願いします。
テレビ番組のコピーや配信は違法になることがあリます。よく注意をして使ってください。
生じた損害に対して、筆者は一切の責任を負いません。

# EPG StationとChinachu どっちがいい？
はじめ、Dockerを使ったEPG Stationをインストールしてみました。色々な方法でトライしましたが、うまくいきませんでした。(ラズパイごとダウンしたり)参考にしたサイトではubuntuやCent OSを使っていました。ラズパイはスペック的に非力なので、Dockerを使うのは難しいと思いました。
結論として、ラズパイを録画サーバーにするのであれば、**Chinachu**を使うことをおすすめします。


# 使うもの
- Raspberry Pi 4 ModelB
- PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0(同時に1チャンネルの録画ができる。4チャンネル同時にできる、PX-Q1UDもある。)
- SCM ICカードリーダー／ライター SCR3310/v2.0
- B-CASカード
- アンテナケーブル
- HDD(何TBでも)
- 構築用のPCやWi-Fi環境など

# 準備
### セットアップ
この記事で分かりやすく、解説されています。
[Raspberry Pi 4 スタートガイド【2021】セットアップと初期設定](https://raspida.com/rpi-setup2021)
★ OSはFULLバージョンのインストールをお勧めします。

### キーボードの日本語入力の設定
[Raspberry Piに日本語で入力できる設定方法（fcitx-mozc）](https://raspida.com/install-rpi-ime) で丁寧に解説されています。
※ OSをFULLバージョンでインストールした場合は、設定のみを行います。

### セキュリティ対策
ユーザー名やパスワードの変更、ファイアウォールを敷く、SSHは公開鍵認証で通す…などがあります。実際にNASAでは、ラズパイを踏み台にサイバー攻撃がありました。大ごとにならなくても、念を入れておきたいですね。

以下の記事を参考に、ぜひ設定してください。
[買ったらまず実施！RaspberryPiのセキュリティ対策](https://qiita.com/c60evaporator/items/ebe9c6e8a445fed859dc)
[デフォルトだと危険！Raspberry Piの初期セキュリティ対策やってみた](https://liginc.co.jp/542583)

### ムダな処理を減らしたければ…
**スワップの無効化**

```
sudo swapoff --all
sudo apt remove dphys-swapfile -y
sudo sed -i 's/$/ coherent_pool=4M dwc_otg.host_rx_fifo_size=2048/' /boot/cmdline.txt
sudo sed -i 's/^CONF_SWAPSIZE=100/CONF_SWAPSIZE=1024/' /etc/dphys-swapfile
sudo apt autoremove
```

**ログの最小化**

```
sudo nano /etc/rsyslog.conf
```

ファイル中ほどの部分を、以下のように一部コメントアウトします。

```
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
#kern.*                         -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
#mail.*                         -/var/log/mail.log
#user.*                         -/var/log/user.log
```
# 1. sambaのセットアップ
録画したものをPCで見るときなどに使います。

### インストール
```
sudo apt-get update
sudo apt-get install samba
```
### 設定
```
sudo nano /etc/samba/smb.conf
```

ファイルの一番下の行に、このように入力します。

```
[rspi]
   comment = Raspberry Pi Share
   path = /mnt/recorded
   guest ok = yes
   read only = no
   browsable = yes
   force user = <ユーザ名>
```

```force user``` のパスワードを設定します。

```
sudo smbpasswd -a <ユーザー名>
```

sambaを再起動し```Active(正常)```か確認します。

```
sudo systemctl restart smbd
sudo systemctl status smbd
```

PCからリモートアクセスをしてください。
Macの場合は、Finderを開き ```command + K```でサーバへの接続画面となります。```smb://<ラズパイのIPアドレス>```と入力し、接続できます。

# 2. チューナーのドライバのインストール
```
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/
rm PX-S1UD_driver_Ver.1.0.1.zip
rm -rf PX-S1UD_driver_Ver.1.0.1
```
チューナーが正しく認識されているか、次のコマンドで確かめます。

```
dmesg | grep PX-S1UD
```

<font color="SaddleBrown">[    2.896943] usb 1-1.4: Product: PX-S1UD Digital TV Tuner</font> のような表示が返って来ればOK。

# 3. 外付けHDDのマウント
### USBを接続
以下のコマンドで認識されているか調べます。

```
sudo fdisk -l
```

ここで、```/dev/sda1```などと認識されていることをチェックします。

```
Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1        2048 1953525167 1953523120 931.5G 83 Linux
```

### マウント
```
sudo mkfs.ext4 /dev/sda1
sudo mkdir /mnt
sudo mount /dev/sda1 /mnt
```

そして、mntフォルダへのアクセスを許可します。

```
sudo chown 1000:1000 /mnt
```

### 再起動時の自動マウント設定
HDDの```PARTUUID```を調べます。

```
sudo blkid /dev/sda1
```

このように出力されるので、```PARTUUID```をコピーしてください。

```
/dev/sda1: UUID="6c3d3bef-405e-41b4-ay4b-4b1cf71a11c8" BLOCK_SIZE="4079" TYPE="ext4" PARTUUID="d1b117d7-01"
```

<font color="Crimson">★ UUIDではなく、PTUUIDが出力されることがあります。この場合は、HDDのUSBを挿し直したり、ラズパイの再起動を試してください。</font>

fstabに設定を追加します。

```
sudo nano /etc/fstab
```

ファイルを開き、以下のように、付け加えます。

```
PARTUUID=<コピーしたPARTUUID>  /mnt            ext4    defaults,nofail   0       0
```

### マウントのチェック

一旦、再起動してから確認をします。

```
sudo reboot
df -h | grep /mnt
```

こんな感じでmntのディレクトリに、外付けHDDがリンクされていればOK。

```
/dev/sda1        916G  276G  595G   32% /mnt
```

# 4. カードリーダーとB-CASカード
### ドライバをインストール
```
sudo apt-get install build-essential git
sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
```
### USBを接続し、型番の確認
```
lsusb | grep SCM
```

カードリーダーが認識していると、次のように表示されます。

```
Bus 001 Device 003: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader
```

<font color="Crimson">★ 認識しない場合は、```lsusb```コマンドのみで実行、USBを抜く、または再起動をお勧めします。</font>

### B-CASカードの認識確認
```
sudo pcsc_scan
```

一番下に、このような表示が出れば成功です。

```
Japanese Chijou Digital B-CAS Card (pay TV)
```

```control + C```で実行を終了します。
<font color="Crimson">★ ```Scanning present readers...```で止まっている場合は、```control + C```で実行を中止し、USBやB-CASカードを抜いてみると良いかもしれないです。</font>


### B-CASのデコード用ライブラリのインストール
暗号化された放送データをlibarib25で復号します。

```
sudo apt-get install cmake g++ libpcsclite-dev
wget https://github.com/stz2012/libarib25/archive/master.zip -O libarib25.zip
unzip libarib25.zip
rm libarib25.zip
cd libarib25-master
cmake .
make
sudo make install
```

# 5. 録画用コマンドツールのインストール
```
cd
sudo apt install automake
wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
tar xvzf recdvb-1.3.2.tgz
cd recdvb-1.3.2
./autogen.sh
./configure  --enable-b25
make 
sudo make install
```

### 試しに録画
その前に…録画したファイルの保存フォルダを作成しておきます。

```
sudo mkdir /mnt/recorded
ls /mnt
```

```ls /mnt```で、recordedフォルダが作られていることを確認できました。試しに10秒録画をしてみます。
チャンネル番号は、[MASPROのチャンネル一覧](https://www.maspro.co.jp/contact/bro/bro_ch.html)からお住まいの地域のものを調べてください。

```
# recdvb [--dev <チューナ番号>] --b25 --strip チャンネル番号 録画秒数 録画ファイル名
　 recdvb --b25 --strip 22 10 /mnt/recorded/test.m2ts
```

実行して15秒ほどして、```Recorded 10sec```と表示されれば録画できています。sambaなどを使い、再生してみましょう。

# 6. Node.JSのインストール
<font color="Crimson">★ 2022年現在、Node.JSのバージョンが**14.17.0〜16.0.0**でないと、最新のMirakurunは動きません。</font>
私は初め、他の記事にあるようにv10.16.3を入れてみました。しかし、Mirakurunのインストールをする段階で「Node.JSのバージョンを上げるよう」エラーが出ました。

```
sudo apt-get install npm
sudo npm install -g n
sudo n 14.17.0
sudo npm install -g npm
sudo n #14.17.0を選択し、Returnキーを押下
```

Node.JSとnpmのバージョンを確かめます。

```
node -v
npm -v #またはnpm --version
```

Node.JSが```v14.17.0```、npmが```6.14.13```以上であれば問題ありません。
<font color="Crimson">★ ここでエラーが出ていると、Mirakurunのインストールで行き詰まります。ワーニングは良くても、エラーがないかよくチェックしてください。</font>

# 7. Mirakurunの設定
### インストール
Mirakurunは、チューナーの管理などを自動で行うものです。

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

mirakurunのインストールに成功すると、アスキーアート(記号を使ったイラスト)で```PM2```と書かれたものが出てきます。またmirakurunのステータスが表形式で示されます。
<font color="Crimson">★ エラーが出た場合は、一番上のエラーをまずは読むと解決につながることがありました。(例えば、Node.JSのバージョンが古いなど)

### チューナーの設定

```tuners.yml``` を開く。

```
sudo nano /usr/local/etc/mirakurun/tuners.yml
```

一番下の行に以下を追記する。

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

### チャンネルスキャン
```
curl -X PUT "http://<ラズパイのIPアドレス>:40772/api/config/channels/scan
```

15分以上かかります。
``` -> no signal. [Error: 〜``` と表示されるチャンネルがありますが、いつも見ているチャンネルの放送局名(TBSなど)が認識されていれば問題ないです。　

# 8. Chinachuの設定
スマホやPCから簡単に録画ができるようにする、録画サーバーです。
### インストール
```
sudo apt-get install build-essential curl git-core vainfo
git clone git://github.com/kanreisa/Chinachu.git /mnt/chinachu
cd /mnt/chinachu
./chinachu installer
```

```1.Auto ``` を選択し、Chinachuをインストールします。
<font color="Crimson">★ インストールには2~3時間を要します。PCからSSHで実行すると、セッションがタイムアウトし、インストールが上手くいかないことがありました。ラズパイをTVやモニターにつなぎ、そこから実行すると確実です。

### 初期設定
```
# /mnt/chinachu の位置で実行
cp config.sample.json config.json
sudo nano config.json
```

以下のように変更します。

```
"uid": <実行ユーザー名>,
"recordedDir" : "/mnt/recorded/",
"wuiOpenHost": "0.0.0.0",
"recordedFormat": "<title> <subtitle> <episode>[<channel-name>][<date:yymmdd-HHMM>].m2ts",
```

録画ファイルの初期設定をします。

```
cd /mnt
sudo chown <ユーザー名>:video /mnt/chinachu #権限を付与する
ls -la
 # chinachuの行 左から3つ目が <ユーザー名> video になっているかチェックする
echo "[]" > rules.json
```

### Chinachu起動
```
cd /mnt/chinachu/
./chinachu service wui execute
```

ログがエラーなく出たら、```control + C ``` で停止します。
次に、サービスの登録などをします。

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

ステータスの確認
```
sudo mirakurun status
```

このように、**3つ認識**され、**statusが全てonline**であれば正常です。

```
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 2  │ chinachu-operator  │ fork     │ 0    │ online    │ 0%       │ 54.6mb   │
│ 1  │ chinachu-wui       │ fork     │ 0    │ online    │ 0%       │ 176.8mb  │
│ 0  │ mirakurun-server   │ fork     │ 2    │ online    │ 0%       │ 77.8mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘
```

### 番組表の自動更新
```
./chinachu update
```

### ブラウザから開いてみる
このアドレスでアクセスする。
```
http://<ラズパイのIPアドレス>:20772/
```
![chinasc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549741/ad735076-f543-4116-e6ad-c695d63d0348.png)

#### Chinachu 機能の要約
- １週間先まで番組の予約ができる
- 番組表は見たいチャンネルのみに選択できる
- ルール機能で番組を登録すると、その番組を自動で録画してくれる (再放送は除くなど細かく条件を決められる)
- 左側 縦に並んだバーから、システムの情報が得られる
- 上から2番目：ステータス 動作しているかどうか
- 上から3番目：ログ Operatorでjsonの情報、SchedulerからMirakurunの動作について
- 上から4番目：ストレージ 外付けHDDの使用状況

ラズパイと同じWi-Fiに繋がっていれば、スマホから録画ができ便利です！

# 課題
- mp4に簡単にエンコードできるようにしたい
- たまにラズパイごとダウンしていることがある→更なる安定性

# さいごに
OSをアップデートしてから、chinachuの運用まで1週間ほどかかりました。エラーにより、ビルドがうまくいかないなど、よく起こりました。楽しみつつ、粘り強く、構築する大切さを学びました。

# 参考サイト
[Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築](https://qiita.com/tomtwinkle/items/99fe34140fa5b1a70e7b)
[知識0からRaspberryPi4で録画機を作る！](https://zenn.dev/ryomm/articles/332bf27f8561da)
[Raspberry Pi 4とdocker-mirakurun-epgstationで録画サーバーを構築する (2021年4月版)](https://blog.ch3cooh.jp/entry/2021/04/06/200732)
[Chinachuインストール手順 - GitHub](https://github.com/Chinachu/Chinachu/wiki/Gamma-Installation-V2)
[Mirakurunインストール手順 - GitHub](https://github.com/Chinachu/Mirakurun/blob/master/doc/Platforms.md#linux)