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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9dfd10c8fad46a346537837a7eb4d95f6abf124bb6b3a9ca65479e447b6f4bac
4
- data.tar.gz: 9ac3a94f1fa80f10cab26c6c595499b32431e39e1fa31d33255a45454b2c1465
3
+ metadata.gz: 769a367333375cb7b0796e2b334c49c8eaed8da6ca289b2de271f9a1a5499b6f
4
+ data.tar.gz: 7e7044a2d8044fe48f633c11b2812ed752e5091c5d19db7153fc415cec06bb95
5
5
  SHA512:
6
- metadata.gz: 064efdbb744ee1a1e25c1df084286c86ecf791c85479e95d73c10b5aad589b2355068a19e1757ebc88bd26349af0550750b1c48cc0e945e833ac392583642559
7
- data.tar.gz: 6e5d5cec5577836228ab18975639d2b7e2d27cd1a161bae004ebdb472ec7f1e669155589e2e0fb83873bf7a1bc3c592df6196e98afb7cc872b676b70564c3fea
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
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.40",
53
+ "version" : "13.42",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
data/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.40'
34
+ version: '13.42'
35
35
  x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
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.40.tar.gz | tar -xf -
115
- cd Image-ExifTool-13.40
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.40';
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 $csvSaveCount; # save counter for last CSV file loaded
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 $csvAdd;
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
- $csvSaveCount = 0;
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 $csvFile = $1;
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
- if ($csvFile) {
928
- push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
929
- $csvSaveCount = $saveCount;
930
- }
944
+ push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
945
+ $dbSaveCount = $saveCount;
946
+ $tagsFrom = 'CSV';
931
947
  next;
932
948
  }
933
- if ($csvFile) {
934
- $csvFile =~ s/^(\+?=)//;
935
- $csvAdd = 2 if $1 eq '+=';
936
- $vout = \*STDERR if $srcStdin;
937
- $verbose and print $vout "Reading CSV file $csvFile\n";
938
- my $msg;
939
- if ($mt->Open(\*CSVFILE, $csvFile)) {
940
- binmode CSVFILE;
941
- require Image::ExifTool::Import;
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
- $msg = "Error opening CSV file '${csvFile}'";
960
+ my $chset = $mt->Options('Charset');
961
+ $msg = Image::ExifTool::Import::ReadJSON(\*CSVFILE, \%database, $forcePrint, $chset);
946
962
  }
947
- $msg and Warn("$msg\n");
948
- $isWriting = 1;
963
+ close(CSVFILE);
964
+ } else {
965
+ $msg = "Error opening $dbType file '${dbFile}'";
949
966
  }
950
- $csv = 'CSV';
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 ($setTagsFile) {
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
- AddSetTagsFile($setTagsFile = '@') if not $setTagsFile and /(<|>)/;
1416
- if ($setTagsFile) {
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} == $csvSaveCount;
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
- unless ($csv) {
1798
- foreach (@exclude) {
1799
- $mt->SetNewValue($_, undef, Replace => 2);
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, $tryTag, $tg);
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(' ',@exclude),"\n" if @exclude;
3271
+ print $vout 'Excluding tags: ',join(' ',@csvExclude),"\n" if @csvExclude;
3282
3272
  }
3283
- my @tryTags = (@exclude, @tags); # (exclude first because it takes priority)
3284
- foreach (@tryTags) {
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 (@tryTags) {
3294
- my ($i, $tryGrp, $matched);
3295
- TryMatch: for ($i=0; $i<@tryTags; ++$i) {
3296
- $tryTag = $tryTags[$i];
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 @tryGrps = split /:/, $tryTag;
3301
- my $tryName = pop @tryGrps;
3302
- next unless pop(@csvGrps) =~ /^$tryName$/i; # tag name must match
3303
- foreach $tryGrp (@tryGrps) {
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 TryMatch unless grep /^$tryGrp$/i, @csvGrps;
3313
+ next ExclMatch unless grep /^$exclGrp$/i, @csvGrps;
3306
3314
  }
3307
- $matched = 1;
3315
+ $excluded = 1;
3308
3316
  last;
3309
3317
  }
3310
3318
  # no group specified, so match by tag name only
3311
- $csvTag =~ /^([-_0-9A-Z]+:)*$tryTag$/i and $matched = 1, last;
3319
+ $csvTag =~ /^([-_0-9A-Z]+:)*$exclTag$/i and $excluded = 1, last;
3312
3320
  }
3313
- next if $matched ? $i < @exclude : @tags;
3321
+ next if $excluded;
3314
3322
  }
3315
3323
  my ($rtn, $wrn) = $et->SetNewValue($csvTag, $$csvInfo{$csvTag},
3316
- Protected => 1, AddValue => $csvAdd,
3317
- ProtectSaved => $csvSaveCount);
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, or excluded with B<-->I<TAG>, with exclusions taking
5762
- priority. Group names and wildcards are allowed. If no tags are specified,
5763
- then all except FileName and Directory are used. Tags are imported in the
5764
- same order as the database entries.
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 B<-j> option.
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, or excluded with B<-->I<TAG>, with exclusions taking
5955
- priority. Group names and wildcards are allowed. If no tags are specified,
5956
- then all except FileName and Directory are used. Tags are imported in the
5957
- same order as the database entries.
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.40 --
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.97';
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 (EOS R)', # (and PowerShot SX740HS)
8325
- 18 => '18 (EOS RP/250D)', # (and PowerShot SX70HS)
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, R10, R6 Mark II)', #IB
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 R5mkII',
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, R5 Mark II)',
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',