module Sinatra::Thumbnails

Public Class Methods

convert(src, dest, format) click to toggle source
# File lib/sinatra/thumbnails.rb, line 49
def self.convert(src, dest, format)
  if (format =~ /(.*)-crop$/) 
    if (im_version <=> [6,6,4]) >= 0
      format = $1 + "^" + " -gravity center -extent " + $1
    else
      format = $1
    end
  end
  FileUtils.mkdir_p(File.dirname(dest))
  command = "#{Sinatra::Thumbnails.settings.convert_executable} -define jpeg:size=400x400 '#{src}' -thumbnail #{format} '#{dest}'"
  # puts "Sinatra::Thumbnails: issuing \"#{command}\""
  run_command(command)
end
ffmpeg(src, dest, format) click to toggle source
# File lib/sinatra/thumbnails.rb, line 63
def self.ffmpeg(src, dest, format)
  puts "making movie thumb on the fly"
  seconds = (src =~ /\.ss([\d]+)/) ? Regexp.last_match(1).to_i : 0 
  command = "#{Sinatra::Thumbnails.settings.ffmpeg_executable} -y -i '#{src}' -an -ss #{seconds} -r 1 -vframes 1 -f mjpeg  '#{dest}'"
  # puts "Sinatra::Thumbnails: issuing \"#{command}\""
  run_command(command)
  convert(dest, dest, format)
end
im_version() click to toggle source
# File lib/sinatra/thumbnails.rb, line 44
def self.im_version
  `convert --version` =~ /Version: ImageMagick ([\d\.]+)/
  Regexp.last_match(1).split('.').map{|s|s.to_i}
end
make_thumb(file, format, original_extension) click to toggle source
# File lib/sinatra/thumbnails.rb, line 27
def self.make_thumb(file, format, original_extension)
  original_extension ||= "jpg"
  thumbnail_file = File.join(settings.thumbnail_path, "#{format}/#{file}")
  FileUtils.mkdir_p File.dirname(thumbnail_file)
  orig_file = File.join(settings.image_path_prefix, file.gsub(/(.*\.)(.*$)/,"\\1#{original_extension}"))

  unless File.exists?(thumbnail_file) and (File.stat(thumbnail_file).mtime >= File.stat(orig_file).mtime)
    
    if original_extension =~ /mov$/
      ffmpeg(orig_file, thumbnail_file, format)
    else
      convert(orig_file, thumbnail_file, format)
    end
  end
  thumbnail_file
end
registered(app) click to toggle source
# File lib/sinatra/thumbnails.rb, line 95
def self.registered(app)
  app.helpers Helpers

  # gotta make this a regexp, :asset wont match stuff with "/" in it
  app.get /#{settings.thumbnail_path}\/([^\/]+)\/(.*)$/ do
      send_file Thumbnails.make_thumb(params[:captures][1], params[:captures][0], params[:original_extension])
  end
end
run_command(command) click to toggle source
# File lib/sinatra/thumbnails.rb, line 72
def self.run_command(command)
  output = `#{command} 2>&1`
  raise "couldn't run #{command}: #{output}" unless $?.success?
end
settings() click to toggle source
# File lib/sinatra/thumbnails.rb, line 78
def self.settings
  @@settings ||= { :convert_executable  => 'convert'     ,   
                   :ffmpeg_executable   => 'ffmpeg'      ,   
                   :thumbnail_path      => 'public/thumbnails'  ,
                   :image_path_prefix   => 'public'             ,
                   :thumbnail_extension => 'png'         ,   
                   :thumbnail_format    => '100x100'       }.extend(Thumbnails::Settings) 
end