exiftool_vendored 12.10.0 → 12.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +71 -2
- data/bin/MANIFEST +5 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -3
- data/bin/exiftool +130 -55
- data/bin/lib/File/RandomAccess.pm +1 -1
- data/bin/lib/File/RandomAccess.pod +2 -2
- data/bin/lib/Image/ExifTool.pm +46 -10
- data/bin/lib/Image/ExifTool.pod +14 -11
- data/bin/lib/Image/ExifTool/AES.pm +1 -1
- data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/APE.pm +1 -1
- data/bin/lib/Image/ExifTool/APP12.pm +1 -1
- data/bin/lib/Image/ExifTool/ASF.pm +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +1 -1
- data/bin/lib/Image/ExifTool/Audible.pm +1 -1
- data/bin/lib/Image/ExifTool/BMP.pm +1 -1
- data/bin/lib/Image/ExifTool/BPG.pm +1 -1
- data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +10 -4
- data/bin/lib/Image/ExifTool/Canon.pm +15 -12
- data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- data/bin/lib/Image/ExifTool/Casio.pm +1 -1
- data/bin/lib/Image/ExifTool/Charset.pm +1 -1
- data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- data/bin/lib/Image/ExifTool/DJI.pm +28 -2
- data/bin/lib/Image/ExifTool/DNG.pm +1 -1
- data/bin/lib/Image/ExifTool/DPX.pm +1 -1
- data/bin/lib/Image/ExifTool/DV.pm +1 -1
- data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
- data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- data/bin/lib/Image/ExifTool/EXE.pm +1 -1
- data/bin/lib/Image/ExifTool/Exif.pm +14 -1
- data/bin/lib/Image/ExifTool/FITS.pm +1 -1
- data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
- data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- data/bin/lib/Image/ExifTool/Flash.pm +1 -1
- data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
- data/bin/lib/Image/ExifTool/Font.pm +1 -1
- data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- data/bin/lib/Image/ExifTool/GE.pm +1 -1
- data/bin/lib/Image/ExifTool/GIF.pm +1 -1
- data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- data/bin/lib/Image/ExifTool/GPS.pm +1 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +30 -11
- data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/HP.pm +1 -1
- data/bin/lib/Image/ExifTool/HTML.pm +1 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +1 -1
- data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
- data/bin/lib/Image/ExifTool/ISO.pm +1 -1
- data/bin/lib/Image/ExifTool/ITC.pm +1 -1
- data/bin/lib/Image/ExifTool/Import.pm +15 -12
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +24 -2
- data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- data/bin/lib/Image/ExifTool/JSON.pm +1 -1
- data/bin/lib/Image/ExifTool/JVC.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +9 -4
- data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
- data/bin/lib/Image/ExifTool/MIE.pm +1 -1
- data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/MNG.pm +1 -1
- data/bin/lib/Image/ExifTool/MOI.pm +1 -1
- data/bin/lib/Image/ExifTool/MPC.pm +1 -1
- data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/MPF.pm +3 -3
- data/bin/lib/Image/ExifTool/MWG.pm +1 -1
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +314 -35
- data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +2013 -0
- data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
- data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +4 -2
- data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
- data/bin/lib/Image/ExifTool/Opus.pm +1 -1
- data/bin/lib/Image/ExifTool/PCX.pm +1 -1
- data/bin/lib/Image/ExifTool/PDF.pm +10 -2
- data/bin/lib/Image/ExifTool/PGF.pm +1 -1
- data/bin/lib/Image/ExifTool/PICT.pm +1 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- data/bin/lib/Image/ExifTool/PNG.pm +12 -4
- data/bin/lib/Image/ExifTool/PPM.pm +1 -1
- data/bin/lib/Image/ExifTool/PSP.pm +1 -1
- data/bin/lib/Image/ExifTool/Palm.pm +1 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +12 -4
- data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
- data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +28 -19
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +25 -4
- data/bin/lib/Image/ExifTool/RIFF.pm +83 -5
- data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- data/bin/lib/Image/ExifTool/Real.pm +1 -1
- data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- data/bin/lib/Image/ExifTool/Red.pm +1 -1
- data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
- data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -1
- data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Sony.pm +8 -2
- data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- data/bin/lib/Image/ExifTool/Stim.pm +3 -3
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +3943 -3807
- data/bin/lib/Image/ExifTool/TagNames.pod +313 -21
- data/bin/lib/Image/ExifTool/Text.pm +1 -1
- data/bin/lib/Image/ExifTool/Theora.pm +1 -1
- data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
- data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- data/bin/lib/Image/ExifTool/VCard.pm +1 -1
- data/bin/lib/Image/ExifTool/Validate.pm +1 -1
- data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- data/bin/lib/Image/ExifTool/WTV.pm +1 -1
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -4
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +28 -14
- data/bin/lib/Image/ExifTool/XMP.pm +17 -8
- data/bin/lib/Image/ExifTool/XMP2.pl +5 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- data/bin/lib/Image/ExifTool/iWork.pm +1 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e30c22a774925019702c59a5aa788607b27a5b217824d47ec66be50e5a10e8f1
|
|
4
|
+
data.tar.gz: 5c54290d58d097af3d8950f187b940e6a930d1d9502c38252620b57c8ff64067
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '07965ed32bfb30fe68f862fc2e1e8c1a59094182b664d4cfbfdc9fe0c5e4db16b08733c0ff42c093c1dbd289148c24f5ed51e40b99b582701441cc4bf64b8061'
|
|
7
|
+
data.tar.gz: 5ab6c978e3d9066a288173d0efd9a786245fabe9114446b77115032153fc64252dd05b1b47d4608e94b0ded7bf996fdb02706136036ede870aa2c779796b6d63
|
data/bin/Changes
CHANGED
|
@@ -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.
|
|
8
|
-
considered development releases, and are not uploaded to
|
|
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
|
|
data/bin/MANIFEST
CHANGED
|
@@ -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
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
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.
|
|
110
|
-
cd Image-ExifTool-12.
|
|
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-
|
|
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.
|
data/bin/exiftool
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
use strict;
|
|
11
11
|
require 5.004;
|
|
12
12
|
|
|
13
|
-
my $version = '12.
|
|
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
|
|
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
|
|
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(\+?=.*)
|
|
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 $
|
|
2357
|
-
$
|
|
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 $
|
|
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} = $
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
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 =
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
|
|
2912
|
-
|
|
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 ($
|
|
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
|
-
|
|
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 =~ /[
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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<-
|
|
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
|
|
6311
|
-
I<ARGFILE> even after reaching the end of file. This
|
|
6312
|
-
applications to pre-load exiftool, thus avoiding the
|
|
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
|
|
6337
|
-
exiftool to process any remaining command-line
|
|
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
|
|
6366
|
-
tag
|
|
6367
|
-
value is set to 1 if I<=VAL> is
|
|
6368
|
-
|
|
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
|
|
6439
|
-
if no duplicates existed, thus preventing the file from being
|
|
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-
|
|
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.
|