Files
danbooru/app/logical/upload_service/preprocessor.rb
nonamethanks 26a6335c41 Uploads: get rid of same-source existence check
Remove the lines that checked for existing upload with the same source.
These lines were breaking replacements in many cases, so we had to
always empty the post's source before replacing, and they served no
purpose since the md5 check already catches duplicate uploads.
2020-12-14 16:41:06 +01:00

110 lines
2.6 KiB
Ruby

class UploadService
class Preprocessor
extend Memoist
attr_reader :params, :original_post_id
def initialize(params)
@original_post_id = params.delete(:original_post_id) || -1
@params = params
end
def source
params[:source]
end
def md5
params[:md5_confirmation]
end
def referer_url
params[:referer_url]
end
def strategy
Sources::Strategies.find(source, referer_url)
end
memoize :strategy
# When searching posts we have to use the canonical source
def canonical_source
strategy.canonical_url
end
memoize :canonical_source
def in_progress?
if md5.present?
return Upload.where(status: "preprocessing", md5: md5).exists?
end
if Utils.is_downloadable?(source)
return Upload.where(status: "preprocessing", source: source).exists?
end
false
end
def predecessor
if md5.present?
Upload.where(status: ["preprocessed", "preprocessing"], md5: md5).first
elsif Utils.is_downloadable?(source)
Upload.where(status: ["preprocessed", "preprocessing"], source: source).first
end
end
def completed?
predecessor.present?
end
def delayed_start(uploader_id)
CurrentUser.as(uploader_id) do
start!
end
rescue ActiveRecord::RecordNotUnique
end
def start!
raise NotImplementedError, "No login credentials configured for #{strategy.site_name}." unless strategy.class.enabled?
params[:rating] ||= "q"
params[:tag_string] ||= "tagme"
upload = Upload.create!(params)
begin
upload.update(status: "preprocessing")
file = Utils.get_file_for_upload(upload, file: params[:file]&.tempfile)
Utils.process_file(upload, file, original_post_id: original_post_id)
upload.rating = params[:rating]
upload.tag_string = params[:tag_string]
upload.status = "preprocessed"
upload.save!
rescue Exception => e
upload.update(file_ext: nil, status: "error: #{e.class} - #{e.message}", backtrace: e.backtrace.join("\n"))
end
upload
end
def finish!(upload = nil)
pred = upload || predecessor
# regardless of who initialized the upload, credit should
# goto whoever submitted the form
pred.initialize_attributes
pred.attributes = params
# if a file was uploaded after the preprocessing occurred,
# then process the file and overwrite whatever the preprocessor
# did
Utils.process_file(pred, pred.file.tempfile) if pred.file.present?
pred.status = "completed"
pred.save
pred
end
end
end