/*
 NicoJK
  TVTest ニコニコ実況プラグイン
*/

■なにこれ？
ニコニコ実況を表示するTVTest用のプラグインです。

# このプラグインはjkcnsl( https://github.com/xtne6f/jkcnsl )アプリを介してニコニ
# コのテレビ実況サーバ(live.nicovideo.jp)と非公式に通信します。サーバに高負荷を
# 与えるような利用や改変をしないでください。


■使い方
NicoJK.tvtpおよびNicoJK.iniをTVTestのPluginフォルダに入れてください。jkcnsl.exe
はTVTest.exeのあるフォルダに入れてください。

ログファイルへの記録機能は、NicoJK.iniのlogfileModeを1か2にして、Pluginsフォルダ
の中に"NicoJK"というフォルダを作っておくと有効になります。ログは"NicoJK"フォルダ
に保存されていきます。録画中に受信した実況コメントがファイル再生プラグイン(何で
もいい)で再生中に表示されればOKです。

おもにEpgDataCap_Bonの"Viewボタン"に協調する機能として、/jkshpid起動オプションを
用意しています。TVTestを
> TVTest.exe /jkshpid {EpgDataCap_BonのプロセスID}
のように起動することでEpgDataCap_Bonの録画状態に応じたログの記録や、EDCBのWebUI
に対するコメントの提供が可能です。
※NicoJK.iniのcommentShareMode、logfileMode、logfileDriversを調整してください。

同梱のjkimlog.exeは外部のログファイルを"NicoJK"フォルダに取り込むコマンドライン
ツールです。使用する場合はjkimlog.exeを"NicoJK"フォルダの直下に置いてください。
ログファイル(.jklか.xmlか.txtで、ファイル名のどこかに"jk{番号}"を含むこと)のパス
を引数に与えて使います。すでに存在するログと重複するときは、重複する範囲のログが
トリムされてから取り込まれます。ログファイルをjkimlog.exeにD&Dするだけで使えます
が、以下のような内容の.batファイルをショートカット代わりにすると便利です:
> @echo off
> "Path\to\TVTest\Plugins\NicoJK\jkimlog.exe" %1
> if %errorlevel% equ 0 del %1
> pause

同梱のjkrdlog.exeは実況番号やチャンネルと時間を指定してログを標準出力するコマン
ドラインツールです。使用する場合はjkrdlog.exeを"NicoJK"フォルダの直下に置いてく
ださい。出力の仕様については後述の開発者むけの説明も参照してください。
等速でjk2の2023-01-01T00:00:00からのログを出力:
> "Path\to\TVTest\Plugins\NicoJK\jkrdlog.exe" -r 100 jk2 1672498800 0

■設定
NicoJK.iniを確認してください。

