ニコニコ動画の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ファイルができる。

まだ未完成


apachecgiとして動かせるようにしておいて、ブラウザでニコニコ見てるときにブックマークレットから呼び出すとかしたい。

*1:ニコニコの仕様が変わったか、または必要なものが足りないか。今回やってみた感じだと仕様は変わってなさそうなので後者の可能性が高い