opendmm 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/Rakefile +35 -27
  4. data/bin/opendmm +7 -7
  5. data/lib/opendmm.rb +35 -26
  6. data/lib/opendmm/maker.rb +18 -59
  7. data/lib/opendmm/makers/aknr.rb +18 -34
  8. data/lib/opendmm/makers/ako3.rb +18 -34
  9. data/lib/opendmm/makers/anna_and_hanako.rb +20 -36
  10. data/lib/opendmm/makers/apa.rb +19 -35
  11. data/lib/opendmm/makers/aroma.rb +40 -54
  12. data/lib/opendmm/makers/attackers.rb +30 -48
  13. data/lib/opendmm/makers/aurora.rb +24 -40
  14. data/lib/opendmm/makers/baltan.rb +20 -36
  15. data/lib/opendmm/makers/befree.rb +22 -38
  16. data/lib/opendmm/makers/bi.rb +24 -40
  17. data/lib/opendmm/makers/bijin_majo.rb +19 -35
  18. data/lib/opendmm/makers/candy.rb +27 -43
  19. data/lib/opendmm/makers/caribbean.rb +21 -36
  20. data/lib/opendmm/makers/cross.rb +22 -39
  21. data/lib/opendmm/makers/dip.rb +22 -38
  22. data/lib/opendmm/makers/dmm_collection.rb +19 -35
  23. data/lib/opendmm/makers/ebody.rb +22 -38
  24. data/lib/opendmm/makers/ideapocket.rb +42 -60
  25. data/lib/opendmm/makers/kawaii.rb +21 -37
  26. data/lib/opendmm/makers/kira_kira.rb +21 -37
  27. data/lib/opendmm/makers/madonna.rb +21 -37
  28. data/lib/opendmm/makers/moodyz.rb +41 -44
  29. data/lib/opendmm/makers/munekyunkissa.rb +21 -37
  30. data/lib/opendmm/makers/opera.rb +27 -43
  31. data/lib/opendmm/makers/oppai.rb +33 -51
  32. data/lib/opendmm/makers/premium.rb +23 -39
  33. data/lib/opendmm/makers/prestige.rb +40 -58
  34. data/lib/opendmm/makers/ran_maru.rb +29 -46
  35. data/lib/opendmm/makers/s1.rb +21 -37
  36. data/lib/opendmm/makers/s_cute.rb +41 -55
  37. data/lib/opendmm/makers/sod.rb +23 -39
  38. data/lib/opendmm/makers/tameikegoro.rb +22 -38
  39. data/lib/opendmm/makers/to_satsu.rb +20 -36
  40. data/lib/opendmm/makers/waap.rb +24 -41
  41. data/lib/opendmm/search_engine.rb +20 -0
  42. data/lib/opendmm/search_engines/dmm.rb +38 -58
  43. data/lib/opendmm/search_engines/jav_library.rb +32 -63
  44. data/lib/opendmm/site.rb +73 -0
  45. data/lib/opendmm/utils.rb +22 -2
  46. data/lib/opendmm/version.rb +1 -1
  47. data/test/{fixtures → dmm_fixtures}/DMYJ-001.json +1 -1
  48. data/test/fixture_test.rb +17 -13
  49. data/test/{fixtures → jav_library_fixtures}/XV-100.json +0 -0
  50. data/test/{fixtures → jav_library_fixtures}/XV-1000.json +0 -0
  51. data/test/{fixtures → maker_fixtures}/ABP-013.json +0 -0
  52. data/test/{fixtures → maker_fixtures}/ABS-014.json +0 -0
  53. data/test/{fixtures → maker_fixtures}/ABY-003.json +0 -0
  54. data/test/{fixtures → maker_fixtures}/ADN-019.json +0 -0
  55. data/test/{fixtures → maker_fixtures}/AIR-017.json +1 -1
  56. data/test/{fixtures → maker_fixtures}/AKO-011.json +1 -1
  57. data/test/{fixtures → maker_fixtures}/ALB-182.json +0 -0
  58. data/test/{fixtures → maker_fixtures}/ANND-066.json +0 -0
  59. data/test/{fixtures → maker_fixtures}/AP-001.json +0 -0
  60. data/test/{fixtures → maker_fixtures}/APAA-182.json +0 -0
  61. data/test/{fixtures → maker_fixtures}/APAK-051.json +0 -0
  62. data/test/{fixtures → maker_fixtures}/ARM-191.json +0 -0
  63. data/test/{fixtures → maker_fixtures}/ARMG-223.json +0 -0
  64. data/test/{fixtures → maker_fixtures}/ATID-183.json +0 -0
  65. data/test/{fixtures → maker_fixtures}/BBI-104.json +0 -0
  66. data/test/{fixtures → maker_fixtures}/BEB-001.json +0 -0
  67. data/test/{fixtures → maker_fixtures}/BF-175.json +0 -0
  68. data/test/{fixtures → maker_fixtures}/BID-017.json +0 -0
  69. data/test/{fixtures → maker_fixtures}/BIJN-006.json +0 -0
  70. data/test/{fixtures → maker_fixtures}/BLK-049.json +0 -0
  71. data/test/{fixtures → maker_fixtures}/BRA-002.json +0 -0
  72. data/test/{fixtures → maker_fixtures}/BWB-005.json +0 -0
  73. data/test/{fixtures → maker_fixtures}/CHN-008.json +0 -0
  74. data/test/{fixtures → maker_fixtures}/CHS-015.json +0 -0
  75. data/test/{fixtures → maker_fixtures}/CLUB-003.json +0 -0
  76. data/test/{fixtures → maker_fixtures}/CND-012.json +0 -0
  77. data/test/{fixtures → maker_fixtures}/CND-062.json +0 -0
  78. data/test/{fixtures → maker_fixtures}/CRAD-099.json +0 -0
  79. data/test/{fixtures → maker_fixtures}/CRPD-451.json +0 -0
  80. data/test/{fixtures → maker_fixtures}/CRSS-013.json +0 -0
  81. data/test/{fixtures → maker_fixtures}/CWM-156.json +1 -1
  82. data/test/fixtures/Carib 021511-620.json b/data/test/maker_fixtures/Carib → 021511-620.json +0 -0
  83. data/test/{fixtures → maker_fixtures}/DCOL-017.json +1 -1
  84. data/test/{fixtures → maker_fixtures}/DGL-007.json +1 -1
  85. data/test/{fixtures → maker_fixtures}/DOM-045.json +0 -0
  86. data/test/{fixtures → maker_fixtures}/EBOD-109.json +0 -0
  87. data/test/{fixtures → maker_fixtures}/ECB-078.json +1 -1
  88. data/test/{fixtures → maker_fixtures}/EDD-189.json +0 -0
  89. data/test/{fixtures → maker_fixtures}/ESK-232.json +0 -0
  90. data/test/{fixtures → maker_fixtures}/EZD-369.json +0 -0
  91. data/test/{fixtures → maker_fixtures}/FSET-399.json +0 -0
  92. data/test/{fixtures → maker_fixtures}/HAZ-009.json +0 -0
  93. data/test/{fixtures → maker_fixtures}/HON-001.json +0 -0
  94. data/test/{fixtures → maker_fixtures}/IDBD-447.json +0 -0
  95. data/test/{fixtures → maker_fixtures}/INU-013.json +0 -0
  96. data/test/{fixtures → maker_fixtures}/IPSD-041.json +0 -0
  97. data/test/{fixtures → maker_fixtures}/IPTD-464.json +0 -0
  98. data/test/{fixtures → maker_fixtures}/IPTD-629.json +0 -0
  99. data/test/{fixtures → maker_fixtures}/IPZ-005.json +0 -0
  100. data/test/{fixtures → maker_fixtures}/JBD-153.json +0 -0
  101. data/test/{fixtures → maker_fixtures}/JBS-004.json +0 -0
  102. data/test/{fixtures → maker_fixtures}/JOB-010.json +0 -0
  103. data/test/{fixtures → maker_fixtures}/JUC-285.json +0 -0
  104. data/test/{fixtures → maker_fixtures}/JUFD-137.json +0 -0
  105. data/test/{fixtures → maker_fixtures}/JUX-007.json +0 -0
  106. data/test/{fixtures → maker_fixtures}/JUX-119.json +0 -0
  107. data/test/{fixtures → maker_fixtures}/KAWD-249.json +1 -1
  108. data/test/{fixtures → maker_fixtures}/KIRD-147.json +0 -0
  109. data/test/{fixtures → maker_fixtures}/KISD-042.json +0 -0
  110. data/test/{fixtures → maker_fixtures}/LLR-005.json +0 -0
  111. data/test/{fixtures → maker_fixtures}/MAS-042.json +0 -0
  112. data/test/{fixtures → maker_fixtures}/MBD-148.json +0 -0
  113. data/test/{fixtures → maker_fixtures}/MDC-002.json +0 -0
  114. data/test/{fixtures → maker_fixtures}/MDYD-544.json +0 -0
  115. data/test/{fixtures → maker_fixtures}/MEK-008.json +0 -0
  116. data/test/{fixtures → maker_fixtures}/MIAD-490.json +0 -0
  117. data/test/{fixtures → maker_fixtures}/MIDD-599.json +0 -0
  118. data/test/{fixtures → maker_fixtures}/MIDD-643.json +0 -0
  119. data/test/{fixtures → maker_fixtures}/MIDD-644.json +0 -0
  120. data/test/{fixtures → maker_fixtures}/MIDE-004.json +0 -0
  121. data/test/{fixtures → maker_fixtures}/MIGD-284.json +0 -0
  122. data/test/{fixtures → maker_fixtures}/MIGD-336.json +0 -0
  123. data/test/{fixtures → maker_fixtures}/MIGD-337.json +0 -0
  124. data/test/{fixtures → maker_fixtures}/MIMK-005.json +0 -0
  125. data/test/{fixtures → maker_fixtures}/MINT-004.json +0 -0
  126. data/test/{fixtures → maker_fixtures}/MIQD-010.json +0 -0
  127. data/test/{fixtures → maker_fixtures}/MIRD-071.json +0 -0
  128. data/test/{fixtures → maker_fixtures}/MIRD-072.json +0 -0
  129. data/test/{fixtures → maker_fixtures}/MIRD-073.json +0 -0
  130. data/test/{fixtures → maker_fixtures}/MIXS-005.json +0 -0
  131. data/test/{fixtures → maker_fixtures}/MMY-010.json +0 -0
  132. data/test/{fixtures → maker_fixtures}/NAGE-001.json +0 -0
  133. data/test/{fixtures → maker_fixtures}/NDR-001.json +0 -0
  134. data/test/{fixtures → maker_fixtures}/NOF-003.json +0 -0
  135. data/test/{fixtures → maker_fixtures}/NPS-130.json +0 -0
  136. data/test/{fixtures → maker_fixtures}/OBA-045.json +1 -1
  137. data/test/{fixtures → maker_fixtures}/ONSD-570.json +0 -0
  138. data/test/{fixtures → maker_fixtures}/OPUD-125.json +1 -1
  139. data/test/{fixtures → maker_fixtures}/OSR-003.json +0 -0
  140. data/test/{fixtures → maker_fixtures}/PARM-028.json +0 -0
  141. data/test/{fixtures → maker_fixtures}/PBD-134.json +0 -0
  142. data/test/{fixtures → maker_fixtures}/PGD-306.json +0 -0
  143. data/test/{fixtures → maker_fixtures}/PJD-085.json +0 -0
  144. data/test/{fixtures → maker_fixtures}/PPB-008.json +0 -0
  145. data/test/{fixtures → maker_fixtures}/PPP-001.json +0 -0
  146. data/test/{fixtures → maker_fixtures}/PPPD-102.json +1 -1
  147. data/test/{fixtures → maker_fixtures}/PPSD-028.json +1 -1
  148. data/test/{fixtures → maker_fixtures}/PPT-004.json +0 -0
  149. data/test/{fixtures → maker_fixtures}/PTS-230.json +0 -0
  150. data/test/{fixtures → maker_fixtures}/PTV-001.json +0 -0
  151. data/test/{fixtures → maker_fixtures}/PXD-027.json +0 -0
  152. data/test/{fixtures → maker_fixtures}/RAW-005.json +0 -0
  153. data/test/{fixtures → maker_fixtures}/RBD-183.json +0 -0
  154. data/test/fixtures/S-Cute 248_hibiki_07.json b/data/test/maker_fixtures/S-Cute → 248_hibiki_07.json +0 -0
  155. data/test/fixtures/S-Cute 353_rena_01.json b/data/test/maker_fixtures/S-Cute → 353_rena_01.json +0 -0
  156. data/test/fixtures/S-Cute ps5_07_rimu.json b/data/test/maker_fixtures/S-Cute → ps5_07_rimu.json +0 -0
  157. data/test/fixtures/S-Cute ps6_99_reona.json b/data/test/maker_fixtures/S-Cute → ps6_99_reona.json +0 -0
  158. data/test/fixtures/S-Cute ps7_83_akari2.json b/data/test/maker_fixtures/S-Cute → ps7_83_akari2.json +0 -0
  159. data/test/fixtures/S-Cute swm_05_risa2.json b/data/test/maker_fixtures/S-Cute → swm_05_risa2.json +0 -0
  160. data/test/{fixtures → maker_fixtures}/SAD-031.json +0 -0
  161. data/test/{fixtures → maker_fixtures}/SDDE-312.json +0 -0
  162. data/test/{fixtures → maker_fixtures}/SDMT-802.json +0 -0
  163. data/test/{fixtures → maker_fixtures}/SDMU-008.json +0 -0
  164. data/test/{fixtures → maker_fixtures}/SDNM-011.json +0 -0
  165. data/test/{fixtures → maker_fixtures}/SET-007.json +0 -0
  166. data/test/{fixtures → maker_fixtures}/SGA-001.json +1 -0
  167. data/test/{fixtures → maker_fixtures}/SHKD-415.json +3 -3
  168. data/test/{fixtures → maker_fixtures}/SNIS-041.json +0 -0
  169. data/test/{fixtures → maker_fixtures}/SOE-259.json +0 -0
  170. data/test/{fixtures → maker_fixtures}/SPC-001.json +0 -0
  171. data/test/{fixtures → maker_fixtures}/SPS-008.json +0 -0
  172. data/test/{fixtures → maker_fixtures}/SRS-015.json +0 -0
  173. data/test/{fixtures → maker_fixtures}/SSPD-077.json +0 -0
  174. data/test/{fixtures → maker_fixtures}/STAR-359.json +0 -0
  175. data/test/{fixtures → maker_fixtures}/SUPD-065.json +0 -0
  176. data/test/{fixtures → maker_fixtures}/TDT-018.json +0 -0
  177. data/test/{fixtures → maker_fixtures}/TMAM-034.json +0 -0
  178. data/test/{fixtures → maker_fixtures}/TMCY-039.json +0 -0
  179. data/test/{fixtures → maker_fixtures}/TMDI-040.json +0 -0
  180. data/test/{fixtures → maker_fixtures}/TMEM-044.json +0 -0
  181. data/test/{fixtures → maker_fixtures}/TMVI-042.json +0 -0
  182. data/test/{fixtures → maker_fixtures}/TRD-062.json +0 -0
  183. data/test/{fixtures → maker_fixtures}/TYOD-232.json +1 -1
  184. data/test/{fixtures → maker_fixtures}/URE-011.json +0 -0
  185. data/test/{fixtures → maker_fixtures}/WA-201.json +0 -0
  186. data/test/{fixtures → maker_fixtures}/WAT-003.json +0 -0
  187. data/test/{fixtures → maker_fixtures}/WPC-002.json +0 -0
  188. data/test/{fixtures → maker_fixtures}/WSS-231.json +1 -1
  189. data/test/{fixtures → maker_fixtures}/XND-023.json +0 -0
  190. data/test/{fixtures → maker_fixtures}/YRH-008.json +0 -0
  191. data/test/{fixtures → maker_fixtures}/YRZ-009.json +0 -0
  192. data/test/{fixtures → maker_fixtures}/ZEX-068.json +0 -0
  193. metadata +294 -292
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6ea973455b774abc19e51008836971866daac43
4
- data.tar.gz: 6c38bdafae17d2f0babc4a962fa405601ae235ee
3
+ metadata.gz: 07cd647f8aaa049f14ea6485efb50f227954265c
4
+ data.tar.gz: 1b086c6958c894635be7435740d06f5dc505e701
5
5
  SHA512:
6
- metadata.gz: 15834035612a443ac0ece31c4b907ab9d2e50bdee73302327bc4ab31ac1f036a09c751a03c6af33843ab94751336a99cfae03505837bb6eb518c77dd74eca6f4
7
- data.tar.gz: 8d7d852fe2f8b9271b476b646fc885ad0ce7fb6f94827cc4a423463fec24fa4c586a6ea35f305621d038043447834230cb82dfc0c8234b74fc632f579a259b26
6
+ metadata.gz: ff95d011bdda8bcb5b2ddd0ed5ce0e96efacf253a1a2d0dbf757355accbe3d206480ef15d509d8e27f52fd86831e9d44f57c8b474d7fbc9a377a79d0bd28b686
7
+ data.tar.gz: fb94f7d85805152bb42e4f23dc3b236eedb5b816f7fe990ad4fec5f6999f806523bf0006d46c23bbac213a50e4c275f02f11bd1814da155299e1993843a6fd58
@@ -1,3 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.1.2
4
+ branch:
5
+ only:
6
+ - master
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ namespace :fixture do
15
15
  puts "#{args[:id]} not found"
16
16
  next
17
17
  end
18
- File.open(File.join(File.dirname(__FILE__) + "/test/fixtures/#{args[:id]}.json"), 'w') do |file|
18
+ File.open(File.join(File.dirname(__FILE__) + "/test/maker_fixtures/#{args[:id]}.json"), 'w') do |file|
19
19
  puts "Generating #{args[:id]}.json"