2024年6月のニコニコの障害以降、NX-Jikkyo( https://nx-jikkyo.tsukumijima.net/ )を
はじめとする有志サーバへの接続やニコニコ実況との同時接続に対応しています。
2024年8月時点ではニコニコ実況が対応していない衛星系のチャンネルを中心にNX-Jikkyo
がよく利用されているので、refugeUri と refugeMixing の2つの設定キーは設定してお
くことをお勧めします。

■コメント投稿について
※jkcnsl.exeにもログイン機能があります(jkcnslのReadmeを参照)。jkcnslのログイン機
  能を使う場合は以下の作業は不要です。

コメント投稿機能を有効にする場合は以下の作業を行ってください:
※DTV板の有志により、ブラウザに依存しないログインツールなども提供されています。
1."sqlite3.exe"を用意
  https://sqlite.org/download.html の「Precompiled Binaries for Windows」から
  "sqlite-tools-win32-x86-{数字}.zip"をダウンロードして、中身の"sqlite3.exe"を
  TVTest.exeのある場所かパスの通った場所(C:\windows あたりがオススメ)に配置
2.必要なら"jq.exe"を用意
  https://stedolan.github.io/jq/ から"jq-win32.exe"か"jq-win64.exe"をダウンロー
  ドして、"jq.exe"にリネームして上記と同様に配置
2.ブラウザでニコニコ実況にログイン
  FirefoxやEdgeやGoogleChromeで https://jk.nicovideo.jp にアクセスして各自のアカ
  ウントでログイン
3.NicoJK.iniのexecGetCookieにブラウザのプロファイルフォルダを設定
  プロファイルフォルダの場所については「firefox cookies.sqlite」や「chrome
  cookie 保存場所」などのキーワードでググって見つけてください。正しく設定すれば
  プラグイン有効時にこのコマンドが実行され、勢い窓にコメント投稿欄が現れます
4.必要ならexecGetV10Keyにもブラウザのプロファイルフォルダを設定
  最近のEdgeやGoogleChromeのクッキー情報はブラウザのマスターキーで保護されている
  ため、この設定も必要です

コメント投稿欄の仕様は以下のとおりです:
・Enterキー押下で投稿
・行頭に@があればローカルコマンドとして処理(詳しくは投稿欄に半角で"@help"と入力)
・行頭に[]で囲われた部分があれば公式サイトのコマンド欄と同等
・投稿欄が空のとき、Ctrl+Vで複数行のペーストができる
・TabまたはRS(レコードセパレータ)文字は改行文字と解釈する
  ・RSは右クリ→「Unicode制御文字の挿入」で入力可能。IMEに辞書登録すると便利
・最長75文字。最短投稿間隔は2秒

専用のアカウントを使う場合は、ログイン用のユーザプロファイルをブラウザに作成する
と便利です。Firefoxの手順:
1.-no-remote -p sub(←プロファイル名、何でもOK)というオプション付きでfirefox.exe
  へのショートカットを作成して起動
2.「ユーザプロファイルの選択」というウィンドウが出るので"sub"という名前の新しい
  プロファイルを作成
3.リストボックスは"default"プロファイルを選択して終了ボタンを押す。以降はショー
  トカットから起動したときに"sub"プロファイルが使われる

■制限
現状、「勢い」情報の取得方法がまとまっていません。差し当たりchannelsUri設定を追
加しましたが、情報提供者の負担などを考えるとこれが最良なのか迷います。
今のところbigコマンドは解釈しません。投稿コマンドは実況サーバによる制限を受ける
場合があります。
パネルのNicoJKタブのテーマ/配色は"操作パネル"の設定に連動します。

■テスト環境
Win7 sp1 + PT2/PT3 + ptTimer + BonDriver_ptmr.dll + TVTest 0.7.19(x86)
※このフォークのテスト環境はWindows10 TVTest 0.10.0-dev(x64)

■配布
http://www.rutice.net/
古いやつは↓
https://github.com/rutice/NicoJK/downloads
リンクする場合は、配布ページか、ソースコードのページへお願いします。
※このフォークの配布ページは https://github.com/xtne6f/NicoJK/releases

■ソースコード
https://github.com/rutice/NicoJK
※このフォークのソースコードは https://github.com/xt4ubq/NicoJK

■他プロセスとのコメント共用機能の仕様(開発者むけ)
NicoJK.iniのcommentShareModeを1にすると受信中のchatタグを名前付きパイプ:
"\\.\pipe\chat_d7b64ac2_{プロセスID}" から取得できる。さらに、commentShareModeを
2にするとコメント投稿を名前付きパイプ:
"\\.\pipe\post_d7b64ac2_{プロセスID}" に書き込める。
"d7b64ac2"は名前の競合を防ぐための単なる定数。プロセスIDは対象の実況に紐づいた映
像などを処理しているプロセスのプロセスIDなので、名前付きパイプを作成したプロセス
とは異なるかもしれない。NicoJKではTVTestのコマンドラインオプションに
  /jkshpid {プロセスID}
と指定されていれば(映像のソースが他プロセスにあってBonDriver経由で視聴しているだ
けの場合など)そのプロセスID、指定されていなければTVTest自体のプロセスIDを使う。

["chat"パイプやjkrdlog.exeの出力の仕様]
データの出力ごとに必ず80文字(バイト単位)の以下のようなヘッダがつく。
  <!-- J={実況番号};[T={unix時間};]L={データ部分の文字数};N={データ部分の改行数}[改行含め80文字になるまで空白] -->{改行}
改行はLFでもCRLFでもよいが文字数はどちらも1つと数える。jkrdlog.exeの出力では"T="
もつく。
データ部分はUTF-8のchatタグ等を改行で羅列したもの(「ログの仕様」と大体同じ)。任
意に以下のようなメッセージが挿入される。
  <!-- M={メッセージ} -->{改行}
データ部分があるかないかに関わらずヘッダだけでも一定間隔(1秒ほど)で出力される。

["post"パイプの仕様]
以下のような文字列を書き込むとコメント投稿欄に入力したのと同様に扱われる。
  [コマンド欄]コメント{改行...}
コマンド欄は省略できないので中身がなければ"[]"とする。改行はLFでもCRLFでもよい。
改行は終端を意味し冗長に書き込めるので、失敗する(切断)まで書き込み続けると確実。
文字コードはUTF-8。コメントのRS(レコードセパレータ)文字は改行文字と解釈される。
先頭文字が"["でない書き込みは無視される。投稿の成否などは"chat"パイプにメッセー
ジやchat_resultタグを挿入して伝えられる。

■ログの仕様(開発者むけ)
ルートフォルダに"jk{実況番号}"というフォルダ(jkフォルダ)を作成する。jkフォルダに
は"{10桁のunix時間(=ログの最初のchatタグのdate属性値)}.txt"というログファイルを
作成する。ログファイル追記中は"lockfile"というファイルをjkフォルダに排他モードで
開いておく。ルートフォルダには(jkフォルダと被らなければ)任意のフォルダやファイル
を置くことができるが、jkフォルダにはログ以外の.txtファイルは置くべきでない。

1つ以上のログファイルをzip形式でアーカイブすることができる。アーカイブの名前は
"{10桁のunix時間(=アーカイブしたログファイル名の中で最小のもの)}.zip"とし、jkフ
ォルダ内に複数置くことができる。複数のアーカイブどうしのログは時間的に重ならない
ようにする(重なっている部分は時間的に後方のアーカイブしか検索しないため)。アーカ
イブにはログ以外の.txtファイルは格納すべきでない。また、jkフォルダにはこれ以外の
.zipファイルは置くべきでない。
アーカイブされていないログとアーカイブされたログとは時間的に重なっていても構わな
い(NicoJKはまずアーカイブされていないものからログを検索し、次にアーカイブを検索
する)。

ログファイルは実況サーバから取得したUTF-8のchatタグを改行CRLFで羅列したもの。
chatタグの要素に改行を含むときはLF=&#10;、CR=&#13;の数値文字参照に置きかえる。
chatタグの左右に空白その他の文字を加えてはいけない(BOMも特別扱いしないので先頭行
にはコメントなど入れておくと安全かも)。chat以外のタグを含んでも構わないが、最終
行はchatタグでなければならない(最終行のdate属性値からログの範囲を求めるため)。

■感謝
過去ログ再生機能、コメント機能を実装していただいたxtne6f氏に感謝いたします。

(ここからxtne6f追記)
rutice氏版よりフォークさせてもらっているNicoJKプラグインですが、様々な方に協力頂
きメンテナンスを続けられています。
とりわけ近年tsukumi氏( https://github.com/tsukumijima )による情報提供をはじめと
する貢献は大きく、ここに感謝申し上げます。
N/実/勢アイコンは「ふい字」( https://hp.vector.co.jp/authors/VA039499/ )です。

■更新履歴
ChangeLog.txtを参照
