diff --git a/app/logical/downloads/file.rb b/app/logical/downloads/file.rb index 8b5b1e661..e77e6d0a7 100644 --- a/app/logical/downloads/file.rb +++ b/app/logical/downloads/file.rb @@ -30,6 +30,10 @@ module Downloads def after_download fix_image_board_sources end + + def url + URI.parse(source) + end def http_get_streaming(options = {}) max_size = options[:max_size] || Danbooru.config.max_file_size @@ -37,19 +41,17 @@ module Downloads limit = 4 while true - url = URI.parse(source) - unless url.is_a?(URI::HTTP) raise Error.new("URL must be HTTP") end + headers = { + "User-Agent" => "#{Danbooru.config.safe_app_name}/#{Danbooru.config.version}" + } + @source, headers = before_download(source, headers) + Net::HTTP.start(url.host, url.port) do |http| http.read_timeout = 10 - headers = { - "User-Agent" => "#{Danbooru.config.safe_app_name}/#{Danbooru.config.version}" - } - @source, headers = before_download(@source, headers) - url = URI.parse(source) http.request_get(url.request_uri, headers) do |res| case res when Net::HTTPSuccess then diff --git a/app/logical/downloads/strategies/pixiv.rb b/app/logical/downloads/strategies/pixiv.rb index 2409575dc..dfce088fa 100644 --- a/app/logical/downloads/strategies/pixiv.rb +++ b/app/logical/downloads/strategies/pixiv.rb @@ -4,6 +4,7 @@ module Downloads def rewrite(url, headers) if url =~ /https?:\/\/(?:\w+\.)?pixiv\.net/ url, headers = rewrite_headers(url, headers) + url, headers = rewrite_html_pages(url, headers) url, headers = rewrite_small_images(url, headers) url, headers = rewrite_small_manga_pages(url, headers) end @@ -17,6 +18,18 @@ module Downloads return [url, headers] end + def rewrite_html_pages(url, headers) + # example: http://www.pixiv.net/member_illust.php?mode=big&illust_id=23828655 + + if url =~ %r!illust_id=\d+! + source = ::Sources::Strategies::Pixiv.new(url) + source.get + return [source.image_url, headers] + else + return [url, headers] + end + end + def rewrite_small_images(url, headers) if url =~ %r!(/img/.+?/.+?)_m.+$! match = $1 diff --git a/test/unit/downloads/pixiv_test.rb b/test/unit/downloads/pixiv_test.rb index 3e3654dcb..5b5f17784 100644 --- a/test/unit/downloads/pixiv_test.rb +++ b/test/unit/downloads/pixiv_test.rb @@ -15,6 +15,20 @@ module Downloads end end + context "a download for a html page" do + setup do + @source = "http://www.pixiv.net/member_illust.php?mode=big&illust_id=23828655" + @source = "http://www.pixiv.net/member_illust.php?mode=big&illust_id=4348318" + @tempfile = Tempfile.new("danbooru-test") + @download = Downloads::File.new(@source, @tempfile.path) + @download.download! + end + + should "work" do + assert_equal(185778, ::File.size(@tempfile.path)) + end + end + context "a download for a small image" do setup do @source = "http://img02.pixiv.net/img/wanwandoh/4348318_m.jpg"