refactor
This commit is contained in:
27
app/logical/downloads/rewrite_strategies/base.rb
Normal file
27
app/logical/downloads/rewrite_strategies/base.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class Base
|
||||
def self.strategies
|
||||
[Pixiv, NicoSeiga, Twitpic, DeviantArt, Tumblr, Moebooru]
|
||||
end
|
||||
|
||||
def rewrite(url, headers)
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def http_exists?(url, headers)
|
||||
exists = false
|
||||
uri = URI.parse(url)
|
||||
Net::HTTP.start(uri.host, uri.port) do |http|
|
||||
http.request_head(uri.request_uri, headers) do |res|
|
||||
if res.is_a?(Net::HTTPSuccess)
|
||||
exists = true
|
||||
end
|
||||
end
|
||||
end
|
||||
exists
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
37
app/logical/downloads/rewrite_strategies/deviant_art.rb
Normal file
37
app/logical/downloads/rewrite_strategies/deviant_art.rb
Normal file
@@ -0,0 +1,37 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class DeviantArt < Base
|
||||
def rewrite(url, headers)
|
||||
if url =~ /https?:\/\/(?:.+?\.)?deviantart\.(?:com|net)/
|
||||
url, headers = rewrite_html_pages(url, headers)
|
||||
url, headers = rewrite_thumbnails(url, headers)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def rewrite_html_pages(url, headers)
|
||||
if url =~ %r{^https?://.+?\.deviantart\.com/art/}
|
||||
source = ::Sources::Strategies::DeviantArt.new(url)
|
||||
source.get
|
||||
return [source.image_url, headers]
|
||||
else
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
|
||||
def rewrite_thumbnails(url, headers)
|
||||
if url =~ %r{^(https?://.+?\.deviantart\.net/.+?/)200H/}
|
||||
match = $1
|
||||
url.sub!(match + "200H/", match)
|
||||
elsif url =~ %r{^(https?://.+?\.deviantart\.net/.+?/)PRE/}
|
||||
match = $1
|
||||
url.sub!(match + "PRE/", match)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
26
app/logical/downloads/rewrite_strategies/moebooru.rb
Normal file
26
app/logical/downloads/rewrite_strategies/moebooru.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class Moebooru < Base
|
||||
DOMAINS = '(?:[^.]+\.)?yande\.re|konachan\.com'
|
||||
|
||||
def rewrite(url, headers)
|
||||
if url =~ %r{https?://(?:#{DOMAINS})}
|
||||
url, headers = rewrite_jpeg_versions(url, headers)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def rewrite_jpeg_versions(url, headers)
|
||||
# example: https://yande.re/jpeg/2c6876ac2317fce617e3c5f1a642123b/yande.re%20292092%20hatsune_miku%20tid%20vocaloid.jpg
|
||||
|
||||
if url =~ %r{\A(https?://(?:#{DOMAINS}))/jpeg/([a-f0-9]+(?:/.*)?)\.jpg\Z}
|
||||
url = $1 + "/image/" + $2 + ".png"
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
43
app/logical/downloads/rewrite_strategies/nico_seiga.rb
Normal file
43
app/logical/downloads/rewrite_strategies/nico_seiga.rb
Normal file
@@ -0,0 +1,43 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class NicoSeiga < Base
|
||||
def rewrite(url, headers)
|
||||
if url =~ %r{https?://lohas\.nicoseiga\.jp} || url =~ %r{https?://seiga\.nicovideo\.jp}
|
||||
url, headers = rewrite_headers(url, headers)
|
||||
url, headers = rewrite_html_pages(url, headers)
|
||||
url, headers = rewrite_thumbnails(url, headers)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def rewrite_headers(url, headers)
|
||||
headers["Referer"] = "http://seiga.nicovideo.jp"
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
def rewrite_html_pages(url, headers)
|
||||
# example: http://seiga.nicovideo.jp/seiga/im1389842
|
||||
|
||||
if url =~ %r{https?://seiga\.nicovideo\.jp/seiga/im\d+}
|
||||
source = ::Sources::Strategies::NicoSeiga.new(url)
|
||||
source.get
|
||||
return [source.image_url, headers]
|
||||
else
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
|
||||
def rewrite_thumbnails(url, headers)
|
||||
if url =~ %r{/thumb/\d+}
|
||||
source = ::Sources::Strategies::NicoSeiga.new(url)
|
||||
source.get
|
||||
return [source.image_url, headers]
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
78
app/logical/downloads/rewrite_strategies/pixiv.rb
Normal file
78
app/logical/downloads/rewrite_strategies/pixiv.rb
Normal file
@@ -0,0 +1,78 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class Pixiv < Base
|
||||
def rewrite(url, headers)
|
||||
if url =~ /https?:\/\/(?:\w+\.)?pixiv\.net/
|
||||
url, headers = rewrite_headers(url, headers)
|
||||
url, headers = rewrite_cdn(url, headers)
|
||||
url, headers = rewrite_html_pages(url, headers)
|
||||
url, headers = rewrite_thumbnails(url, headers)
|
||||
url, headers = rewrite_old_small_manga_pages(url, headers)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def rewrite_headers(url, headers)
|
||||
headers["Referer"] = "http://www.pixiv.net"
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
# Rewrite these:
|
||||
# http://www.pixiv.net/i/18557054
|
||||
# http://www.pixiv.net/member_illust.php?mode=medium&illust_id=18557054
|
||||
# http://www.pixiv.net/member_illust.php?mode=big&illust_id=18557054
|
||||
# http://www.pixiv.net/member_illust.php?mode=manga&illust_id=18557054
|
||||
# http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=18557054&page=1
|
||||
# Plus this:
|
||||
# i2.pixiv.net/img-inf/img/2014/09/25/00/57/24/46170939_64x64.jpg
|
||||
def rewrite_html_pages(url, headers)
|
||||
if url =~ /illust_id=\d+/i || url =~ %r!pixiv\.net/img-inf/img/!i
|
||||
source = ::Sources::Strategies::Pixiv.new(url)
|
||||
source.get
|
||||
return [source.image_url, headers]
|
||||
else
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
|
||||
# Rewrite these:
|
||||
# http://i2.pixiv.net/img04/img/syounen_no_uta/46170939_m.jpg
|
||||
# http://i1.pixiv.net/c/600x600/img-master/img/2014/09/24/23/25/08/46168376_p0_master1200.jpg
|
||||
def rewrite_thumbnails(url, headers)
|
||||
source = ::Sources::Strategies::Pixiv.new(url)
|
||||
url = source.rewrite_thumbnails(url)
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
# Rewrite these:
|
||||
# http://i2.pixiv.net/img04/img/syounen_no_uta/46170939_p0.jpg
|
||||
# http://img04.pixiv.net/img/syounen_no_uta/46170939_p0.jpg
|
||||
# but not these:
|
||||
# http://i2.pixiv.net/img04/img/syounen_no_uta/46170939_big_p0.jpg
|
||||
# http://i1.pixiv.net/c/600x600/img-master/img/2014/09/24/23/25/08/46168376_p0_master1200.jpg
|
||||
# http://i1.pixiv.net/img-original/img/2014/09/25/23/09/29/46183440_p0.jpg
|
||||
def rewrite_old_small_manga_pages(url, headers)
|
||||
if url !~ %r!/img-(?:original|master)/img/!i && url =~ %r!/(\d+_p\d+)\.!i
|
||||
match = $1
|
||||
repl = match.sub(/_p/, "_big_p")
|
||||
big_url = url.sub(match, repl)
|
||||
if http_exists?(big_url, headers)
|
||||
url = big_url
|
||||
end
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
def rewrite_cdn(url, headers)
|
||||
if url =~ %r{https?:\/\/(?:\w+\.)?pixiv\.net\.edgesuite\.net}
|
||||
url = url.sub(".edgesuite.net", "")
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
37
app/logical/downloads/rewrite_strategies/tumblr.rb
Normal file
37
app/logical/downloads/rewrite_strategies/tumblr.rb
Normal file
@@ -0,0 +1,37 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class Tumblr < Base
|
||||
def rewrite(url, headers)
|
||||
if url =~ %r{^https?://.*tumblr\.com}
|
||||
url, headers = rewrite_cdn(url, headers)
|
||||
url, headers = rewrite_thumbnails(url, headers)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def rewrite_thumbnails(url, headers)
|
||||
if url =~ %r{^http?://.+\.tumblr\.com/(?:\w+/)?(?:tumblr_)?(\w+_)(250|400|500)\..+$}
|
||||
match = $1
|
||||
given_size = $2
|
||||
|
||||
big_1280_url = url.sub(match + given_size, match + "1280")
|
||||
if http_exists?(big_1280_url, headers)
|
||||
return [big_1280_url, headers]
|
||||
end
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
def rewrite_cdn(url, headers)
|
||||
if url =~ %r{https?://gs1\.wac\.edgecastcdn\.net/8019B6/data\.tumblr\.com/}
|
||||
url.sub!("gs1.wac.edgecastcdn.net/8019B6/", "")
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
36
app/logical/downloads/rewrite_strategies/twitpic.rb
Normal file
36
app/logical/downloads/rewrite_strategies/twitpic.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
module Downloads
|
||||
module RewriteStrategies
|
||||
class Twitpic < Base
|
||||
def rewrite(url, headers)
|
||||
if url =~ %r{https?://twitpic\.com} || url =~ %r{^https?://d3j5vwomefv46c\.cloudfront\.net}
|
||||
url, headers = rewrite_html_pages(url, headers)
|
||||
url, headers = rewrite_thumbnails(url, headers)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
|
||||
protected
|
||||
def rewrite_html_pages(url, headers)
|
||||
# example: http://twitpic.com/cpprns
|
||||
|
||||
if url =~ %r{https?://twitpic\.com/([a-z0-9]+)$}
|
||||
id = $1
|
||||
url = "http://twitpic.com/show/full/#{id}"
|
||||
return [url, headers]
|
||||
else
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
|
||||
def rewrite_thumbnails(url, headers)
|
||||
if url =~ %r{^https?://d3j5vwomefv46c\.cloudfront\.net/photos/thumb/(\d+\..+)$}
|
||||
match = $1
|
||||
url.sub!("/thumb/" + match, "/large/" + match)
|
||||
end
|
||||
|
||||
return [url, headers]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user