Raspberry Piとさんぱくん外出で録画PC構築

 Raspberry Pi 3 Model B+さんぱくん外出(US-3POUT)を使ってMirakurunとEPGStationを動かしてみた。Raspberry Pi OSのインストール等に別途Windows 10のPCを使っている。microSDカードはSanDiskのUltraシリーズのA1対応モデルの32GBを使用したが、録画先にもなるので大容量なものだとより便利かと思う。

 Raspberry Pi Zero等のCPUはNode.jsのパッケージが用意されていないので自分でビルドする手順が必要になるが、Raspberry Pi 3 Model B等であれば同じ手順でインストールできるかと思う。

Raspberry Pi OSのインストール

 Raspberry Pi公式サイト(英語)の上部メニューから「Software」で、Raspberry Pi OSのページを開き、「Download for Windows」からimager_1.7.2.exeをダウンロードする。
 imager_1.7.2.exeを実行して「このアプリがデバイスに変更を加えることを許可しますか?」が出たら「はい」、「Welcome to Raspberry Pi Imager Setup」が出たら「Install」、「Completing Raspberry Pi Imager Setup」が出たら「Run Raspberry Pi Imager」のチェックをはずして「Finish」でインストールする。
 microSDカードを取り付けたら、スタートメニューから「Raspberry Pi」→「Raspberry Pi Imager」を実行して「このアプリがデバイスに変更を加えることを許可しますか?」が出たら「はい」、「OSを選ぶ」から「Raspberry Pi OS (other)」→「Raspberry Pi OS Lite (32-bit)」を選択、「ストレージを選ぶ」からmicroSDカードを選択、歯車アイコンから「ホスト名」にチェックを入れてホスト名を設定して「SSHを有効化する」にチェックを入れて「ユーザ名」と「パスワード」を設定して「ロケール設定をする」にチェックを入れて「タイムゾーン」が「Asia/Tokyo」であることを確認したら「保存」を選択、「書き込む」で「…に存在するすべてのデータは完全に削除されます。本当に続けますか?」が出たら「はい」を選択、「Raspberry Pi OS Lite (32-bit) は…に書き込まれました。」が出たら「続ける」を選択、Raspberry Pi Imagerをウィンドウ右上の×で閉じたら、microSDカードを取り外す。

Raspberry Pi OSの起動

 microSDカードとWindows 10のPCと同じネットワーク内のLANケーブルとさんぱくん外出(US-3POUT)をRaspberry Pi 3 Model B+に取り付けたら、ACアダプタを接続して電源を入れる。

Raspberry Pi OSにsshで接続

 Windows 10のPCでスタートメニューを右クリック→「ファイル名を指定して実行」を開き、「名前」に「ssh pi@raspberrypi.local」(ユーザ名がpi、ホスト名がraspberrypiの場合)を入力して「OK」を選択、「Are you sure you want to continue connecting (yes/no/[fingerprint])?」が出たら「yes」を入力(初回のみ)、「pi@raspberrypi.local's password:」が出たらパスワードを入力してログインする。接続できない場合は数分待ってからやり直す。

パッケージの更新

 最初にインストール済みのパッケージを最新バージョンに更新する。

sudo apt update
sudo apt upgrade -y

文字コードの変更

 文字コードを日本語(UTF-8)に変更する。再起動(再ログイン)するまで反映されない。

sudo raspi-config nonint do_change_locale ja_JP.UTF-8

さんぱくん外出(US-3POUT)の設定

 下記コマンドで「Bus 001 Device 004: ID 0511:0045 N'Able (DataBook) Technologies, Inc. ISDB 3 Wave Device」(BusおよびDeviceに続く番号は環境によって異なる)と表示されれば、さんぱくん外出(US-3POUT)が接続されていて正しく認識されていることが確認できる。

lsusb -d 0511:0045

 さんぱくん外出(US-3POUT)用のudevルールを作成したら、再起動して反映させる(再起動したらRaspberry Pi OSにsshで再度接続する)。

echo 'SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0045", MODE="0664", GROUP="video"' | sudo tee /etc/udev/rules.d/91-tuner.rules
sudo reboot

recfsusb2nのインストール

 さんぱくん外出(US-3POUT)に対応した録画コマンドのrecfsusb2nをインストールする。ソース取得に必要なgitを予めインストールしている。

sudo apt-get install -y git
git clone https://github.com/epgdatacapbon/recfsusb2n
cd recfsusb2n/src
make
sudo make install
cd ../..

 適当なチャンネルを指定して30秒程度録画できるか確認する。関西のNHK EテレはUHF 13chなので13を指定している。

