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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b4cc51892b1ce7dc742b3a9511332505a77fea8f
4
- data.tar.gz: 43c47037f3312b1ac32438e3c0d0724742df5a76
3
+ metadata.gz: c9fd109fd9892fc2cfc406afc24cef8a5e9ea074
4
+ data.tar.gz: 75c288cb6b2f99207cee3732979eb0872d5000de
5
5
  SHA512:
6
- metadata.gz: 86f019f10244507568eceea1b3c45d38d95fb38d94e0bde0c0155c6715b30608a1ef327105357fb66c52317f8586fcb07daf623550855f85ac28cd7faad5457a
7
- data.tar.gz: 88fc41d5cf2936d1ecccd846fc52235d67f5ec567913f14a5f9b67adef9a48fe306d47e0c7f4ed5a62694026d7a62ff2809a166d5ec492d289f3dc2037dca913
6
+ metadata.gz: 0df748805f49ad23c4810348dccdc10b705089794a91fa4eeab3acbf12c2c8df36e2303e8222857b1a29ac6ecf3210961b951576c229ed9a16c15400284972e4
7
+ data.tar.gz: 2cc330c9b81004a9588961a7b97cc86db347f98bb97eeb5e430da293cc7adf990537898abe3f79b14e479dc7634c57c3366c486cb1a6374627e939bc88f3e62e
@@ -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
- engine.search(query)
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.info e
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)?[a-z]{2,5})[-_\s]?(S?\d{2,5})/i).map do |pair|
25
- "#{pair[0].upcase}-#{pair[1]}"
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').inner_text
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.inner_text
79
+ @details.release_date = li.text
73
80
  when /収録時間/
74
- @details.movie_length = li.inner_text
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 > span.movie-title').text
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.info e
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(/(?<!S2)([a-z]{2,5})-?(\d{2,5})/i).map do |pair|
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').inner_text
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
 
@@ -94,7 +94,7 @@ module OpenDMM
94
94
 
95
95
  def normalize_title
96
96
  if actresses = self[:actresses]
97
- pieces = self[:title].squish.split
97
+ pieces = self[:title].gsub(/[\/,::]/, ' ').squish.split
98
98
  while pieces.last.in?(actresses) || pieces.last =~ /^-+$/
99
99
  pieces.pop
100
100
  end
@@ -2,5 +2,9 @@ require 'logger'
2
2
 
3
3
  module OpenDMM
4
4
  LOGGER = Logger.new STDERR
5
+ LOGGER.formatter = proc do |severity, datetime, progname, msg|
6
+ file = caller[4][/.*\/(.*):.*/, 1]
7
+ "[#{severity[0]}, #{datetime}, #{file}]: #{msg}\n"
8
+ end
5
9
  LOGGER.level = Logger::FATAL
6
10
  end
@@ -1,3 +1,3 @@
1
1
  module OpenDMM
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
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.1
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-04-01 00:00:00.000000000 Z
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.2.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'