20
20
  file.puts JSON.pretty_generate(fixture)
21
21
  end
@@ -23,7 +23,7 @@ namespace :fixture do
23
23
 
24
24
  desc 'Regenerate all fixtures'
25
25
  task :regenerate => :install do
26
- Dir[File.dirname(__FILE__) + '/test/fixtures/*.json'].each do |path|
26
+ Dir[File.dirname(__FILE__) + '/test/maker_fixtures/*.json'].each do |path|
27
27
  File.open(path, 'w') do |file|
28
28
  id = File.basename(path, '.json')
29
29
  puts "Generating #{id}.json"
@@ -39,35 +39,43 @@ namespace :maker do
39
39
  File.open(File.join(File.dirname(__FILE__) + "/lib/opendmm/makers/#{args[:name].underscore}.rb"), 'w') do |file|
40
40
  puts "Generating #{args[:name].underscore}.rb"
41
41
  file.puts <<-CODE
42
- module OpenDMM
43
- module Maker
44
- module #{args[:name].underscore.classify}
45
- include Maker
42
+ base_uri 'example.com'
46
43
 
47
- module Site
48
- include HTTParty
49
- base_uri 'example.com'
44
+ register_product(
45
+ /^(EXAM)-?(\d{3})$/i,
46
+ '#{$1.downcase}#{$2}',
47
+ )
50
48
 
