class ExifExtractor

Public Class Methods

handles?(file_extension) click to toggle source

Check if ExifExtractor handles the file extension. Example: ExifExtractor.handles? “.jpg” => returns true

# File lib/filentory/exifextractor.rb, line 25
def self.handles?(file_extension)
  [".jpg", ".jpeg", ".tiff"].include? file_extension
end

Public Instance Methods

metadata_for_file(file_path) click to toggle source

Extracts the metadata of a file at a given path in the file system.

# File lib/filentory/exifextractor.rb, line 8
def metadata_for_file(file_path)
  img = EXIFR::JPEG.new(file_path)

  xmpValues = Hash.new

  extract_xmp_meta_data(img, xmpValues)
  extract_exif_main_meta_data(img, xmpValues)       
  extract_gps_infos(img, xmpValues)

  xmpValues.delete_if { |k, v| v.nil? || v.to_s.empty?}
rescue => error
  puts "metadata_for_file #{file_path} failed: #{error}"
  Hash.new
end

Private Instance Methods

assing_value_when_field_is_set(img, method, key_in_array, xmpValues) click to toggle source
# File lib/filentory/exifextractor.rb, line 83
def assing_value_when_field_is_set(img, method, key_in_array, xmpValues)
  if !img.send(method).nil? && !img.send(method).nan?
    xmpValues[key_in_array] = img.send(method)
  end
end
cleanup_description(value) click to toggle source
# File lib/filentory/exifextractor.rb, line 69
def cleanup_description(value)
  cleanup_metadata(value.force_encoding('UTF-8')).to_s[0...250]  unless value.nil?
end
cleanup_metadata(value) click to toggle source
# File lib/filentory/exifextractor.rb, line 65
def cleanup_metadata(value)
  value.scrub("*").strip unless value.nil?
end
extract_exif_main_meta_data(img, xmpValues) click to toggle source
# File lib/filentory/exifextractor.rb, line 53
def extract_exif_main_meta_data(img, xmpValues)
  xmpValues["exif.model"] = cleanup_description(img.model)
  xmpValues["exif.make"] =  cleanup_description(img.make)
  xmpValues["exif.artist"] = cleanup_description(img.artist)
  xmpValues["exif.date_time"] = format_date(img.date_time)
  xmpValues["exif.date_time_original"] = format_date(img.date_time_original)
  xmpValues["exif.width"] = img.width
  xmpValues["exif.height"] = img.height 
rescue => error_message
   error ("#{error_message}")
end
extract_gps_infos(img, xmpValues) click to toggle source
# File lib/filentory/exifextractor.rb, line 73
def extract_gps_infos(img, xmpValues)
  if img.gps
    assing_value_when_field_is_set(img.gps, :latitude, "exif.gps.latitude", xmpValues)
    
    assing_value_when_field_is_set(img.gps, :longitude, "exif.gps.longitude", xmpValues)
    
    assing_value_when_field_is_set(img.gps, :altitude, "exif.gps.altitude", xmpValues)
  end
end
extract_namespace_attributes(namespace_name, namespace, xmpValues) click to toggle source
# File lib/filentory/exifextractor.rb, line 40
def extract_namespace_attributes(namespace_name, namespace, xmpValues)
  namespace.attributes.each do |attr|
    begin
      returnval = namespace.send(attr)#.inspect
      #puts "returnval: #{returnval}"
      answer = returnval.scrub("*")
      xmpValues["#{namespace_name}.#{attr}"] = answer.strip.to_s[0...250]
    rescue => error_message
       error ("#{error_message}")
    end
  end
end
extract_xmp_meta_data(img, xmpValues) click to toggle source
# File lib/filentory/exifextractor.rb, line 30
def extract_xmp_meta_data(img, xmpValues)
  xmp = XMP.parse(img)
  xmp.namespaces.each do |namespace_name|
    namespace = xmp.send(namespace_name)
    extract_namespace_attributes(namespace_name, namespace, xmpValues)
end
rescue => error_message
  error ("#{error_message}") 
end
format_date(date) click to toggle source
# File lib/filentory/exifextractor.rb, line 89
def format_date(date)
  date.strftime("%FT%T+00:00") unless date.nil?
rescue
    nil
end