Module: Redmine::Thumbnail

Extended by:
Utils::Shell
Defined in:
lib/redmine/thumbnail.rb

Constant Summary collapse

CONVERT_BIN =
(Redmine::Configuration['imagemagick_convert_command'] || 'convert').freeze
GS_BIN =
(Redmine::Configuration['gs_command'] || 'gs').freeze
ALLOWED_TYPES =
%w(image/bmp image/gif image/jpeg image/png application/pdf)

Class Method Summary collapse

Methods included from Utils::Shell

shell_quote, shell_quote_command

Class Method Details

.convert_available?Boolean

Returns:

  • (Boolean)

64
65
66
67
68
69
70
71
72
73
74
# File 'lib/redmine/thumbnail.rb', line 64

def self.convert_available?
  return @convert_available if defined?(@convert_available)
  begin
    `#{shell_quote CONVERT_BIN} -version`
    @convert_available = $?.success?
  rescue
    @convert_available = false
  end
  logger.warn("Imagemagick's convert binary (#{CONVERT_BIN}) not available") unless @convert_available
  @convert_available
end

.generate(source, target, size, is_pdf = false) ⇒ Object

Generates a thumbnail for the source image to target


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/redmine/thumbnail.rb', line 32

def self.generate(source, target, size, is_pdf = false)
  return nil unless convert_available?
  return nil if is_pdf && !gs_available?
  unless File.exists?(target)
    mime_type = File.open(source) {|f| MimeMagic.by_magic(f).try(:type) }
    return nil if mime_type.nil?
    return nil if !ALLOWED_TYPES.include? mime_type
    return nil if is_pdf && mime_type != "application/pdf"

    # Make sure we only invoke Imagemagick if the file type is allowed
    unless File.open(source) {|f| ALLOWED_TYPES.include? MimeMagic.by_magic(f).try(:type) }
      return nil
    end
    directory = File.dirname(target)
    unless File.exists?(directory)
      FileUtils.mkdir_p directory
    end
    size_option = "#{size}x#{size}>"

    if is_pdf
      cmd = "#{shell_quote CONVERT_BIN} #{shell_quote "#{source}[0]"} -thumbnail #{shell_quote size_option} #{shell_quote "png:#{target}"}"
    else
      cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -auto-orient -thumbnail #{shell_quote size_option} #{shell_quote target}"
    end
    unless system(cmd)
      logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}")
      return nil
    end
  end
  target
end

.gs_available?Boolean

Returns:

  • (Boolean)

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/redmine/thumbnail.rb', line 76

def self.gs_available?
  return @gs_available if defined?(@gs_available)

  if Redmine::Platform.mswin?
    @gs_available = false
  else
    begin
      `#{shell_quote GS_BIN} -version`
      @gs_available = $?.success?
    rescue
      @gs_available = false
    end
  end
  logger.warn("gs binary (#{GS_BIN}) not available") unless @gs_available
  @gs_available
end

.loggerObject


93
94
95
# File 'lib/redmine/thumbnail.rb', line 93

def self.logger
  Rails.logger
end