about summary refs log tree commit diff
path: root/lib/paperclip/image_extractor.rb
blob: 114852e8b97280daaa8dba6fa9a00f87a075207f (plain) (blame)
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
# frozen_string_literal: true

require 'mime/types/columnar'

module Paperclip
  class ImageExtractor < Paperclip::Processor
    IMAGE_EXTRACTION_OPTIONS = {
      convert_options: {
        output: {
          'loglevel' => 'fatal',
          vf: 'scale=\'min(400\, iw):min(400\, ih)\':force_original_aspect_ratio=decrease',
        }.freeze,
      }.freeze,
      format: 'png',
      time: -1,
      file_geometry_parser: FastGeometryParser,
    }.freeze

    def make
      return @file unless options[:style] == :original

      image = begin
        begin
          Paperclip::Transcoder.make(file, IMAGE_EXTRACTION_OPTIONS.dup, attachment)
        rescue Paperclip::Error, ::Av::CommandError
          nil
        end
      end

      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
            FileUtils.rm(image)
          rescue Errno::ENOENT
            nil
          end
        end
      end

      @file
    end
  end
end