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
package/bin/README.txt
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
ExifTool package for 64-bit Windows
|
|
3
|
-
___________________________________
|
|
4
|
-
|
|
5
|
-
Double-click on "exiftool(-k).exe" to read the application documentation, or
|
|
6
|
-
drag-and-drop files to extract metadata.
|
|
7
|
-
|
|
8
|
-
For command-line use, rename to "exiftool.exe".
|
|
9
|
-
|
|
10
|
-
Run directly in from the exiftool-##.##_64 folder, or copy the .exe and the
|
|
11
|
-
"exiftool_files" folder to wherever you want (preferably somewhere in your
|
|
12
|
-
PATH) to run from there.
|
|
13
|
-
|
|
14
|
-
See https://exiftool.org/install.html for more installation instructions.
|
|
1
|
+
|
|
2
|
+
ExifTool package for 64-bit Windows
|
|
3
|
+
___________________________________
|
|
4
|
+
|
|
5
|
+
Double-click on "exiftool(-k).exe" to read the application documentation, or
|
|
6
|
+
drag-and-drop files to extract metadata.
|
|
7
|
+
|
|
8
|
+
For command-line use, rename to "exiftool.exe".
|
|
9
|
+
|
|
10
|
+
Run directly in from the exiftool-##.##_64 folder, or copy the .exe and the
|
|
11
|
+
"exiftool_files" folder to wherever you want (preferably somewhere in your
|
|
12
|
+
PATH) to run from there.
|
|
13
|
+
|
|
14
|
+
See https://exiftool.org/install.html for more installation instructions.
|
package/bin/exiftool.exe
CHANGED
|
Binary file
|
|
@@ -11,7 +11,9 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '13.
|
|
14
|
+
my $version = '13.26';
|
|
15
|
+
|
|
16
|
+
$^W = 1; # enable global warnings
|
|
15
17
|
|
|
16
18
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
19
|
my $exePath;
|
|
@@ -43,7 +45,7 @@ sub EncodeXML($);
|
|
|
43
45
|
sub FormatXML($$$);
|
|
44
46
|
sub EscapeJSON($;$);
|
|
45
47
|
sub FormatJSON($$$;$);
|
|
46
|
-
sub PrintCSV();
|
|
48
|
+
sub PrintCSV(;$);
|
|
47
49
|
sub AddGroups($$$$);
|
|
48
50
|
sub ConvertBinary($);
|
|
49
51
|
sub IsEqual($$);
|
|
@@ -181,6 +183,7 @@ my $outFormat; # -1=Canon format, 0=same-line, 1=tag names, 2=values only
|
|
|
181
183
|
my $outOpt; # output file or directory name
|
|
182
184
|
my $overwriteOrig; # flag to overwrite original file (1=overwrite, 2=in place)
|
|
183
185
|
my $pause; # pause before returning
|
|
186
|
+
my $plot; # flag for plot output format
|
|
184
187
|
my $preserveTime; # flag to preserve times of updated files (2=preserve FileCreateDate only)
|
|
185
188
|
my $progress; # flag to calculate total files to process (0=calculate but don't display)
|
|
186
189
|
my $progressCount; # count of files processed
|
|
@@ -208,6 +211,7 @@ my $structOpt; # output structured XMP information (JSON and XML output onl
|
|
|
208
211
|
my $tabFormat; # non-zero for tab output format
|
|
209
212
|
my $tagOut; # flag for separate text output file for each tag
|
|
210
213
|
my $textOut; # extension for text output file (or undef for no output)
|
|
214
|
+
my $textOut2; # complete file name for single text output file
|
|
211
215
|
my $textOverwrite; # flag to overwrite existing text output file (2=append, 3=over+append)
|
|
212
216
|
my $tmpFile; # temporary file to delete on exit
|
|
213
217
|
my $tmpText; # temporary text file
|
|
@@ -472,8 +476,8 @@ undef %filterExt;
|
|
|
472
476
|
undef %ignore;
|
|
473
477
|
undef %outComma;
|
|
474
478
|
undef %outTrailer;
|
|
475
|
-
undef %printFmt;
|
|
476
479
|
undef %preserveTime;
|
|
480
|
+
undef %printFmt;
|
|
477
481
|
undef %seqFileDir;
|
|
478
482
|
undef %setTags;
|
|
479
483
|
undef %setTagsList;
|
|
@@ -1189,6 +1193,7 @@ for (;;) {
|
|
|
1189
1193
|
}
|
|
1190
1194
|
/^overwrite_original$/i and $overwriteOrig = 1, next;
|
|
1191
1195
|
/^overwrite_original_in_place$/i and $overwriteOrig = 2, next;
|
|
1196
|
+
/^plot$/i and require Image::ExifTool::Plot and $plot = Image::ExifTool::Plot->new, next;
|
|
1192
1197
|
if (/^p(-?)$/ or /^printformat(-?)$/i) {
|
|
1193
1198
|
my $fmt = shift;
|
|
1194
1199
|
if ($pass) {
|
|
@@ -1404,7 +1409,8 @@ for (;;) {
|
|
|
1404
1409
|
# add geotag/geosync/geolocate commands first
|
|
1405
1410
|
unshift @newValues, pop @newValues;
|
|
1406
1411
|
if (lc $2 eq 'geotag' and (not defined $addGeotime or $addGeotime) and length $val) {
|
|
1407
|
-
$addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal#'
|
|
1412
|
+
$addGeotime = [ ($1 || '') . 'Geotime<DateTimeOriginal#',
|
|
1413
|
+
($1 || '') . 'Geotime<SubSecDateTimeOriginal#' ];
|
|
1408
1414
|
}
|
|
1409
1415
|
}
|
|
1410
1416
|
}
|
|
@@ -1495,38 +1501,34 @@ unless ((@tags and not $outOpt) or @files or @newValues or $geoOnly) {
|
|
|
1495
1501
|
if (defined $deleteOrig and (@newValues or @tags)) {
|
|
1496
1502
|
if (not @newValues) {
|
|
1497
1503
|
my $verb = $deleteOrig ? 'deleting' : 'restoring from';
|
|
1498
|
-
|
|
1504
|
+
Error "Can't specify tags when $verb originals\n";
|
|
1499
1505
|
} elsif ($deleteOrig) {
|
|
1500
|
-
|
|
1501
|
-
|
|
1506
|
+
Error "Can't use -delete_original when writing.\n";
|
|
1507
|
+
Error "Maybe you meant -overwrite_original ?\n";
|
|
1502
1508
|
} else {
|
|
1503
|
-
|
|
1509
|
+
Error "It makes no sense to use -restore_original when writing\n";
|
|
1504
1510
|
}
|
|
1505
|
-
$rtnVal = 1;
|
|
1506
1511
|
next;
|
|
1507
1512
|
}
|
|
1508
1513
|
|
|
1509
1514
|
if ($overwriteOrig > 1 and $outOpt) {
|
|
1510
|
-
|
|
1511
|
-
$rtnVal = 1;
|
|
1515
|
+
Error "Can't overwrite in place when -o option is used\n";
|
|
1512
1516
|
next;
|
|
1513
1517
|
}
|
|
1514
1518
|
|
|
1515
|
-
if (($tagOut or defined $diff) and ($csv or $json or %printFmt or $tabFormat or $xml or
|
|
1519
|
+
if (($tagOut or defined $diff) and ($csv or $json or %printFmt or $tabFormat or $xml or $plot or
|
|
1516
1520
|
($verbose and $html)))
|
|
1517
1521
|
{
|
|
1518
1522
|
my $opt = $tagOut ? '-W' : '-diff';
|
|
1519
|
-
|
|
1520
|
-
$rtnVal = 1;
|
|
1523
|
+
Error "Sorry, $opt may not be combined with -csv, -htmlDump, -j, -p, -t or -X\n";
|
|
1521
1524
|
next;
|
|
1522
1525
|
}
|
|
1523
1526
|
|
|
1524
1527
|
if ($csv and $csv eq 'CSV' and not $isWriting) {
|
|
1525
1528
|
$json = 0; # (not compatible)
|
|
1526
1529
|
if ($textOut) {
|
|
1527
|
-
|
|
1528
|
-
$
|
|
1529
|
-
next;
|
|
1530
|
+
$textOut2 = $textOut;
|
|
1531
|
+
undef $textOut;
|
|
1530
1532
|
}
|
|
1531
1533
|
if ($binaryOutput) {
|
|
1532
1534
|
$binaryOutput = 0;
|
|
@@ -1538,6 +1540,32 @@ if ($csv and $csv eq 'CSV' and not $isWriting) {
|
|
|
1538
1540
|
}
|
|
1539
1541
|
require Image::ExifTool::XMP if $setCharset;
|
|
1540
1542
|
}
|
|
1543
|
+
if ($plot and $textOut) {
|
|
1544
|
+
$textOut2 = $textOut;
|
|
1545
|
+
undef $textOut;
|
|
1546
|
+
}
|
|
1547
|
+
if ($textOut2) {
|
|
1548
|
+
if ($textOverwrite > 1) {
|
|
1549
|
+
Error "Can not append to multi-file output format\n";
|
|
1550
|
+
undef $textOut2;
|
|
1551
|
+
next;
|
|
1552
|
+
}
|
|
1553
|
+
if (not $textOverwrite and $mt->Exists($textOut2, 1)) {
|
|
1554
|
+
Error "Output file $textOut2 already exists\n";
|
|
1555
|
+
undef $textOut2;
|
|
1556
|
+
next;
|
|
1557
|
+
}
|
|
1558
|
+
# make sure we can write the output text file before processing all input files
|
|
1559
|
+
CreateDirectory($textOut2); # create directory if necessary
|
|
1560
|
+
if ($mt->Open(\*OUTFILE, $textOut2, '>')) {
|
|
1561
|
+
close(\*OUTFILE);
|
|
1562
|
+
unlink($textOut2); # (this was just a test)
|
|
1563
|
+
} else {
|
|
1564
|
+
Error("Error creating $textOut2\n");
|
|
1565
|
+
undef $textOut2;
|
|
1566
|
+
next;
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1541
1569
|
|
|
1542
1570
|
if ($escapeHTML or $json) {
|
|
1543
1571
|
# must be UTF8 for HTML conversion and JSON output
|
|
@@ -1551,7 +1579,7 @@ if ($escapeHTML or $json) {
|
|
|
1551
1579
|
# set sort option
|
|
1552
1580
|
if ($sortOpt) {
|
|
1553
1581
|
# (note that -csv sorts alphabetically by default anyway if more than 1 file)
|
|
1554
|
-
my $sort = ($outFormat > 0 or $xml or $json or $csv) ? 'Tag' : 'Descr';
|
|
1582
|
+
my $sort = ($outFormat > 0 or $xml or $json or $csv or $plot) ? 'Tag' : 'Descr';
|
|
1555
1583
|
$mt->Options(Sort => $sort, Sort2 => $sort);
|
|
1556
1584
|
}
|
|
1557
1585
|
|
|
@@ -1562,7 +1590,11 @@ if ($mt->Options('Struct') and not $structOpt) {
|
|
|
1562
1590
|
}
|
|
1563
1591
|
|
|
1564
1592
|
# set up for RDF/XML, JSON and PHP output formats
|
|
1565
|
-
if ($
|
|
1593
|
+
if ($plot) {
|
|
1594
|
+
undef $joinLists;
|
|
1595
|
+
$mt->Options(List => 1);
|
|
1596
|
+
$plot->Settings($mt->Options('Plot'));
|
|
1597
|
+
} elsif ($xml) {
|
|
1566
1598
|
require Image::ExifTool::XMP; # for EscapeXML()
|
|
1567
1599
|
my $charset = $mt->Options('Charset');
|
|
1568
1600
|
# standard XML encoding names for supported Charset settings
|
|
@@ -1634,11 +1666,10 @@ if (Image::ExifTool::IsPC()) {
|
|
|
1634
1666
|
unless (@files) {
|
|
1635
1667
|
unless ($outOpt) {
|
|
1636
1668
|
if ($doGlob and $doGlob == 2) {
|
|
1637
|
-
|
|
1669
|
+
Error "No matching files\n";
|
|
1638
1670
|
} else {
|
|
1639
|
-
|
|
1671
|
+
Error "No file specified\n";
|
|
1640
1672
|
}
|
|
1641
|
-
$rtnVal = 1;
|
|
1642
1673
|
next;
|
|
1643
1674
|
}
|
|
1644
1675
|
push @files, ''; # create file from nothing
|
|
@@ -1667,8 +1698,9 @@ if (@newValues) {
|
|
|
1667
1698
|
# assume -geotime value if -geotag specified without -geotime
|
|
1668
1699
|
if ($addGeotime) {
|
|
1669
1700
|
AddSetTagsFile($setTagsFile = '@') unless $setTagsFile and $setTagsFile eq '@';
|
|
1670
|
-
push @{$setTags{$setTagsFile}},
|
|
1671
|
-
|
|
1701
|
+
push @{$setTags{$setTagsFile}}, @$addGeotime;
|
|
1702
|
+
my @a = map qq("-$_"), @$addGeotime;
|
|
1703
|
+
$verbose and print $vout 'Arguments ',join(' and ', @a)," are assumed\n";
|
|
1672
1704
|
}
|
|
1673
1705
|
my %setTagsIndex;
|
|
1674
1706
|
# add/delete option lookup
|
|
@@ -1700,8 +1732,7 @@ if (@newValues) {
|
|
|
1700
1732
|
next; # set tags from dynamic file later
|
|
1701
1733
|
}
|
|
1702
1734
|
unless ($mt->Exists($newVal) or $newVal eq '-') {
|
|
1703
|
-
|
|
1704
|
-
$rtnVal = 1;
|
|
1735
|
+
Error "File '${newVal}' does not exist for -tagsFromFile option\n";
|
|
1705
1736
|
next Command;
|
|
1706
1737
|
}
|
|
1707
1738
|
my $setTags = $setTags{$newVal};
|
|
@@ -1765,19 +1796,20 @@ if (@newValues) {
|
|
|
1765
1796
|
}
|
|
1766
1797
|
}
|
|
1767
1798
|
unless ($isWriting or $outOpt or @tags) {
|
|
1768
|
-
|
|
1769
|
-
$rtnVal = 1;
|
|
1799
|
+
Error "Nothing to do.\n";
|
|
1770
1800
|
next;
|
|
1771
1801
|
}
|
|
1772
1802
|
} elsif (grep /^(\*:)?\*$/, @exclude) {
|
|
1773
|
-
|
|
1774
|
-
$rtnVal = 1;
|
|
1803
|
+
Error "All tags excluded -- nothing to do.\n";
|
|
1775
1804
|
next;
|
|
1776
1805
|
}
|
|
1777
1806
|
if ($isWriting) {
|
|
1778
1807
|
if (defined $diff) {
|
|
1779
1808
|
Error "Can't use -diff option when writing tags\n";
|
|
1780
1809
|
next;
|
|
1810
|
+
} elsif ($plot) {
|
|
1811
|
+
Error "Can't use -plot option when writing tags\n";
|
|
1812
|
+
next;
|
|
1781
1813
|
} elsif (@tags and not $outOpt and not $csv) {
|
|
1782
1814
|
my ($tg, $s) = @tags > 1 ? ("$tags[0] ...", 's') : ($tags[0], '');
|
|
1783
1815
|
Warn "Ignored superfluous tag name$s or invalid option$s: -$tg\n";
|
|
@@ -1926,9 +1958,6 @@ ProcessFiles($mt);
|
|
|
1926
1958
|
|
|
1927
1959
|
Error "No file with specified extension\n" if $filtered and not $validFile;
|
|
1928
1960
|
|
|
1929
|
-
# print CSV information if necessary
|
|
1930
|
-
PrintCSV() if $csv and not $isWriting;
|
|
1931
|
-
|
|
1932
1961
|
# print folder/file trailer if necessary
|
|
1933
1962
|
if ($textOut) {
|
|
1934
1963
|
foreach (keys %outTrailer) {
|
|
@@ -1944,6 +1973,37 @@ if ($textOut) {
|
|
|
1944
1973
|
} else {
|
|
1945
1974
|
print $sectTrailer if $sectTrailer;
|
|
1946
1975
|
print $fileTrailer if $fileTrailer and not $fileHeader;
|
|
1976
|
+
# print CSV or SVG output file if necessary
|
|
1977
|
+
my ($fp, $err);
|
|
1978
|
+
if ($textOut2) {
|
|
1979
|
+
if ($mt->Open(\*OUTFILE, $textOut2, '>')) {
|
|
1980
|
+
$fp = \*OUTFILE;
|
|
1981
|
+
} else {
|
|
1982
|
+
Error("Error creating $textOut2\n");
|
|
1983
|
+
$err = 1;
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
unless ($err) {
|
|
1987
|
+
PrintCSV($fp) if $csv and not $isWriting;
|
|
1988
|
+
# print SVG plot
|
|
1989
|
+
if ($plot) {
|
|
1990
|
+
$plot->Draw($fp || \*STDOUT);
|
|
1991
|
+
if ($$plot{Error}) {
|
|
1992
|
+
Error("Error: $$plot{Error}\n");
|
|
1993
|
+
$err = 1;
|
|
1994
|
+
} elsif ($$plot{Warn}) {
|
|
1995
|
+
Warn("Warning: $$plot{Warn}\n");
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
if ($fp) {
|
|
2000
|
+
close($fp) or $err = 1;
|
|
2001
|
+
if ($err) {
|
|
2002
|
+
$mt->Unlink($textOut2);
|
|
2003
|
+
} else {
|
|
2004
|
+
$created{$textOut2} = 1;
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
1947
2007
|
}
|
|
1948
2008
|
|
|
1949
2009
|
my $totWr = $countGoodWr + $countBadWr + $countSameWr + $countCopyWr +
|
|
@@ -1988,7 +2048,7 @@ if (defined $deleteOrig) {
|
|
|
1988
2048
|
# print summary
|
|
1989
2049
|
my $tot = $count + $countBad;
|
|
1990
2050
|
if ($countDir or $totWr or $countFailed or $tot > 1 or $textOut or %countLink) {
|
|
1991
|
-
my $o = (($html or $json or $xml or %printFmt or $csv) and not $textOut) ? \*STDERR : $vout;
|
|
2051
|
+
my $o = (($html or $json or $xml or %printFmt or $csv or $plot) and not $textOut) ? \*STDERR : $vout;
|
|
1992
2052
|
printf($o "%5d directories scanned\n", $countDir) if $countDir;
|
|
1993
2053
|
printf($o "%5d directories created\n", $countNewDir) if $countNewDir;
|
|
1994
2054
|
printf($o "%5d files failed condition\n", $countFailed) if $countFailed;
|
|
@@ -2000,7 +2060,7 @@ if (defined $deleteOrig) {
|
|
|
2000
2060
|
printf($o "%5d files weren't created due to errors\n", $countBadCr) if $countBadCr;
|
|
2001
2061
|
printf($o "%5d image files read\n", $count) if ($tot+$countFailed)>1 or ($countDir and not $totWr);
|
|
2002
2062
|
printf($o "%5d files could not be read\n", $countBad) if $countBad;
|
|
2003
|
-
printf($o "%5d output files created\n", scalar(keys %created)) if $textOut;
|
|
2063
|
+
printf($o "%5d output files created\n", scalar(keys %created)) if $textOut or $textOut2;
|
|
2004
2064
|
printf($o "%5d output files appended\n", scalar(keys %appended)) if %appended;
|
|
2005
2065
|
printf($o "%5d hard links created\n", $countLink{Hard} || 0) if $countLink{Hard} or $countLink{BadHard};
|
|
2006
2066
|
printf($o "%5d hard links could not be created\n", $countLink{BadHard}) if $countLink{BadHard};
|
|
@@ -2205,7 +2265,7 @@ sub GetImageInfo($$)
|
|
|
2205
2265
|
|
|
2206
2266
|
my $lineCount = 0;
|
|
2207
2267
|
my ($fp, $outfile, $append);
|
|
2208
|
-
if ($textOut and ($verbose or $et->Options('PrintCSV')) and not ($tagOut or defined $diff)) {
|
|
2268
|
+
if ($textOut and ($verbose or $et->Options('PrintCSV')) and not ($tagOut or defined $diff or $plot)) {
|
|
2209
2269
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
|
2210
2270
|
$fp or EFile($file), ++$countBad, return;
|
|
2211
2271
|
# delete file if we exit prematurely (unless appending)
|
|
@@ -2245,7 +2305,7 @@ sub GetImageInfo($$)
|
|
|
2245
2305
|
}
|
|
2246
2306
|
# print file/progress message
|
|
2247
2307
|
my $o;
|
|
2248
|
-
unless ($binaryOutput or $textOut or %printFmt or $html > 1 or $csv) {
|
|
2308
|
+
unless ($binaryOutput or $textOut or %printFmt or $html > 1 or $csv or $plot) {
|
|
2249
2309
|
if ($html) {
|
|
2250
2310
|
require Image::ExifTool::HTML;
|
|
2251
2311
|
my $f = Image::ExifTool::HTML::EscapeHTML($file);
|
|
@@ -2348,7 +2408,7 @@ sub GetImageInfo($$)
|
|
|
2348
2408
|
unless (defined $outfile or $tagOut) {
|
|
2349
2409
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
|
2350
2410
|
$fp or EFile($file), ++$countBad, return;
|
|
2351
|
-
$tmpText = $outfile
|
|
2411
|
+
$tmpText = $outfile if defined $outfile and not $append;
|
|
2352
2412
|
}
|
|
2353
2413
|
|
|
2354
2414
|
# print differences if requested
|
|
@@ -2459,9 +2519,8 @@ T2: foreach $t2 (@tags2) {
|
|
|
2459
2519
|
$done2{$tag2} = 1 if defined $tag2;
|
|
2460
2520
|
}
|
|
2461
2521
|
print $fp "(no metadata differences)\n" unless $wasDiff;
|
|
2462
|
-
undef $tmpText;
|
|
2463
2522
|
if (defined $outfile) {
|
|
2464
|
-
|
|
2523
|
+
$created{$outfile} = 1;
|
|
2465
2524
|
close($fp);
|
|
2466
2525
|
undef $tmpText;
|
|
2467
2526
|
}
|
|
@@ -2536,6 +2595,17 @@ T2: foreach $t2 (@tags2) {
|
|
|
2536
2595
|
delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
|
|
2537
2596
|
my $errs = $et->GetInfo('Warning', 'Error');
|
|
2538
2597
|
PrintErrors($et, $errs, $file) and EFile($file);
|
|
2598
|
+
} elsif ($plot) {
|
|
2599
|
+
# add points from this file to the plot
|
|
2600
|
+
my $tagExtra = $$et{TAG_EXTRA};
|
|
2601
|
+
my ($tag, %docNum);
|
|
2602
|
+
foreach $tag (keys %$info) {
|
|
2603
|
+
next unless $$tagExtra{$tag} and $$tagExtra{$tag}{G3};
|
|
2604
|
+
$docNum{$tag} = $1 if $$tagExtra{$tag}{G3} =~ /(\d+)/;
|
|
2605
|
+
}
|
|
2606
|
+
$$plot{DocNum} = \%docNum;
|
|
2607
|
+
$$plot{EE} = 1 if $et->Options('ExtractEmbedded');
|
|
2608
|
+
$plot->AddPoints($info, \@foundTags);
|
|
2539
2609
|
} elsif (not $disableOutput) {
|
|
2540
2610
|
my ($tag, $line, %noDups, %csvInfo, $bra, $ket, $sep, $quote);
|
|
2541
2611
|
if ($fp) {
|
|
@@ -3768,8 +3838,10 @@ sub FormatCSV($)
|
|
|
3768
3838
|
|
|
3769
3839
|
#------------------------------------------------------------------------------
|
|
3770
3840
|
# Print accumulated CSV information
|
|
3771
|
-
|
|
3841
|
+
# Inputs: 0) file ref
|
|
3842
|
+
sub PrintCSV(;$)
|
|
3772
3843
|
{
|
|
3844
|
+
my $fp = shift || \*STDOUT;
|
|
3773
3845
|
my ($file, $lcTag, @tags);
|
|
3774
3846
|
|
|
3775
3847
|
@csvTags or @csvTags = sort keys %csvTags;
|
|
@@ -3777,7 +3849,7 @@ sub PrintCSV()
|
|
|
3777
3849
|
foreach $lcTag (@csvTags) {
|
|
3778
3850
|
push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
|
|
3779
3851
|
}
|
|
3780
|
-
print join($csvDelim, 'SourceFile', @tags), "\n";
|
|
3852
|
+
print $fp join($csvDelim, 'SourceFile', @tags), "\n";
|
|
3781
3853
|
my $empty = defined($forcePrint) ? $forcePrint : '';
|
|
3782
3854
|
foreach $file (@csvFiles) {
|
|
3783
3855
|
my @vals = (FormatCSV($file)); # start with full file name
|
|
@@ -3788,7 +3860,7 @@ sub PrintCSV()
|
|
|
3788
3860
|
defined $val or push(@vals,$empty), next;
|
|
3789
3861
|
push @vals, FormatCSV($val);
|
|
3790
3862
|
}
|
|
3791
|
-
print join($csvDelim, @vals), "\n";
|
|
3863
|
+
print $fp join($csvDelim, @vals), "\n";
|
|
3792
3864
|
}
|
|
3793
3865
|
}
|
|
3794
3866
|
|
|
@@ -4122,9 +4194,8 @@ sub ProcessFiles($;$)
|
|
|
4122
4194
|
$filtered = 1;
|
|
4123
4195
|
Progress($vout, "-------- $file (wrong extension)") if $verbose;
|
|
4124
4196
|
} else {
|
|
4125
|
-
|
|
4197
|
+
Error "Error: File not found - $file\n";
|
|
4126
4198
|
FileNotFound($file);
|
|
4127
|
-
$rtnVal = 1;
|
|
4128
4199
|
}
|
|
4129
4200
|
} else {
|
|
4130
4201
|
$validFile = 1;
|
|
@@ -4883,7 +4954,7 @@ sub PrintTagList($@)
|
|
|
4883
4954
|
my $msg = shift;
|
|
4884
4955
|
print $msg, ":\n" unless $quiet;
|
|
4885
4956
|
my $tag;
|
|
4886
|
-
if ($outFormat < 0 and $msg =~ /file extensions$/ and @_) {
|
|
4957
|
+
if (($outFormat < 0 or $verbose) and $msg =~ /file extensions$/ and @_) {
|
|
4887
4958
|
foreach $tag (@_) {
|
|
4888
4959
|
printf(" %-11s %s\n", $tag, GetFileType($tag, 1));
|
|
4889
4960
|
}
|
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool::Exif;
|
|
17
17
|
use Image::ExifTool::PLIST;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.15';
|
|
20
20
|
|
|
21
21
|
sub ConvertPLIST($$);
|
|
22
22
|
|
|
@@ -307,7 +307,17 @@ sub ConvertPLIST($$);
|
|
|
307
307
|
Name => 'Apple_0x004f',
|
|
308
308
|
Unknown => 1,
|
|
309
309
|
ValueConv => \&ConvertPLIST,
|
|
310
|
-
}
|
|
310
|
+
},
|
|
311
|
+
0x0054 => {
|
|
312
|
+
Name => 'Apple_0x0054',
|
|
313
|
+
Unknown => 1,
|
|
314
|
+
ValueConv => \&ConvertPLIST,
|
|
315
|
+
},
|
|
316
|
+
0x005a => {
|
|
317
|
+
Name => 'Apple_0x005a',
|
|
318
|
+
Unknown => 1,
|
|
319
|
+
ValueConv => \&ConvertPLIST,
|
|
320
|
+
},
|
|
311
321
|
);
|
|
312
322
|
|
|
313
323
|
# PLIST-format CMTime structure (ref PH)
|
|
@@ -1795,8 +1795,8 @@ sub NumbersFirst($$)
|
|
|
1795
1795
|
my ($a2, $b2) = ($a, $b);
|
|
1796
1796
|
# expand numbers to 3 digits (with restrictions to avoid messing up
|
|
1797
1797
|
# ascii-hex tags -- Nikon LensID's are 23 characters long)
|
|
1798
|
-
$a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ |dvtm_
|
|
1799
|
-
$b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ |dvtm_
|
|
1798
|
+
$a2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $a2 =~ /^(APP|DMC-\w+ |dvtm_.*|(IDB|SHB)-)?[.0-9 ]*$/ and length($a2)<23;
|
|
1799
|
+
$b2 =~ s/(\d+)/sprintf("%.3d",$1)/eg if $b2 =~ /^(APP|DMC-\w+ |dvtm_.*|(IDB|SHB)-)?[.0-9 ]*$/ and length($b2)<23;
|
|
1800
1800
|
$caseInsensitive and $rtnVal = (lc($a2) cmp lc($b2));
|
|
1801
1801
|
$rtnVal or $rtnVal = ($a2 cmp $b2);
|
|
1802
1802
|
}
|
|
@@ -2053,7 +2053,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
2053
2053
|
# 0x4014 (similar to 0x83?)
|
|
2054
2054
|
0x4015 => [{
|
|
2055
2055
|
Name => 'VignettingCorr', # (LensPacket)
|
|
2056
|
-
Condition => '$$valPt =~ /^\0/ and $$valPt !~
|
|
2056
|
+
Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^(\0\0\0\0|\x00\x40\xdc\x05)/', # (data may be all zeros for 60D)
|
|
2057
2057
|
SubDirectory => {
|
|
2058
2058
|
# (the size word is at byte 2 in this structure)
|
|
2059
2059
|
Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
|
|
@@ -2061,7 +2061,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
2061
2061
|
},
|
|
2062
2062
|
},{
|
|
2063
2063
|
Name => 'VignettingCorrUnknown1',
|
|
2064
|
-
Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~
|
|
2064
|
+
Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^(\0\0\0\0|\x02\x50\x7c\x04)/',
|
|
2065
2065
|
SubDirectory => {
|
|
2066
2066
|
# (the size word is at byte 2 in this structure)
|
|
2067
2067
|
Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
|
|
@@ -4758,6 +4758,7 @@ my %ciMaxFocal = (
|
|
|
4758
4758
|
Format => 'int32u',
|
|
4759
4759
|
Notes => 'includes electronic + mechanical shutter',
|
|
4760
4760
|
},
|
|
4761
|
+
# 0x0b5a - related to image stabilization (ref forum17239) (R5)
|
|
4761
4762
|
# 0x0bb7 - counts down during focus stack (ref forum16111)
|
|
4762
4763
|
);
|
|
4763
4764
|
|
|
@@ -854,7 +854,7 @@ sub ProcessCRW($$)
|
|
|
854
854
|
|
|
855
855
|
# process trailers if they exist in CRW file (not in CIFF information!)
|
|
856
856
|
if ($$et{FILE_TYPE} eq 'CRW') {
|
|
857
|
-
my $trailInfo =
|
|
857
|
+
my $trailInfo = $et->IdentifyTrailer($raf);
|
|
858
858
|
$et->ProcessTrailers($trailInfo) if $trailInfo;
|
|
859
859
|
}
|
|
860
860
|
|