Skip to content
This repository
Browse code

New method MiniExiftool.opts for manupilationg the standard opts; enc…

…oding conversion using the -L-option of the exiftool command-line application.
  • Loading branch information...
commit 513de6a149f198b5d2f0cef92fa3cdf84b5e3389 1 parent fe62775
authored July 07, 2008
8  Changelog
... ...
@@ -1,3 +1,11 @@
  1
+Version 0.7.0
  2
+- Changing composite behaviour: Composite tags are now included as standard!
  3
+- New method MiniExiftool.opts which returns a hash of the standard
  4
+  options used for MiniExiftool.new
  5
+- New option :convert_encoding for MiniExiftool.new which uses the -L-option
  6
+  of the exiftool command-line application (see online documentation for it)
  7
+  Thanks to Henning Kulander for the causing of this change.
  8
+
1 9
 Version 0.6.0
2 10
 - New methods for serialization:
3 11
   - MiniExiftool.from_hash
40  lib/mini_exiftool.rb
@@ -7,7 +7,7 @@
7 7
 # Read and write access is done in a clean OO manner.
8 8
 #
9 9
 # Author: Jan Friedrich
10  
-# Copyright (c) 2007 by Jan Friedrich
  10
+# Copyright (c) 2007, 2008 by Jan Friedrich
11 11
 # Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, 
12 12
 # Version 2.1, February 1999
13 13
 #
@@ -24,15 +24,20 @@ class MiniExiftool
24 24
   # Name of the Exiftool command-line application
25 25
   @@cmd = 'exiftool'
26 26
 
  27
+  # Hash of the standard options used when call MiniExiftool.new
  28
+  @@opts = { :numerical => false, :composite => true, :convert_encoding => false, :timestamps => Time }
  29
+
27 30
   attr_reader :filename
28  
-  attr_accessor :numerical, :composite, :errors, :timestamps
  31
+  attr_accessor :numerical, :composite, :convert_encoding, :errors, :timestamps
29 32
 
30  
-  VERSION = '0.6.0'
  33
+  VERSION = '0.7.0'
31 34
 
32 35
   # +opts+ support at the moment
33 36
   # * <code>:numerical</code> for numerical values, default is +false+
34 37
   # * <code>:composite</code> for including composite tags while loading,
35  
-  #   default is +false+
  38
+  #   default is +true+
  39
+  # * <code>:convert_encoding</code> convert encoding (See -L-option of 
  40
+  #   the exiftool command-line application, default is +false+
36 41
   # * <code>:timestamps</code> generating DateTime objects instead of
37 42
   #   Time objects if set to <code>DateTime</code>, default is +Time+
38 43
   #
@@ -40,10 +45,10 @@ class MiniExiftool
40 45
   #   therefore they use <em>your local timezone</em>, DateTime objects instead
41 46
   #   are created <em>without timezone</em>!
42 47
   def initialize filename=nil, opts={}
43  
-    std_opts = {:numerical => false, :composite => false, :timestamps => Time}
44  
-    opts = std_opts.update opts
  48
+    opts = @@opts.merge opts
45 49
     @numerical = opts[:numerical]
46 50
     @composite = opts[:composite]
  51
+    @convert_encoding = opts[:convert_encoding]
47 52
     @timestamps = opts[:timestamps]
48 53
     @values = TagHash.new
49 54
     @tag_names = TagHash.new
@@ -75,6 +80,7 @@ def load filename
75 80
     opt_params = ''
76 81
     opt_params << (@numerical ? '-n ' : '')
77 82
     opt_params << (@composite ? '' : '-e ')
  83
