diff --git a/app/logical/media_file.rb b/app/logical/media_file.rb index ffd023216..c28bf25a9 100644 --- a/app/logical/media_file.rb +++ b/app/logical/media_file.rb @@ -45,6 +45,10 @@ class MediaFile end end + def self.videos_enabled? + system("ffmpeg -version > /dev/null") && system("mkvmerge --version > /dev/null") + end + def initialize(file, **options) @file = file end diff --git a/app/logical/media_file/ugoira.rb b/app/logical/media_file/ugoira.rb index 615994719..b9477a9a7 100644 --- a/app/logical/media_file/ugoira.rb +++ b/app/logical/media_file/ugoira.rb @@ -2,10 +2,6 @@ class MediaFile::Ugoira < MediaFile class Error < StandardError; end attr_reader :frame_data - def self.conversion_enabled? - system("ffmpeg -version > /dev/null") && system("mkvmerge --version > /dev/null") - end - def initialize(file, frame_data: {}, **options) super(file, **options) @frame_data = frame_data @@ -31,7 +27,7 @@ class MediaFile::Ugoira < MediaFile # XXX should take width and height and resize image def convert - raise NotImplementedError, "can't convert ugoira to webm: ffmpeg or mkvmerge not installed" unless self.class.conversion_enabled? + raise NotImplementedError, "can't convert ugoira to webm: ffmpeg or mkvmerge not installed" unless self.class.videos_enabled? Dir.mktmpdir("ugoira-#{md5}") do |tmpdir| output_file = Tempfile.new(["ugoira-conversion", ".webm"], binmode: true) diff --git a/app/logical/media_file/video.rb b/app/logical/media_file/video.rb index 0639d78fe..eb4c42f1d 100644 --- a/app/logical/media_file/video.rb +++ b/app/logical/media_file/video.rb @@ -22,6 +22,8 @@ class MediaFile::Video < MediaFile private def video + raise NotImplementedError, "can't process videos: ffmpeg or mkvmerge not installed" unless self.class.videos_enabled? + FFMPEG::Movie.new(file.path) end diff --git a/test/unit/media_file_test.rb b/test/unit/media_file_test.rb index 0565a93a7..a7516198d 100644 --- a/test/unit/media_file_test.rb +++ b/test/unit/media_file_test.rb @@ -22,14 +22,17 @@ class MediaFileTest < ActiveSupport::TestCase end should "determine the correct dimensions for a webm file" do + skip unless MediaFile.videos_enabled? assert_equal([512, 512], MediaFile.open("test/files/test-512x512.webm").dimensions) end should "determine the correct dimensions for a mp4 file" do + skip unless MediaFile.videos_enabled? assert_equal([300, 300], MediaFile.open("test/files/test-300x300.mp4").dimensions) end should "determine the correct dimensions for a ugoira file" do + skip unless MediaFile.videos_enabled? assert_equal([60, 60], MediaFile.open("test/files/valid_ugoira.zip").dimensions) end @@ -42,6 +45,14 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal([500, 335], mf.dimensions) assert_equal([500, 335], mf.dimensions) + mf = MediaFile.open("test/files/compressed.swf") + assert_equal([607, 756], mf.dimensions) + assert_equal([607, 756], mf.dimensions) + end + + should "work for a video if called twice" do + skip unless MediaFile.videos_enabled? + mf = MediaFile.open("test/files/test-512x512.webm") assert_equal([512, 512], mf.dimensions) assert_equal([512, 512], mf.dimensions) @@ -49,10 +60,6 @@ class MediaFileTest < ActiveSupport::TestCase mf = MediaFile.open("test/files/valid_ugoira.zip") assert_equal([60, 60], mf.dimensions) assert_equal([60, 60], mf.dimensions) - - mf = MediaFile.open("test/files/compressed.swf") - assert_equal([607, 756], mf.dimensions) - assert_equal([607, 756], mf.dimensions) end end @@ -106,6 +113,10 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal([150, 101], MediaFile.open("test/files/test.jpg").preview(150, 150).dimensions) assert_equal([113, 150], MediaFile.open("test/files/test.png").preview(150, 150).dimensions) assert_equal([150, 150], MediaFile.open("test/files/test.gif").preview(150, 150).dimensions) + end + + should "generate a preview image for a video" do + skip unless MediaFile.videos_enabled? assert_equal([150, 150], MediaFile.open("test/files/test-512x512.webm").preview(150, 150).dimensions) assert_equal([150, 150], MediaFile.open("test/files/test-300x300.mp4").preview(150, 150).dimensions) end @@ -120,6 +131,10 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal([150, 150], MediaFile.open("test/files/test.jpg").crop(150, 150).dimensions) assert_equal([150, 150], MediaFile.open("test/files/test.png").crop(150, 150).dimensions) assert_equal([150, 150], MediaFile.open("test/files/test.gif").crop(150, 150).dimensions) + end + + should "generate a cropped preview image for a video" do + skip unless MediaFile.videos_enabled? assert_equal([150, 150], MediaFile.open("test/files/test-512x512.webm").crop(150, 150).dimensions) assert_equal([150, 150], MediaFile.open("test/files/test-300x300.mp4").crop(150, 150).dimensions) end @@ -127,7 +142,7 @@ class MediaFileTest < ActiveSupport::TestCase context "for a ugoira" do setup do - skip unless MediaFile::Ugoira.conversion_enabled? + skip unless MediaFile::Ugoira.videos_enabled? frame_data = JSON.parse(File.read("test/files/ugoira.json")) @ugoira = MediaFile.open("test/files/ugoira.zip", frame_data: frame_data) end diff --git a/test/unit/upload_service_test.rb b/test/unit/upload_service_test.rb index 71353ac21..6fcc32fd0 100644 --- a/test/unit/upload_service_test.rb +++ b/test/unit/upload_service_test.rb @@ -152,7 +152,7 @@ class UploadServiceTest < ActiveSupport::TestCase end should "download the file" do - skip unless MediaFile::Ugoira.conversion_enabled? + skip unless MediaFile::Ugoira.videos_enabled? @service = UploadService::Preprocessor.new(source: @source) begin @@ -548,7 +548,7 @@ class UploadServiceTest < ActiveSupport::TestCase context "a post that is replaced by a ugoira" do should "save the frame data" do - skip unless MediaFile::Ugoira.conversion_enabled? + skip unless MediaFile::Ugoira.videos_enabled? begin as_user { @post.replace!(replacement_url: "http://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364") } @post.reload @@ -569,7 +569,7 @@ class UploadServiceTest < ActiveSupport::TestCase context "a post that is replaced to another file then replaced back to the original file" do should "not delete the original files" do begin - skip unless MediaFile::Ugoira.conversion_enabled? + skip unless MediaFile::Ugoira.videos_enabled? @post.unstub(:queue_delete_files) # this is called thrice to delete the file for 62247364 @@ -611,7 +611,7 @@ class UploadServiceTest < ActiveSupport::TestCase # swap the images between @post1 and @post2. begin as_user do - skip unless MediaFile::Ugoira.conversion_enabled? + skip unless MediaFile::Ugoira.videos_enabled? @post1.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247350") @post2.replace!(replacement_url: "https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62247364")