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.

Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +196 -2
  3. data/bin/MANIFEST +8 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +43 -42
  7. data/bin/exiftool +150 -102
  8. data/bin/lib/Image/ExifTool.pm +162 -111
  9. data/bin/lib/Image/ExifTool.pod +123 -90
  10. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  11. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +21 -10
  13. data/bin/lib/Image/ExifTool/Canon.pm +201 -14
  14. data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
  15. data/bin/lib/Image/ExifTool/DPX.pm +56 -2
  16. data/bin/lib/Image/ExifTool/DarwinCore.pm +22 -3
  17. data/bin/lib/Image/ExifTool/EXE.pm +8 -5
  18. data/bin/lib/Image/ExifTool/Exif.pm +15 -6
  19. data/bin/lib/Image/ExifTool/Font.pm +9 -2
  20. data/bin/lib/Image/ExifTool/GIF.pm +6 -1
  21. data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
  22. data/bin/lib/Image/ExifTool/Geotag.pm +2 -2
  23. data/bin/lib/Image/ExifTool/GoPro.pm +48 -22
  24. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  25. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
  26. data/bin/lib/Image/ExifTool/ID3.pm +91 -12
  27. data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
  28. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  29. data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
  30. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  31. data/bin/lib/Image/ExifTool/M2TS.pm +44 -24
  32. data/bin/lib/Image/ExifTool/MacOS.pm +152 -38
  33. data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
  34. data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
  35. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
  36. data/bin/lib/Image/ExifTool/Nikon.pm +163 -18
  37. data/bin/lib/Image/ExifTool/Olympus.pm +39 -17
  38. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  39. data/bin/lib/Image/ExifTool/PPM.pm +5 -5
  40. data/bin/lib/Image/ExifTool/Panasonic.pm +148 -14
  41. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +34 -0
  42. data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
  43. data/bin/lib/Image/ExifTool/Pentax.pm +3 -1
  44. data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
  45. data/bin/lib/Image/ExifTool/QuickTime.pm +294 -34
  46. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
  47. data/bin/lib/Image/ExifTool/README +26 -22
  48. data/bin/lib/Image/ExifTool/RIFF.pm +15 -3
  49. data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
  50. data/bin/lib/Image/ExifTool/RTF.pm +12 -7
  51. data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
  52. data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
  53. data/bin/lib/Image/ExifTool/Shift.pl +1 -0
  54. data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
  55. data/bin/lib/Image/ExifTool/Sony.pm +420 -34
  56. data/bin/lib/Image/ExifTool/TagLookup.pm +5799 -5671
  57. data/bin/lib/Image/ExifTool/TagNames.pod +583 -95
  58. data/bin/lib/Image/ExifTool/Validate.pm +4 -4
  59. data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
  60. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +26 -18
  61. data/bin/lib/Image/ExifTool/Writer.pl +44 -21
  62. data/bin/lib/Image/ExifTool/XMP.pm +99 -17
  63. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  64. data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
  65. data/bin/perl-Image-ExifTool.spec +42 -41
  66. data/lib/exiftool_vendored/version.rb +1 -1
  67. metadata +8 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7221434022aae95d2a68084a499a8b114bbec64edfb43daeefd3e3f33c8b4178
4
- data.tar.gz: 51610e0fb64869f5c989ab9dca28ed73156893d2c5ec19b4374fee27fb9bc87b
3
+ metadata.gz: 1095c3210c7799b406dbff7b262f1e48bba57874a51d7ada486b7ab12c4f946c
4
+ data.tar.gz: 6cd2472d73f0bd3178bfb9cb31d3c2dbd3c37d5c73ba370ea6fced3a9bfde512
5
5
  SHA512:
