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'] ||
  ('gswin64c' if Redmine::Platform.mswin?) ||
  '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
75
# 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


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 35

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)
    # Make sure we only invoke Imagemagick if the file type is allowed
    mime_type = File.open(source) {|f| Marcel::MimeType.for(f)}
    return nil if !ALLOWED_TYPES.include? mime_type
    return nil if is_pdf && mime_type != "application/pdf"

    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)

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

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

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

.loggerObject


90
91
92
# File 'lib/redmine/thumbnail.rb', line 90

def self.logger
  Rails.logger
end