Proxmox VEでdocker-mirakc-konomitvを使ってテレビ視聴サーバーを構築する

## はじめに

### docker-mirakc-konomitv について

[docker-mirakc-konomitv](https://github.com/heisannn/docker-mirakc-konomitv) は、Docker Compose を使って [mirakc][link-mirakc] と [KonomiTV][link-konomitv] を簡単にセットアップできるようにしたものです。
本記事を執筆するにあたり、各プログラムのドキュメント等を参考に作成しました。
また、リポジトリの README.md は [l3tnun/docker-mirakurun-epgstation](https://github.com/l3tnun/docker-mirakurun-epgstation) を参考にさせていただきました。

### mirakc について

[mirakc][link-mirakc] とは、Rust言語で記述された [Mirakurun](https://github.com/Chinachu/Mirakurun) クローンです。Raspberry Piのような[シングルボードコンピュータ](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)（SBC）をターゲットデバイスとして、[masnaga](https://github.com/masnagam) 氏によって開発されています。
詳細については、https://mirakc.github.io/dekiru-mirakc/v3/what.html をご覧ください。

:::note info
[Mirakurun](https://github.com/Chinachu/Mirakurun) は、地デジ・BS/CSチューナーで受信した信号をネットワーク上に共有することができるソフトウェアです。
:::

### KonomiTV について

[KonomiTV][link-konomitv] とは、いろいろな場所とデバイスでテレビを快適に見られる、モダンな Web ベースのソフトウェアです。[tsukumijima](https://github.com/tsukumijima) 氏によって開発されています。
現時点ではテレビをリアルタイムで視聴することしかできませんが、将来的には録画した番組を視聴できる機能も追加されるそうです。

## 仮想マシンのセットアップ

仮想マシンの作成・OSのインストールについては割愛させていただきます。

### チューナー・ICカードリーダーのパススルー

チューナーとICカードリーダーを仮想マシンから使用するために、USBデバイスのパススルーを設定します。


![tvq08uad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810493/bb8d414c-97f1-b4b9-706b-47a97b0c7ac5.png)

## Docker のインストール

:::note warn
これ以降の作業は仮想マシン上で行うものとします。
Proxmox VE に直接 Docker をインストールしないでください！
:::


以下のコマンドを実行することで、Docker と Docker Compose を簡単にインストールすることができます。
```bash
curl -fsSL https://get.docker.com | sh
```

## ドライバのインストール

お使いのチューナーによって変わるため、詳細なインストール手順は割愛します。
今回は PX-W3PE5 を使用するため、以下のドライバをインストールしました。
https://github.com/tsukumijima/px4_drv

## docker-mirakc-konomitv の導入

今回は、[docker-mirakc-konomitv][link-docker-mirakc-konomitv] を使って [mirakc][link-mirakc] と [KonomiTV][link-konomitv] をインストールします。

### インストールスクリプトを実行

以下のコマンドでインストールスクリプトを実行します。

```bash
curl -sf https://raw.githubusercontent.com/heisannn/docker-mirakc-konomitv/main/setup.sh | sh -s
```

カレントディレクトリに ``docker-mirakc-konomitv`` フォルダが作成されるため、移動します。

```bash
cd docker-mirakc-konomitv
```

### 設定の変更など

#### docker-compose.yaml の編集

お使いのチューナーに合わせて、``devices`` に列挙するデバイスを変更してください。

```yml:./docker-compose.yaml
services:
  mirakc:
    image: mirakc/mirakc:alpine
    container_name: mirakc
    init: true
    restart: unless-stopped
    devices:
      # チューナーコマンドで利用するデバイスファイルを列挙
      - /dev/px4video0
      - /dev/px4video1
      - /dev/px4video2
      - /dev/px4video3
    # 以下略
```

#### mirakc の設定

##### チューナーの設定

[チューナー設定・できるmirakc](https://mirakc.github.io/dekiru-mirakc/v3/config/tuners.html) を参考に、お使いのチューナーに合わせて設定してください。

ここでは、PX-W3PE5 を使用する際の設定を載せておきます。

```yml:./mirakc/config.yml
tuners:
  - name: GR0
    types: [GR]
    command: recpt1 --device /dev/px4video2 {{{channel}}} - -
  - name: GR1
    types: [GR]
    command: recpt1 --device /dev/px4video3 {{{channel}}} - -
  - name: BSCS0
    types: [BS, CS]
    command: recpt1 --device /dev/px4video0 {{{channel}}} - -
  - name: BSCS1
    types: [BS, CS]
    command: recpt1 --device /dev/px4video1 {{{channel}}} - -
```

##### チャンネルの設定

mirakc には、利用可能なチャンネルをスキャンする機能は備わっていません。

[地上デジタル放送 チャンネル表](https://www.maspro.co.jp/wp-content/themes/maspro/file/reference/tv-channel-list.pdf) などを参考に手動で設定することもできますが、今回は [uru2/scan_ch_mirakc_docker.sh](https://gist.github.com/uru2/7f738d864c2789b35c35e6bb7be9d0cb) を使って、チャンネルスキャンをしてみます。

スクリプトをダウンロードします。

```bash
wget https://gist.githubusercontent.com/uru2/7f738d864c2789b35c35e6bb7be9d0cb/raw/a113304cd4d30eacc154f88aa61704e5078521eb/scan_ch_mirakc_docker.sh
```

:::note warn
お使いのチューナーによってはスクリプトを編集する必要があります。必要に応じて[作者さんのコメント](https://gist.github.com/uru2/7f738d864c2789b35c35e6bb7be9d0cb?permalink_comment_id=4278192#gistcomment-4278192)を参考に編集してください。
:::

また、スクリプトには ``jq`` が使われているため、インストールします。

```bash
sudo apt install -y jq
```

今回は PLEX の PX-W3PE5 を使用するため、編集は不要です。そのまま実行します。

```bash
chmod +x ./scan_ch_mirakc_docker.sh
./scan_ch_mirakc_docker.sh
```

:::note info
実行には30分程度かかるため、気長に待ちましょう。
:::

チャンネルスキャンが終わると ``mirakc_channels.yml`` が生成されるので、その内容を ``mirakc/config.yml`` に追記します。

```bash
cat mirakc_channels.yml >> mirakc/config.yml
```

#### KonomiTV の設定

必要な個所のみを抜粋して掲載します。

##### config.yaml の編集

```diff_yaml:./KonomiTV/config.yaml
# ================================== 全般の設定 ==================================
general:

    # 利用するバックエンド
    # EDCB・Mirakurun のいずれかを選択してください。
    # バックエンドに Mirakurun が選択されているときは、録画予約機能は利用できません。
-   backend: 'EDCB'
+   backend: 'Mirakurun'
```

##### docker-compose.yaml の編集

今回はGPUをパススルーしていないため、以下の項目をコメントアウトします。

```diff_yaml:./KonomiTV/docker-compose.yaml
services:
  konomitv:
    # ==================== ↓↓↓↓↓ ここからユーザー設定 ↓↓↓↓↓ ====================

    # QSVEncC / VCEEncC を利用する (Intel Graphics / AMD GPU にアクセスする) ために必要な設定
    # VCEEncC (AMD GPU) を利用するには、別途 AMDGPU-PRO Driver のインストールが必要です。
    # GPU が1個も搭載されていない (/dev/dri/ 以下のデバイスファイルが存在しない) 特殊な環境では、
    # コメントアウトしてこの設定を無効にしないと、KonomiTV サーバーを起動できなくなります。
-   devices:
-     - '/dev/dri/:/dev/dri/'
+   # devices:
+     # - '/dev/dri/:/dev/dri/'
```

## 起動する

以下のコマンドを実行してコンテナ群を立ち上げます。
初回起動時に各コンテナのビルドが走るため、気長に待ちます。

```bash
sudo docker compose up -d
```

起動ができたら、KonomiTVにアクセスしてみます。

私の環境だと、URLは ``https://192-168-3-170.local.konomi.tv:7000/`` となります。

:::note info
KonomiTVでは、自己署名証明書のインストールなしで HTTPS でのアクセスを実現するために特殊な仕組みを使っています。詳しくは、[https://aa-bb-cc-dd.local.konomi.tv:7000/ の URL について](https://github.com/tsukumijima/KonomiTV?tab=readme-ov-file#httpsaa-bb-cc-ddlocalkonomitv7000-%E3%81%AE-url-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6) をご覧ください。
:::

アクセスしてみると、こんな感じの画面になります。

![cXtxrbc4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810493/2c84a11d-4126-8d26-f893-bbef494c0bcc.png)

:::note warn
``視聴可能なチャンネルがありません。`` と表示されていますが、これは現在 mirakc が EPGデータ を取得している途中だからです。
取得が終わるまで気長に待ちましょう。
:::

## 最後に

### B25 デコードについて

mirakc には、B25 デコードを行う機能がありません。そのため、フィルター設定にて外部サーバーでTSストリームを処理するようにし、その結果を mirakc に返却してもらって出力しています。

[docker-mirakc-konomitv][link-docker-mirakc-konomitv] では、[tsdサーバーの詳しい話・できるmirakc](https://mirakc.github.io/dekiru-mirakc/v3/tsd_server.html) を参考に、``b25`` コンテナと ``bcas`` コンテナを使って B25 デコードを実現しています。
``b25`` コンテナでは、[tsukumijima/libaribb25](https://github.com/tsukumijima/libaribb25) が動いています。

詳細については、[フィルター設定・できるmirakc](https://mirakc.github.io/dekiru-mirakc/v3/config/filters.html) などをご覧ください。

## 参考資料

- [masnagam](https://github.com/masnagam) - [mirakc/mirakc](https://github.com/mirakc/mirakc), [できるmirakc](https://mirakc.github.io/dekiru-mirakc/v3/)
- [tsukumijima](https://github.com/tsukumijima) - [tsukumijima/KonomiTV](https://github.com/tsukumijima/KonomiTV)
- [uru2](https://github.com/uru2) - [uru2/scan_ch_mirakc_docker.sh](https://gist.github.com/uru2/7f738d864c2789b35c35e6bb7be9d0cb)
- [l3tnun](https://github.com/l3tnun) - [l3tnun/docker-mirakurun-epgstation](https://github.com/l3tnun/docker-mirakurun-epgstation)

[link-mirakc]: https://github.com/mirakc/mirakc
[link-konomitv]: https://github.com/tsukumijima/KonomiTV
[link-docker-mirakc-konomitv]: https://github.com/heisannn/docker-mirakc-konomitv