NicoCache

* これは何？

ニコニコ動画の動画をキャッシュして
一度見た動画を二度目以降は快適に見られるようにするツールです。

* もっと詳しく

一度見た動画は、ブラウザのキャッシュが残っている限りは
もう一度見に行くとすぐに再生されますが、
キャッシュから消えると一度見た動画なのに再度ダウンロードが必要になります。
混んでいる時間だと読み込みが遅くてなかなか後ろの方が見られなかったり、
「動画が繋がりません」と言われて全く見られなかったりします。

ブラウザのキャッシュでは、動画はサイズが大きいのですぐにあふれて
消えてしまいます。
キャッシュサイズを大きく設定することもできますが、
今度は動画以外の余計なファイルまで大量に残ってしまったり
ブラウザの動作が遅くなったりする問題があります。

NicoCacheは、SMILEVIDEOの動画ファイルのみを
ブラウザのキャッシュとは別に
HDDの空きが許す限りキャッシュするローカルプロキシです。
一度見た動画であれば、二度目以降は瞬時に読み込みが完了します。
マイリストに登録して何度も見るような動画を
キャッシュしておくと便利です。

動画を最後まで読み込んだ時点でHDDに保存されているので、
気に入った動画を保存しておこうと思った時に
改めてダウンロードする必要がありません。

エコノミーモードになる動画でも、通常モードのキャッシュがあれば
通常モードの画質で見ることができます。

みんながNicoCacheを使うとニコニコの負荷が減るので、
そのうち一回目に見る動画もすぐ読み込めるようになるかもしれません。

* 必要なもの

Java Runtime Environment (JRE) 5.0以上
http://java.com などから入手できます。

* インストール

適当なフォルダに全てのファイルを展開してください。
そのフォルダの下にキャッシュを作りますので、
十分に空き容量があるHDDを選んでください。

バージョンアップの場合は古いファイルにそのまま上書きしてください。

* アンインストール

インストールしたフォルダ以下のファイルを削除してください。

* 使い方

1. ブラウザのプロキシ設定で、localhostのポート8080を使うようにする。
2. NicoCache.batをダブルクリックして起動する。

あとはニコニコで動画を見ると自動的に動画をキャッシュします。

ポート8080で待ち受ける他のツールも使っている場合は
どちらかのポートの設定を変更してください。

* カスタマイズ

一度起動するとconfig.propertiesという設定ファイルが出来ます。
待ち受けポートを8080から変えたい場合や、
Proxomitronなど他のプロキシと併用したい場合は
config.propertiesを編集してNicoCacheを再起動してください。

設定項目名
listenPort:
  NicoCacheの待ち受けポート。
  デフォルト=8080

proxyHost:
  併用するプロキシのホスト名かIPアドレス。空にすると併用なし。
  デフォルト=(なし)

proxyPort:
  併用するプロキシの待ち受けポート。
  デフォルト=8081

proxySSL:
  SSL通信でもセカンダリプロキシを通すかどうか。(true/false)
  デフォルト=true

title:
  キャッシュファイル名に動画のタイトルを付けるかどうか。(true/false)
  デフォルト=true

resumeDownload:
  途中でブラウザを閉じた動画を再度見たときに
  残りの部分からDLを再開するかどうか。(true/false)
  デフォルト=true

touchCache:
  キャッシュを参照した際にタイムスタンプを更新するか。(true/false)
  主にエクスプローラで並び替えて整理するため。
  デフォルト=true

readTimeout:
  ブラウザからのデータ待ちうけタイムアウト(ミリ秒)
  デフォルト=600000

fileNameCharset:
  ファイル名に使う文字セット。
  通常はデフォルト(なし)のままで構いません。
  一部のNASなど、Unicodeファイル名が使えないファイルシステムに
  キャッシュを保存する場合に、利用可能な文字セットを指定します。
  使えない文字は「-」に置換します。
  設定値はJavaの文字セット名です。
  例えば、Windowsのネットワークドライブ経由でNASにキャッシュが
  保存できない人は、とりあえず「MS932」を指定してみてください。
  デフォルト=(なし)

