mini_exiftool 2.8.0 → 2.8.1
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 +4 -0
- data/README.md +181 -0
- data/Rakefile +1 -1
- data/Tutorial.md +215 -0
- data/lib/mini_exiftool.rb +1 -1
- data/test/test_from_hash.rb +1 -1
- data/test/test_read.rb +1 -1
- data/test/test_read_numerical.rb +2 -2
- metadata +5 -5
- data/README.rdoc +0 -137
- data/Tutorial.rdoc +0 -194
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2559eebe29019af3b0994df1a77e99b5bdea856
|
4
|
+
data.tar.gz: 67896c8639c4c237c4943d9aa51aa20598a9c9f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e73616156d2107208f35f9df53c644b7e8f4c397b4dfbe8af1ff5fe3651ee37c2e3c152c373dc9ce10b73162ea8ee0ba2543c433ebc79d23a0bca7de38fe010a
|
7
|
+
data.tar.gz: aec0a216d53f767fc4a1b6d2fc0fab00189a33ae8de4e34474008fd472fc99f152ddd832d17dfef7964864978a60a05c65b17b6f9249d8c17264f004a33afe8c
|
data/Changelog
CHANGED
data/README.md
ADDED
@@ -0,0 +1,181 @@
|
|
1
|
+
# MiniExiftool
|
2
|
+
|
3
|
+
This library is a wrapper for the ExifTool command-line application
|
4
|
+
(http://www.sno.phy.queensu.ca/~phil/exiftool) written by Phil Harvey.
|
5
|
+
It provides the full power of ExifTool to Ruby: reading and writing of
|
6
|
+
EXIF-data, IPTC-data and XMP-data.
|
7
|
+
|
8
|
+
## Requirements
|
9
|
+
|
10
|
+
Ruby 1.9 or higher and an installation of the ExifTool
|
11
|
+
command-line application at least version 7.65.
|
12
|
+
If you run on Ruby 1.8 or with a prior exiftool version
|
13
|
+
install mini_exiftool version 1.x.x.
|
14
|
+
Instructions for installation you can find under
|
15
|
+
http://www.sno.phy.queensu.ca/~phil/exiftool/install.html .
|
16
|
+
|
17
|
+
Alternatively Wil Gieseler has bundled a meta-gem that eliminates the
|
18
|
+
need for a separate ExifTool installation. Have a look at
|
19
|
+
http://github.com/wilg/mini_exiftool_vendored or
|
20
|
+
http://rubygems.org/gems/mini_exiftool_vendored .
|
21
|
+
|
22
|
+
## Installation
|
23
|
+
|
24
|
+
First you need ExifTool (see under Requirements above). Then you can simply
|
25
|
+
install the gem with
|
26
|
+
```sh
|
27
|
+
gem install mini_exiftool
|
28
|
+
```
|
29
|
+
or simply add to the following to your Gemfile:
|
30
|
+
```ruby
|
31
|
+
gem 'multi_exiftool'
|
32
|
+
```
|
33
|
+
|
34
|
+
If you need to support older versions of Ruby or Exiftool (see Requirements above)
|
35
|
+
|
36
|
+
```sh
|
37
|
+
gem install --version "< 2.0.0" mini_exiftool
|
38
|
+
```
|
39
|
+
|
40
|
+
or if you use a Gemfile add:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
gem 'multi_exiftool', '<2.0.0'
|
44
|
+
```
|
45
|
+
|
46
|
+
## Configuration
|
47
|
+
|
48
|
+
You can manually set the exiftool command that should be used via
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
MiniExiftool.command = '/path/to/my/exiftool'
|
52
|
+
```
|
53
|
+
|
54
|
+
In addition, you can also tell MiniExiftool where to store the PStore files with tags
|
55
|
+
which exiftool supports. The PStore files are used for performance issues.
|
56
|
+
Per default the PStore files are stored in a sub directory `.mini_exiftool` or
|
57
|
+
`_mini_exiftool` under your home directory.
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
MiniExiftool.pstore_dir = '/path/to/pstore/dir'
|
61
|
+
```
|
62
|
+
|
63
|
+
If you're using Rails, this is easily done with
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
MiniExiftool.pstore_dir = Rails.root.join('tmp').to_s
|
67
|
+
```
|
68
|
+
|
69
|
+
Important hint: if you have to change the configuration you have to do this direct
|
70
|
+
after `require 'mini_exiftool'`.
|
71
|
+
|
72
|
+
## Usage
|
73
|
+
|
74
|
+
In general MiniExiftool is very intuitive to use as the following examples show:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
# Reading meta data from a file
|
78
|
+
photo = MiniExiftool.new 'photo.jpg'
|
79
|
+
puts photo.title
|
80
|
+
|
81
|
+
# Alternative reading meta data from an IO instance
|
82
|
+
photo = MiniExiftool.new io
|
83
|
+
puts photo.title
|
84
|
+
|
85
|
+
# Writing meta data
|
86
|
+
photo = MiniExiftool.new 'photo.jpg'
|
87
|
+
photo.title = 'This is the new title'
|
88
|
+
photo.save
|
89
|
+
|
90
|
+
# Copying meta data
|
91
|
+
photo = MiniExiftool.new('photo.jpg')
|
92
|
+
photo.copy_tags_from('another_photo.jpg', :author)
|
93
|
+
```
|
94
|
+
|
95
|
+
For further information about using MiniExiftool read the Tutorial.md.
|
96
|
+
in the project root folder and have a look at the examples in directory
|
97
|
+
examples.
|
98
|
+
|
99
|
+
## Caveats
|
100
|
+
|
101
|
+
The philosophy of MiniExiftool is safety over performance.
|
102
|
+
It can not handle more than one file at once. Writing operations are
|
103
|
+
executed on a copy of the original file to have atomar writing: Either
|
104
|
+
all changed values are written or none.
|
105
|
+
To be able to assign errors to a specific tag writing operations also call
|
106
|
+
the Exiftool command-line application once for each changed tag!
|
107
|
+
|
108
|
+
In short: MiniExiftool has a very bad performance especially at write operations.
|
109
|
+
|
110
|
+
**If you work with many files it is strongly recommended not to use MiniExiftool
|
111
|
+
but instead my other gem [MultiExiftool](https://github.com/janfri/multi_exiftool).
|
112
|
+
This is designed to handle many files and do reading and writing fast.**
|
113
|
+
|
114
|
+
## Encodings
|
115
|
+
|
116
|
+
In MiniExiftool all strings are encoded in UTF-8. If you need other
|
117
|
+
encodings in your project use the String#encod* methods.
|
118
|
+
|
119
|
+
If you have problems with corrupted strings when using MiniExiftool
|
120
|
+
there are two reasons for this:
|
121
|
+
|
122
|
+
### Internal character sets
|
123
|
+
|
124
|
+
You can specify the charset in which the meta data is in the file encoded
|
125
|
+
if you read or write to some sections of meta data (i.e. IPTC, XMP ...).
|
126
|
+
It exists various options of the form *_encoding: exif, iptc, xmp, png,
|
127
|
+
id3, pdf, photoshop, quicktime, aiff, mie and vorbis.
|
128
|
+
|
129
|
+
For IPTC meta data it is recommended to set also the CodedCharacterSet
|
130
|
+
tag.
|
131
|
+
|
132
|
+
Please read the section about the character sets of the ExifTool command
|
133
|
+
line application carefully to understand what's going on
|
134
|
+
(http://www.sno.phy.queensu.ca/~phil/exiftool/faq.html#Q10)!
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
# Using UTF-8 as internal encoding for IPTC tags and MacRoman
|
138
|
+
# as internal encoding for EXIF tags
|
139
|
+
photo = MiniExiftool.new('photo.jpg', iptc_encoding: 'UTF8',
|
140
|
+
exif_encoding: 'MacRoman'
|
141
|
+
# IPTC CaptionAbstract is already UTF-8 encoded
|
142
|
+
puts photo.caption_abstract
|
143
|
+
# EXIF Comment is converted from MacRoman to UTF-8
|
144
|
+
puts photo.comment
|
145
|
+
|
146
|
+
photo = MiniExiftool.new('photo.jpg', iptc_encoding: 'UTF8',
|
147
|
+
exif_encoding: 'MacRoman'
|
148
|
+
# When saving IPTC data setting CodedCharacterSet as recommended
|
149
|
+
photo.coded_character_set = 'UTF8'
|
150
|
+
# IPTC CaptionAbstract will be stored in UTF-8 encoding
|
151
|
+
photo.caption_abstract = 'Some text with Ümläuts'
|
152
|
+
# EXIF Comment will be stored in MacRoman encoding
|
153
|
+
photo.comment = 'Comment with Ümläuts'
|
154
|
+
photo.save
|
155
|
+
```
|
156
|
+
|
157
|
+
### Corrupt characters
|
158
|
+
|
159
|
+
You use the correct internal character set but in the string are still corrupt
|
160
|
+
characters.
|
161
|
+
This problem you can solve with the option `replace_invalid_chars`:
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
# Replace all invalid characters with a question mark
|
165
|
+
photo = MiniExiftool.new('photo.jpg', replace_invalid_chars: '?')
|
166
|
+
```
|
167
|
+
|
168
|
+
## Contribution
|
169
|
+
|
170
|
+
The code is hosted in a git repository on github at
|
171
|
+
https://github.com/janfri/mini_exiftool
|
172
|
+
feel free to contribute!
|
173
|
+
|
174
|
+
## Author
|
175
|
+
Jan Friedrich <janfri26@gmail.com>
|
176
|
+
|
177
|
+
## Copyright / License
|
178
|
+
Copyright (c) 2007-2016 by Jan Friedrich
|
179
|
+
|
180
|
+
Licensed under terms of the GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1,
|
181
|
+
February 1999 (see file COPYING for more details)
|
data/Rakefile
CHANGED
@@ -19,7 +19,7 @@ EXIF-data, IPTC-data and XMP-data.
|
|
19
19
|
END
|
20
20
|
p.homepage = 'https://github.com/janfri/mini_exiftool'
|
21
21
|
p.license = 'LGPL-2.1'
|
22
|
-
p.gem_files << 'Tutorial.
|
22
|
+
p.gem_files << 'Tutorial.md'
|
23
23
|
p.gem_files += FileList.new('examples/**')
|
24
24
|
p.install_message = <<-END
|
25
25
|
+-----------------------------------------------------------------------+
|
data/Tutorial.md
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
# Mini Tutorial
|
2
|
+
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
|
6
|
+
* Installing the ExifTool command-line application from Phil Harvey
|
7
|
+
(see http://www.sno.phy.queensu.ca/~phil/exiftool/install.html)
|
8
|
+
* Installing the Ruby library (`gem install mini_exiftool`)
|
9
|
+
|
10
|
+
|
11
|
+
## Lesson 1: Reading Meta Data
|
12
|
+
|
13
|
+
### A Simple Example
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
require 'mini_exiftool'
|
17
|
+
|
18
|
+
photo = MiniExiftool.new 'photo.jpg'
|
19
|
+
puts photo['DateTimeOriginal']
|
20
|
+
```
|
21
|
+
|
22
|
+
### Smart Tag Names
|
23
|
+
In the example above we use `photo['DateTimeOriginal']` to
|
24
|
+
get the value for the time the photo was taken. But tag names are not
|
25
|
+
case sensitive and additional underlines are also irrelevant. So
|
26
|
+
following expressions are equivalent:
|
27
|
+
```ruby
|
28
|
+
photo['DateTimeOriginal']
|
29
|
+
photo['datetimeoriginal']
|
30
|
+
photo['date_time_original']
|
31
|
+
```
|
32
|
+
|
33
|
+
It is also possible to use symbols:
|
34
|
+
```ruby
|
35
|
+
photo[:DateTimeOriginal]
|
36
|
+
photo[:datetimeoriginal]
|
37
|
+
photo[:date_time_original]
|
38
|
+
```
|
39
|
+
|
40
|
+
### Nicer Access Via Dynamic Methods
|
41
|
+
|
42
|
+
Using the []-method is the safest way to access to values of tags
|
43
|
+
(e. g. Self-timer you can only access this way) but the smarter way is
|
44
|
+
using dynamic method access. You can write:
|
45
|
+
```ruby
|
46
|
+
photo.datetimeoriginal
|
47
|
+
```
|
48
|
+
or also
|
49
|
+
```ruby
|
50
|
+
photo.date_time_original
|
51
|
+
```
|
52
|
+
|
53
|
+
### Value Types
|
54
|
+
|
55
|
+
Following types of values are at the moment supported:
|
56
|
+
* Array (e. g. Keywords => ['tree', 'gras'])
|
57
|
+
* Integer (e. g. ISO => 400)
|
58
|
+
* Float (e. g. FNumber => 9.5)
|
59
|
+
* String (e. g. Model => DYNAX 7D)
|
60
|
+
* Time (e. g. DateTimeOriginal => 2005:09:13 20:08:50)
|
61
|
+
|
62
|
+
Be aware, if there is only one value in a tag which can hold multiple
|
63
|
+
values the result isn't an array! But you can get one with the Array
|
64
|
+
method:
|
65
|
+
```ruby
|
66
|
+
# only _one_ keyword
|
67
|
+
p1 = MiniExiftool.new 'p1.jpg'
|
68
|
+
p1.keywords # => 'red'
|
69
|
+
# _more than one_ keywords
|
70
|
+
p3 = MiniExiftool.new 'p3.jpg'
|
71
|
+
p3.keywords # => ['red', 'yellow', 'green']
|
72
|
+
|
73
|
+
# if we want to get an array in both cases and don't know
|
74
|
+
# if there is one ore more values set let's take Array()
|
75
|
+
Array(p1.keywords) # => ['red']
|
76
|
+
Array(p3.keywords) # => ['red', 'yellow', 'green']
|
77
|
+
```
|
78
|
+
|
79
|
+
### Using options
|
80
|
+
|
81
|
+
The ExifTool command-line application has an option (-n) to get values
|
82
|
+
as numbers if possible, in MiniExiftool you can do this with setting
|
83
|
+
the `:numerical` option to `true` while generating a new
|
84
|
+
instance with new or using the `numerical=`-method
|
85
|
+
combining with calling `reload`.
|
86
|
+
|
87
|
+
Let's look at an example:
|
88
|
+
```ruby
|
89
|
+
# standard: numerical is false
|
90
|
+
photo = MiniExiftool.new 'photo.jpg'
|
91
|
+
photo.exposure_time # => '1/60 (Rational)
|
92
|
+
# now with numerical is true
|
93
|
+
photo.numerical = true
|
94
|
+
photo.reload
|
95
|
+
photo.exposure_time # => 0.01666667 (Float)
|
96
|
+
```
|
97
|
+
|
98
|
+
This behaviour can be useful if you want to do calculations on the
|
99
|
+
value, if you only want to show the value the standard behaviour is
|
100
|
+
maybe better.
|
101
|
+
|
102
|
+
The Time class of Ruby cannot handle timestamps before 1st January 1970
|
103
|
+
on some platforms. If there are timestamps in files before this date it
|
104
|
+
will result in an error. In this case we can set the option
|
105
|
+
`:timestamps` to `DateTime` to use DateTime objects instead
|
106
|
+
of Time objects.
|
107
|
+
|
108
|
+
There is another option `:composite`. If this is set to
|
109
|
+
`false` the composite tags are not calculated by the exiftool
|
110
|
+
command-line application (option -e).
|
111
|
+
|
112
|
+
Further options are
|
113
|
+
* `:ignore_minor_errors` to ignore minor
|
114
|
+
errors (See -m-option of the exiftool command-line application,
|
115
|
+
default is `false`)
|
116
|
+
* `:coord_format` set format for GPS coordinates (See
|
117
|
+
-c-option of the exiftool command-line application, default is `nil`
|
118
|
+
that means exiftool standard)
|
119
|
+
* `:fast` useful when reading JPEGs over a slow network connection
|
120
|
+
(See -fast-option of the exiftool command-line application, default is `false`)
|
121
|
+
* `:fast2` useful when reading JPEGs over a slow network connection
|
122
|
+
(See -fast2-option of the exiftool command-line application, default is `false`)
|
123
|
+
* `:replace_invalid_chars` replace string for invalid
|
124
|
+
UTF-8 characters or `false` if no replacing should be done,
|
125
|
+
default is `false`
|
126
|
+
* `:exif_encoding`, `:iptc_encoding`,
|
127
|
+
`:xmp_encoding`, `:png_encoding`,
|
128
|
+
`:id3_encoding`, `:pdf_encoding`,
|
129
|
+
`:photoshop_encoding`, `:quicktime_encoding`,
|
130
|
+
`:aiff_encoding`, `:mie_encoding`,
|
131
|
+
`:vorbis_encoding` to set this specific encoding (see
|
132
|
+
-charset option of the exiftool command-line application, default is
|
133
|
+
`nil`: no encoding specified)
|
134
|
+
|
135
|
+
### Using an IO instance
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
require 'mini_exiftool'
|
139
|
+
require 'open3'
|
140
|
+
|
141
|
+
# Using external curl command
|
142
|
+
input, output = Open3.popen2("curl -s http://www.url.of.a.photo")
|
143
|
+
input.close
|
144
|
+
photo = MiniExiftool.new output
|
145
|
+
puts photo['ISO']
|
146
|
+
```
|
147
|
+
|
148
|
+
The kind of the parameter `filename_or_io` is determined via duck typing:
|
149
|
+
if the argument responds to `to_str` it is interpreted as filename, if it
|
150
|
+
responds to `read` it is interpreted es IO instance.
|
151
|
+
Attention: If you use an IO instance then writing of values is not supported!
|
152
|
+
|
153
|
+
Look at the show_speedup_with_fast_option example in the MiniExiftool examples
|
154
|
+
directory for more details about using an IO instance.
|
155
|
+
|
156
|
+
|
157
|
+
## Lesson 2: Writing Meta Data
|
158
|
+
|
159
|
+
### Also A Very Simple Example
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
require 'mini_exiftool'
|
163
|
+
|
164
|
+
photo = MiniExiftool.new 'photo.jpg'
|
165
|
+
photo.comment = 'hello world'
|
166
|
+
photo.save
|
167
|
+
```
|
168
|
+
|
169
|
+
|
170
|
+
### Save Is Atomar
|
171
|
+
|
172
|
+
If you have changed several values and call the `save`-method either
|
173
|
+
all changes will be written to the file or nothing. The return value
|
174
|
+
of the `save`-method is `true` if all values are written to the file
|
175
|
+
otherwise save returns `false`. In the last case you can use the
|
176
|
+
`errors`-method which returns a hash of the tags which values couldn't
|
177
|
+
be written with an error message for each of them.
|
178
|
+
|
179
|
+
|
180
|
+
### Interesting Methods
|
181
|
+
|
182
|
+
Have a look at the `changed?`-method for checking if the
|
183
|
+
value of a specific tag is changed or a changing in general is
|
184
|
+
done. In the same way the `revert`-method reverts the value of a
|
185
|
+
specific tag or in general all changes.
|
186
|
+
|
187
|
+
You should also look at the rdoc information of MiniExiftool.
|
188
|
+
|
189
|
+
|
190
|
+
## Lesson 3: Copying Meta Data
|
191
|
+
|
192
|
+
### Examples
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
require 'mini_exiftool'
|
196
|
+
|
197
|
+
photo = MiniExiftool.new('photo.jpg')
|
198
|
+
|
199
|
+
# Update the author tag of photo.jpg with the value of the author tag
|
200
|
+
# of another_photo.jpg
|
201
|
+
photo.copy_tags_from('another_photo.jpg', 'Author')
|
202
|
+
|
203
|
+
# It's also possible to use symbols and case is also not meaningful
|
204
|
+
photo.copy_tags_from('another_photo.jpg', :author)
|
205
|
+
|
206
|
+
# Further more than one tag can be copied at once
|
207
|
+
photo.copy_tags_from('another_photo', %w[author copyright])
|
208
|
+
```
|
209
|
+
|
210
|
+
Look at the file copy_icc_profile.rb in the examples folder of MiniExiftool.
|
211
|
+
|
212
|
+
|
213
|
+
## Further Examples
|
214
|
+
|
215
|
+
Have a look in the examples folder of MiniExiftool.
|
data/lib/mini_exiftool.rb
CHANGED
data/test/test_from_hash.rb
CHANGED
@@ -13,7 +13,7 @@ class TestFromHash < TestCase
|
|
13
13
|
assert_kind_of Time, @mini_exiftool['DateTimeOriginal']
|
14
14
|
assert_kind_of Float, @mini_exiftool['MaxApertureValue']
|
15
15
|
assert_kind_of String, @mini_exiftool.flash
|
16
|
-
assert_kind_of
|
16
|
+
assert_kind_of Integer, @mini_exiftool['ExposureCompensation']
|
17
17
|
assert_kind_of String, (@mini_exiftool['SubjectLocation'] || @mini_exiftool['SubjectArea'])
|
18
18
|
assert_kind_of Array, @mini_exiftool['Keywords']
|
19
19
|
assert_kind_of String, @mini_exiftool['SupplementalCategories']
|
data/test/test_read.rb
CHANGED
@@ -27,7 +27,7 @@ class TestRead < TestCase
|
|
27
27
|
assert_kind_of Time, @mini_exiftool['DateTimeOriginal']
|
28
28
|
assert_kind_of Float, @mini_exiftool['MaxApertureValue']
|
29
29
|
assert_kind_of String, @mini_exiftool.flash
|
30
|
-
assert_kind_of
|
30
|
+
assert_kind_of Integer, @mini_exiftool['ExposureCompensation']
|
31
31
|
assert_kind_of String, (@mini_exiftool['SubjectLocation'] || @mini_exiftool['SubjectArea'])
|
32
32
|
assert_kind_of Array, @mini_exiftool['Keywords']
|
33
33
|
assert_kind_of String, @mini_exiftool['SupplementalCategories']
|
data/test/test_read_numerical.rb
CHANGED
@@ -22,9 +22,9 @@ class TestReadNumerical < TestCase
|
|
22
22
|
assert_kind_of String, @mini_exiftool_num.model
|
23
23
|
assert_kind_of Time, @mini_exiftool_num['DateTimeOriginal']
|
24
24
|
assert_kind_of Float, @mini_exiftool_num['MaxApertureValue']
|
25
|
-
assert_kind_of
|
25
|
+
assert_kind_of Integer, @mini_exiftool_num.flash
|
26
26
|
assert_kind_of String, @mini_exiftool_num.exif_version
|
27
|
-
assert_kind_of
|
27
|
+
assert_kind_of Integer, @mini_exiftool_num['ExposureCompensation']
|
28
28
|
assert_kind_of String, (@mini_exiftool_num['SubjectLocation'] || @mini_exiftool_num['SubjectArea'])
|
29
29
|
assert_kind_of Array, @mini_exiftool_num['Keywords']
|
30
30
|
assert_kind_of String, @mini_exiftool_num['SupplementalCategories']
|
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.8.
|
4
|
+
version: 2.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Friedrich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rim
|
@@ -78,9 +78,9 @@ extra_rdoc_files: []
|
|
78
78
|
files:
|
79
79
|
- COPYING
|
80
80
|
- Changelog
|
81
|
-
- README.
|
81
|
+
- README.md
|
82
82
|
- Rakefile
|
83
|
-
- Tutorial.
|
83
|
+
- Tutorial.md
|
84
84
|
- examples/copy_icc_profile.rb
|
85
85
|
- examples/external_photo.rb
|
86
86
|
- examples/print_portraits.rb
|
@@ -146,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
146
|
version: '0'
|
147
147
|
requirements: []
|
148
148
|
rubyforge_project:
|
149
|
-
rubygems_version: 2.6.
|
149
|
+
rubygems_version: 2.6.12
|
150
150
|
signing_key:
|
151
151
|
specification_version: 4
|
152
152
|
summary: This library is a wrapper for the ExifTool command-line application (http://www.sno.phy.queensu.ca/~phil/exiftool).
|
data/README.rdoc
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
= MiniExiftool
|
2
|
-
|
3
|
-
This library is a wrapper for the ExifTool command-line application
|
4
|
-
(http://www.sno.phy.queensu.ca/~phil/exiftool) written by Phil Harvey.
|
5
|
-
It provides the full power of ExifTool to Ruby: reading and writing of
|
6
|
-
EXIF-data, IPTC-data and XMP-data.
|
7
|
-
|
8
|
-
== Requirements
|
9
|
-
|
10
|
-
Ruby 1.9 or higher and an installation of the ExifTool
|
11
|
-
command-line application at least version 7.65.
|
12
|
-
If you run on Ruby 1.8 or with a prior exiftool version
|
13
|
-
install mini_exiftool version 1.x.x.
|
14
|
-
Instructions for installation you can find under
|
15
|
-
http://www.sno.phy.queensu.ca/~phil/exiftool/install.html .
|
16
|
-
|
17
|
-
Alternatively Wil Gieseler has bundled a meta-gem that eliminates the
|
18
|
-
need for a separate ExifTool installation. Have a look at
|
19
|
-
http://github.com/wilg/mini_exiftool_vendored or
|
20
|
-
http://rubygems.org/gems/mini_exiftool_vendored .
|
21
|
-
|
22
|
-
== Installation
|
23
|
-
|
24
|
-
First you need ExifTool (see under Requirements above). Then you can simply
|
25
|
-
install the gem with
|
26
|
-
gem install mini_exiftool
|
27
|
-
|
28
|
-
If you need to support older versions of Ruby or exiftool (see Requirements above)
|
29
|
-
gem install --version "< 2.0.0" mini_exiftool
|
30
|
-
|
31
|
-
== Configuration
|
32
|
-
|
33
|
-
You can manually set the exiftool command that should be used via
|
34
|
-
MiniExiftool.command = '/path/to/my/exiftool'
|
35
|
-
|
36
|
-
In addition, you can also tell MiniExiftool where to store the PStore files with tags
|
37
|
-
which exiftool supports. The PStore files are used for performance issues.
|
38
|
-
Per default the PStore files are stored in a sub directory .mini_exiftool or
|
39
|
-
_mini_exiftool under your home directory.
|
40
|
-
MiniExiftool.pstore_dir = '/path/to/pstore/dir'
|
41
|
-
|
42
|
-
If you're using Rails, this is easily done with
|
43
|
-
MiniExiftool.pstore_dir = Rails.root.join('tmp').to_s
|
44
|
-
|
45
|
-
Important hint: if you have to change the configuration you have to do this direct
|
46
|
-
after require 'mini_exiftool'.
|
47
|
-
|
48
|
-
== Usage
|
49
|
-
|
50
|
-
In general MiniExiftool is very intuitive to use as the following examples show:
|
51
|
-
|
52
|
-
# Reading meta data from a file
|
53
|
-
photo = MiniExiftool.new 'photo.jpg'
|
54
|
-
puts photo.title
|
55
|
-
|
56
|
-
# Alternative reading meta data from an IO instance
|
57
|
-
photo = MiniExiftool.new io
|
58
|
-
puts photo.title
|
59
|
-
|
60
|
-
# Writing meta data
|
61
|
-
photo = MiniExiftool.new 'photo.jpg'
|
62
|
-
photo.title = 'This is the new title'
|
63
|
-
photo.save
|
64
|
-
|
65
|
-
# Copying meta data
|
66
|
-
photo = MiniExiftool.new('photo.jpg')
|
67
|
-
photo.copy_tags_from('another_photo.jpg', :author)
|
68
|
-
|
69
|
-
|
70
|
-
For further information about using MiniExiftool read the Tutorial.rdoc
|
71
|
-
in the project root folder and have a look at the examples in directory
|
72
|
-
examples.
|
73
|
-
|
74
|
-
== Encodings
|
75
|
-
|
76
|
-
In MiniExiftool all strings are encoded in UTF-8. If you need other
|
77
|
-
encodings in your project use the String#encod* methods.
|
78
|
-
|
79
|
-
If you have problems with corrupted strings when using MiniExiftool
|
80
|
-
there are two reasons for this:
|
81
|
-
|
82
|
-
=== Internal character sets
|
83
|
-
|
84
|
-
You can specify the charset in which the meta data is in the file encoded
|
85
|
-
if you read or write to some sections of meta data (i.e. IPTC, XMP ...).
|
86
|
-
It exists various options of the form *_encoding: exif, iptc, xmp, png,
|
87
|
-
id3, pdf, photoshop, quicktime, aiff, mie and vorbis.
|
88
|
-
|
89
|
-
For IPTC meta data it is recommended to set also the CodedCharacterSet
|
90
|
-
tag.
|
91
|
-
|
92
|
-
Please read the section about the character sets of the ExifTool command
|
93
|
-
line application carefully to understand what's going on
|
94
|
-
(http://www.sno.phy.queensu.ca/~phil/exiftool/faq.html#Q10)!
|
95
|
-
|
96
|
-
# Using UTF-8 as internal encoding for IPTC tags and MacRoman
|
97
|
-
# as internal encoding for EXIF tags
|
98
|
-
photo = MiniExiftool.new('photo.jpg', iptc_encoding: 'UTF8',
|
99
|
-
exif_encoding: 'MacRoman'
|
100
|
-
# IPTC CaptionAbstract is already UTF-8 encoded
|
101
|
-
puts photo.caption_abstract
|
102
|
-
# EXIF Comment is converted from MacRoman to UTF-8
|
103
|
-
puts photo.comment
|
104
|
-
|
105
|
-
photo = MiniExiftool.new('photo.jpg', iptc_encoding: 'UTF8',
|
106
|
-
exif_encoding: 'MacRoman'
|
107
|
-
# When saving IPTC data setting CodedCharacterSet as recommended
|
108
|
-
photo.coded_character_set = 'UTF8'
|
109
|
-
# IPTC CaptionAbstract will be stored in UTF-8 encoding
|
110
|
-
photo.caption_abstract = 'Some text with Ümläuts'
|
111
|
-
# EXIF Comment will be stored in MacRoman encoding
|
112
|
-
photo.comment = 'Comment with Ümläuts'
|
113
|
-
photo.save
|
114
|
-
|
115
|
-
=== Corrupt characters
|
116
|
-
|
117
|
-
You use the correct internal character set but in the string are still corrupt
|
118
|
-
characters.
|
119
|
-
This problem you can solve with the option replace_invalid_chars:
|
120
|
-
|
121
|
-
# Replace all invalid characters with a question mark
|
122
|
-
photo = MiniExiftool.new('photo.jpg', replace_invalid_chars: '?')
|
123
|
-
|
124
|
-
== Contribution
|
125
|
-
|
126
|
-
The code is hosted in a git repository on github at
|
127
|
-
https://github.com/janfri/mini_exiftool
|
128
|
-
feel free to contribute!
|
129
|
-
|
130
|
-
== Author
|
131
|
-
Jan Friedrich <janfri26@gmail.com>
|
132
|
-
|
133
|
-
== Copyright / License
|
134
|
-
Copyright (c) 2007-2016 by Jan Friedrich
|
135
|
-
|
136
|
-
Licensed under terms of the GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1,
|
137
|
-
February 1999 (see file COPYING for more details)
|
data/Tutorial.rdoc
DELETED
@@ -1,194 +0,0 @@
|
|
1
|
-
= Mini Tutorial
|
2
|
-
|
3
|
-
|
4
|
-
== Installation
|
5
|
-
|
6
|
-
* Installing the ExifTool command-line application from Phil Harvey
|
7
|
-
(see http://www.sno.phy.queensu.ca/~phil/exiftool/install.html)
|
8
|
-
* Installing the Ruby library (<code>gem install mini_exiftool</code>)
|
9
|
-
|
10
|
-
|
11
|
-
== Lesson 1: Reading Meta Data
|
12
|
-
|
13
|
-
=== A Simple Example
|
14
|
-
|
15
|
-
require 'mini_exiftool'
|
16
|
-
|
17
|
-
photo = MiniExiftool.new 'photo.jpg'
|
18
|
-
puts photo['DateTimeOriginal']
|
19
|
-
|
20
|
-
=== Smart Tag Names
|
21
|
-
In the example above we use <code>photo['DateTimeOriginal']</code> to
|
22
|
-
get the value for the time the photo was taken. But tag names are not
|
23
|
-
case sensitive and additional underlines are also irrelevant. So
|
24
|
-
following expressions are equivalent:
|
25
|
-
photo['DateTimeOriginal']
|
26
|
-
photo['datetimeoriginal']
|
27
|
-
photo['date_time_original']
|
28
|
-
|
29
|
-
It is also possible to use symbols:
|
30
|
-
photo[:DateTimeOriginal]
|
31
|
-
photo[:datetimeoriginal]
|
32
|
-
photo[:date_time_original]
|
33
|
-
|
34
|
-
=== Nicer Access Via Dynamic Methods
|
35
|
-
|
36
|
-
Using the []-method is the safest way to access to values of tags
|
37
|
-
(e. g. Self-timer you can only access this way) but the smarter way is
|
38
|
-
using dynamic method access. You can write:
|
39
|
-
photo.datetimeoriginal
|
40
|
-
or also
|
41
|
-
photo.date_time_original
|
42
|
-
|
43
|
-
=== Value Types
|
44
|
-
|
45
|
-
Following types of values are at the moment supported:
|
46
|
-
* Array (e. g. Keywords => ['tree', 'gras'])
|
47
|
-
* Fixnum (e. g. ISO => 400)
|
48
|
-
* Float (e. g. FNumber => 9.5)
|
49
|
-
* String (e. g. Model => DYNAX 7D)
|
50
|
-
* Time (e. g. DateTimeOriginal => 2005:09:13 20:08:50)
|
51
|
-
|
52
|
-
Be aware, if there is only one value in a tag which can hold multiple
|
53
|
-
values the result isn't an array! But you can get one with the Array
|
54
|
-
method:
|
55
|
-
# only _one_ keyword
|
56
|
-
p1 = MiniExiftool.new 'p1.jpg'
|
57
|
-
p1.keywords # => 'red'
|
58
|
-
# _more than one_ keywords
|
59
|
-
p3 = MiniExiftool.new 'p3.jpg'
|
60
|
-
p3.keywords # => ['red', 'yellow', 'green']
|
61
|
-
|
62
|
-
# if we want to get an array in both cases and don't know
|
63
|
-
# if there is one ore more values set let's take Array()
|
64
|
-
Array(p1.keywords) # => ['red']
|
65
|
-
Array(p3.keywords) # => ['red', 'yellow', 'green']
|
66
|
-
|
67
|
-
=== Using options
|
68
|
-
|
69
|
-
The ExifTool command-line application has an option (-n) to get values
|
70
|
-
as numbers if possible, in MiniExiftool you can do this with setting
|
71
|
-
the <code>:numerical</code> option to +true+ while generating a new
|
72
|
-
instance with new or using the <code>numerical=</code>-method
|
73
|
-
combining with calling <code>reload</code>.
|
74
|
-
|
75
|
-
Let's look at an example:
|
76
|
-
# standard: numerical is false
|
77
|
-
photo = MiniExiftool.new 'photo.jpg'
|
78
|
-
photo.exposure_time # => '1/60' (String)
|
79
|
-
# now with numerical is true
|
80
|
-
photo.numerical = true
|
81
|
-
photo.reload
|
82
|
-
photo.exposure_time # => 0.01666667 (Float)
|
83
|
-
This behaviour can be useful if you want to do calculations on the
|
84
|
-
value, if you only want to show the value the standard behaviour is
|
85
|
-
maybe better.
|
86
|
-
|
87
|
-
The Time class of Ruby cannot handle timestamps before 1st January 1970
|
88
|
-
on some platforms. If there are timestamps in files before this date it
|
89
|
-
will result in an error. In this case we can set the option
|
90
|
-
<code>:timestamps</code> to +DateTime+ to use DateTime objects instead
|
91
|
-
of Time objects.
|
92
|
-
|
93
|
-
There is another option <code>:composite</code>. If this is set to
|
94
|
-
+false+ the composite tags are not calculated by the exiftool
|
95
|
-
command-line application (option -e).
|
96
|
-
|
97
|
-
Further options are
|
98
|
-
* <code>:ignore_minor_errors</code> to ignore minor
|
99
|
-
errors (See -m-option of the exiftool command-line application,
|
100
|
-
default is +false+)
|
101
|
-
* <code>:coord_format</code> set format for GPS coordinates (See
|
102
|
-
-c-option of the exiftool command-line application, default is +nil+
|
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+)
|
108
|
-
* <code>:replace_invalid_chars</code> replace string for invalid
|
109
|
-
UTF-8 characters or +false+ if no replacing should be done,
|
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)
|
119
|
-
|
120
|
-
=== Using an IO instance
|
121
|
-
|
122
|
-
require 'mini_exiftool'
|
123
|
-
require 'open3'
|
124
|
-
|
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']
|
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
|
141
|
-
|
142
|
-
=== Also A Very Simple Example
|
143
|
-
|
144
|
-
require 'mini_exiftool'
|
145
|
-
|
146
|
-
photo = MiniExiftool.new 'photo.jpg'
|
147
|
-
photo.comment = 'hello world'
|
148
|
-
photo.save
|
149
|
-
|
150
|
-
|
151
|
-
=== Save Is Atomar
|
152
|
-
|
153
|
-
If you have changed several values and call the +save+-method either
|
154
|
-
all changes will be written to the file or nothing. The return value
|
155
|
-
of the +save+-method is +true+ if all values are written to the file
|
156
|
-
otherwise save returns +false+. In the last case you can use the
|
157
|
-
+errors+-method which returns a hash of the tags which values couldn't
|
158
|
-
be written with an error message for each of them.
|
159
|
-
|
160
|
-
|
161
|
-
=== Interesting Methods
|
162
|
-
|
163
|
-
Have a look at the <code>changed?</code>-method for checking if the
|
164
|
-
value of a specific tag is changed or a changing in general is
|
165
|
-
done. In the same way the +revert+-method reverts the value of a
|
166
|
-
specific tag or in general all changes.
|
167
|
-
|
168
|
-
You should also look at the rdoc information of MiniExiftool.
|
169
|
-
|
170
|
-
|
171
|
-
== Lesson 3: Copying Meta Data
|
172
|
-
|
173
|
-
=== Examples
|
174
|
-
|
175
|
-
require 'mini_exiftool'
|
176
|
-
|
177
|
-
photo = MiniExiftool.new('photo.jpg')
|
178
|
-
|
179
|
-
# Update the author tag of photo.jpg with the value of the author tag
|
180
|
-
# of another_photo.jpg
|
181
|
-
photo.copy_tags_from('another_photo.jpg', 'Author')
|
182
|
-
|
183
|
-
# It's also possible to use symbols and case is also not meaningful
|
184
|
-
photo.copy_tags_from('another_photo.jpg', :author)
|
185
|
-
|
186
|
-
# Further more than one tag can be copied at once
|
187
|
-
photo.copy_tags_from('another_photo', %w[author copyright])
|
188
|
-
|
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.
|