iptc 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
- require 'iptc/jpeg/image'
2
- require 'iptc/jpeg/markers'
3
-
1
+ require 'iptc/jpeg/image'
2
+ require 'iptc/jpeg/markers'
3
+
@@ -1,100 +1,123 @@
1
- require 'logger'
2
-
3
- require 'iptc/multiple_hash'
4
- require 'iptc/jpeg/marker_headers'
5
-
6
- module IPTC
7
- module JPEG
8
- class Image
9
- attr_reader :values
10
- # creates a JPEG image from a file and does a "quick" load (Only the metadata
11
- # are loaded, not the whole file).
12
- def initialize filename, quick=true
13
- @logger = Logger.new(STDOUT)
14
- @logger.datetime_format = "%H:%M:%S"
15
- @logger.level = $DEBUG?(Logger::DEBUG):(Logger::INFO)
16
-
17
- @filename = filename
18
- @position = 0
19
- @content = File.open(@filename).binmode.read
20
-
21
-
22
- if MARKERS[read(2)]!="SOI"
23
- raise NotJPEGFileException.new("Not a JPEG file: #{@filename}")
24
- end
25
-
26
- @markers = Array.new()
27
-
28
- begin
29
-
30
- catch(:end_of_metadata) do
31
- while true
32
- @markers << read_marker
33
- end
34
- end
35
-
36
- rescue Exception=>e
37
- @logger.info "Exception in file #{@filename}:\n"+e.to_s
38
- raise e
39
- end
40
- # Markers all read
41
- # move back
42
- seek(-2)
43
-
44
- # in full mode, read the rest
45
- if !quick
46
- @data = read_rest
47
- end
48
-
49
- @values = MultipleHash.new
50
-
51
- @markers.each do |marker|
52
- # puts "processing marker: #{marker.inspect}"
53
- marker.parse
54
- # puts marker.valid?
55
- @values.add(marker, marker.values)
56
- end
57
- end
58
-
59
- def read(count)
60
- @position += count
61
- return @content[@position-count...@position]
62
- end
63
- def seek(count)
64
- @position += count
65
- end
66
-
67
- def l message
68
- @logger.debug message
69
- end
70
-
71
- # write the image to the disk
72
- def write filename
73
- f = File.open(filename,"wb+")
74
- f.print "\xFF\xD8"
75
-
76
- @markers.each do |marker|
77
- f.print marker.to_binary
78
- end
79
- f.print @data.to_binary
80
- f.close
81
-
82
- end
83
-
84
- def read_marker
85
- type = read(2)
86
- # finished reading all the metadata
87
- throw :end_of_metadata if MARKERS[type]=='SOS'
88
- size = read(2)
89
- data = read(size.unpack('n')[0]-2)
90
-
91
- return Marker.NewMarker(MARKERS[type], type+size+data, @logger)
92
- end
93
- def read_rest
94
- rest = @content[@position..-1]
95
- return Marker.new("BIN",rest)
96
- end
97
-
98
- end
99
- end
100
- end
1
+ require 'logger'
2
+
3
+ require 'iptc/multiple_hash'
4
+ require 'iptc/jpeg/marker_headers'
5
+
6
+ module IPTC
7
+ module JPEG
8
+ class Image
9
+ # Array of MultipleHashItem objects
10
+ attr_reader :values
11
+
12
+ # creates a JPEG image from a data blob and does a "quick" load (Only the metadata
13
+ # are loaded, not the whole file).
14
+ def Image.from_blob blob, quick=true
15
+ return Image.new("Data blob", blob, true)
16
+ end
17
+ # creates a JPEG image from a file and does a "quick" load (Only the metadata
18
+ # are loaded, not the whole file).
19
+ def Image.from_file filename, quick=true
20
+ content = nil
21
+ raise "File #{filename} not found" if !File.exists?(filename)
22
+ File.open(filename) do |f|
23
+ f.binmode
24
+ content = f.read
25
+ end
26
+ return Image.new(filename, content, quick)
27
+
28
+ end
29
+ # Real constructor. Should never be called directly
30
+ # take a "data name" that is used for error reporting.
31
+ def initialize data_name, content, quick=true
32
+ @logger = Logger.new(STDOUT)
33
+ @logger.datetime_format = "%H:%M:%S"
34
+ @logger.level = Logger::DEBUG # $DEBUG?(Logger::DEBUG):(Logger::INFO)
35
+
36
+ @data_name = data_name
37
+ @content = content
38
+
39
+ @position = 0
40
+
41
+ if MARKERS[read(2)]!="SOI"
42
+ raise NotJPEGFileException.new("Not JPEG data: #{@data_name}")
43
+ end
44
+
45
+ @markers = Array.new()
46
+
47
+ begin
48
+
49
+ catch(:end_of_metadata) do
50
+ while true
51
+ @markers << read_marker
52
+ end
53
+ end
54
+
55
+ rescue Exception=>e
56
+ @logger.info "Exception in data #{@data_name}:\n"+e.to_s
57
+ raise e
58
+ end
59
+ # Markers all read
60
+ # move back
61
+ seek(-2)
62
+
63
+ # in full mode, read the rest
64
+ if !quick
65
+ @data = read_rest
66
+ end
67
+
68
+ @values = MultipleHash.new
69
+
70
+ @markers.each do |marker|
71
+ # puts "processing marker: #{marker.inspect}"
72
+ marker.parse
73
+ # puts marker.valid?
74
+ @values.add(marker, marker.values)
75
+ end
76
+ end
77
+
78
+ def read(count)
79
+ @position += count
80
+ return @content[@position-count...@position]
81
+ end
82
+ def seek(count)
83
+ @position += count
84
+ end
85
+
86
+ def l message
87
+ @logger.debug message
88
+ end
89
+
90
+ # write the image to the disk
91
+ def write data_name
92
+ f = File.open(data_name,"wb+")
93
+ f.print "\xFF\xD8"
94
+
95
+ @markers.each do |marker|
96
+ f.print marker.to_binary
97
+ end
98
+ f.print @data.to_binary
99
+ f.close
100
+
101
+ end
102
+
103
+ def read_marker
104
+ type = read(2)
105
+ # finished reading all the metadata
106
+ throw :end_of_metadata if MARKERS[type]=='SOS'
107
+ size = read(2)
108
+ data = read(size.unpack('n')[0]-2)
109
+
110
+ return Marker.NewMarker(MARKERS[type], type+size+data, @logger)
111
+ end
112
+ def read_rest
113
+ rest = @content[@position..-1]
114
+ return Marker.new("BIN",rest)
115
+ end
116
+ def to_s
117
+ "Image #{@data_name}:\n" +
118
+ @markers.map{ |m| m.to_s }.join("\n")
119
+ end
120
+
121
+ end
122
+ end
123
+ end
@@ -14,7 +14,7 @@ module IPTC
14
14
  # Inspect the object space in order to find something usable later
