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
@@ -1,39 +1,23 @@
1
- module OpenDMM
2
- module Maker
3
- module Apache
4
- include Maker
1
+ base_uri 'www.apa-av.jp'
5
2
 
6
- module Site
7
- base_uri 'www.apa-av.jp'
3
+ register_product(
4
+ /^(AP)-?(\d{3})$/i,
5
+ '/list_detail/detail_#{$2}.html',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^AP-?(\d{3})$/i
12
- get("/list_detail/detail_#{$1}.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(content)
21
- specs = Utils.hash_by_split(html.css('ul.detail-main-meta li').map(&:text))
22
- return {
23
- actresses: specs['出演女優'].split(','),
24
- code: specs['品番'],
25
- cover_image: html.at_css('#right > div.detail-main > div.detail_img > a')['href'],
26
- description: html.at_css('#right > div.detail-main > div.detail_description').inner_text,
27
- directors: specs['監督'].split,
28
- maker: 'Apache',
29
- movie_length: specs['収録時間'],
30
- page: page_uri.to_s,
31
- sample_images: html.css('#right > div.detail-main > div.detail_description > ul > li > a').map { |a| a['href'] },
32
- thumbnail_image: html.at_css('#right > div.detail-main > div.detail_img > a > img')['src'],
33
- title: html.css('div.detail_title_1').text,
34
- }
35
- end
36
- end
37
- end
38
- end
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_by_split(html.css('ul.detail-main-meta li').map(&:text))
12
+ {
13
+ actresses: specs['出演女優'].split(','),
14
+ cover_image: html.at_css('#right > div.detail-main > div.detail_img > a')['href'],
15
+ description: html.at_css('#right > div.detail-main > div.detail_description').inner_text,
16
+ directors: specs['監督'].split,
17
+ maker: 'Apache',
18
+ movie_length: specs['収録時間'],
19
+ sample_images: html.css('#right > div.detail-main > div.detail_description > ul > li > a').map { |a| a['href'] },
20
+ thumbnail_image: html.at_css('#right > div.detail-main > div.detail_img > a > img')['src'],
21
+ title: html.css('div.detail_title_1').text,
22
+ }
39
23
  end
@@ -1,62 +1,48 @@
1
- module OpenDMM
2
- module Maker
3
- module Aroma
4
- include Maker
1
+ base_uri 'www.aroma-p.com'
5
2
 
6
- module Site
7
- base_uri 'www.aroma-p.com'
3
+ register_product(
4
+ /^(ARM)-?(\d{3})$/i,
5
+ '/member/contents/title.php?conid=101#{$2}',
6
+ )
7
+ register_product(
8
+ /^(ARMG)-?(\d{3})$/i,
9
+ '/member/contents/title.php?conid=200#{$2}',
10
+ )
11
+ register_product(
12
+ /^(PARM)-?(\d{3})$/i,
13
+ '/member/contents/title.php?conid=205#{$2}',
14
+ )
8
15
 
9
- def self.item(name)
10
- case name
11
- when /^ARM-?(\d{3})$/i
12
- return get("/member/contents/title.php?conid=101#{$1}")
13
- when /^ARMG-?(\d{3})$/i
14
- return get("/member/contents/title.php?conid=200#{$1}")
15
- when /^PARM-?(\d{3})$/i
16
- return get("/member/contents/title.php?conid=205#{$1}")
17
- end
18
- end
19
- end
16
+ private
20
17
 
21
- module Parser
22
- def self.parse(content)
23
- page_uri = content.request.last_uri
24
- html = Nokogiri::HTML(Utils.force_utf8(content))
25
- specs = Utils.hash_by_split(html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[3]/table/tr[3]').text.split)
26
- return {
27
- actresses: specs['出演者'].try(:split, ''),
28
- code: specs['品番'],
29
- cover_image: parse_cover_image(html, page_uri),
30
- directors: specs['監督'].try(:split, '・'),
31
- description: html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[9]/td[2]').text,
32
- genres: specs['ジャンル'].split,
33
- label: specs['レーベル'],
34
- maker: 'Aroma',
35
- movie_length: specs['時間'],
36
- page: page_uri.to_s,
37
- sample_images: parse_sample_images(html, page_uri),
38
- thumbnail_image: html.at_xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[1]/a/img')['src'],
39
- title: html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[3]/table/tr[1]/td').text,
40
- }
41
- end
42
-
43
- private
18
+ def self.parse_product_html(html)
19
+ specs = Utils.hash_by_split(html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[3]/table/tr[3]').text.split)
20
+ {
21
+ actresses: specs['出演者'].try(:split, '・'),
22
+ cover_image: parse_cover_image(html),
23
+ directors: specs['監督'].try(:split, '・'),
24
+ description: html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[9]/td[2]').text,
25
+ genres: specs['ジャンル'].split,
26
+ label: specs['レーベル'],
27
+ maker: 'Aroma',
28
+ movie_length: specs['時間'],
29
+ sample_images: parse_sample_images(html),
30
+ thumbnail_image: html.at_xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[1]/a/img')['src'],
31
+ title: html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[3]/table/tr[1]/td').text,
32
+ }
33
+ end
44
34
 
45
- def self.parse_cover_image(html, page_uri)
46
- href = html.at_xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[1]/a')['href']
47
- if href =~ /'(\/images\/.*?)'/
48
- return $1
49
- end
50
- end
35
+ def self.parse_cover_image(html)
36
+ href = html.at_xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[2]/td[2]/table/tr/td[1]/a')['href']
37
+ if href =~ /'(\/images\/.*?)'/
38
+ return $1
39
+ end
40
+ end
51
41
 
52
- def self.parse_sample_images(html, page_uri)
53
- html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[7]/td[2]/table/tr[3]').css('td input').map do |input|
54
- if input['onclick'] =~ /'(\/images\/.*?)'/
55
- $1
56
- end
57
- end
58
- end
59
- end
42
+ def self.parse_sample_images(html)
43
+ html.xpath('/html/body/table/tr/td/table/tr[4]/td[2]/table/tr/td[2]/table/tr[3]/td/table/tr[7]/td[2]/table/tr[3]').css('td input').map do |input|
44
+ if input['onclick'] =~ /'(\/images\/.*?)'/
45
+ $1
60
46
  end
61
47
  end
62
48
  end
@@ -1,54 +1,36 @@
1
- module OpenDMM
2
- module Maker
3
- module Attackers
4
- include Maker
1
+ base_uri 'attackers.net'
5
2
 
6
- module Site
7
- base_uri 'attackers.net'
3
+ register_product(
4
+ /^(ADN|ATID|JBD|RBD|SHKD|SSPD)-?(\d{3})$/i,
5
+ '/works/-/detail/=/cid=#{$1.downcase}#{$2}',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(ADN|ATID|JBD|RBD|SHKD|SSPD)-?(\d{3})$/i
12
- get("/works/-/detail/=/cid=#{$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
- specs = Utils.hash_by_split(html.css('div#works-content ul li').map(&:text))
22
- return {
23
- actresses: specs['出演女優'].split,
24
- code: parse_code(specs['品番']),
25
- cover_image: html.at_css('div#works_pake_box a#pake')['href'],
26
- directors: specs['監督'].split,
27
- description: html.css('p.works_txt').text,
28
- genres: specs['ジャンル'].split,
29
- label: specs['レーベル'],
30
- maker: 'Attackers',
31
- movie_length: specs['収録時間'],
32
- page: page_uri.to_s,
33
- release_date: specs['発売日'],
34
- sample_images: html.css('ul#sample_photo li a').map { |a| a['href'] },
35
- series: specs['シリーズ'],
36
- thumbnail_image: html.at_css('#pake > img')['src'],
37
- title: html.css('div.hl_box_btm').text,
38
- }
39
- end
40
-
41
- private
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_by_split(html.css('div#works-content ul li').map(&:text))
12
+ {
13
+ actresses: specs['出演女優'].split,
14
+ cover_image: html.at_css('div#works_pake_box a#pake')['href'],
15
+ directors: specs['監督'].split,
16
+ description: html.css('p.works_txt').text,
17
+ genres: specs['ジャンル'].split,
18
+ label: specs['レーベル'],
19
+ maker: 'Attackers',
20
+ movie_length: specs['収録時間'],
21
+ release_date: specs['発売日'],
22
+ sample_images: html.css('ul#sample_photo li a').map { |a| a['href'] },
23
+ series: specs['シリーズ'],
24
+ thumbnail_image: html.at_css('#pake > img')['src'],
25
+ title: html.css('div.hl_box_btm').text,
26
+ }
27
+ end
42
28
 
43
- def self.parse_code(str)
44
- case str
45
- when /Blu-ray:(\w+-\d+).*DVD:(\w+-\d+)/
46
- $2.upcase
47
- when /\w+-\d+/
48
- $&
49
- end
50
- end
51
- end
52
- end
29
+ def self.parse_code(str)
30
+ case str
31
+ when /Blu-ray:(\w+-\d+).*DVD:(\w+-\d+)/
32
+ $2.upcase
33
+ when /\w+-\d+/
34
+ $&
53
35
  end
54
36
  end
@@ -1,44 +1,28 @@
1
- module OpenDMM
2
- module Maker
3
- module Aurora
4
- include Maker
1
+ base_uri 'www.aurora-pro.com'
5
2
 
6
- module Site
7
- base_uri 'www.aurora-pro.com'
3
+ register_product(
4
+ /^(APAA|APAK)-?(\d{3})$/i,
5
+ '/shop/-/product/p/goods_id=#{$1.upcase}-#{$2}',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(APAA|APAK)-?(\d{3})$/i
12
- get("/shop/-/product/p/goods_id=#{$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_from_dl(html.css('div#product_info dl'))
22
- return {
23
- actresses: specs['出演女優'].css('ul li').map(&:text),
24
- actress_types: specs['女優タイプ'].css('ul li').map(&:text),
25
- code: specs['作品番号'].text,
26
- cover_image: html.at_css('div.main_pkg a img')['src'],
27
- description: html.css('div#product_exp p').text,
28
- directors: specs['監督'].css('ul li').map(&:text),
29
- genres: specs['ジャンル'].css('ul li').map(&:text),
30
- label: specs['レーベル'],
31
- maker: 'Aurora Project',
32
- movie_length: specs['収録時間'].text,
33
- page: page_uri.to_s,
34
- release_date: specs['発売日'].text,
35
- sample_images: html.css('div.product_scene ul li img').map { |img| img['src'] },
36
- thumbnail_image: html.at_css('div.main_pkg a img')['src'],
37
- scenes: specs['シーン'].css('ul li').map(&:text),
38
- title: html.css('h1.pro_title').text,
39
- }
40
- end
41
- end
42
- end
43
- end
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_from_dl(html.css('div#product_info dl'))
12
+ {
13
+ actresses: specs['出演女優'].css('ul li').map(&:text),
14
+ actress_types: specs['女優タイプ'].css('ul li').map(&:text),
15
+ cover_image: html.at_css('div.main_pkg a img')['src'],
16
+ description: html.css('div#product_exp p').text,
17
+ directors: specs['監督'].css('ul li').map(&:text),
18
+ genres: specs['ジャンル'].css('ul li').map(&:text),
19
+ label: specs['レーベル'],
20
+ maker: 'Aurora Project',
21
+ movie_length: specs['収録時間'].text,
22
+ release_date: specs['発売日'].text,
23
+ sample_images: html.css('div.product_scene ul li img').map { |img| img['src'] },
24
+ thumbnail_image: html.at_css('div.main_pkg a img')['src'],
25
+ scenes: specs['シーン'].css('ul li').map(&:text),
26
+ title: html.css('h1.pro_title').text,
27
+ }
44
28
  end
@@ -1,40 +1,24 @@
1
- module OpenDMM
2
- module Maker
3
- module Baltan
4
- include Maker
1
+ base_uri 'baltan-av.com'
5
2
 
6
- module Site
7
- base_uri 'baltan-av.com'
3
+ register_product(
4
+ /^(TMAM|TMCY|TMDI|TMEM|TMVI)-?(\d{3})$/i,
5
+ '/items/detail/#{$1.upcase}-#{$2}',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(TMAM|TMCY|TMDI|TMEM|TMVI)-?(\d{3})$/i
12
- get("/items/detail/#{$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(Utils.force_utf8(content))
21
- return {
22
- actresses: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[7]/td/a').map(&:text),
23
- code: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[1]/td').text,
24
- cover_image: html.at_css('#content1 > section > div.img > img')['src'],
25
- description: html.css('#content1 > section > p').text,
26
- label: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[4]/td').text,
27
- maker: 'Baltan',
28
- movie_length: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[2]/td').text,
29
- page: page_uri.to_s,
30
- release_date: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[3]/td').text,
31
- series: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[5]/td').text,
32
- theme: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[6]/td').text,
33
- thumbnail_image: html.at_css('#content1 > section > div.img > img')['src'],
34
- title: html.css('#content1 > section > h2').text,
35
- }
36
- end
37
- end
38
- end
39
- end
10
+ def self.parse_product_html(html)
11
+ {
12
+ actresses: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[7]/td/a').map(&:text),
13
+ cover_image: html.at_css('#content1 > section > div.img > img')['src'],
14
+ description: html.css('#content1 > section > p').text,
15
+ label: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[4]/td').text,
16
+ maker: 'Baltan',
17
+ movie_length: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[2]/td').text,
18
+ release_date: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[3]/td').text,
19
+ series: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[5]/td').text,
20
+ theme: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[6]/td').text,
21
+ thumbnail_image: html.at_css('#content1 > section > div.img > img')['src'],
22
+ title: html.css('#content1 > section > h2').text,
23
+ }
40
24
  end
@@ -1,42 +1,26 @@
1
- module OpenDMM
2
- module Maker
3
- module Befree
4
- include Maker
1
+ base_uri 'befreebe.com'
5
2
 
6
- module Site
7
- base_uri 'befreebe.com'
3
+ register_product(
4
+ /^(BF)-?(\d{3})$/i,
5
+ '/works/#{$1.downcase}/#{$1.downcase}#{$2}.html',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(BF)-?(\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(content)
21
- specs = Utils.hash_from_dl(html.css('#right-navi > dl')).merge(
22
- Utils.hash_by_split(html.xpath('//*[@id="right-navi"]/div[1]/p[2]').map(&:text)))
23
- return {
24
- actresses: html.css('#content > div.main > section > p.actress > a').map(&:text),
25
- code: specs['品番:'].text,
26
- cover_image: html.at_css('#content > div.main > section > div.package > img')['src'],
27
- description: html.css('#content > div.main > section > p.comment').text,
28
- directors: specs['監督:'].text.split,
29
- genres: specs['ジャンル:'].css('a').map(&:text),
30
- maker: 'BeFree',
31
- movie_length: specs['収録時間'],
32
- page: page_uri.to_s,
33
- release_date: specs['発売日:'].text,
34
- sample_images: html.css('#content > div.main > section > ul > li > a').map { |a| a['href'] },
35
- thumbnail_image: html.at_css('#content > div.main > section > div.package > img')['src'],
36
- title: html.xpath('//*[@id="content"]/div[2]/section/h2[1]').text,
37
- }
38
- end
39
- end
40
- end
41
- end
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_from_dl(html.css('#right-navi > dl')).merge(
12
+ Utils.hash_by_split(html.xpath('//*[@id="right-navi"]/div[1]/p[2]').map(&:text)))
13
+ {
14
+ actresses: html.css('#content > div.main > section > p.actress > a').map(&:text),
15
+ cover_image: html.at_css('#content > div.main > section > div.package > img')['src'],
16
+ description: html.css('#content > div.main > section > p.comment').text,
17
+ directors: specs['監督:'].text.split,
18
+ genres: specs['ジャンル:'].css('a').map(&:text),
19
+ maker: 'BeFree',
20
+ movie_length: specs['収録時間'],
21
+ release_date: specs['発売日:'].text,
22
+ sample_images: html.css('#content > div.main > section > ul > li > a').map { |a| a['href'] },
23
+ thumbnail_image: html.at_css('#content > div.main > section > div.package > img')['src'],
24
+ title: html.xpath('//*[@id="content"]/div[2]/section/h2[1]').text,
25
+ }
42
26
  end
@@ -1,44 +1,28 @@
1
- module OpenDMM
2
- module Maker
3
- module Bi
4
- include Maker
1
+ base_uri 'bi-av.com'
5
2
 
6
- module Site
7
- base_uri 'bi-av.com'
3
+ register_product(
4
+ /^(BBI|BEB|BID|BWB)-?(\d{3})$/i,
5
+ '/works/#{$1.downcase}/#{$1.downcase}#{$2}.html',
6
+ )
8
7
 
9
- def self.item(name)
10
- case name
11
- when /^(BBI|BEB|BID|BWB)-?(\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(content)
21
- specs = Utils.hash_by_split(html.xpath('//*[@id="content-box"]/div[3]/div[2]/ul/li').map(&:text))
22
- return {
23
- actresses: specs['出演女優'].split('/'),
24
- code: specs['品番'],
25
- cover_image: html.at_xpath('//*[@id="content-box"]/div[3]/div[1]/a')['href'],
26
- description: html.xpath('//*[@id="content-box"]/div[3]/div[2]/p').text,
27
- directors: specs['監督'].split,
28
- genres: specs['ジャンル'].split('/'),
29
- label: specs['レーベル'],
30
- maker: '',
31
- movie_length: specs['収録時間'],
32
- page: page_uri.to_s,
33
- release_date: specs['発売日'],
34
- sample_images: html.xpath('//*[@id="content-box"]/div[3]/div[7]/ul/li/a').map { |a| a['href'] },
35
- thumbnail_image: html.at_xpath('//*[@id="content-box"]/div[3]/div[1]/a/img')['src'],
36
- series: specs['シリーズ'],
37
- subtitle: html.css('#content-box > p.works-subtl650').text,
38
- title: html.xpath('//*[@id="content-box"]/h1').text,
39
- }
40
- end
41
- end
42
- end
43
- end
10
+ def self.parse_product_html(html)
11
+ specs = Utils.hash_by_split(html.xpath('//*[@id="content-box"]/div[3]/div[2]/ul/li').map(&:text))
12
+ {
13
+ actresses: specs['出演女優'].split('/'),
14
+ cover_image: html.at_xpath('//*[@id="content-box"]/div[3]/div[1]/a')['href'],
15
+ description: html.xpath('//*[@id="content-box"]/div[3]/div[2]/p').text,
16
+ directors: specs['監督'].split,
17
+ genres: specs['ジャンル'].split('/'),
18
+ label: specs['レーベル'],
19
+ maker: '',
20
+ movie_length: specs['収録時間'],
21
+ release_date: specs['発売日'],
22
+ sample_images: html.xpath('//*[@id="content-box"]/div[3]/div[7]/ul/li/a').map { |a| a['href'] },
23
+ thumbnail_image: html.at_xpath('//*[@id="content-box"]/div[3]/div[1]/a/img')['src'],
24
+ series: specs['シリーズ'],
25
+ subtitle: html.css('#content-box > p.works-subtl650').text,
26
+ title: html.xpath('//*[@id="content-box"]/h1').text,
27
+ }
44
28
  end