recfsusb2n 13 30 13.ts

 環境によって異なる場合もあるが、正常に録画できれば以下のように出力される。

recfsusb2n 0.1.13 beta 20170122_0026, (GPL) 2016 trinity19683
# ISDB-T/S TV Tuner FSUSB2N: '/dev/bus/usb/001/004', freq= 473143 kHz, duration= 30 sec.
# TMCC: TXmode=3 GuardInterval=1/8 OneSeg=Y
A: QPSK    1seg FEC=2/3 IL=4
B: 64QAM  12seg FEC=3/4 IL=2
TS encrypt detected!
# Start!

# Done! 30.005 sec.

 BSが受信できるなら例えばBS朝日はBS01_0のように指定して録画できるかを確認する。

recfsusb2n BS01_0 30 BS01_0.ts

 こちらも同様に正常に録画できれば以下のように出力される。

recfsusb2n 0.1.13 beta 20170122_0026, (GPL) 2016 trinity19683
# ISDB-T/S TV Tuner FSUSB2N: '/dev/bus/usb/001/004', freq= 1049480 kHz, duration= 30 sec.
# TMCC: TSID= 0 (0x0000)
H: BPSK   48slot FEC=1/2
a: TC8PSK 48slot FEC=2/3
TS encrypt detected!
# Start!

# Done! 30.006 sec.

Node.jsのインストール

 MirakurunとEPGStationの動作に必要なNode.jsをインストールする。MirakurunはNode.jsのバージョン14.17.0以上、16以下が必要EPGStationはNode.jsのバージョン14.6.0以上、16.6.1以下が必要となっているので、今回はバージョン16系をインストールしている(バージョン14系でも問題ないと思われるが、その場合は下記コマンドのsetup_16.xの部分をsetup_14.xに書き換える)。

curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install nodejs -y

 インストールされたNode.jsのバージョンを確認する。

dpkg -l nodejs

 今回は16.17.0-deb-1nodesource1がインストールされていた。

要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前           バージョン               アーキテクチ 説明
+++-==============-========================-============-=================================================
ii  nodejs         16.17.0-deb-1nodesource1 armhf        Node.js event-based server-side javascript engine

PM2のインストール

 MirakurunとEPGStationの動作に必要なPM2をインストールする。

sudo npm install pm2 -g

arib-b25-stream-testのインストール

 Mirakurunでスクランブル解除に必要なarib-b25-stream-testコマンドをインストールする。予め、ビルドに必要なlibpcsclite-devと動作に必要なpcscdのパッケージをインストールしている。当然ながらスクランブル解除を行うにはB-CASカードを取り付けたスマートカードリーダーを接続しておく必要があるが、スクランブル解除を行わない(後から別途行う等)場合はスマートカードリーダーを接続していなくても問題ない。尚、B-CASカードの認識をpcsc_scanでJapanese Chijou Digital B-CAS Card (pay TV)と表示されるか確認したい場合はsudo apt install pcsc-tools -yでpcsc-toolsパッケージもインストールする必要があるが、これはarib-b25-stream-testコマンドを使うだけならば特に必要は無い。

sudo apt install libpcsclite-dev pcscd -y
sudo npm install arib-b25-stream-test -g --unsafe-perm

Mirakurunのインストール

 Mirakurunを公式サイトの手順通りにインストールする。

sudo npm install mirakurun -g --unsafe-perm --foreground-scripts --production

 インストール後にMirakurunが動作しているか確認する。

sudo mirakurun status

 正しく動作していれば以下のように表示される。

┌─────┬─────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name                │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼─────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ mirakurun-server    │ default     │ 3.9.0-… │ fork    │ 2526     │ 4m     │ 0    │ online    │ 0%       │ 59.5mb   │ root     │ disabled │
└─────┴─────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

 Webブラウザから http://raspberrypi:40772 (ホスト名がraspberrypiの場合)を開くことで、Mirakurunの動作状態の確認や、ログの参照、設定の変更、再起動などが行える。接続できない場合は数分待ってからやり直す。

Mirakurunのチューナー設定とチャンネル設定

 MirakurunでDVBデバイス以外のチューナーを扱う場合、録画コマンド等を/usr/local/mirakurun/opt/binディレクトリに格納する必要があるので、recfsusb2nコマンド一式をコピーする。

