録画PCのログをDiscordに垂れ流す

経緯

数年前から、録画PCのログをTwitterの自分のアカウント上に投稿するように設定していましたが、これが原因でTwitter側から「機械的な投稿をするアカウント」と認識されてしまい、Twitter検索等にツイートが引っかからなくなってしまっていました。
自分のツイートをTwitterで検索する際には問題ないのですが、他のアカウントからツイートが検索結果に出ないのはアプリの宣伝などにおいてちょっと不利かなと思ったのでログをTwitterではなくクローズドな自分専用のDiscordサーバーに移すことにしました。

ログ出力BOTの仕組み

従来のログBOT

以前までは、Javaで自作したプログラム(advancedbear/TvRock-Log-Tweet2)を用いて、tvrockのコマンド機能からツイートを投稿していました。
tvrockに限らずとも、昨今の高機能録画ソフトウェア(EDCBやChinachuなど)であればコマンド実行機能は備わっていると思うので、そういったソフトを利用していても同様の仕組みで実行できるはずです。

新しいログBOT

今回、Discordに投稿するにあたってDiscordクライアント上で簡単にBOTアカウントを作成できる「Discord Webhook」を利用してみました。
今回はプログラムをNode.jsで書いてみました。

Webhookとは?

簡単に言うと、「HTTP経由でAPIを叩くと実行されるBOT」です。

 PC版Discordクライアントを立ち上げ、管理者権限を持っているサーバーのテキストチャンネルを右クリックし「チャンネルの編集」を選択します。

 左メニューのWebhooksを選択肢、右上の「Webhookを作成」をクリックします。

BOTの名前と、投稿先のチャンネルを指定します。
1つのBOTアカウントは1つのチャンネルにしか投稿はできません。
一番下の「WEBHOOK URL」欄のアドレスが、BOT実行に必要なURLとなります。

Webhookの各APIはhttps://discordapp.com/developers/docs/resources/webhookから見ることが出来ます。
基本的には「テキストチャットへの投稿」しか行えず、サーバーのユーザー操作等は出来ませんし、Discord上でのイベントをキーにBOTを動作させるような場合にはWebhookは利用できません。

BOTプログラム

前述の通り、Node.jsで書きました。
最初は出来るだけ外部モジュールを使いたくなかったので、requestを使ってやり過ごそうとしたのですが、ファイル送信が上手くできなかったのでdiscord.jsを使っています。
機能は
  • 録画予約時に「番組名、日付、時間、チャンネル」を投稿
  • 録画開始時に「番組名、時間、チャンネル、受信強度、ビットレート」を投稿
  • 録画終了時に「番組名、時間、チャンネル、エラー数、受信感度、ビットレート、ドロップ数、スクランブル数」を投稿
  • 録画ファイルにドロップがある場合、ドロップした時間周辺の1秒を画像として投稿
を用意しました。
実際のtvrock用のNodeプログラムのソースは以下になります。

実際に動かしてみた

上記のコードは、ドキュメントフォルダ下のtvrockフォルダに配置した上で、ffmpeg.exetscheck.exeを同一ディレクトリ内に置く必要が有ります。
また、tvrockフォルダ内で
npm install discord.js
npm install iconv-lite
を実行する必要があります。

あとはtvrockの設定からコマンド欄に
CS:node <tvrockフォルダ>\main.js start "%d" "%k~%l [%5]"
CE:node <tvrockフォルダ>\main.js end "%d" "%k~%l [%5]" "%1"
CR:node <tvrockフォルダ>\main.js reserve "%d" "%j %k~%l [%5]"
を設定するだけです。

あとは各イベント発生時にtvrockが勝手にBOTを実行し、Discord上に通知を飛ばしてくれます。

録画予約時

tvrockは日付変更時に録画予約が実行されるので、日付変更直後に一気に複数個の通知が飛んできます。

録画開始時

録画開始時に受信強度(Sig値)が極端に低い(11.0dB未満)場合には自分宛てにメンションを飛ばすことにより「アンテナおかしくない?」の確認ができるようにしました。
ただ、チューナーが起動直後で電波を受信し始める前だったりすることはあるので必ずアンテナがおかしいとは限らないです。

録画終了時

その他のログもそうですが、このBOTが表示している各パラメーターはtvrockが出力するログ(tvrock.log2)からスクレイピングして表示しています。
なので、実際の録画ファイルには録画されないDrop値やScrambling値が含まれることが有ります。
BS11は毎回Scramblingが毎秒1ずつ増えるのですが、これは録画されたtsファイルには記録されないPIDのものなので問題がない場合になります。

ドロップ発生時

ドロップ発生時は、tscheckに録画済みtsファイルを受け渡し、その結果を投稿します。
ドロップしたPIDを一覧表示し、Total値が一番大きいもの(≒映像PID)のドロップ秒数をffmpegへ渡し、画像として出力します。
出力された画像は、どのようなシーンがドロップしたかがひと目で分かるので意外と便利です。
ショックを受けることも多いですが・・・。(CM中などならともかく、この画像のように本編中だとかなりショックです)

今後の課題

コードが汚い

どうしてもファイル操作が入るので、出来れば非同期実行したいところなのですが、複数プロセスで同時にtscheckやffmpegを走らせるとPC側への負荷が大きいためやむを得ず同期実行しています。
そのせいで、見るも無残なコールバック地獄に陥ってしまっています。
最初はPromise辺りを使って綺麗に書くこともチャレンジしていたのですが、結局面倒くさくなりコールバック地獄と化しました。
メンテナンス性が最悪なのでどうにかしたいところですが、このまま放置もありそうです。

利用について

上記のコードは自由に使ってもらって構いません。
tvrock以外の録画ツールで実行する際にはログファイルの辺りを全部書き直さないとダメだと思うので、イチから書き直したほうが楽かもしれません。
アイデアは自由に使ってもらって結構です。

コメント