FrontPage > 拡張 > nlMovieFetcher
nlMovieFetcher †
とりあえず動画をキャッシュして後で見るよ。
nlMovieFetcher v0.5.2
http://nicolist.net/nicocache_nl/up/img/nl420.zip
これは何? †
マイリスト・検索・ランキングのページで"投稿"の後に"fetch"というリンクを追加します。
リンクをクリックすると対象動画のフレーム背景を目立たせてから動画をキャッシュします。
あと、せっかく目立たせたのでwatchページへのリンクは別窓で開くようにします。
更にnlbarに取得動画ページへのリンクを追加します。
昔あった(今でもあるの?)、インターネット先読みキャッシュの手動版みたいなものです。
エコノミー時間帯に入る直前にたくさんのタブを開いて動画をキャッシュさせるよりは、
クライアント・サーバー双方にとって優しいんじゃないかと。
使い方とか †
パッケージをNicoCache_nlフォルダに展開、nlを再起動で最低限は動くんじゃないかな?
サムネを多量にロードする可能性があるので「cacheThumbnail=true」じゃないと動作しません。
また、nl本体はNicoCacheスレの最新版じゃないと不具合が出る可能性が大いにあります。
チャンネル系はチャンネル動画ページ(ch.nicovideo.jp/video/)のみ対応してみました。
その他のページは自由度が高そうなので、一律の対応は無理っぽいので対応していません。
個別対応はもちろん可能なので、必要ならフィルタ定義を見ながら対応してみてください。
取得結果は local/fetched.json に保存します。
読み込みは起動時のみで、キャッシュ毎に保存するので起動中にファイルの編集は出来ません。
取得動画ページは適当なので、誰かもっと格好いいページにしてくださいw
oamaxaさんの playlist.js に対応しています(β4で本体に取り込んでいただきました)。
デフォルトでfetchedというリストが追加されます。もちろん他のリストも使えます。
データは local/fetched.storage に保存します。ページを表示する度に読み込むので遅いです。
でも、500件程度なら普通に使えているっぽいです。
DOM Storage非対応のブラウザでも動きます。
クロスブラウザでリストを共有できるのでちょっと便利です。
Firefox用にユーザースクリプト(Greasemonkey)を同梱してみました。
取得動画ページに出るリンクからインストールできます。
@requireを使っているのでGreasemonkey 0.8以上が必要です。
Google Readerにニコ動RSSを登録すると、各エントリの下の方にfetchリンクが追加されます。
興味本位で作ってみたけど、思ったより使えるかも?
普段はリスト表示、ニコ動RSSは専用のフォルダを作ってそこに登録しておき、そのフォルダを開く時だけ全文表示、ってのが良いかな。
Livedoor Reader対応は自分が使っていないので、必要な方が対応してくだされば取り込みます。
まともにGreasemonkeyのユーザースクリプトを書いたの初めてなので何か間違っているかも。
技術的な事とか †
nl自身をプロキシに設定することで、動画URLにアクセスしてnl本体にキャッシュさせます。
読み込んだ動画はNULLデバイス(WindowsならNUL,それ以外のOSなら/dev/null)に書き出すのでメモリの消費も少ないはずです(Windows以外は試していませんが…)。
SWFファイルは旧プレイヤーのサポート終了に伴い、旧SWFが取得できないことがあるので、全て新プレイヤー用のSWFとして取得します(旧プレイヤー対応も入れていたんですが…)。
動画取得のAPIは以下の形式なので、別のアプリからも使えるかと思います。
http://www.nicovideo.jp/cache/fetch?<id>[&result=0]
上記APIはfetch要求を出すだけで即座にリターンします(あとは勝手にキャッシュします)。
引数に&result=0を付加した場合は取得結果を保存しません(別リストで管理する場合等)。
戻り値が "OK fetch accepted." なら、必要に応じて次のAPIでステータスを取得できます。
http://www.nicovideo.jp/cache/fetch?status=<id>
ステータスは "fetching... wait"→"fetching... 39%"→"fetching... done." と変化します。
fetchが完了してからしばらく(1分~)すると、ステータスは取得できなくなります。
エラー終了時は"done."以外の事もありますので、終了判定は"wait""%"以外としてください。
似非DOM Storage(window.nlMovieFetcherStorage)は最低限の実装しかしていません。
つーか、DOM Storageの使い方を今回初めて知ったので、ちゃんと実装できているかも怪しいです…。
ページload後の最初のget/set呼び出しでデータを読み込むので、何もしなければデータ読み込みは発生しないはずです。
同様に書き込みはページunload時にデータが修正されていれば発生します。
データは単純に送られてきたものを保存しているだけなので、最後に送られてきたものが有効です。
このような実装なので、get/setを使わずにアクセスするような作りだと保存したデータの読み込みが発生しません。
その場合、最初に明示的に__load()を呼び出してください。
あと、key(index)が遅いと思うので、困る場合は__keys()で配列を取得すれば多少は速くなります。
予約機能とかは本来なら別クラスに分けるべきなのでしょうけど、Extensionでクラスファイルを複数作りたくないので若干トリッキーな事をやっています。
なので、ソースが読み難いです。