Mirakurunクローンのmirakcを動かしてみた

 Mirakurun互換で動作が軽いと言うmirakcをPCのDebian 10.1とRaspberry Pi 3のRaspbian Buster Liteにインストールしてみた。

mirakc-aribのインストール

 epgdumpやtssplitterに相当するmirakc-aribが必要なのでインストールする。基本的にはドキュメントのHow to buildの通りだけど、ninjaコマンドを使っているのでninja-buildパッケージも予めインストールしておく必要がある。逆にdos2unixは無くても問題ないみたい。cmakeでconfigure的な役割を、ninjaでmake的な役割を行っている。必要なバイナリはmirakc-aribの1ファイルだけ。

sudo apt-get install -y git cmake ninja-build g++ autoconf pkg-config libtool
git clone https://github.com/masnagam/mirakc-arib
cd mirakc-arib
cmake -S . -B build -G Ninja -D CMAKE_BUILD_TYPE=Release
ninja -C build vendor
ninja -C build
sudo cp build/bin/mirakc-arib /usr/local/bin/
cd ..

mirakcのインストール

 mirakcはCやC++のように使えるプログラミング言語のRustで作られているので、ビルドするためにRustをインストールする。インストール途中に「Current installation options:」が出たら「1) Proceed with installation (default)」を選択するために「>」に「1」を入力する。終わったら設定をsourceで読み込んでパスを通す。

sudo apt-get install -y curl
curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env

 mirakcのビルド方法はamd64 native buildのDockerfileの中に書いてある。cargoはRust向けのビルドツールでmake的な役割を行っている。必要なバイナリはmirakcの1ファイルだけで、設定ファイルを-cオプションで指定して起動するだけ。設定ファイルで指定したEPGデータの格納ディレクトリは起動したユーザで書き込めるようにしておく。

git clone https://github.com/masnagam/mirakc
cd mirakc
cargo build --release
sudo cp target/release/mirakc /usr/local/bin/
cd ..

mirakcの設定

 mirakcのインストールでconfig.ymlのサンプルが記載されているので、チャンネルとチューナーの設定を自分の環境に合わせて書き換えて作成する。

sudo mkdir /etc/mirakc
cat << 'EOT' | sudo tee /etc/mirakc/config.yml
server:
  address: '0.0.0.0'
  port: 40772
  workers: 3

channels:
  - name: NHKEテレ
    type: GR
    channel: '13'
  - name: BS朝日1
    type: BS
    channel: BS01_0
    serviceId: 151
  - name: TBSチャンネル1
    type: CS
    channel: CS2
    serviceId: 296

tuners:
  - name: PT3-S1
    types:
      - BS
      - CS
    command: recpt1 --b25 --device /dev/pt3video0 {{channel}} {{duration}} -

  - name: PT3-T1
    types:
      - GR
    command: recpt1 --b25 --device /dev/pt3video2 {{channel}} {{duration}} -

tools:
  scan-services: mirakc-arib scan-services{{#xsids}} --xsid={{.}}{{/xsids}}
  collect-eits: mirakc-arib collect-eits{{#xsids}} --xsid={{.}}{{/xsids}}
  filter-service: mirakc-arib filter-packets --sid={{sid}}
  filter-program: mirakc-arib filter-packets --sid={{sid}} --eid={{eid}}

epg-cache-dir: /var/lib/mirakc/epg
EOT
sudo mkdir -p /var/lib/mirakc/epg

mirakcの起動

 あとは「mirakc -c /etc/mirakc/config.yml」で起動できる(/var/lib/mirakc/epgディレクトリに書き込みが出来るユーザで起動する)が、Mirakurun同様に自動起動させたいので、systemdでサービス化して、有効化と起動を行う。以後は sudo systemctl status mirakc で状態確認が行える。

cat << 'EOT' | sudo tee /etc/systemd/system/mirakc.service
[Unit]
Description = mirakc

[Service]
ExecStart = /usr/local/bin/mirakc -c /etc/mirakc/config.yml
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
EOT
sudo systemctl enable mirakc
sudo systemctl start mirakc

mirakcとMirakurunの仕様の違い

 mirakcはソケットファイルの/var/run/mirakurun.sockが使えないっぽいので、EPGStationで使う場合はconfig.jsonのMirakurunPathを http://localhost:40772 等に書き換えないと動作しない。
 あと、Mirakurunは番組表などで使われる四角で囲まれた文字([再]や[字]など)を「[」と「]」で囲って表すが、mirakcはUnicodeの囲み文字として1文字で表すので、EPGStationでMySQLMariaDB)を使っていると、これが格納できない文字として扱われ、エラーになってしまう。SQLiteならば問題ない模様。

mirakcの挙動

 mirakcは起動すると各チャンネルを10秒間(BSは20秒間、CSは1800秒間(30分)だが、いずれもサービス一覧が得られた時点で終了する)録画してmirakc-aribコマンドのscan-servicesオプションでサービス一覧を取得、その後は各チャンネルを70秒間(BSは390秒間(6分30秒)CSは600秒間(10分)だが、いずれも番組表が得られた時点で終了する)録画してmirakc-aribコマンドのcollect-eitsオプションで番組表を取得する。
 番組表の取得が全て終わると/var/lib/mirakc/epgディレクトリ(設定ファイルのepg-cache-dirで指定)にサービス一覧や番組表などをJSON形式で格納したファイルのschedules.jsonが作成される。
 番組録画時は対象チャンネルを秒数無制限で録画してmirakc-aribコマンドのfilter-packetsオプションで--sid=2056のようにサービスIDを指定、--eid=2303のようにイベントIDを指定して対象番組の終了日時まで録画を行う模様。

その他

 今回はmirakcのチューナー設定に「rivarun --b25 --mirakurun hogehoge.local:40772 --priority 0 --ch {{channel}} {{duration}} -」のように既に稼働しているMirakurunサーバをrivarunでチューナーとして使って動かしたりもしてみた。当然ながらチャンネル設定のチャンネル名は例えば13ならGR/13にする等の変更が必要になる。