multi_exiftool 0.12.0 → 0.13.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 +5 -0
- data/README.md +35 -2
- data/Rakefile +3 -3
- data/lib/multi_exiftool.rb +22 -14
- data/lib/multi_exiftool/batch.rb +42 -0
- data/lib/multi_exiftool/executable.rb +3 -3
- data/lib/multi_exiftool/reader.rb +11 -3
- data/lib/multi_exiftool/writer.rb +3 -3
- data/multi_exiftool.gemspec +7 -7
- data/test/test_batch.rb +48 -0
- data/test/test_functional_api.rb +47 -0
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae8854c3ecd3b7d994ee26ac7ec90fdac4611143fd50fba1d96d1557a4e4ff2c
|
4
|
+
data.tar.gz: 66714930cb460368f930dbc655c4dfbd502d0e45b371f21786fe3d4c6c124e0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0783ca4711efe4a88dd30a23a10ab357d250ada9d8fae6474cbe5356d6fc59e88743868449495bb36efaf8f65d4db1eaff889b07903fdb4fc5f64d3b2813866
|
7
|
+
data.tar.gz: 9c91eb43576561b7dc712f3d0b05bda741fd2c4fb6f3542d7a56204cec09d2543e4d301060b66f3deb5a1b07c49537f32dcb4d0c5b869ec91b695b1409c035db
|
data/Changelog
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
0.13.0
|
2
|
+
Implement batch processing to allow to write different values to multiple file
|
3
|
+
with only one call of the ExifTool command-line application.
|
4
|
+
Update documentation.
|
5
|
+
|
1
6
|
0.12.0
|
2
7
|
Implement Values#respond_to_missing?.
|
3
8
|
Improve documentation and fix example code.
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
## Description
|
4
4
|
|
5
5
|
This library is a wrapper for the ExifTool command-line application
|
6
|
-
(
|
6
|
+
(https://exiftool.org) written by Phil Harvey.
|
7
7
|
It is designed for dealing with multiple files at once by creating
|
8
8
|
commands to call exiftool with various arguments, call it and parsing
|
9
9
|
the results.
|
@@ -60,6 +60,39 @@ else
|
|
60
60
|
end
|
61
61
|
```
|
62
62
|
|
63
|
+
If it is necessary to write different values to multiple files there is batch processing
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
require 'multi_exiftool'
|
67
|
+
|
68
|
+
# Object oriented approach
|
69
|
+
batch = Batch.new do
|
70
|
+
Dir['*.jpg'].each_with_index do |filename, i|
|
71
|
+
values = {creator: 'Jan Friedrich', copyright: 'Public Domain', comment: "This is file number #{i+1}."}
|
72
|
+
write filename, values
|
73
|
+
end
|
74
|
+
end
|
75
|
+
if batch.execute
|
76
|
+
puts 'ok'
|
77
|
+
else
|
78
|
+
puts batch.errors
|
79
|
+
end
|
80
|
+
|
81
|
+
# Functional approach
|
82
|
+
errors = MultiExiftool.batch do
|
83
|
+
Dir['*.jpg'].each_with_index do |filename, i|
|
84
|
+
values = {creator: 'Jan Friedrich', copyright: 'Public Domain', comment: "This is file number #{i+1}."}
|
85
|
+
write filename, values
|
86
|
+
end
|
87
|
+
end
|
88
|
+
if errors.empty?
|
89
|
+
puts 'ok'
|
90
|
+
else
|
91
|
+
puts batch.errors
|
92
|
+
end
|
93
|
+
```
|
94
|
+
|
95
|
+
|
63
96
|
### Deleting
|
64
97
|
|
65
98
|
```ruby
|
@@ -153,7 +186,7 @@ The method Values#convert is called each time a value is fetched.
|
|
153
186
|
- Ruby 1.9.1 or higher
|
154
187
|
- An installation of the ExifTool command-line application (version 7.65 or
|
155
188
|
higher). Instructions for installation you can find under
|
156
|
-
|
189
|
+
https://exiftool.org/install.html .
|
157
190
|
- If you have problems with special characters (like German umlauts) in
|
158
191
|
filenames on windows system it is recommended to use exiftool version 9.79
|
159
192
|
or higher.
|
data/Rakefile
CHANGED
@@ -11,8 +11,8 @@ Rim.setup do |p|
|
|
11
11
|
p.version = MultiExiftool::VERSION
|
12
12
|
p.authors = 'Jan Friedrich'
|
13
13
|
p.email = 'janfri26@gmail.com'
|
14
|
-
p.summary = 'This library is a wrapper for the ExifTool command-line application (
|
15
|
-
p.description = 'This library a is wrapper for the ExifTool command-line application (
|
14
|
+
p.summary = 'This library is a wrapper for the ExifTool command-line application (https://exiftool.org).'
|
15
|
+
p.description = 'This library a is wrapper for the ExifTool command-line application (https://exiftool.org) written by Phil Harvey. It is designed for dealing with multiple files at once by creating commands to call exiftool with various arguments, call it and parsing the results.'
|
16
16
|
p.ruby_version = '>=1.9.1'
|
17
17
|
p.license = 'MIT'
|
18
18
|
p.homepage = 'https://github.com/janfri/multi_exiftool'
|
@@ -21,7 +21,7 @@ Rim.setup do |p|
|
|
21
21
|
| Please ensure you have installed exiftool version 7.65 or higher and |
|
22
22
|
| it's found in your PATH (Try "exiftool -ver" on your commandline). |
|
23
23
|
| For more details see |
|
24
|
-
|
|
24
|
+
| https://exiftool.org/install.html |
|
25
25
|
+-----------------------------------------------------------------------+
|
26
26
|
}
|
27
27
|
p.development_dependencies << %w(contest ~>0.1)
|
data/lib/multi_exiftool.rb
CHANGED
@@ -4,10 +4,11 @@
|
|
4
4
|
require_relative 'multi_exiftool/values'
|
5
5
|
require_relative 'multi_exiftool/reader'
|
6
6
|
require_relative 'multi_exiftool/writer'
|
7
|
+
require_relative 'multi_exiftool/batch'
|
7
8
|
|
8
9
|
module MultiExiftool
|
9
10
|
|
10
|
-
VERSION = '0.
|
11
|
+
VERSION = '0.13.0'
|
11
12
|
|
12
13
|
@exiftool_command = 'exiftool'
|
13
14
|
|
@@ -25,15 +26,7 @@ module MultiExiftool
|
|
25
26
|
# # error handling
|
26
27
|
# end
|
27
28
|
def read filenames, opts={}
|
28
|
-
reader = Reader.new
|
29
|
-
reader.filenames = filenames
|
30
|
-
if val = opts.delete(:tags)
|
31
|
-
reader.tags = val
|
32
|
-
end
|
33
|
-
if val = opts.delete(:group)
|
34
|
-
reader.group = val
|
35
|
-
end
|
36
|
-
reader.options = opts unless opts.empty?
|
29
|
+
reader = Reader.new(filenames, opts)
|
37
30
|
values = reader.read
|
38
31
|
[values, reader.errors]
|
39
32
|
end
|
@@ -47,10 +40,7 @@ module MultiExiftool
|
|
47
40
|
# # do error handling
|
48
41
|
# end
|
49
42
|
def write filenames, values, opts={}
|
50
|
-
writer = Writer.new
|
51
|
-
writer.filenames = filenames
|
52
|
-
writer.values = values
|
53
|
-
writer.options = opts unless opts.empty?
|
43
|
+
writer = Writer.new(filenames, values, opts)
|
54
44
|
writer.write
|
55
45
|
writer.errors
|
56
46
|
end
|
@@ -75,6 +65,24 @@ module MultiExiftool
|
|
75
65
|
write(filenames, values)
|
76
66
|
end
|
77
67
|
|
68
|
+
|
69
|
+
# Execute a batch of write commands
|
70
|
+
# Returns an array of the error messages
|
71
|
+
#
|
72
|
+
# Example:
|
73
|
+
# errors = MultiExiftool.batch do
|
74
|
+
# Dir['*.jpg'].each_with_index do |filename, i|
|
75
|
+
# write filename, {author: 'Jan Friedrich', comment: "This is file number #{i+1}."}
|
76
|
+
# end
|
77
|
+
# unless errors.empty?
|
78
|
+
# # do error handling
|
79
|
+
# end
|
80
|
+
def batch &block
|
81
|
+
batch = Batch.new &block
|
82
|
+
batch.execute
|
83
|
+
batch.errors
|
84
|
+
end
|
85
|
+
|
78
86
|
attr_accessor :exiftool_command
|
79
87
|
attr_reader :exiftool_version
|
80
88
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative 'executable'
|
5
|
+
|
6
|
+
module MultiExiftool
|
7
|
+
|
8
|
+
# Allow to define a batch for different writing operations as one call of the
|
9
|
+
# ExifTool command-line application
|
10
|
+
class Batch
|
11
|
+
|
12
|
+
include Executable
|
13
|
+
|
14
|
+
# Define batch operation inside a block
|
15
|
+
def initialize &blk
|
16
|
+
@writers = []
|
17
|
+
instance_exec &blk
|
18
|
+
end
|
19
|
+
|
20
|
+
# Define a write operation for the batch.
|
21
|
+
def write filenames, values, options={}
|
22
|
+
w = MultiExiftool::Writer.new(filenames, values, options)
|
23
|
+
@writers << w
|
24
|
+
end
|
25
|
+
|
26
|
+
# Getting the command-line arguments which would be executed
|
27
|
+
# when calling #write. It could be useful for logging, debugging or
|
28
|
+
# whatever.
|
29
|
+
def exiftool_args
|
30
|
+
@writers.map {|w| w.exiftool_args + ['-execute']}.flatten
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def parse_results
|
36
|
+
@errors = @stderr.read.split(/\n/)
|
37
|
+
@errors.empty?
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -11,9 +11,9 @@ module MultiExiftool
|
|
11
11
|
attr_reader :errors
|
12
12
|
attr_accessor :filenames, :numerical, :options
|
13
13
|
|
14
|
-
def initialize
|
15
|
-
@options =
|
16
|
-
@filenames =
|
14
|
+
def initialize filenames=[], options={}
|
15
|
+
@options = options
|
16
|
+
@filenames = filenames
|
17
17
|
@option_mapping = {numerical: :n}
|
18
18
|
end
|
19
19
|
|
@@ -15,9 +15,17 @@ module MultiExiftool
|
|
15
15
|
|
16
16
|
include Executable
|
17
17
|
|
18
|
-
def initialize
|
19
|
-
super
|
20
|
-
|
18
|
+
def initialize filenames=[], opts={}
|
19
|
+
super(filenames, opts)
|
20
|
+
if val = opts.delete(:tags)
|
21
|
+
@tags = val
|
22
|
+
else
|
23
|
+
@tags = []
|
24
|
+
end
|
25
|
+
if val = opts.delete(:group)
|
26
|
+
@group = val
|
27
|
+
end
|
28
|
+
@options = opts unless opts.empty?
|
21
29
|
end
|
22
30
|
|
23
31
|
def self.mandatory_args
|
data/multi_exiftool.gemspec
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: multi_exiftool 0.
|
2
|
+
# stub: multi_exiftool 0.13.0 ruby lib
|
3
3
|
#
|
4
4
|
# This file is automatically generated by rim.
|
5
5
|
# PLEASE DO NOT EDIT IT DIRECTLY!
|
@@ -7,22 +7,22 @@
|
|
7
7
|
|
8
8
|
Gem::Specification.new do |s|
|
9
9
|
s.name = "multi_exiftool"
|
10
|
-
s.version = "0.
|
10
|
+
s.version = "0.13.0"
|
11
11
|
|
12
12
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
13
13
|
s.require_paths = ["lib"]
|
14
14
|
s.authors = ["Jan Friedrich"]
|
15
|
-
s.date = "2020-
|
16
|
-
s.description = "This library a is wrapper for the ExifTool command-line application (
|
15
|
+
s.date = "2020-02-03"
|
16
|
+
s.description = "This library a is wrapper for the ExifTool command-line application (https://exiftool.org) written by Phil Harvey. It is designed for dealing with multiple files at once by creating commands to call exiftool with various arguments, call it and parsing the results."
|
17
17
|
s.email = "janfri26@gmail.com"
|
18
|
-
s.files = ["./.aspell.pws", "Changelog", "Gemfile", "LICENSE", "README.md", "Rakefile", "lib/multi_exiftool", "lib/multi_exiftool.rb", "lib/multi_exiftool/executable.rb", "lib/multi_exiftool/reader.rb", "lib/multi_exiftool/values.rb", "lib/multi_exiftool/writer.rb", "multi_exiftool.gemspec", "regtest/read_all_tags.rb", "regtest/read_all_tags.yml", "regtest/test.jpg", "test/data", "test/data/a.jpg", "test/data/b.jpg", "test/data/c.jpg", "test/helper.rb", "test/test_executable.rb", "test/test_exiftool_stuff.rb", "test/test_functional_api.rb", "test/test_reader.rb", "test/test_values.rb", "test/test_values_using_groups.rb", "test/test_writer.rb", "test/test_writer_groups.rb"]
|
18
|
+
s.files = ["./.aspell.pws", "Changelog", "Gemfile", "LICENSE", "README.md", "Rakefile", "lib/multi_exiftool", "lib/multi_exiftool.rb", "lib/multi_exiftool/batch.rb", "lib/multi_exiftool/executable.rb", "lib/multi_exiftool/reader.rb", "lib/multi_exiftool/values.rb", "lib/multi_exiftool/writer.rb", "multi_exiftool.gemspec", "regtest/read_all_tags.rb", "regtest/read_all_tags.yml", "regtest/test.jpg", "test/data", "test/data/a.jpg", "test/data/b.jpg", "test/data/c.jpg", "test/helper.rb", "test/test_batch.rb", "test/test_executable.rb", "test/test_exiftool_stuff.rb", "test/test_functional_api.rb", "test/test_reader.rb", "test/test_values.rb", "test/test_values_using_groups.rb", "test/test_writer.rb", "test/test_writer_groups.rb"]
|
19
19
|
s.homepage = "https://github.com/janfri/multi_exiftool"
|
20
20
|
s.licenses = ["MIT"]
|
21
|
-
s.post_install_message = "\n+-----------------------------------------------------------------------+\n| Please ensure you have installed exiftool version 7.65 or higher and |\n| it's found in your PATH (Try \"exiftool -ver\" on your commandline). |\n| For more details see |\n|
|
21
|
+
s.post_install_message = "\n+-----------------------------------------------------------------------+\n| Please ensure you have installed exiftool version 7.65 or higher and |\n| it's found in your PATH (Try \"exiftool -ver\" on your commandline). |\n| For more details see |\n| https://exiftool.org/install.html |\n+-----------------------------------------------------------------------+\n "
|
22
22
|
s.required_ruby_version = Gem::Requirement.new(">= 1.9.1")
|
23
23
|
s.requirements = ["exiftool, version 7.65 or higher"]
|
24
24
|
s.rubygems_version = "3.1.2"
|
25
|
-
s.summary = "This library is a wrapper for the ExifTool command-line application (
|
25
|
+
s.summary = "This library is a wrapper for the ExifTool command-line application (https://exiftool.org)."
|
26
26
|
|
27
27
|
if s.respond_to? :specification_version then
|
28
28
|
s.specification_version = 4
|
data/test/test_batch.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require_relative 'helper'
|
5
|
+
|
6
|
+
class TestBatch < Test::Unit::TestCase
|
7
|
+
|
8
|
+
MANDATORY_WRITER_ARGS = MultiExiftool::Writer.mandatory_args
|
9
|
+
|
10
|
+
context 'exiftool_args method' do
|
11
|
+
|
12
|
+
setup do
|
13
|
+
@filenames = %w(a.jpg b.jpg c.jpg)
|
14
|
+
@multiple_values = @filenames.map do |filename|
|
15
|
+
{author: 'janfri', comment: "Comment for file #{filename}"}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'only filenames and values' do
|
20
|
+
filenames = @filenames
|
21
|
+
multiple_values = @multiple_values
|
22
|
+
batch = MultiExiftool::Batch.new do
|
23
|
+
filenames.zip multiple_values do |filename, values|
|
24
|
+
write filename, values
|
25
|
+
end
|
26
|
+
end
|
27
|
+
exiftool_args = filenames.zip(multiple_values).map do |filename, values|
|
28
|
+
[MANDATORY_WRITER_ARGS, '-author=janfri', "-comment=Comment for file #{filename}", filename, '-execute']
|
29
|
+
end.flatten
|
30
|
+
assert_equal exiftool_args, batch.exiftool_args
|
31
|
+
end
|
32
|
+
|
33
|
+
test 'filenames, values and options' do
|
34
|
+
filenames = @filenames
|
35
|
+
multiple_values = @multiple_values
|
36
|
+
options = {overwrite_original: true}
|
37
|
+
batch = MultiExiftool::Batch.new do
|
38
|
+
filenames.zip multiple_values do |filename, values|
|
39
|
+
write filename, values, options
|
40
|
+
end
|
41
|
+
end
|
42
|
+
exiftool_args = filenames.zip(multiple_values).map do |filename, _values|
|
43
|
+
[MANDATORY_WRITER_ARGS, '-overwrite_original', '-author=janfri', "-comment=Comment for file #{filename}", filename, '-execute']
|
44
|
+
end.flatten
|
45
|
+
assert_equal exiftool_args, batch.exiftool_args
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/test/test_functional_api.rb
CHANGED
@@ -188,4 +188,51 @@ class TestFunctionalApi < Test::Unit::TestCase
|
|
188
188
|
|
189
189
|
end
|
190
190
|
|
191
|
+
context 'batch' do
|
192
|
+
setup do
|
193
|
+
@filenames = %w(a.jpg b.jpg c.jpg)
|
194
|
+
@multiple_values = @filenames.map do |fn|
|
195
|
+
{author: 'Jan Friedrich', comment: "Comment for file #{fn}"}
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
test 'only filenames and values' do
|
200
|
+
run_in_temp_dir do
|
201
|
+
filenames = @filenames
|
202
|
+
multiple_values = @multiple_values
|
203
|
+
errors = MultiExiftool.batch do
|
204
|
+
filenames.zip multiple_values do |filename, values|
|
205
|
+
write filename, values
|
206
|
+
end
|
207
|
+
end
|
208
|
+
assert_equal [], errors
|
209
|
+
values, errors = MultiExiftool.read(@filenames)
|
210
|
+
assert_equal ['Jan Friedrich'] * 3, values.map {|e| e['Author']}
|
211
|
+
assert_equal ['Comment for file a.jpg', 'Comment for file b.jpg', 'Comment for file c.jpg'], values.map {|e| e['Comment']}
|
212
|
+
assert_equal [], errors
|
213
|
+
assert_equal 3, Dir['*_original'].size
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
test 'options with boolean argument' do
|
218
|
+
run_in_temp_dir do
|
219
|
+
filenames = @filenames
|
220
|
+
multiple_values = @multiple_values
|
221
|
+
options = {overwrite_original: true}
|
222
|
+
errors = MultiExiftool.batch do
|
223
|
+
filenames.zip multiple_values do |filename, values|
|
224
|
+
write filename, values, options
|
225
|
+
end
|
226
|
+
end
|
227
|
+
assert_equal [], errors
|
228
|
+
values, errors = MultiExiftool.read(@filenames)
|
229
|
+
assert_equal ['Jan Friedrich'] * 3, values.map {|e| e['Author']}
|
230
|
+
assert_equal ['Comment for file a.jpg', 'Comment for file b.jpg', 'Comment for file c.jpg'], values.map {|e| e['Comment']}
|
231
|
+
assert_equal [], errors
|
232
|
+
assert_equal [], Dir['*_original']
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
end
|
237
|
+
|
191
238
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multi_exiftool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.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: 2020-
|
11
|
+
date: 2020-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -80,7 +80,7 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '2'
|
83
|
-
description: This library a is wrapper for the ExifTool command-line application (
|
83
|
+
description: This library a is wrapper for the ExifTool command-line application (https://exiftool.org)
|
84
84
|
written by Phil Harvey. It is designed for dealing with multiple files at once by
|
85
85
|
creating commands to call exiftool with various arguments, call it and parsing the
|
86
86
|
results.
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
98
|
- lib/multi_exiftool.rb
|
99
|
+
- lib/multi_exiftool/batch.rb
|
99
100
|
- lib/multi_exiftool/executable.rb
|
100
101
|
- lib/multi_exiftool/reader.rb
|
101
102
|
- lib/multi_exiftool/values.rb
|
@@ -108,6 +109,7 @@ files:
|
|
108
109
|
- test/data/b.jpg
|
109
110
|
- test/data/c.jpg
|
110
111
|
- test/helper.rb
|
112
|
+
- test/test_batch.rb
|
111
113
|
- test/test_executable.rb
|
112
114
|
- test/test_exiftool_stuff.rb
|
113
115
|
- test/test_functional_api.rb
|
@@ -123,7 +125,7 @@ metadata: {}
|
|
123
125
|
post_install_message: "\n+-----------------------------------------------------------------------+\n|
|
124
126
|
Please ensure you have installed exiftool version 7.65 or higher and |\n| it's
|
125
127
|
found in your PATH (Try \"exiftool -ver\" on your commandline). |\n| For more
|
126
|
-
details see |\n|
|
128
|
+
details see |\n| https://exiftool.org/install.html
|
127
129
|
\ |\n+-----------------------------------------------------------------------+\n
|
128
130
|
\ "
|
129
131
|
rdoc_options: []
|
@@ -144,5 +146,5 @@ requirements:
|
|
144
146
|
rubygems_version: 3.1.2
|
145
147
|
signing_key:
|
146
148
|
specification_version: 4
|
147
|
-
summary: This library is a wrapper for the ExifTool command-line application (
|
149
|
+
summary: This library is a wrapper for the ExifTool command-line application (https://exiftool.org).
|
148
150
|
test_files: []
|