exiftool_vendored 12.10.0 → 12.15.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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +71 -2
  3. data/bin/MANIFEST +5 -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 +130 -55
  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 +46 -10
  11. data/bin/lib/Image/ExifTool.pod +14 -11
  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 +15 -12
  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 +28 -2
  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 +24 -2
  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 +1 -1
  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 +314 -35
  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/NikonSettings.pm +2013 -0
  118. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  119. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  120. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  121. data/bin/lib/Image/ExifTool/Olympus.pm +4 -2
  122. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  123. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  124. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  125. data/bin/lib/Image/ExifTool/PDF.pm +10 -2
  126. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  127. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  128. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  129. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  130. data/bin/lib/Image/ExifTool/PNG.pm +12 -4
  131. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  132. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  133. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  134. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  135. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  136. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  137. data/bin/lib/Image/ExifTool/Pentax.pm +12 -4
  138. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  140. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  141. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  143. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  144. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  145. data/bin/lib/Image/ExifTool/QuickTime.pm +28 -19
  146. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +25 -4
  147. data/bin/lib/Image/ExifTool/RIFF.pm +83 -5
  148. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  149. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  150. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  151. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  152. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  153. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  155. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  156. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  157. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  158. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  159. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  160. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  161. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  162. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Sony.pm +8 -2
  164. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Stim.pm +3 -3
  166. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  167. data/bin/lib/Image/ExifTool/TagLookup.pm +3943 -3807
  168. data/bin/lib/Image/ExifTool/TagNames.pod +313 -21
  169. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  170. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  171. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  172. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  173. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  174. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  175. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  176. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  177. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  178. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  179. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  180. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  181. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  182. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  183. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  184. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -4
  185. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  186. data/bin/lib/Image/ExifTool/Writer.pl +28 -14
  187. data/bin/lib/Image/ExifTool/XMP.pm +17 -8
  188. data/bin/lib/Image/ExifTool/XMP2.pl +5 -1
  189. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  190. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  191. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  192. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  193. data/bin/perl-Image-ExifTool.spec +1 -1
  194. data/lib/exiftool_vendored/version.rb +1 -1
  195. metadata +9 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf0281354d058359e076603ce713b412cd838a4c5ffe326534275ec858cb11a1
4
- data.tar.gz: a556f35232b6cca374d9b118d8b8b8ac9bf4e09e5714fae9c1f3c216ca658b20
3
+ metadata.gz: e30c22a774925019702c59a5aa788607b27a5b217824d47ec66be50e5a10e8f1
4
+ data.tar.gz: 5c54290d58d097af3d8950f187b940e6a930d1d9502c38252620b57c8ff64067
5
5
  SHA512:
6
- metadata.gz: ec70f7062aaee4ed619bb00bf91fa3d23cee45ebb15b1c3b3c383ee8867ea29b63b01e199a49dd2ef59f727eb8a156015f817ff31271c81ed69d3d560ea90a78
7
- data.tar.gz: 33512db4034b62eeddecc4b3b8ec5c370d089cc9526ec1e37989bf26fef200ffe563b3c42e4dd3395be867a81e2bd2790b816610d3249a70d49828de1fdecb9e
6
+ metadata.gz: '07965ed32bfb30fe68f862fc2e1e8c1a59094182b664d4cfbfdc9fe0c5e4db16b08733c0ff42c093c1dbd289148c24f5ed51e40b99b582701441cc4bf64b8061'
7
+ data.tar.gz: 5ab6c978e3d9066a288173d0efd9a786245fabe9114446b77115032153fc64252dd05b1b47d4608e94b0ded7bf996fdb02706136036ede870aa2c779796b6d63
@@ -4,8 +4,77 @@ 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 12.00. (Other versions are
8
- considered development releases, and are not uploaded to CPAN.)
7
+ Note: The most recent production release is Version 12.15. (Other versions are
8
+ considered development releases, and are not uploaded to MetaCPAN.)
9
+
10
+ Jan. 18, 2021 - Version 12.15 (production release)
11
+
12
+ - Added a couple of new Sony LensType values (thanks LibRaw and Jos Roost)
13
+ - Added a new Nikon FlashMode value (thanks Mike)
14
+ - Decode NikonSettings (thanks Warren Hatch)
15
+ - Decode thermal information from DJI RJPEG images
16
+ - Fixed extra newline in -echo3 and -echo4 outputs added in version 12.10
17
+ - Fixed out-of-memory problem when writing some very large PNG files under
18
+ Windows
19
+
20
+ Jan. 6, 2021 - Version 12.14
21
+
22
+ - Added support for 2 more types of timed GPS in video files (that makes 49
23
+ different formats now supported)
24
+ - Added validity check for PDF trailer dictionary Size
25
+ - Added a new Pentax LensType
26
+ - Extract metadata from Jpeg2000 Association box
27
+ - Changed -g:XX:YY and -G:XX:YY options to show empty strings for non-existent
28
+ groups
29
+ - Patched to issue warning and avoid writing date/time values with a zero
30
+ month or day number
31
+ - Patched to avoid runtime warnings if trying to set FileName to an empty
32
+ string
33
+ - Fixed issue that could cause GPS test number 12 to fail on some systems
34
+ - Fixed problem extracting XML as a block from Jpeg2000 images, and extract
35
+ XML tags in the XML group instead of XMP
36
+
37
+ Dec. 24, 2020 - Version 12.13
38
+
39
+ - Added -i HIDDEN option to ignore files with names that start with "."
40
+ - Added a few new Nikon ShutterMode values (thanks Jan Skoda)
41
+ - Added ability to write Google GCamera MicroVideo XMP tags
42
+ - Add time zone automatically to most string-based QuickTime date/time tags
43
+ when writing unless the PrintConv option is disabled
44
+ - Decode a new Sony tag (thanks LibRaw)
45
+ - Changed behaviour when writing only pseudo tags to return an error and avoid
46
+ writing any other tags if writing FileName fails
47
+ - Print "X image files read" message even if only 1 file is read when at least
48
+ one other file has failed the -if condition
49
+
50
+ Dec. 4, 2020 - Version 12.12
51
+
52
+ - Added ability to geotag from DJI CSV log files
53
+ - Added a new CanonModelID
54
+ - Added a couple of new Sony LensType values (thanks LibRaw)
55
+ - Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\"
56
+ - Unescape "\b" and "\f" in imported JSON values
57
+ - Fixed bug introduced in 12.10 which generated a "Not an integer" warning
58
+ when attempting to shift some QuickTime date/time tags
59
+ - Fixed shared-write permission problem with -@ argfile when using -stay_open
60
+ and a filename containing special characters on Windows
61
+
62
+ Nov. 27, 2020 - Version 12.11
63
+
64
+ - Added -csvDelim option
65
+ - Added new Canon and Olympus LensType values (thanks LibRaw)
66
+ - Added a warning if ICC_Profile is deleted from an image (github issue #63)
67
+ - EndDir() function for -if option now works when -fileOrder is used
68
+ - Changed FileSize conversion to use binary prefixes since that is how the
69
+ conversion is currently done (eg. MiB instead of MB)
70
+ - Patched -csv option so columns aren't resorted when using -G option and one
71
+ of the tags is missing from a file
72
+ - Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
73
+ to MP4 videos
74
+ - Fixed problem where the tags available in a -p format string were limited to
75
+ the same as the -if[NUM] option when NUM was specified
76
+ - Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
77
+ models
9
78
 
10
79
  Nov. 12, 2020 - Version 12.10
11
80
 
@@ -115,6 +115,7 @@ html/TagNames/Motorola.html
115
115
  html/TagNames/Nikon.html
116
116
  html/TagNames/NikonCapture.html
117
117
  html/TagNames/NikonCustom.html
118
+ html/TagNames/NikonSettings.html
118
119
  html/TagNames/Nintendo.html
119
120
  html/TagNames/OOXML.html
120
121
  html/TagNames/Ogg.html
@@ -337,6 +338,7 @@ lib/Image/ExifTool/Motorola.pm
337
338
  lib/Image/ExifTool/Nikon.pm
338
339
  lib/Image/ExifTool/NikonCapture.pm
339
340
  lib/Image/ExifTool/NikonCustom.pm
341
+ lib/Image/ExifTool/NikonSettings.pm
340
342
  lib/Image/ExifTool/Nintendo.pm
341
343
  lib/Image/ExifTool/OOXML.pm
342
344
  lib/Image/ExifTool/Ogg.pm
@@ -567,6 +569,7 @@ t/GeoTiff_4.out
567
569
  t/Geotag.t
568
570
  t/Geotag_10.out
569
571
  t/Geotag_11.out
572
+ t/Geotag_12.out
570
573
  t/Geotag_2.out
571
574
  t/Geotag_3.out
572
575
  t/Geotag_5.out
@@ -602,6 +605,7 @@ t/Jpeg2000.t
602
605
  t/Jpeg2000_2.out
603
606
  t/Jpeg2000_3.out
604
607
  t/Jpeg2000_4.out
608
+ t/Jpeg2000_5.out
605
609
  t/Kodak.t
606
610
  t/Kodak_2.out
607
611
  t/Kodak_3.out
@@ -986,6 +990,7 @@ t/images/Geotag.log
986
990
  t/images/Geotag.xml
987
991
  t/images/Geotag2.log
988
992
  t/images/Geotag3.log
993
+ t/images/Geotag_DJI_2020-12-02_[07-50-31].csv
989
994
  t/images/GoPro.jpg
990
995
  t/images/HTML.html
991
996
  t/images/ICC_Profile.icc
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.10"
50
+ "version" : "12.15"
51
51
  }
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.10
31
+ version: 12.15
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.10.tar.gz | tar -xf -
110
- cd Image-ExifTool-12.10
109
+ gzip -dc Image-ExifTool-12.15.tar.gz | tar -xf -
110
+ cd Image-ExifTool-12.15
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.10';
13
+ my $version = '12.15';
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,
@@ -367,12 +371,12 @@ if (grep /^-common_args$/i, @ARGV) {
367
371
  Command: for (;;) {
368
372
 
369
373
  if (@echo3) {
370
- my $str = join "\n", @echo3, "\n";
374
+ my $str = join("\n", @echo3) . "\n";
371
375
  $str =~ s/\$\{status\}/$rtnVal/ig;
372
376
  print STDOUT $str;
373
377
  }
374
378
  if (@echo4) {
375
- my $str = join "\n", @echo4, "\n";
379
+ my $str = join("\n", @echo4) . "\n";
376
380
  $str =~ s/\$\{status\}/$rtnVal/ig;
377
381
  print STDERR $str;
378
382
  }
@@ -429,6 +433,7 @@ undef %countLink;
429
433
  undef %created;
430
434
  undef %csvTags;
431
435
  undef %database;
436
+ undef %endDir;
432
437
  undef %filterExt;
433
438
  undef %ignore;
434
439
  undef %printFmt;
@@ -464,6 +469,7 @@ undef $fileHeader;
464
469
  undef $filtered;
465
470
  undef $fixLen;
466
471
  undef $forcePrint;
472
+ undef $ignoreHidden;
467
473
  undef $joinLists;
468
474
  undef $langOpt;
469
475
  undef $listItem;
@@ -500,6 +506,7 @@ $countGoodCr = 0;
500
506
  $countGoodWr = 0;
501
507
  $countNewDir = 0;
502
508
  $countSameWr = 0;
509
+ $csvDelim = ',';
503
510
  $csvSaveCount = 0;
504
511
  $fileTrailer = '';
505
512
  $filterFlag = 0;
@@ -821,7 +828,7 @@ for (;;) {
821
828
  next;
822
829
  }
823
830
  /^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
824
- if (/^csv(\+?=.*)?/i) {
831
+ if (/^csv(\+?=.*)?$/i) {
825
832
  my $csvFile = $1;
826
833
  # must process on 2nd pass so -f and -charset options are available
827
834
  unless ($pass) {
@@ -841,7 +848,7 @@ for (;;) {
841
848
  if ($mt->Open(\*CSVFILE, $csvFile)) {
842
849
  binmode CSVFILE;
843
850
  require Image::ExifTool::Import;
844
- $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint);
851
+ $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
845
852
  close(CSVFILE);
846
853
  } else {
847
854
  $msg = "Error opening CSV file '${csvFile}'";
@@ -852,6 +859,15 @@ for (;;) {
852
859
  $csv = 'CSV';
853
860
  next;
854
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
+ }
855
871
  if (/^d$/ or $a eq 'dateformat') {
856
872
  my $fmt = shift;
857
873
  $fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
@@ -972,6 +988,7 @@ for (;;) {
972
988
  my $dir = shift;
973
989
  defined $dir or Error("Expecting directory name for -i option\n"), $badCmd=1, next;
974
990
  $ignore{$dir} = 1;
991
+ $dir eq 'HIDDEN' and $ignoreHidden = 1;
975
992
  next;
976
993
  }
977
994
  if (/^if(\d*)$/i) {
@@ -1849,7 +1866,7 @@ if (defined $deleteOrig) {
1849
1866
  printf($o "%5d image files %s\n", $countCopyWr, $overwriteOrig ? 'moved' : 'copied') if $countCopyWr;
1850
1867
  printf($o "%5d files weren't updated due to errors\n", $countBadWr) if $countBadWr;
1851
1868
  printf($o "%5d files weren't created due to errors\n", $countBadCr) if $countBadCr;
1852
- 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);
1853
1870
  printf($o "%5d files could not be read\n", $countBad) if $countBad;
1854
1871
  printf($o "%5d output files created\n", scalar(keys %created)) if $textOut;
1855
1872
  printf($o "%5d output files appended\n", scalar(keys %appended)) if %appended;
@@ -1982,6 +1999,7 @@ sub GetImageInfo($$)
1982
1999
  }
1983
2000
  last unless $result;
1984
2001
  }
2002
+ undef @foundTags if $fastCondition; # ignore if we didn't get all tags
1985
2003
  }
1986
2004
  unless ($result) {
1987
2005
  $verbose and print $vout "-------- $file (failed condition)$progStr\n";
@@ -2235,7 +2253,9 @@ sub GetImageInfo($$)
2235
2253
  my $noDups = ($json or ($xml and $outFormat > 0));
2236
2254
  my $printConv = $et->Options('PrintConv');
2237
2255
  my $lastGroup = '';
2256
+ my $i = -1;
2238
2257
  TAG: foreach $tag (@foundTags) {
2258
+ ++$i; # keep track on index in @foundTags
2239
2259
  my $tagName = GetTagName($tag);
2240
2260
  my ($group, $valList);
2241
2261
  # get the value for this tag
@@ -2353,26 +2373,38 @@ TAG: foreach $tag (@foundTags) {
2353
2373
  }
2354
2374
  # save information for CSV output
2355
2375
  if ($csv) {
2356
- my $t = $group ? "$group:$tagName" : $tagName;
2357
- $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;
2358
2379
  # (tag-name case may be different if some tags don't exist
2359
2380
  # in a file, so all logic must use lower-case tag names)
2360
- my $lcTag = lc $t;
2381
+ my $lcTag = lc $gt;
2361
2382
  # override existing entry only if top priority
2362
2383
  next if defined $csvInfo{$lcTag} and $tag =~ /\(/;
2363
2384
  $csvInfo{$lcTag} = $val;
2364
2385
  if (defined $csvTags{$lcTag}) {
2365
2386
  # overwrite with actual extracted tag name
2366
2387
  # (note: can't check "if defined $val" here because -f may be used)
2367
- $csvTags{$lcTag} = $t if defined $$info{$tag};
2368
- } else {
2369
- # (don't save unextracted tag name unless -f was used)
2370
- $csvTags{$lcTag} = defined($val) ? $t : '';
2371
- if (@csvFiles == 1) {
2372
- push @csvTags, $lcTag; # save order of tags for first file
2373
- } elsif (@csvTags) {
2374
- undef @csvTags;
2375
- }
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;
2376
2408
  }
2377
2409
  next;
2378
2410
  }
@@ -2826,6 +2858,10 @@ sub SetImageInfo($$$)
2826
2858
  # determine what our output file name should be
2827
2859
  my $newFileName = $et->GetNewValues('FileName');
2828
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
+ }
2829
2865
  if (defined $testName) {
2830
2866
  my $err;
2831
2867
  $err = "You shouldn't write FileName or Directory with TestFile" if defined $newFileName or defined $newDir;
@@ -2904,14 +2940,19 @@ sub SetImageInfo($$$)
2904
2940
  }
2905
2941
  # quickly rename file and/or set file date if this is all we are doing
2906
2942
  if ($numSet == $numPseudo) {
2907
- my $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
2908
- my $r2 = $et->SetFileModifyDate($file);
2909
- my $r3 = $et->SetSystemTags($file);
2910
- my $r4 = 0;
2911
- $r4 = $et->SetFileName($file, $outfile) if defined $outfile;
2912
- 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) {
2913
2954
  ++$countGoodWr;
2914
- } 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) {
2915
2956
  EFile($infile);
2916
2957
  ++$countBadWr;
2917
2958
  return 0;
@@ -2920,8 +2961,7 @@ sub SetImageInfo($$$)
2920
2961
  ++$countSameWr;
2921
2962
  }
2922
2963
  if (defined $hardLink or defined $symLink or defined $testName) {
2923
- my $src = (defined $outfile and $r4 > 0) ? $outfile : $file;
2924
- DoHardLink($et, $src, $hardLink, $symLink, $testName);
2964
+ DoHardLink($et, $file, $hardLink, $symLink, $testName);
2925
2965
  }
2926
2966
  return 1;
2927
2967
  }
@@ -3298,7 +3338,7 @@ sub FormatCSV($)
3298
3338
  # the -b option is used to encode as Base64. It is unclear whether or not this
3299
3339
  # is valid CSV, but some readers may not like it. (If this becomes a problem,
3300
3340
  # in the future values may need to be truncated at the first NULL character.)
3301
- $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/;
3302
3342
  return $val;
3303
3343
  }
3304
3344
 
@@ -3311,9 +3351,9 @@ sub PrintCSV()
3311
3351
  @csvTags or @csvTags = sort keys %csvTags;
3312
3352
  # make a list of tags actually found
3313
3353
  foreach $lcTag (@csvTags) {
3314
- push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
3354
+ push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
3315
3355
  }
3316
- print join(',', 'SourceFile', @tags), "\n";
3356
+ print join($csvDelim, 'SourceFile', @tags), "\n";
3317
3357
  my $empty = defined($forcePrint) ? $forcePrint : '';
3318
3358
  foreach $file (@csvFiles) {
3319
3359
  my @vals = (FormatCSV($file)); # start with full file name
@@ -3324,7 +3364,7 @@ sub PrintCSV()
3324
3364
  defined $val or push(@vals,$empty), next;
3325
3365
  push @vals, FormatCSV($val);
3326
3366
  }
3327
- print join(',', @vals), "\n";
3367
+ print join($csvDelim, @vals), "\n";
3328
3368
  }
3329
3369
  }
3330
3370
 
@@ -3560,8 +3600,18 @@ sub ProcessFiles($;$)
3560
3600
  if ($list) {
3561
3601
  push(@$list, $file);
3562
3602
  } else {
3603
+ if (%endDir) {
3604
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3605
+ next if $endDir{$d};
3606
+ }
3563
3607
  GetImageInfo($et, $file);
3564
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
+ }
3565
3615
  }
3566
3616
  }
