2013-06-17 02:46:42 +02:00
require " digest/sha1 "
2013-06-16 10:39:48 +02:00
class OptimizedImage < ActiveRecord :: Base
belongs_to :upload
2013-07-08 01:39:08 +02:00
def self . create_for ( upload , width , height )
return unless width && height
2013-06-17 02:46:42 +02:00
@image_sorcery_loaded || = require " image_sorcery "
original_path = " #{ Rails . root } /public #{ upload . url } "
# create a temp file with the same extension as the original
temp_file = Tempfile . new ( [ " discourse " , File . extname ( original_path ) ] )
temp_path = temp_file . path
2013-07-08 01:39:08 +02:00
if ImageSorcery . new ( original_path ) . convert ( temp_path , resize : " #{ width } x #{ height } " )
2013-06-17 02:46:42 +02:00
thumbnail = OptimizedImage . new ( {
upload_id : upload . id ,
2013-06-17 04:02:17 +02:00
sha1 : Digest :: SHA1 . file ( temp_path ) . hexdigest ,
extension : File . extname ( temp_path ) ,
2013-07-08 01:39:08 +02:00
width : width ,
height : height
2013-06-17 02:46:42 +02:00
} )
# make sure the directory exists
FileUtils . mkdir_p Pathname . new ( thumbnail . path ) . dirname
# move the temp file to the right location
File . open ( thumbnail . path , " wb " ) do | f |
f . write temp_file . read
end
end
# close && remove temp file
temp_file . close
temp_file . unlink
thumbnail
2013-06-17 01:00:25 +02:00
end
2013-06-21 09:34:02 +02:00
def destroy
OptimizedImage . transaction do
remove_file
super
end
end
def remove_file
File . delete path
rescue Errno :: ENOENT
end
2013-06-17 01:00:25 +02:00
def url
2013-07-10 22:56:25 +02:00
" #{ LocalStore . base_url } / #{ optimized_path } / #{ filename } "
2013-06-17 01:00:25 +02:00
end
def path
2013-07-10 22:56:25 +02:00
" #{ LocalStore . base_path } / #{ optimized_path } / #{ filename } "
2013-06-17 01:00:25 +02:00
end
def optimized_path
2013-07-10 22:56:25 +02:00
" _optimized/ #{ sha1 [ 0 .. 2 ] } / #{ sha1 [ 3 .. 5 ] } "
2013-06-17 01:00:25 +02:00
end
2013-06-16 10:39:48 +02:00
def filename
2013-06-17 04:02:17 +02:00
" #{ sha1 [ 6 .. 16 ] } _ #{ width } x #{ height } #{ extension } "
2013-06-16 10:39:48 +02:00
end
2013-06-17 01:00:25 +02:00
2013-06-16 10:39:48 +02:00
end
2013-06-17 02:48:58 +02:00
# == Schema Information
#
# Table name: optimized_images
#
# id :integer not null, primary key
2013-06-17 04:02:17 +02:00
# sha1 :string(40) not null
# extension :string(10) not null
2013-06-17 02:48:58 +02:00
# width :integer not null
# height :integer not null
# upload_id :integer not null
#
# Indexes
#
# index_optimized_images_on_upload_id (upload_id)
# index_optimized_images_on_upload_id_and_width_and_height (upload_id,width,height) UNIQUE
#