opendmm 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +3 -0
- data/README.md +9 -0
- data/Rakefile +77 -0
- data/bin/opendmm +24 -0
- data/lib/opendmm.rb +9 -0
- data/lib/opendmm/maker.rb +60 -0
- data/lib/opendmm/makers/aknr.rb +38 -0
- data/lib/opendmm/makers/ako3.rb +39 -0
- data/lib/opendmm/makers/anna_and_hanako.rb +40 -0
- data/lib/opendmm/makers/apa.rb +40 -0
- data/lib/opendmm/makers/aroma.rb +63 -0
- data/lib/opendmm/makers/attackers.rb +55 -0
- data/lib/opendmm/makers/aurora.rb +45 -0
- data/lib/opendmm/makers/baltan.rb +40 -0
- data/lib/opendmm/makers/befree.rb +42 -0
- data/lib/opendmm/makers/bi.rb +44 -0
- data/lib/opendmm/makers/bijin_majo.rb +39 -0
- data/lib/opendmm/makers/candy.rb +41 -0
- data/lib/opendmm/makers/caribbean.rb +40 -0
- data/lib/opendmm/makers/dip.rb +43 -0
- data/lib/opendmm/makers/dmm_collection.rb +39 -0
- data/lib/opendmm/makers/ebody.rb +42 -0
- data/lib/opendmm/makers/ideapocket.rb +68 -0
- data/lib/opendmm/makers/kawaii.rb +41 -0
- data/lib/opendmm/makers/kira_kira.rb +41 -0
- data/lib/opendmm/makers/madonna.rb +41 -0
- data/lib/opendmm/makers/moodyz.rb +48 -0
- data/lib/opendmm/makers/munekyunkissa.rb +42 -0
- data/lib/opendmm/makers/opera.rb +47 -0
- data/lib/opendmm/makers/oppai.rb +57 -0
- data/lib/opendmm/makers/premium.rb +43 -0
- data/lib/opendmm/makers/prestige.rb +66 -0
- data/lib/opendmm/makers/s1.rb +41 -0
- data/lib/opendmm/makers/sod.rb +44 -0
- data/lib/opendmm/makers/tameikegoro.rb +42 -0
- data/lib/opendmm/makers/to_satsu.rb +40 -0
- data/lib/opendmm/makers/waap.rb +46 -0
- data/lib/opendmm/search_engines/jav_library.rb +58 -0
- data/lib/opendmm/utils.rb +119 -0
- data/lib/opendmm/version.rb +3 -0
- data/opendmm.gemspec +25 -0
- data/test/fixtures/ABP-013.json +33 -0
- data/test/fixtures/ABS-014.json +31 -0
- data/test/fixtures/ABY-003.json +32 -0
- data/test/fixtures/ADN-019.json +37 -0
- data/test/fixtures/AIR-017.json +34 -0
- data/test/fixtures/AKO-011.json +20 -0
- data/test/fixtures/ALB-182.json +31 -0
- data/test/fixtures/ANND-066.json +29 -0
- data/test/fixtures/AP-001.json +24 -0
- data/test/fixtures/APAA-182.json +38 -0
- data/test/fixtures/APAK-051.json +42 -0
- data/test/fixtures/ARM-191.json +28 -0
- data/test/fixtures/ARMG-223.json +27 -0
- data/test/fixtures/ATID-183.json +41 -0
- data/test/fixtures/BBI-104.json +33 -0
- data/test/fixtures/BEB-001.json +35 -0
- data/test/fixtures/BF-175.json +31 -0
- data/test/fixtures/BID-017.json +40 -0
- data/test/fixtures/BIJN-006.json +25 -0
- data/test/fixtures/BLK-049.json +27 -0
- data/test/fixtures/BRA-002.json +34 -0
- data/test/fixtures/BWB-005.json +31 -0
- data/test/fixtures/CHN-008.json +31 -0
- data/test/fixtures/CHS-015.json +32 -0
- data/test/fixtures/CLUB-003.json +22 -0
- data/test/fixtures/CND-012.json +29 -0
- data/test/fixtures/CWM-156.json +34 -0
- data/test/fixtures/Carib 021511-620.json +27 -0
- data/test/fixtures/DCOL-017.json +25 -0
- data/test/fixtures/DGL-007.json +24 -0
- data/test/fixtures/DOM-045.json +36 -0
- data/test/fixtures/EBOD-109.json +30 -0
- data/test/fixtures/ECB-078.json +33 -0
- data/test/fixtures/EDD-189.json +33 -0
- data/test/fixtures/ESK-232.json +31 -0
- data/test/fixtures/EZD-369.json +32 -0
- data/test/fixtures/FSET-399.json +40 -0
- data/test/fixtures/HAZ-009.json +33 -0
- data/test/fixtures/HON-001.json +31 -0
- data/test/fixtures/IDBD-447.json +32 -0
- data/test/fixtures/INU-013.json +34 -0
- data/test/fixtures/IPSD-041.json +40 -0
- data/test/fixtures/IPTD-464.json +35 -0
- data/test/fixtures/IPTD-629.json +32 -0
- data/test/fixtures/IPZ-005.json +35 -0
- data/test/fixtures/JBD-153.json +42 -0
- data/test/fixtures/JBS-004.json +32 -0
- data/test/fixtures/JOB-010.json +33 -0
- data/test/fixtures/JUC-285.json +36 -0
- data/test/fixtures/JUFD-137.json +33 -0
- data/test/fixtures/JUX-007.json +35 -0
- data/test/fixtures/JUX-119.json +35 -0
- data/test/fixtures/KAWD-249.json +30 -0
- data/test/fixtures/KIRD-147.json +28 -0
- data/test/fixtures/KISD-042.json +32 -0
- data/test/fixtures/LLR-005.json +35 -0
- data/test/fixtures/MAS-042.json +36 -0
- data/test/fixtures/MBD-148.json +32 -0
- data/test/fixtures/MDC-002.json +33 -0
- data/test/fixtures/MDYD-544.json +34 -0
- data/test/fixtures/MEK-008.json +32 -0
- data/test/fixtures/MIAD-490.json +34 -0
- data/test/fixtures/MIDD-599.json +36 -0
- data/test/fixtures/MIDD-643.json +32 -0
- data/test/fixtures/MIDD-644.json +30 -0
- data/test/fixtures/MIDE-004.json +34 -0
- data/test/fixtures/MIGD-284.json +34 -0
- data/test/fixtures/MIGD-336.json +33 -0
- data/test/fixtures/MIGD-337.json +35 -0
- data/test/fixtures/MIMK-005.json +36 -0
- data/test/fixtures/MINT-004.json +35 -0
- data/test/fixtures/MIQD-010.json +27 -0
- data/test/fixtures/MIRD-071.json +41 -0
- data/test/fixtures/MIRD-072.json +47 -0
- data/test/fixtures/MIRD-073.json +38 -0
- data/test/fixtures/MIXS-005.json +34 -0
- data/test/fixtures/MMY-010.json +32 -0
- data/test/fixtures/NAGE-001.json +33 -0
- data/test/fixtures/NDR-001.json +32 -0
- data/test/fixtures/NOF-003.json +36 -0
- data/test/fixtures/NPS-130.json +18 -0
- data/test/fixtures/OBA-045.json +35 -0
- data/test/fixtures/ONSD-570.json +29 -0
- data/test/fixtures/OPUD-125.json +46 -0
- data/test/fixtures/OSR-003.json +32 -0
- data/test/fixtures/PARM-028.json +21 -0
- data/test/fixtures/PBD-134.json +29 -0
- data/test/fixtures/PGD-306.json +34 -0
- data/test/fixtures/PJD-085.json +31 -0
- data/test/fixtures/PPB-008.json +31 -0
- data/test/fixtures/PPP-001.json +45 -0
- data/test/fixtures/PPPD-102.json +33 -0
- data/test/fixtures/PPSD-028.json +40 -0
- data/test/fixtures/PPT-004.json +31 -0
- data/test/fixtures/PTS-230.json +17 -0
- data/test/fixtures/PTV-001.json +28 -0
- data/test/fixtures/PXD-027.json +37 -0
- data/test/fixtures/RAW-005.json +32 -0
- data/test/fixtures/RBD-183.json +40 -0
- data/test/fixtures/SAD-031.json +35 -0
- data/test/fixtures/SDDE-312.json +34 -0
- data/test/fixtures/SDMT-802.json +32 -0
- data/test/fixtures/SDMU-008.json +38 -0
- data/test/fixtures/SDNM-011.json +37 -0
- data/test/fixtures/SET-007.json +32 -0
- data/test/fixtures/SGA-001.json +31 -0
- data/test/fixtures/SHKD-415.json +38 -0
- data/test/fixtures/SNIS-041.json +34 -0
- data/test/fixtures/SOE-259.json +31 -0
- data/test/fixtures/SPC-001.json +31 -0
- data/test/fixtures/SPS-008.json +32 -0
- data/test/fixtures/SRS-015.json +32 -0
- data/test/fixtures/SSPD-077.json +44 -0
- data/test/fixtures/STAR-359.json +33 -0
- data/test/fixtures/SUPD-065.json +41 -0
- data/test/fixtures/TDT-018.json +31 -0
- data/test/fixtures/TMAM-034.json +14 -0
- data/test/fixtures/TMCY-039.json +14 -0
- data/test/fixtures/TMDI-040.json +14 -0
- data/test/fixtures/TMEM-044.json +14 -0
- data/test/fixtures/TMVI-042.json +14 -0
- data/test/fixtures/TRD-062.json +31 -0
- data/test/fixtures/URE-011.json +38 -0
- data/test/fixtures/WA-201.json +17 -0
- data/test/fixtures/WAT-003.json +33 -0
- data/test/fixtures/WPC-002.json +35 -0
- data/test/fixtures/WSS-231.json +33 -0
- data/test/fixtures/XND-023.json +32 -0
- data/test/fixtures/XV-100.json +18 -0
- data/test/fixtures/XV-1000.json +24 -0
- data/test/fixtures/YRH-008.json +35 -0
- data/test/fixtures/YRZ-009.json +32 -0
- data/test/fixtures/ZEX-068.json +18 -0
- data/test/fixtures_test.rb +76 -0
- metadata +454 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Aurora
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'www.aurora-pro.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(APAA|APAK)-?(\d{3})$/i
|
13
|
+
get("/shop/-/product/p/goods_id=#{$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_from_dl(html.css('div#product_info dl'))
|
23
|
+
return {
|
24
|
+
actresses: specs['出演女優'].css('ul li').map(&:text),
|
25
|
+
actress_types: specs['女優タイプ'].css('ul li').map(&:text),
|
26
|
+
code: specs['作品番号'].text,
|
27
|
+
cover_image: html.at_css('div.main_pkg a img')['src'],
|
28
|
+
description: html.css('div#product_exp p').text,
|
29
|
+
directors: specs['監督'].css('ul li').map(&:text),
|
30
|
+
genres: specs['ジャンル'].css('ul li').map(&:text),
|
31
|
+
label: specs['レーベル'],
|
32
|
+
maker: 'Apache Project',
|
33
|
+
movie_length: specs['収録時間'].text,
|
34
|
+
page: page_uri.to_s,
|
35
|
+
release_date: specs['発売日'].text,
|
36
|
+
sample_images: html.css('div.product_scene ul li img').map { |img| img['src'] },
|
37
|
+
thumbnail_image: html.at_css('div.main_pkg a img')['src'],
|
38
|
+
scenes: specs['シーン'].css('ul li').map(&:text),
|
39
|
+
title: html.css('h1.pro_title').text,
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Baltan
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'baltan-av.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(TMAM|TMCY|TMDI|TMEM|TMVI)-?(\d{3})$/i
|
13
|
+
get("/items/detail/#{$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(Utils.force_utf8(content))
|
22
|
+
return {
|
23
|
+
actresses: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[7]/td/a').map(&:text),
|
24
|
+
code: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[1]/td').text,
|
25
|
+
cover_image: html.at_css('#content1 > section > div.img > img')['src'],
|
26
|
+
description: html.css('#content1 > section > p').text,
|
27
|
+
label: html.xpath('//*[@id="content1"]/section/div[2]/table/tr[4]/td').text,
|
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
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Befree
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'befreebe.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(BF)-?(\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(content)
|
22
|
+
specs = Utils.hash_from_dl(html.css('#right-navi > dl')).merge(
|
23
|
+
Utils.hash_by_split(html.xpath('//*[@id="right-navi"]/div[1]/p[2]').map(&:text)))
|
24
|
+
return {
|
25
|
+
actresses: html.css('#content > div.main > section > p.actress > a').map(&:text),
|
26
|
+
code: specs['品番:'].text,
|
27
|
+
cover_image: html.at_css('#content > div.main > section > div.package > img')['src'],
|
28
|
+
description: html.css('#content > div.main > section > p.comment').text,
|
29
|
+
directors: specs['監督:'].text.split,
|
30
|
+
genres: specs['ジャンル:'].css('a').map(&:text),
|
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
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Bi
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'bi-av.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(BBI|BEB|BID|BWB)-?(\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(content)
|
22
|
+
specs = Utils.hash_by_split(html.xpath('//*[@id="content-box"]/div[3]/div[2]/ul/li').map(&:text))
|
23
|
+
return {
|
24
|
+
actresses: specs['出演女優'].split('/'),
|
25
|
+
code: specs['品番'],
|
26
|
+
cover_image: html.at_xpath('//*[@id="content-box"]/div[3]/div[1]/a')['href'],
|
27
|
+
description: html.xpath('//*[@id="content-box"]/div[3]/div[2]/p').text,
|
28
|
+
directors: specs['監督'].split,
|
29
|
+
genres: specs['ジャンル'].split('/'),
|
30
|
+
label: specs['レーベル'],
|
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
|
44
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module BijinMajo
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'bijin-majo-av.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(BIJN)-?(\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(content)
|
22
|
+
specs = Utils.hash_from_dl(html.css('#detail_main > div.detail_item > dl'))
|
23
|
+
return {
|
24
|
+
actresses: [ html.css('#detail_main > h2').children.first.text ],
|
25
|
+
code: specs['品番:'].text,
|
26
|
+
cover_image: html.at_css('#detail_main > div.figure > a')['href'],
|
27
|
+
description: html.css('#detail_main > div.detail_item > p').text,
|
28
|
+
movie_length: specs['収録時間:'].text,
|
29
|
+
page: page_uri.to_s,
|
30
|
+
release_date: specs['発売日:'].text,
|
31
|
+
sample_images: html.css('#detail_photo > ul > li > a').map { |a| a['href'] },
|
32
|
+
thumbnail_image: html.at_css('#detail_main > div.figure > a > img')['src'],
|
33
|
+
title: html.css('#detail_main > h2').text,
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Candy
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'candy-av.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(CND)-?(\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_from_dl(html.css('#actress > div > dl'))
|
23
|
+
return {
|
24
|
+
actresses: specs['出演女優'].css('a').map(&:text),
|
25
|
+
code: specs['品番'].text,
|
26
|
+
cover_image: html.at_xpath('//*[@id="thumbnail"]/a[1]')['href'],
|
27
|
+
description: html.css('#brand > p.p_actress_detail').text,
|
28
|
+
genres: specs['ジャンル'].css('a').map(&:text),
|
29
|
+
movie_length: specs['収録時間'].text,
|
30
|
+
page: page_uri.to_s,
|
31
|
+
release_date: specs['発売日'].text,
|
32
|
+
sample_images: html.css('#brand > div.photo_sumple > ul > li > a').map { |a| a['href'] },
|
33
|
+
thumbnail_image: html.at_xpath('//*[@id="thumbnail"]/a[1]/img')['src'],
|
34
|
+
series: specs['シリーズ'].text,
|
35
|
+
title: html.css('#brand > div.m_t_4 > h3').text,
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Caribbean
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'www.caribbeancom.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^Carib ?(\d{6})[-_](\d{3})$/i
|
13
|
+
get("/moviepages/#{$1}-#{$2}/index.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('#main-content > div.main-content-movieinfo > div.movie-info > dl').map(&:text))
|
23
|
+
return {
|
24
|
+
actresses: specs['出演'].split,
|
25
|
+
categories: specs['カテゴリー'].split,
|
26
|
+
code: "Carib " + page_uri.to_s.match(/\d{6}-\d{3}/)[0],
|
27
|
+
cover_image: "./images/l_l.jpg",
|
28
|
+
description: html.css('#main-content > div.main-content-movieinfo > div.movie-comment').text,
|
29
|
+
movie_length: specs['再生時間'],
|
30
|
+
page: page_uri.to_s,
|
31
|
+
release_date: specs['配信日'],
|
32
|
+
sample_images: html.css('#main-content > div.detail-content.detail-content-gallery-old > table > tr > td > a').map{ |a| a['href'] }.reject{ |uri| uri =~ /\/member\// },
|
33
|
+
thumbnail_image: "./images/l_s.jpg",
|
34
|
+
title: html.css('#main-content > div.main-content-movieinfo > div.video-detail > span.movie-title > h1').text,
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Dip
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'dip-av.jp'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(NPS|PTS|WA|ZEX)-?(\d{3})$/i
|
13
|
+
get("/detail.php?hinban=#{$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('#main > div.detail > div.actor').map(&:text)).merge(
|
23
|
+
Utils.hash_by_split(html.xpath('//*[@id="main"]/div[@class="detail"]/div[not(@class)]').text.lines))
|
24
|
+
return {
|
25
|
+
actresses: specs['出演者'].try(:split),
|
26
|
+
code: specs['品番'],
|
27
|
+
cover_image: html.at_css('#main > div.detail > a')['href'],
|
28
|
+
description: html.css('#main > div.detail > div.comment').text,
|
29
|
+
genres: specs['ジャンル'].try(:split),
|
30
|
+
label: specs['レーベル'],
|
31
|
+
maker: specs['メーカー'],
|
32
|
+
movie_length: specs['収録時間'],
|
33
|
+
page: page_uri.to_s,
|
34
|
+
release_date: specs['品番'],
|
35
|
+
series: specs['シリーズ'],
|
36
|
+
thumbnail_image: html.at_css('#main > div.detail > a > img')['src'],
|
37
|
+
title: html.css('#main > h1').text,
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module DmmCollection
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'dmm-collection.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(DCOL|DGL)-?(\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_from_dl(html.xpath('//*[@id="information"]/dl[2]'))
|
23
|
+
return {
|
24
|
+
actresses: html.css('#information > dl.actress > dd > a').map(&:text),
|
25
|
+
code: specs['品番'].text,
|
26
|
+
cover_image: html.at_xpath('//*[@id="package"]/h4/a')['href'],
|
27
|
+
description: html.xpath('//*[@id="comment"]/h5').text,
|
28
|
+
movie_length: specs['収録時間'].text,
|
29
|
+
page: page_uri.to_s,
|
30
|
+
release_date: specs['DVD発売日'].text,
|
31
|
+
sample_images: html.xpath('//*[@id="photo"]/ul/li/a').map { |a| a['href'] },
|
32
|
+
thumbnail_image: html.at_xpath('//*[@id="package"]/h4/a/img')['src'],
|
33
|
+
title: html.xpath('//*[@id="information"]/h3').text,
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module EBody
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'av-e-body.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(EBOD)-?(\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(content)
|
22
|
+
specs = Utils.hash_from_dl(html.css('div.title-data > dl')).merge(
|
23
|
+
Utils.hash_by_split(html.xpath('//*[@id="content"]/div/div[3]/div[1]/p').text.lines))
|
24
|
+
return {
|
25
|
+
actresses: specs['出演女優'].css('a').map(&:text),
|
26
|
+
code: specs['品番'],
|
27
|
+
cover_image: html.at_css('div.package > a.package-pic')["href"],
|
28
|
+
description: html.css('div.title-data > p.comment').text,
|
29
|
+
genres: specs['ジャンル'].css('a').map(&:text),
|
30
|
+
movie_length: specs['収録時間'],
|
31
|
+
page: page_uri.to_s,
|
32
|
+
release_date: specs['発売日'].text,
|
33
|
+
sample_images: html.css('div.sample-box > ul.sample-pic > li > a').map { |a| a["href"] },
|
34
|
+
thumbnail_image: html.at_css('#content > div > div.left-box > div.package > a > img')['src'],
|
35
|
+
series: specs['シリーズ'].text.remove(':'),
|
36
|
+
title: html.css('div.title-data > h1').text,
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module OpenDMM
|
2
|
+
module Maker
|
3
|
+
module Ideapocket
|
4
|
+
include Maker
|
5
|
+
|
6
|
+
module Site
|
7
|
+
include HTTParty
|
8
|
+
base_uri 'ideapocket.com'
|
9
|
+
|
10
|
+
def self.item(name)
|
11
|
+
case name
|
12
|
+
when /^(IDBD|IPSD|IPTD|IPZ|SUPD)-?(\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 = parse_specs(html)
|
23
|
+
return {
|
24
|
+
actresses: html.xpath('//*[@id="content-box"]/p[1]').text.split('/'),
|
25
|
+
code: specs['品番']['DVD'],
|
26
|
+
cover_image: html.at_css('div#content-box div.pake a')['href'],
|
27
|
+
directors: specs['監督'].split,
|
28
|
+
description: html.xpath('//*[@id="content-box"]/p[2]').text,
|
29
|
+
genres: specs['ジャンル'].split,
|
30
|
+
label: specs['レーベル'],
|
31
|
+
maker: 'Ideapocket',
|
32
|
+
movie_length: specs['収録時間']['DVD'],
|
33
|
+
page: page_uri.to_s,
|
34
|
+
release_date: specs['発売日']['DVD'],
|
35
|
+
sample_images: html.css('div#sample-pic a').map { |a| a['href'] },
|
36
|
+
thumbnail_image: html.at_css('#content-box > div.pake > a > img')['src'],
|
37
|
+
series: specs['シリーズ'],
|
38
|
+
title: html.css('div#content-box h2.list-ttl').text,
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def self.parse_specs(html)
|
45
|
+
specs = {}
|
46
|
+
last_key = nil
|
47
|
+
html.xpath('//*[@id="navi-right"]/div[1]/p').text.lines do |line|
|
48
|
+
if line =~ /(.*):(.*)/
|
49
|
+
specs[$1.squish] = $2.squish
|
50
|
+
last_key = $1.squish
|
51
|
+
else
|
52
|
+
specs[last_key] += line.squish
|
53
|
+
end
|
54
|
+
end
|
55
|
+
specs.each do |key, value|
|
56
|
+
tokens = value.squish.split(/(Blu-ray|DVD)/)
|
57
|
+
tokens = tokens.delete_if(&:empty?).map(&:squish)
|
58
|
+
case tokens.size
|
59
|
+
when 2,4
|
60
|
+
specs[key] = Hash[*tokens]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
specs
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|