exiftool_vendored 12.09.0 → 12.14.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 (194) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +76 -5
  3. data/bin/MANIFEST +3 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +3 -3
  7. data/bin/exiftool +156 -64
  8. data/bin/lib/File/RandomAccess.pm +1 -1
  9. data/bin/lib/File/RandomAccess.pod +2 -2
  10. data/bin/lib/Image/ExifTool.pm +18 -10
  11. data/bin/lib/Image/ExifTool.pod +14 -10
  12. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  13. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  14. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  15. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  16. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  17. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  18. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  19. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  20. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  21. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  23. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  24. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +10 -4
  25. data/bin/lib/Image/ExifTool/Canon.pm +20 -15
  26. data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  27. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  28. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  29. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  31. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  32. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  33. data/bin/lib/Image/ExifTool/DJI.pm +1 -1
  34. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  37. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  38. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  39. data/bin/lib/Image/ExifTool/EXE.pm +1 -1
  40. data/bin/lib/Image/ExifTool/Exif.pm +14 -1
  41. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  42. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  43. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  44. data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  45. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  46. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  47. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  48. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  50. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  51. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  52. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  53. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  54. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  55. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  56. data/bin/lib/Image/ExifTool/Geotag.pm +30 -11
  57. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  58. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  59. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  60. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  61. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  62. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  63. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  64. data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  65. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  66. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  67. data/bin/lib/Image/ExifTool/Import.pm +15 -12
  68. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  69. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  70. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  71. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  72. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  73. data/bin/lib/Image/ExifTool/Jpeg2000.pm +9 -4
  74. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  75. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  76. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  77. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  78. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  79. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  81. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  82. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  83. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  96. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  97. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  98. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  99. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  100. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  101. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  102. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  103. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  104. data/bin/lib/Image/ExifTool/MPF.pm +3 -3
  105. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  106. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MacOS.pm +4 -2
  108. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  109. data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
  110. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  111. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  112. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  113. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  114. data/bin/lib/Image/ExifTool/Nikon.pm +7 -5
  115. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  116. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  117. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  118. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  119. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  120. data/bin/lib/Image/ExifTool/Olympus.pm +4 -2
  121. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  123. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  124. data/bin/lib/Image/ExifTool/PDF.pm +10 -2
  125. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  126. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  127. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  128. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  129. data/bin/lib/Image/ExifTool/PNG.pm +1 -1
  130. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  131. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  132. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  133. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  134. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  135. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  136. data/bin/lib/Image/ExifTool/Pentax.pm +12 -4
  137. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  138. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  140. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  143. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  144. data/bin/lib/Image/ExifTool/QuickTime.pm +28 -18
  145. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +24 -3
  146. data/bin/lib/Image/ExifTool/RIFF.pm +82 -5
  147. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  148. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  149. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  150. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  151. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  152. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  153. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  155. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  156. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  157. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  158. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  159. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  160. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  161. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  162. data/bin/lib/Image/ExifTool/Sony.pm +16 -12
  163. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  164. data/bin/lib/Image/ExifTool/Stim.pm +3 -3
  165. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  166. data/bin/lib/Image/ExifTool/TagLookup.pm +7 -1
  167. data/bin/lib/Image/ExifTool/TagNames.pod +41 -13
  168. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  169. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  170. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  171. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  172. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  173. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  174. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  175. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  176. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  177. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  178. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  179. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  180. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  181. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  182. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  183. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -4
  184. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  185. data/bin/lib/Image/ExifTool/Writer.pl +31 -17
  186. data/bin/lib/Image/ExifTool/XMP.pm +17 -8
  187. data/bin/lib/Image/ExifTool/XMP2.pl +6 -1
  188. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  189. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  190. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  191. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  192. data/bin/perl-Image-ExifTool.spec +1 -1
  193. data/lib/exiftool_vendored/version.rb +1 -1
  194. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1095c3210c7799b406dbff7b262f1e48bba57874a51d7ada486b7ab12c4f946c
4
- data.tar.gz: 6cd2472d73f0bd3178bfb9cb31d3c2dbd3c37d5c73ba370ea6fced3a9bfde512
3
+ metadata.gz: 1529a49f0175445c31e6d5a6607546d958e2b08ce2c044d43232ac07f51a6fb5
4
+ data.tar.gz: bc6637fc0ef323192aa5e6c7e8553520f2d0acd9039e870ae1f9340fa00445c8
5
5
  SHA512:
