opendmm 0.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.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +3 -0
  5. data/README.md +9 -0
  6. data/Rakefile +77 -0
  7. data/bin/opendmm +24 -0
  8. data/lib/opendmm.rb +9 -0
  9. data/lib/opendmm/maker.rb +60 -0
  10. data/lib/opendmm/makers/aknr.rb +38 -0
  11. data/lib/opendmm/makers/ako3.rb +39 -0
  12. data/lib/opendmm/makers/anna_and_hanako.rb +40 -0
  13. data/lib/opendmm/makers/apa.rb +40 -0
  14. data/lib/opendmm/makers/aroma.rb +63 -0
  15. data/lib/opendmm/makers/attackers.rb +55 -0
  16. data/lib/opendmm/makers/aurora.rb +45 -0
  17. data/lib/opendmm/makers/baltan.rb +40 -0
  18. data/lib/opendmm/makers/befree.rb +42 -0
  19. data/lib/opendmm/makers/bi.rb +44 -0
  20. data/lib/opendmm/makers/bijin_majo.rb +39 -0
  21. data/lib/opendmm/makers/candy.rb +41 -0
  22. data/lib/opendmm/makers/caribbean.rb +40 -0
  23. data/lib/opendmm/makers/dip.rb +43 -0
  24. data/lib/opendmm/makers/dmm_collection.rb +39 -0
  25. data/lib/opendmm/makers/ebody.rb +42 -0
  26. data/lib/opendmm/makers/ideapocket.rb +68 -0
  27. data/lib/opendmm/makers/kawaii.rb +41 -0
  28. data/lib/opendmm/makers/kira_kira.rb +41 -0
  29. data/lib/opendmm/makers/madonna.rb +41 -0
  30. data/lib/opendmm/makers/moodyz.rb +48 -0
  31. data/lib/opendmm/makers/munekyunkissa.rb +42 -0
  32. data/lib/opendmm/makers/opera.rb +47 -0
  33. data/lib/opendmm/makers/oppai.rb +57 -0
  34. data/lib/opendmm/makers/premium.rb +43 -0
  35. data/lib/opendmm/makers/prestige.rb +66 -0
  36. data/lib/opendmm/makers/s1.rb +41 -0
  37. data/lib/opendmm/makers/sod.rb +44 -0
  38. data/lib/opendmm/makers/tameikegoro.rb +42 -0
  39. data/lib/opendmm/makers/to_satsu.rb +40 -0
  40. data/lib/opendmm/makers/waap.rb +46 -0
  41. data/lib/opendmm/search_engines/jav_library.rb +58 -0
  42. data/lib/opendmm/utils.rb +119 -0
  43. data/lib/opendmm/version.rb +3 -0
  44. data/opendmm.gemspec +25 -0
  45. data/test/fixtures/ABP-013.json +33 -0
  46. data/test/fixtures/ABS-014.json +31 -0
  47. data/test/fixtures/ABY-003.json +32 -0
  48. data/test/fixtures/ADN-019.json +37 -0
  49. data/test/fixtures/AIR-017.json +34 -0
  50. data/test/fixtures/AKO-011.json +20 -0
  51. data/test/fixtures/ALB-182.json +31 -0
  52. data/test/fixtures/ANND-066.json +29 -0
  53. data/test/fixtures/AP-001.json +24 -0
  54. data/test/fixtures/APAA-182.json +38 -0
  55. data/test/fixtures/APAK-051.json +42 -0
  56. data/test/fixtures/ARM-191.json +28 -0
  57. data/test/fixtures/ARMG-223.json +27 -0
  58. data/test/fixtures/ATID-183.json +41 -0
  59. data/test/fixtures/BBI-104.json +33 -0
  60. data/test/fixtures/BEB-001.json +35 -0
  61. data/test/fixtures/BF-175.json +31 -0
  62. data/test/fixtures/BID-017.json +40 -0
  63. data/test/fixtures/BIJN-006.json +25 -0
  64. data/test/fixtures/BLK-049.json +27 -0
  65. data/test/fixtures/BRA-002.json +34 -0
  66. data/test/fixtures/BWB-005.json +31 -0
  67. data/test/fixtures/CHN-008.json +31 -0
  68. data/test/fixtures/CHS-015.json +32 -0
  69. data/test/fixtures/CLUB-003.json +22 -0
  70. data/test/fixtures/CND-012.json +29 -0
  71. data/test/fixtures/CWM-156.json +34 -0
  72. data/test/fixtures/Carib 021511-620.json +27 -0
  73. data/test/fixtures/DCOL-017.json +25 -0
  74. data/test/fixtures/DGL-007.json +24 -0
  75. data/test/fixtures/DOM-045.json +36 -0
  76. data/test/fixtures/EBOD-109.json +30 -0
  77. data/test/fixtures/ECB-078.json +33 -0
  78. data/test/fixtures/EDD-189.json +33 -0
  79. data/test/fixtures/ESK-232.json +31 -0
  80. data/test/fixtures/EZD-369.json +32 -0
  81. data/test/fixtures/FSET-399.json +40 -0
  82. data/test/fixtures/HAZ-009.json +33 -0
  83. data/test/fixtures/HON-001.json +31 -0
  84. data/test/fixtures/IDBD-447.json +32 -0
  85. data/test/fixtures/INU-013.json +34 -0
  86. data/test/fixtures/IPSD-041.json +40 -0
  87. data/test/fixtures/IPTD-464.json +35 -0
  88. data/test/fixtures/IPTD-629.json +32 -0
  89. data/test/fixtures/IPZ-005.json +35 -0
  90. data/test/fixtures/JBD-153.json +42 -0
  91. data/test/fixtures/JBS-004.json +32 -0
  92. data/test/fixtures/JOB-010.json +33 -0
  93. data/test/fixtures/JUC-285.json +36 -0
  94. data/test/fixtures/JUFD-137.json +33 -0
  95. data/test/fixtures/JUX-007.json +35 -0
  96. data/test/fixtures/JUX-119.json +35 -0
  97. data/test/fixtures/KAWD-249.json +30 -0
  98. data/test/fixtures/KIRD-147.json +28 -0
  99. data/test/fixtures/KISD-042.json +32 -0
  100. data/test/fixtures/LLR-005.json +35 -0
  101. data/test/fixtures/MAS-042.json +36 -0
  102. data/test/fixtures/MBD-148.json +32 -0
  103. data/test/fixtures/MDC-002.json +33 -0
  104. data/test/fixtures/MDYD-544.json +34 -0
  105. data/test/fixtures/MEK-008.json +32 -0
  106. data/test/fixtures/MIAD-490.json +34 -0
  107. data/test/fixtures/MIDD-599.json +36 -0
  108. data/test/fixtures/MIDD-643.json +32 -0
  109. data/test/fixtures/MIDD-644.json +30 -0
  110. data/test/fixtures/MIDE-004.json +34 -0
  111. data/test/fixtures/MIGD-284.json +34 -0
  112. data/test/fixtures/MIGD-336.json +33 -0
  113. data/test/fixtures/MIGD-337.json +35 -0
  114. data/test/fixtures/MIMK-005.json +36 -0
  115. data/test/fixtures/MINT-004.json +35 -0
  116. data/test/fixtures/MIQD-010.json +27 -0
  117. data/test/fixtures/MIRD-071.json +41 -0
  118. data/test/fixtures/MIRD-072.json +47 -0
  119. data/test/fixtures/MIRD-073.json +38 -0
  120. data/test/fixtures/MIXS-005.json +34 -0
  121. data/test/fixtures/MMY-010.json +32 -0
  122. data/test/fixtures/NAGE-001.json +33 -0
  123. data/test/fixtures/NDR-001.json +32 -0
  124. data/test/fixtures/NOF-003.json +36 -0
  125. data/test/fixtures/NPS-130.json +18 -0
  126. data/test/fixtures/OBA-045.json +35 -0
  127. data/test/fixtures/ONSD-570.json +29 -0
  128. data/test/fixtures/OPUD-125.json +46 -0
  129. data/test/fixtures/OSR-003.json +32 -0
  130. data/test/fixtures/PARM-028.json +21 -0
  131. data/test/fixtures/PBD-134.json +29 -0
  132. data/test/fixtures/PGD-306.json +34 -0
  133. data/test/fixtures/PJD-085.json +31 -0
  134. data/test/fixtures/PPB-008.json +31 -0
  135. data/test/fixtures/PPP-001.json +45 -0
  136. data/test/fixtures/PPPD-102.json +33 -0
  137. data/test/fixtures/PPSD-028.json +40 -0
  138. data/test/fixtures/PPT-004.json +31 -0
  139. data/test/fixtures/PTS-230.json +17 -0
  140. data/test/fixtures/PTV-001.json +28 -0
  141. data/test/fixtures/PXD-027.json +37 -0
  142. data/test/fixtures/RAW-005.json +32 -0
  143. data/test/fixtures/RBD-183.json +40 -0
  144. data/test/fixtures/SAD-031.json +35 -0
  145. data/test/fixtures/SDDE-312.json +34 -0
  146. data/test/fixtures/SDMT-802.json +32 -0
  147. data/test/fixtures/SDMU-008.json +38 -0
  148. data/test/fixtures/SDNM-011.json +37 -0
  149. data/test/fixtures/SET-007.json +32 -0
  150. data/test/fixtures/SGA-001.json +31 -0
  151. data/test/fixtures/SHKD-415.json +38 -0
  152. data/test/fixtures/SNIS-041.json +34 -0
  153. data/test/fixtures/SOE-259.json +31 -0
  154. data/test/fixtures/SPC-001.json +31 -0
  155. data/test/fixtures/SPS-008.json +32 -0
  156. data/test/fixtures/SRS-015.json +32 -0
  157. data/test/fixtures/SSPD-077.json +44 -0
  158. data/test/fixtures/STAR-359.json +33 -0
  159. data/test/fixtures/SUPD-065.json +41 -0
  160. data/test/fixtures/TDT-018.json +31 -0
  161. data/test/fixtures/TMAM-034.json +14 -0
  162. data/test/fixtures/TMCY-039.json +14 -0
  163. data/test/fixtures/TMDI-040.json +14 -0
  164. data/test/fixtures/TMEM-044.json +14 -0
  165. data/test/fixtures/TMVI-042.json +14 -0
  166. data/test/fixtures/TRD-062.json +31 -0
  167. data/test/fixtures/URE-011.json +38 -0
  168. data/test/fixtures/WA-201.json +17 -0
  169. data/test/fixtures/WAT-003.json +33 -0
  170. data/test/fixtures/WPC-002.json +35 -0
  171. data/test/fixtures/WSS-231.json +33 -0
  172. data/test/fixtures/XND-023.json +32 -0
  173. data/test/fixtures/XV-100.json +18 -0
  174. data/test/fixtures/XV-1000.json +24 -0
  175. data/test/fixtures/YRH-008.json +35 -0
  176. data/test/fixtures/YRZ-009.json +32 -0
  177. data/test/fixtures/ZEX-068.json +18 -0
  178. data/test/fixtures_test.rb +76 -0
  179. metadata +454 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 96b3fd3b120c02663413fb8cfc7507b269a1782e
