デブサミ2008のニコニコ動画をダウンロードする

id:emergentさんのnicovideoライブラリをいつか試してみようと思っていたので実際に試してみた。
 
表題の通り、やることは「デブサミ2008のニコニコ動画をダウンロードする」ね。
 

準備

nicovideoとhpricotをgemでインストール

# gem install nicovideo
# gem install hpricot

実行するrubyはこちら

require 'rubygems'
require 'nicovideo'
require 'net/https'
require 'hpricot'

MAIL = '___your_mail@gmail.com'
PASSWORD = '___your_password'

# hpricotでデブサミ2008のニコニコ動画idを取得
sid = nil
https = Net::HTTP.new("secure.nicovideo.jp", 443)
https.use_ssl = true
https.start do |w|
  data = "next_url=&mail=#{MAIL}&password=#{PASSWORD}"
  res = w.post("/secure/login?site=niconico", data, "Content-Length" => "#{data.length}")
  sid = $1 if res["Set-Cookie"] =~ /user_session=user_session([\d_]+)/
end

video_ids = []
#TARGET = "/tag/TechTalk?sort=f"
TARGET = "/mylist/5057457"
Net::HTTP.start("www.nicovideo.jp", 80) do |w|
  res = w.get(TARGET, "Cookie" => "user_session=user_session#{sid}")
  doc = Hpricot.parse(res.body.tosjis)
  (doc/'a.video').each do |link|
    if link[:href]
      video_ids << link[:href].sub("watch/", "")
    end
  end
end

# Nicovideoライブラリでデブサミ動画のidから動画をダウンロード
nv = Nicovideo.new(MAIL, PASSWORD).login
video_ids.each {|video_id|
  nv.watch(video_id) {|v|
    file_name = "#{v.id}_#{v.title}.flv"
    puts file_name
    File.open(file_name, "wb") {|f| f.write v.flv }
  }
  sleep 3
}

 

仕組み

  1. 「coji さんの 公開マイリスト:デブサミ2008 竹迫アワー」をHpricotでスクレイピングしてニコニコ動画のidを取得する。
  2. Nicovideoクラスで上記1で取得したidの動画をダウンロード

これだけ。
 

余談

Plaggerでやったらもっと簡単にできるのかな。
ログインを2回してしまっているけど、Nicovideoで本当はスクレイピングも出来るのかな??
 
ダウンロードしたflvをiSquintでmp4に変換してipodで見るっす。
 

追記:作ったあとに気づいた。

ニコニコ動画ダウンロードAPI:マイリスト取得機能ってあったのね。
http://d.hatena.ne.jp/emergent/20080216
こっちの方がすごい簡単じゃん。

require 'rubygems'
require 'nicovideo'

MAIL = '___your_mail@gmail.com'
PASSWORD = '___your_password'

nv = Nicovideo.new(MAIL, PASSWORD).login

nv.mylist('5057457').videos.each {|v|
  file_name = "#{v.id}_#{v.title}.flv"
  puts file_name
  File.open(file_name, "wb") {|f| f.write v.flv }
  sleep 3
}

 
じゃさっきのはTARGET定数を"/tag/TechTalk"とかして
好きなタグのをDLしたい時にでも使おう。
 
その機能もあったりして・・