nicovideo 0.1.7 → 0.1.8
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/Rakefile +6 -0
- data/config/hoe.rb +2 -1
- data/lib/nicovideo/mylist.rb +37 -1
- data/lib/nicovideo/openlist.rb +5 -5
- data/lib/nicovideo/page.rb +2 -2
- data/lib/nicovideo/search.rb +4 -4
- data/lib/nicovideo/thumbnail.rb +23 -4
- data/lib/nicovideo/version.rb +1 -1
- data/lib/nicovideo/videopage.rb +4 -1
- data/test/test_mylist.rb +20 -0
- data/test/test_videopage.rb +7 -1
- metadata +13 -3
data/Rakefile
CHANGED
data/config/hoe.rb
CHANGED
@@ -62,7 +62,8 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
62
62
|
p.changes = p.paragraphs_of("ChangeLog", 0..1).join("\\n\\n")
|
63
63
|
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
64
64
|
p.extra_deps = [
|
65
|
-
['mechanize', '>=0.
|
65
|
+
['mechanize', '>=0.9.2'],
|
66
|
+
['json', '>=1.1.4']
|
66
67
|
]
|
67
68
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
68
69
|
end
|
data/lib/nicovideo/mylist.rb
CHANGED
@@ -3,6 +3,7 @@ require 'kconv'
|
|
3
3
|
|
4
4
|
require 'rss/2.0'
|
5
5
|
require 'rss/1.0'
|
6
|
+
require 'json'
|
6
7
|
|
7
8
|
module Nicovideo
|
8
9
|
class MyList < Page
|
@@ -23,10 +24,45 @@ module Nicovideo
|
|
23
24
|
def id() @mylist_id end
|
24
25
|
def url() @raw_url end
|
25
26
|
|
27
|
+
def add(video_id)
|
28
|
+
video_page = VideoPage.new @agent, video_id
|
29
|
+
|
30
|
+
begin
|
31
|
+
add_result = @agent.post(video_page.url, {
|
32
|
+
:mylist => "add",
|
33
|
+
:mylistgroup_name => "",
|
34
|
+
:csrf_token => video_page.csrf_token,
|
35
|
+
:group_id => @mylist_id,
|
36
|
+
:ajax => "1"})
|
37
|
+
|
38
|
+
result_code = JSON.parse(add_result.body.sub(/^\(?(.*?)\)?$/, '\1'))
|
39
|
+
|
40
|
+
if result_code["result"] == "success" then
|
41
|
+
# added video isn't applied to rss immediately, so add video into list by hand.
|
42
|
+
page = @page || get_page(@url)
|
43
|
+
@videos << video_page
|
44
|
+
return self
|
45
|
+
end
|
46
|
+
raise ArgError if result_code["result"] == "duperror"
|
47
|
+
raise StandardError
|
48
|
+
rescue WWW::Mechanize::ResponseCodeError => e
|
49
|
+
rc = e.response_code
|
50
|
+
puts_info rc
|
51
|
+
if rc == "404" || rc == "410"
|
52
|
+
@not_found = true
|
53
|
+
raise NotFound
|
54
|
+
elsif rc == "403"
|
55
|
+
raise Forbidden
|
56
|
+
else
|
57
|
+
raise e
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
26
62
|
private
|
27
63
|
def parse(page)
|
28
64
|
@rss = RSS::Parser.parse(page.body)
|
29
|
-
@title = rss.channel.title.sub(/#{
|
65
|
+
@title = rss.channel.title.sub(/#{BASE_TITLE1}/,'').sub(/#{NICO_MYLIST} /, '')
|
30
66
|
@user = rss.channel.managingEditor
|
31
67
|
@description = rss.channel.description
|
32
68
|
|
data/lib/nicovideo/openlist.rb
CHANGED
@@ -61,24 +61,24 @@ module Nicovideo
|
|
61
61
|
|
62
62
|
protected
|
63
63
|
def parse(page)
|
64
|
-
if page.body =~ /<strong
|
64
|
+
if page.body =~ /<strong.*?>#{@video_id}<\/strong> を登録している公開マイリストはありません。/
|
65
65
|
@not_found = true
|
66
66
|
raise NotFound
|
67
67
|
end
|
68
68
|
|
69
|
-
@total_size = page.search('//
|
69
|
+
@total_size = page.search('//div[@class="mb8p4"]//p[@class="TXT12"]//strong').first.inner_html.sub(/,/,'').to_i
|
70
70
|
|
71
71
|
@has_next = false
|
72
72
|
@has_prev = false
|
73
|
-
respages = page/'//div[@class="
|
73
|
+
respages = page/'//div[@class="pagelink"]'
|
74
74
|
puts_info respages.size
|
75
75
|
respages.each {|r| puts_info r.inner_html }
|
76
76
|
if respages.size > 0
|
77
77
|
respages.each {|text|
|
78
|
-
if text.inner_html =~
|
78
|
+
if text.inner_html =~ /<a class="prevpage".*?>.*?戻る.*?<\/a>/
|
79
79
|
@has_prev = true
|
80
80
|
end
|
81
|
-
if text.inner_html =~
|
81
|
+
if text.inner_html =~ /<a class="nextpage".*?>.*?進む.*?<\/a>/
|
82
82
|
@has_next = true
|
83
83
|
end
|
84
84
|
}
|
data/lib/nicovideo/page.rb
CHANGED
@@ -6,8 +6,8 @@ module Nicovideo
|
|
6
6
|
NV_DEBUG_LEVEL = 0
|
7
7
|
|
8
8
|
BASE_URL = 'http://www.nicovideo.jp'
|
9
|
-
BASE_TITLE1 = '‐ニコニコ動画\(
|
10
|
-
BASE_TITLE2 = 'ニコニコ動画\(
|
9
|
+
BASE_TITLE1 = '‐ニコニコ動画\(.*?\)'.toutf8
|
10
|
+
BASE_TITLE2 = 'ニコニコ動画\(.*?\)‐'.toutf8
|
11
11
|
|
12
12
|
def initialize agent
|
13
13
|
@agent = agent
|
data/lib/nicovideo/search.rb
CHANGED
@@ -68,19 +68,19 @@ module Nicovideo
|
|
68
68
|
raise NotFound
|
69
69
|
end
|
70
70
|
|
71
|
-
@total_size = page.search('
|
71
|
+
@total_size = page.search('strong[@class="search_total"]').first.inner_html.sub(/,/,'').to_i
|
72
72
|
|
73
73
|
@has_next = false
|
74
74
|
@has_prev = false
|
75
|
-
respages = page/'//div[@class="
|
75
|
+
respages = page/'//div[@class="pagelink"]'
|
76
76
|
puts_info respages.size
|
77
77
|
respages.each {|r| puts_info r.inner_html }
|
78
78
|
if respages.size > 0
|
79
79
|
respages.each {|text|
|
80
|
-
if text.inner_html =~
|
80
|
+
if text.inner_html =~ /<a class="prevpage".*?>.*?戻る.*?<\/a>/
|
81
81
|
@has_prev = true
|
82
82
|
end
|
83
|
-
if text.inner_html =~
|
83
|
+
if text.inner_html =~ /<a class="nextpage".*?>.*?進む.*?<\/a>/
|
84
84
|
@has_next = true
|
85
85
|
end
|
86
86
|
}
|
data/lib/nicovideo/thumbnail.rb
CHANGED
@@ -18,7 +18,7 @@ module Nicovideo
|
|
18
18
|
retry_count = 0
|
19
19
|
begin
|
20
20
|
body = timeout(wait_sec) do
|
21
|
-
open("http://
|
21
|
+
open("http://ext.nicovideo.jp/api/getthumbinfo/#{video_id}", :proxy => @proxy_url) do |f|
|
22
22
|
f.read
|
23
23
|
end
|
24
24
|
end
|
@@ -34,11 +34,14 @@ module Nicovideo
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def get_elements(parent)
|
37
|
-
thumbnail_info =
|
37
|
+
thumbnail_info = ThumbInfo.new
|
38
38
|
|
39
39
|
parent.each_element do |element|
|
40
|
-
if element.
|
41
|
-
|
40
|
+
if element.name == 'tags' then
|
41
|
+
thumbnail_info.tags[element.attributes['domain']] = []
|
42
|
+
element.each_element do |child|
|
43
|
+
thumbnail_info.tags[element.attributes['domain']] << child.text
|
44
|
+
end
|
42
45
|
next
|
43
46
|
end
|
44
47
|
thumbnail_info[element.name] = element.text
|
@@ -46,4 +49,20 @@ module Nicovideo
|
|
46
49
|
thumbnail_info
|
47
50
|
end
|
48
51
|
end
|
52
|
+
|
53
|
+
class ThumbInfo < Hash
|
54
|
+
attr_accessor :tags
|
55
|
+
def initialize
|
56
|
+
@tags = {}
|
57
|
+
end
|
58
|
+
|
59
|
+
def has_tag?(tag)
|
60
|
+
@tag_hash ||= tag_flatten.inject({}) {|tag_hash, temp_tag| tag_hash[temp_tag] = temp_tag}
|
61
|
+
@tag_hash.has_key? tag
|
62
|
+
end
|
63
|
+
|
64
|
+
def tag_flatten
|
65
|
+
@tag_flatten ||= @tags.values.flatten
|
66
|
+
end
|
67
|
+
end
|
49
68
|
end
|
data/lib/nicovideo/version.rb
CHANGED
data/lib/nicovideo/videopage.rb
CHANGED
@@ -8,7 +8,7 @@ module Nicovideo
|
|
8
8
|
@video_id = video_id
|
9
9
|
@params = nil
|
10
10
|
@url = BASE_URL + '/watch/' + @video_id
|
11
|
-
register_getter ["title", "tags", "published_at"]
|
11
|
+
register_getter ["title", "tags", "published_at", "csrf_token"]
|
12
12
|
end
|
13
13
|
|
14
14
|
attr_reader :video_id, :url
|
@@ -86,6 +86,9 @@ module Nicovideo
|
|
86
86
|
str = page.search("div[@id='WATCHHEADER']//p[@class='TXT12']/strong")[0].inner_text
|
87
87
|
tm = str.scan(/\d+/)
|
88
88
|
@published_at = Time.mktime(*tm)
|
89
|
+
|
90
|
+
# csrf_token
|
91
|
+
@csrf_token = page.search("form[@name='mylist_form']//input[@name='csrf_token']")[0]['value']
|
89
92
|
end
|
90
93
|
|
91
94
|
def get_params
|
data/test/test_mylist.rb
CHANGED
@@ -10,6 +10,9 @@ class TestNicovideoMyList < Test::Unit::TestCase
|
|
10
10
|
@mid_valid = '3982404' # 公開マイリスト
|
11
11
|
@mid_invalid = 'smfdsaf' # IDが間違っている
|
12
12
|
@mid_notopened = '3825220' # 非公開
|
13
|
+
#@mid_testers_own = '12149071' # テスト用アカウントに登録されているマイリストのID
|
14
|
+
|
15
|
+
@vid_valid = 'sm2407057' # 閲覧可能(短い動画)
|
13
16
|
end
|
14
17
|
|
15
18
|
def test_mylist_valid
|
@@ -69,4 +72,21 @@ class TestNicovideoMyList < Test::Unit::TestCase
|
|
69
72
|
|
70
73
|
sleep 5
|
71
74
|
end
|
75
|
+
|
76
|
+
def test_add
|
77
|
+
ml = nil
|
78
|
+
assert_nothing_raised {
|
79
|
+
ml = @nv.mylist(@mid_testers_own)
|
80
|
+
}
|
81
|
+
|
82
|
+
# FIXME removing video function is NOT implemented,
|
83
|
+
# so you MUST remove video from mylist before test.
|
84
|
+
assert_nothing_raised {
|
85
|
+
ml.add @vid_valid
|
86
|
+
}
|
87
|
+
|
88
|
+
assert_equal(@vid_valid, ml.videos.last.video_id)
|
89
|
+
|
90
|
+
sleep 5
|
91
|
+
end
|
72
92
|
end
|
data/test/test_videopage.rb
CHANGED
@@ -8,7 +8,8 @@ class TestNicovideoVideoPage < Test::Unit::TestCase
|
|
8
8
|
@nv.login
|
9
9
|
|
10
10
|
# @vid_valid = 'sm500873' # 閲覧可能(組曲)
|
11
|
-
|
11
|
+
#@vid_valid = 'sm2407057' # 閲覧可能(短い動画)
|
12
|
+
@vid_valid = 'sm9' # 閲覧可能(短い動画)
|
12
13
|
@vid_invalid = 'smfdsafd' # IDが間違っている
|
13
14
|
@vid_notfound = 'sm500875' # 削除済み
|
14
15
|
end
|
@@ -40,10 +41,12 @@ class TestNicovideoVideoPage < Test::Unit::TestCase
|
|
40
41
|
assert_instance_of(String, vp.title)
|
41
42
|
assert_instance_of(Time, vp.published_at)
|
42
43
|
assert_instance_of(Nicovideo::Comments, vp.comments)
|
44
|
+
assert_instance_of(String, vp.csrf_token)
|
43
45
|
|
44
46
|
puts vp.tags
|
45
47
|
puts vp.title
|
46
48
|
puts vp.published_at
|
49
|
+
puts vp.csrf_token
|
47
50
|
# assert_nothing_raised { vp.flv }
|
48
51
|
#assert_instance_of(String, vp.flv)
|
49
52
|
#assert_instance_of(String, vp.video)
|
@@ -60,6 +63,7 @@ class TestNicovideoVideoPage < Test::Unit::TestCase
|
|
60
63
|
assert_instance_of(Array, v.tags)
|
61
64
|
assert_instance_of(String, v.title)
|
62
65
|
assert_instance_of(Nicovideo::Comments, v.comments)
|
66
|
+
assert_instance_of(String, v.csrf_token)
|
63
67
|
# assert_instance_of(String, v.flv)
|
64
68
|
# assert_instance_of(String, v.video)
|
65
69
|
}
|
@@ -81,6 +85,7 @@ class TestNicovideoVideoPage < Test::Unit::TestCase
|
|
81
85
|
assert_raise(Nicovideo::NotFound) { vp.comments }
|
82
86
|
assert_raise(Nicovideo::NotFound) { vp.flv }
|
83
87
|
assert_raise(Nicovideo::NotFound) { vp.video }
|
88
|
+
assert_raise(Nicovideo::NotFound) { vp.csrf_token }
|
84
89
|
|
85
90
|
sleep 1
|
86
91
|
end
|
@@ -97,6 +102,7 @@ class TestNicovideoVideoPage < Test::Unit::TestCase
|
|
97
102
|
assert_raise(Nicovideo::NotFound) { vp.comments }
|
98
103
|
assert_raise(Nicovideo::NotFound) { vp.flv }
|
99
104
|
assert_raise(Nicovideo::NotFound) { vp.video }
|
105
|
+
assert_raise(Nicovideo::NotFound) { vp.csrf_token }
|
100
106
|
|
101
107
|
sleep 1
|
102
108
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nicovideo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- emergent
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-05-01 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,17 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.
|
23
|
+
version: 0.9.2
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: json
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.4
|
24
34
|
version:
|
25
35
|
- !ruby/object:Gem::Dependency
|
26
36
|
name: hoe
|