6
- metadata.gz: 9b8bb1e623b568a39c28c6d9eda0b92a00730de352e48c1aa226624323c403a4a5a5b5b6358b247ae3604006f290c088ae64352be741e1206ff4fb938f55bdcb
7
- data.tar.gz: 343021ad049d3d2443b0a29060ddad05f691f8ed77b5a175f0c6113a880b13ca86ec21b8cff62c24b95040ae28f0755b6f83acb6c388dbdf60510a5d68536ba1
6
+ metadata.gz: 490b8624766262c4231eb655f2df5e6c2ebe35efa3f4e8131b36696d017daf5d637e3baad7fb403c587ab18e2fe09321a8444bd797eb093c127bdaabbd2f38ed
7
+ data.tar.gz: fd4dd627988588ee71fee72a7071645aa9ef53bb687e0ade23e53c0e63590912f81abf6a300bf969e2578a64a0f58d962417d0dae00779c0ff7ea4987c5af28e
@@ -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 11.85. (Other versions are
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
@@ -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
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "11.97"
50
+ "version" : "12.09"
51
51
  }
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 11.97
31
+ version: 12.09
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
- 3FR r | DR4 r/w/c | ITC r | ODP r | RIFF r
18
- 3G2 r/w | DSS r | J2C r | ODS r | RSRC r
19
- 3GP r/w | DV r | JNG r/w | ODT r | RTF r
20
- A r | DVB r/w | JP2 r/w | OFR r | RW2 r/w
21
- AA r | DVR-MS r | JPEG r/w | OGG r | RWL r/w
22
- AAE r | DYLIB r | JSON r | OGV r | RWZ r
23
- AAX r/w | EIP r | K25 r | OPUS r | RM r
24
- ACR r | EPS r/w | KDC r | ORF r/w | SEQ r
25
- AFM r | EPUB r | KEY r | OTF r | SKETCH r
26
- AI r/w | ERF r/w | LA r | PAC r | SO r
27
- AIFF r | EXE r | LFP r | PAGES r | SR2 r/w
28
- APE r | EXIF r/w/c | LNK r | PBM r/w | SRF r
29
- ARQ r/w | EXR r | LRV r/w | PCD r | SRW r/w
30
- ARW r/w | EXV r/w/c | M2TS r | PCX r | SVG r
31
- ASF r | F4A/V r/w | M4A/V r/w | PDB r | SWF r
32
- AVI r | FFF r/w | MAX r | PDF r/w | THM r/w
33
- AVIF r/w | FITS r | MEF r/w | PEF r/w | TIFF r/w
34
- AZW r | FLA r | MIE r/w/c | PFA r | TORRENT r
35
- BMP r | FLAC r | MIFF r | PFB r | TTC r
36
- BPG r | FLIF r/w | MKA r | PFM r | TTF r
37
- BTF r | FLV r | MKS r | PGF r | TXT r
38
- CHM r | FPF r | MKV r | PGM r/w | VCF r
39
- COS r | FPX r | MNG r/w | PLIST r | VRD r/w/c
40
- CR2 r/w | GIF r/w | MOBI r | PICT r | VSD r
41
- CR3 r/w | GPR r/w | MODD r | PMP r | WAV r
42
- CRM r/w | GZ r | MOI r | PNG r/w | WDP r/w
43
- CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBP r
44
- CS1 r/w | HDR r | MOV r/w | PPT r | WEBM r
45
- CSV r | HEIC r/w | MP3 r | PPTX r | WMA r
46
- DCM r | HEIF r/w | MP4 r/w | PS r/w | WMV r
47
- DCP r/w | HTML r | MPC r | PSB r/w | WTV r
48
- DCR r | ICC r/w/c | MPG r | PSD r/w | WV r
49
- DFONT r | ICS r | MPO r/w | PSP r | X3F r/w
50
- DIVX r | IDML r | MQV r/w | QTIF r/w | XCF r
51
- DJVU r | IIQ r/w | MRW r/w | R3D r | XLS r
52
- DLL r | IND r/w | MXF r | RA r | XLSX r
53
- DNG r/w | INSP r/w | NEF r/w | RAF r/w | XMP r/w/c
54
- DOC r | INSV r | NRW r/w | RAM r | ZIP r
55
- DOCX r | INX r | NUMBERS r | RAR r |
56
- DPX r | ISO r | O r | RAW r/w |
17
+ 360 r/w | DPX r | ITC r | ODP r | RIFF r
18
+ 3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
19
+ 3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
20
+ 3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
21
+ A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
22
+ AA r | DVR-MS r | JSON r | OGV r | RWZ r
23
+ AAE r | DYLIB r | K25 r | ONP r | RM r
24
+ AAX r/w | EIP r | KDC r | OPUS r | SEQ r
25
+ ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
26
+ AFM r | EPUB r | LA r | OTF r | SO r
27
+ AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
28
+ AIFF r | EXE r | LNK r | PAGES r | SRF r
29
+ APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
30
+ ARQ r/w | EXR r | M2TS r | PCD r | SVG r
31
+ ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
32
+ ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
33
+ AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
34
+ AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
35
+ AZW r | FLA r | MIE r/w/c | PFA r | TTC r
36
+ BMP r | FLAC r | MIFF r | PFB r | TTF r
37
+ BPG r | FLIF r/w | MKA r | PFM r | TXT r
38
+ BTF r | FLV r | MKS r | PGF r | VCF r
39
+ CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
40
+ COS r | FPX r | MNG r/w | PLIST r | VSD r
41
+ CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
42
+ CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
43
+ CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
44
+ CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
45
+ CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
46
+ CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
47
+ CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
48
+ DCM r | HTML r | MPC r | PSB r/w | WV r
49
+ DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
50
+ DCR r | ICS r | MPO r/w | PSP r | XCF r
51
+ DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
52
+ DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
53
+ DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
54
+ DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
55
+ DNG r/w | INSV r | NRW r/w | RAM r |
56
+ DOC r | INX r | NUMBERS r | RAR r |
57
+ DOCX r | ISO r | O r | RAW r/w |
57
58
 
58
59
  Meta Information
59
60
  ----------------------+----------------------+---------------------
@@ -105,8 +106,8 @@ your home directory, then you would type the following commands in a
105
106
  terminal window to extract and run ExifTool:
106
107
 
107
108
  cd ~/Desktop