+    opt_params << (@convert_encoding ? '-L ' : '')
78 84
     cmd = %Q(#@@cmd -q -q -s -t #{opt_params} "#{filename}")
79 85
     if run(cmd)
80 86
       parse_output
@@ -143,7 +149,9 @@ def save
143 149
     @changed_values.each do |tag, val|
144 150
       original_tag = MiniExiftool.original_tag(tag)
145 151
       converted_val = convert val
146  
-      opt_params = converted_val.kind_of?(Numeric) ? '-n' : ''
  152
+      opt_params = ''
  153
+      opt_params << (converted_val.kind_of?(Numeric) ? '-n ' : '')
  154
+      opt_params << (@convert_encoding ? '-L ' : '')
147 155
       cmd = %Q(#@@cmd -q -P -overwrite_original #{opt_params} -#{original_tag}="#{converted_val}" "#{temp_filename}")
148 156
       result = run(cmd)
149 157
       unless result
@@ -198,6 +206,11 @@ def self.command= cmd
198 206
     @@cmd = cmd
199 207
   end
200 208
 
  209
+  # Returns the options hash.
  210
+  def self.opts
  211
+    @@opts
  212
+  end
  213
+
201 214
   # Returns a set of all known tags of Exiftool.
202 215
   def self.all_tags
203 216
     unless defined? @@all_tags
@@ -320,15 +333,10 @@ def set_value tag, value
320 333
   end
321 334
 
322 335
   def set_attributes_by_heuristic
323  
-    if tags.include? 'ImageSize'
324  
-      self.composite = true
325  
-    end
326  
-    if self.file_size.kind_of? Integer
327  
-      self.numerical = true
328  
-    end
329  
-    if self.FileModifyDate.kind_of? DateTime
330  
-      self.timestamps = DateTime
331  
-    end
  336
+    self.composite = tags.include?('ImageSize') ? true : false
  337
+    self.numerical = self.file_size.kind_of?(Integer) ? true : false
  338
+    # TODO: Is there a heuristic to determine @convert_encoding?
  339
+    self.timestamps = self.FileModifyDate.kind_of?(DateTime) ? DateTime : Time
332 340
   end
333 341
 
334 342
   def temp_filename
BIN  test/data/test.jpg
18  test/test_class_methods.rb
@@ -49,6 +49,24 @@ def test_command
49 49
     MiniExiftool.command = cmd
50 50
   end
51 51
 
  52
+  def test_opts
  53
+    opts = MiniExiftool.opts
  54
+    assert_kind_of Hash, opts
  55
+    begin
  56
+      org = MiniExiftool.opts[:composite]
  57
+      met1 = MiniExiftool.new
  58
+      MiniExiftool.opts[:composite] = !org
  59
+      met2 = MiniExiftool.new
  60
+      MiniExiftool.opts[:composite] = org
  61
+      met3 = MiniExiftool.new
  62
+      assert_equal org, met1.composite
  63
+      assert_equal !org, met2.composite
  64
+      assert_equal org, met1.composite
  65
+    ensure
  66
+      MiniExiftool.opts[:composite] = org
  67
+    end
  68
+  end
  69
+
52 70
   def test_all_tags
53 71
     all_tags = MiniExiftool.all_tags
54 72
     assert all_tags.include?('ISO')
4  test/test_composite.rb
@@ -5,8 +5,8 @@ class TestComposite < TestCase
5 5
   def setup
6 6
     @data_dir = File.dirname(__FILE__) + '/data'
7 7
     @filename_test = @data_dir + '/test.jpg'
8  
-    @mini_exiftool = MiniExiftool.new @filename_test
9  
-    @mini_exiftool_c = MiniExiftool.new @filename_test, :composite => true
  8
+    @mini_exiftool = MiniExiftool.new @filename_test, :composite => false
  9
+    @mini_exiftool_c = MiniExiftool.new @filename_test
10 10
   end
11 11
 
12 12
   def test_composite_tags
10  test/test_dumping.rb
@@ -60,11 +60,11 @@ def test_from_yaml
60 60
 
61 61
   def test_heuristics_for_restoring_composite
62 62
     standard = @mini_exiftool.to_hash
63  
-    composite = MiniExiftool.new(@filename_test, :composite => true).to_hash
64  
-    assert_equal false, MiniExiftool.from_hash(standard).composite
65  
-    assert_equal true, MiniExiftool.from_hash(composite).composite
66  
-    assert_equal false, MiniExiftool.from_yaml(standard.to_yaml).composite
67  
-    assert_equal true, MiniExiftool.from_yaml(composite.to_yaml).composite
  63
+    no_composite = MiniExiftool.new(@filename_test, :composite => false).to_hash
  64
+    assert_equal true, MiniExiftool.from_hash(standard).composite
  65
+    assert_equal false, MiniExiftool.from_hash(no_composite).composite
  66
+    assert_equal true, MiniExiftool.from_yaml(standard.to_yaml).composite
  67
+    assert_equal false, MiniExiftool.from_yaml(no_composite.to_yaml).composite
68 68
   end
69 69
 
70 70
   def test_heuristics_for_restoring_numerical
6  test/test_read.rb
@@ -28,4 +28,10 @@ def test_conversion
28 28
     assert_kind_of Array, @mini_exiftool['SubjectLocation']
29 29
   end
30 30
 
  31
+  def test_encoding_conversion
  32
+    @mini_exiftool_converted = MiniExiftool.new @filename_test, :convert_encoding => true
  33
+    assert_equal 'Abenddämmerung', @mini_exiftool.title
  34
+    assert_equal "Abendd\344mmerung", @mini_exiftool_converted.title
  35
+  end
  36
+
31 37
 end
13  test/test_save.rb
@@ -48,4 +48,17 @@ def test_no_changing_of_file_when_error
48 48
     assert_equal @org_md5, Digest::MD5.hexdigest(File.read(@temp_filename))
49 49
   end
50 50
 
  51
+  def test_encoding_conversion
  52
+    special_string = 'ÄÖÜ'
  53
+    @mini_exiftool.title = special_string
  54
+    assert @mini_exiftool.save
  55
+    assert_equal false, @mini_exiftool.convert_encoding
  56
+    assert_equal special_string, @mini_exiftool.title
  57
+    @mini_exiftool.convert_encoding = true
  58
+    @mini_exiftool.title = special_string
  59
+    assert @mini_exiftool.save
  60
+    assert_equal true, @mini_exiftool.convert_encoding
  61
+    assert_equal special_string, @mini_exiftool.title
  62
+  end
  63
+
51 64
 end

0 notes on commit 513de6a

Please sign in to comment.
Something went wrong with that request. Please try again.