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 のレスポンスで 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/.*!