51
- def self.item(name)
52
- case name
53
- when /^(EXAM)-?(\\d{3})$/i
54
- get("/#\{$1.downcase\}#\{$2\}")
55
- end
56
- end
57
- end
49
+ private
58
50
 
59
- module Parser
60
- def self.parse(content)
61
- page_uri = content.request.last_uri
62
- html = Nokogiri::HTML(content)
63
- return {
64
- page: page_uri.to_s,
65
- }
66
- end
67
- end
68
- end
69
- end
51
+ def self.parse_product_html(html)
52
+ {
53
+ # actresses: Array
54
+ # actress_types: Array
55
+ # boobs: String
56
+ # brand: String
57
+ # categories: Array
58
+ # code: String
59
+ # cover_image: String
60
+ # description: String
61
+ # directors: Array
62
+ # genres: Array
63
+ # label: String
64
+ # maker: String
65
+ # movie_length: String
66
+ # page: String
67
+ # release_date: String
68
+ # sample_images: Array
69
+ # scenes: Array
70
+ # series: String
71
+ # subtitle: String
72
+ # theme: String
73
+ # thumbnail_image: String
74
+ # title: String
75
+ # __extra: Hash
76
+ }
70
77
  end
78
+
71
79
  CODE
72
80
  end
73
81
  end
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "json"
4
- require "optparse"
5
- require "pp"
6
- require "opendmm"
3
+ require 'json'
4
+ require 'optparse'
5
+ require 'pp'
6
+ require 'opendmm'
7
7
 
