This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
require "sinatra"
|
||||
require "mini_magick"
|
||||
require "digest"
|
||||
require "fileutils"
|
||||
require "tempfile"
|
||||
|
||||
MiniMagick.logger.level = Logger::DEBUG
|
||||
@@ -8,6 +10,26 @@ ROOT = ENV.fetch("ROOT")
|
||||
KEY = ENV.fetch("KEY")
|
||||
DITHER = ENV["DITHER"] != "0"
|
||||
FORMAT = "png"
|
||||
CACHE_DIR = ENV["DITHER_CACHE_DIR"]
|
||||
|
||||
def cache_path_for(path, geometry)
|
||||
return unless CACHE_DIR
|
||||
|
||||
source_path = "#{ROOT}/#{path}.enc"
|
||||
stat = File.stat(source_path)
|
||||
cache_key = Digest::SHA256.hexdigest([
|
||||
path,
|
||||
stat.size,
|
||||
stat.mtime.to_f,
|
||||
geometry,
|
||||
DITHER,
|
||||
FORMAT,
|
||||
1
|
||||
].join("\0"))
|
||||
|
||||
FileUtils.mkdir_p(CACHE_DIR)
|
||||
File.join(CACHE_DIR, "#{cache_key}.#{FORMAT}")
|
||||
end
|
||||
|
||||
get "/*" do |path|
|
||||
halt 404, {"Content-Type" => "text/plain"}, "not found" unless File.exist?("#{ROOT}/#{path}.enc")
|
||||
@@ -17,6 +39,11 @@ get "/*" do |path|
|
||||
geometry = params["geo"] unless params["geo"] == ""
|
||||
geometry.gsub!(/\d+/) { |n| n.to_i * 2 } if geometry && !DITHER
|
||||
|
||||
cached_path = cache_path_for(path, geometry)
|
||||
if cached_path && File.exist?(cached_path)
|
||||
return File.binread(cached_path)
|
||||
end
|
||||
|
||||
decrypted = Tempfile.new(["dither", File.extname(path)])
|
||||
decrypted.binmode
|
||||
decrypted.close
|
||||
@@ -59,7 +86,15 @@ get "/*" do |path|
|
||||
end
|
||||
|
||||
convert << "#{FORMAT.upcase}:-"
|
||||
convert.call
|
||||
output = convert.call
|
||||
|
||||
if cached_path
|
||||
temp_cache_path = "#{cached_path}.tmp-#{Process.pid}"
|
||||
File.binwrite(temp_cache_path, output)
|
||||
FileUtils.mv(temp_cache_path, cached_path)
|
||||
end
|
||||
|
||||
output
|
||||
ensure
|
||||
decrypted.unlink
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user