about summary refs log blame commit diff
path: root/lib/paperclip/image_extractor.rb
blob: 17fe4326fdbf08d692c21c8b6c0b729ddb772891 (plain) (tree)
1
2
3
4
5
6
7
8
9




                                             

                                                      
                                      








                                                                       
                             






                              


                                

                                                                   
           

                                                                                                                                 
                       
                                                                                                                   


         
     
# 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('ffmpeg', '-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