8
8
  options = { json: false }
9
9
  OptionParser.new do |opts|
10
- opts.on("-j", "--[no-]json", "JSON mode") do |j|
10
+ opts.on('-j', '--[no-]json', 'JSON mode') do |j|
11
11
  options[:json] = j
12
12
  end
13
13
  end.parse!
14
14
 
15
- details = OpenDMM.search!(ARGV.first)
15
+ details = OpenDMM.search(ARGV.first, true)
16
16
  if details
17
17
  if options[:json]
18
18
  puts JSON.pretty_generate(details)
@@ -20,5 +20,5 @@ if details
20
20
  pp details
21
21
  end
22
22
  else
23
- puts "Unknown product: " + ARGV.first
23
+ puts 'Unknown product: ' + ARGV.first
24
24
  end
@@ -1,34 +1,43 @@
1
1
  require 'opendmm/version'
2
2
  require 'opendmm/maker'
3
- require 'opendmm/search_engines/jav_library'
4
- require 'opendmm/search_engines/dmm'
3
+ require 'opendmm/search_engine'
5
4
 
6
5
  module OpenDMM
7
- def self.search!(name)
8
- details = Maker.search(name) ||
9
- SearchEngine::JavLibrary.search(name) ||
10
- SearchEngine::Dmm.search(name)
11
- return nil unless details
12
- details = details.squish_hard
13
- details[:cover_image] = join_if_relative(details[:page], details[:cover_image])
14
- details[:thumbnail_image] = join_if_relative(details[:page], details[:thumbnail_image])
15
- details[:sample_images] = details[:sample_images].map do |uri|
16
- join_if_relative(details[:page], uri)
17
- end if details[:sample_images]
18
- details[:movie_length] = ChronicDuration.parse(details[:movie_length]) if details[:movie_length]
19
- details[:release_date] = Date.parse(details[:release_date]) if details[:release_date]
20
- details
21
- end
6
+ # Known fields:
7
+ #
8
+ # {
9
+ # actresses: Array
10
+ # actress_types: Array
11
+ # boobs: String
12
+ # brand: String
13
+ # categories: Array
14
+ # code: String
15
+ # cover_image: String
16
+ # description: String
17
+ # directors: Array
18
+ # genres: Array
19
+ # label: String
20
+ # maker: String
21
+ # movie_length: String
22
+ # page: String
23
+ # release_date: String
24
+ # sample_images: Array
25
+ # scenes: Array
26
+ # series: String
27
+ # subtitle: String
28
+ # theme: String
29
+ # thumbnail_image: String
30
+ # title: String
31
+ # __extra: Hash
32
+ # }
22
33
 