3567
3617
  $et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
@@ -3647,6 +3697,7 @@ sub ScanDir($$;$)
3647
3697
  next;
3648
3698
  }
3649
3699
  next if $endThisDir;
3700
+ next if $ignoreHidden and $file =~ /^\./; # ignore hidden files if specified
3650
3701
  # apply rules from -ext options
3651
3702
  my $accepted;
3652
3703
  if ($filterFlag) {
@@ -3691,8 +3742,9 @@ sub ScanDir($$;$)
3691
3742
  if ($endDir) {
3692
3743
  $path =~ s(/$)();
3693
3744
  Warn("EndDir called - $path\n");
3694
- undef $endDir;
3745
+ $endDir{$path} = 1;
3695
3746
  $endThisDir = 1;
3747
+ undef $endDir;
3696
3748
  }
3697
3749
  }
3698
3750
  }
@@ -4486,6 +4538,7 @@ L<Input-output text formatting|/Input-output text formatting>
4486
4538
  -c FMT (-coordFormat) Set format for GPS coordinates
4487
4539
  -charset [[TYPE=]CHARSET] Specify encoding for special characters
4488
4540
  -csv[[+]=CSVFILE] Export/import tags in CSV format
4541
+ -csvDelim STR Set delimiter for CSV file
4489
4542
  -d FMT (-dateFormat) Set format for date/time values
