fe.settings:getUserBoardSettings - non array given[librejp] - Endchan Magrathea
前書き込みいくつかはここから  >>/159654/

> NicoCache26 >8
 >>/159670/
> フォルダまでは作られるけど、同じく再生は出来ず。
この症状は再現出来ないのだけれども、品質モードを「自動」にしていると再生出来ないことに気付いたので、そっちを先になんとかします。
「自動」でも再生出来るはずだったけれど、動かないということはコーディングに何か考慮漏れがありそうなので。
(生放送も考慮に入れてないけど後回し)

> NicoCache26 >9
> 最初のロード「no cache found: smxxxx」の後に「通信中断/.../Ranged request: video/01.cmfv...」が表示され、 
> キャッシュは「nltmp_smxxxx/video/01.cmfv」だけがない状態になる。
こっちだとranged requestとnot modifiedが第1セグメントに対してよく起きる。
でも正常通信も来るから第1セグメントのキャッシュファイルが出来てる。

onTransferEndイベントの時にcompleted引数にfalseが来た時に「通信中断」と表示してました。
completedじゃなくて応答ボディの長さを数えてそれで通信中断したかどうかという判定に変えてみます。(dmc/hls処理はそう書いてあったし)

 >>/159671/
> とりあえず、16の倍数にならないのは01.cmfvの場合がほとんどのようなので、初期の通信が混ざってないかとか検証しようと思ってました。
> しかし、通信が並行しているときの振り分け方とかがどうなっているのかが、全然わからない感じです。
NicoCacheのコードは全体的にイベントドリブンに処理が書いてあります。

Processor継承クラスのonRequestにブラウザからの要求(ブラウザはニコ動に要求しているつもり)がnicocacheに来ます。
だからCmafUseCacheProcessor.javaの動作の開始点はonRequestだけです。
一つのURLにつき一回onRequestが呼び出される感じ。

各Processorを登録しているのはServer.javaのregisterProcessorあたりで、実際にonRequestを呼び出しているのはConnectionManager.javaのentry.getProcessor().onRequest(requestHeader, browser);のあたり。

nicocacheの上流は一つの通信に一つのスレッドを割り当てています。
だから複数の処理が同時に流れてる。
こういう設計だから通信処理1と通信処理2で値を共有したい場合にちょっと回りくどいことをしないといけないです。
この値共有のために作ったのがNLShared.INSTANCE.getDomandCVIManagerという共有オブジェクトとDomandCVIEntry。

onRequestから入ってきた要求を条件分岐してそれが動画セグメントならば、addTransferListenerというコンテンツ受信時に処理を呼び出す機能にCmafUseCacheProcessor内で定義したChunkListenerのインスタンスを登録しています。
以降はその通信でコンテンツを受信したり受信完了した時に登録したcmaf/ChunkListener内のそれぞれの処理が呼び出されます。

cmfvやcmfaに対しては、ひとつの通信につき、ひとつのcmaf/ChunkListenerのインスタンスが割り当てられています。
コンストラクタでdecrypterは初期化されています。

セグメント受信時点でdecryptに必要な情報が揃っていない場合は、情報が揃ってから実行するようにmovieInfo(DomandCVIEntry)に登録しています。
上流がデータを受信し、イベントを発火させ、登録されたイベント処理へ渡します。
cmaf/ChunkListener側はonTransferringでデータの部分を受信して、decrypterに渡します。
転送終了(onTransferEnd)時にdecrypterの終了処理もします。
この時点で渡したデータの量が16の倍数じゃないとエラーします。

つまりは……むずかしいね。
(本当はデバッガーを使った方がよかったんだろうけど)自分はLogger.infoをあっちこっちに仕込んで動作させつつコードを読みました。