exiftool_vendored 11.97.0 → 12.09.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +196 -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 +150 -102
- data/bin/lib/Image/ExifTool.pm +162 -111
- data/bin/lib/Image/ExifTool.pod +123 -90
- 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 +201 -14
- 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/HtmlDump.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +91 -12
- data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
- 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 +44 -24
- data/bin/lib/Image/ExifTool/MacOS.pm +152 -38
- data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
- data/bin/lib/Image/ExifTool/Nikon.pm +163 -18
- data/bin/lib/Image/ExifTool/Olympus.pm +39 -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 +3 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +294 -34
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
- data/bin/lib/Image/ExifTool/README +26 -22
- data/bin/lib/Image/ExifTool/RIFF.pm +15 -3
- data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
- data/bin/lib/Image/ExifTool/RTF.pm +12 -7
- 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 +420 -34
- data/bin/lib/Image/ExifTool/TagLookup.pm +5799 -5671
- data/bin/lib/Image/ExifTool/TagNames.pod +583 -95
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +26 -18
- data/bin/lib/Image/ExifTool/Writer.pl +44 -21
- data/bin/lib/Image/ExifTool/XMP.pm +99 -17
- 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 +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1095c3210c7799b406dbff7b262f1e48bba57874a51d7ada486b7ab12c4f946c
|
4
|
+
data.tar.gz: 6cd2472d73f0bd3178bfb9cb31d3c2dbd3c37d5c73ba370ea6fced3a9bfde512
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 490b8624766262c4231eb655f2df5e6c2ebe35efa3f4e8131b36696d017daf5d637e3baad7fb403c587ab18e2fe09321a8444bd797eb093c127bdaabbd2f38ed
|
7
|
+
data.tar.gz: fd4dd627988588ee71fee72a7071645aa9ef53bb687e0ade23e53c0e63590912f81abf6a300bf969e2578a64a0f58d962417d0dae00779c0ff7ea4987c5af28e
|
data/bin/Changes
CHANGED
@@ -4,9 +4,202 @@ 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
|
+
Oct. 29, 2020 - Version 12.09
|
11
|
+
|
12
|
+
- Added ability to copy CanonMakerNotes from CR3 images to other file types
|
13
|
+
- Added read support for ON1 presets file (.ONP)
|
14
|
+
- Added two new CanonModelID values
|
15
|
+
- Added trailing "/" when writing QuickTime:GPSCoordinates
|
16
|
+
- Added a number of new XMP-crs tags
|
17
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
18
|
+
- Added a new Nikon Z lens (thanks LibRaw)
|
19
|
+
- Added a new Canon LensType
|
20
|
+
- Added a new XMP-crs tag
|
21
|
+
- Decode ColorData for Canon EOS R5/R6
|
22
|
+
- Decode a couple of new HEIF tags
|
23
|
+
- Decode FirmwareVersion for Canon M50
|
24
|
+
- Patched EndDir() feature so subdirectories are always processed when -r is
|
25
|
+
used (previously, EndDir() would end processing of a directory completely)
|
26
|
+
- Improved decoding of Sony CreativeStyle tags (thanks Jos Roost)
|
27
|
+
- Improved parsing of Radiance files to recognize comments
|
28
|
+
- Renamed GIF AspectRatio tag to PixelAspectRatio
|
29
|
+
- Yet another tweak to the EventTime formatting rules (also allow time-only
|
30
|
+
values with fractional seconds and a time zone)
|
31
|
+
- Avoid loading GoPro module unnecessarily when reading MP4 videos from some
|
32
|
+
other cameras
|
33
|
+
- Fixed problem with an incorrect naming of CodecID tags in some MKV videos
|
34
|
+
- Fixed verbose output to avoid "adding" messages for existing flattened XMP
|
35
|
+
tags
|
36
|
+
- Added read support for MacOS "._" sidecar files
|
37
|
+
|
38
|
+
Oct. 15, 2020 - Version 12.08
|
39
|
+
|
40
|
+
- Added read support for MacOS "._" sidecar files
|
41
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
42
|
+
- Recognize Mac OS X xattr files
|
43
|
+
- Extract ThumbnailImage from MP4 videos of more dashcam models
|
44
|
+
- Improved decoding of a number of Sony tags (thanks Jos Roost)
|
45
|
+
- Fixed problem where the special -if EndDir() function didn't work properly
|
46
|
+
for directories after the one in which it was initially called
|
47
|
+
- Patched to read DLL files which don't have a .rsrc section (thanks Hank)
|
48
|
+
- Patched to support new IGC date format when geotagging
|
49
|
+
- Patched to read DLL files with an invalid size in the header
|
50
|
+
|
51
|
+
Oct. 2, 2020 - Version 12.07
|
52
|
+
|
53
|
+
- Added support for GoPro .360 videos
|
54
|
+
- Added some new Canon RF and Nikkor Z lenses (thanks LibRaw)
|
55
|
+
- Added some new Sony LensType and CreativeStyle values and decode some
|
56
|
+
ILCE-7C tags (thanks Jos Roost)
|
57
|
+
- Added a number of new Olympus SceneMode values (thanks Herb)
|
58
|
+
- Added a new Nikon LensID
|
59
|
+
- Decode more timed metadata from Insta360 videos (thanks Thomas Allen)
|
60
|
+
- Decode timed GPS from videos of more Garmin dashcam models
|
61
|
+
- Decode a new GoPro video tag
|
62
|
+
- Reformat time-only EventTime values when writing and prevent arbitrary
|
63
|
+
strings from being written
|
64
|
+
- Patched to accept backslashes in SourceFile entries for -csv option
|
65
|
+
|
66
|
+
Sept. 11, 2020 - Version 12.06
|
67
|
+
|
68
|
+
- Added read support for Lyrics3 metadata (and fixed problem where APE
|
69
|
+
metadata may be ignored if Lyrics3 exists)
|
70
|
+
- Added a new Panasonic VideoBurstMode value (thanks Klaus Homeister)
|
71
|
+
- Added a new Olympus MultipleExposureMode value
|
72
|
+
- Added a new Nikon LensID
|
73
|
+
- Added back conversions for XMP-dwc EventTime that were removed in 12.04 with
|
74
|
+
a patch to allow time-only values
|
75
|
+
- Decode GIF AspectRatio
|
76
|
+
- Decode Olympus FocusBracketStepSize (thanks Karsten)
|
77
|
+
- Extract PNG iDOT chunk in Binary format with the name AppleDataOffsets
|
78
|
+
- Process PNG images which do not start with mandatory IHDR chunk
|
79
|
+
|
80
|
+
Aug. 24, 2020 - Version 12.05
|
81
|
+
|
82
|
+
- Added a new Panasonic SelfTimer value (thanks Herb)
|
83
|
+
- Decode a few more DPX tags (thanks Harry Mallon)
|
84
|
+
- Extract AIFF APPL tag as ApplicationData
|
85
|
+
- Fixed bug writing QuickTime ItemList 'gnre' Genre values
|
86
|
+
- Fixed an incorrect value for Panasonic VideoBurstResolution (thanks Herb)
|
87
|
+
- Fixed problem when applying a time shift to some invalid makernote date/time
|
88
|
+
values
|
89
|
+
|
90
|
+
Aug. 10, 2020 - Version 12.04
|
91
|
+
|
92
|
+
- Added read support for Zeiss ZISRAW CZI files
|
93
|
+
- Added some new values for a couple of Olympus tags (thanks Sebastian)
|
94
|
+
- Decode a number of new tags for the Sony ILCE-7SM3 (thanks Jos Roost)
|
95
|
+
- Removed formatting restrictions on XMP-dwc:EventTime to allow a time-only
|
96
|
+
value to be written
|
97
|
+
- Moved new QuckTime ItemList tags added in version 12.02 to the proper group
|
98
|
+
(they were incorrectly added to the Keys group)
|
99
|
+
- Improved QuickTime -v3 output to show default language codes
|
100
|
+
- Patched -lang option to work for the values of somet tags with coded
|
101
|
+
translations
|
102
|
+
- Patched the format of a number of QuickTime tags when writing for improved
|
103
|
+
compatibility with iTunes and AtomicParsley
|
104
|
+
- Patched to write a default QuickTime language code of 0x0000 (null) instead
|
105
|
+
of 0x55c4 ('und')
|
106
|
+
|
107
|
+
July 29, 2020 - Version 12.03
|
108
|
+
|
109
|
+
- Added family 7 group names to allow tag ID's to be specified when reading
|
110
|
+
and writing
|
111
|
+
- Fixed a couple of typos in tag values (thanks Herb)
|
112
|
+
- API Changes:
|
113
|
+
- Added HexTagIDs option
|
114
|
+
- Enhanced GetNewValue() to allow family 7 groups names to be used
|
115
|
+
- Internal Changes:
|
116
|
+
- Changed Composite tag ID's to use "-" instead of "::" as a separator
|
117
|
+
|
118
|
+
July 27, 2020 - Version 12.02
|
119
|
+
|
120
|
+
- Added support for a number of new QuickTime ItemList tags
|
121
|
+
- Added support for writing XMP-xmp:RatingPercent
|
122
|
+
- Added a new Sony LensType (thanks Jos Roost and LibRaw)
|
123
|
+
- Added a new Pentax LensType (thanks James O'Neill)
|
124
|
+
- Decode barcodes from Ricoh APP5 RMETA segment
|
125
|
+
- Decode a few new QuickTime tags written by Ricoh and Garmin cameras
|
126
|
+
- Decode timed GPS from Sony A7R IV MP4 videos
|
127
|
+
- Decode timed GPS from 70mai dashcam videos
|
128
|
+
- Decode a few new Panasonic tags (thanks Klaus Homeister)
|
129
|
+
- Decode altitude and more accurate latitude/longitude from Transcend Driver
|
130
|
+
Pro 230 MP4 videos
|
131
|
+
- Improved decoding of some Canon EOS 1DXmkIII custom functions
|
132
|
+
- Allow integer QuickTime TrackNumber and DiskNumber values
|
133
|
+
- Relax validity check of QuickTime:ContentCreateDate when writing with -n
|
134
|
+
- Removed "Com" from the start of some unknown ItemList tag names
|
135
|
+
- Patched CanonCustom decoding for bug in Canon EOS-1DX firmware
|
136
|
+
- Changed QuickTime CleanAperture tags decode as signed rationals
|
137
|
+
|
138
|
+
June 24, 2020 - Version 12.01
|
139
|
+
|
140
|
+
- Added a new NEFCompression value (thanks Warren Hatch)
|
141
|
+
- Added a new Sony LensType (thanks Jos Roost)
|
142
|
+
- Decode timed GPS from Rove Stealth 4K dashcam videos
|
143
|
+
- Fixed bug which would corrupt TIFF images with 16-bit image data offsets
|
144
|
+
when writing (these are very rare)
|
145
|
+
|
146
|
+
June 11, 2020 - Version 12.00 (production release)
|
147
|
+
|
148
|
+
- Added two new Olympus LensTypes (thanks Don Komarechka for one)
|
149
|
+
- Added two new Sony LensType values (thanks Jos Roost)
|
150
|
+
- Added a few new Nikon LensID's (thanks Mathieu Carbou)
|
151
|
+
- Added support for the Sony ZV-1 (thanks Jos Roost)
|
152
|
+
- Added a new CanonModelID (thanks Jos Roost)
|
153
|
+
- Added missing MimeType values for HEICS and HEIFS files
|
154
|
+
- Added definitions for a number of new XMP-crs tags
|
155
|
+
- Recognize WOFF and WOFF2 font files
|
156
|
+
- Decode streaming GPS from Roadhawk, EEEkit and 360Fly MP4 videos
|
157
|
+
- Decode a number of new tags for the Nikon D6 (thanks Warren Hatch)
|
158
|
+
- Decode a couple more AF tags for the D500/D850
|
159
|
+
- Decode a number of new Panasonic tags
|
160
|
+
- Improved Composite LensID logic (thanks Matt Stancliff)
|
161
|
+
- Enhanced -v option to state when a directory has 0 entries
|
162
|
+
- Removed a couple of incorrect Validate warnings for bilevel TIFF images
|
163
|
+
- Drop ContrastCurve tag when copying from NEF to JPEG
|
164
|
+
- Changed -csv output to add "Unknown" group name to column headings for
|
165
|
+
missing tags when -f and -G options are used
|
166
|
+
- Patched to support new XMP LensID format for Nikon cameras as written by
|
167
|
+
Apple Photos (thanks Mattsta)
|
168
|
+
- Fixed problem extracting metadata from Sigma DP2 Quattro X3F files
|
169
|
+
- Fixed End() and EndDir() functions so they work when writing and when the -v
|
170
|
+
option is used
|
171
|
+
- Fixed problem recognizing some PGM files
|
172
|
+
- Fixed bug in offsets for some Photoshop information in -v3 output
|
173
|
+
- Fixed problem writing a list containing empty elements inside an XMP
|
174
|
+
structure
|
175
|
+
- API Changes:
|
176
|
+
- Added NoMultiExif option
|
177
|
+
- Changed FilterW option to not write tag if $_ is set to undef
|
178
|
+
|
179
|
+
May 11, 2020 - Version 11.99
|
180
|
+
|
181
|
+
- Added a new Nikon LensID (thanks Mykyta Kozlov)
|
182
|
+
- Added a new Canon LensType
|
183
|
+
- Added a newn PentaxModelID
|
184
|
+
- Decode a few new QuickTime tags
|
185
|
+
- Decode new ID3 Grouping tag
|
186
|
+
- Decode a few more MinoltaRaw tags (thanks LibRaw)
|
187
|
+
- Fixed runtime warning which could occur when reading corrupted RTF files
|
188
|
+
- Fixed another potential pitfall in M2TS Duration calculation
|
189
|
+
- Fixed problem extracting some unknown QuickTime:Keys tags
|
190
|
+
- Fixed problem decoding Nikon D850 orientation tags
|
191
|
+
- Fixed bug where TIFF image data may not be padded to an even number of bytes
|
192
|
+
|
193
|
+
May 1, 2020 - Version 11.98
|
194
|
+
|
195
|
+
- Added a new Nikon LensID (thanks Warren Hatch)
|
196
|
+
- Added a new Sony LensType (thanks LibRaw)
|
197
|
+
- Added a new Canon LensType
|
198
|
+
- Patched to extract EXIF with an "Exif\0\0" header from WebP images
|
199
|
+
- Enhanced -efile option and added to the documentation
|
200
|
+
- Minor tweak to -htmlDump output (disallow locking of empty selection)
|
201
|
+
- Fixed problem determining Duration of some M2TS videos
|
202
|
+
|
10
203
|
Apr. 27, 2020 - Version 11.97
|
11
204
|
|
12
205
|
- Added experimental -efile option (undocumented)
|
@@ -20,7 +213,8 @@ Apr. 24, 2020 - Version 11.96
|
|
20
213
|
|
21
214
|
Apr. 23, 2020 - Version 11.95
|
22
215
|
|
23
|
-
- Added Exit() and ExitDir() functions for use in -if conditions
|
216
|
+
- Added Exit() and ExitDir() functions for use in -if conditions (NOTE: these
|
217
|
+
function names changed to End() and EndDir() in ExifTool 11.96)
|
24
218
|
- Enhanced -geotag feature to support a more flexible input CSV file format
|
25
219
|
- Enhanced -if and API Filter options to allow access to ExifTool object via
|
26
220
|
$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-
|
109
|
-
cd Image-ExifTool-
|
109
|
+
gzip -dc Image-ExifTool-12.09.tar.gz | tar -xf -
|
110
|
+
cd Image-ExifTool-12.09
|
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 = '
|
13
|
+
my $version = '12.09';
|
14
14
|
|
15
15
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
16
16
|
my $exeDir;
|
@@ -90,6 +90,7 @@ my @csvFiles; # list of files when reading with CSV option (in ExifTool Ch
|
|
90
90
|
my @csvTags; # order of tags for first file with CSV option (lower case)
|
91
91
|
my @delFiles; # list of files to delete
|
92
92
|
my @dynamicFiles; # list of -tagsFromFile files with dynamic names and -TAG<=FMT pairs
|
93
|
+
my @efile; # files for writing list of error/fail/same file names
|
93
94
|
my @exclude; # list of excluded tags
|
94
95
|
my (@echo3, @echo4);# stdout and stderr echo after processing is complete
|
95
96
|
my @files; # list of files and directories to scan
|
@@ -140,8 +141,7 @@ my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o
|
|
140
141
|
my $disableOutput; # flag to disable normal output
|
141
142
|
my $doSetFileName; # flag set if FileName may be written
|
142
143
|
my $doUnzip; # flag to extract info from .gz and .bz2 files
|
143
|
-
my $
|
144
|
-
my $efile2; # file for writing list of failed file names
|
144
|
+
my ($end,$endDir); # flags to end processing
|
145
145
|
my $escapeC; # C-style escape
|
146
146
|
my $escapeHTML; # flag to escape printed values for html
|
147
147
|
my $evalWarning; # warning from eval
|
@@ -242,7 +242,8 @@ my %optArgs = (
|
|
242
242
|
'-d' => 1, '-dateformat' => 1,
|
243
243
|
'-D' => 0, # necessary to avoid matching lower-case equivalent
|
244
244
|
'-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
|
245
|
-
'-efile' => 1, '-efile1' => 1, '-efile2' => 1,
|
245
|
+
'-efile' => 1, '-efile1' => 1, '-efile2' => 1, '-efile3' => 1, '-efile4' => 1,
|
246
|
+
'-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
|
246
247
|
'-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
|
247
248
|
'-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
|
248
249
|
'-fileorder' => 1,
|
@@ -293,8 +294,8 @@ my %altRecommends = (
|
|
293
294
|
my %unescapeChar = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r" );
|
294
295
|
|
295
296
|
# special subroutines used in -if condition
|
296
|
-
sub Image::ExifTool::EndDir() { return
|
297
|
-
sub Image::ExifTool::End() { return
|
297
|
+
sub Image::ExifTool::EndDir() { return $endDir = 1 }
|
298
|
+
sub Image::ExifTool::End() { return $end = 1 }
|
298
299
|
|
299
300
|
# exit routine
|
300
301
|
sub Exit {
|
@@ -409,6 +410,7 @@ undef @delFiles;
|
|
409
410
|
undef @dynamicFiles;
|
410
411
|
undef @echo3;
|
411
412
|
undef @echo4;
|
413
|
+
undef @efile;
|
412
414
|
undef @exclude;
|
413
415
|
undef @files;
|
414
416
|
undef @newValues;
|
@@ -442,8 +444,8 @@ undef $deleteOrig;
|
|
442
444
|
undef $disableOutput;
|
443
445
|
undef $doSetFileName;
|
444
446
|
undef $doUnzip;
|
445
|
-
undef $
|
446
|
-
undef $
|
447
|
+
undef $end;
|
448
|
+
undef $endDir;
|
447
449
|
undef $escapeHTML;
|
448
450
|
undef $escapeC;
|
449
451
|
undef $evalWarning;
|
@@ -873,13 +875,13 @@ for (;;) {
|
|
873
875
|
$mt->Options(Duplicates => 1);
|
874
876
|
next;
|
875
877
|
}
|
876
|
-
if (/^efile(
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
878
|
+
if (/^efile(\d)?(!)?$/i) {
|
879
|
+
my $arg = shift;
|
880
|
+
defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
|
881
|
+
$efile[0] = $arg if not $1 or $1 & 0x01;
|
882
|
+
$efile[1] = $arg if $1 and $1 & 0x02;
|
883
|
+
$efile[2] = $arg if $1 and $1 & 0x04;
|
884
|
+
unlink $arg if $2;
|
883
885
|
next;
|
884
886
|
}
|
885
887
|
# (-execute handled at top of loop)
|
@@ -1756,13 +1758,17 @@ if (@dbKeys) {
|
|
1756
1758
|
undef $evalWarning;
|
1757
1759
|
local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
|
1758
1760
|
foreach (@dbKeys) {
|
1761
|
+
my $db = $database{$_};
|
1762
|
+
tr/\\/\// and $database{$_} = $db; # allow for backslashes in SourceFile
|
1759
1763
|
# (punt on using ConvertFileName here, so $absPath may be a mix of encodings)
|
1760
1764
|
my $absPath = AbsPath($_);
|
1761
1765
|
if (defined $absPath) {
|
1762
|
-
$database{$absPath} = $
|
1766
|
+
$database{$absPath} = $db unless $database{$absPath};
|
1763
1767
|
if ($verbose and $verbose > 1) {
|
1764
1768
|
print $vout "Imported entry for '${_}' (full path: '${absPath}')\n";
|
1765
1769
|
}
|
1770
|
+
} elsif ($verbose and $verbose > 1) {
|
1771
|
+
print $vout "Imported entry for '${_}' (non-existent file)\n";
|
1766
1772
|
}
|
1767
1773
|
}
|
1768
1774
|
}
|
@@ -1925,6 +1931,7 @@ sub GetImageInfo($$)
|
|
1925
1931
|
if (@condition) {
|
1926
1932
|
unless ($file eq '-' or $et->Exists($file)) {
|
1927
1933
|
Warn "Error: File not found - $file\n";
|
1934
|
+
EFile($file);
|
1928
1935
|
FileNotFound($file);
|
1929
1936
|
++$countBad;
|
1930
1937
|
return;
|
@@ -1970,15 +1977,7 @@ sub GetImageInfo($$)
|
|
1970
1977
|
}
|
1971
1978
|
unless ($result) {
|
1972
1979
|
$verbose and print $vout "-------- $file (failed condition)$progStr\n";
|
1973
|
-
|
1974
|
-
if ($et->Open(\*FAIL_FILE, $efile2, '>>')) {
|
1975
|
-
print FAIL_FILE $file, "\n" or Warn("Error writing to $efile2\n"), undef $efile2;
|
1976
|
-
close FAIL_FILE;
|
1977
|
-
} else {
|
1978
|
-
Warn("Error opening '${efile2}' for append\n");
|
1979
|
-
undef $efile2;
|
1980
|
-
}
|
1981
|
-
}
|
1980
|
+
EFile($file, 2);
|
1982
1981
|
++$countFailed;
|
1983
1982
|
return;
|
1984
1983
|
}
|
@@ -1999,6 +1998,7 @@ sub GetImageInfo($$)
|
|
1999
1998
|
++$countGoodWr;
|
2000
1999
|
} else {
|
2001
2000
|
Warn "Error renaming $original\n";
|
2001
|
+
EFile($file);
|
2002
2002
|
++$countBad;
|
2003
2003
|
}
|
2004
2004
|
return;
|
@@ -2009,7 +2009,7 @@ sub GetImageInfo($$)
|
|
2009
2009
|
my ($fp, $outfile, $append);
|
2010
2010
|
if ($textOut and $verbose and not $tagOut) {
|
2011
2011
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2012
|
-
$fp or ++$countBad, return;
|
2012
|
+
$fp or EFile($file), ++$countBad, return;
|
2013
2013
|
# delete file if we exit prematurely (unless appending)
|
2014
2014
|
$tmpText = $outfile unless $append;
|
2015
2015
|
$et->Options(TextOut => $fp);
|
@@ -2041,6 +2041,7 @@ sub GetImageInfo($$)
|
|
2041
2041
|
Warn "Error: File not found - $file\n";
|
2042
2042
|
FileNotFound($file);
|
2043
2043
|
$outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
|
2044
|
+
EFile($file);
|
2044
2045
|
++$countBad;
|
2045
2046
|
return;
|
2046
2047
|
}
|
@@ -2090,6 +2091,7 @@ sub GetImageInfo($$)
|
|
2090
2091
|
}
|
2091
2092
|
if ($info->{Error}) {
|
2092
2093
|
Warn "Error: $info->{Error} - $file\n";
|
2094
|
+
EFile($file);
|
2093
2095
|
++$countBad;
|
2094
2096
|
return;
|
2095
2097
|
}
|
@@ -2100,7 +2102,7 @@ sub GetImageInfo($$)
|
|
2100
2102
|
# or if there is none of the requested information available
|
2101
2103
|
if ($binaryOutput or not %$info) {
|
2102
2104
|
my $errs = $et->GetInfo('Warning', 'Error');
|
2103
|
-
PrintErrors($et, $errs, $file) and $rtnVal = 1;
|
2105
|
+
PrintErrors($et, $errs, $file) and EFile($file), $rtnVal = 1;
|
2104
2106
|
} elsif ($et->GetValue('Error') or ($$et{Validate} and $et->GetValue('Warning'))) {
|
2105
2107
|
$rtnVal = 1;
|
2106
2108
|
}
|
@@ -2108,7 +2110,7 @@ sub GetImageInfo($$)
|
|
2108
2110
|
# open output file (or stdout if no output file) if not done already
|
2109
2111
|
unless ($outfile or $tagOut) {
|
2110
2112
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2111
|
-
$fp or ++$countBad, return;
|
2113
|
+
$fp or EFile($file), ++$countBad, return;
|
2112
2114
|
$tmpText = $outfile unless $append;
|
2113
2115
|
}
|
2114
2116
|
|
@@ -2167,7 +2169,7 @@ sub GetImageInfo($$)
|
|
2167
2169
|
}
|
2168
2170
|
delete $printFmt{HEAD} unless $outfile; # print header only once per output file
|
2169
2171
|
my $errs = $et->GetInfo('Warning', 'Error');
|
2170
|
-
PrintErrors($et, $errs, $file);
|
2172
|
+
PrintErrors($et, $errs, $file) and EFile($file);
|
2171
2173
|
} elsif (not $disableOutput) {
|
2172
2174
|
my ($tag, $line, %noDups, %csvInfo, $bra, $ket, $sep);
|
2173
2175
|
if ($fp) {
|
@@ -2276,7 +2278,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2276
2278
|
# the same group, and if so suppress this tag instead
|
2277
2279
|
next if $noDups and $tag =~ /^(.*?) ?\(/ and defined $$info{$1} and
|
2278
2280
|
$group eq $et->GetGroup($1, $showGroup);
|
2279
|
-
$group = 'Unknown' if not $group and ($xml or $json);
|
2281
|
+
$group = 'Unknown' if not $group and ($xml or $json or $csv);
|
2280
2282
|
if ($fp and not ($allGroup or $csv)) {
|
2281
2283
|
if ($lastGroup ne $group) {
|
2282
2284
|
if ($html) {
|
@@ -2659,6 +2661,7 @@ sub SetImageInfo($$$)
|
|
2659
2661
|
$outfile = FilenameSPrintf($outOpt, $orig);
|
2660
2662
|
if ($outfile eq '') {
|
2661
2663
|
Warn "Error: Can't create file with zero-length name from $orig\n";
|
2664
|
+
EFile($infile);
|
2662
2665
|
++$countBadCr;
|
2663
2666
|
return 0;
|
2664
2667
|
}
|
@@ -2675,6 +2678,7 @@ sub SetImageInfo($$$)
|
|
2675
2678
|
unless (CanCreate($outType)) {
|
2676
2679
|
my $what = $srcType ? 'other types' : 'scratch';
|
2677
2680
|
WarnOnce "Error: Can't create $outType files from $what\n";
|
2681
|
+
EFile($infile);
|
2678
2682
|
++$countBadCr;
|
2679
2683
|
return 0;
|
2680
2684
|
}
|
@@ -2712,6 +2716,7 @@ sub SetImageInfo($$$)
|
|
2712
2716
|
$outfile = NextUnusedFilename($outfile);
|
2713
2717
|
if ($et->Exists($outfile) and not $doSetFileName) {
|
2714
2718
|
Warn "Error: '${outfile}' already exists - $infile\n";
|
2719
|
+
EFile($infile);
|
2715
2720
|
++$countBadWr;
|
2716
2721
|
return 0;
|
2717
2722
|
}
|
@@ -2732,7 +2737,7 @@ sub SetImageInfo($$$)
|
|
2732
2737
|
$setTags = $tagsFromSrc || $setTags{$dyFile};
|
2733
2738
|
} else {
|
2734
2739
|
$fromFile = FilenameSPrintf($dyFile, $orig);
|
2735
|
-
++$countBadWr, return 0
|
2740
|
+
defined $fromFile or EFile($infile), ++$countBadWr, return 0;
|
2736
2741
|
$setTags = $setTags{$dyFile};
|
2737
2742
|
}
|
2738
2743
|
# do we have multiple -tagsFromFile options with this file?
|
@@ -2817,7 +2822,7 @@ sub SetImageInfo($$$)
|
|
2817
2822
|
my $err;
|
2818
2823
|
$err = "You shouldn't write FileName or Directory with TestFile" if defined $newFileName or defined $newDir;
|
2819
2824
|
$err = "The -o option shouldn't be used with TestFile" if defined $outfile;
|
2820
|
-
$err and Warn("Error: $err - $infile\n"), ++$countBadWr, return 0;
|
2825
|
+
$err and Warn("Error: $err - $infile\n"), EFile($infile), ++$countBadWr, return 0;
|
2821
2826
|
$testName = FilenameSPrintf($testName, $orig);
|
2822
2827
|
$testName = Image::ExifTool::GetNewFileName($file, $testName) if $file ne '';
|
2823
2828
|
}
|
@@ -2844,6 +2849,7 @@ sub SetImageInfo($$$)
|
|
2844
2849
|
$sameFile = $outfile; # same file, but the name has a different case
|
2845
2850
|
} else {
|
2846
2851
|
Warn "Error: '${outfile}' already exists - $infile\n";
|
2852
|
+
EFile($infile);
|
2847
2853
|
++$countBadWr;
|
2848
2854
|
return 0;
|
2849
2855
|
}
|
@@ -2863,6 +2869,7 @@ sub SetImageInfo($$$)
|
|
2863
2869
|
unless ($numSet) {
|
2864
2870
|
# no need to write if no tags set
|
2865
2871
|
print $vout "Nothing changed in $file\n" if defined $verbose;
|
2872
|
+
EFile($infile, 1);
|
2866
2873
|
++$countSameWr;
|
2867
2874
|
return 1;
|
2868
2875
|
}
|
@@ -2870,6 +2877,7 @@ sub SetImageInfo($$$)
|
|
2870
2877
|
if ($numSet == $numPseudo) {
|
2871
2878
|
# no need to write if no real tags
|
2872
2879
|
Warn("Error: Nothing to write - $file\n");
|
2880
|
+
EFile($infile, 1);
|
2873
2881
|
++$countBadWr;
|
2874
2882
|
return 0;
|
2875
2883
|
}
|
@@ -2881,6 +2889,7 @@ sub SetImageInfo($$$)
|
|
2881
2889
|
} else {
|
2882
2890
|
# file doesn't exist, and we can't create it
|
2883
2891
|
Warn "Error: File not found - $file\n";
|
2892
|
+
EFile($infile);
|
2884
2893
|
FileNotFound($file);
|
2885
2894
|
++$countBadWr;
|
2886
2895
|
return 0;
|
@@ -2895,9 +2904,11 @@ sub SetImageInfo($$$)
|
|
2895
2904
|
if ($r1 > 0 or $r2 > 0 or $r3 > 0 or $r4 > 0) {
|
2896
2905
|
++$countGoodWr;
|
2897
2906
|
} elsif ($r1 < 0 or $r2 < 0 or $r3 < 0 or $r4 < 0) {
|
2907
|
+
EFile($infile);
|
2898
2908
|
++$countBadWr;
|
2899
2909
|
return 0;
|
2900
2910
|
} else {
|
2911
|
+
EFile($infile, 1);
|
2901
2912
|
++$countSameWr;
|
2902
2913
|
}
|
2903
2914
|
if (defined $hardLink or defined $symLink or defined $testName) {
|
@@ -2911,6 +2922,7 @@ sub SetImageInfo($$$)
|
|
2911
2922
|
$outfile = "${file}_exiftool_tmp";
|
2912
2923
|
if ($et->Exists($outfile)) {
|
2913
2924
|
Warn("Error: Temporary file already exists: $outfile\n");
|
2925
|
+
EFile($infile);
|
2914
2926
|
++$countBadWr;
|
2915
2927
|
return 0;
|
2916
2928
|
}
|
@@ -3007,6 +3019,7 @@ sub SetImageInfo($$$)
|
|
3007
3019
|
} else {
|
3008
3020
|
close(NEW_FILE);
|
3009
3021
|
Warn "Error opening $file for writing\n";
|
3022
|
+
EFile($infile);
|
3010
3023
|
$et->Unlink($newFile);
|
3011
3024
|
++$countBadWr;
|
3012
3025
|
}
|
@@ -3024,11 +3037,13 @@ sub SetImageInfo($$$)
|
|
3024
3037
|
# unlink may fail if already renamed or no permission
|
3025
3038
|
if (not $et->Unlink($file)) {
|
3026
3039
|
Warn "Error renaming temporary file to $dstFile\n";
|
3040
|
+
EFile($infile);
|
3027
3041
|
$et->Unlink($newFile);
|
3028
3042
|
++$countBadWr;
|
3029
3043
|
# try renaming again now that the target has been deleted
|
3030
3044
|
} elsif (not $et->Rename($newFile, $dstFile)) {
|
3031
3045
|
Warn "Error renaming temporary file to $dstFile\n";
|
3046
|
+
EFile($infile);
|
3032
3047
|
# (don't delete tmp file now because it is all we have left)
|
3033
3048
|
++$countBadWr;
|
3034
3049
|
} else {
|
@@ -3050,6 +3065,7 @@ sub SetImageInfo($$$)
|
|
3050
3065
|
++$countGoodWr;
|
3051
3066
|
}
|
3052
3067
|
} elsif ($success) {
|
3068
|
+
EFile($infile, 1);
|
3053
3069
|
if ($isTemporary) {
|
3054
3070
|
# just erase the temporary file since no changes were made
|
3055
3071
|
$et->Unlink($tmpFile);
|
@@ -3063,6 +3079,7 @@ sub SetImageInfo($$$)
|
|
3063
3079
|
}
|
3064
3080
|
print $vout "Nothing changed in $file\n" if defined $verbose;
|
3065
3081
|
} else {
|
3082
|
+
EFile($infile);
|
3066
3083
|
$et->Unlink($tmpFile) if defined $tmpFile;
|
3067
3084
|
++$countBadWr;
|
3068
3085
|
}
|
@@ -3450,7 +3467,7 @@ sub DoSetFromFile($$$)
|
|
3450
3467
|
++$warns while $$info{"Warning ($warns)"};
|
3451
3468
|
$numSet -= $warns;
|
3452
3469
|
}
|
3453
|
-
PrintErrors($et, $info, $file) and ++$countBadWr, return 0;
|
3470
|
+
PrintErrors($et, $info, $file) and EFile($file), ++$countBadWr, return 0;
|
3454
3471
|
Warn "Warning: No writable tags set from $file\n" unless $numSet;
|
3455
3472
|
return 1;
|
3456
3473
|
}
|
@@ -3536,11 +3553,11 @@ sub ProcessFiles($;$)
|
|
3536
3553
|
push(@$list, $file);
|
3537
3554
|
} else {
|
3538
3555
|
GetImageInfo($et, $file);
|
3539
|
-
|
3556
|
+
$end and Warn("End called - $file\n");
|
3540
3557
|
}
|
3541
3558
|
}
|
3542
3559
|
$et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
|
3543
|
-
last if
|
3560
|
+
last if $end;
|
3544
3561
|
}
|
3545
3562
|
}
|
3546
3563
|
|
@@ -3551,7 +3568,7 @@ sub ScanDir($$;$)
|
|
3551
3568
|
{
|
3552
3569
|
local $_;
|
3553
3570
|
my ($et, $dir, $list) = @_;
|
3554
|
-
my (@fileList, $done, $file, $utf8Name, $winSurrogate);
|
3571
|
+
my (@fileList, $done, $file, $utf8Name, $winSurrogate, $endThisDir);
|
3555
3572
|
my $enc = $et->Options('CharsetFileName');
|
3556
3573
|
# recode as UTF-8 if necessary
|
3557
3574
|
if ($enc) {
|
@@ -3618,9 +3635,10 @@ sub ScanDir($$;$)
|
|
3618
3635
|
next if $file =~ /^\./ and ($recurse == 1 or $file eq '.' or $file eq '..');
|
3619
3636
|
next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
|
3620
3637
|
ScanDir($et, $path, $list);
|
3621
|
-
last if
|
3638
|
+
last if $end;
|
3622
3639
|
next;
|
3623
3640
|
}
|
3641
|
+
next if $endThisDir;
|
3624
3642
|
# apply rules from -ext options
|
3625
3643
|
my $accepted;
|
3626
3644
|
if ($filterFlag) {
|
@@ -3649,6 +3667,7 @@ sub ScanDir($$;$)
|
|
3649
3667
|
{
|
3650
3668
|
Warn("Not writing $path\n");
|
3651
3669
|
WarnOnce("Use -overwrite_original_in_place to write files with Unicode surrogate characters\n");
|
3670
|
+
EFile($file);
|
3652
3671
|
++$countBad;
|
3653
3672
|
next;
|
3654
3673
|
}
|
@@ -3657,14 +3676,15 @@ sub ScanDir($$;$)
|
|
3657
3676
|
push(@$list, $path);
|
3658
3677
|
} else {
|
3659
3678
|
GetImageInfo($et, $path);
|
3660
|
-
if (
|
3679
|
+
if ($end) {
|
3661
3680
|
Warn("End called - $file\n");
|
3662
3681
|
last;
|
3663
3682
|
}
|
3664
|
-
if (
|
3665
|
-
$
|
3683
|
+
if ($endDir) {
|
3684
|
+
$path =~ s(/$)();
|
3666
3685
|
Warn("EndDir called - $path\n");
|
3667
|
-
|
3686
|
+
undef $endDir;
|
3687
|
+
$endThisDir = 1;
|
3668
3688
|
}
|
3669
3689
|
}
|
3670
3690
|
}
|
@@ -3723,6 +3743,7 @@ sub FindFileWindows($$)
|
|
3723
3743
|
$evalWarning =~ s/ at .*//s;
|
3724
3744
|
Warn "Error: [Win32::FindFile] $evalWarning - $wildfile\n";
|
3725
3745
|
undef @files;
|
3746
|
+
EFile($wildfile);
|
3726
3747
|
++$countBad;
|
3727
3748
|
}
|
3728
3749
|
return @files;
|
@@ -4049,8 +4070,8 @@ sub CreateDirectory($)
|
|
4049
4070
|
}
|
4050
4071
|
$dir .= '/';
|
4051
4072
|
}
|
4073
|
+
++$countNewDir if $created;
|
4052
4074
|
}
|
4053
|
-
++$countNewDir if $created;
|
4054
4075
|
return $created;
|
4055
4076
|
}
|
4056
4077
|
|
@@ -4237,6 +4258,29 @@ sub ReadStayOpen($)
|
|
4237
4258
|
}
|
4238
4259
|
}
|
4239
4260
|
|
4261
|
+
#------------------------------------------------------------------------------
|
4262
|
+
# Add new entry to -efile output file
|
4263
|
+
# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed)
|
4264
|
+
sub EFile($$)
|
4265
|
+
{
|
4266
|
+
my $entry = shift;
|
4267
|
+
my $efile = $efile[shift || 0];
|
4268
|
+
if (defined $efile and length $entry and $entry ne '-') {
|
4269
|
+
my $err;
|
4270
|
+
CreateDirectory($efile);
|
4271
|
+
if ($mt->Open(\*EFILE_FILE, $efile, '>>')) {
|
4272
|
+
print EFILE_FILE $entry, "\n" or Warn("Error writing to $efile\n"), $err = 1;
|
4273
|
+
close EFILE_FILE;
|
4274
|
+
} else {
|
4275
|
+
Warn("Error opening '${efile}' for append\n");
|
4276
|
+
$err = 1;
|
4277
|
+
}
|
4278
|
+
if ($err) {
|
4279
|
+
defined $_ and $_ eq $efile and undef $_ foreach @efile;
|
4280
|
+
}
|
4281
|
+
}
|
4282
|
+
}
|
4283
|
+
|
4240
4284
|
#------------------------------------------------------------------------------
|
4241
4285
|
# Print list of tags
|
4242
4286
|
# Inputs: 0) message, 1-N) list of tag names
|
@@ -4282,15 +4326,6 @@ sub PrintErrors($$$)
|
|
4282
4326
|
Warn "$tag: $info->{$key} - $file\n";
|
4283
4327
|
}
|
4284
4328
|
}
|
4285
|
-
if ($$info{Error} and $efile) {
|
4286
|
-
if ($et->Open(\*ERR_FILE, $efile, '>>')) {
|
4287
|
-
print ERR_FILE $file, "\n" or Warn("Error writing to $efile\n"), undef $efile;
|
4288
|
-
close ERR_FILE;
|
4289
|
-
} else {
|
4290
|
-
Warn("Error opening '${efile}' for append\n");
|
4291
|
-
undef $efile;
|
4292
|
-
}
|
4293
|
-
}
|
4294
4329
|
return $$info{Error};
|
4295
4330
|
}
|
4296
4331
|
|
@@ -4353,46 +4388,47 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
4353
4388
|
|
4354
4389
|
File Types
|
4355
4390
|
------------+-------------+-------------+-------------+------------
|
4356
|
-
|
4357
|
-
|
4358
|
-
|
4359
|
-
|
4360
|
-
|
4361
|
-
|
4362
|
-
|
4363
|
-
|
4364
|
-
|
4365
|
-
|
4366
|
-
|
4367
|
-
|
4368
|
-
|
4369
|
-
|
4370
|
-
|
4371
|
-
|
4372
|
-
|
4373
|
-
|
4374
|
-
|
4375
|
-
|
4376
|
-
|
4377
|
-
|
4378
|
-
|
4379
|
-
|
4380
|
-
|
4381
|
-
|
4382
|
-
|
4383
|
-
|
4384
|
-
|
4385
|
-
|
4386
|
-
|
4387
|
-
|
4388
|
-
|
4389
|
-
|
4390
|
-
|
4391
|
-
|
4392
|
-
|
4393
|
-
|
4394
|
-
|
4395
|
-
|
4391
|
+
360 r/w | DPX r | ITC r | ODP r | RIFF r
|
4392
|
+
3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
|
4393
|
+
3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
|
4394
|
+
3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
|
4395
|
+
A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
|
4396
|
+
AA r | DVR-MS r | JSON r | OGV r | RWZ r
|
4397
|
+
AAE r | DYLIB r | K25 r | ONP r | RM r
|
4398
|
+
AAX r/w | EIP r | KDC r | OPUS r | SEQ r
|
4399
|
+
ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
|
4400
|
+
AFM r | EPUB r | LA r | OTF r | SO r
|
4401
|
+
AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
|
4402
|
+
AIFF r | EXE r | LNK r | PAGES r | SRF r
|
4403
|
+
APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
|
4404
|
+
ARQ r/w | EXR r | M2TS r | PCD r | SVG r
|
4405
|
+
ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
|
4406
|
+
ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
|
4407
|
+
AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
|
4408
|
+
AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
|
4409
|
+
AZW r | FLA r | MIE r/w/c | PFA r | TTC r
|
4410
|
+
BMP r | FLAC r | MIFF r | PFB r | TTF r
|
4411
|
+
BPG r | FLIF r/w | MKA r | PFM r | TXT r
|
4412
|
+
BTF r | FLV r | MKS r | PGF r | VCF r
|
4413
|
+
CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
|
4414
|
+
COS r | FPX r | MNG r/w | PLIST r | VSD r
|
4415
|
+
CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
|
4416
|
+
CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
|
4417
|
+
CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
|
4418
|
+
CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
|
4419
|
+
CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
|
4420
|
+
CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
|
4421
|
+
CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
|
4422
|
+
DCM r | HTML r | MPC r | PSB r/w | WV r
|
4423
|
+
DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
|
4424
|
+
DCR r | ICS r | MPO r/w | PSP r | XCF r
|
4425
|
+
DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
|
4426
|
+
DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
|
4427
|
+
DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
|
4428
|
+
DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
|
4429
|
+
DNG r/w | INSV r | NRW r/w | RAM r |
|
4430
|
+
DOC r | INX r | NUMBERS r | RAR r |
|
4431
|
+
DOCX r | ISO r | O r | RAW r/w |
|
4396
4432
|
|
4397
4433
|
Meta Information
|
4398
4434
|
----------------------+----------------------+---------------------
|
@@ -4448,7 +4484,7 @@ L<Input-output text formatting|/Input-output text formatting>
|
|
4448
4484
|
-f (-forcePrint) Force printing of all specified tags
|
4449
4485
|
-g[NUM...] (-groupHeadings) Organize output by tag group
|
4450
4486
|
-G[NUM...] (-groupNames) Print group name for each tag
|
4451
|
-
-h (-htmlFormat) Use
|
4487
|
+
-h (-htmlFormat) Use HTML formatting for output
|
4452
4488
|
-H (-hex) Show tag ID numbers in hexadecimal
|
4453
4489
|
-htmlDump[OFFSET] Generate HTML-format binary dump
|
4454
4490
|
-j[[+]=JSONFILE] (-json) Export/import tags in JSON format
|
@@ -4523,6 +4559,7 @@ L<Advanced options|/Advanced options>
|
|
4523
4559
|
-common_args Define common arguments
|
4524
4560
|
-config CFGFILE Specify configuration file name
|
4525
4561
|
-echo[NUM] TEXT Echo text to stdout or stderr
|
4562
|
+
-efile[NUM][!] ERRFILE Save names of files with errors
|
4526
4563
|
-execute[NUM] Execute multiple commands on one line
|
4527
4564
|
-srcfile FMT Process a different source file
|
4528
4565
|
-stay_open FLAG Keep reading -@ argfile even after EOF
|
@@ -4593,7 +4630,7 @@ delete or replace a tag (see L</WRITING EXAMPLES> for examples). C<^=> is
|
|
4593
4630
|
used to write an empty string instead of deleting the tag when no I<VALUE>
|
4594
4631
|
is given, but otherwise it is equivalent to C<=>.
|
4595
4632
|
|
4596
|
-
I<TAG> may contain one or more leading family 0, 1 or
|
4633
|
+
I<TAG> may contain one or more leading family 0, 1, 2 or 7 group names,
|
4597
4634
|
prefixed by optional family numbers, and separated colons. If no group name
|
4598
4635
|
is specified, the tag is created in the preferred group, and updated in any
|
4599
4636
|
other location where a same-named tag already exists. The preferred group
|
@@ -4648,7 +4685,7 @@ the specified group(s) are removed individually, and in this case is it
|
|
4648
4685
|
possible to exclude individual tags from a mass delete. For example,
|
4649
4686
|
C<-time:all --Exif:Time:All> removes all deletable Time tags except those in
|
4650
4687
|
the EXIF. This difference also applies if family 2 is specified when
|
4651
|
-
deleting all groups.
|
4688
|
+
deleting all groups. For example, C<-2all:all=> deletes tags individually,
|
4652
4689
|
while C<-all:all=> deletes entire blocks.
|
4653
4690
|
|
4654
4691
|
5) The "APP" group names ("APP0" through "APP15") are used to delete JPEG
|
@@ -5048,13 +5085,13 @@ B<-csv>=I<CSVFILE> feature.
|
|
5048
5085
|
|
5049
5086
|
Organize output by tag group. I<NUM> specifies a group family number, and
|
5050
5087
|
may be 0 (general location), 1 (specific location), 2 (category), 3
|
5051
|
-
(document number), 4 (instance number), 5 (metadata path)
|
5052
|
-
format). B<-g0> is assumed if a family number is not
|
5053
|
-
|
5054
|
-
Multiple families may be specified by separating them with colons.
|
5055
|
-
default the resulting group name is simplified by removing any leading
|
5088
|
+
(document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF
|
5089
|
+
format) or 7 (tag ID). B<-g0> is assumed if a family number is not
|
5090
|
+
specified. May be combined with other options to add group names to the
|
5091
|
+
output. Multiple families may be specified by separating them with colons.
|
5092
|
+
By default the resulting group name is simplified by removing any leading
|
5056
5093
|
C<Main:> and collapsing adjacent identical group names, but this can be
|
5057
|
-
avoided by placing a colon before the first family number (eg. B<-g:3:1>).
|
5094
|
+
avoided by placing a colon before the first family number (eg. B<-g:3:1>).
|
5058
5095
|
Use the B<-listg> option to list group names for a specified family. The
|
5059
5096
|
SavePath and SaveFormat API options are automatically enabled if the
|
5060
5097
|
respective family 5 or 6 group names are requested. See the
|
@@ -5259,7 +5296,7 @@ with this command:
|
|
5259
5296
|
|
5260
5297
|
produces output like this:
|
5261
5298
|
|
5262
|
-
-- Generated by ExifTool
|
5299
|
+
-- Generated by ExifTool 12.09 --
|
5263
5300
|
File: a.jpg - 2003:10:31 15:44:19
|
5264
5301
|
(f/5.6, 1/60s, ISO 100)
|
5265
5302
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6206,6 +6243,17 @@ is output as the command line is parsed, before the processing of any input
|
|
6206
6243
|
files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
|
6207
6244
|
respectively) after processing is complete.
|
6208
6245
|
|
6246
|
+
=item B<-efile>[I<NUM>][!] I<ERRFILE>
|
6247
|
+
|
6248
|
+
Save the names of files giving errors (I<NUM> missing or 1), files that were
|
6249
|
+
unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
|
6250
|
+
or any combination thereof (by summing I<NUM>, eg. B<-efile3> is the same
|
6251
|
+
has having both B<-efile> and B<-efile2> options with the same I<ERRFILE>).
|
6252
|
+
By default, file names are appended to any existing I<ERRFILE>, but
|
6253
|
+
I<ERRFILE> is overwritten if an exclamation point is added to the option
|
6254
|
+
(eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
|
6255
|
+
option if applicable.
|
6256
|
+
|
6209
6257
|
=item B<-execute>[I<NUM>]
|
6210
6258
|
|
6211
6259
|
Execute command for all arguments up to this point on the command line (plus
|
@@ -6259,7 +6307,7 @@ line (see the B<-@> option for details).
|
|
6259
6307
|
|
6260
6308
|
3) Write C<-execute\n> to I<ARGFILE>, where C<\n> represents a newline
|
6261
6309
|
sequence. (Note: You may need to flush your write buffers here if using
|
6262
|
-
buffered output.)
|
6310
|
+
buffered output.) ExifTool will then execute the command with the arguments
|
6263
6311
|
received up to this point, send a "{ready}" message to stdout when done
|
6264
6312
|
(unless the B<-q> or B<-T> option is used), and continue trying to read
|
6265
6313
|
arguments for the next command from I<ARGFILE>. To aid in command/response
|