From c0a803e3a6643f8834afd028bacdd917d0768522 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 17 Oct 2014 14:18:12 -0500 Subject: [PATCH] Allow ugoira to be uploaded directly from the zip URL. This refactors things such that * Fetching the ugoira frame data happens at the end of rewrite, not rewrite_html_pages. This way uploading zip URLs should work. * The source data is cached in an instance variable in case it was indeed fetched during rewrite_html_pages. This way it doesn't get fetched a second time. --- app/controllers/uploads_controller.rb | 2 +- app/logical/downloads/file.rb | 2 +- .../downloads/rewrite_strategies/base.rb | 4 ++ .../downloads/rewrite_strategies/pixiv.rb | 38 +++++++++++++------ 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index 4086851b1..fe35478f0 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -13,7 +13,7 @@ class UploadsController < ApplicationController "User-Agent" => "#{Danbooru.config.safe_app_name}/#{Danbooru.config.version}" } Downloads::RewriteStrategies::Base.strategies.each do |strategy| - @normalized_url, headers = strategy.new.rewrite(@normalized_url, headers) + @normalized_url, headers = strategy.new(@normalized_url).rewrite(@normalized_url, headers) end @post = Post.find_by_source(@normalized_url) diff --git a/app/logical/downloads/file.rb b/app/logical/downloads/file.rb index 807e2df70..4d104bbfd 100644 --- a/app/logical/downloads/file.rb +++ b/app/logical/downloads/file.rb @@ -29,7 +29,7 @@ module Downloads def before_download(url, headers, datums) RewriteStrategies::Base.strategies.each do |strategy| - url, headers, datums = strategy.new.rewrite(url, headers, datums) + url, headers, datums = strategy.new(url).rewrite(url, headers, datums) end return [url, headers, datums] diff --git a/app/logical/downloads/rewrite_strategies/base.rb b/app/logical/downloads/rewrite_strategies/base.rb index feffca3ab..f1cabd7c2 100644 --- a/app/logical/downloads/rewrite_strategies/base.rb +++ b/app/logical/downloads/rewrite_strategies/base.rb @@ -1,6 +1,10 @@ module Downloads module RewriteStrategies class Base + def initialize(url = nil) + @url = url + end + def self.strategies [Pixiv, NicoSeiga, Twitpic, DeviantArt, Tumblr, Moebooru] end diff --git a/app/logical/downloads/rewrite_strategies/pixiv.rb b/app/logical/downloads/rewrite_strategies/pixiv.rb index b4fed9783..46b1c3134 100644 --- a/app/logical/downloads/rewrite_strategies/pixiv.rb +++ b/app/logical/downloads/rewrite_strategies/pixiv.rb @@ -1,15 +1,26 @@ module Downloads module RewriteStrategies class Pixiv < Base + attr_accessor :url, :source + + def initialize(url) + @url = url + end + def rewrite(url, headers, data = {}) if url =~ /https?:\/\/(?:\w+\.)?pixiv\.net/ url, headers = rewrite_headers(url, headers) url, headers = rewrite_cdn(url, headers) - url, headers, data = rewrite_html_pages(url, headers, data) + url, headers = rewrite_html_pages(url, headers) url, headers = rewrite_thumbnails(url, headers) url, headers = rewrite_old_small_manga_pages(url, headers) end + data[:ugoira_frame_data] = source.ugoira_frame_data + data[:ugoira_width] = source.ugoira_width + data[:ugoira_height] = source.ugoira_height + data[:ugoira_content_type] = source.ugoira_content_type + return [url, headers, data] end @@ -27,17 +38,11 @@ module Downloads # 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, data) + 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 - data[:ugoira_frame_data] = source.ugoira_frame_data - data[:ugoira_width] = source.ugoira_width - data[:ugoira_height] = source.ugoira_height - data[:ugoira_content_type] = source.ugoira_content_type - return [source.file_url, headers, data] + return [source.file_url, headers] else - return [url, headers, data] + return [url, headers] end end @@ -45,8 +50,7 @@ module Downloads # 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) + url = source.rewrite_thumbnails(url) return [url, headers] end @@ -77,6 +81,16 @@ module Downloads return [url, headers] end + + # Cache the source data so it gets fetched at most once. + def source + @source ||= begin + source = ::Sources::Strategies::Pixiv.new(url) + source.get + + source + end + end end end end