## # nicovideo_download.rb ## ## ニコニコ動画の動画ファイルとコメントをダウンロードするRubyスクリプト for Operaとか ## http://bmky.net/diary/log/1576.html ## ## ## 参考 ## ## * http://d.hatena.ne.jp/emergent/20070820/1187539958 ## * http://blog.livedoor.jp/dankogai/archives/50885358.html ## ## ## 使い方 ## ## Operaで使う際は、profile/menu/内の使用している設定ファイルの[Document Popup Menu]部分に以下を追加 ## ## [Document Popup Menu] ## ... ## Item, "全てのコメントをダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -c -a premier.yaml" ## Item, "動画とコメントをダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -v -c" ## Item, "動画をダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -v" ## Item, "コメントをダウンロード" = Execute program, "C:\nicovideo_download.exe", "%u C:\download -c" ## ## さらに認証用の情報を記入したnico.yamlを ## nicovideo_download.exeと同じディレクトリに置く。 ## nico.yamlは以下のように書く。保存時の文字コードはUTF-8で。 ## ## --- ## mail: hogehoge@gmail.com ## password: foobar ## ## ## コマンドラインオプションについて ## ## nicovideo_download.rb [URL or ID] [save dir] (-v -c -a hoge.yaml) ## ## [URL or ID] ## : 必須。動画のURLもしくはwatch/以降を渡す。マイメモリー対応。 ## [save dir] ## : 必須。ダウンロードしたファイルを保存するディレクトリ。 ## -v ## : 動画をダウンロードするなら -v をつける。 ## -c ## : コメントをダウンロードするなら -c をつける。 ## -a ## : 過去全てのコメントをダウンロードする。要プレミアムアカウント。 ## [半角英数字].yaml ## : 指定したyamlをログイン情報として利用する。アカウントの使い分けをしたい時に。 ## ## ## 更新履歴 ## ## 2007/12/25 ## : 動画がエコノミーだった場合、ファイル名に_lowを追加するようにした ## : プレミアムアカウント時のみ、-aオプションにて全コメントのダウンロードを可能にした ## : xmlを要素毎に改行を追加するようにした ## : 認証用ファイルを指定できるようにした ## ## 2007/12/9 ## : リリース #!/usr/bin/env ruby -Ku require 'yaml' require 'rubygems' require 'mechanize' require 'cgi' require 'kconv' URL_LOGIN = "https://secure.nicovideo.jp/secure/login?site=niconico" URL_WATCH = "http://www.nicovideo.jp/watch/" URL_API = "http://www.nicovideo.jp/api/" class String def safe_filename gsub!( /\s/, "_" ) gsub!( /\//, "/" ) gsub!( /\:/, ":" ) gsub!( /\,/, "," ) gsub!( /\;/, ";" ) gsub!( /\*/, "*" ) gsub!( /\?/, "?" ) gsub!( /\, "<" ) gsub!( /\>/, ">" ) gsub!( /\|/, "|" ) return self end end class NicoServer def initialize( video_id ) @agent = WWW::Mechanize.new @video_id = video_id end def login( login_file ) login_file = "nico.yaml" if login_file == nil @agent.post( URL_LOGIN, YAML.load_file( login_file ) ) html = @agent.get_file( URL_WATCH + @video_id ) content = @agent.get_file( URL_API + "getflv?v=" + @video_id ) params = content.scan( /([^&]+)=([^&]*)/ ).inject( {} ){ |h, v| h[v[0]] = v[1]; h } @video_url = CGI.unescape( params['url'] ) @is_economy = params["url"].index( "low" ) != nil @is_premium = params["is_premium"] == "1" @video_title = html.scan( /