mini_exiftool 2.6.0 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog +9 -0
- data/README.rdoc +5 -1
- data/Tutorial.rdoc +38 -16
- data/lib/mini_exiftool.rb +20 -10
- data/test/test_io.rb +6 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a1a8c6d521b719133ac256c568185efbb46b261
|
4
|
+
data.tar.gz: 538c8f074435883a599b39a522e4e24d15c8a7d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd2cbfa6f6b5b0f11d30dec2c7a0b4cbd6566120d7a86065d62340607ba746bd0ea0ec7d07d45f1a88c77d96357cca9750b1ba49be72bc135a9f51d2520bda5a
|
7
|
+
data.tar.gz: 1ae605775fb808b8e26b486c6addd8c99c0b5d859b0c159fadbd888578b5aa7f09eeafdff2c9dd958e2174e86b3537af4c375f420178bc948e91b2ee3fe5fd79
|
data/Changelog
CHANGED
@@ -1,7 +1,16 @@
|
|
1
|
+
2.7.0
|
2
|
+
- Use duck typing to determine if filename_or_io is a filename or an IO
|
3
|
+
instance.
|
4
|
+
- New option :fast2.
|
5
|
+
- Add example show_speedup_with_fast_option.
|
6
|
+
- Update docs.
|
7
|
+
|
1
8
|
2.6.0
|
2
9
|
- Support reading from IO instances.
|
10
|
+
Thanks to Gaelan <gbs@canishe.com> for the idea.
|
3
11
|
- New option :fast to increase speed when extracting information from JPEG
|
4
12
|
images which are piped across a slow network connection.
|
13
|
+
Thanks to Felipe Cypriano <felipe@cypriano.me> for the idea.
|
5
14
|
- Refactoring: Use Open3 for all command-line calls.
|
6
15
|
|
7
16
|
2.5.1
|
data/README.rdoc
CHANGED
@@ -48,10 +48,14 @@ after require 'mini_exiftool'.
|
|
48
48
|
|
49
49
|
In general MiniExiftool is very intuitive to use as the following examples show:
|
50
50
|
|
51
|
-
# Reading meta data
|
51
|
+
# Reading meta data from a file
|
52
52
|
photo = MiniExiftool.new 'photo.jpg'
|
53
53
|
puts photo.title
|
54
54
|
|
55
|
+
# Alternative reading meta data from an IO instance
|
56
|
+
photo = MiniExiftool.new io
|
57
|
+
puts photo.title
|
58
|
+
|
55
59
|
# Writing meta data
|
56
60
|
photo = MiniExiftool.new 'photo.jpg'
|
57
61
|
photo.title = 'This is the new title'
|
data/Tutorial.rdoc
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
photo = MiniExiftool.new 'photo.jpg'
|
18
18
|
puts photo['DateTimeOriginal']
|
19
19
|
|
20
|
-
|
21
20
|
=== Smart Tag Names
|
22
21
|
In the example above we use <code>photo['DateTimeOriginal']</code> to
|
23
22
|
get the value for the time the photo was taken. But tag names are not
|
@@ -41,7 +40,6 @@ using dynamic method access. You can write:
|
|
41
40
|
or also
|
42
41
|
photo.date_time_original
|
43
42
|
|
44
|
-
|
45
43
|
=== Value Types
|
46
44
|
|
47
45
|
Following types of values are at the moment supported:
|
@@ -52,7 +50,7 @@ Following types of values are at the moment supported:
|
|
52
50
|
* Time (e. g. DateTimeOriginal => 2005:09:13 20:08:50)
|
53
51
|
|
54
52
|
Be aware, if there is only one value in a tag which can hold multiple
|
55
|
-
values the result
|
53
|
+
values the result isn't an array! But you can get one with the Array
|
56
54
|
method:
|
57
55
|
# only _one_ keyword
|
58
56
|
p1 = MiniExiftool.new 'p1.jpg'
|
@@ -103,18 +101,43 @@ Further options are
|
|
103
101
|
* <code>:coord_format</code> set format for GPS coordinates (See
|
104
102
|
-c-option of the exiftool command-line application, default is +nil+
|
105
103
|
that means exiftool standard)
|
104
|
+
* <code>:fast</code> useful when reading JPEGs over a slow network connection
|
105
|
+
(See -fast-option of the exiftool command-line application, default is +false+)
|
106
|
+
* <code>:fast2</code> useful when reading JPEGs over a slow network connection
|
107
|
+
(See -fast2-option of the exiftool command-line application, default is +false+)
|
106
108
|
* <code>:replace_invalid_chars</code> replace string for invalid
|
107
109
|
UTF-8 characters or +false+ if no replacing should be done,
|
108
110
|
default is +false+
|
111
|
+
* <code>:exif_encoding</code>, <code>:iptc_encoding</code>,
|
112
|
+
<code>:xmp_encoding</code>, <code>:png_encoding</code>,
|
113
|
+
<code>:id3_encoding</code>, <code>:pdf_encoding</code>,
|
114
|
+
<code>:photoshop_encoding</code>, <code>:quicktime_encoding</code>,
|
115
|
+
<code>:aiff_encoding</code>, <code>:mie_encoding</code>,
|
116
|
+
<code>:vorbis_encoding</code> to set this specific encoding (see
|
117
|
+
-charset option of the exiftool command-line application, default is
|
118
|
+
+nil+: no encoding specified)
|
109
119
|
|
110
|
-
===
|
120
|
+
=== Using an IO instance
|
111
121
|
|
112
|
-
|
113
|
-
|
114
|
-
directory.
|
122
|
+
require 'mini_exiftool'
|
123
|
+
require 'open3'
|
115
124
|
|
116
|
-
|
125
|
+
# Using external curl command
|
126
|
+
input, output = Open3.popen2("curl -s http://www.url.of.a.photo")
|
127
|
+
input.close
|
128
|
+
photo = MiniExiftool.new output
|
129
|
+
puts photo['ISO']
|
117
130
|
|
131
|
+
The kind of the parameter +filename_or_io+ is determined via duck typing:
|
132
|
+
if the argument responds to +to_str+ it is interpreted as filename, if it
|
133
|
+
responds to +read+ it is interpreted es IO instance.
|
134
|
+
Attention: If you use an IO instance then writing of values is not supported!
|
135
|
+
|
136
|
+
Look at the show_speedup_with_fast_option example in the MiniExiftool examples
|
137
|
+
directory for more details about using an IO instance.
|
138
|
+
|
139
|
+
|
140
|
+
== Lesson 2: Writing Meta Data
|
118
141
|
|
119
142
|
=== Also A Very Simple Example
|
120
143
|
|
@@ -127,12 +150,12 @@ directory.
|
|
127
150
|
|
128
151
|
=== Save Is Atomar
|
129
152
|
|
130
|
-
If you have changed
|
153
|
+
If you have changed several values and call the +save+-method either
|
131
154
|
all changes will be written to the file or nothing. The return value
|
132
155
|
of the +save+-method is +true+ if all values are written to the file
|
133
156
|
otherwise save returns +false+. In the last case you can use the
|
134
157
|
+errors+-method which returns a hash of the tags which values couldn't
|
135
|
-
be
|
158
|
+
be written with an error message for each of them.
|
136
159
|
|
137
160
|
|
138
161
|
=== Interesting Methods
|
@@ -144,10 +167,6 @@ specific tag or in general all changes.
|
|
144
167
|
|
145
168
|
You should also look at the rdoc information of MiniExiftool.
|
146
169
|
|
147
|
-
=== Further Examples
|
148
|
-
|
149
|
-
Have a look in the examples folder of MiniExiftool.
|
150
|
-
|
151
170
|
|
152
171
|
== Lesson 3: Copying Meta Data
|
153
172
|
|
@@ -167,6 +186,9 @@ Have a look in the examples folder of MiniExiftool.
|
|
167
186
|
# Further more than one tag can be copied at once
|
168
187
|
photo.copy_tags_from('another_photo', %w[author copyright])
|
169
188
|
|
170
|
-
=== Further Example
|
171
|
-
|
172
189
|
Look at the file copy_icc_profile.rb in the examples folder of MiniExiftool.
|
190
|
+
|
191
|
+
|
192
|
+
== Further Examples
|
193
|
+
|
194
|
+
Have a look in the examples folder of MiniExiftool.
|
data/lib/mini_exiftool.rb
CHANGED
@@ -26,14 +26,15 @@ require 'time'
|
|
26
26
|
# Simple OO access to the Exiftool command-line application.
|
27
27
|
class MiniExiftool
|
28
28
|
|
29
|
-
VERSION = '2.
|
29
|
+
VERSION = '2.7.0'
|
30
30
|
|
31
31
|
# Name of the Exiftool command-line application
|
32
32
|
@@cmd = 'exiftool'
|
33
33
|
|
34
34
|
# Hash of the standard options used when call MiniExiftool.new
|
35
|
-
@@opts = { :numerical => false, :composite => true, :fast => false, :
|
36
|
-
|
35
|
+
@@opts = { :numerical => false, :composite => true, :fast => false, :fast2 => false,
|
36
|
+
:ignore_minor_errors => false, :replace_invalid_chars => false,
|
37
|
+
:timestamps => Time }
|
37
38
|
|
38
39
|
# Encoding of the filesystem (filenames in command line)
|
39
40
|
@@fs_enc = Encoding.find('filesystem')
|
@@ -64,6 +65,12 @@ class MiniExiftool
|
|
64
65
|
opts_accessor encoding_opt(enc_type)
|
65
66
|
end
|
66
67
|
|
68
|
+
# +filename_or_io+ The kind of the parameter is determined via duck typing:
|
69
|
+
# if the argument responds to +to_str+ it is interpreted as filename, if it
|
70
|
+
# responds to +read+ it is interpreted es IO instance.
|
71
|
+
#
|
72
|
+
# <b>ATTENTION:</b> If using an IO instance writing of meta data is not supported!
|
73
|
+
#
|
67
74
|
# +opts+ support at the moment
|
68
75
|
# * <code>:numerical</code> for numerical values, default is +false+
|
69
76
|
# * <code>:composite</code> for including composite tags while loading,
|
@@ -75,6 +82,8 @@ class MiniExiftool
|
|
75
82
|
# that means exiftool standard)
|
76
83
|
# * <code>:fast</code> useful when reading JPEGs over a slow network connection
|
77
84
|
# (See -fast-option of the exiftool command-line application, default is +false+)
|
85
|
+
# * <code>:fast2</code> useful when reading JPEGs over a slow network connection
|
86
|
+
# (See -fast2-option of the exiftool command-line application, default is +false+)
|
78
87
|
# * <code>:replace_invalid_chars</code> replace string for invalid
|
79
88
|
# UTF-8 characters or +false+ if no replacing should be done,
|
80
89
|
# default is +false+
|
@@ -121,16 +130,15 @@ class MiniExiftool
|
|
121
130
|
|
122
131
|
# Load the tags of filename or io.
|
123
132
|
def load filename_or_io
|
124
|
-
|
125
|
-
when String
|
133
|
+
if filename_or_io.respond_to? :to_str # String-like
|
126
134
|
unless filename_or_io && File.exist?(filename_or_io)
|
127
135
|
raise MiniExiftool::Error.new("File '#{filename_or_io}' does not exist.")
|
128
136
|
end
|
129
137
|
if File.directory?(filename_or_io)
|
130
138
|
raise MiniExiftool::Error.new("'#{filename_or_io}' is a directory.")
|
131
139
|
end
|
132
|
-
@filename = filename_or_io
|
133
|
-
|
140
|
+
@filename = filename_or_io.to_str
|
141
|
+
elsif filename_or_io.respond_to? :read # IO-like
|
134
142
|
@io = filename_or_io
|
135
143
|
@filename = '-'
|
136
144
|
else
|
@@ -143,6 +151,7 @@ class MiniExiftool
|
|
143
151
|
params << (@opts[:composite] ? '' : '-e ')
|
144
152
|
params << (@opts[:coord_format] ? "-c \"#{@opts[:coord_format]}\"" : '')
|
145
153
|
params << (@opts[:fast] ? '-fast ' : '')
|
154
|
+
params << (@opts[:fast2] ? '-fast2 ' : '')
|
146
155
|
params << generate_encoding_params
|
147
156
|
if run(cmd_gen(params, @filename))
|
148
157
|
parse_output
|
@@ -384,11 +393,12 @@ class MiniExiftool
|
|
384
393
|
status = Open3.popen3(cmd) do |inp, out, err, thr|
|
385
394
|
if @io
|
386
395
|
begin
|
387
|
-
|
388
|
-
rescue
|
396
|
+
IO.copy_stream @io, inp
|
397
|
+
rescue Errno::EPIPE
|
398
|
+
# Output closed, no problem
|
399
|
+
rescue ::IOError => e
|
389
400
|
raise MiniExiftool::Error.new("IO is not readable.")
|
390
401
|
end
|
391
|
-
inp.write data
|
392
402
|
@io.close
|
393
403
|
inp.close
|
394
404
|
end
|
data/test/test_io.rb
CHANGED
@@ -36,7 +36,7 @@ class TestIo < TestCase
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def test_fast_options
|
40
40
|
$DEBUG = true
|
41
41
|
s = StringIO.new
|
42
42
|
$stderr = s
|
@@ -48,6 +48,11 @@ class TestIo < TestCase
|
|
48
48
|
MiniExiftool.new open_real_io, :fast => true
|
49
49
|
s.rewind
|
50
50
|
assert_equal 'exiftool -j -fast "-"', s.read.chomp
|
51
|
+
s = StringIO.new
|
52
|
+
$stderr = s
|
53
|
+
MiniExiftool.new open_real_io, :fast2 => true
|
54
|
+
s.rewind
|
55
|
+
assert_equal 'exiftool -j -fast2 "-"', s.read.chomp
|
51
56
|
ensure
|
52
57
|
$DEBUG = false
|
53
58
|
$stderr = STDERR
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_exiftool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Friedrich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rim
|