NicoProxy を使うと動画が表示されなくなる

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


2 〜 3 日前くらいから NicoProxy を使った場合に、
以下のようなスタックが表示され、動画が表示できなくなってしまった。

ERROR NoMethodError: private method `gsub' called for nil:NilClass
        C:/home/opt/ruby/lib/ruby/1.8/uri/common.rb:320:in `decode'
        ./nicoproxy/apirequest.rb:70:in `register'
        ./nicoproxy/apirequest.rb:68:in `each'
        ./nicoproxy/apirequest.rb:68:in `register'
        ./nicoproxy/apirequest.rb:17:in `initialize'
        ./nicoproxy/apirequesthistory.rb:9:in `new'
        ./nicoproxy/apirequesthistory.rb:9:in `save'
        ./nicoproxy/nicoproxyserver.rb:38:in `initialize'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/httpproxy.rb:165:in `call'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/httpproxy.rb:165:in `proxy_service'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/httpproxy.rb:37:in `service'
        ./nicoproxy/nicoproxyserver.rb:85:in `service'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:162:in `start'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:95:in `start'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:92:in `each'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:92:in `start'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:23:in `start'
        C:/home/opt/ruby/lib/ruby/1.8/webrick/server.rb:82:in `start'
        ./nico_proxy.rb:22

原因

NicoVideo API のレスポンスが gzip で送られてきているからなのだけれど、
これは仕様がかわったのかな、プレミアじゃないからとかで。

パッチ

とりあえず、パッチ。
NicoVideo API のレスポンスで Content-encoding が gzip だった場合、
body を解凍して、次のメソッドに渡すようにしてみた。
これで動作するようにはなった。

diff -crN nicoproxy.org/nicoproxy/nicoproxyserver.rb nicoproxy.1/nicoproxy/nicoproxyserver.rb
*** nicoproxy.org/nicoproxy/nicoproxyserver.rb	Sun Mar 09 21:23:32 2008
--- nicoproxy.1/nicoproxy/nicoproxyserver.rb	Sat May 24 21:57:29 2008
***************
*** 1,6 ****
--- 1,7 ----
  require 'webrick/httpproxy'
  require 'nicoproxy/apirequesthistory'
  require 'nicoproxy/cache'
+ require 'zlib'
  
  class NicoProxyServer < WEBrick::HTTPProxyServer
  
***************
*** 26,38 ****
        when %r!http://www\.nicovideo\.jp/api/getflv\?v=.*!
          # NicoVideo API
          @logger.debug("GET smile-api: #{req.unparsed_uri}\n")
-         api_request = @arh.save( req.unparsed_uri, res.body )
  
          if api_request.deleted? && @cache.search(api_request.video_id)
            # Deleted video -> play cache
            @logger.info("Recover video: #{api_request.video_id}")
!           res.body = recover_deleted_video(api_request, res.body)
!           @arh.save( req.unparsed_uri, res.body )
          end
  
        when %r!http://www\.nicovideo\.jp/thumb_watch/.*!
--- 27,51 ----
        when %r!http://www\.nicovideo\.jp/api/getflv\?v=.*!
          # NicoVideo API
          @logger.debug("GET smile-api: #{req.unparsed_uri}\n")
  
+         body = ''
+         if res['content-encoding'] == 'gzip'
+           r, w = IO.pipe
+           w << res.body
+           w.close
+           gz = Zlib::GzipReader.new(r)
+           body = gz.read
+         else
+           body = res.body
+         end
+ 
+         api_request = @arh.save( req.unparsed_uri, body )
+ 
          if api_request.deleted? && @cache.search(api_request.video_id)
            # Deleted video -> play cache
            @logger.info("Recover video: #{api_request.video_id}")
!           body = recover_deleted_video(api_request, body)
!           @arh.save( req.unparsed_uri, body )
          end
  
        when %r!http://www\.nicovideo\.jp/thumb_watch/.*!