4490
4543
  -D (-decimal) Show tag ID numbers in decimal
4491
4544
  -E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
@@ -5005,8 +5058,11 @@ tag names (with optional group names) for each column of the file, and
5005
5058
  values must be separated by commas. A special "SourceFile" column specifies
5006
5059
  the files associated with each row of information (and a SourceFile of "*"
5007
5060
  may be used to define default tags to be imported for all files which are
5008
- combined with any tags specified for the specific SourceFile processed).
5009
- 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:
5010
5066
 
5011
5067
  # generate CSV file with common tags from all images in a directory
5012
5068
  exiftool -common -csv dir > out.csv
@@ -5053,6 +5109,13 @@ option. When processing a large number of files, it is recommended to
5053
5109
  either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
5054
5110
  generate a fixed-column CSV file instead of using the B<-csv> option.
5055
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
+
5056
5119
  =item B<-d> I<FMT> (B<-dateFormat>)
5057
5120
 
5058
5121
  Set the format for date/time tag values. The I<FMT> string may contain
@@ -5304,7 +5367,7 @@ with this command:
5304
5367
 
5305
5368
  produces output like this:
5306
5369
 
5307
- -- Generated by ExifTool 12.10 --
5370
+ -- Generated by ExifTool 12.15 --
5308
5371
  File: a.jpg - 2003:10:31 15:44:19