15
15
  def Marker.NewMarker(type,data, logger)
16
16
  marker_class = "#{type}Marker"
17
- if JPEG::Markers.constants.include?(marker_class.to_sym)
17
+ if JPEG::Markers.constants.include?(marker_class.to_s)
18
18
  return JPEG::Markers.const_get(marker_class).new(type, data)
19
19
  else
20
20
  if !@@missing.include?(type)
@@ -1,67 +1,67 @@
1
- module IPTC
2
- module JPEG
3
- MARKERS = {
4
- "\xFF\xD8" => 'SOI',
5
- "\xFF\xc0" => 'SOF0',
6
- "\xFF\xc1" => 'SOF1',
7
- "\xFF\xc2" => 'SOF2',
8
- "\xFF\xc3" => 'SOF3',
9
-
10
- "\xFF\xc5" => 'SOF5',
11
- "\xFF\xc6" => 'SOF6',
12
- "\xFF\xc7" => 'SOF7',
13
-
14
- "\xFF\xc8" => 'JPG',
15
- "\xFF\xc9" => 'SOF9',
16
- "\xFF\xca" => 'SOF10',
17
- "\xFF\xcb" => 'SOF11',
18
-
19
- "\xFF\xcd" => 'SOF13',
20
- "\xFF\xce" => 'SOF14',
21
- "\xFF\xcf" => 'SOF15',
22
-
23
- "\xFF\xc4" => 'DHT',
24
-
25
- "\xFF\xcc" => 'DAC',
26
-
27
- "\xFF\xd0" => 'RST0',
28
- "\xFF\xd1" => 'RST1',
29
- "\xFF\xd2" => 'RST2',
30
- "\xFF\xd3" => 'RST3',
31
- "\xFF\xd4" => 'RST4',
32
- "\xFF\xd5" => 'RST5',
33
- "\xFF\xd6" => 'RST6',
34
- "\xFF\xd7" => 'RST7',
35
-
36
- "\xFF\xd8" => 'SOI',
37
- "\xFF\xd9" => 'EOI',
38
- "\xFF\xda" => 'SOS',
39
- "\xFF\xdb" => 'DQT',
40
- "\xFF\xdc" => 'DNL',
41
- "\xFF\xdd" => 'DRI',
42
- "\xFF\xde" => 'DHP',
43
- "\xFF\xdf" => 'EXP',
44
-
45
- "\xFF\xe0" => 'APP0',
46
- "\xFF\xe1" => 'APP1',
47
- "\xFF\xe2" => 'APP2',
48
- "\xFF\xe3" => 'APP3',
49
- "\xFF\xe4" => 'APP4',
50
- "\xFF\xe5" => 'APP5',
51
- "\xFF\xe6" => 'APP6',
52
- "\xFF\xe7" => 'APP7',
53
- "\xFF\xe8" => 'APP8',
54
- "\xFF\xe9" => 'APP9',
55
- "\xFF\xea" => 'APP10',
56
- "\xFF\xeb" => 'APP11',
57
- "\xFF\xec" => 'APP12',
58
- "\xFF\xed" => 'APP13',
59
- "\xFF\xee" => 'APP14',
60
- "\xFF\xef" => 'APP15',
61
- "\xFF\xf0" => 'JPG0',
62
- "\xFF\xfd" => 'JPG13',
63
- "\xFF\xfe" => 'COM',
64
- "\xFF\x01" => 'TEM'
65
- }
66
- end
1
+ module IPTC
2
+ module JPEG
3
+ MARKERS = {
4
+ "\xFF\xD8" => 'SOI',
5
+ "\xFF\xc0" => 'SOF0',
6
+ "\xFF\xc1" => 'SOF1',
7
+ "\xFF\xc2" => 'SOF2',
8
+ "\xFF\xc3" => 'SOF3',
9
+
10
+ "\xFF\xc5" => 'SOF5',
11
+ "\xFF\xc6" => 'SOF6',
12
+ "\xFF\xc7" => 'SOF7',
13
+
14
+ "\xFF\xc8" => 'JPG',
15
+ "\xFF\xc9" => 'SOF9',
16
+ "\xFF\xca" => 'SOF10',
17
+ "\xFF\xcb" => 'SOF11',
18
+
19
+ "\xFF\xcd" => 'SOF13',
20
+ "\xFF\xce" => 'SOF14',
21
+ "\xFF\xcf" => 'SOF15',
22
+
23
+ "\xFF\xc4" => 'DHT',
24
+
25
+ "\xFF\xcc" => 'DAC',
26
+
27
+ "\xFF\xd0" => 'RST0',
28
+ "\xFF\xd1" => 'RST1',
29
+ "\xFF\xd2" => 'RST2',
30
+ "\xFF\xd3" => 'RST3',
31
+ "\xFF\xd4" => 'RST4',
32
+ "\xFF\xd5" => 'RST5',
33
+ "\xFF\xd6" => 'RST6',
34
+ "\xFF\xd7" => 'RST7',
35
+
36
+ "\xFF\xd8" => 'SOI',
37
+ "\xFF\xd9" => 'EOI',
38
+ "\xFF\xda" => 'SOS',
39
+ "\xFF\xdb" => 'DQT',
40
+ "\xFF\xdc" => 'DNL',
41
+ "\xFF\xdd" => 'DRI',
42
+ "\xFF\xde" => 'DHP',
43
+ "\xFF\xdf" => 'EXP',
44
+
45
+ "\xFF\xe0" => 'APP0',
46
+ "\xFF\xe1" => 'APP1',
47
+ "\xFF\xe2" => 'APP2',
48
+ "\xFF\xe3" => 'APP3',
49
+ "\xFF\xe4" => 'APP4',
50
+ "\xFF\xe5" => 'APP5',
51
+ "\xFF\xe6" => 'APP6',
52
+ "\xFF\xe7" => 'APP7',
53
+ "\xFF\xe8" => 'APP8',
54
+ "\xFF\xe9" => 'APP9',
55
+ "\xFF\xea" => 'APP10',
56
+ "\xFF\xeb" => 'APP11',
57
+ "\xFF\xec" => 'APP12',
58
+ "\xFF\xed" => 'APP13',
59
+ "\xFF\xee" => 'APP14',
60
+ "\xFF\xef" => 'APP15',
61
+ "\xFF\xf0" => 'JPG0',
62
+ "\xFF\xfd" => 'JPG13',
63
+ "\xFF\xfe" => 'COM',
64
+ "\xFF\x01" => 'TEM'
65
+ }
66
+ end
67
67
  end
