exiftool_vendored 11.97.0 → 12.09.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 +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
|