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