5309
5372
  (f/5.6, 1/60s, ISO 100)
5310
5373
  File: b.jpg - 2006:05:23 11:57:38
@@ -5712,7 +5775,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
5712
5775
  metadata from the file, and returns only pseudo System tags, but still reads
5713
5776
  the file header to obtain an educated guess at FileType. B<-fast4> doesn't
5714
5777
  even read the file header, and returns only System tags and a FileType based
5715
- 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.
5716
5780
 
5717
5781
  Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
5718
5782
  condition, or when ordering files with the B<-fileOrder> option. See the
@@ -5748,7 +5812,9 @@ name, or a full path. If a full path is specified, it must match the
5748
5812
  Directory tag exactly to be ignored. Use multiple B<-i> options to ignore
5749
5813
  more than one directory name. A special I<DIR> value of C<SYMLINKS> (case
5750
5814
  sensitive) may be specified to ignore symbolic links when the B<-r> option
5751
- 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.
5752
5818
 
5753
5819
  =item B<-if>[I<NUM>] I<EXPR>
5754
5820
 
@@ -5780,7 +5846,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
5780
5846
  executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
5781
5847
  B<-fast> option documentation for details). Without I<NUM>, only one
5782
5848
  processing pass is done at the level specified by the B<-fast> option. For
5783
- 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,
5784
5850
  and may significantly speed processing if enough files fail the condition.
