Windows10環境でpx4_drvを使ってMirakurun＋EPGStationを構築する

備忘録

## 今回使うもの
- チューナーカード（TV02A-4TS-P）
- カードリーダー（SCR3310）
- 適当なx64のPC（i5-4670, H87）
- Mirakurun@3.9.0-rc.2
- EPGStation@2.6.20


## どんどんインストールする
### カードリーダのドライバ
https://www.ntt.com/business/services/application/authentication/jpki/download2.html

### Node.js
https://nodejs.org/

v16のLTSをインストールする。
インストーラーの設定追加は不要。

### Git for Windows
https://gitforwindows.org/

改行コード周りの問題を防ぐため、以下の項目について`Checkout as-is, commit as-is`を選択する。
![gitforwindows.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2353160/448f28af-543a-cfed-3e2a-7796efb8ff46.png)

### Visual C++ 再頒布可能パッケージ
https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist

たしか2019が必要だったはず。
[このファイル](https://aka.ms/vs/17/release/vc_redist.x64.exe "最新の64bit用ファイルのちょくりんく")を使えば2019を含む最新のパッケージをインストールできる。

### FFmpeg
https://github.com/BtbN/FFmpeg-Builds/releases

BtbN版の`win64-gpl-shared.zip`をDLして解凍、Cドライブ直下に配置する。
Pathを通しておくと後々便利。

### Mirakurunとwinser
PowerShellを管理者モードで起動する。
下にあるコマンドをドンドン実行する。

```text:現時点ではMirakurun側のバグが解消されていないようなので、念のため環境変数を設定する
$env:npm_config_global = 'false'

npm install winser@1.0.3 -g
npm install mirakurun@latest -g --foreground-scripts --production
```

#### Mirakurunの動作チェック
次のURLをブラウザで開くか、PowerShellか何かでリクエストする。
正常に動いていればバージョン情報が帰ってくる。
`http://127.0.0.1:40772/api/version`

ユーザーディレクトリ直下に`.Mirakurun`フォルダが出来ていなかったらVisual C++パッケージを忘れている可能性がある。

```text:ブラウザで開くとこんな感じ
{"current":"3.9.0-rc.2","latest":"3.9.0-rc.2"}
```

```text:PowerShellでやるとこんな感じ。IEを一度も起動したことが無いと怒られるので注意
Invoke-WebRequest http://127.0.0.1:40772/api/version
```
```
StatusCode        : 200
StatusDescription : OK
Content           : {"current":"3.9.0-rc.2","latest":"3.9.0-rc.2"}
RawContent        : HTTP/1.1 200 OK
                    Vary: Origin
                    Connection: keep-alive
                    Keep-Alive: timeout=5
                    Content-Length: 46
                    Content-Type: application/json; charset=utf-8
                    Date: Sun, 09 Oct 2022 22:53:11 GMT
                    Server: Mirakurun/...
Forms             : {}
Headers           : {[Vary, Origin], [Connection, keep-alive], [Keep-Alive, timeout=5], [Content-Length, 46]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 46
```

#### windows-build-toolsの確認
```text:EPGStationをインストールする前にパッケージをチェックする
npm info windows-build-tools
```

### EPGStation
EPGStationを配置したいディレクトリに移動してから実行する。
今回はユーザーディレクトリに配置した。

```text:環境変数をお忘れ無く
$env:npm_config_global = 'false'

// ここから読み始めた人はwinser入れてね
npm install winser@1.0.3 -g

git clone https://github.com/l3tnun/EPGStation.git
cd EPGStation
npm run all-install
npm run build

copy .\config\config.yml.template .\config\config.yml
copy .\config\operatorLogConfig.sample.yml .\config\operatorLogConfig.yml
copy .\config\epgUpdaterLogConfig.sample.yml .\config\epgUpdaterLogConfig.yml
copy .\config\serviceLogConfig.sample.yml .\config\serviceLogConfig.yml
copy .\config\enc.js.template .\config\enc.js
```

Configファイルを編集する。
必要に応じてffmpegのPathを読み替える。
mirakurunPathを`localhost`にするとダメらしい。
```text:.\EPG-Station\config\config.yml
port: 8888
mirakurunPath: 'http://127.0.0.1:40772'
ffmpeg: 'C:\\ffmpeg\\bin\\ffmpeg.exe'
ffprobe: 'C:\\ffmpeg\\bin\\ffprobe.exe'

# 必要に応じてドロップチェック
# "isEnabledDropCheck": true
```

サービスに登録して自動起動する。
```
npm run install-win-service
net start epgstation
```

## BonDriverとデコーダーなど
今回はCドライブ直下にPathを通した`BonDriver`フォルダを作成し、そこにBon関係のファイルを全て放り込む。

### BonDriver
https://github.com/tsukumijima/px4_drv

りどみに従ってWinUSB版を導入する。
今回使用するチューナーは1チューナーで3波受信できるMLT系なので、`BonDriver_PX-MLT`を使用する。
フォルダ内の全てファイルを`BonDriver`フォルダにコピーする。

### BonRecTest
https://github.com/rndomhack/BonRecTest

Releasesからzipを落として解凍、x64の中にある`BonRecTest.exe`を`BonDriver`フォルダにコピーする。

### libaribb25
https://github.com/tsukumijima/libaribb25

Releasesからzipを落として解凍、64bitの中にある全てのファイルを`BonDriver`フォルダにコピーする。



## Mirakurunの設定
### channels.yml
`%UserProfile%\.Mirakurun\channels.yml`

不要なチャンネルはあらかじめ消してある。流用する方は注意。
3波受信できるMLT系向けの設定です。
地デジとBS/CSが物理的に別チューナーのモデルの場合は、BS/CSエントリの`space`を1減らします。
|space|通常|MLT|
|:-|:-|:-|
|GR(地デジ)|0|0|
|BS|0|1|
|CS|1|2|

<details>
<summary>関東圏の人はコレを使おう。BS/CSは全国共通（のはず）</summary>

```text:%UserProfile%\.Mirakurun\channels.yml
- name: ＮＨＫ総合・東京
  type: GR
  space: 0
  channel: '14'
- name: ＮＨＫＥテレ・東京
  type: GR
  space: 0
  channel: '13'
- name: チバテレ
  type: GR
  space: 0
  channel: '17'
- name: 日テレ
  type: GR
  space: 0
  channel: '12'
- name: フジテレビ
  type: GR
  space: 0
  channel: '8'
- name: ＴＢＳ
  type: GR
  space: 0
  channel: '9'
- name: テレビ東京
  type: GR
  space: 0
  channel: '10'
- name: テレビ朝日
  type: GR
  space: 0
  channel: '11'
- name: ＴＯＫＹＯ　ＭＸ
  type: GR
  space: 0
  channel: '3'

- name: ＢＳ朝日
  type: BS
  space: 1
  channel: '0'
- name: ＢＳ－ＴＢＳ
  type: BS
  space: 1
  channel: '1'
- name: ＢＳテレ東
  type: BS
  space: 1
  channel: '2'
- name: ＮＨＫＢＳプレミアム
  type: BS
  space: 1
  channel: '4'
- name: ＢＳ１１イレブン
  type: BS
  space: 1
  channel: '7'
- name: ＢＳ１２トゥエルビ
  type: BS
  space: 1
  channel: '9'
- name: ＢＳ日テレ
  type: BS
  space: 1
  channel: '13'
- name: ＢＳフジ
  type: BS
  space: 1
  channel: '14'
- name: ＮＨＫＢＳ１
  type: BS
  space: 1
  channel: '16'
```
</details>

BS/CSのチャンネルが不明な場合は全てのチャンネルを設定して受信する。
受信できたチャンネルだけ残して他は消すことでチャンネルスキャンの代わりになる。
<details>
<summary>BS/CS全てのチャンネルを記載しているのはこっち</summary>

```text:%UserProfile%\.Mirakurun\channels.yml  (BS/CS部分だけ書き換える）
- name: BS01/TS0
  type: BS
  space: 1
  channel: '0'
- name: BS01/TS1
  type: BS
  space: 1
  channel: '1'
- name: BS01/TS2
  type: BS
  space: 1
  channel: '2'
- name: BS03/TS0
  type: BS
  space: 1
  channel: '3'
- name: BS03/TS1
  type: BS
  space: 1
  channel: '4'
- name: BS05/TS0
  type: BS
  space: 1
  channel: '5'
- name: BS05/TS1
  type: BS
  space: 1
  channel: '6'
- name: BS09/TS0
  type: BS
  space: 1
  channel: '7'
- name: BS09/TS1
  type: BS
  space: 1
  channel: '8'
- name: BS09/TS2
  type: BS
  space: 1
  channel: '9'
- name: BS11/TS1
  type: BS
  space: 1
  channel: '10'
- name: BS11/TS2
  type: BS
  space: 1
  channel: '11'
- name: BS11/TS3
  type: BS
  space: 1
  channel: '12'
- name: BS13/TS0
  type: BS
  space: 1
  channel: '13'
- name: BS13/TS1
  type: BS
  space: 1
  channel: '14'
- name: BS13/TS2
  type: BS
  space: 1
  channel: '15'
- name: BS15/TS0
  type: BS
  space: 1
  channel: '16'
- name: BS15/TS1
  type: BS
  space: 1
  channel: '17'
- name: BS19/TS0
  type: BS
  space: 1
  channel: '18'
- name: BS19/TS1
  type: BS
  space: 1
  channel: '19'
- name: BS19/TS2
  type: BS
  space: 1
  channel: '20'
- name: BS19/TS3
  type: BS
  space: 1
  channel: '21'
- name: BS21/TS0
  type: BS
  space: 1
  channel: '22'
- name: BS21/TS1
  type: BS
  space: 1
  channel: '23'
- name: BS21/TS2
  type: BS
  space: 1
  channel: '24'
- name: BS23/TS0
  type: BS
  space: 1
  channel: '25'
- name: ND02
  type: CS
  space: 2
  channel: '0'
- name: ND04
  type: CS
  space: 2
  channel: '1'
- name: ND06
  type: CS
  space: 2
  channel: '2'
- name: ND08
  type: CS
  space: 2
  channel: '3'
- name: ND10
  type: CS
  space: 2
  channel: '4'
- name: ND12
  type: CS
  space: 2
  channel: '5'
- name: ND14
  type: CS
  space: 2
  channel: '6'
- name: ND16
  type: CS
  space: 2
  channel: '7'
- name: ND18
  type: CS
  space: 2
  channel: '8'
- name: ND20
  type: CS
  space: 2
  channel: '9'
- name: ND22
  type: CS
  space: 2
  channel: '10'
- name: ND24
  type: CS
  space: 2
  channel: '11'
```
</details>

### tuners.yml
`%UserProfile%\.Mirakurun\tuners.yml`
チューナーが4つあるのでエントリを4つ配置する。
名前は適当でOK。
三波受信できるのでtypesはGR･BS･CSを指定。
decoderは未指定でOK。
`BonDriver`フォルダのパスを通さずに、各ファイル絶対パスで記述しても動く。
ダブルクォーテーションで囲んで動くかは確認していない。

```text:%UserProfile%\.Mirakurun\tuners.yml
- name: DTV02A-4TS-0TS
  types:
    - GR
    - BS
    - CS
  command: BonRecTest.exe --log --decoder B25Decoder.dll --driver BonDriver_PX-MLT.dll --output - --space <space> --channel <channel>
  decoder: ~
  isDisabled: false

- name: DTV02A-4TS-1TS
  types:
    - GR
    - BS
    - CS
  command: BonRecTest.exe --log --decoder B25Decoder.dll --driver BonDriver_PX-MLT.dll --output - --space <space> --channel <channel>
  decoder: ~
  isDisabled: false

- name: DTV02A-4TS-2TS
  types:
    - GR
    - BS
    - CS
  command: BonRecTest.exe --log --decoder B25Decoder.dll --driver BonDriver_PX-MLT.dll --output - --space <space> --channel <channel>
  decoder: ~
  isDisabled: false

- name: DTV02A-4TS-3TS
  types:
    - GR
    - BS
    - CS
  command: BonRecTest.exe --log --decoder B25Decoder.dll --driver BonDriver_PX-MLT.dll --output - --space <space> --channel <channel>
  decoder: ~
  isDisabled: false
```

### server.yml
`%UserProfile%\.Mirakurun\server.yml`
```text:%UserProfile%\.Mirakurun\server.yml
# 先日のスパイファミリーの件もあるのでEPGの更新頻度を900秒
epgGatheringInterval: 900000

# IPv6なんもわからないのでオフっとく
disableIPv6: true

# EPGStationが127.0.0.1を参照できなくなったので、念のため127.0.0.0/8を入れとく
allowIPv4CidrRanges:
  - 127.0.0.0/8
  - 192.168.0.0/16


## EPGStationの設定
ffmpeg周りなどを後ほど詳しく書く（予定）

```