mini_exiftool 2.6.0 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|