ニコニコ動画のURLを指定すると携帯用音声ファイルに変換してくれるrubyスクリプト
ニコニコから動画ダウンロード→音声を抜き出してエンコード
という処理をすればいい。ニコニコからダウンロードするところが肝心。
ニコニコからダウンロードするrubyのライブラリが存在するんだけど、入れてみたところ使えなかった*1。
http://rubyforge.org/projects/nicovideo/
で、rubyのmechanizeというライブラリを使ってニコニコからダウンロードするサンプルが公開されていたので、これを参考にした。
http://blog.longearth.net/2008/03/19/ruby%e3%81%a7%e3%83%8b%e3%82%b3%e3%83%8b%e3%82%b3%e5%8b%95%e7%94%bb%e3%82%92%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%99%e3%82%8b%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88/
http://d.hatena.ne.jp/kitamomonga/20080328/kaisetsu_ruby_www_mechanize
準備
apt-getで入れておく
sudo apt-get install ruby rubygems ruby1.8-dev ffmpeg lame normalize-audio faac
gemで入れておく
sudo gem install rubygems hoe mechanize
ndl.rb
#!/usr/bin/ruby -Ku require 'rubygems' require 'mechanize' require 'cgi' #引数はニコニコの動画URL nicourl = ARGV.first agent = WWW::Mechanize.new agent.post('https://secure.nicovideo.jp/secure/login?site=niconico', 'mail' => 'メールアドレス', 'password' => 'パスワード') #動画ページにアクセス #これをしないとgetflvにアクセスした時に403が返ってくるっぽい video_page = agent.get(nicourl) #firstは配列の先頭要素を返す video_id = nicourl.scan(/sm\d+$/).first content = agent.get('http://www.nicovideo.jp/api/getflv?v=' + video_id) #getflvから返ってきたbodyの #"hoge=fuga&..."のような形式の値をハッシュにする hash = Hash.new content.body.scan(/([^&]+)=([^&]*)/).each do |v| hash[v[0]] = v[1] end #URLデコード video_url = CGI.unescape(hash['url']) #ファイル名を動画ページのタイトルにする #タイトル末尾につく「-ニコニコ動画(冬)」を取り除いている #\342\200\220は全角ハイフンかなんかの8進数表記 videofile = video_page.title.sub("\342\200\220ニコニコ動画\(冬\)","") open(videofile,'wb') do |f| f.print agent.get_file(video_url) end #タイトルに含まれる空白などをエスケープする videofile = Regexp.quote(videofile) #コマンド実行 `ffmpeg -i #{videofile} -acodec copy -vn #{videofile}.mp3` `lame --decode #{videofile}.mp3 #{videofile}.wav` `normalize-audio #{videofile}.wav` `faac -w #{videofile}.wav` `rm #{videofile} #{videofile}.mp3 #{videofile}.wav`
最後のコマンド実行とかかなり強引な感じがする!
使い方:
ruby -w ndl.rb http://www.nicovideo.jp/watch/sm1791398
でm4aファイルができる。
*1:ニコニコの仕様が変わったか、または必要なものが足りないか。今回やってみた感じだと仕様は変わってなさそうなので後者の可能性が高い