lib/contact_sheet.rb in vcs_ruby-0.8.4 vs lib/contact_sheet.rb in vcs_ruby-0.8.5
- old
+ new
@@ -7,24 +7,24 @@
require 'yaml'
require 'vcs'
module VCSRuby
- class ContactSheet
+ class ContactSheet
attr_accessor :capturer, :format, :signature, :title, :highlight
attr_reader :thumbnail_width, :thumbnail_height
attr_reader :length, :from, :to
-
+
def initialize video, capturer = :any
@capturer = capturer
@configuration = Configuration.new
@signature = "Created by Video Contact Sheet Ruby"
initialize_capturers video
initialize_filename(File.basename(@video, '.*'))
puts "Processing #{File.basename(video)}..." unless Tools.quiet?
detect_video_properties
-
+
@thumbnails = []
@tempdir = Dir.mktmpdir
ObjectSpace.define_finalizer(self, self.class.finalize(@tempdir) )
@@ -54,11 +54,11 @@
@rows = rows
@columns = columns
@interval = interval
end
- def rows
+ def rows
@rows
end
def columns
@columns
@@ -103,23 +103,23 @@
@to = time
else
raise "Invalid To Time"
end
end
-
+
def self.finalize(tempdir)
proc do
puts "Cleaning up..." unless Tools.quiet?
FileUtils.rm_r tempdir
end
end
def build
initialize_thumbnails
capture_thumbnails
-
+
puts "Composing standard contact sheet..." unless Tools.quiet?
s = splice_montage(montage_thumbs)
image = MiniMagick::Image.open(s)
@@ -133,29 +133,32 @@
private
def selected_capturer
result = nil
if @capturer == nil || @capturer == :any
- result = @capturers.first
+ result = available_capturers.first
else
- result = @capturers.select{ |c| c.name == @capturer }.first
+ result = available_capturers.select{ |c| c.name == @capturer }.first
end
- raise "Selected Capturer (#{@capturer.to_s}) not available" unless result
+ raise "Selected Capturer (#{@capturer.to_s}) not available. Install one of these: #{@capturers.map{ |c| c.name }.join(', ')}" unless result
return result
end
def initialize_capturers video
- capturers = []
- capturers << LibAV.new(video)
- capturers << MPlayer.new(video)
- capturers << FFmpeg.new(video)
+ @capturers = []
+ @capturers << LibAV.new(video)
+ @capturers << MPlayer.new(video)
+ @capturers << FFmpeg.new(video)
@video = video
- @capturers = capturers.select{ |c| c.available? }
- puts "Available capturers: #{@capturers.map{ |c| c.to_s }.join(', ')}" if Tools.verbose?
+ puts "Available capturers: #{available_capturers.map{ |c| c.to_s }.join(', ')}" if Tools.verbose?
end
+
+ def available_capturers
+ @capturers.select{ |c| c.available? }
+ end
def initialize_thumbnails
time = @from
(1..number_of_caps).each do |i|
thumb = Thumbnail.new selected_capturer, @video, @configuration
@@ -207,34 +210,36 @@
@thumbnails.each do |thumbnail|
montage << thumbnail.image_path
end
montage.geometry "+#{@configuration.padding}+#{@configuration.padding}"
# rows or columns can be nil (auto fit)
- montage.tile "#{@columns}x#{@rows}"
+ montage.tile "#{@columns}x#{@rows}"
montage << file_path
end
return file_path
end
def splice_montage montage_path
file_path = File::join(@tempdir, 'spliced.png')
MiniMagick::Tool::Convert.new do |convert|
convert << montage_path
convert.background @configuration.contact_background
- convert.splice '5x10'
+ convert.splice '5x10'
convert << file_path
- end
+ end
file_path
end
def create_title montage
file_path = File::join(@tempdir, 'title.png')
MiniMagick::Tool::Convert.new do |convert|
convert.stack do |ul|
ul.size "#{montage.width}x#{@configuration.title_font.line_height}"
ul.xc @configuration.title_background
- ul.font @configuration.title_font.path
+ if @configuration.title_font.exists?
+ ul.font @configuration.title_font.path
+ end
ul.pointsize @configuration.title_font.size
ul.background @configuration.title_background
ul.fill @configuration.title_color
ul.gravity 'Center'
ul.annotate(0, @title)
@@ -283,23 +288,29 @@
MiniMagick::Tool::Convert.new do |convert|
convert.stack do |a|
a.size "#{montage.width - 18}x1"
a.xc @configuration.header_background
a.size.+
- a.font @configuration.header_font.path
+ if @configuration.header_font.exists?
+ a.font @configuration.header_font.path
+ end
a.pointsize @configuration.header_font.size
a.background @configuration.header_background
a.fill 'Black'
a.stack do |b|
b.gravity 'West'
b.stack do |c|
c.label 'Filename: '
- c.font @configuration.header_font.path
+ if @configuration.header_font.exists?
+ c.font @configuration.header_font.path
+ end
c.label File.basename(@video)
c.append.+
end
- b.font @configuration.header_font.path
+ if @configuration.header_font.exists?
+ b.font @configuration.header_font.path
+ end
b.label "File size: #{Tools.to_human_size(File.size(@video))}"
b.label "Length: #{@length.to_timestamp}"
b.append
b.crop "#{montage.width}x#{header_height}+0+0"
end
@@ -321,10 +332,12 @@
if @signature
convert.stack do |a|
a.size "#{montage.width}x#{signature_height}"
a.gravity 'Center'
a.xc @configuration.signature_background
- a.font @configuration.signature_font.path
+ if @configuration.signature_font.exists?
+ a.font @configuration.signature_font.path
+ end
a.pointsize @configuration.signature_font.size
a.fill @configuration.signature_color
a.annotate(0, @signature)
end
convert.append