7 min read

ChinachuからEPGStationに移行した

GitHub - Chinachu/Chinachu: Japanese DVR Software.
Japanese DVR Software. Contribute to Chinachu/Chinachu development by creating an account on GitHub.
GitHub - l3tnun/EPGStation: Mirakurun を使用した録画管理ソフト
Mirakurun を使用した録画管理ソフト. Contribute to l3tnun/EPGStation development by creating an account on GitHub.

R.I.P. Chinachu

Chinachu の最後のコミットは 2022年1月18日 である。
さらにChinachuで使用している Node.js v14 は 2023年4月30日 でEOLを迎えていた。
また README にはもう開発をしないと明記されている。

LAN外にはパスワードで保護されているし、基本的に閉じた環境で使っているので無視しようと思えばできるのだが、やはり今後も機能追加や修正がないことを考えると現在主流である EPGStation に移行するのが賢い選択だと思った。

Chinachu も EPGStation もチューナーサーバーには Mirakurun を推奨しており、今までの知見を活かせてとても良い。
また、 EPGStation に書かれているコードは割と Chinachu を参考にしているらしい。(要出典だがどこかで見た)

環境構築

とはいえあまり書くことがない。
EPGStation の作者の方が Mirakurun + EPGStation の compose ファイルを用意してくれており、基本的にはこれに修正を加えればすぐ動く。

GitHub - l3tnun/docker-mirakurun-epgstation: Mirakurun + EPGStation on Docker
Mirakurun + EPGStation on Docker. Contribute to l3tnun/docker-mirakurun-epgstation development by creating an account on GitHub.

ただ私は Mirakurun での録画コマンドに recpt1 を使用しているのでそれ用の Dockerfile を作成した。
(もしかして最近はそれ使わない…?)

GitHub - sugtao4423/docker-mirakurun-epgstation: My mirakurun-epgstation Docker
My mirakurun-epgstation Docker. Contribute to sugtao4423/docker-mirakurun-epgstation development by creating an account on GitHub.

私のこれには Mirakurun のチャンネル一覧やチューナーのコンフィグファイルもサンプルとして置いているので PT3 を使っている人はそのままで使いやすいと思う。

録画データの移行

有志の方がお引っ越しツールを作っていてくださるのでありがたく使わせていただく。

GitHub - SlashNephy/Chinachu2EPGS: Chinachu → EPGStation (v2) のお引越しツール
Chinachu → EPGStation (v2) のお引越しツール. Contribute to SlashNephy/Chinachu2EPGS development by creating an account on GitHub.

ただ一点、これは Mirakurun を使用しないβ時代の古い形式をそのまま移行することができなかった。
どうしても番組IDの移行箇所で落ちてしまう。

番組IDの算出方法

Chinachu β
app-scheduler.js#L503-L506

var programId = '';
programId += ch.id.toLowerCase().replace('_', '');
programId += '-';
programId += parseInt(c.$.event_id, 10).toString(36);

Mirakurun 記事執筆時点最新版 v3.9.0-rc.4
src/Mirakurun/Program.ts#L24-L26

export function getProgramItemId(networkId: number, serviceId: number, eventId: number): number {
    return parseInt(`${networkId}${serviceId.toString(10).padStart(5, "0")}${eventId.toString(10).padStart(5, "0")}`, 10);
}

このようにIDの付け方が違い、 - が36進法では不正なためスクリプトを回しても落ちてしまっていた。
しかし落ちてくれたからこそ分かったので感謝。

β時のIDの具体的な移行方法

例1