sudo mkdir -p /usr/local/mirakurun/opt/bin
sudo cp /usr/local/bin/recfsusb2n* /usr/local/mirakurun/opt/bin/

 Mirakurunのチューナー設定は/usr/local/etc/mirakurun/tuners.ymlにnameでチューナー名(複数ある場合は数字を付加する等して区別する)、typesで対応している放送波(地デジはGR)、decoderにスクランブル解除コマンド、commandに録画コマンド(チャンネル指定の部分にはを書く)を記述する。行頭のスペースの数を間違えると認識しないので注意が必要。

cat << 'EOT' | sudo tee /usr/local/etc/mirakurun/tuners.yml
- name: US-3POUT
  types:
    - GR
    - BS
    - CS
  decoder: arib-b25-stream-test
  command: recfsusb2n <channel> - -
EOT

 Mirakurunはチャンネルスキャンが行えるが、チャンネル設定が空だとMirakurunがそもそも動作しないので、チューナーの放送波に合わせたダミーのチャンネル設定を作成する。

cat << 'EOT' | sudo tee /usr/local/etc/mirakurun/channels.yml
- name: DUMMY
  type: GR
  channel: '13'
  isDisabled: true
EOT

 チューナー設定とチャンネル設定が終わったら、Mirakurunを再起動して設定を反映させる。

sudo mirakurun restart

Mirakurunのチャンネルスキャン

 MirakurunはCATVチャンネル(C13~C63)以外ならばチャンネルスキャンが行えるので、地デジとBSとCSのチャンネルスキャンを行う。BSやCSのチャンネルスキャンが不要なら2行目と3行目は実行する必要はない。

curl -X PUT "http://127.0.0.1:40772/api/config/channels/scan?type=GR&setDisabledOnAdd=false&refresh=true"
curl -X PUT "http://127.0.0.1:40772/api/config/channels/scan?type=BS&setDisabledOnAdd=false&refresh=true"
curl -X PUT "http://127.0.0.1:40772/api/config/channels/scan?type=CS&setDisabledOnAdd=false&refresh=true"

 チャンネル設定が終わったら、Mirakurunを再起動して設定を反映させる。

sudo mirakurun restart

EPGStationのインストール

 EPGStationのインストールには2GB以上のメモリが必要なので、予めスワップファイルを2GBに増やして、サービスを再起動して設定を反映させる。メモリ状態は「free」で、スワップ状態は「swapon -s」で確認できる。

sudo sed -i -e 's/^CONF_SWAPSIZE=100$/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile
sudo service dphys-swapfile restart

 EPGStationを公式サイトの手順通りにインストールする。ただし、「npm run build」だけはスワップファイルで増やしたメモリ容量を指定するために行頭に「NODE_OPTIONS="--max-old-space-size=2048"」を付加して実行する。尚、npm installでfound 1 high severity vulnerability等と表示された場合にメッセージに従ってnpm audit fix等で脆弱性を解消するとEPGStationのインストールが上手くいかない可能性があるので、どうしても脆弱性の解消を行いたい場合はnpm startやpm2 start dist/index.js --name "epgstation"でEPGStationが正常に動作した後に行うと良いかと思う。

git clone https://github.com/l3tnun/EPGStation.git
cd EPGStation
npm run all-install
NODE_OPTIONS="--max-old-space-size=2048" npm run build

 EPGStationの設定ファイルをサンプルファイルを元にして作成する。

cp config/config.yml.template 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
cp config/enc.js.template config/enc.js

 サムネイル画像の表示などが必要であれば、ffmpegのパッケージをインストールして、設定ファイルのffmpegとffprobeのパスを書き換える。

sudo apt install ffmpeg -y
sed -i -e "s/^ffmpeg:.*/ffmpeg: \/usr\/bin\/ffmpeg/" config/config.yml
sed -i -e "s/^ffprobe:.*/ffprobe: \/usr\/bin\/ffprobe/" config/config.yml

 EPGStationを自動起動するために、現在のユーザでPM2が自動起動できるように設定する。

sudo pm2 startup -u $USER --hp $HOME

 EPGStationをPM2で起動して、次回以降自動起動できるように現在の状態を保存する。

pm2 start dist/index.js --name "epgstation"
pm2 save
cd ..

 Webブラウザから http://raspberrypi:8888 (ホスト名がraspberrypiの場合)を開くことで、EPGStationの番組表を見たり、予約録画を行う等の操作が行える。接続できない場合は数分待ってからやり直す。

その他

 その時々のパッケージのバージョンや、ネットワークの状態、インストールしたいアプリケーションの開発状況により、上手くインストールできない場合もあるので、明確なエラーや原因が見つからない場合は、再起動してからやり直してみる、再度最初からインストールし直してみる、他のバージョンが選択可能な場合は変えてみる等を試してみると良いかも知れない。