目次

FreeBSDでMirakurunを動かす

2019/01/28
色々コメントを貰いドキュメント構成を変更。情報追記。

2017/05/21
FreeBSD 11.0 RELEASEで無事導入までできたのでその際のメモ書き。

Mirakurun 2.6.1 はnode6サポートを終了。node8を使われたし。Updateすると当然パッチあてたファイルも書き換わるから再度修正がいる。

Mirakurunって何?

DVR Tuner Server Service for Chinachu Air. https://github.com/Chinachu/Mirakurun

Chinachu Airが何ぞや、という話は置いておく。

Mirakurunはデジタル放送チューナーデバイスを管理するサービス。 recpt1等物理層直叩きなプログラムを隠蔽し、HTTPのREST API経由で操作可能としている。
面倒なチューナーの管理を不要とできるので、このサービスに登録したチューナーデバイスは複数のプログラムやサービスで共用する事が可能になる。

このサービスからEPG情報の取得や放送のストリーミング視聴ができるし、効率的なチューナーの利用がされるので、人によっては録画可能な番組が増えるかもしれない。

例えば、TOKYO MXの地上波デジタル放送だとマルチチャンネルと称し MX1,MX2の2放送が1つのチャンネルで送信されている。
チューナーが2つある環境で同時間帯のMX1,MX2の放送を受信したい場合、

という恩恵がある。

前提

ここの説明では、 PT2/PT3 が稼働していて、recpt1で録画が可能な状態であることが前提。

先に、いくつかディレクトリを作る。もしかすると /usr/local/var は既に存在しているかもしれない。
ディレクトリ /usr/local/var/log はパーミッションをいじっておかないとMirakurunがブツクサ言ってくるのでとりあえずの変更。Chinachuを導入した時にChinachuがブツブツ…

# mkdir /usr/local/etc/mirakurun
# mkdir /usr/local/var
# mkdir /usr/local/var/log
# chmod guo+rwx /usr/local/var/log

追記 2019/01/28

また私の環境下では不要だったようなのですが、@HackerMaskeeさんからの情報で、

# mkdir -p /usr/local/var/db/mirakurun

を実行しておく必要があったとの事です。

インストール

Node.js配下で動作するサービスなので、それらも含めて前提ソフトウエアを先に導入しておく。 Mirakurunの前提環境のバージョン情報から、以下を導入した。Portsでもpkgでも好きな方から導入すればいい。

また、こちら Mirakurun を jail の中で動かす。 でjailに隔離する方法があるので必要な場合はこちらをご確認ください。

前提ソフトウエアの導入

www/node8, www/npm5

Portsなりpkgなりで導入する。

shells/bash

bashインストール後は以下のシンボリックリンクを張っておく。どうも /usr/local/bin/bash ではなく /bin/bash が前提らしい。

ln -s /usr/local/bin/bash /bin/bash

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

こちらはMirakurun を FreeBSD にインストールする(2018-12-12版)の手順そのまま。

fetch https://registry.npmjs.org/arib-b25-stream-test/-/arib-b25-stream-test-0...
tar xf arib-b25-stream-test-0.2.9.tgz
mv package arib-b25-stream-test
cd arib-b25-stream-test
mv package.json package.json.orig
sed -e 's/"linux"/"linux","freebsd"/g' -e 's/make /make CC=cc CXX=c++ /g' package.json.orig | jq . > package.json
npm install . -g --unsafe

Mirakurunのインストール

今回はユーザ mirakurun を作ってホームディレクトリ下にgitでリポジトリをクローンしている。 また、2017-05-19 のコミットで番組情報が集積されない不具合が修正されているので古いソースを取得しちゃった人は取り直し。

# cd /home/mirakurun
# git clone https://github.com/Chinachu/Mirakurun/
# cd Mirakurun

サポートOSにFreeBSDを追加