6
- metadata.gz: 490b8624766262c4231eb655f2df5e6c2ebe35efa3f4e8131b36696d017daf5d637e3baad7fb403c587ab18e2fe09321a8444bd797eb093c127bdaabbd2f38ed
7
- data.tar.gz: fd4dd627988588ee71fee72a7071645aa9ef53bb687e0ade23e53c0e63590912f81abf6a300bf969e2578a64a0f58d962417d0dae00779c0ff7ea4987c5af28e
6
+ metadata.gz: 03fa438994202e58a6c85ae0715018f89ca76c3f0fbfa87a9a8438b5c73637ed53d92491759f63926e3c57cefb2ec5f22dadd8b67c04d20a8e06aaa33f0328c0
7
+ data.tar.gz: 5e2cd8a33c4d66057bf115cd6f3bf3adaab426a44d8988747581d21478c81325e3cc88410b783cb6da7a55efbc04f7bc448291d509baf248995d10cfdcdeea0f
@@ -5,7 +5,80 @@ ExifTool Version History
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
7
  Note: The most recent production release is Version 12.00. (Other versions are
8
- considered development releases, and are not uploaded to CPAN.)
8
+ considered development releases, and are not uploaded to MetaCPAN.)
9
+
10
+ Jan. 6, 2021 - Version 12.14
11
+
12
+ - Added support for 2 more types of timed GPS in video files (that makes 49
13
+ different formats now supported)
14
+ - Added validity check for PDF trailer dictionary Size
15
+ - Added a new Pentax LensType
16
+ - Extract metadata from Jpeg2000 Association box
17
+ - Changed -g:XX:YY and -G:XX:YY options to show empty strings for non-existent
18
+ groups
19
+ - Patched to issue warning and avoid writing date/time values with a zero
20
+ month or day number
21
+ - Patched to avoid runtime warnings if trying to set FileName to an empty
22
+ string
23
+ - Fixed issue that could cause GPS test number 12 to fail on some systems
24
+ - Fixed problem extracting XML as a block from Jpeg2000 images, and extract
25
+ XML tags in the XML group instead of XMP
26
+
27
+ Dec. 24, 2020 - Version 12.13
28
+
29
+ - Added -i HIDDEN option to ignore files with names that start with "."
30
+ - Added a few new Nikon ShutterMode values (thanks Jan Skoda)
31
+ - Added ability to write Google GCamera MicroVideo XMP tags
32
+ - Add time zone automatically to most string-based QuickTime date/time tags
33
+ when writing unless the PrintConv option is disabled
34
+ - Decode a new Sony tag (thanks LibRaw)
35
+ - Changed behaviour when writing only pseudo tags to return an error and avoid
36
+ writing any other tags if writing FileName fails
37
+ - Print "X image files read" message even if only 1 file is read when at least
38
+ one other file has failed the -if condition
39
+
40
+ Dec. 4, 2020 - Version 12.12
41
+
42
+ - Added ability to geotag from DJI CSV log files
43
+ - Added a new CanonModelID
44
+ - Added a couple of new Sony LensType values (thanks LibRaw)
45
+ - Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\"
46
+ - Unescape "\b" and "\f" in imported JSON values
47
+ - Fixed bug introduced in 12.10 which generated a "Not an integer" warning
48
+ when attempting to shift some QuickTime date/time tags
49
+ - Fixed shared-write permission problem with -@ argfile when using -stay_open
50
+ and a filename containing special characters on Windows
51
+
52
+ Nov. 27, 2020 - Version 12.11
53
+
54
+ - Added -csvDelim option
55
+ - Added new Canon and Olympus LensType values (thanks LibRaw)
56
+ - Added a warning if ICC_Profile is deleted from an image (github issue #63)
57
+ - EndDir() function for -if option now works when -fileOrder is used
58
+ - Changed FileSize conversion to use binary prefixes since that is how the
59
+ conversion is currently done (eg. MiB instead of MB)
60
+ - Patched -csv option so columns aren't resorted when using -G option and one
61
+ of the tags is missing from a file
62
+ - Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
63
+ to MP4 videos
64
+ - Fixed problem where the tags available in a -p format string were limited to
65
+ the same as the -if[NUM] option when NUM was specified
66
+ - Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
67
+ models
68
+
69
+ Nov. 12, 2020 - Version 12.10
70
+
71
+ - Added -validate test for proper TIFF magic number in JPEG EXIF header
72
+ - Added support for Nikon Z7 LensData version 0801
73
+ - Added a new XMP-GPano tag
74
+ - Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw)
75
+ - Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost)
76
+ - Automatically apply QuickTimeUTC option for CR3 files
77
+ - Improved decoding of XAttrMDLabel from MacOS files
78
+ - Ignore time zones when writing date/time values and using the -d option
79
+ - Enhanced -echo3 and -echo4 options to allow exit status to be returned
80
+ - Changed -execute so the -q option no longer suppresses the "{ready}" message
81
+ when a synchronization number is used (eg. -execute123)
9
82
 
10
83
  Oct. 29, 2020 - Version 12.09
11
84
 
@@ -17,15 +90,14 @@ Oct. 29, 2020 - Version 12.09
17
90
  - Added a new Sony LensType (thanks Jos Roost)
18
91
  - Added a new Nikon Z lens (thanks LibRaw)
19
92
  - Added a new Canon LensType
20
- - Added a new XMP-crs tag
21
93
  - Decode ColorData for Canon EOS R5/R6
22
94
  - Decode a couple of new HEIF tags
23
95
  - 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
96
  - Improved decoding of Sony CreativeStyle tags (thanks Jos Roost)
27
97
  - Improved parsing of Radiance files to recognize comments
28
98
  - Renamed GIF AspectRatio tag to PixelAspectRatio
99
+ - Patched EndDir() feature so subdirectories are always processed when -r is
100
+ used (previously, EndDir() would end processing of a directory completely)
29
101
  - Yet another tweak to the EventTime formatting rules (also allow time-only
30
102
  values with fractional seconds and a time zone)
31
103
  - Avoid loading GoPro module unnecessarily when reading MP4 videos from some
@@ -33,7 +105,6 @@ Oct. 29, 2020 - Version 12.09
33
105
  - Fixed problem with an incorrect naming of CodecID tags in some MKV videos
34
106
  - Fixed verbose output to avoid "adding" messages for existing flattened XMP
35
107
  tags
36
- - Added read support for MacOS "._" sidecar files
37
108
 
38
109
  Oct. 15, 2020 - Version 12.08
