🚀

EPGStation v2 で epg updater is disconnected が発生する

に公開

はじめに

EPGStation を Mac の 外付けSSD に入れて動かしているんですけど、たまに、意図しない取り外しが発生してたりするんですよね。
(内蔵SSD をアダプタで挿してるからですかね?)
まぁ、そんなこんなで、取り外しが発生すると、大体アクセスできなくなって落ちるで済むんですけど、たまにタイトルの通り epg updater is disconnected が発生したりするんですよね。
で、1回やらかしたときのことを忘れて、また調べる羽目になったので、メモります。
(Mirakcタグを付けましたが、関係するのは最後のおまけだけです)

原因

人によっては察しているかと思いますが、チャンネルなりプログラムなり、DBが壊れます。
というわけで、これを修正すれば直ると思います。
(今のところ、プログラムのDBが壊れたパターンしか知らないのですが(というか前回を忘れたので)、もしかしたら、もっとヤバいパターンがあるかもです)

調査/直し方

基本的には、DBが壊れているだけなので、下記の記事を参照すればおk。
https://zenn.dev/megeton/articles/60a77989bc6189
いうわけで、何が壊れているのか確認します。
デフォルトでは(多分) EPGStation/logs/EPGUpdater/system.log に、システム的なログが出ているハズです。
今回は、[ERROR] system - update programs error というエラーが出ていました。
ので、program あたりが壊れているのでしょう。
というわけで、確認。(パスはいい感じにしてください)

sqlite3 /Volumes/RecServSSD2/EPGStation/data/database.db "SELECT COUNT(*) FROM program"

メモ取り忘れちゃったので、何が出てたか忘れましたが、

Error: stepping, database disk image is malformed (11)

みたいなのが出るハズ。(記事からパク引用)
なので、修復。

sqlite3 /Volumes/RecServSSD2/EPGStation/data/database.db ".recover" | sqlite3 /Volumes/RecServSSD2/EPGStation/data/database_recovery.db

引用記事にありますが、dumpじゃダメらしいですね。
で、あとは置き換えたら終わり。
上のコマンドあたりで、ちゃんと修復できたか確認すれば良いでしょう。

おわりに

チューナーの続きをやりたいのに、時間が無い、とかしてたら、別のトラブルが発生してしまいました。
過去の自分がメモって無かった所為で、history から対処方法を思い出すとかいう、めんどくさいことをやる羽目に……。
ちゃんと備忘録を置いておきましょう。
チューナーは、そのうち、頑張りたい……。
それはそれとして、Macくんが、2.5GbeのUSBの変換アダプタを使ってNASと直結すると、断続的に切れるとかいう謎現象を発生させていて、それはそれで困っています。
(なぜか1.0Gbeなら問題ないっぽいんですよねぇ……)
(Realtekのチップセットが悪いのでは、という噂)
それも対処しなきゃ……。

おまけ

EPGStation + Mirakc で運用しているのですが、

[ERROR] system - event stream get error
[ERROR] system - Error: operationId "getEventsStream" is not found.
    at Client.call (/Volumes/RecServSSD2/EPGStation/node_modules/mirakurun/lib/client.js:111:19)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
[ERROR] system - destroy event stream

と煩かったので、対応しました。
EPGStation/src/model/epgUpdater/EPGUpdater.ts の 72行目あたりについて、
startEventStreamAnalysis() の Mirakurun の EventStream を取得するための箇所を

    /**
     * mirakurun の event stream 解析開始
     * stream に問題が発生した場合は this.isEventStreamAlive が false になる
     */
    private async startEventStreamAnalysis(): Promise<void> {
    //    this.isEventStreamAlive = true;
    //    try {
    //        await this.updateManage.start();
    //    } catch (err: any) {
    //        this.log.system.error('destroy event stream');
    //        this.isEventStreamAlive = false;
    //    }
        this.isEventStreamAlive = false;
    }

な感じで、コメントアウトしてしまえばいいです。
どうせ、this.updateManage.start()の先で、エラーをキャッチして返しているので。
(EPGUpdateManageModel.ts の 194行目 を呼び出しますが、201行目でthrow errし、206行目でerror時の処理をし、その先はEvent Streamを取れた場合の処理なので)
というわけでオマケでした。
Mirakcで録画すれば良く無い?は、それはそうなので、出来る人はそうしましょう。
番組名録画予約の方法がよくわからんので、やってません。
そのうちやりたいです。

Discussion