ニコニコ動画のキャッシュを皆で共有するソフト「Genkidama」をリリースしまふ。

なにこれ

ニコニコ動画の動画ファイルのキャッシュファイルを皆で共有しあってより快適にニコ動を楽しめるソフトです。
これで一般会員でも回線混雑時に通常画質で動画が見れるかもしれない・・・!って訳です(誰かが以前その動画を通常画質で見ていてくれれば、の話なんだけどね)。
えいさあさんのNicoCacheをベースにP2P技術を用いてキャッシュ情報をGenkidamaを起動しているPC同士で共有する仕組みを追加してあります。
えいさあさん良いプログラムをソース公開してくれて感謝です。

動作環境

Java 6.0が動くシステム(Windows, Linuxで動作確認済み)
たぶんMacでもおk。
ルータにグローバルIPが振られていて、UPnPでポート解放出来る必要あり。

使い方

Windows
  • ブラウザのプロキシ設定でlocalhost:8080を指定。
  • Genkidama.batを実行する。
  • 使い終わったらCTRL+Cを押して終了する(ここ重要。これをやらないと分散ハッシュテーブルにゴミがのこっちまうのを避けられないので、ご協力おながいします。)

NicoCacheの設定例があるので、こちらを参考にすると良いです:
http://www.oshiete-kun.net/archives/2007/09/nicocache.html
http://d.hatena.ne.jp/dangerous1192/20071009/p1
http://wayohoo.com/nicovideo/tech/nicocache_nl.html
http://www.smallstyle.com/20071009.html

その他
  • ブラウザのプロキシ設定でlocalhost:8080を指定。
  • コンソールを開き、Genkidamaのディレクトリにcdしてjava -jar Genkidama.jarを実行する。
  • 使い終わったらCTRL+Cを押して終了する(ここ重要。これをやらないと分散ハッシュテーブルにゴミがのこっちまうのを避けられないので、ご協力おながいします。)

NicoCacheをMacで使う場合の設定例。たぶん参考になると思います:
http://d.hatena.ne.jp/oikea/20071203/1196657398

ダウンロード

http://syuu.dokukino.com/Genkidama_001.zip
※追記
消された動画のキャッシュが頑張れば見えてしまう件は、不可能にする事にしました。
修正版のリリースと同時に前のバージョンは使えなくさせて頂きます。
#ブートストラップサーバを止めるので立ち上がらなくなります。
http://syuu.dokukino.com/Genkidama_002.zip

動作原理

Genkidamaでは分散ハッシュテーブル(DHT)というP2P技術を使ってキャッシュ情報をPC間でやりとりします。
というか、このプログラムは分散ハッシュテーブルを用いたP2Pアプリの実装がやってみたくてカッとなって作った今は公開している、なんですが。

分散ハッシュテーブルというのは、キーとデータのペアの情報を繋がりあったコンピュータ間で記憶・検索する仕組みの事で、いわゆるハッシュテーブルに近い使い方が出来るようになっています。
Genkidamaでは<動画ID, 動画キャッシュを持つPCへのURL>をこの分散ハッシュテーブルで管理しています。
URLは http://IPアドレス:9801/nc/動画ID という形式になっており、このURLを通じてキャッシュを取得出来るようにHTTPサーバが動いています。

分散ハッシュテーブル、HTTPサーバでそれぞれtcp/9800、tcp/9801でインターネットからアクセス可能になっている必要が有るので、UPnPを用いてポートマッピングを行っています。

分散ハッシュテーブルのライブラリとしてOpenChord、UPnPのライブラリとしてUPNPLibを用いています。

設定変更

NicoCacheと同じくconfig.propertiesを編集することで設定を変更する事が出来ます。
Genkidama独自のパラメータは以下の通り:

  • dhtRingPort 分散ハッシュテーブル用ポート番号
  • dhtDataPort HTTPサーバ用ポート番号
  • dhtUPnP UPnP非対応なルータを使っている場合はfalseにする
  • dhtGlobalIP UPnP非対応なルータではここにグローバルIPFQDNでも良い)を指定。勿論ルータ側でポート解放の必要あり
  • dhtBootstrap 新しいGenkidamaネットワークを作成するか falseにしとかないと誰もいないネットワークが作成されていまいます
  • dhtBootstrapURL 分散ハッシュテーブルへ参加する為のサーバURL これも触ってはいけない

ソースコード

ソースコードはNicoCache Licenseでライセンスされているので、自由に利用・再配布が可能です。
https://enoki.dokukino.com/svn/public/Genkidama/trunk
http://syuu.dokukino.com/Genkidama_002src.zip

ところで消された動画ってみれんの?