@@ -1,49 +1,49 @@
1
- require 'singleton'
2
- require 'iptc/marker'
3
-
4
- module IPTC
5
- class MarkerNomenclature
6
- include Singleton
7
- def MarkerNomenclature.markers(id)
8
- return MarkerNomenclature.instance.markers(id)
9
- end
10
-
11
- def markers(id)
12
- if @markers.has_key?(id)
13
- return @markers[id]
14
- else
15
- return @markers[-1]
16
- end
17
- end
18
-
19
- def populate
20
- @markers = {}
21
- begin
22
- fullpath = nil
23
-
24
- [File.dirname(__FILE__), $:].flatten.each { |path|
25
- break if File.exists?(fullpath = File.join(path, "iptc"))
26
- }
27
- content = File.open(fullpath).read
28
- rescue Exception=>e
29
- raise "Load failed for \"iptc\" file\nWith $:=#{$:.inspect}\n\n"+e
30
- end
31
- marker = Struct.new(:iid, :name, :description)
32
-
33
- m = marker.new
34
- m.name = "Unknow marker"
35
- m.iid = -1
36
- @markers[-1] = m
37
-
38
- content.each_line do |line|
39
- tags = line.split(/\t/)
40
- m = marker.new
41
- m[:name] = tags[0]
42
- m[:description] = tags[1]
43
- m[:iid] = tags[2].to_i
44
- @markers[m.iid] = m
45
- end
46
- end
47
- end
48
- MarkerNomenclature.instance.populate
49
- end
1
+ require 'singleton'
2
+ require 'iptc/marker'
3
+ require 'iptc/marker_nomenclature_data'
4
+
5
+ require 'yaml'
6
+
7
+ module IPTC
8
+ class MarkerNomenclature
9
+ include Singleton
10
+ def MarkerNomenclature.markers(id)
11
+ return MarkerNomenclature.instance.markers(id)
12
+ end
13
+ def markers_count
14
+ @markers.keys.length
15
+ end
16
+ def markers(id)
17
+ if @markers.has_key?(id)
18
+ return @markers[id]
19
+ else
20
+ return @markers[-1]
21
+ end
22
+ end
23
+
24
+ def populate
25
+ @markers = {}
26
+
27
+ marker = Struct.new(:iid, :name, :description)
28
+
29
+ m = marker.new
30
+ m.name = "Unknown marker"
31
+ m.iid = -1
32
+ @markers[-1] = m
33
+
34
+ NOMENCLATURE.each_line do |line|
35
+ m = marker.new
36
+ m[:name], m[:description], m[:iid] = line.split(/\t/)
37
+ m[:iid] = m[:iid].to_i
38
+ @markers[m.iid] = m
39
+ end
40
+ end
41
+ def benchmark
42
+ require 'benchmark'
43
+ Benchmark.bm(40) do |x|
44
+ x.report("Populate Markers") { 1000.times do populate(); end }
45
+ end
46
+ end
47
+ end
48
+ end
49
+ IPTC::MarkerNomenclature.instance.populate
@@ -0,0 +1,63 @@
1
+ module IPTC
2
+ class MarkerNomenclature
3
+ NOMENCLATURE=<<-EOS
4
+ RecordVersion Version of IIM part 2 0 0x0000 Yes No 2 2 Iptc.Application2.RecordVersion
5
+ ObjectType IIM appendix G object type 3 0x0003 No No 3 67 Iptc.Application2.ObjectType
6
+ ObjectAttribute IIM appendix G object attribute 4 0x0004 No Yes 4 68 Iptc.Application2.ObjectAttribute
7
+ ObjectName Shorthand reference of content 5 0x0005 No No 0 64 Iptc.Application2.ObjectName
8
+ EditStatus Content status 7 0x0007 No No 0 64 Iptc.Application2.EditStatus
9
+ EditorialUpdate Indicates the type of update 8 0x0008 No No 2 2 Iptc.Application2.EditorialUpdate
10
+ Urgency Editorial urgency of content 10 0x000a No No 1 1 Iptc.Application2.Urgency
11
+ Subject Structured definition of the subject 12 0x000c No Yes 13 236 Iptc.Application2.Subject
12
+ Category Identifies the subject 15 0x000f No No 0 3 Iptc.Application2.Category
13
+ SuppCategory Refines the subject 20 0x0014 No Yes 0 32 Iptc.Application2.SuppCategory
14
+ FixtureId Identifies content that recurs 22 0x0016 No No 0 32 Iptc.Application2.FixtureId
15
+ Keywords Information retrieval words 25 0x0019 No Yes 0 64 Iptc.Application2.Keywords
16
+ LocationCode ISO country code for content 26 0x001a No Yes 3 3 Iptc.Application2.LocationCode
17
+ LocationName Full country name for content 27 0x001b No Yes 0 64 Iptc.Application2.LocationName
18
+ ReleaseDate Earliest intended usable date 30 0x001e No No 8 8 Iptc.Application2.ReleaseDate
19
+ ReleaseTime Earliest intended usable time 35 0x0023 No No 11 11 Iptc.Application2.ReleaseTime
20
+ ExpirationDate Latest intended usable date 37 0x0025 No No 8 8 Iptc.Application2.ExpirationDate
21
+ ExpirationTime Latest intended usable time 38 0x0026 No No 11 11 Iptc.Application2.ExpirationTime
22
+ SpecialInstructions Editorial usage instructions 40 0x0028 No No 0 256 Iptc.Application2.SpecialInstructions
23
+ ActionAdvised Action provided to previous data 42 0x002a No No 2 2 Iptc.Application2.ActionAdvised
24
+ ReferenceService Service Identifier of a prior envelope 45 0x002d No Yes 0 10 Iptc.Application2.ReferenceService
25
+ ReferenceDate Date of a prior envelope 47 0x002f No Yes 8 8 Iptc.Application2.ReferenceDate
26
+ ReferenceNumber Envelope Number of a prior envelope 50 0x0032 No Yes 8 8 Iptc.Application2.ReferenceNumber
27
+ DateCreated Creation date of intellectual content 55 0x0037 No No 8 8 Iptc.Application2.DateCreated
28
+ TimeCreated Creation time of intellectual content 60 0x003c No No 11 11 Iptc.Application2.TimeCreated
29
+ DigitizationDate Creation date of digital representation 62 0x003e No No 8 8 Iptc.Application2.DigitizationDate
30
+ DigitizationTime Creation time of digital representation 63 0x003f No No 11 11 Iptc.Application2.DigitizationTime
31
+ Program Content creation program 65 0x0041 No No 0 32 Iptc.Application2.Program
32
+ ProgramVersion Content creation program version 70 0x0046 No No 0 10 Iptc.Application2.ProgramVersion
33
+ ObjectCycle Morning 75 0x004b No No 1 1 Iptc.Application2.ObjectCycle
34
+ Byline Name of content creator 80 0x0050 No Yes 0 32 Iptc.Application2.Byline
35
+ BylineTitle Title of content creator 85 0x0055 No Yes 0 32 Iptc.Application2.BylineTitle
36
+ City City of content origin 90 0x005a No No 0 32 Iptc.Application2.City
37
+ SubLocation Location within city 92 0x005c No No 0 32 Iptc.Application2.SubLocation
38
+ ProvinceState Province/State of content origin 95 0x005f No No 0 32 Iptc.Application2.ProvinceState
39
+ CountryCode ISO country code of content origin 100 0x0064 No No 3 3 Iptc.Application2.CountryCode
40
+ CountryName Full country name of content origin 101 0x0065 No No 0 64 Iptc.Application2.CountryName
41
+ TransmissionReference Location of original transmission 103 0x0067 No No 0 32 Iptc.Application2.TransmissionReference
42
+ Headline Content synopsis 105 0x0069 No No 0 256 Iptc.Application2.Headline
43
+ Credit Content provider 110 0x006e No No 0 32 Iptc.Application2.Credit
44
+ Source Original owner of content 115 0x0073 No No 0 32 Iptc.Application2.Source
45
+ Copyright Necessary copyright notice 116 0x0074 No No 0 128 Iptc.Application2.Copyright
46
+ Contact Person or organisation to contact 118 0x0076 No Yes 0 128 Iptc.Application2.Contact
47
+ Caption Content description 120 0x0078 No No 0 2000 Iptc.Application2.Caption
48
+ Writer Person responsible for caption 122 0x007a No Yes 0 32 Iptc.Application2.Writer
49
+ RasterizedCaption Black and white caption image 125 0x007d No No 7360 7360 Iptc.Application2.RasterizedCaption
50
+ ImageType Color components in an image 130 0x0082 No No 2 2 Iptc.Application2.ImageType
51
+ ImageOrientation Indicates the layout of an image 131 0x0083 No No 1 1 Iptc.Application2.ImageOrientation
52
+ Language ISO 639:1988 language code 135 0x0087 No No 2 3 Iptc.Application2.Language
53
+ AudioType Information about audio content 150 0x0096 No No 2 2 Iptc.Application2.AudioType
54
+ AudioRate Sampling rate of audio content 151 0x0097 No No 6 6 Iptc.Application2.AudioRate
55
+ AudioResolution Sampling resolution of audio content 152 0x0098 No No 2 2 Iptc.Application2.AudioResolution
56
+ AudioDuration Duration of audio content 153 0x0099 No No 6 6 Iptc.Application2.AudioDuration
57
+ AudioOutcue Final words or sounds of audio content 154 0x009a No No 0 64 Iptc.Application2.AudioOutcue
58
+ PreviewFormat IIM appendix A file format of preview 200 0x00c8 No No 2 2 Iptc.Application2.PreviewFormat
59
+ PreviewVersion File format version of preview 201 0x00c9 No No 2 2 Iptc.Application2.PreviewVersion
60
+ Preview Binary preview data 202 0x00ca No No 0 256000 Iptc.Application2.Preview
61
+ EOS
62
+ end
63
+ end
@@ -3,6 +3,9 @@ module IPTC
3
3
 