39
110
 
@@ -567,6 +567,7 @@ t/GeoTiff_4.out
567
567
  t/Geotag.t
568
568
  t/Geotag_10.out
569
569
  t/Geotag_11.out
570
+ t/Geotag_12.out
570
571
  t/Geotag_2.out
571
572
  t/Geotag_3.out
572
573
  t/Geotag_5.out
@@ -602,6 +603,7 @@ t/Jpeg2000.t
602
603
  t/Jpeg2000_2.out
603
604
  t/Jpeg2000_3.out
604
605
  t/Jpeg2000_4.out
606
+ t/Jpeg2000_5.out
605
607
  t/Kodak.t
606
608
  t/Kodak_2.out
607
609
  t/Kodak_3.out
@@ -986,6 +988,7 @@ t/images/Geotag.log
986
988
  t/images/Geotag.xml
987
989
  t/images/Geotag2.log
988
990
  t/images/Geotag3.log
991
+ t/images/Geotag_DJI_2020-12-02_[07-50-31].csv
989
992
  t/images/GoPro.jpg
990
993
  t/images/HTML.html
991
994
  t/images/ICC_Profile.icc
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.09"
50
+ "version" : "12.14"
51
51
  }
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.09
31
+ version: 12.14
data/bin/README CHANGED
@@ -106,8 +106,8 @@ your home directory, then you would type the following commands in a
106
106
  terminal window to extract and run ExifTool:
107
107
 
108
108
  cd ~/Desktop
109
- gzip -dc Image-ExifTool-12.09.tar.gz | tar -xf -
110
- cd Image-ExifTool-12.09
109
+ gzip -dc Image-ExifTool-12.14.tar.gz | tar -xf -
110
+ cd Image-ExifTool-12.14
111
111
  ./exiftool t/images/ExifTool.jpg
112
112
 
113
113
  Note: These commands extract meta information from one of the test images.
@@ -161,7 +161,7 @@ for calculating digest values and providing other features listed below:
161
161
 
162
162
  COPYRIGHT AND LICENSE
163
163
 
164
- Copyright 2003-2020, Phil Harvey
164
+ Copyright 2003-2021, Phil Harvey
165
165
 
166
166
  This is free software; you can redistribute it and/or modify it under the
167
167
  same terms as Perl itself.
@@ -10,7 +10,7 @@
10
10
  use strict;
11
11
  require 5.004;
12
12
 
13
- my $version = '12.09';
13
+ my $version = '12.14';
14
14
 
15
15
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
16
16
  my $exeDir;
@@ -106,6 +106,7 @@ my %csvTags; # lookup for all found tags with CSV option (lower case keys
106
106
  my %database; # lookup for database information based on file name (in ExifTool Charset)
107
107
  my %filterExt; # lookup for filtered extensions
108
108
  my %ignore; # directory names to ignore
109
+ my $ignoreHidden; # flag to ignore hidden files
109
110
  my %preserveTime; # preserved timestamps for files
110
111
  my %printFmt; # the contents of the print format file
111
112
  my %setTags; # hash of list references for tags to set from files
@@ -136,12 +137,13 @@ my $countSameWr; # count files written OK but not changed
136
137
  my $critical; # flag for critical operations (disable CTRL-C)
137
138
  my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
138
139
  my $csvAdd; # flag to add CSV information to existing lists
140
+ my $csvDelim; # delimiter for CSV files
139
141
  my $csvSaveCount; # save counter for last CSV file loaded
140
142
  my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
141
143
  my $disableOutput; # flag to disable normal output
142
144
  my $doSetFileName; # flag set if FileName may be written
143
145
  my $doUnzip; # flag to extract info from .gz and .bz2 files
144
- my ($end,$endDir); # flags to end processing
146
+ my ($end,$endDir,%endDir); # flags to end processing
145
147
  my $escapeC; # C-style escape
146
148
  my $escapeHTML; # flag to escape printed values for html
147
149
  my $evalWarning; # warning from eval