編集が楽などの理由でconfig.iniという名前がよい人のために
config.iniというファイル名でも認識するようにしています。
(ただし、中身はpropertiesファイルのフォーマットであり
iniファイルのフォーマットに従っていないので推奨はしません。)

* キャッシュについて

キャッシュはサブフォルダcacheの中に作成されます。

SMILEVIDEOの動画はニコニコの再生画面のURLなどにあるsmXXXXXXに対応した
「smXXXXXX.flv」というファイル名になります。
(先頭はsmの他にもいくつか種類があります。)
エコノミーモードのキャッシュはlowが付いて「smXXXXXXlow.flv」となります。
title=trueの時は「_タイトル」が付きます．
タイトル中の「\/:,;*?"<>|」のいずれかの文字は「-」に置換します。

再生時に通常モードとエコノミーモードのキャッシュが両方ある時は
通常モードのキャッシュを優先して使います。

cacheの中に手動でさらにサブフォルダを作成してそこに
キャッシュファイルを移動しても認識しますので
お気に入りの動画のキャッシュをまとめておくなど整理に使ってください。
ただしファイルの移動はNicoCacheを終了させて行ってください。

ファイル名が.flvや.mp4になっているのは、
特にFLVやMP4への変換を行っているわけではなくニコニコから送られたデータを
そのまま保存しているだけなので、
中身が拡張子通りになるかどうかはニコニコの仕様によります。

* 使用上の注意

キャッシュは増える一方なのでHDDに余裕がない場合は
いらない動画を手動で削除してください。
設定がtitle=true(デフォルト設定)だと
削除する動画が見つけやすくなります。

動画の再生が途中で止まる時はキャッシュを削除してみてください。

フォト蔵はあまり動画がないので手抜きのため非対応です。

* 履歴

2010/10/25 0.45
  [nlより]ニコニコの仕様変更でタイトルが正常に取得できなくなったので
  問題の起きないnlのタイトル取得コードを取り込んで対応。

2010/10/16 0.44
  ニコニコの仕様変更でタイトルが正常に取得できなくなったので対応。
  稀なケースで内部のイベント処理に失敗することがあった問題を修正。
  [nlより]設定ファイル動的ロード、ログ表示形式、Content-Encoding: identity対応。
  実験的機能: useWorkaroundForEncoding, useWorkaroundFastFinalizeを追加。
  開発者向け: Configの設定値の取り扱い方を整理。
  開発者向け: HttpHeaderを非ASCII文字に対応。

2009/09/26 0.43
  終了処理を手抜きしていたのをちゃんと実行するように修正。
  終了処理中にサーバから切断されるまでの間CPU負荷が非常に高くなる問題を修正。

2009/08/01 0.42
  サーバや併用プロキシから接続終了された際にContent-Lengthが利用可能であれば
  転送量と一致するかをチェックするように変更。
  開発者向け: 上記のためTransferListener#onTransferEnd(boolean)の仕様変更。

2009/05/30 0.41
  swfの動画のURLが変わり(as3付加)キャッシュできなくなっていたので対応。

2009/04/11 0.40
  ニコニコの仕様変更により見出しに大百科へのリンクが入った影響で
  タイトルが正常に取得できなくなったので対応。

2009/03/25 0.39
  swfの動画のタイトルを記憶していない場合はnmと仮定して扱うようにした。
  これで＠CMなどもタイトルが取得できるようになった。

2009/03/22 0.38
  APIのURLが変更になりタイトルが取得できないケースが発生していたので対応。
  今後さらにURLが変更されてもリダイレクトされていれば追随するようにした。
  smで始まらない動画のタイトルが取得できないケースを減らした。
  (現状非対応の例: 公式動画をwatchページを経由せずに再生したケース)

2008/07/05 0.37
  今日のメンテの仕様変更でwatchページのタイトルを
  キャッシュできなくなったので対応。

2008/06/05 0.36
  deflate圧縮対応でミスっていたのを修正。
  これの影響でJDK5でビルドできなくなっていたのも同時に直った。

