📺

Rock5BでTV録画サーバを作る(後編)

2024/09/22に公開

後半戦に入ります。
前編ではハードウエアやソフトウエアなどの準備、OSの設定などを実施しました。
後半ではDockerの準備とEPGStation,Mirakcの設定をしていきます。

Dockerの準備

2024/9/15時点ではRock5Bで利用可能なLinuxではDockerが古く、エラーになってしまうようです。仕方がないので、Dockerのページ をみてDockerを新しくします。
https://docs.docker.com/engine/install/ubuntu/

$ 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のサイト に従ってインストールを進めていきますので、確認していらなくなったら消したりもしていきます。
https://mirakc.github.io/dekiru-mirakc/v3/
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