From 99807580d56cea9b0c83778eff8e28450f2bdef9 Mon Sep 17 00:00:00 2001 From: Albert Yi Date: Tue, 3 Jul 2018 16:37:53 -0700 Subject: [PATCH] add cropped support for video uploads --- app/logical/upload_service.rb | 10 ++++++++- test/models/upload_service_test.rb | 34 ++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/app/logical/upload_service.rb b/app/logical/upload_service.rb index 354aedc41..cd8ea784f 100644 --- a/app/logical/upload_service.rb +++ b/app/logical/upload_service.rb @@ -130,7 +130,7 @@ class UploadService def self.generate_resizes(file, upload) if upload.is_video? video = FFMPEG::Movie.new(file.path) - crop_file = generate_video_preview_for(video, Danbooru.config.small_image_width, Danbooru.config.small_image_width) + crop_file = generate_video_crop_for(video, Danbooru.config.small_image_width) preview_file = generate_video_preview_for(video, Danbooru.config.small_image_width, Danbooru.config.small_image_width) elsif upload.is_ugoira? @@ -149,6 +149,14 @@ class UploadService [preview_file, crop_file, sample_file] end + def self.generate_video_crop_for(video, width) + vp = Tempfile.new(["video-preview", ".jpg"], binmode: true) + video.screenshot(vp.path, {:seek_time => 0, :resolution => "#{video.width}x#{video.height}"}) + crop = DanbooruImageResizer.crop(vp, width, 85) + vp.close + return crop + end + def self.generate_video_preview_for(video, width, height) dimension_ratio = video.width.to_f / video.height if dimension_ratio > 1 diff --git a/test/models/upload_service_test.rb b/test/models/upload_service_test.rb index f900aab2a..3865ac59e 100644 --- a/test/models/upload_service_test.rb +++ b/test/models/upload_service_test.rb @@ -162,9 +162,14 @@ class UploadServiceTest < ActiveSupport::TestCase end should "generate a preview and a video" do - preview, sample = subject.generate_resizes(@file, @upload) + preview, crop, sample = subject.generate_resizes(@file, @upload) assert_operator(File.size(preview.path), :>, 0) + assert_operator(File.size(crop.path), :>, 0) assert_operator(File.size(sample.path), :>, 0) + assert_equal(60, ImageSpec.new(preview.path).width) + assert_equal(60, ImageSpec.new(preview.path).height) + assert_equal(150, ImageSpec.new(crop.path).width) + assert_equal(150, ImageSpec.new(crop.path).height) preview.close preview.unlink sample.close @@ -186,10 +191,17 @@ class UploadServiceTest < ActiveSupport::TestCase end should "generate a video" do - preview, sample = subject.generate_resizes(@file, @upload) + preview, crop, sample = subject.generate_resizes(@file, @upload) assert_operator(File.size(preview.path), :>, 0) + assert_operator(File.size(crop.path), :>, 0) + assert_equal(150, ImageSpec.new(preview.path).width) + assert_equal(150, ImageSpec.new(preview.path).height) + assert_equal(150, ImageSpec.new(crop.path).width) + assert_equal(150, ImageSpec.new(crop.path).height) preview.close preview.unlink + crop.close + crop.unlink end end @@ -202,10 +214,17 @@ class UploadServiceTest < ActiveSupport::TestCase end should "generate a video" do - preview, sample = subject.generate_resizes(@file, @upload) + preview, crop, sample = subject.generate_resizes(@file, @upload) assert_operator(File.size(preview.path), :>, 0) + assert_operator(File.size(crop.path), :>, 0) + assert_equal(150, ImageSpec.new(preview.path).width) + assert_equal(150, ImageSpec.new(preview.path).height) + assert_equal(150, ImageSpec.new(crop.path).width) + assert_equal(150, ImageSpec.new(crop.path).height) preview.close preview.unlink + crop.close + crop.unlink end end end @@ -230,8 +249,9 @@ class UploadServiceTest < ActiveSupport::TestCase end should "generate a preview" do - preview, sample = subject.generate_resizes(@file, @upload) + preview, crop, sample = subject.generate_resizes(@file, @upload) assert_operator(File.size(preview.path), :>, 0) + assert_operator(File.size(crop.path), :>, 0) assert_operator(File.size(sample.path), :>, 0) preview.close preview.unlink @@ -246,8 +266,9 @@ class UploadServiceTest < ActiveSupport::TestCase end should "generate a preview" do - preview, sample = subject.generate_resizes(@file, @upload) + preview, crop, sample = subject.generate_resizes(@file, @upload) assert_operator(File.size(preview.path), :>, 0) + assert_operator(File.size(crop.path), :>, 0) assert_operator(File.size(sample.path), :>, 0) preview.close preview.unlink @@ -262,8 +283,9 @@ class UploadServiceTest < ActiveSupport::TestCase end should "generate a preview" do - preview, sample = subject.generate_resizes(@file, @upload) + preview, crop, sample = subject.generate_resizes(@file, @upload) assert_operator(File.size(preview.path), :>, 0) + assert_operator(File.size(crop.path), :>, 0) assert_operator(File.size(sample.path), :>, 0) preview.close preview.unlink