| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  | # Redmine - project management software | 
					
						
							| 
									
										
										
										
											2016-03-13 10:30:10 +00:00
										 |  |  | # Copyright (C) 2006-2016  Jean-Philippe Lang | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | # as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | # of the License, or (at your option) any later version. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | # along with this program; if not, write to the Free Software | 
					
						
							|  |  |  | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'fileutils' | 
					
						
							| 
									
										
										
										
											2016-05-04 18:05:54 +00:00
										 |  |  | require 'mimemagic' | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Redmine | 
					
						
							|  |  |  |   module Thumbnail | 
					
						
							|  |  |  |     extend Redmine::Utils::Shell | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-16 17:37:24 +00:00
										 |  |  |     CONVERT_BIN = (Redmine::Configuration['imagemagick_convert_command'] || 'convert').freeze | 
					
						
							| 
									
										
										
										
											2016-12-20 08:52:26 +00:00
										 |  |  |     ALLOWED_TYPES = %w(image/bmp image/gif image/jpeg image/png) | 
					
						
							| 
									
										
										
										
											2012-07-16 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  |     # Generates a thumbnail for the source image to target | 
					
						
							|  |  |  |     def self.generate(source, target, size) | 
					
						
							| 
									
										
										
										
											2012-07-16 17:37:24 +00:00
										 |  |  |       return nil unless convert_available? | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  |       unless File.exists?(target) | 
					
						
							| 
									
										
										
										
											2016-12-20 08:52:26 +00:00
										 |  |  |         # 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) } | 
					
						
							| 
									
										
										
										
											2016-05-04 18:05:54 +00:00
										 |  |  |           return nil | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  |         directory = File.dirname(target) | 
					
						
							|  |  |  |         unless File.exists?(directory) | 
					
						
							|  |  |  |           FileUtils.mkdir_p directory | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         size_option = "#{size}x#{size}>" | 
					
						
							| 
									
										
										
										
											2012-07-16 17:37:24 +00:00
										 |  |  |         cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -thumbnail #{shell_quote size_option} #{shell_quote target}" | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  |         unless system(cmd) | 
					
						
							|  |  |  |           logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}") | 
					
						
							|  |  |  |           return nil | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       target | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-16 17:37:24 +00:00
										 |  |  |     def self.convert_available? | 
					
						
							|  |  |  |       return @convert_available if defined?(@convert_available) | 
					
						
							|  |  |  |       @convert_available = system("#{shell_quote CONVERT_BIN} -version") rescue false | 
					
						
							|  |  |  |       logger.warn("Imagemagick's convert binary (#{CONVERT_BIN}) not available") unless @convert_available | 
					
						
							|  |  |  |       @convert_available | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-07 13:48:07 +00:00
										 |  |  |     def self.logger | 
					
						
							|  |  |  |       Rails.logger | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |