nicovideo 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/nicovideo.rb +1 -0
- data/lib/nicovideo/base.rb +20 -79
- data/lib/nicovideo/version.rb +1 -1
- data/lib/nicovideo/videopage.rb +94 -0
- data/sample/nv_download2.rb +33 -0
- metadata +4 -2
data/lib/nicovideo.rb
CHANGED
data/lib/nicovideo/base.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
require 'kconv'
|
3
|
-
|
4
1
|
module Nicovideo
|
5
2
|
|
6
3
|
class NicovideoArgError < StandardError ; end
|
@@ -8,8 +5,6 @@ module Nicovideo
|
|
8
5
|
class NicovideoNotFoundError < StandardError ; end
|
9
6
|
|
10
7
|
class Base
|
11
|
-
NV_DEBUG_LEVEL = 0
|
12
|
-
TITLE_NICONICO = 'ニコニコ動画\(RC\)‐'.toutf8
|
13
8
|
|
14
9
|
def initialize mail=nil, password=nil
|
15
10
|
@mail = mail
|
@@ -18,9 +13,7 @@ module Nicovideo
|
|
18
13
|
@agent = WWW::Mechanize.new()
|
19
14
|
|
20
15
|
# for parameters current video
|
21
|
-
@
|
22
|
-
@params = nil
|
23
|
-
@page = nil
|
16
|
+
@vp = nil
|
24
17
|
self
|
25
18
|
end
|
26
19
|
|
@@ -31,8 +24,8 @@ module Nicovideo
|
|
31
24
|
account = {'mail' => @mail, 'password' => @password }
|
32
25
|
|
33
26
|
begin
|
34
|
-
@
|
35
|
-
|
27
|
+
@agent.post('https://secure.nicovideo.jp/secure/login?site=niconico', account)
|
28
|
+
# TODO: check login success or failure
|
36
29
|
@logged_in = true
|
37
30
|
rescue
|
38
31
|
@logged_in = false
|
@@ -43,96 +36,44 @@ module Nicovideo
|
|
43
36
|
end
|
44
37
|
|
45
38
|
def watch(video_id)
|
46
|
-
@
|
39
|
+
@vp = get_videopage(video_id)
|
47
40
|
if block_given?
|
48
|
-
yield
|
41
|
+
yield @vp
|
49
42
|
end
|
50
43
|
end
|
51
44
|
|
52
|
-
def logged_in?()
|
53
|
-
def comments(num=500) self.get_comments(@video_id, num) end
|
54
|
-
def flv() self.get_flv @video_id end
|
55
|
-
def title() self.get_title @video_id end
|
56
|
-
def tags() self.get_tags @video_id end
|
45
|
+
def logged_in?() @logged_in end
|
57
46
|
|
58
|
-
def get_tags
|
59
|
-
|
60
|
-
div = page.parser.search("div#video_tags")
|
61
|
-
tags = div.to_html.scan(/<a href=\"tag\/[\w\%]+?\">(.+?)<\/a>/ou).inject([]) {|arr, v|
|
62
|
-
puts_debug v[0]
|
63
|
-
arr << v[0]
|
64
|
-
}
|
65
|
-
tags
|
47
|
+
def get_tags(video_id)
|
48
|
+
get_videopage(video_id).tags
|
66
49
|
end
|
67
50
|
|
68
|
-
def get_title
|
69
|
-
|
70
|
-
title = page.title
|
71
|
-
puts_info title.toutf8.sub(/^#{TITLE_NICONICO}/ou, '')
|
72
|
-
title.toutf8.sub(/^#{TITLE_NICONICO}/ou, '')
|
51
|
+
def get_title(video_id)
|
52
|
+
get_videopage(video_id).title
|
73
53
|
end
|
74
54
|
|
75
|
-
def get_video
|
76
|
-
|
77
|
-
self.get_flv video_id
|
55
|
+
def get_video(video_id)
|
56
|
+
self.get_flv(video_id)
|
78
57
|
end
|
79
58
|
|
80
|
-
def get_flv
|
81
|
-
|
82
|
-
begin
|
83
|
-
params = get_params video_id
|
84
|
-
|
85
|
-
video_url = CGI.unescape(params['url'])
|
86
|
-
video_flv = @agent.get_file(video_url)
|
87
|
-
Video.new(video_id, video_flv)
|
88
|
-
end
|
59
|
+
def get_flv(video_id)
|
60
|
+
get_videopage(video_id).flv
|
89
61
|
end
|
90
62
|
|
91
63
|
def get_comments video_id, num=500
|
92
|
-
|
93
|
-
begin
|
94
|
-
params = get_params video_id
|
95
|
-
raise unless params['ms']
|
96
|
-
|
97
|
-
thread_id = params['thread_id']
|
98
|
-
body = %!<thread res_from="-#{num}" version="20061206" thread="#{thread_id}" />!
|
99
|
-
post_url = CGI.unescape(params['ms'])
|
100
|
-
comment_xml = @agent.post_data(post_url, body).body
|
101
|
-
puts_debug comment_xml
|
102
|
-
Comments.new(video_id, comment_xml)
|
103
|
-
end
|
64
|
+
get_videopage(video_id).comments(num)
|
104
65
|
end
|
105
66
|
|
106
67
|
private
|
107
|
-
def
|
68
|
+
def get_videopage(video_id)
|
108
69
|
self.login unless @logged_in
|
109
|
-
|
110
|
-
begin
|
111
|
-
if !((video_id == @video_id) && @params)
|
112
|
-
puts_info 'getting params : id = ' + video_id
|
113
|
-
@video_id = video_id
|
114
|
-
page = get_page video_id
|
115
|
-
content = @agent.get_file('http://www.nicovideo.jp/api/getflv?v=' + video_id)
|
116
|
-
puts_debug content
|
117
|
-
@params = content.scan(/([^&]+)=([^&]*)/).inject({}){|h, v| h[v[0]] = v[1]; h}
|
118
|
-
else
|
119
|
-
puts_info 'params are already in cache : id = ' + video_id
|
120
|
-
end
|
121
|
-
@params
|
122
|
-
rescue
|
123
|
-
raise NicovideoNotFoundError
|
124
|
-
end
|
125
|
-
end
|
126
70
|
|
127
|
-
|
128
|
-
|
129
|
-
|
71
|
+
if @vp.nil? || video_id != @vp.video_id
|
72
|
+
@vp = VideoPage.new(@agent, video_id)
|
73
|
+
end
|
74
|
+
@vp
|
130
75
|
end
|
131
76
|
|
132
|
-
def puts_error str ; puts str if (NV_DEBUG_LEVEL >= 1) ; end
|
133
|
-
def puts_info str ; puts str if (NV_DEBUG_LEVEL >= 2) ; end
|
134
|
-
def puts_debug str ; puts str if (NV_DEBUG_LEVEL >= 3) ; end
|
135
|
-
|
136
77
|
end
|
137
78
|
|
138
79
|
def Nicovideo.new(mail, password)
|
data/lib/nicovideo/version.rb
CHANGED
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'kconv'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
module Nicovideo
|
5
|
+
class VideoPage
|
6
|
+
NV_DEBUG_LEVEL = 0
|
7
|
+
TITLE_NICONICO = 'ニコニコ動画\(RC\)‐'.toutf8
|
8
|
+
|
9
|
+
def initialize agent, video_id=nil
|
10
|
+
@agent = agent
|
11
|
+
@video_id = video_id
|
12
|
+
@params = nil
|
13
|
+
@page = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :video_id
|
17
|
+
|
18
|
+
def comments(num=500)
|
19
|
+
puts_info 'getting comment xml : id = ' + @video_id
|
20
|
+
begin
|
21
|
+
@params = @params || get_params
|
22
|
+
ms = @params['ms']
|
23
|
+
raise unless ms
|
24
|
+
|
25
|
+
thread_id = @params['thread_id']
|
26
|
+
body = %!<thread res_from="-#{num}" version="20061206" thread="#{thread_id}" />!
|
27
|
+
post_url = CGI.unescape(ms)
|
28
|
+
comment_xml = @agent.post_data(post_url, body).body
|
29
|
+
puts_debug comment_xml
|
30
|
+
Comments.new(@video_id, comment_xml)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def flv() return video() end
|
35
|
+
|
36
|
+
def video()
|
37
|
+
begin
|
38
|
+
@params = @params || get_params
|
39
|
+
video_url = CGI.unescape(@params['url'])
|
40
|
+
video_flv = @agent.get_file(video_url)
|
41
|
+
Video.new(@video_id, video_flv)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def tags()
|
46
|
+
@page = @page || get_page
|
47
|
+
div = @page.parser.search("div#video_tags")
|
48
|
+
tags = div.to_html.scan(/<a href=\"tag\/[\w\%]+?\">(.+?)<\/a>/ou).inject([]) {|arr, v|
|
49
|
+
puts_debug v[0]
|
50
|
+
arr << v[0]
|
51
|
+
}
|
52
|
+
tags
|
53
|
+
end
|
54
|
+
|
55
|
+
def title()
|
56
|
+
@page = @page || get_page
|
57
|
+
title = @page.title
|
58
|
+
title.toutf8.sub(/^#{TITLE_NICONICO}/ou, '')
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def get_params
|
63
|
+
begin
|
64
|
+
unless @params
|
65
|
+
puts_info 'getting params : id = ' + @video_id
|
66
|
+
@page = @page || get_page
|
67
|
+
content = @agent.get_file('http://www.nicovideo.jp/api/getflv?v=' + @video_id)
|
68
|
+
puts_debug content
|
69
|
+
@params = content.scan(/([^&]+)=([^&]*)/).inject({}){|h, v| h[v[0]] = v[1]; h}
|
70
|
+
else
|
71
|
+
puts_info 'params have already gotten : id = ' + @video_id
|
72
|
+
end
|
73
|
+
@params
|
74
|
+
rescue
|
75
|
+
raise NicovideoNotFoundError
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def get_page
|
80
|
+
if @video_id
|
81
|
+
puts_info 'getting HTML page : id = ' + @video_id
|
82
|
+
begin
|
83
|
+
@agent.get('http://www.nicovideo.jp/watch/' + @video_id)
|
84
|
+
rescue
|
85
|
+
raise NicovideoNotFoundError
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def puts_error str ; puts str if (NV_DEBUG_LEVEL >= 1) ; end
|
91
|
+
def puts_info str ; puts str if (NV_DEBUG_LEVEL >= 2) ; end
|
92
|
+
def puts_debug str ; puts str if (NV_DEBUG_LEVEL >= 3) ; end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'nicovideo'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
video_ids = ARGV
|
6
|
+
|
7
|
+
# set account
|
8
|
+
account = YAML.load_file(ENV['HOME'] + '/.nicovideo/account.yml')
|
9
|
+
mail = account['mail']
|
10
|
+
password = account['password']
|
11
|
+
|
12
|
+
# you must login to Nicovideo
|
13
|
+
nv = Nicovideo.new(mail, password).login
|
14
|
+
|
15
|
+
# get videos and comments
|
16
|
+
video_ids.each {|video_id|
|
17
|
+
|
18
|
+
# the another way of nv_download
|
19
|
+
puts nv.get_title(video_id)
|
20
|
+
puts nv.get_tags(video_id).join(' ')
|
21
|
+
puts 'getting comments xml'
|
22
|
+
File.open("#{video_id}.xml", "wb") {|f|
|
23
|
+
f.write nv.get_comments(video_id, 100).to_xml
|
24
|
+
}
|
25
|
+
puts 'getting flv file'
|
26
|
+
File.open("#{video_id}.flv", "wb") {|f|
|
27
|
+
f.write nv.get_flv(video_id)
|
28
|
+
}
|
29
|
+
|
30
|
+
sleep 1
|
31
|
+
}
|
32
|
+
|
33
|
+
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: nicovideo
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2008-01-
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2008-01-07 00:00:00 +09:00
|
8
8
|
summary: utils for nicovideo
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -37,11 +37,13 @@ files:
|
|
37
37
|
- lib/nicovideo/version.rb
|
38
38
|
- lib/nicovideo/mechanize-ext.rb
|
39
39
|
- lib/nicovideo/base.rb
|
40
|
+
- lib/nicovideo/videopage.rb
|
40
41
|
- lib/nicovideo/video.rb
|
41
42
|
- lib/nicovideo/comments.rb
|
42
43
|
- test/test_helper.rb
|
43
44
|
- test/test_nicovideo.rb
|
44
45
|
- sample/nv_download.rb
|
46
|
+
- sample/nv_download2.rb
|
45
47
|
test_files:
|
46
48
|
- test/test_nicovideo.rb
|
47
49
|
- test/test_helper.rb
|