exiftool_vendored 11.97.0 → 11.98.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +10 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +78 -40
- data/bin/lib/Image/ExifTool.pm +1 -1
- data/bin/lib/Image/ExifTool/Canon.pm +3 -2
- data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
- data/bin/lib/Image/ExifTool/M2TS.pm +43 -23
- data/bin/lib/Image/ExifTool/Nikon.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +11 -2
- data/bin/lib/Image/ExifTool/RIFF.pm +15 -3
- data/bin/lib/Image/ExifTool/Sony.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +1 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +2 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd206618b02e9bdc096dbaf8dc497c6bce6a27e5782b42db0a308ba043752c49
|
4
|
+
data.tar.gz: 783ecd5157f77b7f56d7c85a3ddcb86aebc170e6e937ebfacfa7141a90f74cd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4e18ca046d054a9a06289921a7ebd70801a64f3ac133de19156969077a1618841926104c9eef4cfdcd57ead9aed13ef2b1cd53b16a7b204fd6bba4342b633ef
|
7
|
+
data.tar.gz: 397e4a867443f593c3d73be6e549e9b0df9256ef551cad3ff39ef335bada1a47bf63fcdc58435672f39873418d74ecfec7ecc385008da471cd6cb34904f5c26a
|
data/bin/Changes
CHANGED
@@ -7,6 +7,16 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 11.85. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to CPAN.)
|
9
9
|
|
10
|
+
May 1, 2020 - Version 11.98
|
11
|
+
|
12
|
+
- Added a new Nikon LensID (thanks Warren Hatch)
|
13
|
+
- Added a new Sony LensType (thanks LibRaw)
|
14
|
+
- Added a new Canon LensType
|
15
|
+
- Patched to extract EXIF with an "Exif\0\0" header from WebP images
|
16
|
+
- Enhanced -efile option and added to the documentation
|
17
|
+
- Minor tweak to -htmlDump output (disallow locking of empty selection)
|
18
|
+
- Fixed problem determining Duration of some M2TS videos
|
19
|
+
|
10
20
|
Apr. 27, 2020 - Version 11.97
|
11
21
|
|
12
22
|
- Added experimental -efile option (undocumented)
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -105,8 +105,8 @@ your home directory, then you would type the following commands in a
|
|
105
105
|
terminal window to extract and run ExifTool:
|
106
106
|
|
107
107
|
cd ~/Desktop
|
108
|
-
gzip -dc Image-ExifTool-11.
|
109
|
-
cd Image-ExifTool-11.
|
108
|
+
gzip -dc Image-ExifTool-11.98.tar.gz | tar -xf -
|
109
|
+
cd Image-ExifTool-11.98
|
110
110
|
./exiftool t/images/ExifTool.jpg
|
111
111
|
|
112
112
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
use strict;
|
11
11
|
require 5.004;
|
12
12
|
|
13
|
-
my $version = '11.
|
13
|
+
my $version = '11.98';
|
14
14
|
|
15
15
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
16
16
|
my $exeDir;
|
@@ -90,6 +90,7 @@ my @csvFiles; # list of files when reading with CSV option (in ExifTool Ch
|
|
90
90
|
my @csvTags; # order of tags for first file with CSV option (lower case)
|
91
91
|
my @delFiles; # list of files to delete
|
92
92
|
my @dynamicFiles; # list of -tagsFromFile files with dynamic names and -TAG<=FMT pairs
|
93
|
+
my @efile; # files for writing list of error/fail/same file names
|
93
94
|
my @exclude; # list of excluded tags
|
94
95
|
my (@echo3, @echo4);# stdout and stderr echo after processing is complete
|
95
96
|
my @files; # list of files and directories to scan
|
@@ -140,8 +141,6 @@ my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o
|
|
140
141
|
my $disableOutput; # flag to disable normal output
|
141
142
|
my $doSetFileName; # flag set if FileName may be written
|
142
143
|
my $doUnzip; # flag to extract info from .gz and .bz2 files
|
143
|
-
my $efile; # file for writing list of error file names
|
144
|
-
my $efile2; # file for writing list of failed file names
|
145
144
|
my $escapeC; # C-style escape
|
146
145
|
my $escapeHTML; # flag to escape printed values for html
|
147
146
|
my $evalWarning; # warning from eval
|
@@ -242,7 +241,8 @@ my %optArgs = (
|
|
242
241
|
'-d' => 1, '-dateformat' => 1,
|
243
242
|
'-D' => 0, # necessary to avoid matching lower-case equivalent
|
244
243
|
'-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
|
245
|
-
'-efile' => 1, '-efile1' => 1, '-efile2' => 1,
|
244
|
+
'-efile' => 1, '-efile1' => 1, '-efile2' => 1, '-efile3' => 1, '-efile4' => 1,
|
245
|
+
'-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
|
246
246
|
'-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
|
247
247
|
'-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
|
248
248
|
'-fileorder' => 1,
|
@@ -409,6 +409,7 @@ undef @delFiles;
|
|
409
409
|
undef @dynamicFiles;
|
410
410
|
undef @echo3;
|
411
411
|
undef @echo4;
|
412
|
+
undef @efile;
|
412
413
|
undef @exclude;
|
413
414
|
undef @files;
|
414
415
|
undef @newValues;
|
@@ -442,8 +443,6 @@ undef $deleteOrig;
|
|
442
443
|
undef $disableOutput;
|
443
444
|
undef $doSetFileName;
|
444
445
|
undef $doUnzip;
|
445
|
-
undef $efile;
|
446
|
-
undef $efile2;
|
447
446
|
undef $escapeHTML;
|
448
447
|
undef $escapeC;
|
449
448
|
undef $evalWarning;
|
@@ -873,13 +872,13 @@ for (;;) {
|
|
873
872
|
$mt->Options(Duplicates => 1);
|
874
873
|
next;
|
875
874
|
}
|
876
|
-
if (/^efile(
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
875
|
+
if (/^efile(\d)?(!)?$/i) {
|
876
|
+
my $arg = shift;
|
877
|
+
defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
|
878
|
+
$efile[0] = $arg if not $1 or $1 & 0x01;
|
879
|
+
$efile[1] = $arg if $1 and $1 & 0x02;
|
880
|
+
$efile[2] = $arg if $1 and $1 & 0x04;
|
881
|
+
unlink $arg if $2;
|
883
882
|
next;
|
884
883
|
}
|
885
884
|
# (-execute handled at top of loop)
|
@@ -1925,6 +1924,7 @@ sub GetImageInfo($$)
|
|
1925
1924
|
if (@condition) {
|
1926
1925
|
unless ($file eq '-' or $et->Exists($file)) {
|
1927
1926
|
Warn "Error: File not found - $file\n";
|
1927
|
+
EFile($file);
|
1928
1928
|
FileNotFound($file);
|
1929
1929
|
++$countBad;
|
1930
1930
|
return;
|
@@ -1970,15 +1970,7 @@ sub GetImageInfo($$)
|
|
1970
1970
|
}
|
1971
1971
|
unless ($result) {
|
1972
1972
|
$verbose and print $vout "-------- $file (failed condition)$progStr\n";
|
1973
|
-
|
1974
|
-
if ($et->Open(\*FAIL_FILE, $efile2, '>>')) {
|
1975
|
-
print FAIL_FILE $file, "\n" or Warn("Error writing to $efile2\n"), undef $efile2;
|
1976
|
-
close FAIL_FILE;
|
1977
|
-
} else {
|
1978
|
-
Warn("Error opening '${efile2}' for append\n");
|
1979
|
-
undef $efile2;
|
1980
|
-
}
|
1981
|
-
}
|
1973
|
+
EFile($file, 2);
|
1982
1974
|
++$countFailed;
|
1983
1975
|
return;
|
1984
1976
|
}
|
@@ -1999,6 +1991,7 @@ sub GetImageInfo($$)
|
|
1999
1991
|
++$countGoodWr;
|
2000
1992
|
} else {
|
2001
1993
|
Warn "Error renaming $original\n";
|
1994
|
+
EFile($file);
|
2002
1995
|
++$countBad;
|
2003
1996
|
}
|
2004
1997
|
return;
|
@@ -2009,7 +2002,7 @@ sub GetImageInfo($$)
|
|
2009
2002
|
my ($fp, $outfile, $append);
|
2010
2003
|
if ($textOut and $verbose and not $tagOut) {
|
2011
2004
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2012
|
-
$fp or ++$countBad, return;
|
2005
|
+
$fp or EFile($file), ++$countBad, return;
|
2013
2006
|
# delete file if we exit prematurely (unless appending)
|
2014
2007
|
$tmpText = $outfile unless $append;
|
2015
2008
|
$et->Options(TextOut => $fp);
|
@@ -2041,6 +2034,7 @@ sub GetImageInfo($$)
|
|
2041
2034
|
Warn "Error: File not found - $file\n";
|
2042
2035
|
FileNotFound($file);
|
2043
2036
|
$outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
|
2037
|
+
EFile($file);
|
2044
2038
|
++$countBad;
|
2045
2039
|
return;
|
2046
2040
|
}
|
@@ -2090,6 +2084,7 @@ sub GetImageInfo($$)
|
|
2090
2084
|
}
|
2091
2085
|
if ($info->{Error}) {
|
2092
2086
|
Warn "Error: $info->{Error} - $file\n";
|
2087
|
+
EFile($file);
|
2093
2088
|
++$countBad;
|
2094
2089
|
return;
|
2095
2090
|
}
|
@@ -2100,7 +2095,7 @@ sub GetImageInfo($$)
|
|
2100
2095
|
# or if there is none of the requested information available
|
2101
2096
|
if ($binaryOutput or not %$info) {
|
2102
2097
|
my $errs = $et->GetInfo('Warning', 'Error');
|
2103
|
-
PrintErrors($et, $errs, $file) and $rtnVal = 1;
|
2098
|
+
PrintErrors($et, $errs, $file) and EFile($file), $rtnVal = 1;
|
2104
2099
|
} elsif ($et->GetValue('Error') or ($$et{Validate} and $et->GetValue('Warning'))) {
|
2105
2100
|
$rtnVal = 1;
|
2106
2101
|
}
|
@@ -2108,7 +2103,7 @@ sub GetImageInfo($$)
|
|
2108
2103
|
# open output file (or stdout if no output file) if not done already
|
2109
2104
|
unless ($outfile or $tagOut) {
|
2110
2105
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2111
|
-
$fp or ++$countBad, return;
|
2106
|
+
$fp or EFile($file), ++$countBad, return;
|
2112
2107
|
$tmpText = $outfile unless $append;
|
2113
2108
|
}
|
2114
2109
|
|
@@ -2167,7 +2162,7 @@ sub GetImageInfo($$)
|
|
2167
2162
|
}
|
2168
2163
|
delete $printFmt{HEAD} unless $outfile; # print header only once per output file
|
2169
2164
|
my $errs = $et->GetInfo('Warning', 'Error');
|
2170
|
-
PrintErrors($et, $errs, $file);
|
2165
|
+
PrintErrors($et, $errs, $file) and EFile($file);
|
2171
2166
|
} elsif (not $disableOutput) {
|
2172
2167
|
my ($tag, $line, %noDups, %csvInfo, $bra, $ket, $sep);
|
2173
2168
|
if ($fp) {
|
@@ -2659,6 +2654,7 @@ sub SetImageInfo($$$)
|
|
2659
2654
|
$outfile = FilenameSPrintf($outOpt, $orig);
|
2660
2655
|
if ($outfile eq '') {
|
2661
2656
|
Warn "Error: Can't create file with zero-length name from $orig\n";
|
2657
|
+
EFile($infile);
|
2662
2658
|
++$countBadCr;
|
2663
2659
|
return 0;
|
2664
2660
|
}
|
@@ -2675,6 +2671,7 @@ sub SetImageInfo($$$)
|
|
2675
2671
|
unless (CanCreate($outType)) {
|
2676
2672
|
my $what = $srcType ? 'other types' : 'scratch';
|
2677
2673
|
WarnOnce "Error: Can't create $outType files from $what\n";
|
2674
|
+
EFile($infile);
|
2678
2675
|
++$countBadCr;
|
2679
2676
|
return 0;
|
2680
2677
|
}
|
@@ -2712,6 +2709,7 @@ sub SetImageInfo($$$)
|
|
2712
2709
|
$outfile = NextUnusedFilename($outfile);
|
2713
2710
|
if ($et->Exists($outfile) and not $doSetFileName) {
|
2714
2711
|
Warn "Error: '${outfile}' already exists - $infile\n";
|
2712
|
+
EFile($infile);
|
2715
2713
|
++$countBadWr;
|
2716
2714
|
return 0;
|
2717
2715
|
}
|
@@ -2732,7 +2730,7 @@ sub SetImageInfo($$$)
|
|
2732
2730
|
$setTags = $tagsFromSrc || $setTags{$dyFile};
|
2733
2731
|
} else {
|
2734
2732
|
$fromFile = FilenameSPrintf($dyFile, $orig);
|
2735
|
-
++$countBadWr, return 0
|
2733
|
+
defined $fromFile or EFile($infile), ++$countBadWr, return 0;
|
2736
2734
|
$setTags = $setTags{$dyFile};
|
2737
2735
|
}
|
2738
2736
|
# do we have multiple -tagsFromFile options with this file?
|
@@ -2817,7 +2815,7 @@ sub SetImageInfo($$$)
|
|
2817
2815
|
my $err;
|
2818
2816
|
$err = "You shouldn't write FileName or Directory with TestFile" if defined $newFileName or defined $newDir;
|
2819
2817
|
$err = "The -o option shouldn't be used with TestFile" if defined $outfile;
|
2820
|
-
$err and Warn("Error: $err - $infile\n"), ++$countBadWr, return 0;
|
2818
|
+
$err and Warn("Error: $err - $infile\n"), EFile($infile), ++$countBadWr, return 0;
|
2821
2819
|
$testName = FilenameSPrintf($testName, $orig);
|
2822
2820
|
$testName = Image::ExifTool::GetNewFileName($file, $testName) if $file ne '';
|
2823
2821
|
}
|
@@ -2844,6 +2842,7 @@ sub SetImageInfo($$$)
|
|
2844
2842
|
$sameFile = $outfile; # same file, but the name has a different case
|
2845
2843
|
} else {
|
2846
2844
|
Warn "Error: '${outfile}' already exists - $infile\n";
|
2845
|
+
EFile($infile);
|
2847
2846
|
++$countBadWr;
|
2848
2847
|
return 0;
|
2849
2848
|
}
|
@@ -2863,6 +2862,7 @@ sub SetImageInfo($$$)
|
|
2863
2862
|
unless ($numSet) {
|
2864
2863
|
# no need to write if no tags set
|
2865
2864
|
print $vout "Nothing changed in $file\n" if defined $verbose;
|
2865
|
+
EFile($infile, 1);
|
2866
2866
|
++$countSameWr;
|
2867
2867
|
return 1;
|
2868
2868
|
}
|
@@ -2870,6 +2870,7 @@ sub SetImageInfo($$$)
|
|
2870
2870
|
if ($numSet == $numPseudo) {
|
2871
2871
|
# no need to write if no real tags
|
2872
2872
|
Warn("Error: Nothing to write - $file\n");
|
2873
|
+
EFile($infile, 1);
|
2873
2874
|
++$countBadWr;
|
2874
2875
|
return 0;
|
2875
2876
|
}
|
@@ -2881,6 +2882,7 @@ sub SetImageInfo($$$)
|
|
2881
2882
|
} else {
|
2882
2883
|
# file doesn't exist, and we can't create it
|
2883
2884
|
Warn "Error: File not found - $file\n";
|
2885
|
+
EFile($infile);
|
2884
2886
|
FileNotFound($file);
|
2885
2887
|
++$countBadWr;
|
2886
2888
|
return 0;
|
@@ -2895,9 +2897,11 @@ sub SetImageInfo($$$)
|
|
2895
2897
|
if ($r1 > 0 or $r2 > 0 or $r3 > 0 or $r4 > 0) {
|
2896
2898
|
++$countGoodWr;
|
2897
2899
|
} elsif ($r1 < 0 or $r2 < 0 or $r3 < 0 or $r4 < 0) {
|
2900
|
+
EFile($infile);
|
2898
2901
|
++$countBadWr;
|
2899
2902
|
return 0;
|
2900
2903
|
} else {
|
2904
|
+
EFile($infile, 1);
|
2901
2905
|
++$countSameWr;
|
2902
2906
|
}
|
2903
2907
|
if (defined $hardLink or defined $symLink or defined $testName) {
|
@@ -2911,6 +2915,7 @@ sub SetImageInfo($$$)
|
|
2911
2915
|
$outfile = "${file}_exiftool_tmp";
|
2912
2916
|
if ($et->Exists($outfile)) {
|
2913
2917
|
Warn("Error: Temporary file already exists: $outfile\n");
|
2918
|
+
EFile($infile);
|
2914
2919
|
++$countBadWr;
|
2915
2920
|
return 0;
|
2916
2921
|
}
|
@@ -3007,6 +3012,7 @@ sub SetImageInfo($$$)
|
|
3007
3012
|
} else {
|
3008
3013
|
close(NEW_FILE);
|
3009
3014
|
Warn "Error opening $file for writing\n";
|
3015
|
+
EFile($infile);
|
3010
3016
|
$et->Unlink($newFile);
|
3011
3017
|
++$countBadWr;
|
3012
3018
|
}
|
@@ -3024,11 +3030,13 @@ sub SetImageInfo($$$)
|
|
3024
3030
|
# unlink may fail if already renamed or no permission
|
3025
3031
|
if (not $et->Unlink($file)) {
|
3026
3032
|
Warn "Error renaming temporary file to $dstFile\n";
|
3033
|
+
EFile($infile);
|
3027
3034
|
$et->Unlink($newFile);
|
3028
3035
|
++$countBadWr;
|
3029
3036
|
# try renaming again now that the target has been deleted
|
3030
3037
|
} elsif (not $et->Rename($newFile, $dstFile)) {
|
3031
3038
|
Warn "Error renaming temporary file to $dstFile\n";
|
3039
|
+
EFile($infile);
|
3032
3040
|
# (don't delete tmp file now because it is all we have left)
|
3033
3041
|
++$countBadWr;
|
3034
3042
|
} else {
|
@@ -3050,6 +3058,7 @@ sub SetImageInfo($$$)
|
|
3050
3058
|
++$countGoodWr;
|
3051
3059
|
}
|
3052
3060
|
} elsif ($success) {
|
3061
|
+
EFile($infile, 1);
|
3053
3062
|
if ($isTemporary) {
|
3054
3063
|
# just erase the temporary file since no changes were made
|
3055
3064
|
$et->Unlink($tmpFile);
|
@@ -3063,6 +3072,7 @@ sub SetImageInfo($$$)
|
|
3063
3072
|
}
|
3064
3073
|
print $vout "Nothing changed in $file\n" if defined $verbose;
|
3065
3074
|
} else {
|
3075
|
+
EFile($infile);
|
3066
3076
|
$et->Unlink($tmpFile) if defined $tmpFile;
|
3067
3077
|
++$countBadWr;
|
3068
3078
|
}
|
@@ -3450,7 +3460,7 @@ sub DoSetFromFile($$$)
|
|
3450
3460
|
++$warns while $$info{"Warning ($warns)"};
|
3451
3461
|
$numSet -= $warns;
|
3452
3462
|
}
|
3453
|
-
PrintErrors($et, $info, $file) and ++$countBadWr, return 0;
|
3463
|
+
PrintErrors($et, $info, $file) and EFile($file), ++$countBadWr, return 0;
|
3454
3464
|
Warn "Warning: No writable tags set from $file\n" unless $numSet;
|
3455
3465
|
return 1;
|
3456
3466
|
}
|
@@ -3649,6 +3659,7 @@ sub ScanDir($$;$)
|
|
3649
3659
|
{
|
3650
3660
|
Warn("Not writing $path\n");
|
3651
3661
|
WarnOnce("Use -overwrite_original_in_place to write files with Unicode surrogate characters\n");
|
3662
|
+
EFile($file);
|
3652
3663
|
++$countBad;
|
3653
3664
|
next;
|
3654
3665
|
}
|
@@ -3723,6 +3734,7 @@ sub FindFileWindows($$)
|
|
3723
3734
|
$evalWarning =~ s/ at .*//s;
|
3724
3735
|
Warn "Error: [Win32::FindFile] $evalWarning - $wildfile\n";
|
3725
3736
|
undef @files;
|
3737
|
+
EFile($wildfile);
|
3726
3738
|
++$countBad;
|
3727
3739
|
}
|
3728
3740
|
return @files;
|
@@ -4049,8 +4061,8 @@ sub CreateDirectory($)
|
|
4049
4061
|
}
|
4050
4062
|
$dir .= '/';
|
4051
4063
|
}
|
4064
|
+
++$countNewDir if $created;
|
4052
4065
|
}
|
4053
|
-
++$countNewDir if $created;
|
4054
4066
|
return $created;
|
4055
4067
|
}
|
4056
4068
|
|
@@ -4237,6 +4249,29 @@ sub ReadStayOpen($)
|
|
4237
4249
|
}
|
4238
4250
|
}
|
4239
4251
|
|
4252
|
+
#------------------------------------------------------------------------------
|
4253
|
+
# Add new entry to -efile output file
|
4254
|
+
# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed)
|
4255
|
+
sub EFile($$)
|
4256
|
+
{
|
4257
|
+
my $entry = shift;
|
4258
|
+
my $efile = $efile[shift || 0];
|
4259
|
+
if (defined $efile and length $entry and $entry ne '-') {
|
4260
|
+
my $err;
|
4261
|
+
CreateDirectory($efile);
|
4262
|
+
if ($mt->Open(\*EFILE_FILE, $efile, '>>')) {
|
4263
|
+
print EFILE_FILE $entry, "\n" or Warn("Error writing to $efile\n"), $err = 1;
|
4264
|
+
close EFILE_FILE;
|
4265
|
+
} else {
|
4266
|
+
Warn("Error opening '${efile}' for append\n");
|
4267
|
+
$err = 1;
|
4268
|
+
}
|
4269
|
+
if ($err) {
|
4270
|
+
defined $_ and $_ eq $efile and undef $_ foreach @efile;
|
4271
|
+
}
|
4272
|
+
}
|
4273
|
+
}
|
4274
|
+
|
4240
4275
|
#------------------------------------------------------------------------------
|
4241
4276
|
# Print list of tags
|
4242
4277
|
# Inputs: 0) message, 1-N) list of tag names
|
@@ -4282,15 +4317,6 @@ sub PrintErrors($$$)
|
|
4282
4317
|
Warn "$tag: $info->{$key} - $file\n";
|
4283
4318
|
}
|
4284
4319
|
}
|
4285
|
-
if ($$info{Error} and $efile) {
|
4286
|
-
if ($et->Open(\*ERR_FILE, $efile, '>>')) {
|
4287
|
-
print ERR_FILE $file, "\n" or Warn("Error writing to $efile\n"), undef $efile;
|
4288
|
-
close ERR_FILE;
|
4289
|
-
} else {
|
4290
|
-
Warn("Error opening '${efile}' for append\n");
|
4291
|
-
undef $efile;
|
4292
|
-
}
|
4293
|
-
}
|
4294
4320
|
return $$info{Error};
|
4295
4321
|
}
|
4296
4322
|
|
@@ -4523,6 +4549,7 @@ L<Advanced options|/Advanced options>
|
|
4523
4549
|
-common_args Define common arguments
|
4524
4550
|
-config CFGFILE Specify configuration file name
|
4525
4551
|
-echo[NUM] TEXT Echo text to stdout or stderr
|
4552
|
+
-efile[NUM][!] ERRFILE Save names of files with errors
|
4526
4553
|
-execute[NUM] Execute multiple commands on one line
|
4527
4554
|
-srcfile FMT Process a different source file
|
4528
4555
|
-stay_open FLAG Keep reading -@ argfile even after EOF
|
@@ -5259,7 +5286,7 @@ with this command:
|
|
5259
5286
|
|
5260
5287
|
produces output like this:
|
5261
5288
|
|
5262
|
-
-- Generated by ExifTool 11.
|
5289
|
+
-- Generated by ExifTool 11.98 --
|
5263
5290
|
File: a.jpg - 2003:10:31 15:44:19
|
5264
5291
|
(f/5.6, 1/60s, ISO 100)
|
5265
5292
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6206,6 +6233,17 @@ is output as the command line is parsed, before the processing of any input
|
|
6206
6233
|
files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
|
6207
6234
|
respectively) after processing is complete.
|
6208
6235
|
|
6236
|
+
=item B<-efile>[I<NUM>][!] I<ERRFILE>
|
6237
|
+
|
6238
|
+
Save the names of files giving errors (I<NUM> missing or 1), files that were
|
6239
|
+
unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
|
6240
|
+
or any combination thereof (by summing I<NUM>, eg. B<-efile3> is the same
|
6241
|
+
has having both B<-efile> and B<-efile2> options with the same I<ERRFILE>).
|
6242
|
+
By default, file names are appended to any existing I<ERRFILE>, but
|
6243
|
+
I<ERRFILE> is overwritten if an exclamation point is added to the option
|
6244
|
+
(eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
|
6245
|
+
option if applicable.
|
6246
|
+
|
6209
6247
|
=item B<-execute>[I<NUM>]
|
6210
6248
|
|
6211
6249
|
Execute command for all arguments up to this point on the command line (plus
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
28
28
|
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
|
30
30
|
|
31
|
-
$VERSION = '11.
|
31
|
+
$VERSION = '11.98';
|
32
32
|
$RELEASE = '';
|
33
33
|
@ISA = qw(Exporter);
|
34
34
|
%EXPORT_TAGS = (
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
88
88
|
sub ProcessExifInfo($$$);
|
89
89
|
sub SwapWords($);
|
90
90
|
|
91
|
-
$VERSION = '4.
|
91
|
+
$VERSION = '4.37';
|
92
92
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
@@ -486,6 +486,7 @@ $VERSION = '4.36';
|
|
486
486
|
368.7 => 'Sigma 85mm f/1.4 DG HSM | A', #IB (016)
|
487
487
|
368.8 => 'Sigma 105mm f/1.4 DG HSM', #IB (A018)
|
488
488
|
368.9 => 'Sigma 14-24mm f/2.8 DG HSM', #IB (A018)
|
489
|
+
368.10 => 'Sigma 35mm f/1.4 DG HSM | A', #PH (012)
|
489
490
|
'368.10' => 'Sigma 70mm f/2.8 DG Macro', #IB (A018)
|
490
491
|
# Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
|
491
492
|
488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
|
@@ -532,7 +533,7 @@ $VERSION = '4.36';
|
|
532
533
|
757 => 'Canon EF 400mm f/2.8L IS III USM', #IB
|
533
534
|
758 => 'Canon EF 600mm f/4L IS III USM', #IB
|
534
535
|
|
535
|
-
1136 => 'Sigma 24-70mm f/2.8 DG OS HSM |
|
536
|
+
1136 => 'Sigma 24-70mm f/2.8 DG OS HSM | A', #IB (017)
|
536
537
|
# (STM lenses - 0x10xx)
|
537
538
|
4142 => 'Canon EF-S 18-135mm f/3.5-5.6 IS STM',
|
538
539
|
4143 => 'Canon EF-M 18-55mm f/3.5-5.6 IS STM or Tamron Lens',
|
@@ -13,7 +13,7 @@ use vars qw($VERSION);
|
|
13
13
|
use Image::ExifTool; # only for FinishTiffDump()
|
14
14
|
use Image::ExifTool::HTML qw(EscapeHTML);
|
15
15
|
|
16
|
-
$VERSION = '1.
|
16
|
+
$VERSION = '1.39';
|
17
17
|
|
18
18
|
sub DumpTable($$$;$$$$$$);
|
19
19
|
sub Open($$$;@);
|
@@ -122,7 +122,7 @@ function doClick(e)
|
|
122
122
|
if (!clicked) {
|
123
123
|
firstOutEvt = lastInEvt = undefined;
|
124
124
|
high(e, 2);
|
125
|
-
clicked = 1;
|
125
|
+
if (hlist) clicked = 1;
|
126
126
|
} else {
|
127
127
|
clicked = 0;
|
128
128
|
if (firstOutEvt) high(firstOutEvt, 0);
|
@@ -31,7 +31,7 @@ use strict;
|
|
31
31
|
use vars qw($VERSION);
|
32
32
|
use Image::ExifTool qw(:DataAccess :Utils);
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.17';
|
35
35
|
|
36
36
|
# program map table "stream_type" lookup (ref 6/1)
|
37
37
|
my %streamType = (
|
@@ -313,7 +313,7 @@ sub ProcessM2TS($$)
|
|
313
313
|
my $raf = $$dirInfo{RAF};
|
314
314
|
my ($buff, $pLen, $upkPrefix, $j, $fileType, $eof);
|
315
315
|
my (%pmt, %pidType, %data, %sectLen);
|
316
|
-
my ($startTime, $endTime, $backScan, $maxBack);
|
316
|
+
my ($startTime, $endTime, $fwdTime, $backScan, $maxBack);
|
317
317
|
my $verbose = $et->Options('Verbose');
|
318
318
|
my $out = $et->Options('TextOut');
|
319
319
|
|
@@ -330,7 +330,7 @@ sub ProcessM2TS($$)
|
|
330
330
|
$upkPrefix = 'x4N';
|
331
331
|
}
|
332
332
|
my $prePos = $pLen - 188; # byte position of packet prefix
|
333
|
-
my $readSize = 64 * $pLen; #
|
333
|
+
my $readSize = 64 * $pLen; # size of our read buffer
|
334
334
|
$raf->Seek(0,0); # rewind to start
|
335
335
|
$raf->Read($buff, $readSize) >= $pLen * 4 or return 0; # require at least 4 packets
|
336
336
|
# validate the sync byte in the next 3 packets
|
@@ -351,39 +351,58 @@ sub ProcessM2TS($$)
|
|
351
351
|
my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 );
|
352
352
|
my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
|
353
353
|
my $pEnd = 0;
|
354
|
-
my $i = 0;
|
355
354
|
|
356
355
|
# parse packets from MPEG-2 Transport Stream
|
357
356
|
for (;;) {
|
358
357
|
|
359
358
|
unless (%needPID) {
|
360
359
|
last unless defined $startTime;
|
361
|
-
# seek backwards
|
362
|
-
|
363
|
-
|
364
|
-
$backScan -= $pLen;
|
365
|
-
last if $backScan < $maxBack;
|
366
|
-
} else {
|
367
|
-
undef $endTime;
|
368
|
-
last if $et->Options('FastScan');
|
360
|
+
# reconfigure to seek backwards for last PCR
|
361
|
+
unless (defined $backScan) {
|
362
|
+
$et->Options('FastScan') and undef($endTime), last;
|
369
363
|
$verbose and print "[Starting backscan for last PCR]\n";
|
370
|
-
|
371
|
-
|
364
|
+
$fwdTime = $endTime;
|
365
|
+
undef $endTime;
|
366
|
+
# remember how far we got when reading forward through the file
|
367
|
+
my $fwdPos = $raf->Tell() - length($buff) + $pEnd;
|
368
|
+
# determine the number of whole packets in the file
|
372
369
|
$raf->Seek(0, 2) or last;
|
373
370
|
my $fsize = $raf->Tell();
|
374
371
|
my $nPack = int($fsize / $pLen);
|
375
|
-
$backScan =
|
372
|
+
$backScan = $nPack * $pLen - $fsize;
|
376
373
|
# set limit on how far back we will go
|
377
374
|
$maxBack = $fwdPos - $fsize;
|
378
|
-
|
375
|
+
# scan back a maximum of 512k (have seen last PCR at -276k)
|
376
|
+
my $nMax = int(512000 / $pLen); # max packets to scan
|
377
|
+
my $nRem = int(-$maxBack / $pLen); # packets remaining in file
|
378
|
+
$maxBack = $backScan - $nMax * $pLen if $nRem > $nMax;
|
379
|
+
$pEnd = 0;
|
379
380
|
}
|
380
|
-
$raf->Seek($backScan, 2) or last;
|
381
381
|
}
|
382
|
-
my $pos
|
382
|
+
my $pos;
|
383
383
|
# read more if necessary
|
384
|
-
if (
|
385
|
-
|
386
|
-
$pos = $pEnd =
|
384
|
+
if (defined $backScan) {
|
385
|
+
last if defined $endTime;
|
386
|
+
$pos = $pEnd = $pEnd - 2 * $pLen; # step back to previous packet
|
387
|
+
if ($pos < 0) {
|
388
|
+
# read another buffer from end of file
|
389
|
+
last if $backScan <= $maxBack;
|
390
|
+
my $readThis = $readSize;
|
391
|
+
$backScan -= $readSize;
|
392
|
+
if ($backScan < $maxBack) {
|
393
|
+
$readThis = $readSize - ($maxBack - $backScan);
|
394
|
+
$backScan = $maxBack;
|
395
|
+
}
|
396
|
+
$raf->Seek($backScan, 2) or last;
|
397
|
+
$raf->Read($buff, $readThis) == $readThis or last;
|
398
|
+
$pos = $pEnd = $readThis - $pLen;
|
399
|
+
}
|
400
|
+
} else {
|
401
|
+
$pos = $pEnd;
|
402
|
+
if ($pos + $pLen > length $buff) {
|
403
|
+
$raf->Read($buff, $readSize) >= $pLen or $eof = 1, last;
|
404
|
+
$pos = $pEnd = 0;
|
405
|
+
}
|
387
406
|
}
|
388
407
|
$pEnd += $pLen;
|
389
408
|
# decode the packet prefix
|
@@ -404,8 +423,8 @@ sub ProcessM2TS($$)
|
|
404
423
|
# my $continuity_counter = $prefix & 0x0000000f;
|
405
424
|
|
406
425
|
if ($verbose > 1) {
|
426
|
+
my $i = ($raf->Tell() - length($buff) + $pEnd) / $pLen - 1;
|
407
427
|
print $out "Transport packet $i:\n";
|
408
|
-
++$i;
|
409
428
|
$et->VerboseDump(\$buff, Len => $pLen, Addr => $i * $pLen, Start => $pos - $prePos);
|
410
429
|
my $str = $pidName{$pid} ? " ($pidName{$pid})" : '';
|
411
430
|
printf $out " Timecode: 0x%.4x\n", Get32u(\$buff, $pos - $prePos) if $pLen == 192;
|
@@ -646,7 +665,8 @@ sub ProcessM2TS($$)
|
|
646
665
|
}
|
647
666
|
|
648
667
|
# calculate Duration if available
|
649
|
-
|
668
|
+
$endTime = $fwdTime unless defined $endTime;
|
669
|
+
if (defined $startTime and defined $endTime) {
|
650
670
|
$endTime += 0x80000000 * 1200 if $startTime > $endTime; # handle 33-bit wrap
|
651
671
|
$et->HandleTag($tagTablePtr, 'Duration', $endTime - $startTime);
|
652
672
|
}
|
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
62
62
|
use Image::ExifTool::Exif;
|
63
63
|
use Image::ExifTool::GPS;
|
64
64
|
|
65
|
-
$VERSION = '3.
|
65
|
+
$VERSION = '3.82';
|
66
66
|
|
67
67
|
sub LensIDConv($$$);
|
68
68
|
sub ProcessNikonAVI($$$);
|
@@ -297,6 +297,7 @@ sub GetAFPointGrid($$;$);
|
|
297
297
|
'B8 40 2D 44 2C 34 BA 06' => 'AF-S Nikkor 18-35mm f/3.5-4.5G ED',
|
298
298
|
'A0 40 2D 74 2C 3C BB 0E' => 'AF-S DX Nikkor 18-140mm f/3.5-5.6G ED VR', #PH
|
299
299
|
'A1 54 55 55 0C 0C BC 06' => 'AF-S Nikkor 58mm f/1.4G', #IB
|
300
|
+
'A1 48 6E 8E 24 24 DB 4E' => 'AF-S Nikkor 120-300mm f/2.8E FL ED SR VR', #28
|
300
301
|
'A2 40 2D 53 2C 3C BD 0E' => 'AF-S DX Nikkor 18-55mm f/3.5-5.6G VR II',
|
301
302
|
'A4 40 2D 8E 2C 40 BF 0E' => 'AF-S DX Nikkor 18-300mm f/3.5-6.3G ED VR',
|
302
303
|
'A5 4C 44 44 14 14 C0 06' => 'AF-S Nikkor 35mm f/1.8G ED', #35 ("ED" ref 11)
|
@@ -46,7 +46,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
46
46
|
use Image::ExifTool::Exif;
|
47
47
|
use Image::ExifTool::GPS;
|
48
48
|
|
49
|
-
$VERSION = '2.
|
49
|
+
$VERSION = '2.48';
|
50
50
|
|
51
51
|
sub ProcessMOV($$;$);
|
52
52
|
sub ProcessKeys($$$);
|
@@ -1628,10 +1628,14 @@ my %eeBox = (
|
|
1628
1628
|
Avoid => 1,
|
1629
1629
|
Format => 'string', # (necessary to remove the trailing NULL)
|
1630
1630
|
},
|
1631
|
-
date => {
|
1631
|
+
date => {
|
1632
1632
|
Name => 'DateTimeOriginal',
|
1633
1633
|
Description => 'Date/Time Original',
|
1634
1634
|
Groups => { 2 => 'Time' },
|
1635
|
+
Notes => q{
|
1636
|
+
Apple Photos has been reported to show a crazy date/time for some MP4 files
|
1637
|
+
containing this tag
|
1638
|
+
}, #forum10690/11125
|
1635
1639
|
Shift => 'Time',
|
1636
1640
|
ValueConv => q{
|
1637
1641
|
require Image::ExifTool::XMP;
|
@@ -8232,6 +8236,11 @@ sub HandleItemInfo($)
|
|
8232
8236
|
if ($buff =~ /^(MM\0\x2a|II\x2a\0)/) {
|
8233
8237
|
$et->Warn('Missing Exif header');
|
8234
8238
|
$start = 0;
|
8239
|
+
} elsif ($buff =~ /^Exif\0\0/) {
|
8240
|
+
# (haven't seen this yet, but it is just a matter of time
|
8241
|
+
# until someone screws it up like this)
|
8242
|
+
$et->Warn('Missing Exif header size');
|
8243
|
+
$start = 6;
|
8235
8244
|
} else {
|
8236
8245
|
my $n = unpack('N', $buff);
|
8237
8246
|
$start = 4 + $n; # skip "Exif\0\0" header if it exists
|
@@ -29,7 +29,7 @@ use strict;
|
|
29
29
|
use vars qw($VERSION);
|
30
30
|
use Image::ExifTool qw(:DataAccess :Utils);
|
31
31
|
|
32
|
-
$VERSION = '1.
|
32
|
+
$VERSION = '1.56';
|
33
33
|
|
34
34
|
sub ConvertTimecode($);
|
35
35
|
sub ProcessSGLT($$$);
|
@@ -485,14 +485,26 @@ my %code2charset = (
|
|
485
485
|
#
|
486
486
|
# WebP-specific tags
|
487
487
|
#
|
488
|
-
EXIF => { # (WebP)
|
488
|
+
EXIF => [{ # (WebP)
|
489
489
|
Name => 'EXIF',
|
490
|
+
Condition => '$$valPt =~ /^(II\x2a\0|MM\0\x2a)/',
|
490
491
|
Notes => 'WebP files',
|
491
492
|
SubDirectory => {
|
492
493
|
TagTable => 'Image::ExifTool::Exif::Main',
|
493
494
|
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
494
495
|
},
|
495
|
-
},
|
496
|
+
},{ # (WebP) - have also seen with "Exif\0\0" header - PH
|
497
|
+
Name => 'EXIF',
|
498
|
+
Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/',
|
499
|
+
SubDirectory => {
|
500
|
+
TagTable => 'Image::ExifTool::Exif::Main',
|
501
|
+
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
502
|
+
Start => 6,
|
503
|
+
},
|
504
|
+
},{
|
505
|
+
Name => 'UnknownEXIF',
|
506
|
+
Binary => 1,
|
507
|
+
}],
|
496
508
|
'XMP ' => { #14 (WebP)
|
497
509
|
Name => 'XMP',
|
498
510
|
Notes => 'WebP files',
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
34
34
|
use Image::ExifTool::Exif;
|
35
35
|
use Image::ExifTool::Minolta;
|
36
36
|
|
37
|
-
$VERSION = '3.
|
37
|
+
$VERSION = '3.24';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -232,7 +232,7 @@ sub PrintInvLensSpec($;$$);
|
|
232
232
|
51507 => 'Samyang AF 35mm F1.4', #IB
|
233
233
|
51508 => 'Samyang AF 45mm F1.8',
|
234
234
|
51510 => 'Samyang AF 18mm F2.8', #JR
|
235
|
-
|
235
|
+
51512 => 'Samyang AF 75mm F1.8 FE', #IB
|
236
236
|
);
|
237
237
|
|
238
238
|
# ExposureProgram values (ref PH, mainly decoded from A200)
|
@@ -10651,6 +10651,7 @@ my %tagExists = (
|
|
10651
10651
|
'unknown_slmt' => 1,
|
10652
10652
|
'unknownd30' => 1,
|
10653
10653
|
'unknowndata' => 1,
|
10654
|
+
'unknownexif' => 1,
|
10654
10655
|
'unknowninfo' => 1,
|
10655
10656
|
'unknowninfo2' => 1,
|
10656
10657
|
'unknowninfo2version' => 1,
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 23365 tags, with 15307 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -28940,6 +28940,7 @@ sub-documents, but the Duration is calculated for the full video.
|
|
28940
28940
|
'ANMF' ANMF RIFF ANMF
|
28941
28941
|
'CSET' CharacterSet RIFF CSET
|
28942
28942
|
'EXIF' EXIF EXIF
|
28943
|
+
UnknownEXIF no
|
28943
28944
|
'ICCP' ICC_Profile ICC_Profile
|
28944
28945
|
'IDIT' DateTimeOriginal no
|
28945
28946
|
'JUNK' OlympusJunk Olympus AVI
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 11.
|
4
|
+
version: 11.98.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-05-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|