@@ -239,6 +241,7 @@ my %optArgs = (
239
241
  '-c' => 1, '-coordformat' => 1,
240
242
  '-charset' => 0, # (optional arg; OK because arg cannot begin with "-")
241
243
  '-config' => 1,
244
+ '-csvdelim' => 1,
242
245
  '-d' => 1, '-dateformat' => 1,
243
246
  '-D' => 0, # necessary to avoid matching lower-case equivalent
244
247
  '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
@@ -246,11 +249,12 @@ my %optArgs = (
246
249
  '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
247
250
  '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
248
251
  '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
249
- '-fileorder' => 1,
252
+ '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
253
+ '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
250
254
  '-geotag' => 1,
251
255
  '-globaltimeshift' => 1,
252
256
  '-i' => 1, '-ignore' => 1,
253
- '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1,
257
+ '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
254
258
  '-lang' => 0, # (optional arg; cannot begin with "-")
255
259
  '-listitem' => 1,
256
260
  '-o' => 1, '-out' => 1,
@@ -366,13 +370,21 @@ if (grep /^-common_args$/i, @ARGV) {
366
370
  # loop over sets of command-line arguments separated by "-execute"
367
371
  Command: for (;;) {
368
372
 
369
- @echo3 and print STDOUT join("\n", @echo3), "\n";
370
- @echo4 and print STDERR join("\n", @echo4), "\n";
373
+ if (@echo3) {
374
+ my $str = join "\n", @echo3, "\n";
375
+ $str =~ s/\$\{status\}/$rtnVal/ig;
376
+ print STDOUT $str;
377
+ }
378
+ if (@echo4) {
379
+ my $str = join "\n", @echo4, "\n";
380
+ $str =~ s/\$\{status\}/$rtnVal/ig;
381
+ print STDERR $str;
382
+ }
371
383
 
372
384
  $rafStdin->Close() if $rafStdin;
373
385
  undef $rafStdin;
374
386
 
375
- # save or previous return codes
387
+ # save our previous return codes
376
388
  $rtnValPrev = $rtnVal;
377
389
  $rtnValApp = $rtnVal if $rtnVal;
378
390
 
@@ -387,7 +399,7 @@ if ($binaryStdout) {
387
399
 
388
400
  # flush console and print "{ready}" message if -stay_open is in effect
389
401
  if ($stayOpen >= 2) {
390
- if ($quiet) {
402
+ if ($quiet and not defined $executeID) {
391
403
  # flush output if possible
392
404
  eval { require IO::Handle } and STDERR->flush(), STDOUT->flush();
393
405
  } else {
@@ -421,6 +433,7 @@ undef %countLink;
421
433
  undef %created;
422
434
  undef %csvTags;
423
435
  undef %database;
436
+ undef %endDir;
424
437
  undef %filterExt;
425
438
  undef %ignore;
426
439
  undef %printFmt;
@@ -456,6 +469,7 @@ undef $fileHeader;
456
469
  undef $filtered;
457
470
  undef $fixLen;
458
471
  undef $forcePrint;
472
+ undef $ignoreHidden;
459
473
  undef $joinLists;
460
474
  undef $langOpt;
461
475
  undef $listItem;
@@ -492,6 +506,7 @@ $countGoodCr = 0;
492
506
  $countGoodWr = 0;
493
507
  $countNewDir = 0;
494
508
  $countSameWr = 0;
509
+ $csvDelim = ',';
495
510
  $csvSaveCount = 0;
496
511
  $fileTrailer = '';
497
512
  $filterFlag = 0;
@@ -554,7 +569,7 @@ if (not $preserveTime and $^O eq 'MSWin32') {
554
569
  for (;;) {
555
570
 
556
571
  # execute the command now if no more arguments or -execute is used
557
- if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d*)$/i and not $endOfOpts)) {
572
+ if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d+)?$/i and not $endOfOpts)) {
558
573
  if (@ARGV) {
559
574
  $executeID = $2; # save -execute number for "{ready}" response
560
575
  $helped = 1; # don't show help if we used -execute
@@ -813,7 +828,7 @@ for (;;) {
813
828
  next;
814
829
  }
815
830
  /^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
816
- if (/^csv(\+?=.*)?/i) {
831
+ if (/^csv(\+?=.*)?$/i) {
817
832
  my $csvFile = $1;
818
833
  # must process on 2nd pass so -f and -charset options are available
819
834
  unless ($pass) {
@@ -833,7 +848,7 @@ for (;;) {
833
848
  if ($mt->Open(\*CSVFILE, $csvFile)) {
834
849
  binmode CSVFILE;
835
850
  require Image::ExifTool::Import;
836
- $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint);
851
+ $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
837
852
  close(CSVFILE);
838
853
  } else {
839
854
  $msg = "Error opening CSV file '${csvFile}'";
@@ -844,6 +859,15 @@ for (;;) {
844
859
  $csv = 'CSV';
845
860
  next;
846
861
  }
862
+ if (/^csvdelim$/i) {
863
+ $csvDelim = shift;
864
+ defined $csvDelim or Error("Expecting argument for -csvDelim option\n"), $badCmd=1, next;
865
+ $csvDelim =~ /"/ and Error("CSV delimiter can not contain a double quote\n"), $badCmd=1, next;
866
+ my %unescape = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r", '\\' => '\\' );
867
+ $csvDelim =~ s/\\(.)/$unescape{$1}||"\\$1"/sge;
868
+ $mt->Options(CSVDelim => $csvDelim);
869
+ next;
870
+ }
847
871
  if (/^d$/ or $a eq 'dateformat') {
848
872
  my $fmt = shift;
849
873
  $fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
@@ -964,6 +988,7 @@ for (;;) {
964
988
  my $dir = shift;
965
989
  defined $dir or Error("Expecting directory name for -i option\n"), $badCmd=1, next;
966
990
  $ignore{$dir} = 1;
991
+ $dir eq 'HIDDEN' and $ignoreHidden = 1;
967
992
  next;
968
993
  }
969
994
  if (/^if(\d*)$/i) {
@@ -1841,7 +1866,7 @@ if (defined $deleteOrig) {
1841
1866
  printf($o "%5d image files %s\n", $countCopyWr, $overwriteOrig ? 'moved' : 'copied') if $countCopyWr;
1842
1867
  printf($o "%5d files weren't updated due to errors\n", $countBadWr) if $countBadWr;
1843
1868
  printf($o "%5d files weren't created due to errors\n", $countBadCr) if $countBadCr;
1844
- printf($o "%5d image files read\n", $count) if $tot>1 or ($countDir and not $totWr);
1869
+ printf($o "%5d image files read\n", $count) if ($tot+$countFailed)>1 or ($countDir and not $totWr);
1845
1870
  printf($o "%5d files could not be read\n", $countBad) if $countBad;
1846
1871
  printf($o "%5d output files created\n", scalar(keys %created)) if $textOut;
1847
1872
  printf($o "%5d output files appended\n", scalar(keys %appended)) if %appended;
@@ -1974,6 +1999,7 @@ sub GetImageInfo($$)
1974
1999
  }
1975
2000
  last unless $result;
1976
2001
  }
2002
+ undef @foundTags if $fastCondition; # ignore if we didn't get all tags
1977
2003
  }
1978
2004
  unless ($result) {
1979
2005
  $verbose and print $vout "-------- $file (failed condition)$progStr\n";
@@ -2227,7 +2253,9 @@ sub GetImageInfo($$)
2227
2253
  my $noDups = ($json or ($xml and $outFormat > 0));
2228
2254
  my $printConv = $et->Options('PrintConv');
2229
2255
  my $lastGroup = '';
2256
+ my $i = -1;
2230
2257
  TAG: foreach $tag (@foundTags) {
2258
+ ++$i; # keep track on index in @foundTags
2231
2259
  my $tagName = GetTagName($tag);
2232
2260
  my ($group, $valList);
2233
2261
  # get the value for this tag
@@ -2345,26 +2373,38 @@ TAG: foreach $tag (@foundTags) {
2345
2373
  }
2346
2374
  # save information for CSV output
2347
2375
  if ($csv) {
2348
- my $t = $group ? "$group:$tagName" : $tagName;
2349
- $t .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
2376
+ my $tn = $tagName;
2377
+ $tn .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
2378
+ my $gt = $group ? "$group:$tn" : $tn;
2350
2379
  # (tag-name case may be different if some tags don't exist
2351
2380
  # in a file, so all logic must use lower-case tag names)
2352
- my $lcTag = lc $t;
2381
+ my $lcTag = lc $gt;
2353
2382
  # override existing entry only if top priority
2354
2383
  next if defined $csvInfo{$lcTag} and $tag =~ /\(/;
2355
2384
  $csvInfo{$lcTag} = $val;
2356
2385
  if (defined $csvTags{$lcTag}) {
2357
2386
  # overwrite with actual extracted tag name
2358
2387
  # (note: can't check "if defined $val" here because -f may be used)
2359
- $csvTags{$lcTag} = $t if defined $$info{$tag};
2360
- } else {
2361
- # (don't save unextracted tag name unless -f was used)
2362
- $csvTags{$lcTag} = defined($val) ? $t : '';
2363
- if (@csvFiles == 1) {
2364
- push @csvTags, $lcTag; # save order of tags for first file
2365
- } elsif (@csvTags) {
2366
- undef @csvTags;
2367
- }
2388
+ $csvTags{$lcTag} = $gt if defined $$info{$tag};
2389
+ next;
2390
+ }
2391
+ # must check for "Unknown" group (for tags that don't exist)
2392
+ if ($group and defined $csvTags[$i] and $csvTags[$i] =~ /^(.*):$tn$/i) {
2393
+ next if $group eq 'Unknown'; # nothing more to do if we don't know tag group
2394
+ if ($1 eq 'unknown') {
2395
+ # replace unknown entry in CSV tag lookup and list
2396
+ delete $csvTags{$csvTags[$i]};
2397
+ $csvTags{$lcTag} = defined($val) ? $gt : '';
2398
+ $csvTags[$i] = $lcTag;
2399
+ next;
2400
+ }
2401
+ }
2402
+ # (don't save unextracted tag name unless -f was used)
2403
+ $csvTags{$lcTag} = defined($val) ? $gt : '';
2404
+ if (@csvFiles == 1) {
2405
+ push @csvTags, $lcTag; # save order of tags for first file
2406
+ } elsif (@csvTags) {
2407
+ undef @csvTags;
2368
2408
  }
2369
2409
  next;
2370
2410
  }
@@ -2818,6 +2858,10 @@ sub SetImageInfo($$$)
2818
2858
  # determine what our output file name should be
2819
2859
  my $newFileName = $et->GetNewValues('FileName');
2820
2860
  my $newDir = $et->GetNewValues('Directory');
2861
+ if (defined $newFileName and not length $newFileName) {
2862
+ Warn "Warning: New file name is empty - $ infile\n";
2863
+ undef $newFileName;
2864
+ }
2821
2865
  if (defined $testName) {
2822
2866
  my $err;
2823
2867
  $err = "You shouldn't write FileName or Directory with TestFile" if defined $newFileName or defined $newDir;
@@ -2896,14 +2940,19 @@ sub SetImageInfo($$$)
2896
2940
  }
2897
2941
  # quickly rename file and/or set file date if this is all we are doing
2898
2942
  if ($numSet == $numPseudo) {
2899
- my $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
2900
- my $r2 = $et->SetFileModifyDate($file);
2901
- my $r3 = $et->SetSystemTags($file);
2902
- my $r4 = 0;
2903
- $r4 = $et->SetFileName($file, $outfile) if defined $outfile;
2904
- if ($r1 > 0 or $r2 > 0 or $r3 > 0 or $r4 > 0) {
2943
+ my ($r0, $r1, $r2, $r3) = (0, 0, 0, 0);
2944
+ if (defined $outfile) {
2945
+ $r0 = $et->SetFileName($file, $outfile);
2946
+ $file = $$et{NewName} if $r0 > 0; # continue with new name if changed
2947
+ }
2948
+ unless ($r0 < 0) {
2949
+ $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
2950
+ $r2 = $et->SetFileModifyDate($file);
2951
+ $r3 = $et->SetSystemTags($file);
2952
+ }
2953
+ if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
2905
2954
  ++$countGoodWr;
2906
- } elsif ($r1 < 0 or $r2 < 0 or $r3 < 0 or $r4 < 0) {
2955
+ } elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
2907
2956
  EFile($infile);
2908
2957
  ++$countBadWr;
2909
2958
  return 0;
@@ -2912,8 +2961,7 @@ sub SetImageInfo($$$)
2912
2961
  ++$countSameWr;
2913
2962
  }
2914
2963
  if (defined $hardLink or defined $symLink or defined $testName) {
2915
- my $src = (defined $outfile and $r4 > 0) ? $outfile : $file;
2916
- DoHardLink($et, $src, $hardLink, $symLink, $testName);
2964
+ DoHardLink($et, $file, $hardLink, $symLink, $testName);
2917
2965
  }
2918
2966
  return 1;
2919
2967
  }
@@ -3290,7 +3338,7 @@ sub FormatCSV($)
3290
3338
  # the -b option is used to encode as Base64. It is unclear whether or not this
3291
3339
  # is valid CSV, but some readers may not like it. (If this becomes a problem,
3292
3340
  # in the future values may need to be truncated at the first NULL character.)
3293
- $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[,\n\r]/;
3341
+ $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/;
3294
3342
  return $val;
3295
3343
  }
3296
3344
 
@@ -3303,9 +3351,9 @@ sub PrintCSV()
3303
3351
  @csvTags or @csvTags = sort keys %csvTags;
3304
3352
  # make a list of tags actually found
3305
3353
  foreach $lcTag (@csvTags) {
3306
- push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
3354
+ push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
3307
3355
  }
3308
- print join(',', 'SourceFile', @tags), "\n";
3356
+ print join($csvDelim, 'SourceFile', @tags), "\n";
3309
3357
  my $empty = defined($forcePrint) ? $forcePrint : '';
3310
3358
  foreach $file (@csvFiles) {
3311
3359
  my @vals = (FormatCSV($file)); # start with full file name
@@ -3316,7 +3364,7 @@ sub PrintCSV()
3316
3364
  defined $val or push(@vals,$empty), next;
3317
3365
  push @vals, FormatCSV($val);
3318
3366
  }
3319
- print join(',', @vals), "\n";
3367
+ print join($csvDelim, @vals), "\n";
3320
3368
  }
3321
3369
  }
3322
3370
 
@@ -3552,8 +3600,18 @@ sub ProcessFiles($;$)
3552
3600
  if ($list) {
3553
3601
  push(@$list, $file);
3554
3602
  } else {
3603
+ if (%endDir) {
3604
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3605
+ next if $endDir{$d};
3606
+ }
3555
3607
  GetImageInfo($et, $file);
3556
3608
  $end and Warn("End called - $file\n");
3609
+ if ($endDir) {
3610
+ Warn("EndDir called - $file\n");
3611
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3612
+ $endDir{$d} = 1;
3613
+ undef $endDir;
3614
+ }
3557
3615
  }
3558
3616
  }
3559
3617
  $et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
@@ -3639,6 +3697,7 @@ sub ScanDir($$;$)
3639
3697
  next;
3640
3698
  }
3641
3699
  next if $endThisDir;
3700
+ next if $ignoreHidden and $file =~ /^\./; # ignore hidden files if specified
3642
3701
  # apply rules from -ext options
3643
3702
  my $accepted;
3644
3703
  if ($filterFlag) {
@@ -3683,8 +3742,9 @@ sub ScanDir($$;$)
3683
3742
  if ($endDir) {
3684
3743
  $path =~ s(/$)();
3685
3744
  Warn("EndDir called - $path\n");
3686
- undef $endDir;
3745
+ $endDir{$path} = 1;
3687
3746
  $endThisDir = 1;
3747
+ undef $endDir;
3688
3748
  }
3689
3749
  }
3690
3750
  }
@@ -4478,6 +4538,7 @@ L<Input-output text formatting|/Input-output text formatting>
4478
4538
  -c FMT (-coordFormat) Set format for GPS coordinates
4479
4539
  -charset [[TYPE=]CHARSET] Specify encoding for special characters
4480
4540
  -csv[[+]=CSVFILE] Export/import tags in CSV format
4541
+ -csvDelim STR Set delimiter for CSV file
4481
4542
  -d FMT (-dateFormat) Set format for date/time values
4482
4543
  -D (-decimal) Show tag ID numbers in decimal
4483
4544
  -E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
@@ -4997,8 +5058,11 @@ tag names (with optional group names) for each column of the file, and
4997
5058
  values must be separated by commas. A special "SourceFile" column specifies
4998
5059
  the files associated with each row of information (and a SourceFile of "*"
4999
5060
  may be used to define default tags to be imported for all files which are
5000
- combined with any tags specified for the specific SourceFile processed).
5001
- The following examples demonstrate basic use of this option:
5061
+ combined with any tags specified for the specific SourceFile processed). The
5062
+ B<-csvDelim> option may be used to change the input/output field delimiter
5063
+ if something other than a comma is required.
5064
+
5065
+ The following examples demonstrate basic use of the B<-csv> option:
5002
5066
 
5003
5067
  # generate CSV file with common tags from all images in a directory
5004
5068
  exiftool -common -csv dir > out.csv
@@ -5045,6 +5109,13 @@ option. When processing a large number of files, it is recommended to
5045
5109
  either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
5046
5110
  generate a fixed-column CSV file instead of using the B<-csv> option.
5047
5111
 
5112
+ =item B<-csvDelim> I<STR>
5113
+
5114
+ Set the delimiter for separating CSV entries for CSV file input/output via
5115
+ the B<-csv> option. I<STR> may contain "\t", "\n", "\r" and "\\" to
5116
+ represent TAB, LF, CR and '\' respectively. A double quote is not allowed
5117
+ in the delimiter. Default is ','.
5118
+
5048
5119
  =item B<-d> I<FMT> (B<-dateFormat>)
5049
5120
 
5050
5121
  Set the format for date/time tag values. The I<FMT> string may contain
@@ -5296,7 +5367,7 @@ with this command:
5296
5367
 
5297
5368
  produces output like this:
5298
5369
 
5299
- -- Generated by ExifTool 12.09 --
5370
+ -- Generated by ExifTool 12.14 --
5300
5371
  File: a.jpg - 2003:10:31 15:44:19
5301
5372
  (f/5.6, 1/60s, ISO 100)
5302
5373
  File: b.jpg - 2006:05:23 11:57:38
@@ -5704,7 +5775,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
5704
5775
  metadata from the file, and returns only pseudo System tags, but still reads
5705
5776
  the file header to obtain an educated guess at FileType. B<-fast4> doesn't
5706
5777
  even read the file header, and returns only System tags and a FileType based
5707
- on the file extension. Has no effect when writing.
5778
+ on the file extension. B<-fast5> also disables generation of the Composite
5779
+ tags (like B<-e>). Has no effect when writing.
5708
5780
 
5709
5781
  Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
5710
5782
  condition, or when ordering files with the B<-fileOrder> option. See the
@@ -5729,7 +5801,9 @@ involves an additional processing pass of each file, but this impact may be
5729
5801
  reduced by specifying a I<NUM> for the B<-fast> level used during the
5730
5802
  metadata-extraction phase. For example, B<-fileOrder4> may be used if
5731
5803
  I<TAG> is a pseudo System tag. If multiple B<-fileOrder> options are used,
5732
- the extraction is done at the lowest B<-fast> level.
5804
+ the extraction is done at the lowest B<-fast> level. Note that files are
5805
+ sorted across directory boundaries if multiple input directories are
5806
+ specified.
5733
5807
 
5734
5808
  =item B<-i> I<DIR> (B<-ignore>)
5735
5809
 
@@ -5738,7 +5812,9 @@ name, or a full path. If a full path is specified, it must match the
5738
5812
  Directory tag exactly to be ignored. Use multiple B<-i> options to ignore
5739
5813
  more than one directory name. A special I<DIR> value of C<SYMLINKS> (case
5740
5814
  sensitive) may be specified to ignore symbolic links when the B<-r> option
5741
- is used.
5815
+ is used. As well, a value of C<HIDDEN> (case sensitive) may be used to
5816
+ ignore files with names that start with a "." (ie. hidden files on Unix
5817
+ systems) when scanning a directory.
5742
5818
 
5743
5819
  =item B<-if>[I<NUM>] I<EXPR>
5744
5820
 
@@ -5770,7 +5846,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
5770
5846
  executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
5771
5847
  B<-fast> option documentation for details). Without I<NUM>, only one
5772
5848
  processing pass is done at the level specified by the B<-fast> option. For
5773
- example, using B<-if4> is possible if I<EXPR> uses only pseudo System tags,
5849
+ example, using B<-if5> is possible if I<EXPR> uses only pseudo System tags,
5774
5850
  and may significantly speed processing if enough files fail the condition.
5775
5851
 
5776
5852
  The expression has access to the current ExifTool object through C<$self>,
@@ -5779,7 +5855,8 @@ of the file processing. Both functions have a return value of 1. Case is
5779
5855
  significant for function names.
5780
5856
 
5781
5857
  End() - end processing after this file
5782
- EndDir() - end processing of files in this directory
5858
+ EndDir() - end processing of files in this directory (not
5859
+ compatible with the B<-fileOrder> option)
5783
5860
 
5784
5861
  Notes:
5785
5862
 
@@ -6241,7 +6318,9 @@ about the configuration file syntax.
6241
6318
  Echo I<TEXT> to stdout (B<-echo> or B<-echo1>) or stderr (B<-echo2>). Text
6242
6319
  is output as the command line is parsed, before the processing of any input
6243
6320
  files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
6244
- respectively) after processing is complete.
6321
+ respectively) after processing is complete. For B<-echo3> and B<-echo4>,
6322
+ "${status}" may be used in the I<TEXT> string to represent the numerical
6323
+ exit status of the command (see L</EXIT STATUS>).
6245
6324
 
6246
6325
  =item B<-efile>[I<NUM>][!] I<ERRFILE>
6247
6326
 
@@ -6262,7 +6341,8 @@ commands were executed as separate command lines (with the exception of the
6262
6341
  B<-config> and B<-use> options which remain in effect for subsequent
6263
6342
  commands). Allows multiple commands to be executed from a single command
6264
6343
  line. I<NUM> is an optional number that is echoed in the "{ready}" message
6265
- when using the B<-stay_open> feature.
6344
+ when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
6345
+ option no longer suppresses the output "{readyNUM}" message.
6266
6346
 
6267
6347
  =item B<-srcfile> I<FMT>
6268
6348
 
@@ -6293,10 +6373,10 @@ name and directory.
6293
6373
 
6294
6374
  =item B<-stay_open> I<FLAG>
6295
6375
 
6296
- If I<FLAG> is C<1> or C<True>, causes exiftool keep reading from the B<-@>
6297
- I<ARGFILE> even after reaching the end of file. This feature allows calling
6298
- applications to pre-load exiftool, thus avoiding the overhead of loading
6299
- exiftool for each command. The procedure is as follows:
6376
+ If I<FLAG> is C<1> or C<True> (case insensitive), causes exiftool keep
6377
+ reading from the B<-@> I<ARGFILE> even after reaching the end of file. This
6378
+ feature allows calling applications to pre-load exiftool, thus avoiding the
6379
+ overhead of loading exiftool for each command. The procedure is as follows:
6300
6380
 
6301
6381
  1) Execute C<exiftool -stay_open True -@ I<ARGFILE>>, where I<ARGFILE> is the
6302
6382
  name of an existing (possibly empty) argument file or C<-> to pipe arguments
@@ -6312,12 +6392,16 @@ received up to this point, send a "{ready}" message to stdout when done
6312
6392
  (unless the B<-q> or B<-T> option is used), and continue trying to read
6313
6393
  arguments for the next command from I<ARGFILE>. To aid in command/response
6314
6394
  synchronization, any number appended to the C<-execute> option is echoed in
6315
- the "{ready}" message. For example, C<-execute613> results in "{ready613}".
6395
+ the "{ready}" message. For example, C<-execute613> results in "{ready613}".
6396
+ When this number is added, B<-q> no longer suppresses the "{ready}" message.
6397
+ (Also, see the B<-echo3> and B<-echo4> options for additional ways to pass
6398
+ signals back to your application.)
6316
6399
 
6317
6400
  4) Repeat steps 2 and 3 for each command.
6318
6401
 
6319
- 5) Write C<-stay_open\nFalse\n> to I<ARGFILE> when done. This will cause
6320
- exiftool to process any remaining command-line arguments then exit normally.
6402
+ 5) Write C<-stay_open\nFalse\n> (or C<-stay_open\n0\n>) to I<ARGFILE> when
6403
+ done. This will cause exiftool to process any remaining command-line
6404
+ arguments then exit normally.
6321
6405
 
