Convert GIFs to MP4s

This commit is contained in:
2023-06-24 13:28:50 +10:00
parent b270af04eb
commit 7818e2a54d
3 changed files with 41 additions and 7 deletions

View File

@@ -4,6 +4,7 @@ require "securerandom"
require "dry/monads"
require "filemagic"
require "image_processing/vips"
require "open3"
module Adamantium
module Commands
@@ -12,17 +13,50 @@ module Adamantium
include Deps["settings"]
include Dry::Monads[:result]
VALID_UPLOAD_TYPES = %i[jpeg jpg png gif]
IMAGE_TYPES = %i[jpeg jpg png].freeze
VIDEO_TYPES = %i[gif].freeze
VALID_UPLOAD_TYPES = IMAGE_TYPES + VIDEO_TYPES
def call(file:)
mime = FileMagic.new
type = mime.file(file[:tempfile].path, true)
type = mime.file(file[:tempfile].path, true).to_sym
return Failure(:invalid_file_type) unless VALID_UPLOAD_TYPES.include? type.to_sym
return Failure(:invalid_file_type) unless VALID_UPLOAD_TYPES.include? type
pathname = Time.now.strftime("%m-%Y")
uuid = SecureRandom.uuid
save_image(file: file) if IMAGE_TYPES.include? type
save_video(file: file) if VIDEO_TYPES.include? type
end
private
def pathname
Time.now.strftime("%m-%Y")
end
def uuid
SecureRandom.uuid
end
def save_video(file:)
fullsize_filename = "#{uuid}.mp4"
dirname = File.join("public", "media", pathname)
unless File.directory?(dirname)
FileUtils.mkdir_p(dirname)
end
begin
Open3.popen3("ffmpeg -i #{file[:tempfile].path} -movflags faststart -pix_fmt yuv420p -vf 'scale=trunc(iw/2)*2:trunc(ih/2)*2' #{File.join(dirname, fullsize_filename)}")
rescue Errno::ENOENT, NoMethodError => e
return Failure(e.message)
end
upload_path = File.join(settings.micropub_site_url, "/media/", "/#{pathname}/", fullsize_filename).to_s
Success(upload_path)
end
def save_image(file:)
fullsize_filename = "#{uuid}#{File.extname(file[:filename])}"
thumbnail_filename = "#{uuid}-small#{File.extname(file[:filename])}"