108
- gzip -dc Image-ExifTool-11.97.tar.gz | tar -xf -
109
- cd Image-ExifTool-11.97
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.
@@ -10,7 +10,7 @@
10
10
  use strict;
11
11
  require 5.004;
12
12
 
13
- my $version = '11.97';
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 $efile; # file for writing list of error file names
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 $$mt{EndDir} = 1 }
297
- sub Image::ExifTool::End() { return $$mt{End} = 1 }
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 $efile;
446
- undef $efile2;
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([12])?$/i) {
877
- @ARGV or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
878
- if (defined $1 and $1 eq '2') {
879
- $efile2 = shift;
880
- } else {
881
- $efile = shift;
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} = $database{$_} unless $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
- if ($efile2) {
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 unless defined $fromFile;
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
- $$et{End} and Warn("End called - $file\n");
3556
+ $end and Warn("End called - $file\n");
3540
3557
  }
3541
3558
  }
3542
3559
  $et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
3543
- last if $$et{End};
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 $$et{End};
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 ($$et{End}) {
3679
+ if ($end) {
3661
3680
  Warn("End called - $file\n");
3662
3681
  last;
3663
3682
  }
3664
- if ($$et{EndDir}) {
3665
- $dir =~ s(/$)();
3683
+ if ($endDir) {
3684
+ $path =~ s(/$)();
3666
3685
  Warn("EndDir called - $path\n");
3667
- last;
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
- 3FR r | DR4 r/w/c | ITC r | ODP r | RIFF r
4357
- 3G2 r/w | DSS r | J2C r | ODS r | RSRC r
4358
- 3GP r/w | DV r | JNG r/w | ODT r | RTF r
4359
- A r | DVB r/w | JP2 r/w | OFR r | RW2 r/w
4360
- AA r | DVR-MS r | JPEG r/w | OGG r | RWL r/w
4361
- AAE r | DYLIB r | JSON r | OGV r | RWZ r
4362
- AAX r/w | EIP r | K25 r | OPUS r | RM r
4363
- ACR r | EPS r/w | KDC r | ORF r/w | SEQ r
4364
- AFM r | EPUB r | KEY r | OTF r | SKETCH r
4365
- AI r/w | ERF r/w | LA r | PAC r | SO r
4366
- AIFF r | EXE r | LFP r | PAGES r | SR2 r/w
4367
- APE r | EXIF r/w/c | LNK r | PBM r/w | SRF r
4368
- ARQ r/w | EXR r | LRV r/w | PCD r | SRW r/w
4369
- ARW r/w | EXV r/w/c | M2TS r | PCX r | SVG r
4370
- ASF r | F4A/V r/w | M4A/V r/w | PDB r | SWF r
4371
- AVI r | FFF r/w | MAX r | PDF r/w | THM r/w
4372
- AVIF r/w | FITS r | MEF r/w | PEF r/w | TIFF r/w
4373
- AZW r | FLA r | MIE r/w/c | PFA r | TORRENT r
4374
- BMP r | FLAC r | MIFF r | PFB r | TTC r
4375
- BPG r | FLIF r/w | MKA r | PFM r | TTF r
4376
- BTF r | FLV r | MKS r | PGF r | TXT r
4377
- CHM r | FPF r | MKV r | PGM r/w | VCF r
4378
- COS r | FPX r | MNG r/w | PLIST r | VRD r/w/c
4379
- CR2 r/w | GIF r/w | MOBI r | PICT r | VSD r
4380
- CR3 r/w | GPR r/w | MODD r | PMP r | WAV r
4381
- CRM r/w | GZ r | MOI r | PNG r/w | WDP r/w
4382
- CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBP r
4383
- CS1 r/w | HDR r | MOV r/w | PPT r | WEBM r
4384
- CSV r | HEIC r/w | MP3 r | PPTX r | WMA r
4385
- DCM r | HEIF r/w | MP4 r/w | PS r/w | WMV r
4386
- DCP r/w | HTML r | MPC r | PSB r/w | WTV r
4387
- DCR r | ICC r/w/c | MPG r | PSD r/w | WV r
4388
- DFONT r | ICS r | MPO r/w | PSP r | X3F r/w
4389
- DIVX r | IDML r | MQV r/w | QTIF r/w | XCF r
4390
- DJVU r | IIQ r/w | MRW r/w | R3D r | XLS r
4391
- DLL r | IND r/w | MXF r | RA r | XLSX r
4392
- DNG r/w | INSP r/w | NEF r/w | RAF r/w | XMP r/w/c
4393
- DOC r | INSV r | NRW r/w | RAM r | ZIP r
4394
- DOCX r | INX r | NUMBERS r | RAR r |
4395
- DPX r | ISO r | O r | RAW r/w |
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 HMTL formatting for output
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 2 group names,
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. For example, C<-2all:all=> deletes tags individually,
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) or 6 (EXIF/TIFF
5052
- format). B<-g0> is assumed if a family number is not specified, and family
5053
- numbers may be added wherever B<-g> is mentioned in the documentation.
5054
- Multiple families may be specified by separating them with colons. By
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 11.97 --
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.) Exiftool will then execute the command with the arguments
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