6322
6406
  The input I<ARGFILE> may be changed at any time before step 5 above by
6323
6407
  writing the following lines to the currently open I<ARGFILE>:
@@ -6327,7 +6411,7 @@ writing the following lines to the currently open I<ARGFILE>:
6327
6411
  -@
6328
6412
  NEWARGFILE
6329
6413
 
6330
- This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
6414
+ This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
6331
6415
  (Without the B<-stay_open> here, exiftool would have returned to reading
6332
6416
  arguments from I<ARGFILE> after reaching the end of I<NEWARGFILE>.)
6333
6417
 
@@ -6345,10 +6429,11 @@ an interface to the API UserParam option (see the
6345
6429
  L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
6346
6430
  provides a method to access user-defined parameters in arguments to the
6347
6431
  B<-if> and B<-p> options as if they were any other tag. Appending a hash
6348
- tag (C<#>) to I<PARAM> also causes the parameter to be extracted as a normal
6349
- tag (in the UserParam group). Similar to the B<-api> option, the parameter
6350
- value is set to 1 if I<=VAL> is omitted, undef if just I<VAL> is omitted
6351
- with C<=>, or an empty string if I<VAL> is omitted with C<^=>.
6432
+ tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also causes the
6433
+ parameter to be extracted as a normal tag in the UserParam group. Similar
6434
+ to the B<-api> option, the parameter value is set to 1 if I<=VAL> is
6435
+ omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
6436
+ I<VAL> is omitted with C<^=>.
6352
6437
 
6353
6438
  exiftool -p '$test from $filename' -userparam test=Hello FILE
6354
6439
 
@@ -6418,9 +6503,9 @@ For example, the following command may be used to remove duplicate Keywords:
6418
6503
  The B<-sep> option is necessary to split the string back into individual
6419
6504
  list items when writing to a list-type tag.
6420
6505
 
6421
- An optional flag argument may be set to 1 to cause C<NoDups> to return undef
6422
- if no duplicates existed, thus preventing the file from being rewritten
6423
- unnecessarily:
6506
+ An optional flag argument may be set to 1 to cause C<NoDups> to set C<$_> to
6507
+ undef if no duplicates existed, thus preventing the file from being
6508
+ rewritten unnecessarily:
6424
6509
 
6425
6510
  exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
6426
6511
 
@@ -7058,6 +7143,13 @@ flexibility of ExifTool.)
7058
7143
 
7059
7144
  =back
7060
7145
 
7146
+ =head1 INTERRUPTING EXIFTOOL
7147
+
7148
+ Interrupting exiftool with a CTRL-C or SIGINT will not result in partially
7149
+ written files or temporary files remaining on the hard disk. The exiftool
7150
+ application traps SIGINT and defers it until the end of critical processes
7151
+ if necessary, then does a proper cleanup before exiting.
7152
+
7061
7153
  =head1 EXIT STATUS
7062
7154
 
7063
7155
  The exiftool application exits with a status of 0 on success, or 1 if an
@@ -7066,7 +7158,7 @@ the commands if B<-execute> was used).
7066
7158
 
7067
7159
  =head1 AUTHOR
7068
7160
 
7069
- Copyright 2003-2020, Phil Harvey
7161
+ Copyright 2003-2021, Phil Harvey
7070
7162
 
7071
7163
  This is free software; you can redistribute it and/or modify it under the
7072
7164
  same terms as Perl itself.