exiftool_vendored 13.40.0 → 13.42.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 +35 -1
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +134 -102
- data/bin/lib/Image/ExifTool/Canon.pm +19 -13
- data/bin/lib/Image/ExifTool/Exif.pm +11 -6
- data/bin/lib/Image/ExifTool/Font.pm +3 -4
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -1
- data/bin/lib/Image/ExifTool/JSON.pm +7 -6
- data/bin/lib/Image/ExifTool/LNK.pm +15 -2
- data/bin/lib/Image/ExifTool/Olympus.pm +4 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +22 -2
- data/bin/lib/Image/ExifTool/Red.pm +19 -9
- data/bin/lib/Image/ExifTool/Samsung.pm +127 -4
- data/bin/lib/Image/ExifTool/Sony.pm +4 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +70 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +127 -5
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +8 -1
- data/bin/lib/Image/ExifTool.pm +18 -6
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 769a367333375cb7b0796e2b334c49c8eaed8da6ca289b2de271f9a1a5499b6f
|
|
4
|
+
data.tar.gz: 7e7044a2d8044fe48f633c11b2812ed752e5091c5d19db7153fc415cec06bb95
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 18a51166538f3a2de6aaf41f8d896b30ff5baba653051eb77f16f91b35502c52e7d7c251081a3ee95c8f7efad8c5dcc1731afc284dfc67b1a6f79b879d1b049b
|
|
7
|
+
data.tar.gz: cb7a7f441bd277e0b96ee7caecc3d65dc424eb035fdc6fc6d1a7c9c128d23040ee5d512fc66d0245d3857a9b5c14d38a21e95aa9a55dbd72c426e8711d67b8ab
|
data/bin/Changes
CHANGED
|
@@ -7,13 +7,47 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 13.36. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Nov. 17, 2025 - Version 13.42
|
|
11
|
+
|
|
12
|
+
- Added warning if tag arguments come before -csv= or -json= in a command
|
|
13
|
+
- Added a new CanonModelID and RFLensType (thanks Norbert Wasser)
|
|
14
|
+
- Added ability to read XML as a block from Sony MP4 videos
|
|
15
|
+
- Added "EOS" to the R5 Mark II CanonModelID string
|
|
16
|
+
- Decode ReEditData in Samsung trailer
|
|
17
|
+
- Decode a couple more Sony rtmd tags from MP4 videos
|
|
18
|
+
- Tolerate some types of trailer corruption as caused by Samsung Gallery
|
|
19
|
+
- Restrict decoding of MetaImageSize to HEIC files only
|
|
20
|
+
- Fixed issue writing Keys tags to Sony PMW-EX1R videos
|
|
21
|
+
- Fixed behaviour of CSV/JSON import when specifying tags to import into an
|
|
22
|
+
existing list, or when importing ValueConv values (ie. "TAG#"), or when
|
|
23
|
+
specifying a group name of "All"
|
|
24
|
+
|
|
25
|
+
Nov. 5, 2025 - Version 13.41
|
|
26
|
+
|
|
27
|
+
- Added a new Canon LensType
|
|
28
|
+
- Added Extra MakerNoteByteOrder tag
|
|
29
|
+
- Added byte-order indication to the -v3 output for EXIF and BinaryData
|
|
30
|
+
directories
|
|
31
|
+
- Added a new Panasonic/Olympus LensType (github #363)
|
|
32
|
+
- Added a new ProfileCMMType value (thanks Herb)
|
|
33
|
+
- Extract EnvironmentTarget from LNK files (github #362)
|
|
34
|
+
- Extract HighlightMarkers from DJI videos
|
|
35
|
+
- Decode another Red tag
|
|
36
|
+
- Recognize LRF file extension
|
|
37
|
+
- Updated CanonColorData decoding for the R50V
|
|
38
|
+
- Enhanced -csv= and -json= database import options to support full
|
|
39
|
+
redirection and advanced formatting expressions
|
|
40
|
+
- Require tags to be specified after the corresponding -csv= or -json= option
|
|
41
|
+
when importing specific tags from a database
|
|
42
|
+
- Fixed problem reading R3D images from the Red Komodo
|
|
43
|
+
|
|
10
44
|
Oct. 24, 2025 - Version 13.40
|
|
11
45
|
|
|
12
46
|
- Added read support for WOFF and WOFF2 font files (github #358)
|
|
13
47
|
- Added read support for Windows .URL files
|
|
14
48
|
- Added new XMP-iptcExt generative AI tags (thanks IPTC)
|
|
15
49
|
- Added config_files/local_time.config to the full distribution
|
|
16
|
-
- Enhanced CSV import allow SourceFile entries with a different case
|
|
50
|
+
- Enhanced CSV import to allow SourceFile entries with a different case
|
|
17
51
|
|
|
18
52
|
Oct. 15, 2025 - Version 13.39
|
|
19
53
|
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
|
@@ -111,8 +111,8 @@ your home directory, then you would type the following commands in a
|
|
|
111
111
|
terminal window to extract and run ExifTool:
|
|
112
112
|
|
|
113
113
|
cd ~/Desktop
|
|
114
|
-
gzip -dc Image-ExifTool-13.
|
|
115
|
-
cd Image-ExifTool-13.
|
|
114
|
+
gzip -dc Image-ExifTool-13.42.tar.gz | tar -xf -
|
|
115
|
+
cd Image-ExifTool-13.42
|
|
116
116
|
./exiftool t/images/ExifTool.jpg
|
|
117
117
|
|
|
118
118
|
Note: These commands extract meta information from one of the test images.
|
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.42';
|
|
15
15
|
|
|
16
16
|
$^W = 1; # enable global warnings
|
|
17
17
|
|
|
@@ -97,6 +97,7 @@ END {
|
|
|
97
97
|
# declare all static file-scope variables
|
|
98
98
|
my @commonArgs; # arguments common to all commands
|
|
99
99
|
my @condition; # conditional processing of files
|
|
100
|
+
my @csvExclude; # list of tags excluded from CSV import
|
|
100
101
|
my @csvFiles; # list of files when reading with CSV option (in ExifTool Charset)
|
|
101
102
|
my @csvTags; # order of tags for first file with CSV option (lower case)
|
|
102
103
|
my @delFiles; # list of files to delete
|
|
@@ -151,9 +152,9 @@ my $countNewDir; # count of directories created
|
|
|
151
152
|
my $countSameWr; # count files written OK but not changed
|
|
152
153
|
my $critical; # flag for critical operations (disable CTRL-C)
|
|
153
154
|
my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
|
|
154
|
-
my $csvAdd; # flag to add CSV information to existing lists
|
|
155
155
|
my $csvDelim; # delimiter for CSV files
|
|
156
|
-
my $
|
|
156
|
+
my $dbAdd; # flag to add CSV/JSON information to existing lists
|
|
157
|
+
my $dbSaveCount; # save counter for last CSV/JSON file loaded
|
|
157
158
|
my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
|
|
158
159
|
my $diff; # file name for comparing differences
|
|
159
160
|
my $disableOutput; # flag to disable normal output
|
|
@@ -441,6 +442,7 @@ if ($stayOpen >= 2) {
|
|
|
441
442
|
# (not done: @commonArgs, @moreArgs, $critical, $binaryStdout, $helped,
|
|
442
443
|
# $interrupted, $mt, $pause, $rtnValApp, $rtnValPrev, $stayOpen, $stayOpenBuff, $stayOpenFile)
|
|
443
444
|
undef @condition;
|
|
445
|
+
undef @csvExclude;
|
|
444
446
|
undef @csvFiles;
|
|
445
447
|
undef @csvTags;
|
|
446
448
|
undef @delFiles;
|
|
@@ -483,7 +485,7 @@ undef $binSep;
|
|
|
483
485
|
undef $binTerm;
|
|
484
486
|
undef $comma;
|
|
485
487
|
undef $csv;
|
|
486
|
-
undef $
|
|
488
|
+
undef $dbAdd;
|
|
487
489
|
undef $deleteOrig;
|
|
488
490
|
undef $diff;
|
|
489
491
|
undef $disableOutput;
|
|
@@ -548,7 +550,7 @@ $countGoodWr = 0;
|
|
|
548
550
|
$countNewDir = 0;
|
|
549
551
|
$countSameWr = 0;
|
|
550
552
|
$csvDelim = ',';
|
|
551
|
-
$
|
|
553
|
+
$dbSaveCount = 0;
|
|
552
554
|
$fileTrailer = '';
|
|
553
555
|
$filterFlag = 0;
|
|
554
556
|
$html = 0;
|
|
@@ -578,6 +580,7 @@ my $escapeXML; # flag to escape printed values for xml
|
|
|
578
580
|
my $setTagsFile; # filename for last TagsFromFile option
|
|
579
581
|
my $sortOpt; # sort option is used
|
|
580
582
|
my $srcStdin; # one of the source files is STDIN
|
|
583
|
+
my $tagsFrom = ''; # tags on command line come from 'CSV' or 'File'
|
|
581
584
|
my $useMWG; # flag set if we are using any MWG tag
|
|
582
585
|
|
|
583
586
|
my ($argsLeft, @nextPass, $badCmd);
|
|
@@ -812,6 +815,7 @@ for (;;) {
|
|
|
812
815
|
}
|
|
813
816
|
# create necessary lists, etc for this new -tagsFromFile file
|
|
814
817
|
AddSetTagsFile($setTagsFile, { Replace => ($1 and lc($1) eq 'add') ? 0 : 1 } );
|
|
818
|
+
$tagsFrom = 'File';
|
|
815
819
|
next;
|
|
816
820
|
}
|
|
817
821
|
if ($a eq '@') {
|
|
@@ -919,35 +923,50 @@ for (;;) {
|
|
|
919
923
|
next;
|
|
920
924
|
}
|
|
921
925
|
/^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
|
|
922
|
-
if (/^csv(\+?=.*)?$/i) {
|
|
923
|
-
my $
|
|
926
|
+
if (/^(csv|j(son)?)(\+?=.*)?$/i) {
|
|
927
|
+
my $dbFile = $3;
|
|
928
|
+
my $dbType = lc($1) eq 'csv' ? 'CSV' : 'JSON';
|
|
929
|
+
unless ($dbFile) {
|
|
930
|
+
if ($dbType eq 'CSV') {
|
|
931
|
+
$csv = $dbType;
|
|
932
|
+
} else {
|
|
933
|
+
$json = 1;
|
|
934
|
+
$html = $xml = 0;
|
|
935
|
+
$mt->Options(Duplicates => 1);
|
|
936
|
+
require Image::ExifTool::XMP; # for FixUTF8()
|
|
937
|
+
}
|
|
938
|
+
next;
|
|
939
|
+
}
|
|
924
940
|
# must process on 2nd pass so -f and -charset options are available
|
|
925
941
|
unless ($pass) {
|
|
942
|
+
@tags and Warn("Tag arguments should come after the -$1= option\n");
|
|
926
943
|
push @nextPass, "-$_";
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
}
|
|
944
|
+
push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
|
|
945
|
+
$dbSaveCount = $saveCount;
|
|
946
|
+
$tagsFrom = 'CSV';
|
|
931
947
|
next;
|
|
932
948
|
}
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
949
|
+
$dbFile =~ s/^(\+?=)//;
|
|
950
|
+
$dbAdd = 2 if $1 eq '+=';
|
|
951
|
+
$vout = \*STDERR if $srcStdin;
|
|
952
|
+
$verbose and print $vout "Reading $dbType file $dbFile\n";
|
|
953
|
+
my $msg;
|
|
954
|
+
if ($mt->Open(\*CSVFILE, $dbFile)) {
|
|
955
|
+
binmode CSVFILE;
|
|
956
|
+
require Image::ExifTool::Import;
|
|
957
|
+
if ($dbType eq 'CSV') {
|
|
942
958
|
$msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
|
|
943
|
-
close(CSVFILE);
|
|
944
959
|
} else {
|
|
945
|
-
$
|
|
960
|
+
my $chset = $mt->Options('Charset');
|
|
961
|
+
$msg = Image::ExifTool::Import::ReadJSON(\*CSVFILE, \%database, $forcePrint, $chset);
|
|
946
962
|
}
|
|
947
|
-
|
|
948
|
-
|
|
963
|
+
close(CSVFILE);
|
|
964
|
+
} else {
|
|
965
|
+
$msg = "Error opening $dbType file '${dbFile}'";
|
|
949
966
|
}
|
|
950
|
-
$
|
|
967
|
+
$msg and Warn("$msg\n");
|
|
968
|
+
$isWriting = 1;
|
|
969
|
+
$csv = $dbType;
|
|
951
970
|
next;
|
|
952
971
|
}
|
|
953
972
|
if (/^csvdelim$/i) {
|
|
@@ -1110,41 +1129,6 @@ for (;;) {
|
|
|
1110
1129
|
push @condition, $cond;
|
|
1111
1130
|
next;
|
|
1112
1131
|
}
|
|
1113
|
-
if (/^j(son)?(\+?=.*)?$/i) {
|
|
1114
|
-
if ($2) {
|
|
1115
|
-
# must process on 2nd pass because we need -f and -charset options
|
|
1116
|
-
unless ($pass) {
|
|
1117
|
-
push @nextPass, "-$_";
|
|
1118
|
-
push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
|
|
1119
|
-
$csvSaveCount = $saveCount;
|
|
1120
|
-
next;
|
|
1121
|
-
}
|
|
1122
|
-
my $jsonFile = $2;
|
|
1123
|
-
$jsonFile =~ s/^(\+?=)//;
|
|
1124
|
-
$csvAdd = 2 if $1 eq '+=';
|
|
1125
|
-
$vout = \*STDERR if $srcStdin;
|
|
1126
|
-
$verbose and print $vout "Reading JSON file $jsonFile\n";
|
|
1127
|
-
my $chset = $mt->Options('Charset');
|
|
1128
|
-
my $msg;
|
|
1129
|
-
if ($mt->Open(\*JSONFILE, $jsonFile)) {
|
|
1130
|
-
binmode JSONFILE;
|
|
1131
|
-
require Image::ExifTool::Import;
|
|
1132
|
-
$msg = Image::ExifTool::Import::ReadJSON(\*JSONFILE, \%database, $forcePrint, $chset);
|
|
1133
|
-
close(JSONFILE);
|
|
1134
|
-
} else {
|
|
1135
|
-
$msg = "Error opening JSON file '${jsonFile}'";
|
|
1136
|
-
}
|
|
1137
|
-
$msg and Warn("$msg\n");
|
|
1138
|
-
$isWriting = 1;
|
|
1139
|
-
$csv = 'JSON';
|
|
1140
|
-
} else {
|
|
1141
|
-
$json = 1;
|
|
1142
|
-
$html = $xml = 0;
|
|
1143
|
-
$mt->Options(Duplicates => 1);
|
|
1144
|
-
require Image::ExifTool::XMP; # for FixUTF8()
|
|
1145
|
-
}
|
|
1146
|
-
next;
|
|
1147
|
-
}
|
|
1148
1132
|
/^(k|pause)$/i and $pause = 1, next;
|
|
1149
1133
|
(/^l$/ or $a eq 'long') and --$outFormat, next;
|
|
1150
1134
|
(/^L$/ or $a eq 'latin') and $mt->Options(Charset => 'Latin'), next;
|
|
@@ -1365,10 +1349,12 @@ for (;;) {
|
|
|
1365
1349
|
my $tag = shift;
|
|
1366
1350
|
defined $tag or Error("Expecting tag name for -x option\n"), $badCmd=1, next;
|
|
1367
1351
|
$tag =~ s/\ball\b/\*/ig; # replace 'all' with '*' in tag names
|
|
1368
|
-
if ($
|
|
1369
|
-
push @{$setTags{$setTagsFile}}, "-$tag";
|
|
1370
|
-
} else {
|
|
1352
|
+
if (not $tagsFrom) {
|
|
1371
1353
|
push @exclude, $tag;
|
|
1354
|
+
} elsif ($tagsFrom eq 'CSV') {
|
|
1355
|
+
push @csvExclude, $tag;
|
|
1356
|
+
} else {
|
|
1357
|
+
push @{$setTags{$setTagsFile}}, "-$tag";
|
|
1372
1358
|
}
|
|
1373
1359
|
next;
|
|
1374
1360
|
}
|
|
@@ -1411,9 +1397,15 @@ for (;;) {
|
|
|
1411
1397
|
}
|
|
1412
1398
|
} else {
|
|
1413
1399
|
# assume '-tagsFromFile @' if tags are being redirected
|
|
1414
|
-
# and -tagsFromFile hasn't already been specified
|
|
1415
|
-
|
|
1416
|
-
|
|
1400
|
+
# and not from CSV and -tagsFromFile hasn't already been specified
|
|
1401
|
+
if (not $setTagsFile and $tagsFrom ne 'CSV' and /(<|>)/) {
|
|
1402
|
+
AddSetTagsFile($setTagsFile = '@');
|
|
1403
|
+
$tagsFrom = 'File';
|
|
1404
|
+
}
|
|
1405
|
+
if ($tagsFrom eq 'CSV') {
|
|
1406
|
+
my $lst = s/^-// ? \@csvExclude : \@tags;
|
|
1407
|
+
push @$lst, $_;
|
|
1408
|
+
} elsif ($setTagsFile) {
|
|
1417
1409
|
push @{$setTags{$setTagsFile}}, $_;
|
|
1418
1410
|
if ($1 eq '>') {
|
|
1419
1411
|
$useMWG = 1 if /^(.*>\s*)?([-_0-9A-Z]+:)*1?mwg:/si;
|
|
@@ -1718,7 +1710,7 @@ if (@newValues) {
|
|
|
1718
1710
|
$saveCount = $mt->SaveNewValues();
|
|
1719
1711
|
$needSave = 0;
|
|
1720
1712
|
# insert marker to load values from CSV file now if this was the CSV file
|
|
1721
|
-
push @dynamicFiles, \$csv if $$_{SaveCount} == $
|
|
1713
|
+
push @dynamicFiles, \$csv if $$_{SaveCount} == $dbSaveCount;
|
|
1722
1714
|
}
|
|
1723
1715
|
next;
|
|
1724
1716
|
}
|
|
@@ -1794,11 +1786,9 @@ if (@newValues) {
|
|
|
1794
1786
|
$wrn and Warning($mt, $wrn);
|
|
1795
1787
|
}
|
|
1796
1788
|
# exclude specified tags
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
$needSave = 1;
|
|
1801
|
-
}
|
|
1789
|
+
foreach (@exclude) {
|
|
1790
|
+
$mt->SetNewValue($_, undef, Replace => 2);
|
|
1791
|
+
$needSave = 1;
|
|
1802
1792
|
}
|
|
1803
1793
|
unless ($isWriting or $outOpt or @tags) {
|
|
1804
1794
|
Error "Nothing to do.\n";
|
|
@@ -3250,7 +3240,7 @@ sub SetImageInfo($$$)
|
|
|
3250
3240
|
next;
|
|
3251
3241
|
} elsif (ref $dyFile eq 'SCALAR') {
|
|
3252
3242
|
# set new values from CSV or JSON database
|
|
3253
|
-
my ($f, $found, $csvTag, $
|
|
3243
|
+
my ($f, $found, $csvTag, $tg, $csvEtPrt, $csvEtVal);
|
|
3254
3244
|
undef $evalWarning;
|
|
3255
3245
|
local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
|
|
3256
3246
|
# force UTF-8 if the database was JSON
|
|
@@ -3278,46 +3268,74 @@ sub SetImageInfo($$$)
|
|
|
3278
3268
|
if ($verbose) {
|
|
3279
3269
|
print $vout "Setting new values from $csv database\n";
|
|
3280
3270
|
print $vout 'Including tags: ',join(' ',@tags),"\n" if @tags;
|
|
3281
|
-
print $vout 'Excluding tags: ',join(' ',@
|
|
3271
|
+
print $vout 'Excluding tags: ',join(' ',@csvExclude),"\n" if @csvExclude;
|
|
3282
3272
|
}
|
|
3283
|
-
|
|
3284
|
-
|
|
3273
|
+
if (@tags) {
|
|
3274
|
+
# prepare a dummy ExifTool object to hold appropriate tags from the database
|
|
3275
|
+
$csvEtPrt = Image::ExifTool->new unless $csvEtPrt;
|
|
3276
|
+
foreach $csvTag (OrderedKeys($csvInfo)) {
|
|
3277
|
+
next if $csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;
|
|
3278
|
+
my @grps = split /:/, $csvTag;
|
|
3279
|
+
my $name = pop @grps;
|
|
3280
|
+
unshift @grps, 'All' while @grps < 2;
|
|
3281
|
+
if ($name =~ s/#$//) {
|
|
3282
|
+
# handle ValueConv tags separately
|
|
3283
|
+
$csvEtVal = Image::ExifTool->new unless $csvEtVal;
|
|
3284
|
+
$csvEtVal->FoundTag($name, $$csvInfo{$csvTag}, @grps);
|
|
3285
|
+
} else {
|
|
3286
|
+
$csvEtPrt->FoundTag($name, $$csvInfo{$csvTag}, @grps);
|
|
3287
|
+
}
|
|
3288
|
+
}
|
|
3289
|
+
next;
|
|
3290
|
+
}
|
|
3291
|
+
my @exclTags = @csvExclude;
|
|
3292
|
+
foreach (@exclTags) {
|
|
3285
3293
|
tr/-0-9a-zA-Z_:#?*//dc; # remove illegal characters
|
|
3286
3294
|
s/(^|:)(all:)+/$1/ig; # remove 'all' group names
|
|
3287
3295
|
s/(^|:)all(#?)$/$1*$2/i; # convert 'all' tag name to '*'
|
|
3288
3296
|
tr/?/./; s/\*/.*/g; # convert wildcards for regex
|
|
3289
3297
|
}
|
|
3298
|
+
# run through tags in database order
|
|
3290
3299
|
foreach $csvTag (OrderedKeys($csvInfo)) {
|
|
3291
3300
|
# don't write SourceFile, Directory or FileName
|
|
3292
3301
|
next if $csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;
|
|
3293
|
-
if (@
|
|
3294
|
-
my ($
|
|
3295
|
-
|
|
3296
|
-
$
|
|
3297
|
-
if ($tryTag =~ /:/) {
|
|
3302
|
+
if (@exclTags) {
|
|
3303
|
+
my ($exclTag, $exclGrp, $excluded);
|
|
3304
|
+
ExclMatch: foreach $exclTag (@exclTags) {
|
|
3305
|
+
if ($exclTag =~ /:/) {
|
|
3298
3306
|
next unless $csvTag =~ /:/; # db entry must also specify group
|
|
3299
3307
|
my @csvGrps = split /:/, $csvTag;
|
|
3300
|
-
my @
|
|
3301
|
-
my $
|
|
3302
|
-
next unless pop(@csvGrps) =~ /^$
|
|
3303
|
-
foreach $
|
|
3308
|
+
my @exclGrps = split /:/, $exclTag;
|
|
3309
|
+
my $exclName = pop @exclGrps;
|
|
3310
|
+
next unless pop(@csvGrps) =~ /^$exclName$/i; # tag name must match
|
|
3311
|
+
foreach $exclGrp (@exclGrps) {
|
|
3304
3312
|
# each specified group name must match db entry
|
|
3305
|
-
next
|
|
3313
|
+
next ExclMatch unless grep /^$exclGrp$/i, @csvGrps;
|
|
3306
3314
|
}
|
|
3307
|
-
$
|
|
3315
|
+
$excluded = 1;
|
|
3308
3316
|
last;
|
|
3309
3317
|
}
|
|
3310
3318
|
# no group specified, so match by tag name only
|
|
3311
|
-
$csvTag =~ /^([-_0-9A-Z]+:)*$
|
|
3319
|
+
$csvTag =~ /^([-_0-9A-Z]+:)*$exclTag$/i and $excluded = 1, last;
|
|
3312
3320
|
}
|
|
3313
|
-
next if $
|
|
3321
|
+
next if $excluded;
|
|
3314
3322
|
}
|
|
3315
3323
|
my ($rtn, $wrn) = $et->SetNewValue($csvTag, $$csvInfo{$csvTag},
|
|
3316
|
-
Protected => 1, AddValue => $
|
|
3317
|
-
ProtectSaved => $
|
|
3324
|
+
Protected => 1, AddValue => $dbAdd,
|
|
3325
|
+
ProtectSaved => $dbSaveCount);
|
|
3318
3326
|
$wrn and Warn "$wrn\n" if $verbose;
|
|
3319
3327
|
}
|
|
3320
3328
|
}
|
|
3329
|
+
# set specified tags now
|
|
3330
|
+
if ($csvEtPrt) {
|
|
3331
|
+
my @excl = map "-$_", @csvExclude; # add back leading dashes
|
|
3332
|
+
my $opts = { AddValue => $dbAdd, Replace => 0 };
|
|
3333
|
+
$et->SetNewValuesFromFile($csvEtPrt, $opts, @tags, @excl);
|
|
3334
|
+
if ($csvEtVal) {
|
|
3335
|
+
$$opts{Type} = 'ValueConv';
|
|
3336
|
+
$et->SetNewValuesFromFile($csvEtVal, $opts, @tags, @excl);
|
|
3337
|
+
}
|
|
3338
|
+
}
|
|
3321
3339
|
$et->Options(Charset => $old) if $csv eq 'JSON';
|
|
3322
3340
|
unless ($found) {
|
|
3323
3341
|
Warn("No SourceFile '${file}' in imported $csv database\n");
|
|
@@ -5758,10 +5776,16 @@ if this API option was used). Multiple databases may be imported in a
|
|
|
5758
5776
|
single command.
|
|
5759
5777
|
|
|
5760
5778
|
Specific tags may be imported from the CSV database by adding B<->I<TAG>
|
|
5761
|
-
options to the command
|
|
5762
|
-
priority. Group names and wildcards
|
|
5763
|
-
|
|
5764
|
-
|
|
5779
|
+
options to the command after B<-csv=>I<CSVFILE>, or excluded with
|
|
5780
|
+
B<-->I<TAG>, with exclusions taking priority. Group names and wildcards in
|
|
5781
|
+
tag names are allowed, but the group name must match exactly the group in
|
|
5782
|
+
the CSV file (eg. a C<XMP-dc:Subject> column in the CSV file won't match
|
|
5783
|
+
C<-XMP:Subject> on the command line. Also, tags from the CSV may be
|
|
5784
|
+
redirected and written to different tags in the target file with support for
|
|
5785
|
+
advanced-formatting expressions using the same syntax as the
|
|
5786
|
+
B<-tagsFromFile> feature. If no tags are specified, then all tags except
|
|
5787
|
+
FileName, Directory and excluded tags are imported (in the same order as the
|
|
5788
|
+
database entries).
|
|
5765
5789
|
|
|
5766
5790
|
When exporting a CSV file, the B<-g> or B<-G> option adds group names to the
|
|
5767
5791
|
tag headings. If the B<-a> option is used to allow duplicate tag names, the
|
|
@@ -5783,7 +5807,8 @@ List-type tags are stored as simple strings in a CSV file, but the B<-sep>
|
|
|
5783
5807
|
option may be used to split them back into separate items when importing.
|
|
5784
5808
|
|
|
5785
5809
|
Special feature: B<-csv>+=I<CSVFILE> may be used to add items to existing
|
|
5786
|
-
lists. This affects only list-type tags. Also applies to the
|
|
5810
|
+
lists in the file. This affects only list-type tags. Also applies to the
|
|
5811
|
+
B<-j> option.
|
|
5787
5812
|
|
|
5788
5813
|
Note that this and the B<-plot> options are fundamentally different than all
|
|
5789
5814
|
other output format options because they require information from all input
|
|
@@ -5951,16 +5976,23 @@ compatible, and use B<-G> instead of B<-g>). Additionally, tag names in the
|
|
|
5951
5976
|
input JSON file may be suffixed with a C<#> to disable print conversion.
|
|
5952
5977
|
|
|
5953
5978
|
Specific tags may be imported from the JSON database by adding B<->I<TAG>
|
|
5954
|
-
options to the command
|
|
5955
|
-
priority. Group names and wildcards
|
|
5956
|
-
|
|
5957
|
-
|
|
5979
|
+
options to the command after B<-j=>I<JSONFILE>, or excluded with
|
|
5980
|
+
B<-->I<TAG>, with exclusions taking priority. Group names and wildcards in
|
|
5981
|
+
tag names are allowed, but the group name must match exactly the group in
|
|
5982
|
+
the JSON file (eg. a C<XMP-dc:Subject> entry in the JSON file won't match
|
|
5983
|
+
C<-XMP:Subject> on the command line. Also, tags from JSON may be redirected
|
|
5984
|
+
and written to different tags in the target file with support for
|
|
5985
|
+
advanced-formatting expressions using the same syntax as the
|
|
5986
|
+
B<-tagsFromFile> feature. If no tags are specified, then all tags except
|
|
5987
|
+
FileName, Directory and excluded tags are imported (in the same order as the
|
|
5988
|
+
database entries).
|
|
5958
5989
|
|
|
5959
5990
|
Unlike CSV import, empty values are not ignored, and will cause an empty
|
|
5960
5991
|
value to be written if supported by the specific metadata type. Tags are
|
|
5961
5992
|
deleted by using the B<-f> option and setting the tag value to "-" (or to
|
|
5962
5993
|
the MissingTagValue setting if this API option was used). Importing with
|
|
5963
|
-
B<-j>+=I<JSONFILE> causes new values to be added to existing lists
|
|
5994
|
+
B<-j>+=I<JSONFILE> causes new values to be added to existing lists in the
|
|
5995
|
+
target file.
|
|
5964
5996
|
|
|
5965
5997
|
=item B<-l> (B<-long>)
|
|
5966
5998
|
|
|
@@ -6095,7 +6127,7 @@ with this command:
|
|
|
6095
6127
|
|
|
6096
6128
|
produces output like this:
|
|
6097
6129
|
|
|
6098
|
-
-- Generated by ExifTool 13.
|
|
6130
|
+
-- Generated by ExifTool 13.42 --
|
|
6099
6131
|
File: a.jpg - 2003:10:31 15:44:19
|
|
6100
6132
|
(f/5.6, 1/60s, ISO 100)
|
|
6101
6133
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.99';
|
|
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)
|
|
@@ -562,6 +562,7 @@ $VERSION = '4.97';
|
|
|
562
562
|
4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42
|
|
563
563
|
4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603
|
|
564
564
|
4208.1 => 'Sigma 30mm F1.4 DC DN | C', #github#83 (016)
|
|
565
|
+
4976 => 'Sigma 16-300mm F3.5-6.7 DC OS | C (025)', #50
|
|
565
566
|
6512 => 'Sigma 12mm F1.4 DC | C', #github#352 (025)
|
|
566
567
|
# (Nano USM lenses - 0x90xx)
|
|
567
568
|
36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42
|
|
@@ -642,6 +643,7 @@ $VERSION = '4.97';
|
|
|
642
643
|
'61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
|
|
643
644
|
'61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
|
|
644
645
|
'61182.65' => 'Canon RF 85mm F1.4 L VCM', #github350
|
|
646
|
+
'61182.66' => 'Canon RF 45mm F1.2 STM', #42
|
|
645
647
|
65535 => 'n/a',
|
|
646
648
|
);
|
|
647
649
|
|
|
@@ -1008,10 +1010,11 @@ $VERSION = '4.97';
|
|
|
1008
1010
|
0x80000487 => 'EOS R8', #42
|
|
1009
1011
|
0x80000491 => 'PowerShot V10', #25
|
|
1010
1012
|
0x80000495 => 'EOS R1', #PH
|
|
1011
|
-
0x80000496 => 'R5 Mark II', #forum16406
|
|
1013
|
+
0x80000496 => 'EOS R5 Mark II', #forum16406
|
|
1012
1014
|
0x80000497 => 'PowerShot V1', #PH
|
|
1013
1015
|
0x80000498 => 'EOS R100', #25
|
|
1014
1016
|
0x80000516 => 'EOS R50 V', #42
|
|
1017
|
+
0x80000518 => 'EOS R6 Mark III', #42
|
|
1015
1018
|
0x80000520 => 'EOS D2000C', #IB
|
|
1016
1019
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
1017
1020
|
);
|
|
@@ -1995,12 +1998,12 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
1995
1998
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' },
|
|
1996
1999
|
},
|
|
1997
2000
|
{ # (int16u[3973]) - R3 ref IB
|
|
1998
|
-
Condition => '$count == 3973 or $count == 3778',
|
|
2001
|
+
Condition => '($count == 3973 or $count == 3778) and $$valPt !~ /^\x41\0/',
|
|
1999
2002
|
Name => 'ColorData11',
|
|
2000
2003
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
|
|
2001
2004
|
},
|
|
2002
|
-
{ # (int16u[4528]) - R1/R5mkII ref forum16406
|
|
2003
|
-
Condition => '$count == 4528',
|
|
2005
|
+
{ # (int16u[4528]) - R1/R5mkII (4528) ref forum16406, R50V (3778) ref PH
|
|
2006
|
+
Condition => '$count == 4528 or $count == 3778',
|
|
2004
2007
|
Name => 'ColorData12',
|
|
2005
2008
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData12' },
|
|
2006
2009
|
},
|
|
@@ -7052,6 +7055,7 @@ my %ciMaxFocal = (
|
|
|
7052
7055
|
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
|
7053
7056
|
327 => 'Canon RF 20mm F1.4 L VCM', #42
|
|
7054
7057
|
328 => 'Canon RF 85mm F1.4 L VCM', #42/github350
|
|
7058
|
+
330 => 'Canon RF 45mm F1.2 STM', #42
|
|
7055
7059
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
7056
7060
|
},
|
|
7057
7061
|
},
|
|
@@ -8321,8 +8325,8 @@ my %ciMaxFocal = (
|
|
|
8321
8325
|
RawConv => '$$self{ColorDataVersion} = $val',
|
|
8322
8326
|
PrintConv => {
|
|
8323
8327
|
16 => '16 (M50)',
|
|
8324
|
-
17 => '17 (
|
|
8325
|
-
18 => '18 (
|
|
8328
|
+
17 => '17 (R)', # (and PowerShot SX740HS)
|
|
8329
|
+
18 => '18 (RP/250D)', # (and PowerShot SX70HS)
|
|
8326
8330
|
19 => '19 (90D/850D/M6mkII/M200)',# (and PowerShot G7XmkIII)
|
|
8327
8331
|
},
|
|
8328
8332
|
},
|
|
@@ -8553,10 +8557,10 @@ my %ciMaxFocal = (
|
|
|
8553
8557
|
},
|
|
8554
8558
|
);
|
|
8555
8559
|
|
|
8556
|
-
# Color data (MakerNotes tag 0x4001, count=3973, ref IB)
|
|
8560
|
+
# Color data (MakerNotes tag 0x4001, count=3973/3778, ref IB)
|
|
8557
8561
|
%Image::ExifTool::Canon::ColorData11 = (
|
|
8558
8562
|
%binaryDataAttrs,
|
|
8559
|
-
NOTES => 'These tags are used by the EOS R3, R7 and R6mkII',
|
|
8563
|
+
NOTES => 'These tags are used by the EOS R3, R7, R50 and R6mkII',
|
|
8560
8564
|
FORMAT => 'int16s',
|
|
8561
8565
|
FIRST_ENTRY => 0,
|
|
8562
8566
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
@@ -8568,7 +8572,7 @@ my %ciMaxFocal = (
|
|
|
8568
8572
|
RawConv => '$$self{ColorDataVersion} = $val',
|
|
8569
8573
|
PrintConv => {
|
|
8570
8574
|
34 => '34 (R3)', #IB
|
|
8571
|
-
48 => '48 (R7
|
|
8575
|
+
48 => '48 (R7/R10/R50/R6mkII)', #IB
|
|
8572
8576
|
},
|
|
8573
8577
|
},
|
|
8574
8578
|
0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
|
|
@@ -8673,10 +8677,10 @@ my %ciMaxFocal = (
|
|
|
8673
8677
|
},
|
|
8674
8678
|
);
|
|
8675
8679
|
|
|
8676
|
-
# Color data (MakerNotes tag 0x4001, count=4528, ref PH)
|
|
8680
|
+
# Color data (MakerNotes tag 0x4001, count=4528/3778, ref PH)
|
|
8677
8681
|
%Image::ExifTool::Canon::ColorData12 = (
|
|
8678
8682
|
%binaryDataAttrs,
|
|
8679
|
-
NOTES => 'These tags are used by the EOS R1 and
|
|
8683
|
+
NOTES => 'These tags are used by the EOS R1, R5mkII and R50V',
|
|
8680
8684
|
FORMAT => 'int16s',
|
|
8681
8685
|
FIRST_ENTRY => 0,
|
|
8682
8686
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
@@ -8687,7 +8691,8 @@ my %ciMaxFocal = (
|
|
|
8687
8691
|
DataMember => 'ColorDataVersion',
|
|
8688
8692
|
RawConv => '$$self{ColorDataVersion} = $val',
|
|
8689
8693
|
PrintConv => {
|
|
8690
|
-
64 => '64 (R1
|
|
8694
|
+
64 => '64 (R1/R5mkII)',
|
|
8695
|
+
65 => '65 (R50V)',
|
|
8691
8696
|
},
|
|
8692
8697
|
},
|
|
8693
8698
|
0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, # (NC)
|
|
@@ -8778,6 +8783,7 @@ my %ciMaxFocal = (
|
|
|
8778
8783
|
Name => 'PerChannelBlackLevel',
|
|
8779
8784
|
Format => 'int16u[4]',
|
|
8780
8785
|
},
|
|
8786
|
+
# 0x290 - PerChannelBlackLevel again
|
|
8781
8787
|
0x294 => {
|
|
8782
8788
|
Name => 'NormalWhiteLevel',
|
|
8783
8789
|
Format => 'int16u',
|