2008/05/25 0.35
  gzip展開の要否をきちんとヘッダで判定するようにした。
  deflate圧縮にも対応した。

2008/05/25 0.34
  いつの間にかwatchページがgzip圧縮されて転送されるようになっていたので
  対応。この影響でsm以外の動画のタイトルが取得できていなかった。

2008/04/02 0.33
  4/1のwatchページの変更の影響でキャッシュのファイル名に「ニコニコ動画」と
  入ってしまっていたのを修正。
  watchページからタイトルを取得できなかった時はサムネイル画面から
  取得していたのを、APIで取得するように変更。

2008/03/06 0.32
  ニコニコSP1に対応。mp4, swf形式も保存できるように修正。
  今後新しい形式が増えてもなるべく保存するようにしておいた。
  永遠待ち状態の対症療法として通信タイムアウト設定を追加。(readTimeout)
  Unicodeファイル名が使えない環境で動作させる設定を追加。(fileNameCharset)

2007/11/25 0.31
  1回のレスポンスで複数の相反するcookieを送ってくるサーバ
  (ニコニコには多分ない)にログインなどができない場合があったので対策。

2007/11/25 0.30
  [nlより]公式カテゴリの動画(ax, ca)のようにsmで始まらない動画に対応。
  副作用でニコニコへのアクセスが減って少しニコニコに優しくなった。
  [nlより]エコノミーモードのキャッシュが存在する時に通常モードの
  キャッシュを取得したら同じフォルダに生成するようにする。

2007/11/23 0.29
  Operaでニコニコにログインできないのを修正。(HEADリクエストに対応)

2007/11/15 0.28
  一度動画サーバに接続失敗した動画はそれ以後キャッシュできなくなっていた
  バグを修正。
  動画サーバが403や404を返してきた時にもキャッシュしていたバグを修正。
  開発者向け: TransferListenerで書き換えない限り動作がおかしくなる
  ようなヘッダは書き換えられないようにする。
  StringResourceをKeep-Alive非対応のクライアントでも問題がないようにする。

2007/11/04 0.27
  サーバが誤ったConetnt-Lengthを送ってくると
  ブラウザの読み込みが終わらない状態になることがあったので対策。

2007/11/03 0.26
  大きなファイルのアップロードに対応したつもりができてなかったので修正。
  サーバがエラー応答でかつbodyがない場合に例外が表示されていたのを修正。

2007/11/02 0.25
  非表示の動画を表示しようとしたときに何も表示されていなかったのを
  「非表示動画です」画面を表示するようにする。
  エラー発生時にも可能な限り後始末するようにする。
  エラー発生時にどのURLでエラーになったか表示するようにする。
  開発者向け: URLResourceを直接使った場合にサーバがエラー応答を返すと
  ブラウザの読み込みが終わらない状態になることがあったので修正。

2007/10/30 0.24
  0.20からCookieを分割して送ってくるサーバにログインできない場合があった
  バグを修正。

2007/10/30 0.23
  外部仕様的には0.22と同一。
  開発者向け: Loggerを拡張可能にする。

2007/10/29 0.22
  0.20からKeep-Alive非対応のクライアント(SleipnirのRSSリーダなど)が
  通信できなくなっていたバグを修正。
  開発者向け: JRE5でStringResourceが動かなかったのを修正。

2007/10/28 0.21
  キャッシュを参照してもタイムスタンプが更新されないバグを修正。
  それと同時に設定で更新をon/offできるようにする。(touchCache)
  0.20でブラウザが一部だけのキャッシュを持っている場合に
  NicoCache側のキャッシュが壊れていたバグを修正。
  [nlより]config.iniがあったら使うようにする。ただし中身はpropertiesファイル。
  [nlより]SSL通信をプロキシを経由するかどうか選べるように。(proxySSL)
  [nlより]レジューム対応。
  開発者向け: 設定のデフォルト値をdefaultsに置けるようにする。詳細はメモで。