package.json.diff
*** package.json.org    2017-05-20 04:56:44.531365000 +0900
--- package.json        2017-05-20 04:56:44.532775000 +0900
***************
*** 92,97 ****
    "os": [
      "linux",
      "darwin",
!     "win32"
    ]
  }
--- 92,98 ----
    "os": [
      "linux",
      "darwin",
!     "win32",
!     "freebsd"
    ]
  }

Server.config に Listenアドレスのパラメタを追加

オリジナルは、利用可能なすべてのnicのすべてのアドレスでListenするようになっている。

NIC1枚でIPを1つ割り当てをしている様な普通の環境なら問題ない。
が、うちはNIC2枚かつ各NICで複数IPアドレスを振っているのでちと困る。

config.ts.diff
*** src/Mirakurun/config.ts.org       2017-05-20 04:58:10.676229000 +0900
--- src/Mirakurun/config.ts   2017-05-20 04:58:10.677490000 +0900
***************
*** 24,29 ****
--- 24,30 ----
 
      // as Remote Server
      readonly port?: number;
+     readonly addr?: string;
 
      /** `true` to disable IPv6 listening */
      readonly disableIPv6?: boolean;
Server.ts.diff
*** src/Mirakurun/Server.ts.org       2017-05-20 04:59:34.098231000 +0900
--- src/Mirakurun/Server.ts   2017-05-20 04:59:34.098925000 +0900
***************
*** 44,54 ****
          }
 
          if (serverConfig.port) {
!             addresses = [
!                 ...addresses,
!                 ...system.getPrivateIPv4Addresses(),
!                 "127.0.0.1"
!             ];
 
              if (serverConfig.disableIPv6 !== true) {
                  addresses = [
--- 44,62 ----
          }
 
          if (serverConfig.port) {
!             if (serverConfig.addr) {
!                 addresses = [
!                     ...addresses,
!                     serverConfig.addr,
!                     "127.0.0.1"
!                 ];
!             } else {
!                 addresses = [
!                     ...addresses,
!                     ...system.getPrivateIPv4Addresses(),
!                     "127.0.0.1"
!                 ];
!             }
 
              if (serverConfig.disableIPv6 !== true) {
                  addresses = [

Mirakurunビルド

# npm install pm2 -g
# npm install
# npm run build
# npm install . -g --unsafe --production

pm2はmirakurunをバックグラウンドで実行するためのデーモンツール。

次にファイルコピー。

# cp -v config/DO_NOT_EDIT_THESE_  /usr/local/etc/mirakurun/
# cp -v config/channels.yml        /usr/local/etc/mirakurun/
# cp -v config/server.yml          /usr/local/etc/mirakurun/
# cp -v config/tuners.yml          /usr/local/etc/mirakurun/

Mirakurunの設定

ディレクトリ /usr/local/etc/mirakurun にコピーした設定ファイルを編集する。 以下のコマンドで対応する設定ファイルを編集できる。

# mirakurun config server     ← server.ymlの編集
# mirakurun config tuners     ← tuners.ymlの編集
# mirakurun config channels   ← channels.ymlの編集

server.yml

addr パラメタを記述しなければオリジナルの振る舞いになる。 addr パラメタを記述する時は IPアドレスを一つだけ定義。

# logLevel: <number>
logLevel: 2
 
# path: <string>
path: /var/run/mirakurun.sock
 
# port: <number>
# You can change this if port conflicted.
# Don't expose this port on the internet, not even with NAPT.
# Use this in LAN or VPN.
# `~` to disable TCP port listening.
port: 40772
addr: 192.168.1.100

tuners.yml

この定義は

デバイス名はFreeBSDでのデバイス名でLinuxのそれとは違うので注意。

- name: PT2-T1
  types:
    - GR
  command: recpt1 --b25 --device /dev/ptx0.t0 <channel> - -
  decoder: ~
  isDisabled: false

- name: PT2-T2
  types:
    - GR
  command: recpt1 --b25 --device /dev/ptx0.t1 <channel> - -
  decoder: ~
  isDisabled: false

次の定義は

- name: PT2-T1
  types:
    - GR
  command: recpt1 --device /dev/ptx0.t0 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-T2
  types:
    - GR
  command: recpt1 --device /dev/ptx0.t1 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

channels.yml

自分の地域での受信環境に合わせる。私の場合は以下だけ追加。

- name: TVK
  type: GR
  channel: '18'
  isDisabled: false

Mirakurun起動

引数無しだとヘルプが表示される。

# mirakurun

Usage: mirakurun <command> ...

<command>:

config server     Edit server configuration.
config tuners     Edit tuner configuration.
config channels   Edit channels configuration.

log               Stream logs.
log --help        Show usage for log stream.

status            Show status of services.
start             Start services.
stop              Stop services.
restart           Restart services.

version           Version info.
help              Output this information.

#

以下のコマンドで起動する。

# mirakurun start

コンソール上でログを見る場合は以下のコマンドで。

mirakurun log server 

追記 2019/01/28

私の環境下では発生しなかったのですが、@HackerMaskeeさんからの情報で、

# mirakurun start
[PM2][ERROR] script not found : /home/mirakurun/Mirakurun/mirakurun-server
# 

とエラーが発生して起動せず、次の手順が必要になったとのことです。

# cd /usr/local/lib/node_modules/mirakurun
# pm2 start processes.json

録画クライアント

クライアント rivarun をインストールする。

# npm install rivarun -g

引数無しでヘルプ表示。

# rivarun

Usage:
rivarun [--b25] [--mirakurun host:port] [--priority priority] [--sid SID] [--ch type/channel] rectime destfile
Remarks:
* if rectime  is `-`, records indefinitely.
* if destfile is `-`, stdout is used for output.
* if `--sid` option specified, will ignore `--ch` option.
Options:
--b25:                 Send decode request
--mirakurun host:port: Specify Mirakurun hostname and portnumber
--priority priority:   Specify client priority (default=0)
--sid SID:             Specify SID number
--ch type/channel      Specify channeltype and channel
                         type = GR | BS | CS | SKY
--help:                Show this help
--version:             Show version
--list:                Show channel list

#

ほぼ recpt1と同じように利用できる。

# recpt1 --b25 --sid hd 18 180 ch18.ts  ← recpt1で 18チャンネル を 180秒間 ファイル ch18.ts へ記録する 
# rivarun --b25 --ch GR/18 180 ch18.ts  ← rivarunで 18チャンネル を 180秒間 ファイル ch18.ts へ記録する
# rivarun --b25 --mirakurun 10.0.0.100:40772 --ch GR/18 180 ch18.ts  ← IPアドレス10.0.0.100で稼働しているMirakurunで 18チャンネル を 180秒間 ファイル ch18.ts へ記録する

Mirakurunのtuners.ymlの設定でdecoderオプションを指定できているならrivarunの–b25オプションは意味あり。 decoder未指定の場合は、recpt1の –b25 オプションでスクランブル解除を行うことになるかと。
Mirakurunが稼働しているマシンがリモートにあるのなら –mirakurun オプションでMirakurunのサービスを指定できる。

ストリーミング

recpt1のように、VLCメディアプレイヤーでストリーミング視聴もできる。以下は192.168.1.20:40772で稼働しているMirakurunに接続しチャンネル16をストリーミングする例。

サービスIDを指定しないため、チャンネルによってはワンセグがストリーミングされるかもしれない。その場合にはサービスIDを明示する。

サービスIDはMirakurunのAPIで確認ができる。

以下のrivarunコマンドでAPIから取得する事もできる。

# rivarun --list | nkf

rivarunの表示はutf-8で行われるので、nkfで文字化けを抑止している ※うちの環境はeuc-jpなので。

または、Chinachu γ を導入するのもよい。 https://github.com/Chinachu/Chinachu

Chinachu γならブラウザでストリーミング視聴出来たり、予約録画や番組表を参照できる。