1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- # frozen_string_literal: true
- require 'mime/types/columnar'
- module Paperclip
- class ImageExtractor < Paperclip::Processor
- def make
- return @file unless options[:style] == :original
- image = extract_image_from_file!
- unless image.nil?
- begin
- attachment.instance.thumbnail = image if image.size.positive?
- ensure
- # Paperclip does not automatically delete the source file of
- # a new attachment while working on copies of it, so we need
- # to make sure it's cleaned up
- begin
- image.close(true)
- rescue Errno::ENOENT
- nil
- end
- end
- end
- @file
- end
- private
- def extract_image_from_file!
- dst = Tempfile.new([File.basename(@file.path, '.*'), '.png'])
- dst.binmode
- begin
- command = Terrapin::CommandLine.new(Rails.configuration.x.ffmpeg_binary, '-i :source -loglevel :loglevel -y :destination', logger: Paperclip.logger)
- command.run(source: @file.path, destination: dst.path, loglevel: 'fatal')
- rescue Terrapin::ExitStatusError
- dst.close(true)
- return nil
- rescue Terrapin::CommandNotFoundError
- raise Paperclip::Errors::CommandNotFoundError, 'Could not run the `ffmpeg` command. Please install ffmpeg.'
- end
- dst
- end
- end
- end
|