2007/10/24 0.20
  内部が結構変わったのでバージョンを大きめに上げる。
  Keep-Aliveに対応してニコニコに少し優しく、閲覧性能を少し速くする。
  タイトル取得を非同期にして再生開始までを少し速くする。
  大きなファイルをアップロードするとエラーが出ていたのを修正。
  SSLのリクエストがおかしかったバグを修正。
  開発者向け: 内部をフレームワーク化したので
  使い方などを書いた開発者向けメモを付ける。

2007/10/20 0.12
  体感不可能なくらい微妙に性能向上。

  開発者向け: 中身は手抜きだった部分を一部ちゃんと直したので
  機能が変わらない割りにはソースは変わっています。
  とりあえずConnectionProcessorより手前の処理を主に整理。
  スレッドプールを使ってスレッドの生成コストを削減。
  Main.VER_STRINGをpublicにしてもあまり意味が無かったので
  Main.getVersion()を作る。
  終了処理をするMain.stop()を作る。

2007/10/17 0.11
  0.10でSSL通信終了時にエラーが表示されていたのを修正。

2007/10/17 0.10
  IEで「メッセージサーバーに接続できませんでした。」になる現象の
  対策を改良。これで対策完了。のはず。

  開発者向け: 外部ツールからバージョン判定できるように
  Main.VER_STRINGをpublicにする。

2007/10/16 0.09
  IEで「メッセージサーバーに接続できませんでした。」になる現象に
  暫定対策。完全に対策できているかは不明。

2007/10/15 0.08
  SSLの処理を高速化。

2007/10/14 0.07
  ProxomitronなどでContent-Lengthを削除していると
  タイトル取得に失敗していたのを修正。
  Proxomitronなどでタイトルから「ニコニコ動画」を削除していると
  タイトル取得に失敗していたのを修正。
  SSLに対応。

2007/10/11 0.06
  キャッシュをサブフォルダに移動しても認識するようにする。

2007/10/10 0.05
  クッキー地獄を食らうと正常応答(200)なのにサーバが0バイトのデータを
  送ってくることがあるがこれはキャッシュしないようにする。

2007/10/08 0.04
  ローカルプロキシとしての利用に限定できるようにするため
  localhostの接続のみ受け付けるようにする。
  タイトル中の「_」を「-」に置換せずそのまま保持できるようにする。
  キャッシュを削除する時にあまり使わないものを見つけやすくするために
  キャッシュを参照したときにタイムスタンプを更新するようにする。
  ニコニコのアメーバ対応終了に伴いアメーバ用のロジックや記述を削除。

2007/09/26 0.03a
  一般公開用にドキュメント修正のみ。低画質モード→エコノミーモードとか。

2007/08/15 0.03
  低画質モードに対応。
  低画質モード中でも通常モードのキャッシュがあれば必ずそっちを使うようにする。
  低画質モードのキャッシュがあっても通常モードの動画が取得できる場合は
  通常モードのキャッシュを新たに作るようにする。
  アメーバの仕様変更に対応。手抜きなので前のアメーバのキャッシュは使えません。

2007/07/08 0.02
  キャッシュが増えてきて削除するものを探すのが大変になってきたので
  キャッシュファイル名にタイトルを付けられるようにする。
  それに伴い設定項目にtitleを追加。
  設定ファイルをconfig.xmlからconfig.propertiesに変更。

2007/05/18 0.01
  ニコニコが重過ぎるので我慢できなくなって作り始める。

* お約束

本ツールの利用・再配布は自由ですが、
本ツールを使用して生じたいかなる結果に対しても
作者は一切の責任を負わないものとします。

(0.09から)正式なライセンスを次節に示します。
英語でいろいろ書いてありますが要は上に書いた内容です。
それから派生物を作って下さる方は、このReadme.txtを含めれば
改変や派生物の配布も自由です、ということです。
(修正BSDライセンスをベースに、さらに制限を弱くしたものです。)

* NicoCache License

Copyright (c) 2007, ASR
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions in source and binary form must reproduce the
      above copyright notice, this list of conditions and the
      following disclaimer in the documentation and/or other materials
      provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