23
- def self.search(name)
24
- search! name
25
- rescue
34
+ def self.search(name, debug = false)
35
+ Maker.search(name) || SearchEngine::JavLibrary.search(name) || SearchEngine::Dmm.search(name)
36
+ rescue => e
37
+ if debug
38
+ puts e.inspect
39
+ puts e.backtrace.join("\n")
40
+ end
26
41
  nil
27
42
  end
28
-
29
- private
30
- def self.join_if_relative(page_url, image_url)
31
- return nil unless image_url
32
- image_url.start_with?('http') ? image_url : URI.join(page_url, image_url).to_s
33
- end
34
43
  end
@@ -1,67 +1,12 @@
1
- require 'active_support/core_ext/string/filters'
2
- require 'httparty'
3
- require 'logger'
4
- require 'nokogiri'
5
- require 'opendmm/utils'
1
+ require 'opendmm/site'
6
2
 
7
3
  module OpenDMM
8
4
  module Maker
9
- @@makers = []
10
-
11
- def self.included(klass)
12
- klass.module_eval <<-CODE
13
- module Site
14
- include HTTParty
15
- follow_redirects false
16
-
17
- def self.get(uri)
18
- super(uri)
19
- rescue Errno::ETIMEDOUT => e
20
- tries ||= 0
21
- tries++
22
- tries <= 5 ? retry : raise
23
- end
24
- end
25
-
26
- def self.search(name)
27
- item = Site.item(name)
28
- Parser.parse(item) if item && item.code == 200
29
- end
30
- CODE
31
- @@makers << klass
32
- end
33
-
34
- # Known fields:
35
- #
36
- # {
37
- # actresses: Array
38
- # actress_types: Array
39
- # boobs: String
40
- # brand: String
41
- # categories: Array
42
- # code: String
43
- # cover_image: String
44
- # description: String
45
- # directors: Array
46
- # genres: Array
47
- # label: String
48
- # maker: String
49
- # movie_length: String
50
- # page: String
51
- # release_date: String
52
- # sample_images: Array
53
- # scenes: Array
54
- # series: String
55
- # subtitle: String
56
- # theme: String
57
- # thumbnail_image: String
58
- # title: String
59
- # __extra: Hash
60
- # }
5
+ @@makers = Array.new
61
6
 