5785
5851
 
5786
5852
  The expression has access to the current ExifTool object through C<$self>,
@@ -6307,10 +6373,10 @@ name and directory.
6307
6373
 
6308
6374
  =item B<-stay_open> I<FLAG>
6309
6375
 
6310
- If I<FLAG> is C<1> or C<True>, causes exiftool keep reading from the B<-@>
6311
- I<ARGFILE> even after reaching the end of file. This feature allows calling
6312
- applications to pre-load exiftool, thus avoiding the overhead of loading
6313
- 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:
6314
6380
 
6315
6381
  1) Execute C<exiftool -stay_open True -@ I<ARGFILE>>, where I<ARGFILE> is the
6316
6382
  name of an existing (possibly empty) argument file or C<-> to pipe arguments
@@ -6333,8 +6399,9 @@ signals back to your application.)
6333
6399
 
6334
6400
  4) Repeat steps 2 and 3 for each command.
6335
6401
 
6336
- 5) Write C<-stay_open\nFalse\n> to I<ARGFILE> when done. This will cause
6337
- 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.
6338
6405
 
6339
6406
  The input I<ARGFILE> may be changed at any time before step 5 above by
6340
6407
  writing the following lines to the currently open I<ARGFILE>:
@@ -6362,10 +6429,11 @@ an interface to the API UserParam option (see the
6362
6429
  L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
6363
6430
  provides a method to access user-defined parameters in arguments to the
6364
6431
  B<-if> and B<-p> options as if they were any other tag. Appending a hash
6365
- tag (C<#>) to I<PARAM> also causes the parameter to be extracted as a normal
6366
- tag (in the UserParam group). Similar to the B<-api> option, the parameter
6367
- value is set to 1 if I<=VAL> is omitted, undef if just I<VAL> is omitted
6368
- 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<^=>.
6369
6437
 
6370
6438
  exiftool -p '$test from $filename' -userparam test=Hello FILE
6371
6439
 
@@ -6435,9 +6503,9 @@ For example, the following command may be used to remove duplicate Keywords:
6435
6503
  The B<-sep> option is necessary to split the string back into individual
6436
6504
  list items when writing to a list-type tag.
6437
6505
 
6438
- An optional flag argument may be set to 1 to cause C<NoDups> to return undef
6439
- if no duplicates existed, thus preventing the file from being rewritten
6440
- 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:
6441
6509
 
6442
6510
  exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
6443
6511
 
@@ -7075,6 +7143,13 @@ flexibility of ExifTool.)
7075
7143
 
7076
7144
  =back
7077
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
+
7078
7153
  =head1 EXIT STATUS
7079
7154
 
7080
7155
  The exiftool application exits with a status of 0 on success, or 1 if an
@@ -7083,7 +7158,7 @@ the commands if B<-execute> was used).
7083
7158
 
7084
7159
  =head1 AUTHOR
7085
7160
 
7086
- Copyright 2003-2020, Phil Harvey
7161
+ Copyright 2003-2021, Phil Harvey
7087
7162
 
7088
7163
  This is free software; you can redistribute it and/or modify it under the
7089
7164
  same terms as Perl itself.