Sha256: de87609e449a531f1a07b924d87783a0cd0c7f2184d064313c70e86767af1985

Contents?: true

Size: 1.33 KB

Versions: 13

Compression:

Stored size: 1.33 KB

Contents

require 'json'
require 'rational'

class ExifData < Hash
  include RubyLess::SafeClass

  # You can create new ExifData objects with either a json representation (String), a
  # hash of key => value or an array of key,value pairs.
  def initialize(data)
    if data.kind_of?(String)
      replace JSON::parse(data) rescue {}
    elsif data.kind_of?(Hash)
      replace data
    elsif data.kind_of?(Array)
      replace Hash[*data.flatten] rescue {}
    else
      # ignore
    end
  end

  ['DateTime', 'DateTimeOriginal', 'DateTimeDigitised'].each do |k|
    method = k.underscore.to_sym
    safe_method method => Time
    define_method(method) do
      date_from_field(k)
    end
  end

  ['GPSLongitude', 'GPSLatitude'].each do |k|
    method = k.underscore.to_sym
    safe_method method => Number
    define_method(method) do
      position_from_field(k)
    end
  end

  private
    def date_from_field(k)
      return nil unless v = self[k]
      Time.parse(v.sub(/(....):(..):(..) /, '\1-\2-\3 ')) rescue nil
    end

    def position_from_field(k)
      return nil unless v = self[k]
      if v =~ /(-?\d+)\/(\d+),\s*(-?\d+)\/(\d+),\s*(-?\d+)\/(\d+)/
        deg = Rational($1.to_i, $2.to_i)
        min = Rational($3.to_i, $4.to_i)
        sec = Rational($5.to_i, $6.to_i)
        deg + min/60.0 + sec/3600.0
      else
        nil
      end
    end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
zena-0.16.9 lib/exif_data.rb
zena-0.16.8 lib/exif_data.rb
zena-0.16.7 lib/exif_data.rb
zena-0.16.6 lib/exif_data.rb
zena-0.16.5 lib/exif_data.rb
zena-0.16.4 lib/exif_data.rb
zena-0.16.3 lib/exif_data.rb
zena-0.16.2 lib/exif_data.rb
zena-0.16.1 lib/exif_data.rb
zena-0.16.0 lib/exif_data.rb
zena-0.15.2 lib/exif_data.rb
zena-0.15.1 lib/exif_data.rb
zena-0.15.0 lib/exif_data.rb