62
7
  def self.search(name)
63
8
  @@makers.each do |maker|
64
- result = maker.search(name)
9
+ result = maker.product(name)
65
10
  return result if result
66
11
  end
67
12
  nil
@@ -70,5 +15,19 @@ module OpenDMM
70
15
  end
71
16
 
72
17
  Dir[File.dirname(__FILE__) + '/makers/*.rb'].each do |file|
73
- require file
18
+ module_name = File.basename(file, '.rb').camelize
19
+ eval <<-MAKER
20
+
21
+ module OpenDMM
22
+ module Maker
23
+ module #{module_name}
24
+ include Site
25
+ #{File.read(file)}
26
+ end
27
+
28
+ @@makers << #{module_name}
29
+ end
30
+ end
31
+
32
+ MAKER
74
33
  end
@@ -1,38 +1,22 @@
1
- module OpenDMM
2
- module Maker
3
- module Aknr
4
- include Maker
1
+ base_uri 'www.aknr.com'
5
2
 
6
- module Site
7
- base_uri 'www.aknr.com'
3
+ register_product(
4
+ /^(FSET)-?(\d{3})$/i,
5
+ '/works/#{$1.downcase}-#{$2}/',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(FSET)-?(\d{3})$/i
12
- get("/works/#{$1.downcase}-#{$2}/")
13
- end
14
- end
15
- end
8
+ private
16
9
 
17
- module Parser
18
- def self.parse(content)
19
- page_uri = content.request.last_uri
20
- html = Nokogiri::HTML(content)
21
- return {
22
- actresses: html.css('//*[@id="info"]/div[3]/div[2]').text.split,
23
- code: html.css('//*[@id="info"]/div[5]/div[2]').text,
24
- cover_image: html.at_css('#jktimg_l2 > a')['href'],
25
- directors: html.css('//*[@id="info"]/div[4]/div[2]').text.split,
26
- maker: 'AKNR',
27
- movie_length: html.css('//*[@id="info"]/div[6]/div[2]').text,
28
- page: page_uri.to_s,
29
- release_date: html.css('//*[@id="info"]/div[2]/div[2]').text,
30
- sample_images: html.css('#photo > p > a').map { |a| a['href'] },
31
- thumbnail_image: html.at_css('#jktimg_l2 > a > img')['src'],
32
- title: html.css('#mainContent2 > h1').text,
33
- }
34
- end
35
- end
36
- end
37
- end
10
+ def self.parse_product_html(html)
11
+ {
12
+ actresses: html.css('//*[@id="info"]/div[3]/div[2]').text.split,
13
+ cover_image: html.at_css('#jktimg_l2 > a')['href'],
14
+ directors: html.css('//*[@id="info"]/div[4]/div[2]').text.split,
15
+ maker: 'AKNR',
16
+ movie_length: html.css('//*[@id="info"]/div[6]/div[2]').text,
17
+ release_date: html.css('//*[@id="info"]/div[2]/div[2]').text,
18
+ sample_images: html.css('#photo > p > a').map { |a| a['href'] },
19
+ thumbnail_image: html.at_css('#jktimg_l2 > a > img')['src'],
20
+ title: html.css('#mainContent2 > h1').text,
21
+ }
38
22
  end
@@ -1,38 +1,22 @@
1
- module OpenDMM
2
- module Maker
3
- module Ako3
4
- include Maker
1
+ base_uri 'www.ako-3.com'
5
2
 
6
- module Site
7
- base_uri 'www.ako-3.com'
3
+ register_product(
4
+ /^(AKO)-?(\d{3})$/i,
5
+ '/work/item.php?itemcode=#{$1.upcase}#{$2}',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(AKO)-?(\d{3})$/i
12
- get("/work/item.php?itemcode=#{$1.upcase}#{$2}")
13
- end
14
- end
15
- end
8
+ private
16
9
 
17
- module Parser
18
- def self.parse(content)
19
- page_uri = content.request.last_uri
20
- html = Nokogiri::HTML(content)
21
- specs = Utils.hash_by_split(html.css('div#spec-area > div.release').map(&:text))
22
- return {
23
- actresses: [ html.css('//*[@id="spec-area"]/div[2]').text ],
24
- code: specs['商品番号'],
25
- cover_image: html.at_css('div.jacket a')['href'],
26
- description: html.css('div#caption').text,
27
- maker: specs['メーカー'],
28
- page: page_uri.to_s,
29
- release_date: specs['配信日'],
30
- sample_images: html.css('ul.sampleimg li a').map { |a| a['href'] },
31
- thumbnail_image: html.at_css('#title-area > div > div.jacket > a > img')['src'],
32
- title: html.css('div.maintitle').text,
33
- }
34
- end
35
- end
36
- end
37
- end
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_by_split(html.css('div#spec-area > div.release').map(&:text))
12
+ {
13
+ actresses: [ html.css('//*[@id="spec-area"]/div[2]').text ],
14
+ cover_image: html.at_css('div.jacket a')['href'],
15
+ description: html.css('div#caption').text,
16
+ maker: specs['メーカー'],
17
+ release_date: specs['配信日'],
18
+ sample_images: html.css('ul.sampleimg li a').map { |a| a['href'] },
19
+ thumbnail_image: html.at_css('#title-area > div > div.jacket > a > img')['src'],
20
+ title: html.css('div.maintitle').text,
21
+ }
38
22
  end
@@ -1,40 +1,24 @@
1
- module OpenDMM
2
- module Maker
3
- module AnnaAndHanako
4
- include Maker
1
+ base_uri 'anna-and-hanako.jp'
5
2
 
6
- module Site
7
- base_uri 'anna-and-hanako.jp'
3
+ register_product(
4
+ /^(ANND)-?(\d{3})$/i,
5
+ '/works/#{$1.downcase}/#{$1.downcase}#{$2}.html',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(ANND)-?(\d{3})$/i
12
- get("/works/#{$1.downcase}/#{$1.downcase}#{$2}.html")
13
- end
14
- end
15
- end
8
+ private
16
9
 
17
- module Parser
18
- def self.parse(content)
19
- page_uri = content.request.last_uri
20
- html = Nokogiri::HTML(Utils.force_utf8(content))
21
- specs = Utils.hash_by_split(html.xpath('//*[@id="pake-bottom-box_r"]/dl/p').map(&:text))
22
- return {
23
- actresses: specs['出演者'].split('/'),
24
- code: specs['品番'],
25
- cover_image: html.at_xpath('//*[@id="pake-bottom-box"]/dl/a')['href'],
26
- description: html.xpath('//*[@id="txt-bottom-box"]').text,
27
- directors: specs['監督'].split('/'),
28
- maker: 'アンナと花子',
29
- movie_length: specs['収録時間'],
30
- page: page_uri.to_s,
31
- release_date: specs['発売日'],
32
- sample_images: html.xpath('//*[@id="mein-sanpuru-sam"]/a').map { |a| a['href'] },
33
- thumbnail_image: html.at_xpath('//*[@id="pake-bottom-box"]/dl/a/img')['src'],
34
- title: html.xpath('//*[@id="mein-left-new-release-box"]/div/div/h5').text,
35
- }
36
- end
37
- end
38
- end
39
- end
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_by_split(html.xpath('//*[@id="pake-bottom-box_r"]/dl/p').map(&:text))
12
+ {
13
+ actresses: specs['出演者'].split('/'),
14
+ cover_image: html.at_xpath('//*[@id="pake-bottom-box"]/dl/a')['href'],
15
+ description: html.xpath('//*[@id="txt-bottom-box"]').text,
16
+ directors: specs['監督'].split('/'),
17
+ maker: 'アンナと花子',
18
+ movie_length: specs['収録時間'],
19
+ release_date: specs['発売日'],
20
+ sample_images: html.xpath('//*[@id="mein-sanpuru-sam"]/a').map { |a| a['href'] },
21
+ thumbnail_image: html.at_xpath('//*[@id="pake-bottom-box"]/dl/a/img')['src'],
22
+ title: html.xpath('//*[@id="mein-left-new-release-box"]/div/div/h5').text,
23
+ }
40
24
  end