exiftool_vendored 11.99.0 → 12.11.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/bin/Changes +201 -2
- data/bin/MANIFEST +8 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +43 -42
- data/bin/exiftool +172 -99
- data/bin/lib/Image/ExifTool.pm +170 -117
- data/bin/lib/Image/ExifTool.pod +132 -97
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +21 -10
- data/bin/lib/Image/ExifTool/Canon.pm +202 -13
- data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
- data/bin/lib/Image/ExifTool/DPX.pm +56 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +22 -3
- data/bin/lib/Image/ExifTool/EXE.pm +8 -5
- data/bin/lib/Image/ExifTool/Exif.pm +15 -6
- data/bin/lib/Image/ExifTool/Font.pm +9 -2
- data/bin/lib/Image/ExifTool/GIF.pm +6 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +2 -2
- data/bin/lib/Image/ExifTool/GoPro.pm +48 -22
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +86 -12
- data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
- data/bin/lib/Image/ExifTool/Import.pm +12 -9
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
- data/bin/lib/Image/ExifTool/MPF.pm +2 -2
- data/bin/lib/Image/ExifTool/MacOS.pm +154 -38
- data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +143 -17
- data/bin/lib/Image/ExifTool/Olympus.pm +40 -17
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +5 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +148 -14
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +34 -0
- data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +11 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +240 -37
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
- data/bin/lib/Image/ExifTool/README +25 -21
- data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
- data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
- data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -0
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
- data/bin/lib/Image/ExifTool/Sony.pm +423 -39
- data/bin/lib/Image/ExifTool/Stim.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5798 -5675
- data/bin/lib/Image/ExifTool/TagNames.pod +575 -100
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +30 -21
- data/bin/lib/Image/ExifTool/Writer.pl +49 -24
- data/bin/lib/Image/ExifTool/XMP.pm +99 -17
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -0
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
- data/bin/perl-Image-ExifTool.spec +42 -41
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +9 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b7f2c837f1bff7860cad5011a04c5671d88d4a761c197c2442c73791c5d87b22
|
|
4
|
+
data.tar.gz: 49b1ea22c9fe6668b08f0b021cbe492cc9b870d931d92a4fe127ba7ada41d757
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a66c9d7b5f2f9f4118ff5c4355fbff604a7173c0b6a90349e2884624a55e1216e77b9e00c958515447d58d5f9d3e612f48e6608aeea8ae6ee3528512c39db1b2
|
|
7
|
+
data.tar.gz: 6d74f8b745f7c964dad82bca92d98c07b318d4895d12d4f10cfc2e8c212d326abdd02e60afff8af7e936c2b89802277b4ae79b4f3d1da2642f0ffd9e4717d0eb
|
data/bin/Changes
CHANGED
|
@@ -4,9 +4,207 @@ ExifTool Version History
|
|
|
4
4
|
|
|
5
5
|
RSS feed: https://exiftool.org/rss.xml
|
|
6
6
|
|
|
7
|
-
Note: The most recent production release is Version
|
|
7
|
+
Note: The most recent production release is Version 12.00. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to CPAN.)
|
|
9
9
|
|
|
10
|
+
Nov. 27, 2020 - Version 12.11
|
|
11
|
+
|
|
12
|
+
- Added -csvDelim option
|
|
13
|
+
- Added new Canon and Olympus LensType values (thanks LibRaw)
|
|
14
|
+
- Added a warning if ICC_Profile is deleted from an image (github issue #63)
|
|
15
|
+
- EndDir() function for -if option now works when -fileOrder is used
|
|
16
|
+
- Changed FileSize conversion to use binary prefixes since that is how the
|
|
17
|
+
conversion is currently done (eg. MiB instead of MB)
|
|
18
|
+
- Patched -csv option so columns aren't resorted when using -G option and one
|
|
19
|
+
of the tags is missing from a file
|
|
20
|
+
- Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
|
|
21
|
+
to MP4 videos
|
|
22
|
+
- Fixed problem where the tags available in a -p format string were limited to
|
|
23
|
+
the same as the -if[NUM] option when NUM was specified
|
|
24
|
+
- Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
|
|
25
|
+
models
|
|
26
|
+
|
|
27
|
+
Nov. 12, 2020 - Version 12.10
|
|
28
|
+
|
|
29
|
+
- Added -validate test for proper TIFF magic number in JPEG EXIF header
|
|
30
|
+
- Added support for Nikon Z7 LensData version 0801
|
|
31
|
+
- Added a new XMP-GPano tag
|
|
32
|
+
- Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw)
|
|
33
|
+
- Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost)
|
|
34
|
+
- Automatically apply QuickTimeUTC option for CR3 files
|
|
35
|
+
- Improved decoding of XAttrMDLabel from MacOS files
|
|
36
|
+
- Ignore time zones when writing date/time values and using the -d option
|
|
37
|
+
- Enhanced -echo3 and -echo4 options to allow exit status to be returned
|
|
38
|
+
- Changed -execute so the -q option no longer suppresses the "{ready}" message
|
|
39
|
+
when a synchronization number is used (eg. -execute123)
|
|
40
|
+
|
|
41
|
+
Oct. 29, 2020 - Version 12.09
|
|
42
|
+
|
|
43
|
+
- Added ability to copy CanonMakerNotes from CR3 images to other file types
|
|
44
|
+
- Added read support for ON1 presets file (.ONP)
|
|
45
|
+
- Added two new CanonModelID values
|
|
46
|
+
- Added trailing "/" when writing QuickTime:GPSCoordinates
|
|
47
|
+
- Added a number of new XMP-crs tags
|
|
48
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
|
49
|
+
- Added a new Nikon Z lens (thanks LibRaw)
|
|
50
|
+
- Added a new Canon LensType
|
|
51
|
+
- Decode ColorData for Canon EOS R5/R6
|
|
52
|
+
- Decode a couple of new HEIF tags
|
|
53
|
+
- Decode FirmwareVersion for Canon M50
|
|
54
|
+
- Improved decoding of Sony CreativeStyle tags (thanks Jos Roost)
|
|
55
|
+
- Improved parsing of Radiance files to recognize comments
|
|
56
|
+
- Renamed GIF AspectRatio tag to PixelAspectRatio
|
|
57
|
+
- Patched EndDir() feature so subdirectories are always processed when -r is
|
|
58
|
+
used (previously, EndDir() would end processing of a directory completely)
|
|
59
|
+
- Yet another tweak to the EventTime formatting rules (also allow time-only
|
|
60
|
+
values with fractional seconds and a time zone)
|
|
61
|
+
- Avoid loading GoPro module unnecessarily when reading MP4 videos from some
|
|
62
|
+
other cameras
|
|
63
|
+
- Fixed problem with an incorrect naming of CodecID tags in some MKV videos
|
|
64
|
+
- Fixed verbose output to avoid "adding" messages for existing flattened XMP
|
|
65
|
+
tags
|
|
66
|
+
|
|
67
|
+
Oct. 15, 2020 - Version 12.08
|
|
68
|
+
|
|
69
|
+
- Added read support for MacOS "._" sidecar files
|
|
70
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
|
71
|
+
- Recognize Mac OS X xattr files
|
|
72
|
+
- Extract ThumbnailImage from MP4 videos of more dashcam models
|
|
73
|
+
- Improved decoding of a number of Sony tags (thanks Jos Roost)
|
|
74
|
+
- Fixed problem where the special -if EndDir() function didn't work properly
|
|
75
|
+
for directories after the one in which it was initially called
|
|
76
|
+
- Patched to read DLL files which don't have a .rsrc section (thanks Hank)
|
|
77
|
+
- Patched to support new IGC date format when geotagging
|
|
78
|
+
- Patched to read DLL files with an invalid size in the header
|
|
79
|
+
|
|
80
|
+
Oct. 2, 2020 - Version 12.07
|
|
81
|
+
|
|
82
|
+
- Added support for GoPro .360 videos
|
|
83
|
+
- Added some new Canon RF and Nikkor Z lenses (thanks LibRaw)
|
|
84
|
+
- Added some new Sony LensType and CreativeStyle values and decode some
|
|
85
|
+
ILCE-7C tags (thanks Jos Roost)
|
|
86
|
+
- Added a number of new Olympus SceneMode values (thanks Herb)
|
|
87
|
+
- Added a new Nikon LensID
|
|
88
|
+
- Decode more timed metadata from Insta360 videos (thanks Thomas Allen)
|
|
89
|
+
- Decode timed GPS from videos of more Garmin dashcam models
|
|
90
|
+
- Decode a new GoPro video tag
|
|
91
|
+
- Reformat time-only EventTime values when writing and prevent arbitrary
|
|
92
|
+
strings from being written
|
|
93
|
+
- Patched to accept backslashes in SourceFile entries for -csv option
|
|
94
|
+
|
|
95
|
+
Sept. 11, 2020 - Version 12.06
|
|
96
|
+
|
|
97
|
+
- Added read support for Lyrics3 metadata (and fixed problem where APE
|
|
98
|
+
metadata may be ignored if Lyrics3 exists)
|
|
99
|
+
- Added a new Panasonic VideoBurstMode value (thanks Klaus Homeister)
|
|
100
|
+
- Added a new Olympus MultipleExposureMode value
|
|
101
|
+
- Added a new Nikon LensID
|
|
102
|
+
- Added back conversions for XMP-dwc EventTime that were removed in 12.04 with
|
|
103
|
+
a patch to allow time-only values
|
|
104
|
+
- Decode GIF AspectRatio
|
|
105
|
+
- Decode Olympus FocusBracketStepSize (thanks Karsten)
|
|
106
|
+
- Extract PNG iDOT chunk in Binary format with the name AppleDataOffsets
|
|
107
|
+
- Process PNG images which do not start with mandatory IHDR chunk
|
|
108
|
+
|
|
109
|
+
Aug. 24, 2020 - Version 12.05
|
|
110
|
+
|
|
111
|
+
- Added a new Panasonic SelfTimer value (thanks Herb)
|
|
112
|
+
- Decode a few more DPX tags (thanks Harry Mallon)
|
|
113
|
+
- Extract AIFF APPL tag as ApplicationData
|
|
114
|
+
- Fixed bug writing QuickTime ItemList 'gnre' Genre values
|
|
115
|
+
- Fixed an incorrect value for Panasonic VideoBurstResolution (thanks Herb)
|
|
116
|
+
- Fixed problem when applying a time shift to some invalid makernote date/time
|
|
117
|
+
values
|
|
118
|
+
|
|
119
|
+
Aug. 10, 2020 - Version 12.04
|
|
120
|
+
|
|
121
|
+
- Added read support for Zeiss ZISRAW CZI files
|
|
122
|
+
- Added some new values for a couple of Olympus tags (thanks Sebastian)
|
|
123
|
+
- Decode a number of new tags for the Sony ILCE-7SM3 (thanks Jos Roost)
|
|
124
|
+
- Removed formatting restrictions on XMP-dwc:EventTime to allow a time-only
|
|
125
|
+
value to be written
|
|
126
|
+
- Moved new QuckTime ItemList tags added in version 12.02 to the proper group
|
|
127
|
+
(they were incorrectly added to the Keys group)
|
|
128
|
+
- Improved QuickTime -v3 output to show default language codes
|
|
129
|
+
- Patched -lang option to work for the values of somet tags with coded
|
|
130
|
+
translations
|
|
131
|
+
- Patched the format of a number of QuickTime tags when writing for improved
|
|
132
|
+
compatibility with iTunes and AtomicParsley
|
|
133
|
+
- Patched to write a default QuickTime language code of 0x0000 (null) instead
|
|
134
|
+
of 0x55c4 ('und')
|
|
135
|
+
|
|
136
|
+
July 29, 2020 - Version 12.03
|
|
137
|
+
|
|
138
|
+
- Added family 7 group names to allow tag ID's to be specified when reading
|
|
139
|
+
and writing
|
|
140
|
+
- Fixed a couple of typos in tag values (thanks Herb)
|
|
141
|
+
- API Changes:
|
|
142
|
+
- Added HexTagIDs option
|
|
143
|
+
- Enhanced GetNewValue() to allow family 7 groups names to be used
|
|
144
|
+
- Internal Changes:
|
|
145
|
+
- Changed Composite tag ID's to use "-" instead of "::" as a separator
|
|
146
|
+
|
|
147
|
+
July 27, 2020 - Version 12.02
|
|
148
|
+
|
|
149
|
+
- Added support for a number of new QuickTime ItemList tags
|
|
150
|
+
- Added support for writing XMP-xmp:RatingPercent
|
|
151
|
+
- Added a new Sony LensType (thanks Jos Roost and LibRaw)
|
|
152
|
+
- Added a new Pentax LensType (thanks James O'Neill)
|
|
153
|
+
- Decode barcodes from Ricoh APP5 RMETA segment
|
|
154
|
+
- Decode a few new QuickTime tags written by Ricoh and Garmin cameras
|
|
155
|
+
- Decode timed GPS from Sony A7R IV MP4 videos
|
|
156
|
+
- Decode timed GPS from 70mai dashcam videos
|
|
157
|
+
- Decode a few new Panasonic tags (thanks Klaus Homeister)
|
|
158
|
+
- Decode altitude and more accurate latitude/longitude from Transcend Driver
|
|
159
|
+
Pro 230 MP4 videos
|
|
160
|
+
- Improved decoding of some Canon EOS 1DXmkIII custom functions
|
|
161
|
+
- Allow integer QuickTime TrackNumber and DiskNumber values
|
|
162
|
+
- Relax validity check of QuickTime:ContentCreateDate when writing with -n
|
|
163
|
+
- Removed "Com" from the start of some unknown ItemList tag names
|
|
164
|
+
- Patched CanonCustom decoding for bug in Canon EOS-1DX firmware
|
|
165
|
+
- Changed QuickTime CleanAperture tags decode as signed rationals
|
|
166
|
+
|
|
167
|
+
June 24, 2020 - Version 12.01
|
|
168
|
+
|
|
169
|
+
- Added a new NEFCompression value (thanks Warren Hatch)
|
|
170
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
|
171
|
+
- Decode timed GPS from Rove Stealth 4K dashcam videos
|
|
172
|
+
- Fixed bug which would corrupt TIFF images with 16-bit image data offsets
|
|
173
|
+
when writing (these are very rare)
|
|
174
|
+
|
|
175
|
+
June 11, 2020 - Version 12.00 (production release)
|
|
176
|
+
|
|
177
|
+
- Added two new Olympus LensTypes (thanks Don Komarechka for one)
|
|
178
|
+
- Added two new Sony LensType values (thanks Jos Roost)
|
|
179
|
+
- Added a few new Nikon LensID's (thanks Mathieu Carbou)
|
|
180
|
+
- Added support for the Sony ZV-1 (thanks Jos Roost)
|
|
181
|
+
- Added a new CanonModelID (thanks Jos Roost)
|
|
182
|
+
- Added missing MimeType values for HEICS and HEIFS files
|
|
183
|
+
- Added definitions for a number of new XMP-crs tags
|
|
184
|
+
- Recognize WOFF and WOFF2 font files
|
|
185
|
+
- Decode streaming GPS from Roadhawk, EEEkit and 360Fly MP4 videos
|
|
186
|
+
- Decode a number of new tags for the Nikon D6 (thanks Warren Hatch)
|
|
187
|
+
- Decode a couple more AF tags for the D500/D850
|
|
188
|
+
- Decode a number of new Panasonic tags
|
|
189
|
+
- Improved Composite LensID logic (thanks Matt Stancliff)
|
|
190
|
+
- Enhanced -v option to state when a directory has 0 entries
|
|
191
|
+
- Removed a couple of incorrect Validate warnings for bilevel TIFF images
|
|
192
|
+
- Drop ContrastCurve tag when copying from NEF to JPEG
|
|
193
|
+
- Changed -csv output to add "Unknown" group name to column headings for
|
|
194
|
+
missing tags when -f and -G options are used
|
|
195
|
+
- Patched to support new XMP LensID format for Nikon cameras as written by
|
|
196
|
+
Apple Photos (thanks Mattsta)
|
|
197
|
+
- Fixed problem extracting metadata from Sigma DP2 Quattro X3F files
|
|
198
|
+
- Fixed End() and EndDir() functions so they work when writing and when the -v
|
|
199
|
+
option is used
|
|
200
|
+
- Fixed problem recognizing some PGM files
|
|
201
|
+
- Fixed bug in offsets for some Photoshop information in -v3 output
|
|
202
|
+
- Fixed problem writing a list containing empty elements inside an XMP
|
|
203
|
+
structure
|
|
204
|
+
- API Changes:
|
|
205
|
+
- Added NoMultiExif option
|
|
206
|
+
- Changed FilterW option to not write tag if $_ is set to undef
|
|
207
|
+
|
|
10
208
|
May 11, 2020 - Version 11.99
|
|
11
209
|
|
|
12
210
|
- Added a new Nikon LensID (thanks Mykyta Kozlov)
|
|
@@ -44,7 +242,8 @@ Apr. 24, 2020 - Version 11.96
|
|
|
44
242
|
|
|
45
243
|
Apr. 23, 2020 - Version 11.95
|
|
46
244
|
|
|
47
|
-
- Added Exit() and ExitDir() functions for use in -if conditions
|
|
245
|
+
- Added Exit() and ExitDir() functions for use in -if conditions (NOTE: these
|
|
246
|
+
function names changed to End() and EndDir() in ExifTool 11.96)
|
|
48
247
|
- Enhanced -geotag feature to support a more flexible input CSV file format
|
|
49
248
|
- Enhanced -if and API Filter options to allow access to ExifTool object via
|
|
50
249
|
$self
|
data/bin/MANIFEST
CHANGED
|
@@ -169,6 +169,7 @@ html/TagNames/Vorbis.html
|
|
|
169
169
|
html/TagNames/WTV.html
|
|
170
170
|
html/TagNames/XMP.html
|
|
171
171
|
html/TagNames/ZIP.html
|
|
172
|
+
html/TagNames/ZISRAW.html
|
|
172
173
|
html/TagNames/iWork.html
|
|
173
174
|
html/TagNames/index.html
|
|
174
175
|
html/TagNames/style.css
|
|
@@ -410,6 +411,7 @@ lib/Image/ExifTool/XMP.pm
|
|
|
410
411
|
lib/Image/ExifTool/XMP2.pl
|
|
411
412
|
lib/Image/ExifTool/XMPStruct.pl
|
|
412
413
|
lib/Image/ExifTool/ZIP.pm
|
|
414
|
+
lib/Image/ExifTool/ZISRAW.pm
|
|
413
415
|
lib/Image/ExifTool/iWork.pm
|
|
414
416
|
perl-Image-ExifTool.spec
|
|
415
417
|
t/AFCP.t
|
|
@@ -650,6 +652,8 @@ t/MWG_6.out
|
|
|
650
652
|
t/MWG_7.out
|
|
651
653
|
t/MXF.t
|
|
652
654
|
t/MXF_2.out
|
|
655
|
+
t/MacOS.t
|
|
656
|
+
t/MacOS_2.out
|
|
653
657
|
t/Matroska.t
|
|
654
658
|
t/Matroska_2.out
|
|
655
659
|
t/Minolta.t
|
|
@@ -915,6 +919,8 @@ t/ZIP_4.out
|
|
|
915
919
|
t/ZIP_5.out
|
|
916
920
|
t/ZIP_6.out
|
|
917
921
|
t/ZIP_7.out
|
|
922
|
+
t/ZISRAW.t
|
|
923
|
+
t/ZISRAW_2.out
|
|
918
924
|
t/images/AFCP.jpg
|
|
919
925
|
t/images/AIFF.aif
|
|
920
926
|
t/images/APE.ape
|
|
@@ -1003,6 +1009,7 @@ t/images/MOI.moi
|
|
|
1003
1009
|
t/images/MP3.mp3
|
|
1004
1010
|
t/images/MWG.jpg
|
|
1005
1011
|
t/images/MXF.mxf
|
|
1012
|
+
t/images/MacOS.macos
|
|
1006
1013
|
t/images/Matroska.mkv
|
|
1007
1014
|
t/images/Minolta.jpg
|
|
1008
1015
|
t/images/Minolta.mrw
|
|
@@ -1089,4 +1096,5 @@ t/images/XMP8.xmp
|
|
|
1089
1096
|
t/images/XMP9.xmp
|
|
1090
1097
|
t/images/ZIP.gz
|
|
1091
1098
|
t/images/ZIP.zip
|
|
1099
|
+
t/images/ZISRAW.czi
|
|
1092
1100
|
t/images/iWork.numbers
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
|
@@ -14,46 +14,47 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
14
14
|
|
|
15
15
|
File Types
|
|
16
16
|
------------+-------------+-------------+-------------+------------
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
17
|
+
360 r/w | DPX r | ITC r | ODP r | RIFF r
|
|
18
|
+
3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
|
|
19
|
+
3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
|
|
20
|
+
3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
|
|
21
|
+
A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
|
|
22
|
+
AA r | DVR-MS r | JSON r | OGV r | RWZ r
|
|
23
|
+
AAE r | DYLIB r | K25 r | ONP r | RM r
|
|
24
|
+
AAX r/w | EIP r | KDC r | OPUS r | SEQ r
|
|
25
|
+
ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
|
|
26
|
+
AFM r | EPUB r | LA r | OTF r | SO r
|
|
27
|
+
AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
|
|
28
|
+
AIFF r | EXE r | LNK r | PAGES r | SRF r
|
|
29
|
+
APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
|
|
30
|
+
ARQ r/w | EXR r | M2TS r | PCD r | SVG r
|
|
31
|
+
ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
|
|
32
|
+
ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
|
|
33
|
+
AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
|
|
34
|
+
AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
|
|
35
|
+
AZW r | FLA r | MIE r/w/c | PFA r | TTC r
|
|
36
|
+
BMP r | FLAC r | MIFF r | PFB r | TTF r
|
|
37
|
+
BPG r | FLIF r/w | MKA r | PFM r | TXT r
|
|
38
|
+
BTF r | FLV r | MKS r | PGF r | VCF r
|
|
39
|
+
CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
|
|
40
|
+
COS r | FPX r | MNG r/w | PLIST r | VSD r
|
|
41
|
+
CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
|
|
42
|
+
CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
|
|
43
|
+
CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
|
|
44
|
+
CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
|
|
45
|
+
CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
|
|
46
|
+
CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
|
|
47
|
+
CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
|
|
48
|
+
DCM r | HTML r | MPC r | PSB r/w | WV r
|
|
49
|
+
DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
|
|
50
|
+
DCR r | ICS r | MPO r/w | PSP r | XCF r
|
|
51
|
+
DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
|
|
52
|
+
DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
|
|
53
|
+
DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
|
|
54
|
+
DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
|
|
55
|
+
DNG r/w | INSV r | NRW r/w | RAM r |
|
|
56
|
+
DOC r | INX r | NUMBERS r | RAR r |
|
|
57
|
+
DOCX r | ISO r | O r | RAW r/w |
|
|
57
58
|
|
|
58
59
|
Meta Information
|
|
59
60
|
----------------------+----------------------+---------------------
|
|
@@ -105,8 +106,8 @@ your home directory, then you would type the following commands in a
|
|
|
105
106
|
terminal window to extract and run ExifTool:
|
|
106
107
|
|
|
107
108
|
cd ~/Desktop
|
|
108
|
-
gzip -dc Image-ExifTool-11.
|
|
109
|
-
cd Image-ExifTool-11
|
|
109
|
+
gzip -dc Image-ExifTool-12.11.tar.gz | tar -xf -
|
|
110
|
+
cd Image-ExifTool-12.11
|
|
110
111
|
./exiftool t/images/ExifTool.jpg
|
|
111
112
|
|
|
112
113
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
use strict;
|
|
11
11
|
require 5.004;
|
|
12
12
|
|
|
13
|
-
my $version = '11
|
|
13
|
+
my $version = '12.11';
|
|
14
14
|
|
|
15
15
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
16
16
|
my $exeDir;
|
|
@@ -136,11 +136,13 @@ my $countSameWr; # count files written OK but not changed
|
|
|
136
136
|
my $critical; # flag for critical operations (disable CTRL-C)
|
|
137
137
|
my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
|
|
138
138
|
my $csvAdd; # flag to add CSV information to existing lists
|
|
139
|
+
my $csvDelim; # delimiter for CSV files
|
|
139
140
|
my $csvSaveCount; # save counter for last CSV file loaded
|
|
140
141
|
my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
|
|
141
142
|
my $disableOutput; # flag to disable normal output
|
|
142
143
|
my $doSetFileName; # flag set if FileName may be written
|
|
143
144
|
my $doUnzip; # flag to extract info from .gz and .bz2 files
|
|
145
|
+
my ($end,$endDir,%endDir); # flags to end processing
|
|
144
146
|
my $escapeC; # C-style escape
|
|
145
147
|
my $escapeHTML; # flag to escape printed values for html
|
|
146
148
|
my $evalWarning; # warning from eval
|
|
@@ -238,6 +240,7 @@ my %optArgs = (
|
|
|
238
240
|
'-c' => 1, '-coordformat' => 1,
|
|
239
241
|
'-charset' => 0, # (optional arg; OK because arg cannot begin with "-")
|
|
240
242
|
'-config' => 1,
|
|
243
|
+
'-csvdelim' => 1,
|
|
241
244
|
'-d' => 1, '-dateformat' => 1,
|
|
242
245
|
'-D' => 0, # necessary to avoid matching lower-case equivalent
|
|
243
246
|
'-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
|
|
@@ -245,11 +248,12 @@ my %optArgs = (
|
|
|
245
248
|
'-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
|
|
246
249
|
'-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
|
|
247
250
|
'-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
|
|
248
|
-
'-fileorder' => 1,
|
|
251
|
+
'-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
|
|
252
|
+
'-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
|
|
249
253
|
'-geotag' => 1,
|
|
250
254
|
'-globaltimeshift' => 1,
|
|
251
255
|
'-i' => 1, '-ignore' => 1,
|
|
252
|
-
'-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1,
|
|
256
|
+
'-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
|
|
253
257
|
'-lang' => 0, # (optional arg; cannot begin with "-")
|
|
254
258
|
'-listitem' => 1,
|
|
255
259
|
'-o' => 1, '-out' => 1,
|
|
@@ -293,8 +297,8 @@ my %altRecommends = (
|
|
|
293
297
|
my %unescapeChar = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r" );
|
|
294
298
|
|
|
295
299
|
# special subroutines used in -if condition
|
|
296
|
-
sub Image::ExifTool::EndDir() { return
|
|
297
|
-
sub Image::ExifTool::End() { return
|
|
300
|
+
sub Image::ExifTool::EndDir() { return $endDir = 1 }
|
|
301
|
+
sub Image::ExifTool::End() { return $end = 1 }
|
|
298
302
|
|
|
299
303
|
# exit routine
|
|
300
304
|
sub Exit {
|
|
@@ -365,13 +369,21 @@ if (grep /^-common_args$/i, @ARGV) {
|
|
|
365
369
|
# loop over sets of command-line arguments separated by "-execute"
|
|
366
370
|
Command: for (;;) {
|
|
367
371
|
|
|
368
|
-
|
|
369
|
-
|
|
372
|
+
if (@echo3) {
|
|
373
|
+
my $str = join "\n", @echo3, "\n";
|
|
374
|
+
$str =~ s/\$\{status\}/$rtnVal/ig;
|
|
375
|
+
print STDOUT $str;
|
|
376
|
+
}
|
|
377
|
+
if (@echo4) {
|
|
378
|
+
my $str = join "\n", @echo4, "\n";
|
|
379
|
+
$str =~ s/\$\{status\}/$rtnVal/ig;
|
|
380
|
+
print STDERR $str;
|
|
381
|
+
}
|
|
370
382
|
|
|
371
383
|
$rafStdin->Close() if $rafStdin;
|
|
372
384
|
undef $rafStdin;
|
|
373
385
|
|
|
374
|
-
# save
|
|
386
|
+
# save our previous return codes
|
|
375
387
|
$rtnValPrev = $rtnVal;
|
|
376
388
|
$rtnValApp = $rtnVal if $rtnVal;
|
|
377
389
|
|
|
@@ -386,7 +398,7 @@ if ($binaryStdout) {
|
|
|
386
398
|
|
|
387
399
|
# flush console and print "{ready}" message if -stay_open is in effect
|
|
388
400
|
if ($stayOpen >= 2) {
|
|
389
|
-
if ($quiet) {
|
|
401
|
+
if ($quiet and not defined $executeID) {
|
|
390
402
|
# flush output if possible
|
|
391
403
|
eval { require IO::Handle } and STDERR->flush(), STDOUT->flush();
|
|
392
404
|
} else {
|
|
@@ -420,6 +432,7 @@ undef %countLink;
|
|
|
420
432
|
undef %created;
|
|
421
433
|
undef %csvTags;
|
|
422
434
|
undef %database;
|
|
435
|
+
undef %endDir;
|
|
423
436
|
undef %filterExt;
|
|
424
437
|
undef %ignore;
|
|
425
438
|
undef %printFmt;
|
|
@@ -443,6 +456,8 @@ undef $deleteOrig;
|
|
|
443
456
|
undef $disableOutput;
|
|
444
457
|
undef $doSetFileName;
|
|
445
458
|
undef $doUnzip;
|
|
459
|
+
undef $end;
|
|
460
|
+
undef $endDir;
|
|
446
461
|
undef $escapeHTML;
|
|
447
462
|
undef $escapeC;
|
|
448
463
|
undef $evalWarning;
|
|
@@ -489,6 +504,7 @@ $countGoodCr = 0;
|
|
|
489
504
|
$countGoodWr = 0;
|
|
490
505
|
$countNewDir = 0;
|
|
491
506
|
$countSameWr = 0;
|
|
507
|
+
$csvDelim = ',';
|
|
492
508
|
$csvSaveCount = 0;
|
|
493
509
|
$fileTrailer = '';
|
|
494
510
|
$filterFlag = 0;
|
|
@@ -551,7 +567,7 @@ if (not $preserveTime and $^O eq 'MSWin32') {
|
|
|
551
567
|
for (;;) {
|
|
552
568
|
|
|
553
569
|
# execute the command now if no more arguments or -execute is used
|
|
554
|
-
if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d
|
|
570
|
+
if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d+)?$/i and not $endOfOpts)) {
|
|
555
571
|
if (@ARGV) {
|
|
556
572
|
$executeID = $2; # save -execute number for "{ready}" response
|
|
557
573
|
$helped = 1; # don't show help if we used -execute
|
|
@@ -810,7 +826,7 @@ for (;;) {
|
|
|
810
826
|
next;
|
|
811
827
|
}
|
|
812
828
|
/^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
|
|
813
|
-
if (/^csv(\+?=.*)
|
|
829
|
+
if (/^csv(\+?=.*)?$/i) {
|
|
814
830
|
my $csvFile = $1;
|
|
815
831
|
# must process on 2nd pass so -f and -charset options are available
|
|
816
832
|
unless ($pass) {
|
|
@@ -830,7 +846,7 @@ for (;;) {
|
|
|
830
846
|
if ($mt->Open(\*CSVFILE, $csvFile)) {
|
|
831
847
|
binmode CSVFILE;
|
|
832
848
|
require Image::ExifTool::Import;
|
|
833
|
-
$msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint);
|
|
849
|
+
$msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
|
|
834
850
|
close(CSVFILE);
|
|
835
851
|
} else {
|
|
836
852
|
$msg = "Error opening CSV file '${csvFile}'";
|
|
@@ -841,6 +857,11 @@ for (;;) {
|
|
|
841
857
|
$csv = 'CSV';
|
|
842
858
|
next;
|
|
843
859
|
}
|
|
860
|
+
if (/^csvdelim$/i) {
|
|
861
|
+
$csvDelim = shift;
|
|
862
|
+
defined $csvDelim or Error("Expecting argument for -csvDelim option\n"), $badCmd=1;
|
|
863
|
+
next;
|
|
864
|
+
}
|
|
844
865
|
if (/^d$/ or $a eq 'dateformat') {
|
|
845
866
|
my $fmt = shift;
|
|
846
867
|
$fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
|
|
@@ -1755,13 +1776,17 @@ if (@dbKeys) {
|
|
|
1755
1776
|
undef $evalWarning;
|
|
1756
1777
|
local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
|
|
1757
1778
|
foreach (@dbKeys) {
|
|
1779
|
+
my $db = $database{$_};
|
|
1780
|
+
tr/\\/\// and $database{$_} = $db; # allow for backslashes in SourceFile
|
|
1758
1781
|
# (punt on using ConvertFileName here, so $absPath may be a mix of encodings)
|
|
1759
1782
|
my $absPath = AbsPath($_);
|
|
1760
1783
|
if (defined $absPath) {
|
|
1761
|
-
$database{$absPath} = $
|
|
1784
|
+
$database{$absPath} = $db unless $database{$absPath};
|
|
1762
1785
|
if ($verbose and $verbose > 1) {
|
|
1763
1786
|
print $vout "Imported entry for '${_}' (full path: '${absPath}')\n";
|
|
1764
1787
|
}
|
|
1788
|
+
} elsif ($verbose and $verbose > 1) {
|
|
1789
|
+
print $vout "Imported entry for '${_}' (non-existent file)\n";
|
|
1765
1790
|
}
|
|
1766
1791
|
}
|
|
1767
1792
|
}
|
|
@@ -1967,6 +1992,7 @@ sub GetImageInfo($$)
|
|
|
1967
1992
|
}
|
|
1968
1993
|
last unless $result;
|
|
1969
1994
|
}
|
|
1995
|
+
undef @foundTags if $fastCondition; # ignore if we didn't get all tags
|
|
1970
1996
|
}
|
|
1971
1997
|
unless ($result) {
|
|
1972
1998
|
$verbose and print $vout "-------- $file (failed condition)$progStr\n";
|
|
@@ -2220,7 +2246,9 @@ sub GetImageInfo($$)
|
|
|
2220
2246
|
my $noDups = ($json or ($xml and $outFormat > 0));
|
|
2221
2247
|
my $printConv = $et->Options('PrintConv');
|
|
2222
2248
|
my $lastGroup = '';
|
|
2249
|
+
my $i = -1;
|
|
2223
2250
|
TAG: foreach $tag (@foundTags) {
|
|
2251
|
+
++$i; # keep track on index in @foundTags
|
|
2224
2252
|
my $tagName = GetTagName($tag);
|
|
2225
2253
|
my ($group, $valList);
|
|
2226
2254
|
# get the value for this tag
|
|
@@ -2271,7 +2299,7 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2271
2299
|
# the same group, and if so suppress this tag instead
|
|
2272
2300
|
next if $noDups and $tag =~ /^(.*?) ?\(/ and defined $$info{$1} and
|
|
2273
2301
|
$group eq $et->GetGroup($1, $showGroup);
|
|
2274
|
-
$group = 'Unknown' if not $group and ($xml or $json);
|
|
2302
|
+
$group = 'Unknown' if not $group and ($xml or $json or $csv);
|
|
2275
2303
|
if ($fp and not ($allGroup or $csv)) {
|
|
2276
2304
|
if ($lastGroup ne $group) {
|
|
2277
2305
|
if ($html) {
|
|
@@ -2338,26 +2366,38 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2338
2366
|
}
|
|
2339
2367
|
# save information for CSV output
|
|
2340
2368
|
if ($csv) {
|
|
2341
|
-
my $
|
|
2342
|
-
$
|
|
2369
|
+
my $tn = $tagName;
|
|
2370
|
+
$tn .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
|
|
2371
|
+
my $gt = $group ? "$group:$tn" : $tn;
|
|
2343
2372
|
# (tag-name case may be different if some tags don't exist
|
|
2344
2373
|
# in a file, so all logic must use lower-case tag names)
|
|
2345
|
-
my $lcTag = lc $
|
|
2374
|
+
my $lcTag = lc $gt;
|
|
2346
2375
|
# override existing entry only if top priority
|
|
2347
2376
|
next if defined $csvInfo{$lcTag} and $tag =~ /\(/;
|
|
2348
2377
|
$csvInfo{$lcTag} = $val;
|
|
2349
2378
|
if (defined $csvTags{$lcTag}) {
|
|
2350
2379
|
# overwrite with actual extracted tag name
|
|
2351
2380
|
# (note: can't check "if defined $val" here because -f may be used)
|
|
2352
|
-
$csvTags{$lcTag} = $
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2381
|
+
$csvTags{$lcTag} = $gt if defined $$info{$tag};
|
|
2382
|
+
next;
|
|
2383
|
+
}
|
|
2384
|
+
# must check for "Unknown" group (for tags that don't exist)
|
|
2385
|
+
if ($group and defined $csvTags[$i] and $csvTags[$i] =~ /^(.*):$tn$/i) {
|
|
2386
|
+
next if $group eq 'Unknown'; # nothing more to do if we don't know tag group
|
|
2387
|
+
if ($1 eq 'unknown') {
|
|
2388
|
+
# replace unknown entry in CSV tag lookup and list
|
|
2389
|
+
delete $csvTags{$csvTags[$i]};
|
|
2390
|
+
$csvTags{$lcTag} = defined($val) ? $gt : '';
|
|
2391
|
+
$csvTags[$i] = $lcTag;
|
|
2392
|
+
next;
|
|
2393
|
+
}
|
|
2394
|
+
}
|
|
2395
|
+
# (don't save unextracted tag name unless -f was used)
|
|
2396
|
+
$csvTags{$lcTag} = defined($val) ? $gt : '';
|
|
2397
|
+
if (@csvFiles == 1) {
|
|
2398
|
+
push @csvTags, $lcTag; # save order of tags for first file
|
|
2399
|
+
} elsif (@csvTags) {
|
|
2400
|
+
undef @csvTags;
|
|
2361
2401
|
}
|
|
2362
2402
|
next;
|
|
2363
2403
|
}
|
|
@@ -3283,7 +3323,7 @@ sub FormatCSV($)
|
|
|
3283
3323
|
# the -b option is used to encode as Base64. It is unclear whether or not this
|
|
3284
3324
|
# is valid CSV, but some readers may not like it. (If this becomes a problem,
|
|
3285
3325
|
# in the future values may need to be truncated at the first NULL character.)
|
|
3286
|
-
$val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[
|
|
3326
|
+
$val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/;
|
|
3287
3327
|
return $val;
|
|
3288
3328
|
}
|
|
3289
3329
|
|
|
@@ -3296,9 +3336,9 @@ sub PrintCSV()
|
|
|
3296
3336
|
@csvTags or @csvTags = sort keys %csvTags;
|
|
3297
3337
|
# make a list of tags actually found
|
|
3298
3338
|
foreach $lcTag (@csvTags) {
|
|
3299
|
-
push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
|
|
3339
|
+
push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
|
|
3300
3340
|
}
|
|
3301
|
-
print join(
|
|
3341
|
+
print join($csvDelim, 'SourceFile', @tags), "\n";
|
|
3302
3342
|
my $empty = defined($forcePrint) ? $forcePrint : '';
|
|
3303
3343
|
foreach $file (@csvFiles) {
|
|
3304
3344
|
my @vals = (FormatCSV($file)); # start with full file name
|
|
@@ -3309,7 +3349,7 @@ sub PrintCSV()
|
|
|
3309
3349
|
defined $val or push(@vals,$empty), next;
|
|
3310
3350
|
push @vals, FormatCSV($val);
|
|
3311
3351
|
}
|
|
3312
|
-
print join(
|
|
3352
|
+
print join($csvDelim, @vals), "\n";
|
|
3313
3353
|
}
|
|
3314
3354
|
}
|
|
3315
3355
|
|
|
@@ -3545,12 +3585,22 @@ sub ProcessFiles($;$)
|
|
|
3545
3585
|
if ($list) {
|
|
3546
3586
|
push(@$list, $file);
|
|
3547
3587
|
} else {
|
|
3588
|
+
if (%endDir) {
|
|
3589
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($file);
|
|
3590
|
+
next if $endDir{$d};
|
|
3591
|
+
}
|
|
3548
3592
|
GetImageInfo($et, $file);
|
|
3549
|
-
|
|
3593
|
+
$end and Warn("End called - $file\n");
|
|
3594
|
+
if ($endDir) {
|
|
3595
|
+
Warn("EndDir called - $file\n");
|
|
3596
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($file);
|
|
3597
|
+
$endDir{$d} = 1;
|
|
3598
|
+
undef $endDir;
|
|
3599
|
+
}
|
|
3550
3600
|
}
|
|
3551
3601
|
}
|
|
3552
3602
|
$et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
|
|
3553
|
-
last if
|
|
3603
|
+
last if $end;
|
|
3554
3604
|
}
|
|
3555
3605
|
}
|
|
3556
3606
|
|
|
@@ -3561,7 +3611,7 @@ sub ScanDir($$;$)
|
|
|
3561
3611
|
{
|
|
3562
3612
|
local $_;
|
|
3563
3613
|
my ($et, $dir, $list) = @_;
|
|
3564
|
-
my (@fileList, $done, $file, $utf8Name, $winSurrogate);
|
|
3614
|
+
my (@fileList, $done, $file, $utf8Name, $winSurrogate, $endThisDir);
|
|
3565
3615
|
my $enc = $et->Options('CharsetFileName');
|
|
3566
3616
|
# recode as UTF-8 if necessary
|
|
3567
3617
|
if ($enc) {
|
|
@@ -3628,9 +3678,10 @@ sub ScanDir($$;$)
|
|
|
3628
3678
|
next if $file =~ /^\./ and ($recurse == 1 or $file eq '.' or $file eq '..');
|
|
3629
3679
|
next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
|
|
3630
3680
|
ScanDir($et, $path, $list);
|
|
3631
|
-
last if
|
|
3681
|
+
last if $end;
|
|
3632
3682
|
next;
|
|
3633
3683
|
}
|
|
3684
|
+
next if $endThisDir;
|
|
3634
3685
|
# apply rules from -ext options
|
|
3635
3686
|
my $accepted;
|
|
3636
3687
|
if ($filterFlag) {
|
|
@@ -3668,14 +3719,16 @@ sub ScanDir($$;$)
|
|
|
3668
3719
|
push(@$list, $path);
|
|
3669
3720
|
} else {
|
|
3670
3721
|
GetImageInfo($et, $path);
|
|
3671
|
-
if (
|
|
3722
|
+
if ($end) {
|
|
3672
3723
|
Warn("End called - $file\n");
|
|
3673
3724
|
last;
|
|
3674
3725
|
}
|
|
3675
|
-
if (
|
|
3676
|
-
$
|
|
3726
|
+
if ($endDir) {
|
|
3727
|
+
$path =~ s(/$)();
|
|
3677
3728
|
Warn("EndDir called - $path\n");
|
|
3678
|
-
|
|
3729
|
+
$endDir{$path} = 1;
|
|
3730
|
+
$endThisDir = 1;
|
|
3731
|
+
undef $endDir;
|
|
3679
3732
|
}
|
|
3680
3733
|
}
|
|
3681
3734
|
}
|
|
@@ -4379,46 +4432,47 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
4379
4432
|
|
|
4380
4433
|
File Types
|
|
4381
4434
|
------------+-------------+-------------+-------------+------------
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4395
|
-
|
|
4396
|
-
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4404
|
-
|
|
4405
|
-
|
|
4406
|
-
|
|
4407
|
-
|
|
4408
|
-
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
4435
|
+
360 r/w | DPX r | ITC r | ODP r | RIFF r
|
|
4436
|
+
3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
|
|
4437
|
+
3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
|
|
4438
|
+
3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
|
|
4439
|
+
A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
|
|
4440
|
+
AA r | DVR-MS r | JSON r | OGV r | RWZ r
|
|
4441
|
+
AAE r | DYLIB r | K25 r | ONP r | RM r
|
|
4442
|
+
AAX r/w | EIP r | KDC r | OPUS r | SEQ r
|
|
4443
|
+
ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
|
|
4444
|
+
AFM r | EPUB r | LA r | OTF r | SO r
|
|
4445
|
+
AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
|
|
4446
|
+
AIFF r | EXE r | LNK r | PAGES r | SRF r
|
|
4447
|
+
APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
|
|
4448
|
+
ARQ r/w | EXR r | M2TS r | PCD r | SVG r
|
|
4449
|
+
ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
|
|
4450
|
+
ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
|
|
4451
|
+
AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
|
|
4452
|
+
AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
|
|
4453
|
+
AZW r | FLA r | MIE r/w/c | PFA r | TTC r
|
|
4454
|
+
BMP r | FLAC r | MIFF r | PFB r | TTF r
|
|
4455
|
+
BPG r | FLIF r/w | MKA r | PFM r | TXT r
|
|
4456
|
+
BTF r | FLV r | MKS r | PGF r | VCF r
|
|
4457
|
+
CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
|
|
4458
|
+
COS r | FPX r | MNG r/w | PLIST r | VSD r
|
|
4459
|
+
CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
|
|
4460
|
+
CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
|
|
4461
|
+
CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
|
|
4462
|
+
CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
|
|
4463
|
+
CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
|
|
4464
|
+
CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
|
|
4465
|
+
CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
|
|
4466
|
+
DCM r | HTML r | MPC r | PSB r/w | WV r
|
|
4467
|
+
DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
|
|
4468
|
+
DCR r | ICS r | MPO r/w | PSP r | XCF r
|
|
4469
|
+
DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
|
|
4470
|
+
DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
|
|
4471
|
+
DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
|
|
4472
|
+
DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
|
|
4473
|
+
DNG r/w | INSV r | NRW r/w | RAM r |
|
|
4474
|
+
DOC r | INX r | NUMBERS r | RAR r |
|
|
4475
|
+
DOCX r | ISO r | O r | RAW r/w |
|
|
4422
4476
|
|
|
4423
4477
|
Meta Information
|
|
4424
4478
|
----------------------+----------------------+---------------------
|
|
@@ -4468,13 +4522,14 @@ L<Input-output text formatting|/Input-output text formatting>
|
|
|
4468
4522
|
-c FMT (-coordFormat) Set format for GPS coordinates
|
|
4469
4523
|
-charset [[TYPE=]CHARSET] Specify encoding for special characters
|
|
4470
4524
|
-csv[[+]=CSVFILE] Export/import tags in CSV format
|
|
4525
|
+
-csvDelim STR Set delimiter for CSV file
|
|
4471
4526
|
-d FMT (-dateFormat) Set format for date/time values
|
|
4472
4527
|
-D (-decimal) Show tag ID numbers in decimal
|
|
4473
4528
|
-E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
|
|
4474
4529
|
-f (-forcePrint) Force printing of all specified tags
|
|
4475
4530
|
-g[NUM...] (-groupHeadings) Organize output by tag group
|
|
4476
4531
|
-G[NUM...] (-groupNames) Print group name for each tag
|
|
4477
|
-
-h (-htmlFormat) Use
|
|
4532
|
+
-h (-htmlFormat) Use HTML formatting for output
|
|
4478
4533
|
-H (-hex) Show tag ID numbers in hexadecimal
|
|
4479
4534
|
-htmlDump[OFFSET] Generate HTML-format binary dump
|
|
4480
4535
|
-j[[+]=JSONFILE] (-json) Export/import tags in JSON format
|
|
@@ -4620,7 +4675,7 @@ delete or replace a tag (see L</WRITING EXAMPLES> for examples). C<^=> is
|
|
|
4620
4675
|
used to write an empty string instead of deleting the tag when no I<VALUE>
|
|
4621
4676
|
is given, but otherwise it is equivalent to C<=>.
|
|
4622
4677
|
|
|
4623
|
-
I<TAG> may contain one or more leading family 0, 1 or
|
|
4678
|
+
I<TAG> may contain one or more leading family 0, 1, 2 or 7 group names,
|
|
4624
4679
|
prefixed by optional family numbers, and separated colons. If no group name
|
|
4625
4680
|
is specified, the tag is created in the preferred group, and updated in any
|
|
4626
4681
|
other location where a same-named tag already exists. The preferred group
|
|
@@ -4675,7 +4730,7 @@ the specified group(s) are removed individually, and in this case is it
|
|
|
4675
4730
|
possible to exclude individual tags from a mass delete. For example,
|
|
4676
4731
|
C<-time:all --Exif:Time:All> removes all deletable Time tags except those in
|
|
4677
4732
|
the EXIF. This difference also applies if family 2 is specified when
|
|
4678
|
-
deleting all groups.
|
|
4733
|
+
deleting all groups. For example, C<-2all:all=> deletes tags individually,
|
|
4679
4734
|
while C<-all:all=> deletes entire blocks.
|
|
4680
4735
|
|
|
4681
4736
|
5) The "APP" group names ("APP0" through "APP15") are used to delete JPEG
|
|
@@ -4987,8 +5042,11 @@ tag names (with optional group names) for each column of the file, and
|
|
|
4987
5042
|
values must be separated by commas. A special "SourceFile" column specifies
|
|
4988
5043
|
the files associated with each row of information (and a SourceFile of "*"
|
|
4989
5044
|
may be used to define default tags to be imported for all files which are
|
|
4990
|
-
combined with any tags specified for the specific SourceFile processed).
|
|
4991
|
-
|
|
5045
|
+
combined with any tags specified for the specific SourceFile processed). The
|
|
5046
|
+
B<-csvDelim> option may be used to change the input/output field delimiter
|
|
5047
|
+
if something other than a comma is required.
|
|
5048
|
+
|
|
5049
|
+
The following examples demonstrate basic use of the B<-csv> option:
|
|
4992
5050
|
|
|
4993
5051
|
# generate CSV file with common tags from all images in a directory
|
|
4994
5052
|
exiftool -common -csv dir > out.csv
|
|
@@ -5035,6 +5093,11 @@ option. When processing a large number of files, it is recommended to
|
|
|
5035
5093
|
either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
|
|
5036
5094
|
generate a fixed-column CSV file instead of using the B<-csv> option.
|
|
5037
5095
|
|
|
5096
|
+
=item B<-csvDelim> I<STR>
|
|
5097
|
+
|
|
5098
|
+
Set the delimiter for separating CSV entries for the B<-csv> option.
|
|
5099
|
+
Default is ','.
|
|
5100
|
+
|
|
5038
5101
|
=item B<-d> I<FMT> (B<-dateFormat>)
|
|
5039
5102
|
|
|
5040
5103
|
Set the format for date/time tag values. The I<FMT> string may contain
|
|
@@ -5075,13 +5138,13 @@ B<-csv>=I<CSVFILE> feature.
|
|
|
5075
5138
|
|
|
5076
5139
|
Organize output by tag group. I<NUM> specifies a group family number, and
|
|
5077
5140
|
may be 0 (general location), 1 (specific location), 2 (category), 3
|
|
5078
|
-
(document number), 4 (instance number), 5 (metadata path)
|
|
5079
|
-
format). B<-g0> is assumed if a family number is not
|
|
5080
|
-
|
|
5081
|
-
Multiple families may be specified by separating them with colons.
|
|
5082
|
-
default the resulting group name is simplified by removing any leading
|
|
5141
|
+
(document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF
|
|
5142
|
+
format) or 7 (tag ID). B<-g0> is assumed if a family number is not
|
|
5143
|
+
specified. May be combined with other options to add group names to the
|
|
5144
|
+
output. Multiple families may be specified by separating them with colons.
|
|
5145
|
+
By default the resulting group name is simplified by removing any leading
|
|
5083
5146
|
C<Main:> and collapsing adjacent identical group names, but this can be
|
|
5084
|
-
avoided by placing a colon before the first family number (eg. B<-g:3:1>).
|
|
5147
|
+
avoided by placing a colon before the first family number (eg. B<-g:3:1>).
|
|
5085
5148
|
Use the B<-listg> option to list group names for a specified family. The
|
|
5086
5149
|
SavePath and SaveFormat API options are automatically enabled if the
|
|
5087
5150
|
respective family 5 or 6 group names are requested. See the
|
|
@@ -5286,7 +5349,7 @@ with this command:
|
|
|
5286
5349
|
|
|
5287
5350
|
produces output like this:
|
|
5288
5351
|
|
|
5289
|
-
-- Generated by ExifTool 11
|
|
5352
|
+
-- Generated by ExifTool 12.11 --
|
|
5290
5353
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5291
5354
|
(f/5.6, 1/60s, ISO 100)
|
|
5292
5355
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -5694,7 +5757,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
|
|
|
5694
5757
|
metadata from the file, and returns only pseudo System tags, but still reads
|
|
5695
5758
|
the file header to obtain an educated guess at FileType. B<-fast4> doesn't
|
|
5696
5759
|
even read the file header, and returns only System tags and a FileType based
|
|
5697
|
-
on the file extension.
|
|
5760
|
+
on the file extension. B<-fast5> also disables generation of the Composite
|
|
5761
|
+
tags (like B<-e>). Has no effect when writing.
|
|
5698
5762
|
|
|
5699
5763
|
Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
|
|
5700
5764
|
condition, or when ordering files with the B<-fileOrder> option. See the
|
|
@@ -5719,7 +5783,9 @@ involves an additional processing pass of each file, but this impact may be
|
|
|
5719
5783
|
reduced by specifying a I<NUM> for the B<-fast> level used during the
|
|
5720
5784
|
metadata-extraction phase. For example, B<-fileOrder4> may be used if
|
|
5721
5785
|
I<TAG> is a pseudo System tag. If multiple B<-fileOrder> options are used,
|
|
5722
|
-
the extraction is done at the lowest B<-fast> level.
|
|
5786
|
+
the extraction is done at the lowest B<-fast> level. Note that files are
|
|
5787
|
+
sorted across directory boundaries if multiple input directories are
|
|
5788
|
+
specified.
|
|
5723
5789
|
|
|
5724
5790
|
=item B<-i> I<DIR> (B<-ignore>)
|
|
5725
5791
|
|
|
@@ -5760,7 +5826,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
|
|
|
5760
5826
|
executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
|
|
5761
5827
|
B<-fast> option documentation for details). Without I<NUM>, only one
|
|
5762
5828
|
processing pass is done at the level specified by the B<-fast> option. For
|
|
5763
|
-
example, using B<-
|
|
5829
|
+
example, using B<-if5> is possible if I<EXPR> uses only pseudo System tags,
|
|
5764
5830
|
and may significantly speed processing if enough files fail the condition.
|
|
5765
5831
|
|
|
5766
5832
|
The expression has access to the current ExifTool object through C<$self>,
|
|
@@ -5769,7 +5835,8 @@ of the file processing. Both functions have a return value of 1. Case is
|
|
|
5769
5835
|
significant for function names.
|
|
5770
5836
|
|
|
5771
5837
|
End() - end processing after this file
|
|
5772
|
-
EndDir() - end processing of files in this directory
|
|
5838
|
+
EndDir() - end processing of files in this directory (not
|
|
5839
|
+
compatible with the B<-fileOrder> option)
|
|
5773
5840
|
|
|
5774
5841
|
Notes:
|
|
5775
5842
|
|
|
@@ -6231,7 +6298,9 @@ about the configuration file syntax.
|
|
|
6231
6298
|
Echo I<TEXT> to stdout (B<-echo> or B<-echo1>) or stderr (B<-echo2>). Text
|
|
6232
6299
|
is output as the command line is parsed, before the processing of any input
|
|
6233
6300
|
files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
|
|
6234
|
-
respectively) after processing is complete.
|
|
6301
|
+
respectively) after processing is complete. For B<-echo3> and B<-echo4>,
|
|
6302
|
+
"${status}" may be used in the I<TEXT> string to represent the numerical
|
|
6303
|
+
exit status of the command (see L</EXIT STATUS>).
|
|
6235
6304
|
|
|
6236
6305
|
=item B<-efile>[I<NUM>][!] I<ERRFILE>
|
|
6237
6306
|
|
|
@@ -6252,7 +6321,8 @@ commands were executed as separate command lines (with the exception of the
|
|
|
6252
6321
|
B<-config> and B<-use> options which remain in effect for subsequent
|
|
6253
6322
|
commands). Allows multiple commands to be executed from a single command
|
|
6254
6323
|
line. I<NUM> is an optional number that is echoed in the "{ready}" message
|
|
6255
|
-
when using the B<-stay_open> feature.
|
|
6324
|
+
when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
|
|
6325
|
+
option no longer suppresses the output "{readyNUM}" message.
|
|
6256
6326
|
|
|
6257
6327
|
=item B<-srcfile> I<FMT>
|
|
6258
6328
|
|
|
@@ -6297,12 +6367,15 @@ line (see the B<-@> option for details).
|
|
|
6297
6367
|
|
|
6298
6368
|
3) Write C<-execute\n> to I<ARGFILE>, where C<\n> represents a newline
|
|
6299
6369
|
sequence. (Note: You may need to flush your write buffers here if using
|
|
6300
|
-
buffered output.)
|
|
6370
|
+
buffered output.) ExifTool will then execute the command with the arguments
|
|
6301
6371
|
received up to this point, send a "{ready}" message to stdout when done
|
|
6302
6372
|
(unless the B<-q> or B<-T> option is used), and continue trying to read
|
|
6303
6373
|
arguments for the next command from I<ARGFILE>. To aid in command/response
|
|
6304
6374
|
synchronization, any number appended to the C<-execute> option is echoed in
|
|
6305
|
-
the "{ready}" message. For example, C<-execute613> results in "{ready613}".
|
|
6375
|
+
the "{ready}" message. For example, C<-execute613> results in "{ready613}".
|
|
6376
|
+
When this number is added, B<-q> no longer suppresses the "{ready}" message.
|
|
6377
|
+
(Also, see the B<-echo3> and B<-echo4> options for additional ways to pass
|
|
6378
|
+
signals back to your application.)
|
|
6306
6379
|
|
|
6307
6380
|
4) Repeat steps 2 and 3 for each command.
|
|
6308
6381
|
|
|
@@ -6317,7 +6390,7 @@ writing the following lines to the currently open I<ARGFILE>:
|
|
|
6317
6390
|
-@
|
|
6318
6391
|
NEWARGFILE
|
|
6319
6392
|
|
|
6320
|
-
This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
|
|
6393
|
+
This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
|
|
6321
6394
|
(Without the B<-stay_open> here, exiftool would have returned to reading
|
|
6322
6395
|
arguments from I<ARGFILE> after reaching the end of I<NEWARGFILE>.)
|
|
6323
6396
|
|