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