Rock5BでTV録画サーバを作る(後編)
後半戦に入ります。
前編ではハードウエアやソフトウエアなどの準備、OSの設定などを実施しました。
後半ではDockerの準備とEPGStation,Mirakcの設定をしていきます。
Dockerの準備
2024/9/15時点ではRock5Bで利用可能なLinuxではDockerが古く、エラーになってしまうようです。仕方がないので、Dockerのページ をみてDockerを新しくします。
$ for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done
$ sudo apt update
$ sudo apt install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
ここで一応動くかを確認しておきます。
$ sudo docker run hello-world
$ sudo docker run -it ubuntu bash
root@50eb39c0c967:/# exit
$
プロンプトが変わり、うまく動いてそうであれば完成です。
テストなのでこのコンテナは不要です。必要なら削除してしまいましょう。
$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest ee301c921b8a 16 months ago 9.14kB
$ sudo docker image rm -f ee301c921b8a
$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
$
mirakcのインストールと設定
ようやくここまできました。
mirakcのインストールを開始していきます。基本、mirakcのサイト に従ってインストールを進めていきますので、確認していらなくなったら消したりもしていきます。
mirakcのディレクトリを作成して、docker compose用の設定ファイルを作っていきます。
$ cd ~
$ mkdir mirakc
$ vi compose.yml
設定はmirakcのサイトどおりに作っていきます。
services:
mirakc:
image: mirakc/mirakc:alpine
container_name: mirakc
init: true
restart: unless-stopped
ports:
- 40772:40772
volumes:
- ./config.yml:/etc/mirakc/config.yml:ro
environment:
TZ: Asia/Tokyo
RUST_LOG: info
configについてもサイトどおりです。
$ vi config.yml
server:
addrs:
- http: '0.0.0.0:40772'
デーモンモードではない状態で起動するため、-dを付けずに起動します。Ctrl-Cを押すまでターミナルのプロンプトは戻ってきません。
$ sudo docker compose up
[+] Running 1/6
[+] Running 1/6⠀] Pulling 4.3s
.
.
.
mirakc | 2024-09-22T01:32:04.132222+09:00 INFO mirakc_core::web::mount: Use the default folder view template
別途閲覧用PCからTV録画用サーバへブラウザを利用してアクセスします。
http://xxx.xxx.xxx.xxx/api/version
バージョンが表示されたら問題ありません。
上記ブラウザ表示は2024/9/22時点でのバージョンです。バージョンが表示されるということは今後の設定もちゃんとすれば動作するということです。一旦停止させて、設定ファイルを変更していきます。
^CGracefully stopping... (press Ctrl+C again to force)
[+] Stopping 1/1
✔ Container mirakc Stopped 0.4s
canceled
$
compose.ymlを編集して、自分用の設定に変更していきます。
services:
mirakc:
image: mirakc/mirakc:alpine
container_name: mirakc
init: true
restart: unless-stopped
devices:
- /dev/px4video0
- /dev/px4video1
- /dev/px4video2
- /dev/px4video3
- /dev/px4video4
- /dev/px4video5
- /dev/px4video6
- /dev/px4video7
ports:
- 40772:40772
volumes:
- mirakc-epg:/var/lib/mirakc/epg
- ./config.yml:/etc/mirakc/config.yml:ro
environment:
TZ: Asia/Tokyo
RUST_LOG: info
volumes:
mirakc-epg:
name: mirakc_epg
driver: local
deviceやvolumeの項目を追加しています。
次にconfig.ymlも編集していきます。こちらは今のconfig.ymlの下にtunersなど追加をしていきます。デバイスはBSx2,GRx2,BSx2,GRx2になっているらしいので、その順番で書いていきます。CSを見れる場合は[BS]の部分を[BS,CS]にして、channelもCS用を追加する必要があります。
server:
addrs:
- http: '0.0.0.0:40772'
tuners:
- name: bs1
types: [BS]
command: recpt1 --device /dev/px4video0 {{{channel}}} - -
- name: bs2
types: [BS]
command: recpt1 --device /dev/px4video1 {{{channel}}} - -
- name: gr1
types: [GR]
command: recpt1 --device /dev/px4video2 {{{channel}}} - -
- name: gr2
types: [GR]
command: recpt1 --device /dev/px4video3 {{{channel}}} - -
- name: bs3
types: [BS]
command: recpt1 --device /dev/px4video4 {{{channel}}} - -
- name: bs4
types: [BS]
command: recpt1 --device /dev/px4video5 {{{channel}}} - -
- name: gr3
types: [GR]
command: recpt1 --device /dev/px4video6 {{{channel}}} - -
- name: gr4
types: [GR]
command: recpt1 --device /dev/px4video7 {{{channel}}} - -
epg:
cache-dir: /var/lib/mirakc/epg
channels:
- name: TOKYO MX
type: GR
channel: '16'
- name: フジテレビ
type: GR
channel: '21'
- name: TBS
type: GR
channel: '22'
- name: テレビ東京
type: GR
channel: '23'
- name: テレビ朝日
type: GR
channel: '24'
- name: 日テレ
type: GR
channel: '25'
- name: NHKEテレ・東京
type: GR
channel: '26'
- name: NHK総合・東京
type: GR
channel: '27'
- name: NHK BS1
type: BS
channel: BS15_0
services: [101]
- name: NHK BS1 (Sub)
type: BS
channel: BS15_0
services: [102]
# - name: NHKBSプレミアム 103
# type: BS
# channel: BS03_1
# services: [103]
# - name: NHKBSプレミアム 104
# type: BS
# channel: BS03_1
# services: [104]
- name: BS日テレ 141
type: BS
channel: BS13_0
services: [141]
- name: BS日テレ 142
type: BS
channel: BS13_0
services: [142]
- name: BS朝日1
type: BS
channel: BS01_0
services: [151]
- name: BS朝日2
type: BS
channel: BS01_0
services: [152]
- name: BS-TBS
type: BS
channel: BS01_1
services: [161]
- name: BSテレ東
type: BS
channel: BS01_2
services: [171]
- name: BSフジ・181
type: BS
channel: BS13_1
services: [181]
- name: BS11イレブン
type: BS
channel: BS09_0
services: [211]
- name: BS12
type: BS
channel: BS09_2
services: [222]
それぞれ保存したら起動してみます。こちらもデーモンモードではない状態で起動するため、-dを付けずに動作させます。ログも画面に表示されますし、うまく動作しない場合もCtrl-Cで停止することもできます。
$ sudo docker compose up
[+] Running 1/0
[+] Running 2/2akc_epg" Created 0.0s
✔ Volume "mirakc_epg" Created 0.0s ⠋ Container mirakc Recreate 0.1s
✔ Container mirakc Recreated 0.1s
Attaching to mirakc
mirakc | 2024-09-22T02:36:41.929220+09:00 INFO mirakc_core::config: Loaded config_path="/etc/mirakc/config.yml"
mirakc | 2024-09-22T02:36:41.930444+09:00 INFO mirakc_core::onair::manager: No on-air program tracker is defined
mirakc | 2024-09-22T02:36:41.930449+09:00 WARN mirakc_core::epg: Failed to load services err=std::io error: No such file or directory (os error 2)
mirakc | 2024-09-22T02:36:41.930304+09:00 INFO mirakc_core::tuner: Loaded tuners tuners.len=8
mirakc | 2024-09-22T02:36:41.930594+09:00 WARN mirakc_core::epg: Failed to load clocks err=std::io error: No such file or directory (os error 2)
mirakc | 2024-09-22T02:36:41.930611+09:00 WARN mirakc_core::epg: Failed to load schedules err=std::io error: No such file or directory (os error 2)
mirakc | 2024-09-22T02:36:41.930584+09:00 INFO mirakc_core::recording: Recording is disabled
mirakc | 2024-09-22T02:36:41.930667+09:00 INFO mirakc_core::timeshift::manager: Timeshift recording is disabled
mirakc | 2024-09-22T02:36:41.930714+09:00 INFO mirakc_core::epg::job: Performing... job="scan-services"
mirakc | 2024-09-22T02:36:41.931555+09:00 INFO mirakc_core::tuner: Streaming started channel=GR/16 user.info=Job(epg.scan-services) user.priority=-1 stream.id=2.0.1
最後の行のようにchannel=GR/16などという文字列が上記config.ymlのchannelで設定しているチャネル分でたら完了です。順次ログは出続けてます。
視聴用PCのブラウザのアドレスバーへ以下URLを入力してチャネル情報が取得できているかを確認します。
http://xxx.xxx.xxx.xxx:40772/api/services
以下のような結果が出ていれば成功です。
ここまでくればmirakcがちゃんと自分の設定で動作していることがわかります。
では、Ctrl-Cを押して一旦停止して次の段階に進みます。
^CGracefully stopping... (press Ctrl+C again to force)
[+] Stopping 1/1
✔ Container mirakc Stopped 0.3s
canceled
$
EPGStationのインストールと設定設定
予約や番組表の閲覧などを可視化するためにEPGStationを設定していきます。
まずはgitからEPGStationのファイルをダウンロードしていきます。
$ pwd
/home/ubuntu/mirakc
$ git clone https://github.com/l3tnun/EPGStation.git
Cloning into 'EPGStation'...
remote: Enumerating objects: 22539, done.
remote: Counting objects: 100% (3341/3341), done.
remote: Compressing objects: 100% (524/524), done.
remote: Total 22539 (delta 2989), reused 2982 (delta 2813), pack-reused 19198 (from 1)
Receiving objects: 100% (22539/22539), 18.85 MiB | 10.89 MiB/s, done.
Resolving deltas: 100% (16980/16980), done.
$ cd EPGStation
$ ls
Dockerfile.alpine api.d.ts data logs recorded
Dockerfile.debian api.yml doc ormconfig.js src
LICENSE client drop package-lock.json thumbnail
Readme.md config img package.json tsconfig.json
$
alpine用Debian用2つのDockerfileのサンプルがありますが、今回はmirakcがalpineを使っているのでEPGStationもalpineを使おうと思います。ということで、alpine用をコピーして使います。
また、configディレクトリにはサンプルファイルがあるので、こちらもコピーして使います。
$ cp Dockerfile.alpine Dockerfile
$ cd config
$ cp config.yml.template config.yml
$ cp enc.js.template enc.js
$ cp epgUpdaterLogConfig.sample.yml epgUpdaterLogConfig.yml
$ cp operatorLogConfig.sample.yml operatorLogConfig.yml
$ cp serviceLogConfig.sample.yml serviceLogConfig.yml
ファイルのコピーが終わったので必要な部分の変更をしていきます。
まず、mirakcのcompose.ymlファイルを変更していきます。
$ cd ../..
$ vi compose.yml ← /home/ubuntu/mirakc/compose.yml
以下MYSQL_USERやMYSQL_PASSWORDなどの値は、後で編集するEPGStation/config/config.ymlの値と合わせる必要があります。
services:
mirakc:
image: mirakc/mirakc:alpine
container_name: mirakc
init: true
restart: unless-stopped
devices:
- /dev/px4video0
- /dev/px4video1
- /dev/px4video2
- /dev/px4video3
- /dev/px4video4
- /dev/px4video5
- /dev/px4video6
- /dev/px4video7
- /dev/bus:/dev/bus
ports:
- 40772:40772
volumes:
- ./mirakc/epg:/var/lib/mirakc/epg
- ./config.yml:/etc/mirakc/config.yml:ro
- /home/ubuntu/recording:/var/lib/mirakc/recording
environment:
TZ: Asia/Tokyo
RUST_LOG: info
mysql:
image: mariadb:10.5
volumes:
- mysql-db:/var/lib/mysql
environment:
MYSQL_USER: epgstation
MYSQL_PASSWORD: epgstation
MYSQL_ROOT_PASSWORD: epgstation
MYSQL_DATABASE: epgstation
TZ: "Asia/Tokyo"
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --performance-schema=false --expire_logs_days=1 # for mariadb
restart: always
logging:
options:
max-size: "10m"
max-file: "3"
epgstation:
build:
context: "./EPGStation"
volumes:
- ./EPGStation/config:/app/config
- ./EPGStation/data:/app/data
- ./EPGStation/thumbnail:/app/thumbnail
- ./EPGStation/logs:/app/logs
- /home/ubuntu/recorded:/app/recorded
environment:
TZ: "Asia/Tokyo"
depends_on:
- mirakc
- mysql
ports:
- "8888:8888"
- "8889:8889"
restart: always
volumes:
mirakc-epg:
name: mirakc_epg
driver: local
mysql-db:
driver: local
services:mirakc:volumesのrecordingと、services:epgstation:volumesのrecordedの部分が肝ですが、recordingの方は不要かもしれません。contenerの外から録画したデータにアクセスするための手段として用意しています。
設定ファイル内で用意すると記載したrecordedとrecordingのディレクトについてはdocker起動時に勝手に作成されるはずです。
次にEPGStation側の設定ファイルを修正します。先ほどコピーしたconfig.ymlを修正していきます。
$ cd ~/mirakc/EPGStation/config
$ vi config.yml
先頭から20-30行ほどを以下のように変更します。2行目のmirakurunPathが肝で、EPGStationがこれでmirakurunとmirakcを判断しているようです。これが分からずしばらく悩みましたが、EPGStationの中身を見てようやくわかりました。あとは、10行目からのmysqlを利用するようにコメントアウトを外し、20行目,21行目の録画されるファイルの名前や拡張子を自分の好きなように変更します。それ以降の情報は特に変更はせず、そのままにしています。必要があれば適宜変更してください。
port: 8888
#mirakurunPath: http+unix://%2Fvar%2Frun%2Fmirakurun.sock/
mirakurunPath: http://mirakc:40772/
#dbtype: sqlite
# sqlite:
# extensions:
# - '/hoge/regexp.dylib'
# regexp: true
dbtype: mysql
mysql:
host: mysql
port: 3306
user: epgstation
password: epgstation
database: epgstation
charset: utf8mb4
# 囲み文字を置換するか
#needToReplaceEnclosingCharacters: true
epgUpdateIntervalTime: 10
conflictPriority: 1
recPriority: 2
recordedFormat: '%YEAR%%MONTH%%DAY%%HOUR%%MIN%%SEC%_%TITLE%'
recordedFileExtension: .ts
recorded:
- name: recorded
path: '%ROOT%/recorded'
thumbnail: '%ROOT%/thumbnail'
thumbnailSize: 480x270
thumbnailPosition: 5
ffmpeg: /usr/local/bin/ffmpeg
ffprobe: /usr/local/bin/ffprobe
(以下略)
設定は以上です。これでうまくいくかどうかを確認するため、デーモンモードでの動作をさせずに起動します。(しばらくしてエラーなく起動しているならCtrl-Cで止めますが、今はそのままにします。)
$ cd ~/mirakc
$ sudo docker compose up
5分程度動作させていると色々な情報が画面に出てきますが、Errorの文字列がなければ問題ありません。早速視聴PCでアクセスしてみましょう。
視聴PCでブラウザを起動し、アドレスバーに以下を打ち込みアクセスしてみます。
http://xxx.xxx.xxx.xxx:8888
以下のようにアドレスバーに打ち込んだもに/#がついた状態でダッシュボードへのアクセスができれば成功です。あとは起動してから10分以上待つと番組表もでき始め、1時間もすればある程度の番組表が出来上がるはずです。
うまくいったところで、一旦mirakc+EPGStationをCrtl-Cで止め、再度デーモンモードで起動します。
^CGracefully stopping... (press Ctrl+C again to force)
[+] Stopping 1/1
[+] Stopping 1/3rakc-epgstation-1 Stopped 1.1s
[+] Stopping 1/3rakc-epgstation-1 Stopped 1.1s
[+] Stopping 1/3rakc-epgstation-1 Stopped 1.1s
[+] Stopping 2/3rakc-epgstation-1 Stopped 1.1s
✔ Container mirakc-epgstation-1 Stopped 1.1s[+] Stopping 2/3akc Stopping 0.3s
✔ Container mirakc-epgstation-1 Stopped 1.1s[+] Stopping 3/3
✔ Container mirakc-epgstation-1 Stopped 1.1s
✔ Container mirakc Stopped 0.4s
✔ Container mirakc-mysql-1 Stopped 0.6s
canceled
$ sudo docker compose up -d
これで完了です。あとはEPGStationから録画してみましょう。録画したファイルは以下にありますのでこれを定期的にファイルサーバへ移動し、スクランブルを解除して視聴するようにスクリプトなどを組むとよいかと思います。Docker内に入ってファイルをコピーしてなどしたり、Dockerのネットワークへアクセスしたりするのが面倒なので、/home/ubuntu/recordedに録画データが入るようにしています。
最後に
いかがだったでしょうか?記載内容だけで録画サーバ自体は動作できますが、もう少し周辺環境を整える必要があります。もう少し頑張って自分なりの環境を作ってみてください。
初めて外部に向けての投稿となるので色々と至らない部分があると思いますが、見て理解いただけたら幸いです。
Discussion