opendmm 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opendmm.rb +11 -2
- data/lib/opendmm/engines/av_entertainments.rb +13 -6
- data/lib/opendmm/engines/caribbean.rb +7 -7
- data/lib/opendmm/engines/caribbean_pr.rb +6 -6
- data/lib/opendmm/engines/dmm.rb +103 -0
- data/lib/opendmm/engines/jav_library.rb +3 -2
- data/lib/opendmm/engines/mgstage.rb +75 -0
- data/lib/opendmm/engines/one_pondo.rb +1 -1
- data/lib/opendmm/engines/tokyo_hot.rb +2 -2
- data/lib/opendmm/movie.rb +1 -1
- data/lib/opendmm/utils/logger.rb +4 -0
- data/lib/opendmm/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9fd109fd9892fc2cfc406afc24cef8a5e9ea074
|
4
|
+
data.tar.gz: 75c288cb6b2f99207cee3732979eb0872d5000de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0df748805f49ad23c4810348dccdc10b705089794a91fa4eeab3acbf12c2c8df36e2303e8222857b1a29ac6ecf3210961b951576c229ed9a16c15400284972e4
|
7
|
+
data.tar.gz: 2cc330c9b81004a9588961a7b97cc86db347f98bb97eeb5e430da293cc7adf990537898abe3f79b14e479dc7634c57c3366c486cb1a6374627e939bc88f3e62e
|
data/lib/opendmm.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'opendmm/engines/av_entertainments.rb'
|
2
2
|
require 'opendmm/engines/caribbean.rb'
|
3
3
|
require 'opendmm/engines/caribbean_pr.rb'
|
4
|
+
require 'opendmm/engines/dmm.rb'
|
4
5
|
require 'opendmm/engines/heyzo.rb'
|
5
6
|
require 'opendmm/engines/jav_library.rb'
|
7
|
+
require 'opendmm/engines/mgstage.rb'
|
6
8
|
require 'opendmm/engines/one_pondo.rb'
|
7
9
|
require 'opendmm/engines/tokyo_hot.rb'
|
8
10
|
require 'opendmm/version.rb'
|
@@ -13,11 +15,18 @@ module OpenDMM
|
|
13
15
|
Engine::CaribbeanPr,
|
14
16
|
Engine::Heyzo,
|
15
17
|
Engine::OnePondo,
|
16
|
-
Engine::TokyoHot,
|
17
18
|
Engine::JavLibrary,
|
18
19
|
Engine::AvEntertainments,
|
20
|
+
Engine::DMM,
|
21
|
+
Engine::MGStage,
|
22
|
+
Engine::TokyoHot,
|
19
23
|
].lazy.map do |engine|
|
20
|
-
|
24
|
+
begin
|
25
|
+
engine.search(query)
|
26
|
+
rescue StandardError => e
|
27
|
+
LOGGER.info e
|
28
|
+
nil
|
29
|
+
end
|
21
30
|
end.find(&:present?)
|
22
31
|
end
|
23
32
|
end
|
@@ -12,7 +12,8 @@ module OpenDMM
|
|
12
12
|
begin
|
13
13
|
Movie.new(query).details
|
14
14
|
rescue StandardError => e
|
15
|
-
LOGGER.
|
15
|
+
LOGGER.debug query
|
16
|
+
LOGGER.debug e
|
16
17
|
nil
|
17
18
|
end
|
18
19
|
end.find(&:present?)
|
@@ -21,8 +22,14 @@ module OpenDMM
|
|
21
22
|
private
|
22
23
|
|
23
24
|
def self.normalize(query)
|
24
|
-
query.scan(/((?:S2
|
25
|
-
|
25
|
+
query.scan(/((?:S2|2D|3D|[a-z]){2,6}?)[-_\s]?(S?\d{2,5})/i).map do |pair|
|
26
|
+
alpha = pair[0].upcase
|
27
|
+
digit = pair[1]
|
28
|
+
case alpha
|
29
|
+
when /SMBD/, /CWPBD/
|
30
|
+
digit = digit.to_i.to_s.rjust(2, '0')
|
31
|
+
end
|
32
|
+
"#{alpha}-#{digit}"
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
@@ -55,7 +62,7 @@ module OpenDMM
|
|
55
62
|
search = Search.new(query, Site.search(query))
|
56
63
|
super(query, Site.get(search.result))
|
57
64
|
|
58
|
-
@details.title = @html.css('#mini-tabet > h2').
|
65
|
+
@details.title = @html.css('#mini-tabet > h2').text
|
59
66
|
@details.cover_image = @html.at_css('#titlebox > div.list-cover > img')['src'].gsub('jacket_images', 'bigcover')
|
60
67
|
@details.code = @html.css('#mini-tabet > div').text.remove('商品番号:')
|
61
68
|
@details.categories = @html.xpath('//*[@id="TabbedPanels1"]/div/div[2]/div[2]//ol').map(&:text)
|
@@ -69,9 +76,9 @@ module OpenDMM
|
|
69
76
|
when /シリーズ/
|
70
77
|
@details.series = li.css('a').text
|
71
78
|
when /発売日/
|
72
|
-
@details.release_date = li.
|
79
|
+
@details.release_date = li.text
|
73
80
|
when /収録時間/
|
74
|
-
@details.movie_length = li.
|
81
|
+
@details.movie_length = li.text
|
75
82
|
end
|
76
83
|
end
|
77
84
|
end
|
@@ -36,7 +36,7 @@ module OpenDMM
|
|
36
36
|
@details.maker = 'Caribbean'
|
37
37
|
@details.thumbnail_image = './images/l_s.jpg'
|
38
38
|
|
39
|
-
@details.title = @html.css('#main-content > div.main-content-movieinfo > div.video-detail >
|
39
|
+
@details.title = @html.css('#main-content > div.main-content-movieinfo > div.video-detail > h1').text
|
40
40
|
@details.description = @html.css('#main-content > div.main-content-movieinfo > div.movie-comment').text
|
41
41
|
@details.sample_images = @html.css('#main-content > div.detail-content.detail-content-gallery-old > table > tr > td > a').map do |a|
|
42
42
|
a['href']
|
@@ -85,17 +85,17 @@ module OpenDMM
|
|
85
85
|
|
86
86
|
@html.css('#main-content > div.main-content-movieinfo > div.movie-info > dl').map do |dl|
|
87
87
|
case dl.at_css('dt').text
|
88
|
-
when
|
88
|
+
when /出演/
|
89
89
|
@details.actresses = dl.css('dd').map(&:text)
|
90
|
-
when
|
90
|
+
when /カテゴリー/
|
91
91
|
@details.categories = dl.css('dd').map(&:text)
|
92
|
-
when
|
92
|
+
when /販売日/
|
93
93
|
@details.release_date = dl.css('dd').text
|
94
|
-
when
|
94
|
+
when /再生時間/
|
95
95
|
@details.movie_length = dl.css('dd').text
|
96
|
-
when
|
96
|
+
when /スタジオ/
|
97
97
|
@details.maker = dl.css('dd').text
|
98
|
-
when
|
98
|
+
when /シリーズ/
|
99
99
|
@details.series = dl.css('dd').text
|
100
100
|
end
|
101
101
|
end
|
@@ -44,17 +44,17 @@ module OpenDMM
|
|
44
44
|
|
45
45
|
@html.css('#main-content > div.main-content-movieinfo > div.movie-info > dl').map do |dl|
|
46
46
|
case dl.at_css('dt').text
|
47
|
-
when
|
47
|
+
when /出演/
|
48
48
|
@details.actresses = dl.css('dd').map(&:text)
|
49
|
-
when
|
49
|
+
when /カテゴリー/
|
50
50
|
@details.categories = dl.css('dd').map(&:text)
|
51
|
-
when
|
51
|
+
when /販売日/
|
52
52
|
@details.release_date = dl.css('dd').text
|
53
|
-
when
|
53
|
+
when /再生時間/
|
54
54
|
@details.movie_length = dl.css('dd').text
|
55
|
-
when
|
55
|
+
when /スタジオ/
|
56
56
|
@details.maker = dl.css('dd').text
|
57
|
-
when
|
57
|
+
when /シリーズ/
|
58
58
|
@details.series = dl.css('dd').text
|
59
59
|
end
|
60
60
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'opendmm/movie'
|
2
|
+
require 'opendmm/utils/httparty'
|
3
|
+
|
4
|
+
module OpenDMM
|
5
|
+
module Engine
|
6
|
+
module DMM
|
7
|
+
def self.search(query)
|
8
|
+
queries = normalize(query)
|
9
|
+
LOGGER.debug queries
|
10
|
+
queries.lazy.map do |query|
|
11
|
+
begin
|
12
|
+
Movie.new(query).details
|
13
|
+
rescue StandardError => e
|
14
|
+
LOGGER.debug query
|
15
|
+
LOGGER.debug e
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end.find(&:present?)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def self.normalize(query)
|
24
|
+
query.scan(/(?<!S2)([a-z]{2,6})-?(\d{2,5})/i).map do |pair|
|
25
|
+
alpha = pair[0].upcase
|
26
|
+
5.downto(3).map do |len|
|
27
|
+
digit = pair[1].rjust(len, '0')
|
28
|
+
"#{alpha}#{digit}"
|
29
|
+
end
|
30
|
+
end.flatten
|
31
|
+
end
|
32
|
+
|
33
|
+
module Site
|
34
|
+
include HTTParty
|
35
|
+
base_uri 'www.dmm.co.jp'
|
36
|
+
|
37
|
+
def self.search(query)
|
38
|
+
get "/search/=/searchstr=#{CGI::escape(query)}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Search
|
43
|
+
def initialize(query, response)
|
44
|
+
@query = query
|
45
|
+
@response = response
|
46
|
+
@html = Nokogiri.HTML @response
|
47
|
+
end
|
48
|
+
|
49
|
+
def result
|
50
|
+
candidate = @html.at_css('#list > li > div > p.tmb > a')['href']
|
51
|
+
URI.join(@response.request.last_uri.to_s, candidate).to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class Movie < OpenDMM::Movie
|
56
|
+
def initialize(query)
|
57
|
+
search = Search.new(query, Site.search(query))
|
58
|
+
super(query, Site.get(search.result))
|
59
|
+
|
60
|
+
@details.thumbnail_image = @html.at_css('#sample-video img')['src']
|
61
|
+
@details.title = @html.css('#title').text
|
62
|
+
begin
|
63
|
+
@details.cover_image = @html.at_css('#sample-video a')['href']
|
64
|
+
rescue StandardError
|
65
|
+
@details.cover_image = @details.thumbnail_image
|
66
|
+
end
|
67
|
+
|
68
|
+
details_table = @html.at_xpath('//div[@class="page-detail"]/table/tr/td[1]/table')
|
69
|
+
details_table.css('tr').each do |tr|
|
70
|
+
first = tr.css('td')[0]
|
71
|
+
second = tr.css('td')[1]
|
72
|
+
case first.text
|
73
|
+
when /配信開始日/
|
74
|
+
@details.release_date = second.text
|
75
|
+
when /収録時間/
|
76
|
+
@details.movie_length = second.text
|
77
|
+
when /出演者/
|
78
|
+
@details.actresses = second.css('span').map(&:text)
|
79
|
+
when /監督/
|
80
|
+
@details.directors = second.css('span').map(&:text)
|
81
|
+
when /シリーズ/
|
82
|
+
@details.series = second.text
|
83
|
+
when /メーカー/
|
84
|
+
@details.maker = second.text
|
85
|
+
when /レーベル/
|
86
|
+
@details.label = second.text
|
87
|
+
when /ジャンル/
|
88
|
+
@details.genres = second.css('span').map(&:text)
|
89
|
+
when /品番/
|
90
|
+
if second.text =~ /([a-z]+)(\d+)/i
|
91
|
+
@details.code = "#{$1.upcase}-#{$2.to_i.to_s.rjust(3, '0')}"
|
92
|
+
else
|
93
|
+
@details.code = second.text
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
@details.description = details_table.next_element.next_element.xpath('text()').text
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -12,7 +12,8 @@ module OpenDMM
|
|
12
12
|
begin
|
13
13
|
Movie.new(query).details
|
14
14
|
rescue StandardError => e
|
15
|
-
LOGGER.
|
15
|
+
LOGGER.debug query
|
16
|
+
LOGGER.debug e
|
16
17
|
nil
|
17
18
|
end
|
18
19
|
end.find(&:present?)
|
@@ -21,7 +22,7 @@ module OpenDMM
|
|
21
22
|
private
|
22
23
|
|
23
24
|
def self.normalize(query)
|
24
|
-
query.scan(/(
|
25
|
+
query.scan(/((?:S2|2D|3D|[a-z]){2,6})-?(\d{2,5})/i).map do |pair|
|
25
26
|
"#{pair[0].upcase}-#{pair[1]}"
|
26
27
|
end
|
27
28
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'opendmm/movie'
|
2
|
+
require 'opendmm/utils/httparty'
|
3
|
+
|
4
|
+
module OpenDMM
|
5
|
+
module Engine
|
6
|
+
module MGStage
|
7
|
+
def self.search(query)
|
8
|
+
queries = normalize(query)
|
9
|
+
LOGGER.debug queries
|
10
|
+
queries.lazy.map do |query|
|
11
|
+
begin
|
12
|
+
Movie.new(query).details
|
13
|
+
rescue StandardError => e
|
14
|
+
LOGGER.debug query
|
15
|
+
LOGGER.debug e
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end.find(&:present?)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def self.normalize(query)
|
24
|
+
query.scan(/(?<!S2)([a-z]{2,6})-?(\d{2,5})/i).map do |pair|
|
25
|
+
"#{pair[0].upcase}-#{pair[1]}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module Site
|
30
|
+
include HTTParty
|
31
|
+
base_uri 'www.mgstage.com'
|
32
|
+
cookies(adc: 1, coc: 1)
|
33
|
+
headers({
|
34
|
+
"User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
|
35
|
+
})
|
36
|
+
|
37
|
+
def self.movie(query)
|
38
|
+
get "/ppv/video/#{query}/"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Movie < OpenDMM::Movie
|
43
|
+
def initialize(query)
|
44
|
+
super(query, Site.movie(query))
|
45
|
+
|
46
|
+
@details.title = @html.css('.title_detail_layout h1').text
|
47
|
+
@details.cover_image = @html.at_css('a.enlarge_image')['href']
|
48
|
+
@details.thumbnail_image = @html.at_css('a.enlarge_image > img')['src']
|
49
|
+
@details.description = @html.css('#introduction_text > p.introduction').text
|
50
|
+
@details.sample_images = @html.css('a.sample_imageN').map { |a| a['href'] }
|
51
|
+
|
52
|
+
@html.css('#CONTENT_DETAIL dl.spec_layout dt').each do |dt|
|
53
|
+
dd = dt.next_element
|
54
|
+
case dt.text
|
55
|
+
when /配信開始日/
|
56
|
+
@details.release_date = dd.text
|
57
|
+
when /収録時間/
|
58
|
+
@details.movie_length = dd.text
|
59
|
+
when /品番/
|
60
|
+
@details.code = dd.text
|
61
|
+
when /出演/
|
62
|
+
@details.actresses = dd.css('a').map(&:text)
|
63
|
+
when /メーカー/
|
64
|
+
@details.maker = dd.text
|
65
|
+
when /シリーズ名/
|
66
|
+
@details.series = dd.text
|
67
|
+
when /ジャンル/
|
68
|
+
@details.genres = dd.css('a').map(&:text)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -42,7 +42,7 @@ module OpenDMM
|
|
42
42
|
|
43
43
|
@details.title = @html.css('head > title').text.remove(/^.*「/, /」.*$/)
|
44
44
|
@details.actresses = @html.css('#profile-area > div > ul.bgoose > li > a > h2').map(&:text)
|
45
|
-
@details.description = @html.css('#profile-area > div.rr2').
|
45
|
+
@details.description = @html.css('#profile-area > div.rr2').text
|
46
46
|
@details.sample_images = @html.css('#movie-main > div.pics > table > tr > td > img').map do |img|
|
47
47
|
img['src']
|
48
48
|
end
|
@@ -24,11 +24,11 @@ module OpenDMM
|
|
24
24
|
base_uri 'www.tokyo-hot.com'
|
25
25
|
|
26
26
|
def self.list_n
|
27
|
-
get '/j/new_video0000_j.html'
|
27
|
+
@@list_n ||= get '/j/new_video0000_j.html'
|
28
28
|
end
|
29
29
|
|
30
30
|
def self.list_k
|
31
|
-
get '/j/k_video0000_j.html'
|
31
|
+
@@list_k ||= get '/j/k_video0000_j.html'
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
data/lib/opendmm/movie.rb
CHANGED
data/lib/opendmm/utils/logger.rb
CHANGED
data/lib/opendmm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opendmm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jun Zhou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -154,8 +154,10 @@ files:
|
|
154
154
|
- lib/opendmm/engines/av_entertainments.rb
|
155
155
|
- lib/opendmm/engines/caribbean.rb
|
156
156
|
- lib/opendmm/engines/caribbean_pr.rb
|
157
|
+
- lib/opendmm/engines/dmm.rb
|
157
158
|
- lib/opendmm/engines/heyzo.rb
|
158
159
|
- lib/opendmm/engines/jav_library.rb
|
160
|
+
- lib/opendmm/engines/mgstage.rb
|
159
161
|
- lib/opendmm/engines/one_pondo.rb
|
160
162
|
- lib/opendmm/engines/tokyo_hot.rb
|
161
163
|
- lib/opendmm/movie.rb
|
@@ -188,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
188
190
|
version: '0'
|
189
191
|
requirements: []
|
190
192
|
rubyforge_project:
|
191
|
-
rubygems_version: 2.
|
193
|
+
rubygems_version: 2.4.5
|
192
194
|
signing_key:
|
193
195
|
specification_version: 4
|
194
196
|
summary: 'OpenDMM: an open-source Japanese AV search engine'
|