| 
									
										
										
										
											2020-06-29 11:56:55 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'mime/types/columnar' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Paperclip | 
					
						
							|  |  |  |   class ImageExtractor < Paperclip::Processor | 
					
						
							|  |  |  |     def make | 
					
						
							|  |  |  |       return @file unless options[:style] == :original | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-30 21:58:02 +00:00
										 |  |  |       image = extract_image_from_file! | 
					
						
							| 
									
										
										
										
											2020-06-29 11:56:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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 | 
					
						
							| 
									
										
										
										
											2020-06-30 21:58:02 +00:00
										 |  |  |             image.close(true) | 
					
						
							| 
									
										
										
										
											2020-06-29 11:56:55 +00:00
										 |  |  |           rescue Errno::ENOENT | 
					
						
							|  |  |  |             nil | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @file | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-06-30 21:58:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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 | 
					
						
							| 
									
										
										
										
											2020-07-03 01:05:32 +00:00
										 |  |  |       rescue Cocaine::ExitStatusError, ::Av::CommandError | 
					
						
							| 
									
										
										
										
											2020-06-30 21:58:02 +00:00
										 |  |  |         dst.close(true) | 
					
						
							|  |  |  |         return nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dst | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-06-29 11:56:55 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | end |