EPGStation v2を使ったラズパイ録画サーバー

# 初めに
EPGStationのversion2が出たようです。
基本的には変わらないけど、jsonからymlになったみたい...

UIの変更とかがあったようで試してみたかったので手順を書いとこうと思います。

ついでにnginx使って80ポートでアクセスできるようにもします

# 使用するもの
- RaspberryPi4 8GB
- microSD 16GB
- USBメモリ 32GB SDカードからUSBに替えたかった

録画用
- PLEX PX-S1UD V2.0（TVチューナー [Amazon](https://www.amazon.co.jp/%E3%83%97%E3%83%AC%E3%82%AF%E3%82%B9-PX-S1UD-V2-0-PLEX-USB%E6%8E%A5%E7%B6%9A%E3%83%89%E3%83%B3%E3%82%B0%E3%83%AB%E5%9E%8B%E5%9C%B0%E4%B8%8A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%ABTV%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8A%E3%83%BC/dp/B0141NFWSG)）
- Gemalto IDBridge CT30（カードリーダー [Amazon](https://www.amazon.co.jp/Gemalto-%E3%82%B8%E3%82%A7%E3%83%A0%E3%82%A2%E3%83%AB%E3%83%88-IC%E3%82%AB%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BB%E3%83%A9%E3%82%A4%E3%82%BF-%E5%AF%BE%E5%BF%9C%E4%BD%8F%E5%9F%BA%E3%82%AB%E3%83%BC%E3%83%89%E7%94%A8PC-HWP119316/dp/B003XF2JJY/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=idbridge+ct30&qid=1609604624&s=computers&sr=1-1)）
- 録画用HDD 1TB
- B-CASカード（Amazonで中古でゴニョゴニョ）

# 事前準備
## microSDからUSBに変更
microSDにはRaspberryPiOSが入ってるものとします
初期設定はまぁ、色々調べれば出る

GUI環境でやりますが、説明は書き言葉!

1. 左上のラズパイアイコンから、アクセサリ、SD Card Copierを開く

2. FromにSDカードを選択して, ToにUSBを選択してStart!

3. 終わったら、シャットダウン後

4. microSD引っこ抜いて、USBメモリは挿したまま起動

5. 多分ちゃんと動いてるでしょう（おい）

USBでなくともHDDにしたいならUSBの代わりにやればOK!

## 録画用HDDをマウントさせる
事前にフォーマットはexFATにしているものとします

#### とりあえずexFATを認識させる

```shell
sudo apt-get update
sudo apt-get upgrade

sudo apt-get install exfat-fuse exfat-utils
```
#### HDDをマウントさせる

HDDのUUID確認

```shell
sudo blkid

# /dev/sda1: LABEL="HDDの名前" UUID="xxxx-xxxx" TYPE="exfat" PARTUUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
```
UUIDをメモっておきます  xxxx-xxxx〆

起動時に自動でマウントするように設定

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

vimが使える人はそっちの方が早い（らしいね...）
vimってナンダって人はnanoで!

```shell:/etc/fstab
## テンプレート
UUID=“”	マウント場所(例：/mnt/hdd)	exfat-fuse	defaults	0	0

## 記入例
UUID="xxxx-xxxx"	/mnt/HDD	exfat-fuse	defaults,users, nofail	0	0
```
細かい説明はそのほかの設定はここ見て[fstab \- ArchWiki](https://wiki.archlinux.jp/index.php/Fstab)

>
 **注意**
~~どうやらdefaultsの設定で自動的につくautoオプションは
該当のディスク（今回はHDD）がない場合**emergencyモード**で起動するらしい...
再起動時にHDDが刺さってないと面倒になるので、怖い人は設定しない方がいいかも
**もしくは手動でマウントする**...
仮にemergencyモードになってもrootユーザーでログインして、
/etc/fstabのHDDの行をコメントアウトしてから再起動させれば、
ちゃんと起動するので一回経験してみてもいいかもね←
ただしemergencyモードになると**SSHやVNCは使えない**のでモニターの目の前でUSBキーボード挿してやらないといけないので要注意~~

::: note 
2021/01/24 nofailオプション付けるだけで解決しました
:::


書き込み終わったら

```shell
sudo reboot
```
再起動後

```shell
sudo df -h

#/dev/sdb2        932G  5.2G  927G    1% /mnt/HDD
```
マウント位置がマウント場所の通りになってれば成功

# 録画サーバー構築
## カードリーダー
色々インストール

```shell
sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
```
認識されてるか確認

```shell
pcsc_scan | grep B-CAS
#	Japanese Chijou Digital B-CAS Card (pay TV)
# ^C
```

## チューナー PX-S1UD

認識させるためにドライバをインストール

```shell
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
# firmwareに移動させる
sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware/
```

チューナーが認識されてるか確認

```shell
usb-devices | grep PX-S1UD
# S:  Product=PX-S1UD Digital TV Tuner
```

## 先に色々インストール

```shell
# dvbtoolによりDVB APIが使える mirakurunのコマンドに使う
sudo apt-get install dvb-tools

# ffmpeg  EPGStationに使用
sudo apt-get install ffmpeg

# Node.js 14系 EPGStationに使用
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install nodejs

# pm2 EPGStationやmirakurunで使用
sudo npm install pm2 -g
# sudo npm i pm2 -g と省略もできる
# -g は --global と同様 どこでも動くよ~みたいな感じ
```

## mirakurun
####インストール
```shell
sudo npm install mirakurun -g --unsafe-perm --production
# スクランブル解除用のコマンド? (よくわからん)
# デコーダーらしい
sudo npm install arib-b25-stream-test -g --unsafe-perm
```

[Github.com mirakurun](https://github.com/Chinachu/Mirakurun/blob/master/doc/Platforms.md#install--update)でこういうインストール方法だったのでコピペ

#### チャンネルデータのインストール

```shell
cd /usr/local
sudo mkdir origin
cd origin
sudo git clone https://github.com/Chinachu/dvbconf-for-isdb.git
cd
```

#### チューナーのセットアップ
```shell
sudo EDITOR=nano mirakurun config tuners
```

```yml:tuners.yml
- name: PX-S1UD-1
  types:
    - GR
  command: dvbv5-zap -a 0 -c /usr/local/origin/dvbconf-for-isdb/conf/dvbv5_channels_isdbs.conf -r -P <channel>
  dvbDevicePath: /dev/dvb/adapter0/dvr0
  decoder: arib-b25-stream-test
  isDisabled: false
```
dvbDevicePath は `cd /dev/dvb/`でadapter0,1とかがあるのでみる

チューナーが複数ある場合はそれぞれで番号を変えること

/dev/dvbがなかったらチューナー挿し直してみて

`sudo EDITOR=nano mirakurun config **`

**の部分は tuners channels server でそれぞれ編集可能

調べたら色々出てくるヨー

EDITOR=nano を使わない場合vim編集になるよ〜(私には難しい操作)

#### チャンネルスキャン

```shell
sudo curl -X PUT "http://localhost:40772/api/config/channels/scan"
```

チャンネルがスキャンされます
返答はこんな感じ

```shell
#　見つからない場合
# channel: "13" ...
# -> no signal. [Error: stream has closed before get network] 
# 見つかる場合
# channel: "22" ...
# -> 3 services found.
# -> {"name":"ＮＨＫＥテレ","type":"GR","channel":"22","isDisabled":false}
```
他のErrorが出るなら設定見直した方がいいかも

#### チャンネルスキャンできたらMirakurunを再起動
```shell
sudo mirakurun restart
```

ちなみに
http://ラズパイのIP:40772
にアクセスするとMirakurunのUIで操作もできる
IPがわからないなら`hostname -I`で見れるよ

## EPGStation
#### インストール
```shell
git clone https://github.com/l3tnun/EPGStation.git
cd EPGStation
sudo npm run all-install
sudo npm run build
```

#### 設定ファイルのコピー
ver2 からjsonからymlに変わった

```
cp config/config.sample.yml config/config.yml
cp config/operatorLogConfig.sample.yml config/operatorLogConfig.yml
cp config/epgUpdaterLogConfig.sample.yml config/epgUpdaterLogConfig.yml
cp config/serviceLogConfig.sample.yml config/serviceLogConfig.yml
```

sqliteを使用する場合に正規表現を使用する場合はこれをする必要がある
[github](https://github.com/l3tnun/EPGStation/blob/master/doc/sqlite3-regexp.md)


リアルタイム視聴できるようにconfig/config.ymlを編集

```shell
nano config/config.yml
```

```yml:config/config.yml
# 書き換え
sqlite:
  extensions:
    - '/home/pi/sqlite-amalgamation-3340000/regexp.so'
    # 正規表現を使うなら上のリンクからやってそのパスを書いて下さい
  regexp: true
  # 正規表現を使わないならfalse
recorded:
    - name: recorded
      path: '/mnt/HDD'
ffmpeg: /usr/bin/ffmpeg
# pathがわからないなら which ffmpeg
ffprobe: /usr/bin/ffprobe
# pathがわからないなら which ffprobe
# 終わり

stream:
  live:
    ts:
      mp4:
      # 追加
        - name: h264_omx
          cmd:
              '%FFMPEG% -re -i pipe:0 -threads 0 -c:a copy -bsf:a aac_adtstoasc -c:v h264_omx -vb 3000k -movflags frag_keyframe+empty_moov+faststart+default_base_moof -y -f mp4 pipe:1'
      # 終わり
```

リアルタイム視聴できるようにconfig/enc.jsを編集

```shell
nano config/enc.js
```

```js:config/enc.js
// 14行目 codecをh264_omxに変更
// const codec = 'libx264';
const codec = 'h264_omx';
// 39行目くらい その他設定の直前にビットレートの指定を追加
Array.prototype.push.apply(args, ['-b:v', '3000k']);
```

##### ちょっと便利技

nanoで行数を表示するには

```shell
sudo nano /etc/nanorc
```

```:/etc/nanorc
# 65行目 のコメントアウトを解除 ^Wでlinenumbersを検索した方が楽
#set linenumbers
↓
set linenumbers
```

#### 自動で起動する設定
```sh
sudo npm install pm2 -g
sudo pm2 startup <OS名>
pm2 start dist/index.js --name "epgstation"
pm2 save
```
OS名は
RaspberryPiOSはDebianだけどないので`sudo pm2 startup ubuntu`

#### 完成
http://ラズパイのIP:8888
にアクセスすると見れると思います

でもなんか気持ち悪い...(おい)
80ポートはsudo権限がいるような記憶なので
nginｘを使ったリバースプロキシを使います

## nginx
#### インストール
```shell
sudo apt-get install nginx
```

#### 起動とかのコマンド
```shell
sudo /etc/init.d/nginx start
sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx restart
```
試しに起動してみよ~
`sudo /etc/init.d/nginx start`

#### リバースプロキシ設定
```shell
sudo nano /etc/nginx/sites-available/default
```

```:/etc/nginx/sites-available/default
# 追加
location / {
        proxy_pass http://127.0.0.1:8888;
        # 同じラズパイ内なので127.0.0.1でOK!
}
# 元からある方はコメントアウト こちらを編集してもいいです
#location / {
#       # First attempt to serve request as file, then
#       # as directory, then fall back to displaying a 404.
#       try_files $uri $uri/ =404;
#}
```

再起動

```shell
sudo /etc/init.d/nginx restart
```

http://ラズパイのIP
でアクセスできるようになってます（多分！）

## ついでにログ圧縮
#### ログが膨大になるらしいので圧縮
毎日ログを圧縮して1週間分保存する設定

```shell
sudo pm2 install pm2-logrotate
sudo nano /etc/logrotate.d/mirakurun
```

```:/etc/logrotate.d/mirakurun
/usr/local/var/log/mirakurun.stdout.log
/usr/local/var/log/mirakurun.stderr.log
/{
  daily
  compress
  rotate 7
  missingok
  notifempty
}
```
メールで送信とかもしてもらえるらしいけど,

Mirakurunならいらないよね.