ニコ動のWebサイトから直接はみれないと思います。(エラーになるように出来てると思う)
FLV(またはMP4)のURLを直接指定してあげれば動画だけは救出出来そうですが、コメントが流れないニコ動なんて肉の入ってないハンバーガーなんじゃなかろうか・・・

★追記
やはり消された動画はFlashがハンドルして通常と異なるルートを通って「削除されました」のムービー(音声?)を流しているようで、キャッシュは使われない事を確認。

ところで消された動画ってみれんの?

意図的に見れなくしました。
分散ハッシュテーブルへ公開もしないし、リクエストが来ても拒否します。

完成度について・不具合報告のお願い

書き忘れてました。
テスト期間半日位なので、めっちゃβ版です。
バージョン番号は0.01です。
0.02だしました。
多分不具合は色々あるので、なんか有ったらコメントに書き込んでください。
よろしくです。

とりあえず確認してる現象としては、たまに分散ハッシュテーブルに繋がらなくってProxyサーバも開始出来ないというのがあります。
終了して立ち上げ直せば大体直ります。

はてブコメントへのレス

はてブコメントへ返事書くのってこれであってますか・・・?
すみません非コミュなんでよく分かりません

id:endo_5501 さんより、「あ、消された動画は見れないのか」

早まってはてブにも書いてしまいましたが、実はニコ動がどういう仕様になってるのかの所をちっとも理解してません。
消されてる時ってどういう状態になってるんでしょうね?
もし情報持ってる方居たら教えていただけるとうれしいです。
なんか変な音声が代わりに流れてる所を見ると、コメントはそのままムービーだけを差し替えてるんですかね?
その差し替えをやるのはサーバ側?フラッシュ側?
サーバ側であってフラッシュは何も知らないのであれば、Genkidamaでキャッシュがヒットしてくれるだけで素直に消されたムービーのキャッシュを再生してくれると思います。
フラッシュ側であれば、flvplayer_wrapperとか組み込んであげると回避可能になると思います。

・・・てか、そこまでやって、私、ニワンゴに怒られない?
あんまり乗り気じゃないのは正直そこに有るんですけど・・・・

id:northlight さんより、「発想はあったが作る人がいなかった。実行は大変ですな。」

やっぱ発想は有ったんですかね?私はどうも独創的な発想力とかそーいうのに乏しくて・・・
ニコ動とかちっとも詳しくなくて、NicoCacheってソフトを知ったのはつい先週なんですけど、知った瞬間にこれはおもしろいと思って発作的につくっちまいました。
後でググったらP2P NicoCacheとか書いてる人が居て、あ、やっぱりもう先に思いついてる人居たかな・・とか思って自分の浅はかさをちょっと後悔。

で、追加したコード量ですが、わずか200〜300行程度です。
期間はコーディング2日、テスト1日くらいですかね。
分散ハッシュテーブルのライブラリはOpenChordっていうかなり完成されたものがあるんで、私はこれとNicoCacheをくっつけるグルーコードを書いただけなのですよ。

ってな訳で実はあんまり苦労してないw

そもそもDHTアルゴリズム自体を研究しているのですが、DHTを使う実用的なアプリっていうのも書いてみると楽しいかなぁと思いまして。

id:stts さんより、「キャッシュは、合法」

法律とかちっとも分からないんですけど、そうなんですか?
そうだと安心なんですけど。ネットワークに流したら灰色になったりしない?

連邦裁判所の判例だと合法、日本だと判例がない。
著作権法改正案で検索キャッシュは合法に、著作権違反なもののダウンロードは違法にするつもりだが、未だ国会提出の段階かな。

id:th_6295 さんより、「キャッシュが半永久的に(ryあたりはどうなってるんだろう。」

分散ハッシュテーブルに流しているのは単なるURL(キャッシュ保持ノードのIP+ポート番号+キャッシュID)なので、データそのものは流してません。
よって、分散ハッシュテーブルのネットワークを流れる情報は分散ハッシュテーブルのルーティング情報と<キャッシュID, URL>の組み合わせの情報だけになっており、キャッシュデータの中継はやりません。
で、分散ハッシュテーブルへは登録だけでなく削除も出来るので、起動時に手持ちキャッシュを登録、終了時に削除するようにしてます。
更に0.02で分散ハッシュテーブルへ登録、取得へいく前とURLを辿ってキャッシュリクエストが来た時に削除済みかどうかチェックし、削除されてたら作業を行わないようにしました。
あと、Winnyでいう初期ノードに当たるもの(=dhtBootstrapURL)を分散配置してません。
これ落としちゃうと誰も使えなくなります。
というか、今0.01のサーバを止めたので丁度そういう状態になってるはず。
ニワンゴさんに怒られたら勿論全部止めますよ。