{
  "id": "gr1072-hb1",
  "channel": {
    "n": 5,
    "type": "GR",
    "channel": "23",
    "name": "テレビ東京1",
    "id": "GR_1072",
    "sid": "1072"
  },
  "category": "anime",
  "title": "ゆるゆり さん☆ハイ! 「それは、すなわち、娯楽の始まり」",
  "subTitle": "それは、すなわち、娯楽の始まり",
  "fullTitle": "【新】ゆるゆり さん☆ハイ! #1「それは、すなわち、娯楽の始まり」",
  "detail": "赤座あかりだよ!「ゆるゆり」がテレビに帰ってきたよー!夏休みも終わって学校も始まって、またごらく部のみんなで楽しいことしたいな!じゃあさっそく部室いこう!",
  "episode": 1,
  "start": 1444064700000,
  "end": 1444066500000,
  "seconds": 1800,
  "flags": ["新"],
  "isConflict": false,
  "recordedFormat": "",
  "isSigTerm": true,
  "tuner": {
    "name": "PT3-T1",
    "isScrambling": false,
    "types": ["GR"],
    "command": "recpt1 --device /dev/pt3video2 --b25 --strip --sid <sid> <channel> - -",
    "n": 2
  },
  "recorded": "/Chinachu/recorded/[151006-0205][GR23][PT3-T1]ゆるゆり さん☆ハイ! 「それは、すなわち、娯楽の始まり」.ts",
  "command": "recpt1 --device /dev/pt3video2 --b25 --strip --sid 1072 23 - -"
}
  1. チャンネル の networkId がわからないのでγ時代の他の録画から探す
  2. "id": "1i5dhps" らしい
  3. 10進数に直すと 3274201072 これには serviceId も含まれている(networkId: 32742 serviceId: 1072 とわかる)
  4. eventId はそのまま hb1 とわかる
  5. それを10進数に直すと 22429
  6. Mirakurun の書式にならってID化すると 327420107222429

例2

{
  "id": "bs211-182s",
  "channel": {
    "n": 17,
    "type": "BS",
    "channel": "211",
    "name": "BS11",
    "id": "BS_211",
    "sid": "211"
  },
  "category": "anime",
  "title": "この素晴らしい世界に祝福を!",
  "subTitle": "",
  "fullTitle": "この素晴らしい世界に祝福を! 第1話【新】",
  "detail": "",
  "episode": 1,
  "start": 1452880800000,
  "end": 1452882600000,
  "seconds": 1800,
  "flags": ["新"],
  "isConflict": false,
  "recordedFormat": "",
  "isSigTerm": true,
  "tuner": {
    "name": "PT3-S1",
    "isScrambling": false,
    "types": ["BS", "CS"],
    "command": "recpt1 --device /dev/pt3video0 --b25 --strip --sid <sid> <channel> - -",
    "n": 0
  },
  "recorded": "/Chinachu/recorded/[160116-0300][BS211][PT3-S1]この素晴らしい世界に祝福を!.ts",
  "command": "recpt1 --device /dev/pt3video0 --b25 --strip --sid 211 211 - -"
}
  1. チャンネルの networkId は今や見慣れた 8ksz だった
  2. 10進数で 400211 (networkId: 4, serviceId: 211)
  3. eventId: 182s57124
  4. Mirakurun 書式で 40021157124

困ったことはこれくらいで、他はすべて順調だった。

移行してみて

※ v2.10.0
移行してから2週間ほど経ったがだいぶ慣れてきた。

当初、録画済み一覧の画面あたりの表示件数がだいぶ少なくて見づらいと感じていたが、そもそも録画済み一覧を見返すことがあまりなかった。
だが時たま「昔のいつの番組だっけな~」の時には見づらく思う。

Chinachu 時代の録画終了コマンドに加え、録画前や録画失敗時のコマンド実行をできるようになったのはとても良い。
Slack へ諸々の通知を飛ばしているが、リアルタイムに状況を把握できて良い。

スクショ

最後に R.I.P. の気持ちも込めて両者のスクショでも貼っておこうと思う。
記憶を記録。

name Chinachu EPGStation
ダッシュボード
放送中
Operatorログ なし
Schedulerログ なし
WUIログ なし
ストレージ
番組表
番組表表示ジャンル設定
番組表表示設定 なし
番組検索 (EPGStationはルール作成兼用)
ルール一覧
ルール作成 (EPGStationは検索兼用)
予約済み一覧
予約詳細
録画済み一覧
録画済み詳細
コンフィグ なし

おわり

自分のツイートを遡ったらどうやら2015年8月から Chinachu を使い始めたらしい。
9年という長い間お世話になって作者様にはとても感謝。
そりゃ新しいUIに違和感を感じるわけだよね。

Docker のファイル構造をきれいにしたり録画データの移行で少し詰まったりしていたので9時間かかってやっと移行作業が完了した。
だけどこれからも開発され続けていくであろうことを願って移行してよかった。

昨今テレビという媒体が下火な印象しかないが、やはりリアルタイムな放送を「自分で録画する」という楽しみからは逃れられない。
これからも安定した録画をよろしく頼むよ…!