diff --git a/script/downsize_uploads.rb b/script/downsize_uploads.rb new file mode 100644 index 00000000000..0239008a1a4 --- /dev/null +++ b/script/downsize_uploads.rb @@ -0,0 +1,31 @@ +require File.expand_path("../../config/environment", __FILE__) + +# no less than 1 megapixel +max_image_pixels = [ARGV[0].to_i, 1_000_000].max + +puts '', "Downsizing uploads size to no more than #{max_image_pixels} pixels" + +Upload.where("lower(extension) in (?)", ['jpg', 'gif', 'png']).find_each do |upload| + absolute_path = Discourse.store.path_for(upload) + if absolute_path && FileHelper.is_image?(upload.original_filename) + file = File.new(absolute_path) rescue nil + next unless file + + image_info = FastImage.new(file) rescue nil + pixels = image_info.size&.reduce(:*).to_i + + if pixels > max_image_pixels + OptimizedImage.downsize(file.path, file.path, "#{max_image_pixels}@", filename: upload.original_filename) + + upload.filesize = File.size(file) + upload.width, upload.height = ImageSizer.resize(*FastImage.new(file).size) + upload.save! + + upload.posts.each do |post| + Jobs.enqueue(:process_post, post_id: post.id, bypass_bump: true, cook: true) + end + end + end +end + +puts '', 'Done', ''