mini_exiftool 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +13 -0
- data/lib/mini_exiftool.rb +73 -14
- data/test/test_other.rb +28 -0
- data/test/test_read.rb +10 -0
- data/test/test_write.rb +2 -1
- metadata +4 -2
data/Changelog
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
Version 0.2.0
|
2
|
+
- Better error handling (i.e. error messages)
|
3
|
+
- Checking if the exiftool command can be executed at loading the lib
|
4
|
+
- New class method exiftool_version
|
5
|
+
- Added tests
|
6
|
+
- Documentation completed
|
7
|
+
|
8
|
+
Version 0.1.2
|
9
|
+
- Bugfix for Windows (Tempfile)
|
10
|
+
Thanks to Jérome Soika for testing
|
11
|
+
- Regexes optimized (a little bit)
|
12
|
+
- New class-method MiniExiftool.writable_tags
|
13
|
+
|
1
14
|
Version 0.1.1
|
2
15
|
- Fixing bug [#8073]
|
3
16
|
Handling the '-' in tag Self-timer
|
data/lib/mini_exiftool.rb
CHANGED
@@ -13,63 +13,70 @@
|
|
13
13
|
#
|
14
14
|
|
15
15
|
require 'fileutils'
|
16
|
-
require 'open3'
|
17
16
|
require 'tempfile'
|
17
|
+
require 'set'
|
18
18
|
|
19
19
|
# Simple OO access to the Exiftool command-line application.
|
20
20
|
class MiniExiftool
|
21
21
|
|
22
22
|
# Name of the exiftool command
|
23
|
-
|
23
|
+
@@cmd = 'exiftool'
|
24
24
|
|
25
25
|
attr_reader :filename
|
26
26
|
attr_accessor :numerical
|
27
27
|
|
28
|
-
VERSION = '0.
|
28
|
+
VERSION = '0.2.0'
|
29
29
|
|
30
30
|
# opts at the moment only support :numerical for numerical values
|
31
31
|
# (the -n parameter in the command line)
|
32
32
|
def initialize filename, *opts
|
33
|
-
@prog = ProgramName
|
34
33
|
@numerical = opts.include? :numerical
|
35
34
|
load filename
|
36
35
|
end
|
37
36
|
|
37
|
+
# Load the tags of filename
|
38
38
|
def load filename
|
39
|
-
|
39
|
+
unless File.exists? filename
|
40
|
+
raise MiniExiftool::Error.new("File '#{filename}' does not exist.")
|
41
|
+
end
|
40
42
|
@filename = filename
|
41
43
|
@values = {}
|
42
44
|
@tag_names = {}
|
43
45
|
@changed_values = {}
|
44
46
|
opt_params = @numerical ? '-n' : ''
|
45
|
-
cmd = %Q(
|
47
|
+
cmd = %Q(#@@cmd -e -q -q -s -t #{opt_params} "#{filename}")
|
46
48
|
if run(cmd)
|
47
49
|
parse_output
|
48
50
|
else
|
49
|
-
raise MiniExiftool::Error
|
51
|
+
raise MiniExiftool::Error.new(@error_text)
|
50
52
|
end
|
51
53
|
self
|
52
54
|
end
|
53
55
|
|
56
|
+
# Reload the tags of an already readed file
|
54
57
|
def reload
|
55
58
|
load @filename
|
56
59
|
end
|
57
60
|
|
61
|
+
# Returns the value of a tag
|
58
62
|
def [] tag
|
59
63
|
unified_tag = unify tag
|
60
64
|
@changed_values[unified_tag] || @values[unified_tag]
|
61
65
|
end
|
62
66
|
|
67
|
+
# Set the value of a tag
|
63
68
|
def []=(tag, val)
|
64
69
|
unified_tag = unify tag
|
65
70
|
converted_val = convert val
|
66
71
|
opt_params = converted_val.kind_of?(Numeric) ? '-n' : ''
|
67
|
-
cmd = %Q(
|
72
|
+
cmd = %Q(#@@cmd -q -q -P -overwrite_original #{opt_params} -#{unified_tag}="#{converted_val}" "#{temp_filename}")
|
68
73
|
if run(cmd)
|
69
74
|
@changed_values[unified_tag] = val
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
78
|
+
# Return true if any tag value is changed or if the value of a
|
79
|
+
# given tag is changed
|
73
80
|
def changed? tag=false
|
74
81
|
if tag
|
75
82
|
@changed_values.include? tag
|
@@ -78,6 +85,7 @@ class MiniExiftool
|
|
78
85
|
end
|
79
86
|
end
|
80
87
|
|
88
|
+
# Revert all changes or the change of a given tag
|
81
89
|
def revert tag=nil
|
82
90
|
if tag
|
83
91
|
unified_tag = unify tag
|
@@ -90,21 +98,24 @@ class MiniExiftool
|
|
90
98
|
res
|
91
99
|
end
|
92
100
|
|
101
|
+
# Returns an array of the tags (original tag names) of the readed file
|
93
102
|
def tags
|
94
103
|
@values.keys.map { |key| @tag_names[key] }
|
95
104
|
end
|
96
105
|
|
106
|
+
# Returns an array of all changed tags
|
97
107
|
def changed_tags
|
98
108
|
@changed_values.keys.map { |key| @tag_names[key] }
|
99
109
|
end
|
100
110
|
|
111
|
+
# Save the changes to the file
|
101
112
|
def save
|
102
113
|
result = false
|
103
114
|
@changed_values.each do |tag, val|
|
104
115
|
unified_tag = unify tag
|
105
116
|
converted_val = convert val
|
106
117
|
opt_params = converted_val.kind_of?(Numeric) ? '-n' : ''
|
107
|
-
cmd = %Q(
|
118
|
+
cmd = %Q(#@@cmd -q -q -P -overwrite_original #{opt_params} -#{unified_tag}="#{converted_val}" "#{filename}")
|
108
119
|
run(cmd)
|
109
120
|
result = true
|
110
121
|
end
|
@@ -112,12 +123,56 @@ class MiniExiftool
|
|
112
123
|
result
|
113
124
|
end
|
114
125
|
|
126
|
+
# Returns the command name of the called Exiftool application
|
127
|
+
def self.command
|
128
|
+
@@cmd
|
129
|
+
end
|
130
|
+
|
131
|
+
# Setting the command name of the called Exiftool application
|
132
|
+
def self.command= cmd
|
133
|
+
@@cmd = cmd
|
134
|
+
end
|
135
|
+
|
136
|
+
@@writable_tags = Set.new
|
137
|
+
|
138
|
+
# Returns a set of all possible writable tags of Exiftool
|
139
|
+
def self.writable_tags
|
140
|
+
if @@writable_tags.empty?
|
141
|
+
lines = `#{@@cmd} -listw`
|
142
|
+
@@writable_tags = Set.new
|
143
|
+
lines.each do |line|
|
144
|
+
next unless line =~ /^\s/
|
145
|
+
@@writable_tags |= line.chomp.split
|
146
|
+
end
|
147
|
+
end
|
148
|
+
@@writable_tags
|
149
|
+
end
|
150
|
+
|
151
|
+
# Returns the version of the Exiftool command-line application
|
152
|
+
def self.exiftool_version
|
153
|
+
output = `#{MiniExiftool.command} -ver 2>&1`
|
154
|
+
if $?.exitstatus == 0
|
155
|
+
return output
|
156
|
+
else
|
157
|
+
raise MiniExiftool::Error.new("Command '#{MiniExiftool.command}' not found")
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
115
161
|
private
|
116
162
|
|
163
|
+
@@error_file = Tempfile.new 'errors'
|
164
|
+
@@error_file.close
|
165
|
+
|
117
166
|
def run cmd
|
118
|
-
@output = `#{cmd}`
|
167
|
+
@output = `#{cmd} 2>#{@@error_file.path}`
|
119
168
|
@status = $?
|
120
|
-
@status.exitstatus == 0
|
169
|
+
unless @status.exitstatus == 0
|
170
|
+
@error_text = File.readlines(@@error_file.path).join
|
171
|
+
return false
|
172
|
+
else
|
173
|
+
@error_text = ''
|
174
|
+
return true
|
175
|
+
end
|
121
176
|
end
|
122
177
|
|
123
178
|
def unify name
|
@@ -134,8 +189,8 @@ class MiniExiftool
|
|
134
189
|
|
135
190
|
def method_missing symbol, *args
|
136
191
|
tag_name = symbol.id2name
|
137
|
-
if tag_name
|
138
|
-
self[tag_name
|
192
|
+
if tag_name.sub!(/=$/, '')
|
193
|
+
self[tag_name] = args.first
|
139
194
|
else
|
140
195
|
self[tag_name]
|
141
196
|
end
|
@@ -151,7 +206,7 @@ class MiniExiftool
|
|
151
206
|
end
|
152
207
|
|
153
208
|
def parse_line line
|
154
|
-
if line =~ /^([^\t]
|
209
|
+
if line =~ /^([^\t]+)\t(.*)$/
|
155
210
|
tag, value = $1, $2
|
156
211
|
case value
|
157
212
|
when /^\d{4}:\d\d:\d\d \d\d:\d\d:\d\d$/
|
@@ -174,6 +229,7 @@ class MiniExiftool
|
|
174
229
|
def temp_filename
|
175
230
|
unless @temp_filename
|
176
231
|
temp_file = Tempfile.new('mini-exiftool')
|
232
|
+
temp_file.close
|
177
233
|
FileUtils.cp(@filename, temp_file.path)
|
178
234
|
@temp_filename = temp_file.path
|
179
235
|
end
|
@@ -183,3 +239,6 @@ class MiniExiftool
|
|
183
239
|
class MiniExiftool::Error < Exception; end
|
184
240
|
|
185
241
|
end
|
242
|
+
|
243
|
+
# Test if we can run the Exiftool command
|
244
|
+
MiniExiftool.exiftool_version
|
data/test/test_other.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'mini_exiftool'
|
2
|
+
require 'test/unit'
|
3
|
+
begin
|
4
|
+
require 'turn'
|
5
|
+
rescue LoadError
|
6
|
+
end
|
7
|
+
|
8
|
+
class TestOther < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_command
|
11
|
+
cmd = MiniExiftool.command
|
12
|
+
assert_equal 'exiftool', cmd
|
13
|
+
MiniExiftool.command = 'non_existend'
|
14
|
+
assert_equal 'non_existend', MiniExiftool.command
|
15
|
+
assert_raises MiniExiftool::Error do
|
16
|
+
met = MiniExiftool.new(File.join(File.dirname(__FILE__),
|
17
|
+
'data/test.jpg'))
|
18
|
+
end
|
19
|
+
MiniExiftool.command = cmd
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_writable_tags
|
23
|
+
w_tags = MiniExiftool.writable_tags
|
24
|
+
assert w_tags.include?('ISO')
|
25
|
+
assert_equal false, w_tags.include?('xxxxxx')
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/test/test_read.rb
CHANGED
@@ -21,12 +21,22 @@ class TestRead < Test::Unit::TestCase
|
|
21
21
|
assert_raises MiniExiftool::Error do
|
22
22
|
MiniExiftool.new 'not_existing_file'
|
23
23
|
end
|
24
|
+
begin
|
25
|
+
MiniExiftool.new 'not_existing_file'
|
26
|
+
rescue MiniExiftool::Error => e
|
27
|
+
assert_match /File 'not_existing_file' does not exist/, e.message
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
def test_wrong_file
|
27
32
|
assert_raises MiniExiftool::Error do
|
28
33
|
MiniExiftool.new __FILE__ # file type wich Exiftool can not handle
|
29
34
|
end
|
35
|
+
begin
|
36
|
+
MiniExiftool.new __FILE__ # file type wich Exiftool can not handle
|
37
|
+
rescue MiniExiftool::Error => e
|
38
|
+
assert_match /Error: Unknown image type/, e.message
|
39
|
+
end
|
30
40
|
end
|
31
41
|
|
32
42
|
def test_access
|
data/test/test_write.rb
CHANGED
@@ -12,6 +12,7 @@ class TestWrite < Test::Unit::TestCase
|
|
12
12
|
|
13
13
|
def setup
|
14
14
|
@temp_file = Tempfile.new('test')
|
15
|
+
@temp_file.close
|
15
16
|
@temp_filename = @temp_file.path
|
16
17
|
@org_filename = File.dirname(__FILE__) + '/data/test.jpg'
|
17
18
|
FileUtils.cp(@org_filename, @temp_filename)
|
@@ -20,7 +21,7 @@ class TestWrite < Test::Unit::TestCase
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def teardown
|
23
|
-
@temp_file.
|
24
|
+
@temp_file.delete
|
24
25
|
end
|
25
26
|
|
26
27
|
def test_access_existing_tags
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.1
|
|
3
3
|
specification_version: 1
|
4
4
|
name: mini_exiftool
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-02-
|
6
|
+
version: 0.2.0
|
7
|
+
date: 2007-02-22 00:00:00 +01:00
|
8
8
|
summary: A library for nice OO access to the Exiftool command-line application written by Phil Harvey.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -33,6 +33,7 @@ files:
|
|
33
33
|
- test/test_write.rb
|
34
34
|
- test/test_read.rb
|
35
35
|
- test/test_special.rb
|
36
|
+
- test/test_other.rb
|
36
37
|
- Rakefile
|
37
38
|
- COPYING
|
38
39
|
- Changelog
|
@@ -44,6 +45,7 @@ test_files:
|
|
44
45
|
- test/test_write.rb
|
45
46
|
- test/test_read.rb
|
46
47
|
- test/test_special.rb
|
48
|
+
- test/test_other.rb
|
47
49
|
rdoc_options:
|
48
50
|
- --title
|
49
51
|
- MiniExiftool API documentation
|