exiftool_vendored 13.31.0 → 13.36.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 +88 -2
- data/bin/MANIFEST +5 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/Makefile.PL +1 -0
- data/bin/README +47 -46
- data/bin/exiftool +155 -120
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
- data/bin/lib/Image/ExifTool/Canon.pm +46 -6
- data/bin/lib/Image/ExifTool/DJI.pm +54 -3
- data/bin/lib/Image/ExifTool/Exif.pm +9 -6
- data/bin/lib/Image/ExifTool/FlashPix.pm +4 -159
- data/bin/lib/Image/ExifTool/FujiFilm.pm +97 -32
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +5 -3
- data/bin/lib/Image/ExifTool/GoPro.pm +14 -2
- data/bin/lib/Image/ExifTool/LNK.pm +4 -1
- data/bin/lib/Image/ExifTool/Lang/cs.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/de.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/it.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/ja.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/nl.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/pl.pm +0 -1
- data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +2 -4
- data/bin/lib/Image/ExifTool/Microsoft.pm +158 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +4 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +73 -37
- data/bin/lib/Image/ExifTool/NikonCustom.pm +40 -10
- data/bin/lib/Image/ExifTool/Olympus.pm +258 -34
- data/bin/lib/Image/ExifTool/Panasonic.pm +3 -3
- data/bin/lib/Image/ExifTool/Pentax.pm +341 -61
- data/bin/lib/Image/ExifTool/Protobuf.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +11 -4
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/README +2 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +5 -3
- data/bin/lib/Image/ExifTool/Sony.pm +46 -17
- data/bin/lib/Image/ExifTool/TNEF.pm +487 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +4384 -4265
- data/bin/lib/Image/ExifTool/TagNames.pod +291 -27
- data/bin/lib/Image/ExifTool/WriteExif.pl +14 -12
- data/bin/lib/Image/ExifTool/Writer.pl +21 -16
- data/bin/lib/Image/ExifTool/XMP.pm +8 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
- data/bin/lib/Image/ExifTool.pm +14 -4
- data/bin/lib/Image/ExifTool.pod +50 -44
- data/bin/perl-Image-ExifTool.spec +46 -45
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '13.
|
14
|
+
my $version = '13.36';
|
15
15
|
|
16
16
|
$^W = 1; # enable global warnings
|
17
17
|
|
@@ -57,7 +57,7 @@ sub FormatJSON($$$;$);
|
|
57
57
|
sub PrintCSV(;$);
|
58
58
|
sub AddGroups($$$$);
|
59
59
|
sub ConvertBinary($);
|
60
|
-
sub IsEqual(
|
60
|
+
sub IsEqual($$;$);
|
61
61
|
sub Printable($);
|
62
62
|
sub LengthUTF8($);
|
63
63
|
sub Infile($;$);
|
@@ -101,9 +101,9 @@ my @csvFiles; # list of files when reading with CSV option (in ExifTool Ch
|
|
101
101
|
my @csvTags; # order of tags for first file with CSV option (lower case)
|
102
102
|
my @delFiles; # list of files to delete
|
103
103
|
my @dynamicFiles; # list of -tagsFromFile files with dynamic names and -TAG<=FMT pairs
|
104
|
+
my (@echo3, @echo4);# stdout and stderr echo after processing is complete
|
104
105
|
my @efile; # files for writing list of error/fail/same file names
|
105
106
|
my @exclude; # list of excluded tags
|
106
|
-
my (@echo3, @echo4);# stdout and stderr echo after processing is complete
|
107
107
|
my @files; # list of files and directories to scan
|
108
108
|
my @moreArgs; # more arguments to process after -stay_open -@
|
109
109
|
my @newValues; # list of new tag values to set
|
@@ -118,7 +118,6 @@ my %csvTags; # lookup for all found tags with CSV option (lower case keys
|
|
118
118
|
my %database; # lookup for database information based on file name (in ExifTool Charset)
|
119
119
|
my %filterExt; # lookup for filtered extensions
|
120
120
|
my %ignore; # directory names to ignore
|
121
|
-
my $ignoreHidden; # flag to ignore hidden files
|
122
121
|
my %outComma; # flag that output text file needs a comma
|
123
122
|
my %outTrailer; # trailer for output text file
|
124
123
|
my %preserveTime; # preserved timestamps for files
|
@@ -130,6 +129,7 @@ my %usedFileName; # lookup for file names we already used in TestName feature
|
|
130
129
|
my %utf8FileName; # lookup for file names that are UTF-8 encoded
|
131
130
|
my %warnedOnce; # lookup for once-only warnings
|
132
131
|
my %wext; # -W extensions to write
|
132
|
+
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
133
133
|
my $allGroup; # show group name for all tags
|
134
134
|
my $altEnc; # alternate character encoding if not UTF-8
|
135
135
|
my $argFormat; # use exiftool argument-format output
|
@@ -175,6 +175,7 @@ my $forcePrint; # string to use for missing tag values (undef to not print t
|
|
175
175
|
my $geoOnly; # flag to extract Geolocation tags only
|
176
176
|
my $helped; # flag to avoid printing help if no tags specified
|
177
177
|
my $html; # flag for html-formatted output (2=html dump)
|
178
|
+
my $ignoreHidden; # flag to ignore hidden files
|
178
179
|
my $interrupted; # flag set if CTRL-C is pressed during a critical process
|
179
180
|
my $isBinary; # true if value is a SCALAR ref
|
180
181
|
my $isWriting; # flag set if we are writing tags
|
@@ -227,7 +228,6 @@ my $validFile; # flag indicating we processed a valid file
|
|
227
228
|
my $verbose; # verbose setting
|
228
229
|
my $vout; # verbose output file reference (\*STDOUT or \*STDERR by default)
|
229
230
|
my $windowTitle; # title for console window
|
230
|
-
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
231
231
|
my $xml; # flag for XML-formatted output
|
232
232
|
|
233
233
|
# flag to keep the input -@ argfile open:
|
@@ -451,8 +451,10 @@ undef @efile;
|
|
451
451
|
undef @exclude;
|
452
452
|
undef @files;
|
453
453
|
undef @newValues;
|
454
|
+
undef @requestTags;
|
454
455
|
undef @srcFmt;
|
455
456
|
undef @tags;
|
457
|
+
undef %altFile;
|
456
458
|
undef %appended;
|
457
459
|
undef %countLink;
|
458
460
|
undef %created;
|
@@ -472,6 +474,7 @@ undef %usedFileName;
|
|
472
474
|
undef %utf8FileName;
|
473
475
|
undef %warnedOnce;
|
474
476
|
undef %wext;
|
477
|
+
undef %wroteHEAD;
|
475
478
|
undef $allGroup;
|
476
479
|
undef $altEnc;
|
477
480
|
undef $argFormat;
|
@@ -488,8 +491,8 @@ undef $doSetFileName;
|
|
488
491
|
undef $doUnzip;
|
489
492
|
undef $end;
|
490
493
|
undef $endDir;
|
491
|
-
undef $escapeHTML;
|
492
494
|
undef $escapeC;
|
495
|
+
undef $escapeHTML;
|
493
496
|
undef $evalWarning;
|
494
497
|
undef $executeID;
|
495
498
|
undef $failCondition;
|
@@ -500,18 +503,22 @@ undef $fixLen;
|
|
500
503
|
undef $forcePrint;
|
501
504
|
undef $geoOnly;
|
502
505
|
undef $ignoreHidden;
|
506
|
+
undef $isBinary;
|
503
507
|
undef $joinLists;
|
504
508
|
undef $langOpt;
|
509
|
+
undef $listDir;
|
505
510
|
undef $listItem;
|
506
511
|
undef $multiFile;
|
507
512
|
undef $noBinary;
|
508
513
|
undef $outOpt;
|
514
|
+
undef $plot;
|
509
515
|
undef $preserveTime;
|
510
516
|
undef $progress;
|
511
517
|
undef $progressCount;
|
512
518
|
undef $progressIncr;
|
513
519
|
undef $progressMax;
|
514
520
|
undef $progressNext;
|
521
|
+
undef $rafStdin;
|
515
522
|
undef $recurse;
|
516
523
|
undef $scanWritable;
|
517
524
|
undef $sectHeader;
|
@@ -521,6 +528,7 @@ undef $showTagID;
|
|
521
528
|
undef $structOpt;
|
522
529
|
undef $tagOut;
|
523
530
|
undef $textOut;
|
531
|
+
undef $textOut2;
|
524
532
|
undef $textOverwrite;
|
525
533
|
undef $tmpFile;
|
526
534
|
undef $tmpText;
|
@@ -961,6 +969,7 @@ for (;;) {
|
|
961
969
|
if (/^diff$/i) {
|
962
970
|
$diff = shift;
|
963
971
|
defined $diff or Error("Expecting file name for -$_ option\n"), $badCmd=1;
|
972
|
+
CleanFilename($diff); # change to forward slashes if necessary
|
964
973
|
next;
|
965
974
|
}
|
966
975
|
/^delete_original(!?)$/i and $deleteOrig = ($1 ? 2 : 1), next;
|
@@ -2142,10 +2151,12 @@ sub GetImageInfo($$)
|
|
2142
2151
|
# set alternate file names
|
2143
2152
|
foreach $g8 (sort keys %altFile) {
|
2144
2153
|
my $altName = $orig;
|
2145
|
-
|
2146
|
-
|
2147
|
-
|
2148
|
-
|
2154
|
+
unless ($altFile{$g8} eq '@') {
|
2155
|
+
# must double any '$' symbols in the original file name because
|
2156
|
+
# they are used for tag names in a -fileNUM argument
|
2157
|
+
$altName =~ s/\$/\$\$/g;
|
2158
|
+
$altName = FilenameSPrintf($altFile{$g8}, $altName);
|
2159
|
+
}
|
2149
2160
|
$et->SetAlternateFile($g8, $altName);
|
2150
2161
|
}
|
2151
2162
|
|
@@ -2170,15 +2181,7 @@ sub GetImageInfo($$)
|
|
2170
2181
|
}
|
2171
2182
|
# evaluate -if expression for conditional processing
|
2172
2183
|
if (@condition) {
|
2173
|
-
unless ($file eq '-' or $et->Exists($file)) {
|
2174
|
-
Warn "Error: File not found - $file\n";
|
2175
|
-
EFile($file);
|
2176
|
-
FileNotFound($file);
|
2177
|
-
++$countBad;
|
2178
|
-
return;
|
2179
|
-
}
|
2180
2184
|
my $result;
|
2181
|
-
|
2182
2185
|
unless ($failCondition) {
|
2183
2186
|
# catch run time errors as well as compile errors
|
2184
2187
|
undef $evalWarning;
|
@@ -2217,7 +2220,10 @@ sub GetImageInfo($$)
|
|
2217
2220
|
}
|
2218
2221
|
undef @foundTags if $fastCondition; # ignore if we didn't get all tags
|
2219
2222
|
}
|
2220
|
-
|
2223
|
+
if ($result) {
|
2224
|
+
# discard $info for non-existent file
|
2225
|
+
undef $info unless $file eq '-' or $et->Exists($file);
|
2226
|
+
} else {
|
2221
2227
|
Progress($vout, "-------- $file (failed condition)") if $verbose;
|
2222
2228
|
EFile($file, 2);
|
2223
2229
|
++$countFailed;
|
@@ -2529,7 +2535,7 @@ T2: foreach $t2 (@tags2) {
|
|
2529
2535
|
# print the results for this file
|
2530
2536
|
if (%printFmt) {
|
2531
2537
|
# output using print format file (-p) option
|
2532
|
-
my ($type,
|
2538
|
+
my ($type, @doc, $grp, $lastDoc, $cache);
|
2533
2539
|
$fileTrailer = '';
|
2534
2540
|
# repeat for each embedded document if necessary (only if -ee used)
|
2535
2541
|
if ($et->Options('ExtractEmbedded')) {
|
@@ -2538,7 +2544,8 @@ T2: foreach $t2 (@tags2) {
|
|
2538
2544
|
} else {
|
2539
2545
|
$lastDoc = 0;
|
2540
2546
|
}
|
2541
|
-
for ($doc=0; $doc<=$lastDoc;
|
2547
|
+
for ($doc[0]=0; $doc[0]<=$lastDoc; ) {
|
2548
|
+
my $doc = join '-', @doc;
|
2542
2549
|
my ($skipBody, $opt);
|
2543
2550
|
foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
|
2544
2551
|
my $prf = $printFmt{$type} or next;
|
@@ -2548,7 +2555,7 @@ T2: foreach $t2 (@tags2) {
|
|
2548
2555
|
}
|
2549
2556
|
next if $type eq 'BODY' and $skipBody;
|
2550
2557
|
# silence "IF" warnings and warnings for subdocuments > 1
|
2551
|
-
if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})) {
|
2558
|
+
if ($type eq 'IF' or (($doc[0] > 1 or @doc > 1) and not $$et{OPTIONS}{IgnoreMinorErrors})) {
|
2552
2559
|
$opt = 'Silent';
|
2553
2560
|
} else {
|
2554
2561
|
$opt = 'Warn';
|
@@ -2587,6 +2594,14 @@ T2: foreach $t2 (@tags2) {
|
|
2587
2594
|
print $fp @lines;
|
2588
2595
|
}
|
2589
2596
|
}
|
2597
|
+
# find next available doc-subdoc
|
2598
|
+
push @doc, 1;
|
2599
|
+
while (@doc > 1) {
|
2600
|
+
my $nextDoc = join '-', @doc;
|
2601
|
+
last if $$et{HAS_DOC}{$nextDoc};
|
2602
|
+
pop @doc;
|
2603
|
+
++$doc[-1];
|
2604
|
+
}
|
2590
2605
|
}
|
2591
2606
|
delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
|
2592
2607
|
my $errs = $et->GetInfo('Warning', 'Error');
|
@@ -2905,7 +2920,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2905
2920
|
$val = $et->GetValue($tag, 'ValueConv');
|
2906
2921
|
$val = '' unless defined $val;
|
2907
2922
|
# go back to print ValueConv value only if different
|
2908
|
-
next unless IsEqual($val, $lastVal);
|
2923
|
+
next unless IsEqual($val, $lastVal, 1);
|
2909
2924
|
print $fp "$descClose\n </$tok>";
|
2910
2925
|
last;
|
2911
2926
|
}
|
@@ -2942,7 +2957,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2942
2957
|
$$val{desc} = $desc;
|
2943
2958
|
if ($printConv) {
|
2944
2959
|
my $num = $et->GetValue($tag, 'ValueConv');
|
2945
|
-
$$val{num} = $num if defined $num and not IsEqual($num, $$val{val});
|
2960
|
+
$$val{num} = $num if defined $num and not IsEqual($num, $$val{val}, 1);
|
2946
2961
|
}
|
2947
2962
|
my $ex = $$et{TAG_EXTRA}{$tag};
|
2948
2963
|
$$val{'fmt'} = $$ex{G6} if defined $$ex{G6};
|
@@ -2955,6 +2970,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2955
2970
|
$$val{'hex'} = join ' ', unpack '(H2)*', $$ex{BinVal};
|
2956
2971
|
}
|
2957
2972
|
}
|
2973
|
+
$$val{rat} = $$ex{Rational} if defined $$ex{Rational} and $$et{OPTIONS}{SaveBin};
|
2958
2974
|
}
|
2959
2975
|
}
|
2960
2976
|
FormatJSON($fp, $val, $ind, $quote);
|
@@ -3928,24 +3944,29 @@ sub ConvertBinary($)
|
|
3928
3944
|
|
3929
3945
|
#------------------------------------------------------------------------------
|
3930
3946
|
# Compare ValueConv and PrintConv values of a tag to see if they are equal
|
3931
|
-
# Inputs: 0) value1, 1) value2
|
3947
|
+
# Inputs: 0) value1, 1) value2, 2) flag to return true for any scalar references
|
3932
3948
|
# Returns: true if they are equal
|
3933
|
-
sub IsEqual(
|
3949
|
+
sub IsEqual($$;$)
|
3934
3950
|
{
|
3935
|
-
my ($a, $b) = @_;
|
3951
|
+
my ($a, $b, $trueScalar) = @_;
|
3936
3952
|
# (scalar values are not print-converted)
|
3937
|
-
return 1 if $a eq $b
|
3953
|
+
return 1 if $a eq $b;
|
3954
|
+
if (ref $a eq 'SCALAR') {
|
3955
|
+
return 1 if $trueScalar;
|
3956
|
+
return 1 if ref $b eq 'SCALAR' and $$a eq $$b;
|
3957
|
+
return 0;
|
3958
|
+
}
|
3938
3959
|
if (ref $a eq 'HASH' and ref $b eq 'HASH') {
|
3939
3960
|
return 0 if scalar(keys %$a) != scalar(keys %$b);
|
3940
3961
|
my $key;
|
3941
3962
|
foreach $key (keys %$a) {
|
3942
|
-
return 0 unless IsEqual($$a{$key}, $$b{$key});
|
3963
|
+
return 0 unless IsEqual($$a{$key}, $$b{$key}, $trueScalar);
|
3943
3964
|
}
|
3944
3965
|
} else {
|
3945
3966
|
return 0 if ref $a ne 'ARRAY' or ref $b ne 'ARRAY' or @$a != @$b;
|
3946
3967
|
my $i;
|
3947
3968
|
for ($i=0; $i<scalar(@$a); ++$i) {
|
3948
|
-
return 0 unless IsEqual($$a[$i], $$b[$i]);
|
3969
|
+
return 0 unless IsEqual($$a[$i], $$b[$i], $trueScalar);
|
3949
3970
|
}
|
3950
3971
|
}
|
3951
3972
|
return 1;
|
@@ -4363,7 +4384,7 @@ sub FindFileWindows($$)
|
|
4363
4384
|
# recode file name as UTF-8 if necessary
|
4364
4385
|
my $enc = $et->Options('CharsetFileName');
|
4365
4386
|
$wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8';
|
4366
|
-
$wildfile
|
4387
|
+
CleanFilename($wildfile); # use forward slashes
|
4367
4388
|
my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile);
|
4368
4389
|
if (HasWildcards($dir)) {
|
4369
4390
|
Warn "Wildcards don't work in the directory specification\n";
|
@@ -4443,7 +4464,7 @@ sub AbsPath($)
|
|
4443
4464
|
local $SIG{'__WARN__'} = sub { };
|
4444
4465
|
$path = eval { Cwd::abs_path($file) };
|
4445
4466
|
}
|
4446
|
-
$path
|
4467
|
+
CleanFilename($path) if defined $path; # use forward slashes
|
4447
4468
|
}
|
4448
4469
|
return $path;
|
4449
4470
|
}
|
@@ -4518,6 +4539,10 @@ sub SuggestedExtension($$$)
|
|
4518
4539
|
} elsif ($$valPt =~ /^.{4}ftyp(3gp|mp4|f4v|qt )/s) {
|
4519
4540
|
my %movType = ( 'qt ' => 'mov' );
|
4520
4541
|
$ext = $movType{$1} || $1;
|
4542
|
+
} elsif ($$valPt =~ /^<(!DOCTYPE )?html/i) {
|
4543
|
+
$ext = 'html';
|
4544
|
+
} elsif ($$valPt =~ /^[\n\r]*\{[\n\r]*\\rtf/) {
|
4545
|
+
$ext = 'rtf';
|
4521
4546
|
} elsif ($$valPt !~ /^.{0,4096}\0/s) {
|
4522
4547
|
$ext = 'txt';
|
4523
4548
|
} elsif ($$valPt =~ /^BM.{15}\0/s) {
|
@@ -5054,50 +5079,51 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
5054
5079
|
|
5055
5080
|
File Types
|
5056
5081
|
------------+-------------+-------------+-------------+------------
|
5057
|
-
360 r/w |
|
5058
|
-
3FR r |
|
5059
|
-
3G2 r/w |
|
5060
|
-
3GP r/w |
|
5061
|
-
7Z r |
|
5062
|
-
A r |
|
5063
|
-
AA r |
|
5064
|
-
AAC r |
|
5065
|
-
AAE r |
|
5066
|
-
AAX r/w |
|
5067
|
-
ACR r |
|
5068
|
-
AFM r |
|
5069
|
-
AI r/w |
|
5070
|
-
AIFF r |
|
5071
|
-
APE r |
|
5072
|
-
ARQ r/w |
|
5073
|
-
ARW r/w |
|
5074
|
-
ASF r |
|
5075
|
-
AVI r |
|
5076
|
-
AVIF r/w |
|
5077
|
-
AZW r |
|
5078
|
-
BMP r |
|
5079
|
-
BPG r |
|
5080
|
-
BTF r |
|
5081
|
-
C2PA r |
|
5082
|
-
CHM r |
|
5083
|
-
COS r |
|
5084
|
-
CR2 r/w |
|
5085
|
-
CR3 r/w |
|
5086
|
-
CRM r/w |
|
5087
|
-
CRW r/w |
|
5088
|
-
CS1 r/w |
|
5089
|
-
CSV r |
|
5090
|
-
CUR r |
|
5091
|
-
CZI r |
|
5092
|
-
DCM r |
|
5093
|
-
DCP r/w |
|
5094
|
-
DCR r |
|
5095
|
-
DFONT r |
|
5096
|
-
DIVX r |
|
5097
|
-
DJVU r |
|
5098
|
-
DLL r |
|
5099
|
-
DNG r/w |
|
5100
|
-
DOC r |
|
5082
|
+
360 r/w | DPX r | JNG r/w | ODP r | RSRC r
|
5083
|
+
3FR r | DR4 r/w/c | JP2 r/w | ODS r | RTF r
|
5084
|
+
3G2 r/w | DSS r | JPEG r/w | ODT r | RW2 r/w
|
5085
|
+
3GP r/w | DV r | JSON r | OFR r | RWL r/w
|
5086
|
+
7Z r | DVB r/w | JXL r/w | OGG r | RWZ r
|
5087
|
+
A r | DVR-MS r | K25 r | OGV r | RM r
|
5088
|
+
AA r | DYLIB r | KDC r | ONP r | SEQ r
|
5089
|
+
AAC r | EIP r | KEY r | OPUS r | SKETCH r
|
5090
|
+
AAE r | EPS r/w | LA r | ORF r/w | SO r
|
5091
|
+
AAX r/w | EPUB r | LFP r | ORI r/w | SR2 r/w
|
5092
|
+
ACR r | ERF r/w | LIF r | OTF r | SRF r
|
5093
|
+
AFM r | EXE r | LNK r | PAC r | SRW r/w
|
5094
|
+
AI r/w | EXIF r/w/c | LRV r/w | PAGES r | SVG r
|
5095
|
+
AIFF r | EXR r | M2TS r | PBM r/w | SWF r
|
5096
|
+
APE r | EXV r/w/c | M4A/V r/w | PCAP r | THM r/w
|
5097
|
+
ARQ r/w | F4A/V r/w | MACOS r | PCAPNG r | TIFF r/w
|
5098
|
+
ARW r/w | FFF r/w | MAX r | PCD r | TNEF r
|
5099
|
+
ASF r | FITS r | MEF r/w | PCX r | TORRENT r
|
5100
|
+
AVI r | FLA r | MIE r/w/c | PDB r | TTC r
|
5101
|
+
AVIF r/w | FLAC r | MIFF r | PDF r/w | TTF r
|
5102
|
+
AZW r | FLIF r/w | MKA r | PEF r/w | TXT r
|
5103
|
+
BMP r | FLV r | MKS r | PFA r | VCF r
|
5104
|
+
BPG r | FPF r | MKV r | PFB r | VNT r
|
5105
|
+
BTF r | FPX r | MNG r/w | PFM r | VRD r/w/c
|
5106
|
+
C2PA r | GIF r/w | MOBI r | PGF r | VSD r
|
5107
|
+
CHM r | GLV r/w | MODD r | PGM r/w | WAV r
|
5108
|
+
COS r | GPR r/w | MOI r | PLIST r | WDP r/w
|
5109
|
+
CR2 r/w | GZ r | MOS r/w | PICT r | WEBP r/w
|
5110
|
+
CR3 r/w | HDP r/w | MOV r/w | PMP r | WEBM r
|
5111
|
+
CRM r/w | HDR r | MP3 r | PNG r/w | WMA r
|
5112
|
+
CRW r/w | HEIC r/w | MP4 r/w | PPM r/w | WMV r
|
5113
|
+
CS1 r/w | HEIF r/w | MPC r | PPT r | WPG r
|
5114
|
+
CSV r | HTML r | MPG r | PPTX r | WTV r
|
5115
|
+
CUR r | ICC r/w/c | MPO r/w | PS r/w | WV r
|
5116
|
+
CZI r | ICO r | MQV r/w | PSB r/w | X3F r/w
|
5117
|
+
DCM r | ICS r | MRC r | PSD r/w | XCF r
|
5118
|
+
DCP r/w | IDML r | MRW r/w | PSP r | XISF r
|
5119
|
+
DCR r | IIQ r/w | MXF r | QTIF r/w | XLS r
|
5120
|
+
DFONT r | IND r/w | NEF r/w | R3D r | XLSX r
|
5121
|
+
DIVX r | INSP r/w | NKA r | RA r | XMP r/w/c
|
5122
|
+
DJVU r | INSV r | NKSC r/w | RAF r/w | ZIP r
|
5123
|
+
DLL r | INX r | NRW r/w | RAM r |
|
5124
|
+
DNG r/w | ISO r | NUMBERS r | RAR r |
|
5125
|
+
DOC r | ITC r | NXD r | RAW r/w |
|
5126
|
+
DOCX r | J2C r | O r | RIFF r |
|
5101
5127
|
|
5102
5128
|
Meta Information
|
5103
5129
|
----------------------+----------------------+---------------------
|
@@ -5809,12 +5835,12 @@ escaped. The inverse conversion is applied when writing tags.
|
|
5809
5835
|
=item B<-f> (B<-forcePrint>)
|
5810
5836
|
|
5811
5837
|
Force printing of tags even if they don't exist. This option applies to
|
5812
|
-
tags specified on the command line, or with the B<-p>, B<-if>
|
5813
|
-
|
5814
|
-
is set to a dash (C<->) by
|
5815
|
-
|
5816
|
-
|
5817
|
-
B<-csv>=I<CSVFILE> feature.
|
5838
|
+
tags specified on the command line, or with the B<-p>, B<-if> (unless the
|
5839
|
+
API UndefTags option is set), B<-fileNUM> or B<-tagsFromFile> options. When
|
5840
|
+
B<-f> is used, the value of any missing tag is set to a dash (C<->) by
|
5841
|
+
default, but this may be configured via the API MissingTagValue option.
|
5842
|
+
B<-f> is also used to add a 'flags' attribute to the B<-listx> output, or to
|
5843
|
+
allow tags to be deleted when writing with the B<-csv>=I<CSVFILE> feature.
|
5818
5844
|
|
5819
5845
|
=item B<-g>[I<NUM>][:I<NUM>...] (B<-groupHeadings>)
|
5820
5846
|
|
@@ -5879,13 +5905,15 @@ Adding the B<-D> or B<-H> option changes tag values to JSON objects with
|
|
5879
5905
|
"val" and "id" fields. Adding B<-l> adds a "desc" field, and a "num" field
|
5880
5906
|
if the numerical value is different from the converted "val", and "fmt" and
|
5881
5907
|
"hex" fields for EXIF metadata if the API SaveFormat and SaveBin options are
|
5882
|
-
set respectively
|
5883
|
-
LimitLongValues setting.
|
5884
|
-
|
5885
|
-
|
5886
|
-
|
5887
|
-
|
5888
|
-
|
5908
|
+
set respectively. The length of the "hex" output is limited by the API
|
5909
|
+
LimitLongValues setting. Setting the SaveBin option also causes the
|
5910
|
+
original values of Rational tags to be returned in string form as an extra
|
5911
|
+
"rat" field. The B<-b> option may be added to output binary data, encoded
|
5912
|
+
in base64 if necessary (indicated by ASCII "base64:" as the first 7 bytes of
|
5913
|
+
the value), and B<-t> may be added to include tag table information (see
|
5914
|
+
B<-t> for details). The JSON output is UTF-8 regardless of any B<-L> or
|
5915
|
+
B<-charset> option setting, but the UTF-8 validation is disabled if a
|
5916
|
+
character set other than UTF-8 is specified.
|
5889
5917
|
|
5890
5918
|
Note that ExifTool quotes JSON values only if they don't look like numbers
|
5891
5919
|
(regardless of the original storage format or the relevant metadata
|
@@ -5979,7 +6007,7 @@ translation, follow these steps (you must have Perl installed for this):
|
|
5979
6007
|
6. Edit the generated language module lib/Image/ExifTool/Lang/ru.pm, and
|
5980
6008
|
search and replace all 'MISSING' strings in the file with your translations.
|
5981
6009
|
|
5982
|
-
7. Email the module ('ru.pm' in this example) to
|
6010
|
+
7. Email the module ('ru.pm' in this example) to exiftool@gmail.com
|
5983
6011
|
|
5984
6012
|
8. Thank you!!
|
5985
6013
|
|
@@ -5989,7 +6017,7 @@ For list-type tags, this causes only the item with the specified index to be
|
|
5989
6017
|
extracted. I<INDEX> is 0 for the first item in the list. Negative indices
|
5990
6018
|
may also be used to reference items from the end of the list. Has no effect
|
5991
6019
|
on single-valued tags. Also applies to tag values when copying from a tag,
|
5992
|
-
and in B<-if>
|
6020
|
+
and in B<-if>, B<-p> and B<-fileNUM> arguments.
|
5993
6021
|
|
5994
6022
|
=item B<-n> (B<--printConv>)
|
5995
6023
|
|
@@ -6054,7 +6082,7 @@ with this command:
|
|
6054
6082
|
|
6055
6083
|
produces output like this:
|
6056
6084
|
|
6057
|
-
-- Generated by ExifTool 13.
|
6085
|
+
-- Generated by ExifTool 13.36 --
|
6058
6086
|
File: a.jpg - 2003:10:31 15:44:19
|
6059
6087
|
(f/5.6, 1/60s, ISO 100)
|
6060
6088
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6602,11 +6630,8 @@ Notes:
|
|
6602
6630
|
|
6603
6631
|
1) The B<-n> and B<-b> options also apply to tags used in I<EXPR>.
|
6604
6632
|
|
6605
|
-
2)
|
6606
|
-
|
6607
|
-
also specified on the command line. The alternative is to use the
|
6608
|
-
C<$GROUP:all> syntax. (eg. Use C<$exif:all> instead of C<$exif> in I<EXPR>
|
6609
|
-
to test for the existence of EXIF tags.)
|
6633
|
+
2) The API RequestTags option is automatically set for all tags used in the
|
6634
|
+
B<-if> condition.
|
6610
6635
|
|
6611
6636
|
3) Tags in the string are interpolated in a similar way to B<-p> before the
|
6612
6637
|
expression is evaluated. In this interpolation, C<$/> is converted to a
|
@@ -6628,8 +6653,11 @@ C<$Copy1:TAG>, C<$Copy2:TAG>, etc).
|
|
6628
6653
|
command when B<-execute> was used, and may be used like any other tag in the
|
6629
6654
|
condition (ie. "$OK").
|
6630
6655
|
|
6631
|
-
7) The
|
6632
|
-
B<-
|
6656
|
+
7) The values of undefined tags in the expression are affected by the B<-f>
|
6657
|
+
and B<-m> options unless the API UndefTags option is also set.
|
6658
|
+
|
6659
|
+
8) The condition fails if a Perl error occurs. This could happen for
|
6660
|
+
instance if an undefined value (eg. a missing tag) is used improperly.
|
6633
6661
|
|
6634
6662
|
=item B<-m> (B<-ignoreMinorErrors>)
|
6635
6663
|
|
@@ -6641,8 +6669,9 @@ so ExifTool leaves it up to you to make the final decision. Minor errors
|
|
6641
6669
|
and warnings are indicated by "[minor]" at the start of the message.
|
6642
6670
|
Warnings which affect processing when ignored are indicated by "[Minor]"
|
6643
6671
|
(with a capital "M"). Note that this causes missing values in
|
6644
|
-
B<-tagsFromFile>, B<-p> and B<-
|
6645
|
-
rather than an undefined value
|
6672
|
+
B<-tagsFromFile>, B<-p>, B<-if> and B<-fileNUM> strings to be set to an
|
6673
|
+
empty string rather than an undefined value (but this may be avoided for
|
6674
|
+
B<-if> using the API UndefTags option).
|
6646
6675
|
|
6647
6676
|
=item B<-o> I<OUTFILE> or I<FMT> (B<-out>)
|
6648
6677
|
|
@@ -7150,6 +7179,10 @@ Subtle note: If a B<-tagsFromFile> option is used, tags in the I<ALTFILE>
|
|
7150
7179
|
argument come from the I<SRCFILE> that applies to the first argument
|
7151
7180
|
accessing tags from the corresponding C<FileNUM> group.
|
7152
7181
|
|
7182
|
+
I<ALTFILE> may also be C<@> to access tags from the specified I<FILE>, which
|
7183
|
+
may be useful when the B<-srcfile> option is used to process a different
|
7184
|
+
source file.
|
7185
|
+
|
7153
7186
|
User-defined Composite tags may access tags from alternate files using the
|
7154
7187
|
appropriate (case-sensitive) family 8 group name.
|
7155
7188
|
|
@@ -7254,11 +7287,11 @@ Set user parameter. I<PARAM> is an arbitrary user parameter name. This is
|
|
7254
7287
|
an interface to the API UserParam option (see the
|
7255
7288
|
L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
|
7256
7289
|
provides a method to access user-defined parameters in arguments to the
|
7257
|
-
B<-if> and B<-
|
7258
|
-
tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also
|
7259
|
-
parameter to be extracted as a normal tag in the UserParam group.
|
7260
|
-
to the B<-api> option, the parameter value is set to 1 if I<=VAL>
|
7261
|
-
omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
|
7290
|
+
B<-if>, B<-p> and B<-fileNUM> options as if they were any other tag.
|
7291
|
+
Appending a hash tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also
|
7292
|
+
causes the parameter to be extracted as a normal tag in the UserParam group.
|
7293
|
+
Similar to the B<-api> option, the parameter value is set to 1 if I<=VAL>
|
7294
|
+
is omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
|
7262
7295
|
I<VAL> is omitted with C<^=>.
|
7263
7296
|
|
7264
7297
|
exiftool -p '$test from $filename' -userparam test=Hello FILE
|
@@ -7268,18 +7301,20 @@ I<VAL> is omitted with C<^=>.
|
|
7268
7301
|
=head3 Advanced formatting feature
|
7269
7302
|
|
7270
7303
|
An advanced formatting feature allows modification of the value of any tag
|
7271
|
-
interpolated within a B<-if> or B<-
|
7272
|
-
redirection string. Tag names within these strings are
|
7273
|
-
symbol, and an arbitrary Perl expression may be applied
|
7274
|
-
placing braces around the tag name and inserting the
|
7275
|
-
name, separated by a semicolon (ie. C<${TAG;EXPR}>).
|
7276
|
-
the value of the tag through the default input
|
7277
|
-
access to the full ExifTool API through the
|
7278
|
-
(C<$self>) and the tag key (C<$tag>). It may
|
7279
|
-
including translation (C<tr///>) and
|
7280
|
-
note that braces within the
|
7281
|
-
|
7282
|
-
|
7304
|
+
interpolated within a B<-if>, B<-p> or B<-fileNUM> argument, or a
|
7305
|
+
B<-tagsFromFile> redirection string. Tag names within these strings are
|
7306
|
+
prefixed by a C<$> symbol, and an arbitrary Perl expression may be applied
|
7307
|
+
to the tag value by placing braces around the tag name and inserting the
|
7308
|
+
expression after the name, separated by a semicolon (ie. C<${TAG;EXPR}>).
|
7309
|
+
The expression acts on the value of the tag through the default input
|
7310
|
+
variable (C<$_>), and has access to the full ExifTool API through the
|
7311
|
+
current ExifTool object (C<$self>) and the tag key (C<$tag>). It may
|
7312
|
+
contain any valid Perl code, including translation (C<tr///>) and
|
7313
|
+
substitution (C<s///>) operations, but note that braces within the
|
7314
|
+
expression must be balanced. If the expression does not modify C<$_> the
|
7315
|
+
original tag value is returned. The example below prints the camera Make
|
7316
|
+
with spaces translated to underlines, and multiple consecutive underlines
|
7317
|
+
replaced by a single underline:
|
7283
7318
|
|
7284
7319
|
exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg
|
7285
7320
|
|
@@ -7298,6 +7333,8 @@ used in file names.)
|
|
7298
7333
|
|
7299
7334
|
=head4 Helper functions
|
7300
7335
|
|
7336
|
+
Note that function names are case sensitive.
|
7337
|
+
|
7301
7338
|
C<DateFmt>
|
7302
7339
|
|
7303
7340
|
Simplifies reformatting of individual date/time values. This function acts
|
@@ -7335,8 +7372,6 @@ rewritten unnecessarily:
|
|
7335
7372
|
|
7336
7373
|
exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
|
7337
7374
|
|
7338
|
-
Note that function names are case sensitive.
|
7339
|
-
|
7340
7375
|
ExifTool 12.64 adds an API NoDups option which makes the NoDups helper
|
7341
7376
|
function largely redundant, with all the functionality except the ability to
|
7342
7377
|
avoid rewriting the file if there are no duplicates, but with the advantage
|
@@ -271,11 +271,11 @@ tags remain.
|
|
271
271
|
|
272
272
|
The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and
|
273
273
|
other tags which are not part of the EXIF specification, but may co-exist
|
274
|
-
with EXIF tags in some images. Tags which are part of the EXIF
|
274
|
+
with EXIF tags in some images. Tags which are part of the EXIF 3.0
|
275
275
|
specification have an underlined B<Tag Name> in the HTML version of this
|
276
276
|
documentation. See
|
277
|
-
L<https://
|
278
|
-
for the official EXIF
|
277
|
+
L<https://www.cipa.jp/std/documents/download_e.html?CIPA_DC-008-2024-E>
|
278
|
+
for the official EXIF 3.0 specification.
|
279
279
|
},
|
280
280
|
GPS => q{
|
281
281
|
These GPS tags are part of the EXIF standard, and are stored in a separate
|
@@ -2338,7 +2338,8 @@ sub WriteTagNames($$)
|
|
2338
2338
|
my ($hid, $showGrp);
|
2339
2339
|
# widths of the different columns in the POD documentation
|
2340
2340
|
my ($wID,$wTag,$wReq,$wGrp) = (8,36,24,10);
|
2341
|
-
my ($composite, $derived, $notes, $longTags, $
|
2341
|
+
my ($composite, $derived, $notes, $longTags, $prefix);
|
2342
|
+
my $wasLong = 0;
|
2342
2343
|
if ($short eq 'Shortcuts') {
|
2343
2344
|
$derived = '<th>Refers To</th>';
|
2344
2345
|
$composite = 2;
|
@@ -2396,7 +2397,7 @@ sub WriteTagNames($$)
|
|
2396
2397
|
$wID -= $longTag - $wTag;
|
2397
2398
|
$wTag = $longTag;
|
2398
2399
|
}
|
2399
|
-
|
2400
|
+
++$wasLong if $wID <= $self->{LONG_ID}->{$tableName};
|
2400
2401
|
}
|
2401
2402
|
} elsif ($composite) {
|
2402
2403
|
$wTag += $wID - $wReq;
|
@@ -2471,6 +2472,7 @@ sub WriteTagNames($$)
|
|
2471
2472
|
if ($over <= $wTag - length($$tagNames[0])) {
|
2472
2473
|
$wTag2 -= $over;
|
2473
2474
|
$w += $over;
|
2475
|
+
--$wasLong;
|
2474
2476
|
} else {
|
2475
2477
|
# put tag name on next line if ID is too long
|
2476
2478
|
$idStr = " $tagIDstr\n " . (' ' x $w);
|