4
4
  # a MultipleHash associate a String key, a Marker Object and a String value
5
5
  # this object
6
+
7
+
8
+ # This structure is too complicated.
6
9
  class MultipleHash
7
10
  def initialize()
8
11
  @internal = Hash.new
@@ -51,4 +54,4 @@ module IPTC
51
54
  end
52
55
  end
53
56
 
54
- end
57
+ end
@@ -1,3 +1,3 @@
1
1
  module IPTC
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iptc
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 25
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 2
9
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
10
11
  platform: ruby
11
12
  authors:
12
13
  - Pierre Baillet
@@ -15,13 +16,13 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-09-06 00:00:00 +02:00
19
+ date: 2011-09-23 00:00:00 +02:00
19
20
  default_executable:
20
21
  dependencies: []
21
22
 
22
- description: Original code from http://raa.ruby-lang.org/project/jpeg-jfif-iptc/, gemified and updated by Jens Kraemer
23
+ description: Original code from http://raa.ruby-lang.org/project/jpeg-jfif-iptc/, gemified and updated by Jens Kraemer, Futher fixes by Pierre Baillet
23
24
  email:
24
- - jk@jkraemer.net
25
+ - pierre@baillet.name
25
26
  executables: []
26
27
 
27
28
  extensions: []
@@ -35,13 +36,14 @@ files:
35
36
  - lib/iptc/jpeg/markers.rb
