class Exiftool
Exiftool
Class
Constants
- VERSION
Attributes
command[W]
Public Class Methods
command()
click to toggle source
# File lib/exiftool.rb, line 23 def self.command @command ||= 'exiftool' end
exiftool_installed?()
click to toggle source
# File lib/exiftool.rb, line 27 def self.exiftool_installed? exiftool_version.to_f.positive? end
exiftool_version()
click to toggle source
This is a string, not a float, to handle versions like “9.40” properly.
# File lib/exiftool.rb, line 32 def self.exiftool_version @exiftool_version ||= `#{command} -ver 2> /dev/null`.chomp end
expand_path(filename)
click to toggle source
# File lib/exiftool.rb, line 36 def self.expand_path(filename) raise(NoSuchFile, filename) unless File.exist?(filename) raise(NotAFile, filename) unless File.file?(filename) File.expand_path(filename) end
new(filenames, exiftool_opts = '')
click to toggle source
# File lib/exiftool.rb, line 48 def initialize(filenames, exiftool_opts = '') @file2result = {} filenames = [filenames] if filenames.is_a?(String) || filenames.is_a?(Pathname) return if filenames.empty? escaped_filenames = filenames.map do |f| Shellwords.escape(self.class.expand_path(f.to_s)) end.join(' ') # I'd like to use -dateformat, but it doesn't support timezone offsets properly, # nor sub-second timestamps. cmd = "#{self.class.command} #{exiftool_opts} -j -coordFormat \"%.8f\" #{escaped_filenames} 2> /dev/null" json = `#{cmd}`.chomp raise ExiftoolNotInstalled if json == '' JSON.parse(json).each do |raw| result = Result.new(raw) @file2result[result.source_file] = result end end
Public Instance Methods
errors?()
click to toggle source
# File lib/exiftool.rb, line 84 def errors? @file2result.values.any?(&:errors?) end
files_with_results()
click to toggle source
# File lib/exiftool.rb, line 80 def files_with_results results.map(&:source_file) end
result_for(filename)
click to toggle source
# File lib/exiftool.rb, line 76 def result_for(filename) @file2result[self.class.expand_path(filename)] end
results(include_results_with_errors: false)
click to toggle source
# File lib/exiftool.rb, line 68 def results(include_results_with_errors: false) if include_results_with_errors @file2result.values else @file2result.values.reject(&:errors?) end end
Private Instance Methods
first_result()
click to toggle source
# File lib/exiftool.rb, line 90 def first_result raise(NoDefaultResultWithMultiget, 'use #result_for when multiple filenames are used') if @file2result.size > 1 @file2result.values.first end