opendmm 1.0.1 → 1.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.
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'