ニコニコ動画 エコノミー回避プロキシを作ってみた

最新 → NicoProxy ニコニコ動画SP1に対応しました - unnecessary words

ニコニコ動画のエコノミーを回避するプロキシを作ってみました。回避できるのは一度通常モードで見たことのある動画だけ。以下の機能を持ちます。

  • 通常モードで再生した動画をキャッシュ
  • エコノミー再生時に動画ファイルをキャッシュにすり替える
#!/usr/bin/ruby -Ku
require 'webrick'
require 'webrick/httpproxy'

handler = Proc.new() do |req, res|
  if req.unparsed_uri =~ %r!http://.*\.nicovideo\.jp/smile\?v=(.*)!
    id = $1
    f_name = "sm#{id.split('.')[0]}.flv"
    if id =~ /low$/
      # エコノミーモード
      if File.exist?(f_name)
        open(f_name, "r"){|io| res.body = io.read}
        res.header.delete("content-length")
      end
    else
      # 通常モード
      if !File.exist?(f_name) || File.size(f_name) < res.header["content-length"].to_i
        puts "FILE SAVE #{f_name}"
        STDOUT.flush
        open(f_name, "w"){|io| io.write(res.body)}
      end
    end
  end
end

config = {
  :BindAddress => '0.0.0.0',
  :Port => 8080,
  :ProxyContentHandler => handler,
}

s = WEBrick::HTTPProxyServer.new(config)
[:INT, :TERM].each{|sig| Signal.trap(sig){s.shutdown}}
s.start

FireFoxなら、FoxyProxyのパターンに http://.*\.nicovideo\.jp/smile\?v=.* とか設定して使うと幸せになれそう。
キャッシュしてるファイルは、リクエストを投げずにローカルファイル返すようにしたいけど、やり方がわからん。
あと、WEBRickのスレッド?動作がどうなってるのか、あんまり分かってない。どっか解説してるとこないだろうか。

こちらを参考にさせていただきました。
ゆーすけべー日記