36
37
  - lib/iptc/marker.rb
37
38
  - lib/iptc/marker_nomenclature.rb
39
+ - lib/iptc/marker_nomenclature_data.rb
38
40
  - lib/iptc/multiple_hash.rb
39
41
  - lib/iptc/version.rb
40
42
  - lib/iptc.rb
41
43
  - LICENSE
42
44
  - README.md
43
45
  has_rdoc: true
44
- homepage: http://github.com/jkraemer/ruby-iptc
46
+ homepage: http://github.com/octplane/ruby-iptc
45
47
  licenses: []
46
48
 
47
49
  post_install_message:
@@ -54,7 +56,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
56
  requirements:
55
57
  - - ">="
56
58
  - !ruby/object:Gem::Version
57
- hash: -1405560905508476106
59
+ hash: 3
58
60
  segments:
59
61
  - 0
60
62
  version: "0"
@@ -63,6 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
65
  requirements:
64
66
  - - ">="
65
67
  - !ruby/object:Gem::Version
68
+ hash: 23
66
69
  segments:
67
70
  - 1
68
71
  - 3
@@ -71,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
74
  requirements: []
72
75
 
73
76
  rubyforge_project: ruby-iptc
74
- rubygems_version: 1.3.7
77
+ rubygems_version: 1.6.2
75
78
  signing_key:
76
79
  specification_version: 3
77
80
  summary: Pure ruby IPTC metadata reader