summaryrefslogtreecommitdiffstats
path: root/lib/paperclip/image_extractor.rb
blob: aab675a060f0b2a5a063e9f2d866f260d16b3ca8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 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!
      ::Av.logger = Paperclip.logger

      cli = ::Av.cli
      dst = Tempfile.new([File.basename(@file.path, '.*'), '.png'])
      dst.binmode

      cli.add_source(@file.path)
      cli.add_destination(dst.path)
      cli.add_output_param loglevel: 'fatal'

      begin
        cli.run
      rescue Cocaine::ExitStatusError, ::Av::CommandError
        dst.close(true)
        return nil
      end

      dst
    end
  end
end