Hatena::ブログ(Diary)

あおうさ@日記 このページをアンテナに追加 RSSフィード Twitter

「私は、いつかコードで人を感動させる。そう、音楽や映画やスポーツで私を感動させたように・・・」 「この思いは絶対に忘れない。」

2008-02-17

[]デブサミ2008のニコニコ動画をダウンロードする 15:32 デブサミ2008のニコニコ動画をダウンロードするを含むブックマーク デブサミ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したい時にでも使おう。

 

その機能もあったりして・・

[]東京マラソン 18:35 東京マラソンを含むブックマーク 東京マラソンのブックマークコメント

今日は東京マラソンでしたね。 私は抽選に外れました。

来年は参加したい。 フルマラソンじゃなく10kmのやつだけど。

トラックバック - http://d.hatena.ne.jp/bluerabbit/20080217