exiftool-vendored.exe 13.17.0 → 13.26.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.
- package/bin/README.txt +14 -14
- package/bin/exiftool.exe +0 -0
- package/bin/exiftool_files/exiftool.pl +117 -46
- package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +12 -2
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +190 -29
- package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +22 -11
- package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +2 -9
- package/bin/exiftool_files/lib/Image/ExifTool/GM.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +86 -48
- package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/ICO.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +5 -1
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +5 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +944 -1237
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PCAP.pm +462 -0
- package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +10 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +92 -29
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Plot.pm +713 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Protobuf.pm +24 -11
- package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +78 -1
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +371 -324
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +75 -27
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +15 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +33 -14
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +5067 -4967
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +457 -336
- package/bin/exiftool_files/lib/Image/ExifTool/Trailer.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +4 -4
- package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +9 -4
- package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +58 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +14 -13
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +55 -20
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +7 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +63 -29
- package/bin/exiftool_files/lib/Image/ExifTool.pod +84 -86
- package/bin/exiftool_files/windows_exiftool.txt +96 -72
- package/package.json +4 -4
|
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
|
30
30
|
%static_vars $advFmtSelf);
|
|
31
31
|
|
|
32
|
-
$VERSION = '13.
|
|
32
|
+
$VERSION = '13.26';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -155,9 +155,9 @@ sub ReadValue($$$;$$$);
|
|
|
155
155
|
Real::Metafile Red RIFF AIFF ASF WTV DICOM FITS XISF MIE JSON HTML XMP::SVG
|
|
156
156
|
Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString
|
|
157
157
|
EXE::DebugRSDS EXE::DebugNB10 EXE::Misc EXE::MachO EXE::PEF EXE::ELF EXE::AR
|
|
158
|
-
EXE::CHM LNK Font VCard Text VCard::VCalendar VCard::VNote RSRC Rawzor
|
|
159
|
-
ZIP::GZIP ZIP::RAR ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF FLIR::FPF
|
|
160
|
-
MacOS::MDItem FlashPix::DocTable
|
|
158
|
+
EXE::CHM LNK PCAP Font VCard Text VCard::VCalendar VCard::VNote RSRC Rawzor
|
|
159
|
+
ZIP ZIP::GZIP ZIP::RAR ZIP::RAR5 RTF OOXML iWork ISO FLIR::AFF FLIR::FPF
|
|
160
|
+
MacOS MacOS::MDItem FlashPix::DocTable
|
|
161
161
|
);
|
|
162
162
|
|
|
163
163
|
# alphabetical list of current Lang modules
|
|
@@ -199,8 +199,8 @@ $defaultLang = 'en'; # default language
|
|
|
199
199
|
LFP HTML VRD RTF FITS XISF XCF DSS QTIF FPX PICT ZIP GZIP PLIST
|
|
200
200
|
RAR 7Z BZ2 CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font
|
|
201
201
|
JUMBF RSRC M2TS MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard
|
|
202
|
-
LRI R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3
|
|
203
|
-
NKA ICO TXT AAC);
|
|
202
|
+
LRI R3D AA PDB PFM2 MRC LIF JXL MOI ISO ALIAS PCAP JSON MP3
|
|
203
|
+
DICOM PCD NKA ICO TXT AAC);
|
|
204
204
|
|
|
205
205
|
# file types that we can write (edit)
|
|
206
206
|
my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
|
|
@@ -263,6 +263,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
|
263
263
|
BPG => ['BPG', 'Better Portable Graphics'],
|
|
264
264
|
BTF => ['BTF', 'Big Tagged Image File Format'], #(unofficial)
|
|
265
265
|
BZ2 => ['BZ2', 'BZIP2 archive'],
|
|
266
|
+
CAP => 'PCAP',
|
|
266
267
|
C2PA => ['JUMBF','Coalition for Content Provenance and Authenticity'],
|
|
267
268
|
CHM => ['CHM', 'Microsoft Compiled HTML format'],
|
|
268
269
|
CIFF => ['CRW', 'Camera Image File Format'],
|
|
@@ -454,6 +455,8 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
|
454
455
|
PAC => ['RIFF', 'Lossless Predictive Audio Compression'],
|
|
455
456
|
PAGES => ['ZIP', 'Apple Pages document'],
|
|
456
457
|
PBM => ['PPM', 'Portable BitMap'],
|
|
458
|
+
PCAP => ['PCAP', 'Packet Capture'],
|
|
459
|
+
PCAPNG => ['PCAP', 'Packet Capture Next Generation'],
|
|
457
460
|
PCD => ['PCD', 'Kodak Photo CD Image Pac'],
|
|
458
461
|
PCT => 'PICT',
|
|
459
462
|
PCX => ['PCX', 'PC Paintbrush'],
|
|
@@ -568,7 +571,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
|
568
571
|
XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'],
|
|
569
572
|
XMP => ['XMP', 'Extensible Metadata Platform'],
|
|
570
573
|
WOFF => ['Font', 'Web Open Font Format'],
|
|
571
|
-
WOFF2=> ['Font', 'Web Open Font
|
|
574
|
+
WOFF2=> ['Font', 'Web Open Font Format 2'],
|
|
572
575
|
WPG => ['WPG', 'WordPerfect Graphics'],
|
|
573
576
|
WTV => ['WTV', 'Windows recorded TV show'],
|
|
574
577
|
ZIP => ['ZIP', 'ZIP archive'],
|
|
@@ -744,6 +747,7 @@ my %fileDescription = (
|
|
|
744
747
|
OTF => 'application/font-otf',
|
|
745
748
|
PAGES=> 'application/x-iwork-pages-sffpages',
|
|
746
749
|
PBM => 'image/x-portable-bitmap',
|
|
750
|
+
PCAP => 'application/vnd.tcpdump.pcap',
|
|
747
751
|
PCD => 'image/x-photo-cd',
|
|
748
752
|
PCX => 'image/pcx',
|
|
749
753
|
PDB => 'application/vnd.palm',
|
|
@@ -980,6 +984,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
|
|
|
980
984
|
NKA => 'NIKONADJ',
|
|
981
985
|
OGG => '(OggS|ID3)',
|
|
982
986
|
ORF => '(II|MM)',
|
|
987
|
+
PCAP => '\xa1\xb2(\xc3\xd4|\x3c\x4d)\0.\0.|(\xd4\xc3|\x4d\x3c)\xb2\xa1.\0.\0|\x0a\x0d\x0d\x0a.{4}(\x1a\x2b\x3c\x4d|\x4d\x3c\x2b\x1a)|GMBU\0\x02',
|
|
983
988
|
# PCD => signature is at byte 2048
|
|
984
989
|
PCX => '\x0a[\0-\x05]\x01[\x01\x02\x04\x08].{64}[\0-\x02]',
|
|
985
990
|
PDB => '.{60}(\.pdfADBE|TEXtREAd|BVokBDIC|DB99DBOS|PNRdPPrs|DataPPrs|vIMGView|PmDBPmDB|InfoINDB|ToGoToGo|SDocSilX|JbDbJBas|JfDbJFil|DATALSdb|Mdb1Mdb1|BOOKMOBI|DataPlkr|DataSprd|SM01SMem|TEXtTlDc|InfoTlIf|DataTlMl|DataTlPt|dataTDBP|TdatTide|ToRaTRPW|zTXTGPlm|BDOCWrdS)',
|
|
@@ -1135,6 +1140,7 @@ my @availableOptions = (
|
|
|
1135
1140
|
[ 'IgnoreMinorErrors',undef, 'ignore minor errors when reading/writing' ],
|
|
1136
1141
|
[ 'IgnoreTags', undef, 'list of tags to ignore when extracting' ],
|
|
1137
1142
|
[ 'ImageHashType', 'MD5', 'image hash algorithm' ],
|
|
1143
|
+
[ 'KeepUTCTime', undef, 'do not convert times stored as UTC' ],
|
|
1138
1144
|
[ 'Lang', $defaultLang, 'localized language for descriptions etc' ],
|
|
1139
1145
|
[ 'LargeFileSupport', 1, 'flag indicating support of 64-bit file offsets' ],
|
|
1140
1146
|
[ 'LimitLongValues', 60, 'length limit for long values' ],
|
|
@@ -1152,6 +1158,7 @@ my @availableOptions = (
|
|
|
1152
1158
|
[ 'NoPDFList', undef, 'flag to avoid splitting PDF List-type tag values' ],
|
|
1153
1159
|
[ 'NoWarning', undef, 'regular expression for warnings to suppress' ],
|
|
1154
1160
|
[ 'Password', undef, 'password for password-protected PDF documents' ],
|
|
1161
|
+
[ 'Plot', undef, 'SVG plot settings' ],
|
|
1155
1162
|
[ 'PrintCSV', undef, 'flag to print CSV directly (selected metadata types only)' ],
|
|
1156
1163
|
[ 'PrintConv', 1, 'flag to enable print conversion' ],
|
|
1157
1164
|
[ 'QuickTimeHandler', 1, 'flag to add mdir Handler to newly created Meta box' ],
|
|
@@ -2587,6 +2594,12 @@ sub Options($$;@)
|
|
|
2587
2594
|
} else {
|
|
2588
2595
|
warn("Can't set $param to undef\n");
|
|
2589
2596
|
}
|
|
2597
|
+
} elsif ($param eq 'Plot') {
|
|
2598
|
+
# add to existing plot settings
|
|
2599
|
+
$newVal = "$oldVal,$newVal" if defined $oldVal and defined $newVal;
|
|
2600
|
+
$$options{$param} = $newVal;
|
|
2601
|
+
} elsif ($param eq 'KeepUTCTime') {
|
|
2602
|
+
$$options{$param} = $static_vars{$param} = $newVal;
|
|
2590
2603
|
} elsif (lc $param eq 'geodir') {
|
|
2591
2604
|
$Image::ExifTool::Geolocation::geoDir = $newVal;
|
|
2592
2605
|
} else {
|
|
@@ -4245,7 +4258,7 @@ sub Init($)
|
|
|
4245
4258
|
my $self = shift;
|
|
4246
4259
|
# delete all DataMember variables (lower-case names)
|
|
4247
4260
|
delete $$self{$_} foreach grep /[a-z]/, keys %$self;
|
|
4248
|
-
|
|
4261
|
+
%static_vars = ( KeepUTCTime => $$self{OPTIONS}{KeepUTCTime} ); # reset static variables
|
|
4249
4262
|
delete $$self{FOUND_TAGS}; # list of found tags
|
|
4250
4263
|
delete $$self{EXIF_DATA}; # the EXIF data block
|
|
4251
4264
|
delete $$self{EXIF_POS}; # EXIF position in file
|
|
@@ -6680,12 +6693,15 @@ sub ConvertUnixTime($;$$)
|
|
|
6680
6693
|
$time = int($time + 1e-6) if $time != int($time); # avoid round-off errors
|
|
6681
6694
|
$dec = '';
|
|
6682
6695
|
}
|
|
6683
|
-
if ($toLocal) {
|
|
6684
|
-
@tm = localtime($time);
|
|
6685
|
-
$tz = TimeZoneString(\@tm, $time);
|
|
6686
|
-
} else {
|
|
6696
|
+
if (not $toLocal) {
|
|
6687
6697
|
@tm = gmtime($time);
|
|
6688
6698
|
$tz = '';
|
|
6699
|
+
} elsif ($static_vars{KeepUTCTime}) {
|
|
6700
|
+
@tm = gmtime($time);
|
|
6701
|
+
$tz = 'Z';
|
|
6702
|
+
} else {
|
|
6703
|
+
@tm = localtime($time);
|
|
6704
|
+
$tz = TimeZoneString(\@tm, $time);
|
|
6689
6705
|
}
|
|
6690
6706
|
my $str = sprintf("%4d:%.2d:%.2d %.2d:%.2d:%.2d$dec%s",
|
|
6691
6707
|
$tm[5]+1900, $tm[4]+1, $tm[3], $tm[2], $tm[1], $tm[0], $tz);
|
|
@@ -6868,10 +6884,10 @@ sub HDump($$$$;$$$)
|
|
|
6868
6884
|
# Returns: Trailer info hash (with RAF and DirName set),
|
|
6869
6885
|
# or undef if no recognized trailer was found
|
|
6870
6886
|
# Notes: leaves file position unchanged
|
|
6871
|
-
sub IdentifyTrailer(
|
|
6887
|
+
sub IdentifyTrailer($$;$)
|
|
6872
6888
|
{
|
|
6873
|
-
my $raf =
|
|
6874
|
-
|
|
6889
|
+
my ($self, $raf, $offset) = @_;
|
|
6890
|
+
$offset or $offset = 0;
|
|
6875
6891
|
my $pos = $raf->Tell();
|
|
6876
6892
|
my ($buff, $type, $len);
|
|
6877
6893
|
while ($raf->Seek(-$offset, 2) and ($len = $raf->Tell()) > 0) {
|
|
@@ -6900,6 +6916,9 @@ sub IdentifyTrailer($;$)
|
|
|
6900
6916
|
$type = 'Vivo';
|
|
6901
6917
|
} elsif ($buff =~ /jxrs...\0$/s) {
|
|
6902
6918
|
$type = 'OnePlus';
|
|
6919
|
+
} elsif ($$self{ProcessGoogleTrailer}) {
|
|
6920
|
+
# check for Google trailer information if specific XMP tags exist
|
|
6921
|
+
$type = 'Google';
|
|
6903
6922
|
}
|
|
6904
6923
|
last;
|
|
6905
6924
|
}
|
|
@@ -7052,7 +7071,7 @@ sub ProcessTrailers($$)
|
|
|
7052
7071
|
$offset += $dirLen;
|
|
7053
7072
|
last if $dataPos and $$self{TrailerStart} and $dataPos <= $$self{TrailerStart};
|
|
7054
7073
|
# look for next trailer
|
|
7055
|
-
my $nextTrail = IdentifyTrailer($raf, $offset);
|
|
7074
|
+
my $nextTrail = $self->IdentifyTrailer($raf, $offset);
|
|
7056
7075
|
# process Google trailer after all others if necessary and not done already
|
|
7057
7076
|
unless ($nextTrail) {
|
|
7058
7077
|
last unless $$self{ProcessGoogleTrailer};
|
|
@@ -7504,11 +7523,7 @@ sub ProcessJPEG($$;$)
|
|
|
7504
7523
|
}
|
|
7505
7524
|
}
|
|
7506
7525
|
unless ($fast) {
|
|
7507
|
-
$trailInfo = IdentifyTrailer($raf);
|
|
7508
|
-
# check for Google trailer information if specific XMP tags exist
|
|
7509
|
-
if (not $trailInfo and $$self{ProcessGoogleTrailer}) {
|
|
7510
|
-
$trailInfo = { DirName => 'Google', RAF => $raf };
|
|
7511
|
-
}
|
|
7526
|
+
$trailInfo = $self->IdentifyTrailer($raf);
|
|
7512
7527
|
# process trailer now unless we are doing verbose dump
|
|
7513
7528
|
if ($trailInfo and $verbose < 3 and not $htmlDump) {
|
|
7514
7529
|
# process trailers (keep trailInfo to finish processing later
|
|
@@ -7963,6 +7978,12 @@ sub ProcessJPEG($$;$)
|
|
|
7963
7978
|
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7964
7979
|
undef $scalado;
|
|
7965
7980
|
}
|
|
7981
|
+
} elsif ($$segDataPt =~ /^Qualcomm Dual Camera Attributes/) {
|
|
7982
|
+
$dumpType = 'Qualcomm Dual Camera';
|
|
7983
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::Qualcomm::DualCamera');
|
|
7984
|
+
DirStart(\%dirInfo, 31);
|
|
7985
|
+
$dirInfo{DirName} = 'Qualcomm Dual Camera';
|
|
7986
|
+
$self->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
7966
7987
|
} elsif ($$segDataPt =~ /^FPXR\0/) {
|
|
7967
7988
|
next if $fast > 1; # skip processing for very fast
|
|
7968
7989
|
$dumpType = 'FPXR';
|
|
@@ -8619,7 +8640,7 @@ sub DoProcessTIFF($$;$)
|
|
|
8619
8640
|
}
|
|
8620
8641
|
# process information in recognized trailers
|
|
8621
8642
|
if ($raf) {
|
|
8622
|
-
my $trailInfo = IdentifyTrailer($raf);
|
|
8643
|
+
my $trailInfo = $self->IdentifyTrailer($raf);
|
|
8623
8644
|
if ($trailInfo) {
|
|
8624
8645
|
# scan to find AFCP if necessary (Note: we are scanning
|
|
8625
8646
|
# from a random file position in the TIFF)
|
|
@@ -8724,7 +8745,7 @@ sub DoProcessTIFF($$;$)
|
|
|
8724
8745
|
for (;;) {
|
|
8725
8746
|
last unless $extra > 12;
|
|
8726
8747
|
$raf->Seek($tiffEnd); # seek back to end of image
|
|
8727
|
-
$trailInfo = IdentifyTrailer($raf);
|
|
8748
|
+
$trailInfo = $self->IdentifyTrailer($raf);
|
|
8728
8749
|
last unless $trailInfo;
|
|
8729
8750
|
my $tbuf = '';
|
|
8730
8751
|
$$trailInfo{OutFile} = \$tbuf; # rewrite trailer(s)
|
|
@@ -8941,7 +8962,7 @@ sub ProcessDirectory($$$;$)
|
|
|
8941
8962
|
($$dirInfo{DirLen} or not defined $$dirInfo{DirLen}))
|
|
8942
8963
|
{
|
|
8943
8964
|
my $addr = $$dirInfo{DirStart} + $$dirInfo{DataPos} + ($$dirInfo{Base}||0) + $$self{BASE};
|
|
8944
|
-
if ($$self{PROCESSED}{$addr}) {
|
|
8965
|
+
if ($$self{PROCESSED}{$addr} and not $$dirInfo{NotDup}) {
|
|
8945
8966
|
$self->Warn("$dirName pointer references previous $$self{PROCESSED}{$addr} directory");
|
|
8946
8967
|
# patch for bug in Windows phone 7.5 O/S that writes incorrect InteropIFD pointer
|
|
8947
8968
|
return 0 unless $dirName eq 'GPS' and $$self{PROCESSED}{$addr} eq 'InteropIFD';
|
|
@@ -9152,10 +9173,11 @@ sub AddTagToTable($$;$$)
|
|
|
9152
9173
|
# Handle simple extraction of new tag information
|
|
9153
9174
|
# Inputs: 0) ExifTool object ref, 1) tag table reference, 2) tagID, 3) value,
|
|
9154
9175
|
# 4-N) parameters hash: Index, DataPt, DataPos, Base, Start, Size, Parent,
|
|
9155
|
-
# TagInfo, ProcessProc, RAF, Format, Count
|
|
9176
|
+
# TagInfo, ProcessProc, RAF, Format, Count, MakeTagInfo
|
|
9156
9177
|
# Returns: tag key or undef if tag not found
|
|
9157
9178
|
# Notes: if value is not defined, it is extracted from DataPt using TagInfo
|
|
9158
9179
|
# Format and Count if provided
|
|
9180
|
+
# - set MakeTagInfo to add tag info for unknown tags with name made from tag ID
|
|
9159
9181
|
sub HandleTag($$$$;%)
|
|
9160
9182
|
{
|
|
9161
9183
|
my ($self, $tagTablePtr, $tag, $val, %parms) = @_;
|
|
@@ -9167,6 +9189,15 @@ sub HandleTag($$$$;%)
|
|
|
9167
9189
|
|
|
9168
9190
|
if ($tagInfo) {
|
|
9169
9191
|
$subdir = $$tagInfo{SubDirectory};
|
|
9192
|
+
} elsif ($parms{MakeTagInfo}) {
|
|
9193
|
+
$self->VPrint(0, $$self{INDENT}, "[adding $tag]\n") if $verbose;
|
|
9194
|
+
my $name = $tag;
|
|
9195
|
+
$name =~ s/([A-Z]) ([A-Z][ A-Z])/${1}_$2/g; # underline between acronyms
|
|
9196
|
+
$name =~ s/([^A-Za-z])([a-z])/$1\u$2/g; # capitalize words
|
|
9197
|
+
$name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
|
|
9198
|
+
$name = "Tag$name" if length($name) < 2 or $name =~ /^[-0-9]/;
|
|
9199
|
+
$tagInfo = { Name => ucfirst($name) };
|
|
9200
|
+
AddTagToTable($tagTablePtr, $tag, $tagInfo);
|
|
9170
9201
|
} else {
|
|
9171
9202
|
return undef unless $verbose;
|
|
9172
9203
|
$tagInfo = { Name => "tag $tag" }; # create temporary tagInfo hash
|
|
@@ -9224,10 +9255,11 @@ sub HandleTag($$$$;%)
|
|
|
9224
9255
|
}
|
|
9225
9256
|
$self->Warn("RawConv $tag: " . CleanWarning()) if $evalWarning;
|
|
9226
9257
|
return undef unless defined $val;
|
|
9227
|
-
$
|
|
9228
|
-
$dataPt = \$val;
|
|
9258
|
+
$dataPt = ref $val eq 'SCALAR' ? $val : \$val;
|
|
9229
9259
|
$subdirStart = 0;
|
|
9230
|
-
$subdirLen = length
|
|
9260
|
+
$subdirLen = length $$dataPt;
|
|
9261
|
+
} elsif (not $dataPt) {
|
|
9262
|
+
$dataPt = ref $val eq 'SCALAR' ? $val : \$val;
|
|
9231
9263
|
}
|
|
9232
9264
|
if ($$subdir{Start}) {
|
|
9233
9265
|
my $valuePtr = 0;
|
|
@@ -9236,7 +9268,6 @@ sub HandleTag($$$$;%)
|
|
|
9236
9268
|
$subdirStart += $off;
|
|
9237
9269
|
$subdirLen -= $off;
|
|
9238
9270
|
}
|
|
9239
|
-
$dataPt or $dataPt = \$val;
|
|
9240
9271
|
# process subdirectory information
|
|
9241
9272
|
my %dirInfo = (
|
|
9242
9273
|
DirName => $$subdir{DirName} || $$tagInfo{Name},
|
|
@@ -9957,6 +9988,7 @@ sub ProcessBinaryData($$$)
|
|
|
9957
9988
|
$subdirBase = eval($$subdir{Base}) + $base;
|
|
9958
9989
|
}
|
|
9959
9990
|
my $start = $$subdir{Start} || 0;
|
|
9991
|
+
my $notDup;
|
|
9960
9992
|
if ($start =~ /\$/) {
|
|
9961
9993
|
# ignore directories with a zero offset (ie. missing Nikon ShotInfo entries)
|
|
9962
9994
|
next unless $val;
|
|
@@ -9967,6 +9999,7 @@ sub ProcessBinaryData($$$)
|
|
|
9967
9999
|
$len = $dataLen - $start unless $len and $len <= $dataLen - $start;
|
|
9968
10000
|
} else {
|
|
9969
10001
|
$start += $dirStart + $entry;
|
|
10002
|
+
$notDup = 1,
|
|
9970
10003
|
}
|
|
9971
10004
|
my %subdirInfo = (
|
|
9972
10005
|
DataPt => $dataPt,
|
|
@@ -9975,6 +10008,7 @@ sub ProcessBinaryData($$$)
|
|
|
9975
10008
|
DirStart => $start,
|
|
9976
10009
|
DirLen => $len,
|
|
9977
10010
|
Base => $subdirBase,
|
|
10011
|
+
NotDup => $notDup,
|
|
9978
10012
|
);
|
|
9979
10013
|
delete $$self{NO_UNKNOWN};
|
|
9980
10014
|
$self->ProcessDirectory(\%subdirInfo, $subTablePtr, $$subdir{ProcessProc});
|
|
@@ -65,50 +65,50 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
65
65
|
|
|
66
66
|
File Types
|
|
67
67
|
------------+-------------+-------------+-------------+------------
|
|
68
|
-
360 r/w | DOCX r | ITC r | NUMBERS r |
|
|
69
|
-
3FR r | DPX r | J2C r | NXD r |
|
|
70
|
-
3G2 r/w | DR4 r/w/c | JNG r/w | O r |
|
|
71
|
-
3GP r/w | DSS r | JP2 r/w | ODP r |
|
|
72
|
-
7Z r | DV r | JPEG r/w | ODS r |
|
|
73
|
-
A r | DVB r/w | JSON r | ODT r |
|
|
74
|
-
AA r | DVR-MS r | JXL r/w | OFR r |
|
|
75
|
-
AAC r | DYLIB r | K25 r | OGG r |
|
|
76
|
-
AAE r | EIP r | KDC r | OGV r |
|
|
77
|
-
AAX r/w | EPS r/w | KEY r | ONP r |
|
|
78
|
-
ACR r | EPUB r | LA r | OPUS r |
|
|
79
|
-
AFM r | ERF r/w | LFP r | ORF r/w |
|
|
80
|
-
AI r/w | EXE r | LIF r | ORI r/w |
|
|
81
|
-
AIFF r | EXIF r/w/c | LNK r | OTF r |
|
|
82
|
-
APE r | EXR r | LRV r/w | PAC r |
|
|
83
|
-
ARQ r/w | EXV r/w/c | M2TS r | PAGES r |
|
|
84
|
-
ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w |
|
|
85
|
-
ASF r | FFF r/w | MACOS r |
|
|
86
|
-
AVI r | FITS r | MAX r |
|
|
87
|
-
AVIF r/w | FLA r | MEF r/w |
|
|
88
|
-
AZW r | FLAC r | MIE r/w/c |
|
|
89
|
-
BMP r | FLIF r/w | MIFF r |
|
|
90
|
-
BPG r | FLV r | MKA r |
|
|
91
|
-
BTF r | FPF r | MKS r |
|
|
92
|
-
C2PA r | FPX r | MKV r |
|
|
93
|
-
CHM r | GIF r/w | MNG r/w |
|
|
94
|
-
COS r | GLV r/w | MOBI r |
|
|
95
|
-
CR2 r/w | GPR r/w | MODD r |
|
|
96
|
-
CR3 r/w | GZ r | MOI r |
|
|
97
|
-
CRM r/w | HDP r/w | MOS r/w |
|
|
98
|
-
CRW r/w | HDR r | MOV r/w |
|
|
99
|
-
CS1 r/w | HEIC r/w | MP3 r |
|
|
100
|
-
CSV r | HEIF r/w | MP4 r/w |
|
|
101
|
-
CUR r | HTML r | MPC r |
|
|
102
|
-
CZI r | ICC r/w/c | MPG r |
|
|
103
|
-
DCM r | ICO r | MPO r/w |
|
|
104
|
-
DCP r/w | ICS r | MQV r/w |
|
|
105
|
-
DCR r | IDML r | MRC r |
|
|
106
|
-
DFONT r | IIQ r/w | MRW r/w |
|
|
107
|
-
DIVX r | IND r/w | MXF r |
|
|
108
|
-
DJVU r | INSP r/w | NEF r/w |
|
|
109
|
-
DLL r | INSV r | NKA r |
|
|
110
|
-
DNG r/w | INX r | NKSC r/w |
|
|
111
|
-
DOC r | ISO r | NRW r/w |
|
|
68
|
+
360 r/w | DOCX r | ITC r | NUMBERS r | RAM r
|
|
69
|
+
3FR r | DPX r | J2C r | NXD r | RAR r
|
|
70
|
+
3G2 r/w | DR4 r/w/c | JNG r/w | O r | RAW r/w
|
|
71
|
+
3GP r/w | DSS r | JP2 r/w | ODP r | RIFF r
|
|
72
|
+
7Z r | DV r | JPEG r/w | ODS r | RSRC r
|
|
73
|
+
A r | DVB r/w | JSON r | ODT r | RTF r
|
|
74
|
+
AA r | DVR-MS r | JXL r/w | OFR r | RW2 r/w
|
|
75
|
+
AAC r | DYLIB r | K25 r | OGG r | RWL r/w
|
|
76
|
+
AAE r | EIP r | KDC r | OGV r | RWZ r
|
|
77
|
+
AAX r/w | EPS r/w | KEY r | ONP r | RM r
|
|
78
|
+
ACR r | EPUB r | LA r | OPUS r | SEQ r
|
|
79
|
+
AFM r | ERF r/w | LFP r | ORF r/w | SKETCH r
|
|
80
|
+
AI r/w | EXE r | LIF r | ORI r/w | SO r
|
|
81
|
+
AIFF r | EXIF r/w/c | LNK r | OTF r | SR2 r/w
|
|
82
|
+
APE r | EXR r | LRV r/w | PAC r | SRF r
|
|
83
|
+
ARQ r/w | EXV r/w/c | M2TS r | PAGES r | SRW r/w
|
|
84
|
+
ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w | SVG r
|
|
85
|
+
ASF r | FFF r/w | MACOS r | PCAP r | SWF r
|
|
86
|
+
AVI r | FITS r | MAX r | PCAPNG r | THM r/w
|
|
87
|
+
AVIF r/w | FLA r | MEF r/w | PCD r | TIFF r/w
|
|
88
|
+
AZW r | FLAC r | MIE r/w/c | PCX r | TORRENT r
|
|
89
|
+
BMP r | FLIF r/w | MIFF r | PDB r | TTC r
|
|
90
|
+
BPG r | FLV r | MKA r | PDF r/w | TTF r
|
|
91
|
+
BTF r | FPF r | MKS r | PEF r/w | TXT r
|
|
92
|
+
C2PA r | FPX r | MKV r | PFA r | VCF r
|
|
93
|
+
CHM r | GIF r/w | MNG r/w | PFB r | VNT r
|
|
94
|
+
COS r | GLV r/w | MOBI r | PFM r | VRD r/w/c
|
|
95
|
+
CR2 r/w | GPR r/w | MODD r | PGF r | VSD r
|
|
96
|
+
CR3 r/w | GZ r | MOI r | PGM r/w | WAV r
|
|
97
|
+
CRM r/w | HDP r/w | MOS r/w | PLIST r | WDP r/w
|
|
98
|
+
CRW r/w | HDR r | MOV r/w | PICT r | WEBP r/w
|
|
99
|
+
CS1 r/w | HEIC r/w | MP3 r | PMP r | WEBM r
|
|
100
|
+
CSV r | HEIF r/w | MP4 r/w | PNG r/w | WMA r
|
|
101
|
+
CUR r | HTML r | MPC r | PPM r/w | WMV r
|
|
102
|
+
CZI r | ICC r/w/c | MPG r | PPT r | WPG r
|
|
103
|
+
DCM r | ICO r | MPO r/w | PPTX r | WTV r
|
|
104
|
+
DCP r/w | ICS r | MQV r/w | PS r/w | WV r
|
|
105
|
+
DCR r | IDML r | MRC r | PSB r/w | X3F r/w
|
|
106
|
+
DFONT r | IIQ r/w | MRW r/w | PSD r/w | XCF r
|
|
107
|
+
DIVX r | IND r/w | MXF r | PSP r | XISF r
|
|
108
|
+
DJVU r | INSP r/w | NEF r/w | QTIF r/w | XLS r
|
|
109
|
+
DLL r | INSV r | NKA r | R3D r | XLSX r
|
|
110
|
+
DNG r/w | INX r | NKSC r/w | RA r | XMP r/w/c
|
|
111
|
+
DOC r | ISO r | NRW r/w | RAF r/w | ZIP r
|
|
112
112
|
|
|
113
113
|
Meta Information
|
|
114
114
|
----------------------+----------------------+---------------------
|
|
@@ -892,6 +892,12 @@ to undef to clear the previous IgnoreTags list. Default is undef.
|
|
|
892
892
|
Sets type of hash algorithm used for the ImageDataHash tag calculation.
|
|
893
893
|
Supported options are 'MD5', 'SHA256', and 'SHA512'. Default is 'MD5'.
|
|
894
894
|
|
|
895
|
+
=item KeepUTCTime
|
|
896
|
+
|
|
897
|
+
Flag to keep UTC times in Zulu time zone instead of converting to local
|
|
898
|
+
time. Affects only times which are stored as seconds since the UTC epoch.
|
|
899
|
+
Default is undef.
|
|
900
|
+
|
|
895
901
|
=item Lang
|
|
896
902
|
|
|
897
903
|
Localized language for exiftool tag descriptions, etc. Available languages
|
|
@@ -904,7 +910,7 @@ set to undef to select the built-in default language. Default is 'en'.
|
|
|
904
910
|
Flag to indicate that 64-bit file offsets are supported on this system. If
|
|
905
911
|
not set, processing is aborted if a chunk larger than 2 GB is encountered.
|
|
906
912
|
Set to 1 to process large chunks, or 2 to process with a warning. Default
|
|
907
|
-
is
|
|
913
|
+
is 1.
|
|
908
914
|
|
|
909
915
|
=item LimitLongValues
|
|
910
916
|
|
|
@@ -993,6 +999,37 @@ Password for reading/writing password-protected PDF documents. Ignored if a
|
|
|
993
999
|
password is not required. Character encoding of the password is determined
|
|
994
1000
|
by the value of the Charset option at processing time. Default is undef.
|
|
995
1001
|
|
|
1002
|
+
=item Plot
|
|
1003
|
+
|
|
1004
|
+
Settings to override defaults for SVG plot feature. Value is a comma
|
|
1005
|
+
delimited string of settings, or undef to revert to default settings.
|
|
1006
|
+
Settings are accumulated if this option is set multiple times. Commas in
|
|
1007
|
+
the settings must be escaped as ",". Valid settings and their default
|
|
1008
|
+
values are:
|
|
1009
|
+
|
|
1010
|
+
"Type=Line" - plot type (Line, Scatter or Histogram)
|
|
1011
|
+
"Style=Line" - data style (Line, Marker and/or Fill)
|
|
1012
|
+
"NBins=20" - number of bins for histogram plot
|
|
1013
|
+
"Size=800 600" - width,height of output image
|
|
1014
|
+
"Margin=60 15 15 30" - left,top,right,bottom margins around plot area
|
|
1015
|
+
"Legend=0 0" - x,y offset to shift plot legend
|
|
1016
|
+
"TxtPad=10 10" - padding between text and x,y scale
|
|
1017
|
+
"LineSpacing=20" - spacing between text lines
|
|
1018
|
+
"Stroke=1" - plot stroke width and marker-size scaling
|
|
1019
|
+
Title, XLabel, YLabel - plot title and x/y axis labels (no default)
|
|
1020
|
+
XMin, XMax - x axis minimum/maximum (autoscaling if not set)
|
|
1021
|
+
YMin, YMax - y axis minimum/maximum
|
|
1022
|
+
Multi - flag to draw multiple plots, one for each dataset
|
|
1023
|
+
Split - flag to split strings of numbers into lists
|
|
1024
|
+
(> 1 to split into lists of N items)
|
|
1025
|
+
"Grid=darkgray" - grid color
|
|
1026
|
+
"Text=black" - color of text and plot border
|
|
1027
|
+
"Bkg=" - background color (default is transparent)
|
|
1028
|
+
"Cols=red green blue black orange gray fuchsia brown turquoise gold"
|
|
1029
|
+
- colors for plot data
|
|
1030
|
+
"Marks=circle square triangle diamond star plus pentagon left down right"
|
|
1031
|
+
- marker-shape names for each dataset
|
|
1032
|
+
|
|
996
1033
|
=item PrintConv
|
|
997
1034
|
|
|
998
1035
|
Flag to enable automatic print conversion. Also enables inverse
|
|
@@ -1283,17 +1320,7 @@ Extract all meta information from an image.
|
|
|
1283
1320
|
|
|
1284
1321
|
L</ExtractInfo> takes exactly the same arguments as L</ImageInfo>. The only
|
|
1285
1322
|
difference is that a list of tag keys is not returned if an ARRAY reference
|
|
1286
|
-
is given.
|
|
1287
|
-
L</ExtractInfo>:
|
|
1288
|
-
|
|
1289
|
-
Binary, Charset, CharsetEXIF, CharsetFileName, CharsetID3, CharsetIPTC,
|
|
1290
|
-
CharsetPhotoshop, CharsetQuickTime, CharsetRIFF, Composite, ExtendedXMP,
|
|
1291
|
-
ExtractEmbedded, FastScan, FixBase, HtmlDump, HtmlDumpBase, IgnoreGroups,
|
|
1292
|
-
IgnoreMinorErrors, IgnoreTags, Lang, LargeFileSupport, MakerNotes,
|
|
1293
|
-
MDItemTags, NoPDFList, Password, QuickTimeUTC (enforced 1904 time zero),
|
|
1294
|
-
RequestAll, RequestTags, SaveBin, SaveFormat, SavePath, ScanForXMP, Struct,
|
|
1295
|
-
TextOut, Unknown, Verbose, WindowsLongPath, WindowsWideFile, XAttrTags and
|
|
1296
|
-
XMPAutoConv.
|
|
1323
|
+
is given.
|
|
1297
1324
|
|
|
1298
1325
|
=item Return Value:
|
|
1299
1326
|
|
|
@@ -1325,11 +1352,7 @@ L</ImageInfo>.
|
|
|
1325
1352
|
=item Inputs:
|
|
1326
1353
|
|
|
1327
1354
|
Inputs are the same as L</ExtractInfo> and L</ImageInfo> except that an
|
|
1328
|
-
image can not be specified.
|
|
1329
|
-
|
|
1330
|
-
Charset, CoordFormat, DateFormat, Duplicates, Escape, Exclude, Filter,
|
|
1331
|
-
Group#, GlobalTimeShift, Lang, ListItem, ListJoin, PrintConv, Sort (if a tag
|
|
1332
|
-
list reference is given) and StrictDate.
|
|
1355
|
+
image can not be specified.
|
|
1333
1356
|
|
|
1334
1357
|
=item Return Value:
|
|
1335
1358
|
|
|
@@ -1337,13 +1360,6 @@ Reference to information hash, the same as with L</ImageInfo>.
|
|
|
1337
1360
|
|
|
1338
1361
|
=back
|
|
1339
1362
|
|
|
1340
|
-
The following options are effective in the call to L</GetInfo>:
|
|
1341
|
-
|
|
1342
|
-
Charset, CoordFormat, DateFormat, Duplicates, Escape, Exclude, Filter,
|
|
1343
|
-
Group#, GlobalTimeShift, Lang, ListItem, ListJoin, PrintConv, QuickTimeUTC
|
|
1344
|
-
(conversion to local time), Sort (if a tag list reference is given) and
|
|
1345
|
-
StrictDate.
|
|
1346
|
-
|
|
1347
1363
|
=head2 WriteInfo
|
|
1348
1364
|
|
|
1349
1365
|
Write meta information to a file. The specified source file is rewritten to
|
|
@@ -1428,13 +1444,6 @@ called with a source file name.
|
|
|
1428
1444
|
|
|
1429
1445
|
=back
|
|
1430
1446
|
|
|
1431
|
-
The following ExifTool options are effective in the call to L</WriteInfo>:
|
|
1432
|
-
|
|
1433
|
-
ByteOrder, Charset, CharsetEXIF, CharsetFileName, CharsetIPTC, Compact,
|
|
1434
|
-
Compress, FixBase, IgnoreMinorErrors, NoMultiExif, NoPDFList, Password,
|
|
1435
|
-
QuickTimeHandler, QuickTimePad, Verbose, WindowsLongPath, WindowsWideFile
|
|
1436
|
-
and WriteMode.
|
|
1437
|
-
|
|
1438
1447
|
=head2 GetTagList
|
|
1439
1448
|
|
|
1440
1449
|
Get a sorted list of tags from the specified information hash or tag list.
|
|
@@ -1557,12 +1566,6 @@ optional group specifier), use L</GetInfo> instead.
|
|
|
1557
1566
|
|
|
1558
1567
|
my @keywords = $exifTool->GetValue('Keywords', 'ValueConv');
|
|
1559
1568
|
|
|
1560
|
-
The following options are in effect when L</GetValue> is called:
|
|
1561
|
-
|
|
1562
|
-
Charset, CoordFormat, DateFormat, Escape, Filter, GlobalTimeShift, Lang,
|
|
1563
|
-
ListItem, ListJoin, PrintConv, QuickTimeUTC (conversion to local time),
|
|
1564
|
-
StrictDate and TimeZone.
|
|
1565
|
-
|
|
1566
1569
|
=over 4
|
|
1567
1570
|
|
|
1568
1571
|
=item Inputs:
|
|
@@ -1816,11 +1819,6 @@ explicitly, either by group (with 'Adobe:*') or as a block (with 'Adobe').
|
|
|
1816
1819
|
|
|
1817
1820
|
=back
|
|
1818
1821
|
|
|
1819
|
-
The following ExifTool options are effective in the call to L</SetNewValue>:
|
|
1820
|
-
|
|
1821
|
-
Charset, DateFormat, Escape, IgnoreMinorErrors, Lang, ListJoin, ListSplit,
|
|
1822
|
-
PrintConv, QuickTimeUTC, StrictDate, TimeZone, Verbose and WriteMode.
|
|
1823
|
-
|
|
1824
1822
|
=head2 GetNewValue
|
|
1825
1823
|
|
|
1826
1824
|
Get the new Raw value for a tag. This is the value set by L</SetNewValue>
|