4
+ data.tar.gz: 19d27b4d395b6c80d951640ad1a862e6d5c5f626
5
+ SHA512:
6
+ metadata.gz: 8d2c9dc40359ea6d06defbf54d526c121dc955a5f59c49be84c204751a737556d6046eaba2dc2be09ab5c709b0ae49bbd3b7670acd26a41d4935c936bf938838
7
+ data.tar.gz: da02d44597a305c4ccf8cee46a6a7206c5fe0b5cbfa3cc788fcf323193d063e7e89d82214cea1b5e808712a3ee9bd82b15a70d0b810b89c390f82c5cab28d4fe
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg
2
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ script: rake test GFW_MODE=1
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ [![Build Status](https://travis-ci.org/opendmm/opendmm.svg?branch=develop)](https://travis-ci.org/opendmm/opendmm)
2
+
3
+ # Welcome to OpenDMM
4
+
5
+ OpenDMM provides a free alternative of [DMM](http://www.dmm.co.jp) to search Japanese AV.
6
+
7
+ # License
8
+
9
+ OpenDMM is released under [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,77 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'json'
4
+ require 'opendmm'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.pattern = 'test/**/*_test.rb'
8
+ end
9
+
10
+ namespace :fixture do
11
+ desc 'Generate a fixture'
12
+ task :generate, [:id] => :install do |t, args|
13
+ fixture = OpenDMM.search(args[:id])
14
+ if fixture.blank?
15
+ puts "#{args[:id]} not found"
16
+ next
17
+ end
18
+ File.open(File.join(File.dirname(__FILE__) + "/test/fixtures/#{args[:id]}.json"), 'w') do |file|
19
+ puts "Generating #{args[:id]}.json"
20
+ file.puts JSON.pretty_generate(fixture)
21
+ end
22
+ end
23
+
24
+ desc 'Regenerate all fixtures'
25
+ task :regenerate => :install do
26
+ Dir[File.dirname(__FILE__) + '/test/fixtures/*.json'].each do |path|
27
+ File.open(path, 'w') do |file|
28
+ id = File.basename(path, '.json')
29
+ puts "Generating #{id}.json"
30
+ file.puts JSON.pretty_generate(OpenDMM.search(id))
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ namespace :maker do
37
+ desc "Generate a maker"
38
+ task :generate, [:name] do |t, args|
39
+ File.open(File.join(File.dirname(__FILE__) + "/lib/opendmm/makers/#{args[:name].underscore}.rb"), 'w') do |file|
40
+ puts "Generating #{args[:name].underscore}.rb"
41
+ file.puts <<-CODE
42
+ module OpenDMM
43
+ module Maker
44
+ module #{args[:name].underscore.classify}
45
+ include Maker
46
+
47
+ module Site
48
+ include HTTParty
49
+ base_uri 'example.com'
50
+
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
58
+
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
70
+ end
71
+ CODE
72
+ end
73
+ end
74
+ end
75
+
76
+ task :test => :install
77
+ task :default => :test
data/bin/opendmm ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "json"
4
+ require "optparse"
5
+ require "pp"
6
+ require "opendmm"
7
+
8
+ options = { json: false }
9
+ OptionParser.new do |opts|
10
+ opts.on("-j", "--[no-]json", "JSON mode") do |j|
11
+ options[:json] = j
12
+ end
13
+ end.parse!
14
+
15
+ details = OpenDMM.search(ARGV.first)
16
+ if details
17
+ if options[:json]
18
+ puts JSON.pretty_generate(details)
19
+ else
20
+ pp details
21
+ end
22
+ else
23
+ puts "Unknown product: " + ARGV.first
24
+ end
data/lib/opendmm.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'opendmm/version'
2
+ require 'opendmm/maker'
3
+ require 'opendmm/search_engines/jav_library'
4
+
5
+ module OpenDMM
6
+ def self.search(name)
7
+ Utils.cleanup(Maker.search(name) || SearchEngine::JavLibrary.search(name))
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ require 'active_support/core_ext/string/filters'
2
+ require 'httparty'
3
+ require 'nokogiri'
4
+ require 'opendmm/utils'
5
+
6
+ module OpenDMM
7
+ module Maker
8
+ @@makers = []
9
+
10
+ def self.included(klass)
11
+ klass.module_eval <<-CODE
12
+ def self.search(name)
13
+ item = Site.item(name)
14
+ item ? Parser.parse(item) : nil
15
+ end
16
+ CODE
17
+ @@makers << klass
18
+ end
19
+
20
+ # Known fields:
21
+ #
22
+ # {
23
+ # actresses: Array
24
+ # actress_types: Array
25
+ # boobs: String
26
+ # brand: String
27
+ # categories: Array
28
+ # code: String
29
+ # cover_image: String
30
+ # description: String
31
+ # directors: Array
32
+ # genres: Array
33
+ # label: String
34
+ # maker: String
35
+ # movie_length: String
36
+ # page: String
37
+ # release_date: String
38
+ # sample_images: Array
39
+ # scenes: Array
40
+ # series: String
41
+ # subtitle: String
42
+ # theme: String
43
+ # thumbnail_image: String
44
+ # title: String
45
+ # __extra: Hash
46
+ # }
47
+
48
+ def self.search(name)
49
+ @@makers.each do |maker|
50
+ result = maker.search(name)
51
+ return result if result
52
+ end
53
+ nil
54
+ end
55
+ end
56
+ end
57
+
58
+ Dir[File.dirname(__FILE__) + '/makers/*.rb'].each do |file|
59
+ require file
60
+ end
@@ -0,0 +1,38 @@
1
+ module OpenDMM
2
+ module Maker
3
+ module Aknr
4
+ include Maker
5
+
6
+ module Site
7
+ include HTTParty
8
+ base_uri 'www.aknr.com'
9
+
10
+ def self.item(name)
11
+ case name
12
+ when /^(FSET)-?(\d{3})$/i
13
+ get("/works/#{$1.downcase}-#{$2}/")
14
+ end
15
+ end
16
+ end
17
+
18
+ module Parser
19
+ def self.parse(content)
20
+ page_uri = content.request.last_uri
21
+ html = Nokogiri::HTML(content)
22
+ return {
23
+ actresses: html.css('//*[@id="info"]/div[3]/div[2]').text.split,
24
+ code: html.css('//*[@id="info"]/div[5]/div[2]').text,
25
+ cover_image: html.at_css('#jktimg_l2 > a')['href'],
26
+ directors: html.css('//*[@id="info"]/div[4]/div[2]').text.split,
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
38
+ end
@@ -0,0 +1,39 @@
1
+ module OpenDMM
2
+ module Maker
3
+ module Ako3
4
+ include Maker
5
+
6
+ module Site
7
+ include HTTParty
8
+ base_uri 'www.ako-3.com'
9
+
10
+ def self.item(name)
11
+ case name
12
+ when /^(AKO)-?(\d{3})$/i
13
+ get("/work/item.php?itemcode=#{$1.upcase}#{$2}")
14
+ end
15
+ end
16
+ end
17
+
18
+ module Parser
19
+ def self.parse(content)
20
+ page_uri = content.request.last_uri
21
+ html = Nokogiri::HTML(content)
22
+ specs = Utils.hash_by_split(html.css('div#spec-area > div.release').map(&:text))
23
+ return {
24
+ actresses: [ html.css('//*[@id="spec-area"]/div[2]').text ],
25
+ code: specs['商品番号'],
26
+ cover_image: html.at_css('div.jacket a')['href'],
27
+ description: html.css('div#caption').text,
28
+ maker: specs['メーカー'],
29
+ page: page_uri.to_s,
30
+ release_date: specs['配信日'],
31
+ sample_images: html.css('ul.sampleimg li a').map { |a| a['href'] },
32
+ thumbnail_image: html.at_css('#title-area > div > div.jacket > a > img')['src'],
33
+ title: html.css('div.maintitle').text,
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ module OpenDMM
2
+ module Maker
3
+ module AnnaAndHanako
4
+ include Maker
5
+
6
+ module Site
7
+ include HTTParty
8
+ base_uri 'anna-and-hanako.jp'
9
+
10
+ def self.item(name)
11
+ case name
12
+ when /^(ANND)-?(\d{3})$/i
13
+ get("/works/#{$1.downcase}/#{$1.downcase}#{$2}.html")
14
+ end
15
+ end
16
+ end
17
+
18
+ module Parser
19
+ def self.parse(content)
20
+ page_uri = content.request.last_uri
21
+ html = Nokogiri::HTML(Utils.force_utf8(content))
22
+ specs = Utils.hash_by_split(html.xpath('//*[@id="pake-bottom-box_r"]/dl/p').map(&:text))
23
+ return {
24
+ actresses: specs['出演者'].split('/'),
25
+ code: specs['品番'],
26
+ cover_image: html.at_xpath('//*[@id="pake-bottom-box"]/dl/a')['href'],
27
+ description: html.xpath('//*[@id="txt-bottom-box"]').text,
28
+ directors: specs['監督'].split('/'),
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
40
+ end
@@ -0,0 +1,40 @@
1
+ module OpenDMM
2
+ module Maker
3
+ module Apache
4
+ include Maker
5
+
6
+ module Site
7
+ include HTTParty
8
+ base_uri 'www.apa-av.jp'
9
+
10
+ def self.item(name)
11
+ case name
12
+ when /^AP-?(\d{3})$/i
13
+ get("/list_detail/detail_#{$1}.html")
14
+ end
15
+ end
16
+ end
17
+
18
+ module Parser
19
+ def self.parse(content)
20
+ page_uri = content.request.last_uri
21
+ html = Nokogiri::HTML(content)
22
+ specs = Utils.hash_by_split(html.css('ul.detail-main-meta li').map(&:text))
23
+ return {
24
+ actresses: specs['出演女優'].split(','),
25
+ code: specs['品番'],
26
+ cover_image: html.at_css('#right > div.detail-main > div.detail_img > a')['href'],
27
+ description: html.at_css('#right > div.detail-main > div.detail_description').inner_text,
28
+ directors: specs['監督'].split,
29
+ maker: 'Apache',
30
+ movie_length: specs['収録時間'],
31
+ page: page_uri.to_s,
32
+ sample_images: html.css('#right > div.detail-main > div.detail_description > ul > li > a').map { |a| a['href'] },
33
+ thumbnail_image: html.at_css('#right > div.detail-main > div.detail_img > a > img')['src'],
34
+ title: html.css('div.detail_title_1').text,
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,63 @@
1
+ module OpenDMM
2
+ module Maker
3
+ module Aroma
4
+ include Maker
5
+
6
+ module Site
7
+ include HTTParty
8
+ base_uri 'www.aroma-p.com'
9
+
10
+ def self.item(name)
11
+ case name
12
+ when /^ARM-?(\d{3})$/i
13
+ return get("/member/contents/title.php?conid=101#{$1}")
14
+ when /^ARMG-?(\d{3})$/i
15
+ return get("/member/contents/title.php?conid=200#{$1}")
16
+ when /^PARM-?(\d{3})$/i
17
+ return get("/member/contents/title.php?conid=205#{$1}")
18
+ end
19
+ end
20
+ end
21
+
22
+ module Parser
23
+ def self.parse(content)
24
+ page_uri = content.request.last_uri
25
+ html = Nokogiri::HTML(Utils.force_utf8(content))
26
+ 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)
27
+ return {
28
+ actresses: specs['出演者'].try(:split, '・'),
29
+ code: specs['品番'],
30
+ cover_image: parse_cover_image(html, page_uri),
31
+ directors: specs['監督'].try(:split, '・'),
32
+ 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,
33
+ genres: specs['ジャンル'].split,
34
+ label: specs['レーベル'],
35
+ maker: 'Aroma',
36
+ movie_length: specs['時間'],
37
+ page: page_uri.to_s,
38
+ sample_images: parse_sample_images(html, page_uri),
39
+ 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'],
40
+ 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,
41
+ }
42
+ end
43
+
44
+ private
45
+
46
+ def self.parse_cover_image(html, page_uri)
47
+ 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']
48
+ if href =~ /'(\/images\/.*)'/
49
+ return $1
50
+ end
51
+ end
52
+
53
+ def self.parse_sample_images(html, page_uri)
54
+ 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|
55
+ if input['onclick'] =~ /'(\/images\/.*)'/
56
+ $1
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,55 @@
1
+ module OpenDMM
2
+ module Maker
3
+ module Attackers
4
+ include Maker
5
+
6
+ module Site
7
+ include HTTParty
8
+ base_uri 'attackers.net'
9
+
10
+ def self.item(name)
11
+ case name
12
+ when /^(ADN|ATID|JBD|RBD|SHKD|SSPD)-?(\d{3})$/i
13
+ get("/works/-/detail/=/cid=#{$1.downcase}#{$2}")
14
+ end
15
+ end
16
+ end
17
+
18
+ module Parser
19
+ def self.parse(content)
20
+ page_uri = content.request.last_uri
21
+ html = Nokogiri::HTML(content)
22
+ specs = Utils.hash_by_split(html.css('div#works-content ul li').map(&:text))
23
+ return {
24
+ actresses: specs['出演女優'].split,
25
+ code: parse_code(specs['品番']),
26
+ cover_image: html.at_css('div#works_pake_box a#pake')['href'],
27
+ directors: specs['監督'].split,
28
+ description: html.css('p.works_txt').text,
29
+ genres: specs['ジャンル'].split,
30
+ label: specs['レーベル'],
31
+ maker: 'Attackers',
32
+ movie_length: specs['収録時間'],
33
+ page: page_uri.to_s,
34
+ release_date: specs['発売日'],
35
+ sample_images: html.css('ul#sample_photo li a').map { |a| a['href'] },
36
+ series: specs['シリーズ'],
37
+ thumbnail_image: html.at_css('#pake > img')['src'],
38
+ title: html.css('div.hl_box_btm').text,
39
+ }
40
+ end
41
+
42
+ private
43
+
44
+ def self.parse_code(str)
45
+ case str
46
+ when /Blu-ray:(\w+-\d+).*DVD:(\w+-\d+)/
47
+ $2.upcase
48
+ when /\w+-\d+/
49
+ $&
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end