exiv2 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -17,6 +17,10 @@ Requires that the exiv2 C++ library is installed.
17
17
  puts "#{key} = #{value}\n"
18
18
  end
19
19
  image.exif_data.each { ... }
20
+ image.xmp_data.each { ... }
21
+
22
+ iptc_data_hash = image.iptc_data.to_hash
23
+ xmp_data_hash = image.xmp_data.to_hash
20
24
 
21
25
  == Why?
22
26
 
data/ext/exiv2/exiv2.cpp CHANGED
@@ -12,7 +12,7 @@ static std::string to_std_string(VALUE string) {
12
12
  return std::string(RSTRING(string)->ptr, RSTRING(string)->len);
13
13
  }
14
14
 
15
- // Shared method for implementing each on IptcData and ExifData.
15
+ // Shared method for implementing each on XmpData, IptcData and ExifData.
16
16
  template <class T>
17
17
  static VALUE metadata_each(VALUE self) {
18
18
  T* data;
@@ -39,6 +39,7 @@ extern "C" {
39
39
  static void image_free(Exiv2::Image* image);
40
40
  static VALUE image_read_metadata(VALUE self);
41
41
  static VALUE image_iptc_data(VALUE self);
42
+ static VALUE image_xmp_data(VALUE self);
42
43
  static VALUE image_exif_data(VALUE self);
43
44
 
44
45
  static VALUE image_factory_class;
@@ -50,6 +51,8 @@ extern "C" {
50
51
  static VALUE iptc_data_class;
51
52
  static VALUE iptc_data_each(VALUE self);
52
53
 
54
+ static VALUE xmp_data_class;
55
+ static VALUE xmp_data_each(VALUE self);
53
56
 
54
57
  void Init_exiv2() {
55
58
  VALUE enumerable_module = rb_const_get(rb_cObject, rb_intern("Enumerable"));
@@ -61,6 +64,7 @@ extern "C" {
61
64
  image_class = rb_define_class_under(exiv2_module, "Image", rb_cObject);
62
65
  rb_define_method(image_class, "read_metadata", (Method)image_read_metadata, 0);
63
66
  rb_define_method(image_class, "iptc_data", (Method)image_iptc_data, 0);
67
+ rb_define_method(image_class, "xmp_data", (Method)image_xmp_data, 0);
64
68
  rb_define_method(image_class, "exif_data", (Method)image_exif_data, 0);
65
69
 
66
70
  image_factory_class = rb_define_class_under(exiv2_module, "ImageFactory", rb_cObject);
@@ -73,6 +77,10 @@ extern "C" {
73
77
  iptc_data_class = rb_define_class_under(exiv2_module, "IptcData", rb_cObject);
74
78
  rb_include_module(iptc_data_class, enumerable_module);
75
79
  rb_define_method(iptc_data_class, "each", (Method)iptc_data_each, 0);
80
+
81
+ xmp_data_class = rb_define_class_under(exiv2_module, "XmpData", rb_cObject);
82
+ rb_include_module(xmp_data_class, enumerable_module);
83
+ rb_define_method(xmp_data_class, "each", (Method)xmp_data_each, 0);
76
84
  }
77
85
 
78
86
 
@@ -117,6 +125,15 @@ extern "C" {
117
125
  }
118
126
 
119
127
 
128
+ static VALUE image_xmp_data(VALUE self) {
129
+ Exiv2::Image* image;
130
+ Data_Get_Struct(self, Exiv2::Image, image);
131
+
132
+ VALUE xmp_data = Data_Wrap_Struct(xmp_data_class, 0, 0, &image->xmpData());
133
+ rb_iv_set(xmp_data, "@image", self); // Make sure we don't GC the image until there are no references to the XMP data left.
134
+
135
+ return xmp_data;
136
+ }
120
137
  // Exiv2::ImageFactory methods
121
138
 
122
139
  static VALUE image_factory_open(VALUE klass, VALUE path) {
@@ -146,5 +163,10 @@ extern "C" {
146
163
  static VALUE iptc_data_each(VALUE self) {
147
164
  return metadata_each<Exiv2::IptcData>(self);
148
165
  }
166
+
167
+ // Exiv2::XmpData methods
149
168
 
169
+ static VALUE xmp_data_each(VALUE self) {
170
+ return metadata_each<Exiv2::XmpData>(self);
171
+ }
150
172
  }
data/lib/exiv2/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Exiv2
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,22 @@
1
+ class Exiv2::XmpData
2
+ def to_hash
3
+ result = {}
4
+
5
+ self.each do |key, value|
6
+ if result[key]
7
+ if result[key].is_a? Array
8
+ result[key] << value
9
+ else
10
+ result[key] = [result[key], value]
11
+ end
12
+ else
13
+ result[key] = value
14
+ end
15
+ end
16
+ result
17
+ end
18
+
19
+ def inspect
20
+ "#<Exiv2::XmpData: #{self.to_hash.inspect}>"
21
+ end
22
+ end
data/lib/exiv2.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  require 'exiv2/exiv2'
2
2
  require 'exiv2/iptc_data'
3
+ require 'exiv2/xmp_data'
data/spec/exiv2_spec.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'exiv2'
2
2
 
3
3
  describe Exiv2 do
4
+
4
5
  it "should read IPTC data" do
5
6
  image = Exiv2::ImageFactory.open("spec/files/test.jpg")
6
7
  image.read_metadata
@@ -36,4 +37,30 @@ describe Exiv2 do
36
37
  Exiv2::ImageFactory.open("tmp/no-such-file.jpg")
37
38
  }.should raise_error(Exiv2::BasicError)
38
39
  end
40
+
41
+ it "should read XMP data" do
42
+ image = Exiv2::ImageFactory.open("spec/files/test.jpg")
43
+ image.read_metadata
44
+ xmp_data = image.xmp_data
45
+ xmp_data.should be_a(Exiv2::XmpData)
46
+ xmp_data.inspect.should == '#<Exiv2::XmpData: {"Xmp.dc.description"=>"lang=\"x-default\" This is a description", "Xmp.dc.title"=>"lang=\"x-default\" Pickled"}>'
47
+ xmp_data.to_a.should == [
48
+ ["Xmp.dc.title", "lang=\"x-default\" Pickled"],
49
+ ["Xmp.dc.description", "lang=\"x-default\" This is a description"]
50
+ ]
51
+ end
52
+
53
+ it "should convert xmp data into a hash" do
54
+ image = Exiv2::ImageFactory.open("spec/files/test.jpg")
55
+ image.read_metadata
56
+ iptc_hash = image.xmp_data.to_hash
57
+ iptc_hash.should be_a(Hash)
58
+ iptc_hash.should == {
59
+ "Xmp.dc.title" => "lang=\"x-default\" Pickled",
60
+ "Xmp.dc.description" => "lang=\"x-default\" This is a description"
61
+ }
62
+ end
63
+
64
+
65
+
39
66
  end
data/spec/files/test.jpg CHANGED
Binary file
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiv2
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease: false
4
+ hash: 23
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Pete Yandell
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-02 00:00:00 +11:00
18
+ date: 2011-05-17 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -68,6 +68,7 @@ files:
68
68
  - lib/exiv2.rb
69
69
  - lib/exiv2/iptc_data.rb
70
70
  - lib/exiv2/version.rb
71
+ - lib/exiv2/xmp_data.rb
71
72
  - spec/exiv2_spec.rb
72
73
  - spec/files/test.jpg
73
74
  has_rdoc: true
@@ -101,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
102
  requirements: []
102
103
 
103
104
  rubyforge_project: exiv2
104
- rubygems_version: 1.3.7
105
+ rubygems_version: 1.6.2
105
106
  signing_key:
106
107
  specification_version: 3
107
108
  summary: A simple wrapper around Exiv2