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