exiftool-vendored.pl 12.60.0 → 12.65.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.
Files changed (59) hide show
  1. package/bin/Changes +110 -0
  2. package/bin/LICENSE +674 -0
  3. package/bin/MANIFEST +11 -0
  4. package/bin/META.json +5 -3
  5. package/bin/META.yml +5 -3
  6. package/bin/Makefile.PL +7 -1
  7. package/bin/README +50 -45
  8. package/bin/config_files/guano.config +161 -0
  9. package/bin/exiftool +163 -103
  10. package/bin/lib/Image/ExifTool/7Z.pm +793 -0
  11. package/bin/lib/Image/ExifTool/Apple.pm +14 -7
  12. package/bin/lib/Image/ExifTool/BMP.pm +0 -1
  13. package/bin/lib/Image/ExifTool/BigTIFF.pm +8 -1
  14. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -4
  15. package/bin/lib/Image/ExifTool/Canon.pm +4 -1
  16. package/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
  17. package/bin/lib/Image/ExifTool/CanonVRD.pm +4 -1
  18. package/bin/lib/Image/ExifTool/Exif.pm +31 -14
  19. package/bin/lib/Image/ExifTool/FlashPix.pm +9 -2
  20. package/bin/lib/Image/ExifTool/FujiFilm.pm +3 -3
  21. package/bin/lib/Image/ExifTool/GPS.pm +5 -2
  22. package/bin/lib/Image/ExifTool/Geotag.pm +4 -1
  23. package/bin/lib/Image/ExifTool/Jpeg2000.pm +243 -20
  24. package/bin/lib/Image/ExifTool/Lang/fr.pm +1467 -202
  25. package/bin/lib/Image/ExifTool/MPF.pm +2 -1
  26. package/bin/lib/Image/ExifTool/Matroska.pm +16 -1
  27. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  28. package/bin/lib/Image/ExifTool/Nikon.pm +941 -33
  29. package/bin/lib/Image/ExifTool/NikonCustom.pm +874 -63
  30. package/bin/lib/Image/ExifTool/PDF.pm +39 -12
  31. package/bin/lib/Image/ExifTool/PLIST.pm +8 -1
  32. package/bin/lib/Image/ExifTool/PNG.pm +6 -6
  33. package/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
  34. package/bin/lib/Image/ExifTool/QuickTime.pm +96 -32
  35. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +68 -37
  36. package/bin/lib/Image/ExifTool/README +2 -2
  37. package/bin/lib/Image/ExifTool/RIFF.pm +11 -9
  38. package/bin/lib/Image/ExifTool/Samsung.pm +227 -227
  39. package/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  40. package/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
  41. package/bin/lib/Image/ExifTool/Sony.pm +237 -32
  42. package/bin/lib/Image/ExifTool/TagLookup.pm +4762 -4629
  43. package/bin/lib/Image/ExifTool/TagNames.pod +737 -20
  44. package/bin/lib/Image/ExifTool/Validate.pm +17 -1
  45. package/bin/lib/Image/ExifTool/WPG.pm +296 -0
  46. package/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
  47. package/bin/lib/Image/ExifTool/WritePDF.pl +7 -8
  48. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +21 -9
  49. package/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
  50. package/bin/lib/Image/ExifTool/Writer.pl +47 -16
  51. package/bin/lib/Image/ExifTool/XMP.pm +30 -6
  52. package/bin/lib/Image/ExifTool/XMP2.pl +32 -0
  53. package/bin/lib/Image/ExifTool/XMPStruct.pl +96 -28
  54. package/bin/lib/Image/ExifTool/ZIP.pm +159 -41
  55. package/bin/lib/Image/ExifTool.pm +280 -164
  56. package/bin/lib/Image/ExifTool.pod +117 -52
  57. package/bin/perl-Image-ExifTool.spec +44 -43
  58. package/bin/pp_build_exe.args +8 -4
  59. package/package.json +3 -3
package/bin/exiftool CHANGED
@@ -11,12 +11,13 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.60';
14
+ my $version = '12.65';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
+ my $exePath;
17
18
  BEGIN {
18
19
  # (undocumented -xpath option added in 11.91, must come before other options)
19
- my $exePath = @ARGV && lc($ARGV[0]) eq '-xpath' && shift() ? $^X : $0;
20
+ $exePath = @ARGV && lc($ARGV[0]) eq '-xpath' && shift() ? $^X : $0;
20
21
  # get exe directory
21
22
  my $exeDir = ($exePath =~ /(.*)[\\\/]/) ? $1 : '.';
22
23
  my $incDir = ($0 =~ /(.*)[\\\/]/) ? "$1/lib" : './lib';
@@ -297,8 +298,11 @@ my @recommends = qw(
297
298
  POSIX::strptime
298
299
  Time::Local
299
300
  Unicode::LineBreak
301
+ Compress::Raw::Lzma
300
302
  IO::Compress::RawDeflate
301
303
  IO::Uncompress::RawInflate
304
+ IO::Compress::Brotli
305
+ IO::Uncompress::Brotli
302
306
  Win32::API
303
307
  Win32::FindFile
304
308
  Win32API::File
@@ -365,13 +369,14 @@ sub Cleanup() {
365
369
 
366
370
  # isolate arguments common to all commands
367
371
  if (grep /^-common_args$/i, @ARGV) {
368
- my (@newArgs, $common);
372
+ my (@newArgs, $common, $end);
369
373
  foreach (@ARGV) {
370
- if (/^-common_args$/i) {
374
+ if (/^-common_args$/i and not $end) {
371
375
  $common = 1;
372
376
  } elsif ($common) {
373
377
  push @commonArgs, $_;
374
378
  } else {
379
+ $end = 1 if $_ eq '--';
375
380
  push @newArgs, $_;
376
381
  }
377
382
  }
@@ -721,6 +726,13 @@ for (;;) {
721
726
  print "ExifTool version $version$str$Image::ExifTool::RELEASE\n";
722
727
  printf "Perl version %s%s\n", $], (defined ${^UNICODE} ? " (-C${^UNICODE})" : '');
723
728
  print "Platform: $^O\n";
729
+ if ($verbose > 8) {
730
+ print "Current Dir: " . Cwd::getcwd() . "\n" if (eval { require Cwd });
731
+ print "Script Name: $0\n";
732
+ print "Exe Name: $^X\n";
733
+ print "Exe Dir: $Image::ExifTool::exeDir\n";
734
+ print "Exe Path: $exePath\n";
735
+ }
724
736
  print "Optional libraries:\n";
725
737
  foreach (@recommends) {
726
738
  next if /^Win32/ and $^O ne 'MSWin32';
@@ -802,11 +814,17 @@ for (;;) {
802
814
  /^(-?)(a|duplicates)$/i and $mt->Options(Duplicates => ($1 ? 0 : 1)), next;
803
815
  if ($a eq 'api') {
804
816
  my $opt = shift;
805
- defined $opt or Error("Expected OPT[=VAL] argument for -api option\n"), $badCmd=1, next;
806
- my $val = ($opt =~ s/=(.*)//s) ? $1 : 1;
807
- # empty string means an undefined value unless ^= is used
808
- $val = undef unless $opt =~ s/\^$// or length $val;
809
- $mt->Options($opt => $val);
817
+ if (defined $opt and length $opt) {
818
+ my $val = ($opt =~ s/=(.*)//s) ? $1 : 1;
819
+ # empty string means an undefined value unless ^= is used
820
+ $val = undef unless $opt =~ s/\^$// or length $val;
821
+ $mt->Options($opt => $val);
822
+ } else {
823
+ print "Available API Options:\n";
824
+ my $availableOptions = Image::ExifTool::AvailableOptions();
825
+ printf(" %-17s - %s\n", $$_[0], $$_[2]) foreach @$availableOptions;
826
+ $helped = 1;
827
+ }
810
828
  next;
811
829
  }
812
830
  /^arg(s|format)$/i and $argFormat = 1, next;
@@ -836,7 +854,7 @@ for (;;) {
836
854
  $mt->Options(Charset => $charset);
837
855
  }
838
856
  if ($evalWarning) {
839
- warn $evalWarning;
857
+ Warn $evalWarning;
840
858
  } else {
841
859
  $setCharset = $mt->Options('Charset');
842
860
  }
@@ -1464,6 +1482,10 @@ if ($csv and $csv eq 'CSV' and not $isWriting) {
1464
1482
  $binaryOutput = 0;
1465
1483
  $setCharset = 'default' unless defined $setCharset;
1466
1484
  }
1485
+ if (%printFmt) {
1486
+ Warn "The -csv option has no effect when -p is used\n";
1487
+ undef $csv;
1488
+ }
1467
1489
  require Image::ExifTool::XMP if $setCharset;
1468
1490
  }
1469
1491
 
@@ -1737,7 +1759,8 @@ if ($textOut) {
1737
1759
  if ($outOpt) {
1738
1760
  my $type = GetFileType($outOpt);
1739
1761
  if ($type) {
1740
- unless (CanWrite($type)) {
1762
+ # (must test original file name because we can write .webp but not other RIFF types)
1763
+ unless (CanWrite($outOpt)) {
1741
1764
  Warn "Can't write $type files\n";
1742
1765
  $rtnVal = 1;
1743
1766
  next;
@@ -1951,23 +1974,31 @@ sub GetImageInfo($$)
1951
1974
  my (@foundTags, $info, $file, $ind, $g8);
1952
1975
 
1953
1976
  # set window title for this file if necessary
1954
- if (defined $windowTitle and $progressCount >= $progressNext) {
1955
- my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
1956
- my $title = $windowTitle;
1957
- my ($num, $denom) = split '/', $prog;
1958
- my $frac = $num / ($denom || 1);
1959
- my $n = $title =~ s/%(\d+)b/%b/ ? $1 : 20; # length of bar
1960
- my $bar = int($frac * $n + 0.5);
1961
- my %lkup = (
1962
- b => ('I' x $bar) . ('.' x ($n - $bar)), # (undocumented)
1963
- f => $orig,
1964
- p => int(100 * $frac + 0.5),
1965
- r => $prog,
1966
- '%'=> '%',
1967
- );
1968
- $title =~ s/%([%bfpr])/$lkup{$1}/eg;
1969
- SetWindowTitle($title);
1970
- undef $progressNext;
1977
+ if (defined $windowTitle) {
1978
+ if ($progressCount >= $progressNext) {
1979
+ my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
1980
+ my $title = $windowTitle;
1981
+ my ($num, $denom) = split '/', $prog;
1982
+ my $frac = $num / ($denom || 1);
1983
+ my $n = $title =~ s/%(\d+)b/%b/ ? $1 : 20; # length of bar
1984
+ my $bar = int($frac * $n + 0.5);
1985
+ my %lkup = (
1986
+ b => ('I' x $bar) . ('.' x ($n - $bar)),
1987
+ f => $orig,
1988
+ p => int(100 * $frac + 0.5),
1989
+ r => $prog,
1990
+ '%'=> '%',
1991
+ );
1992
+ $title =~ s/%([%bfpr])/$lkup{$1}/eg;
1993
+ SetWindowTitle($title);
1994
+ if (defined $progressMax) {
1995
+ undef $progressNext;
1996
+ } else {
1997
+ $progressNext += $progressIncr;
1998
+ }
1999
+ }
2000
+ # ($progressMax is not defined for "-progress:%f")
2001
+ ++$progressCount unless defined $progressMax;
1971
2002
  }
1972
2003
  unless (length $orig or $outOpt) {
1973
2004
  Warn qq(Error: Zero-length file name - ""\n);
@@ -1993,7 +2024,11 @@ sub GetImageInfo($$)
1993
2024
  }
1994
2025
  # set alternate file names
1995
2026
  foreach $g8 (sort keys %altFile) {
1996
- my $altName = FilenameSPrintf($altFile{$g8}, $orig);
2027
+ my $altName = $orig;
2028
+ # must double any '$' symbols in the original file name because
2029
+ # they are used for tag names in a -fileNUM argument
2030
+ $altName =~ s/\$/\$\$/g;
2031
+ $altName = FilenameSPrintf($altFile{$g8}, $altName);
1997
2032
  $et->SetAlternateFile($g8, $altName);
1998
2033
  }
1999
2034
 
@@ -2349,7 +2384,7 @@ TAG: foreach $tag (@foundTags) {
2349
2384
  next unless defined $val;
2350
2385
  if ($structOpt and ref $val) {
2351
2386
  # serialize structure if necessary
2352
- $val = Image::ExifTool::XMP::SerializeStruct($val) unless $xml or $json;
2387
+ $val = Image::ExifTool::XMP::SerializeStruct($et, $val) unless $xml or $json;
2353
2388
  } elsif (ref $val eq 'ARRAY') {
2354
2389
  if (defined $listItem) {
2355
2390
  # take only the specified item
@@ -2498,7 +2533,7 @@ TAG: foreach $tag (@foundTags) {
2498
2533
  my $tok = "$group:$tagName";
2499
2534
  if ($outFormat > 0) {
2500
2535
  if ($structOpt and ref $val) {
2501
- $val = Image::ExifTool::XMP::SerializeStruct($val);
2536
+ $val = Image::ExifTool::XMP::SerializeStruct($et, $val);
2502
2537
  }
2503
2538
  if ($escapeHTML) {
2504
2539
  $val =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./;
@@ -2536,6 +2571,7 @@ TAG: foreach $tag (@foundTags) {
2536
2571
  $xtra .= " et:table='${table}'";
2537
2572
  $xtra .= " et:index='${index}'" if defined $index;
2538
2573
  }
2574
+ # Note: New $xtra attributes must be added to %ignoreEtProp in XMP.pm!
2539
2575
  my $lastVal = $val;
2540
2576
  for ($valNum=0; $valNum<2; ++$valNum) {
2541
2577
  $val = FormatXML($val, $ind, $group);
@@ -2844,7 +2880,7 @@ sub SetImageInfo($$$)
2844
2880
  }
2845
2881
  unless ($isStdout) {
2846
2882
  $outfile = NextUnusedFilename($outfile);
2847
- if ($et->Exists($outfile) and not $doSetFileName) {
2883
+ if ($et->Exists($outfile, 1) and not $doSetFileName) {
2848
2884
  Warn "Error: '${outfile}' already exists - $infile\n";
2849
2885
  EFile($infile);
2850
2886
  ++$countBadWr;
@@ -2975,7 +3011,7 @@ sub SetImageInfo($$$)
2975
3011
  $outfile = Image::ExifTool::GetNewFileName(defined $outfile ? $outfile : $file, $newDir);
2976
3012
  }
2977
3013
  $outfile = NextUnusedFilename($outfile, $infile);
2978
- if ($et->Exists($outfile)) {
3014
+ if ($et->Exists($outfile, 1)) {
2979
3015
  if ($infile eq $outfile) {
2980
3016
  undef $outfile; # not changing the file name after all
2981
3017
  # (allow for case-insensitive filesystems)
@@ -3700,7 +3736,7 @@ sub ProcessFiles($;$)
3700
3736
  if (defined $progressMax) {
3701
3737
  unless (defined $progressNext) {
3702
3738
  $progressNext = $progressCount + $progressIncr;
3703
- $progressNext -= $progressNext % $progressIncr;
3739
+ $progressNext -= $progressNext % $progressIncr; # (show even multiples)
3704
3740
  $progressNext = $progressMax if $progressNext > $progressMax;
3705
3741
  }
3706
3742
  ++$progressCount;
@@ -4055,6 +4091,8 @@ sub SuggestedExtension($$$)
4055
4091
  $ext = 'dr4';
4056
4092
  } elsif ($$valPt =~ /^(.{10}|.{522})(\x11\x01|\x00\x11)/s) {
4057
4093
  $ext = 'pict';
4094
+ } elsif ($$valPt =~ /^\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl/s) {
4095
+ $ext = 'jxl';
4058
4096
  } else {
4059
4097
  $ext = 'dat';
4060
4098
  }
@@ -4201,7 +4239,7 @@ sub NextUnusedFilename($;$)
4201
4239
  }
4202
4240
  $filename .= substr($fmt, $pos); # add rest of file name
4203
4241
  # return now with filename unless file exists
4204
- return $filename unless ($mt->Exists($filename) and not defined $usedFileName{$filename}) or $usedFileName{$filename};
4242
+ return $filename unless ($mt->Exists($filename, 1) and not defined $usedFileName{$filename}) or $usedFileName{$filename};
4205
4243
  if (defined $okfile) {
4206
4244
  return $filename if $filename eq $okfile;
4207
4245
  my ($fn, $ok) = (AbsPath($filename), AbsPath($okfile));
@@ -4281,7 +4319,7 @@ sub OpenOutputFile($;@)
4281
4319
  $outfile .= $textOut;
4282
4320
  }
4283
4321
  my $mode = '>';
4284
- if ($mt->Exists($outfile)) {
4322
+ if ($mt->Exists($outfile, 1)) {
4285
4323
  unless ($textOverwrite) {
4286
4324
  Warn "Output file $outfile already exists for $file\n";
4287
4325
  return ();
@@ -4479,7 +4517,7 @@ sub Progress($$)
4479
4517
  my ($file, $msg) = @_;
4480
4518
  if (defined $progStr) {
4481
4519
  print $file $msg, $progStr, "\n";
4482
- undef $progressNext;
4520
+ undef $progressNext if defined $progressMax;
4483
4521
  }
4484
4522
  }
4485
4523
 
@@ -4590,48 +4628,49 @@ supported by ExifTool (r = read, w = write, c = create):
4590
4628
 
4591
4629
  File Types
4592
4630
  ------------+-------------+-------------+-------------+------------
4593
- 360 r/w | DPX r | ITC r | NRW r/w | RAM r
4594
- 3FR r | DR4 r/w/c | J2C r | NUMBERS r | RAR r
4595
- 3G2 r/w | DSS r | JNG r/w | O r | RAW r/w
4596
- 3GP r/w | DV r | JP2 r/w | ODP r | RIFF r
4597
- A r | DVB r/w | JPEG r/w | ODS r | RSRC r
4598
- AA r | DVR-MS r | JSON r | ODT r | RTF r
4599
- AAE r | DYLIB r | JXL r | OFR r | RW2 r/w
4600
- AAX r/w | EIP r | K25 r | OGG r | RWL r/w
4601
- ACR r | EPS r/w | KDC r | OGV r | RWZ r
4602
- AFM r | EPUB r | KEY r | ONP r | RM r
4603
- AI r/w | ERF r/w | LA r | OPUS r | SEQ r
4604
- AIFF r | EXE r | LFP r | ORF r/w | SKETCH r
4605
- APE r | EXIF r/w/c | LIF r | ORI r/w | SO r
4606
- ARQ r/w | EXR r | LNK r | OTF r | SR2 r/w
4607
- ARW r/w | EXV r/w/c | LRV r/w | PAC r | SRF r
4608
- ASF r | F4A/V r/w | M2TS r | PAGES r | SRW r/w
4609
- AVI r | FFF r/w | M4A/V r/w | PBM r/w | SVG r
4610
- AVIF r/w | FITS r | MACOS r | PCD r | SWF r
4611
- AZW r | FLA r | MAX r | PCX r | THM r/w
4612
- BMP r | FLAC r | MEF r/w | PDB r | TIFF r/w
4613
- BPG r | FLIF r/w | MIE r/w/c | PDF r/w | TORRENT r
4614
- BTF r | FLV r | MIFF r | PEF r/w | TTC r
4615
- CHM r | FPF r | MKA r | PFA r | TTF r
4616
- COS r | FPX r | MKS r | PFB r | TXT r
4617
- CR2 r/w | GIF r/w | MKV r | PFM r | VCF r
4618
- CR3 r/w | GPR r/w | MNG r/w | PGF r | VNT r
4619
- CRM r/w | GZ r | MOBI r | PGM r/w | VRD r/w/c
4620
- CRW r/w | HDP r/w | MODD r | PLIST r | VSD r
4621
- CS1 r/w | HDR r | MOI r | PICT r | WAV r
4622
- CSV r | HEIC r/w | MOS r/w | PMP r | WDP r/w
4623
- CUR r | HEIF r/w | MOV r/w | PNG r/w | WEBP r/w
4624
- CZI r | HTML r | MP3 r | PPM r/w | WEBM r
4625
- DCM r | ICC r/w/c | MP4 r/w | PPT r | WMA r
4626
- DCP r/w | ICO r | MPC r | PPTX r | WMV r
4627
- DCR r | ICS r | MPG r | PS r/w | WTV r
4628
- DFONT r | IDML r | MPO r/w | PSB r/w | WV r
4629
- DIVX r | IIQ r/w | MQV r/w | PSD r/w | X3F r/w
4630
- DJVU r | IND r/w | MRC r | PSP r | XCF r
4631
- DLL r | INSP r/w | MRW r/w | QTIF r/w | XLS r
4632
- DNG r/w | INSV r | MXF r | R3D r | XLSX r
4633
- DOC r | INX r | NEF r/w | RA r | XMP r/w/c
4634
- DOCX r | ISO r | NKSC r/w | RAF r/w | ZIP r
4631
+ 360 r/w | DPX r | ITC r | NUMBERS r | RAW r/w
4632
+ 3FR r | DR4 r/w/c | J2C r | O r | RIFF r
4633
+ 3G2 r/w | DSS r | JNG r/w | ODP r | RSRC r
4634
+ 3GP r/w | DV r | JP2 r/w | ODS r | RTF r
4635
+ 7Z r | DVB r/w | JPEG r/w | ODT r | RW2 r/w
4636
+ A r | DVR-MS r | JSON r | OFR r | RWL r/w
4637
+ AA r | DYLIB r | JXL r | OGG r | RWZ r
4638
+ AAE r | EIP r | K25 r | OGV r | RM r
4639
+ AAX r/w | EPS r/w | KDC r | ONP r | SEQ r
4640
+ ACR r | EPUB r | KEY r | OPUS r | SKETCH r
4641
+ AFM r | ERF r/w | LA r | ORF r/w | SO r
4642
+ AI r/w | EXE r | LFP r | ORI r/w | SR2 r/w
4643
+ AIFF r | EXIF r/w/c | LIF r | OTF r | SRF r
4644
+ APE r | EXR r | LNK r | PAC r | SRW r/w
4645
+ ARQ r/w | EXV r/w/c | LRV r/w | PAGES r | SVG r
4646
+ ARW r/w | F4A/V r/w | M2TS r | PBM r/w | SWF r
4647
+ ASF r | FFF r/w | M4A/V r/w | PCD r | THM r/w
4648
+ AVI r | FITS r | MACOS r | PCX r | TIFF r/w
4649
+ AVIF r/w | FLA r | MAX r | PDB r | TORRENT r
4650
+ AZW r | FLAC r | MEF r/w | PDF r/w | TTC r
4651
+ BMP r | FLIF r/w | MIE r/w/c | PEF r/w | TTF r
4652
+ BPG r | FLV r | MIFF r | PFA r | TXT r
4653
+ BTF r | FPF r | MKA r | PFB r | VCF r
4654
+ CHM r | FPX r | MKS r | PFM r | VNT r
4655
+ COS r | GIF r/w | MKV r | PGF r | VRD r/w/c
4656
+ CR2 r/w | GLV r/w | MNG r/w | PGM r/w | VSD r
4657
+ CR3 r/w | GPR r/w | MOBI r | PLIST r | WAV r
4658
+ CRM r/w | GZ r | MODD r | PICT r | WDP r/w
4659
+ CRW r/w | HDP r/w | MOI r | PMP r | WEBP r/w
4660
+ CS1 r/w | HDR r | MOS r/w | PNG r/w | WEBM r
4661
+ CSV r | HEIC r/w | MOV r/w | PPM r/w | WMA r
4662
+ CUR r | HEIF r/w | MP3 r | PPT r | WMV r
4663
+ CZI r | HTML r | MP4 r/w | PPTX r | WPG r
4664
+ DCM r | ICC r/w/c | MPC r | PS r/w | WTV r
4665
+ DCP r/w | ICO r | MPG r | PSB r/w | WV r
4666
+ DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
4667
+ DFONT r | IDML r | MQV r/w | PSP r | XCF r
4668
+ DIVX r | IIQ r/w | MRC r | QTIF r/w | XLS r
4669
+ DJVU r | IND r/w | MRW r/w | R3D r | XLSX r
4670
+ DLL r | INSP r/w | MXF r | RA r | XMP r/w/c
4671
+ DNG r/w | INSV r | NEF r/w | RAF r/w | ZIP r
4672
+ DOC r | INX r | NKSC r/w | RAM r |
4673
+ DOCX r | ISO r | NRW r/w | RAR r |
4635
4674
 
4636
4675
  Meta Information
4637
4676
  ----------------------+----------------------+---------------------
@@ -4669,7 +4708,7 @@ L<Tag operations|/Tag operations>
4669
4708
  -TAG or --TAG Extract or exclude specified tag
4670
4709
  -TAG[+-^]=[VALUE] Write new value for tag
4671
4710
  -TAG[+-]<=DATFILE Write tag value from contents of file
4672
- -TAG[+-]<SRCTAG Copy tag value (see -tagsFromFile)
4711
+ -[+]TAG[+-]<SRCTAG Copy tag value (see -tagsFromFile)
4673
4712
 
4674
4713
  -tagsFromFile SRCFILE Copy tag values from file
4675
4714
  -x TAG (-exclude) Exclude specified tag
@@ -4844,8 +4883,8 @@ for more details). C<+=> may also be used to increment numerical values (or
4844
4883
  decrement if I<VALUE> is negative), and C<-=> may be used to conditionally
4845
4884
  delete or replace a tag (see L</WRITING EXAMPLES> for examples). C<^=> is
4846
4885
  used to write an empty string instead of deleting the tag when no I<VALUE>
4847
- is given, but otherwise it is equivalent to C<=>, but note that the caret
4848
- must be quoted on the Windows command line.
4886
+ is given, but otherwise it is equivalent to C<=>. (Note that the caret must
4887
+ be quoted on the Windows command line.)
4849
4888
 
4850
4889
  I<TAG> may contain one or more leading family 0, 1, 2 or 7 group names,
4851
4890
  prefixed by optional family numbers, and separated colons. If no group name
@@ -4911,7 +4950,9 @@ while C<-all:all=> deletes entire blocks.
4911
4950
  5) The "APP" group names ("APP0" through "APP15") are used to delete JPEG
4912
4951
  application segments which are not associated with another deletable group.
4913
4952
  For example, specifying C<-APP14:All=> will NOT delete the APP14 "Adobe"
4914
- segment because this is accomplished with C<-Adobe:All>.
4953
+ segment because this is accomplished with C<-Adobe:All>. But note that
4954
+ these unnamed APP segments may not be excluded with C<--APPxx:all>) when
4955
+ deleting all information.
4915
4956
 
4916
4957
  6) When shifting a value, the shift is applied to the original value of the
4917
4958
  tag, overriding any other values previously assigned to the tag on the same
@@ -5541,7 +5582,7 @@ with this command:
5541
5582
 
5542
5583
  produces output like this:
5543
5584
 
5544
- -- Generated by ExifTool 12.60 --
5585
+ -- Generated by ExifTool 12.65 --
5545
5586
  File: a.jpg - 2003:10:31 15:44:19
5546
5587
  (f/5.6, 1/60s, ISO 100)
5547
5588
  File: b.jpg - 2006:05:23 11:57:38
@@ -6064,13 +6105,10 @@ newline and C<$$> represents a single C<$> symbol. So Perl variables, if
6064
6105
  used, require a double C<$>, and regular expressions ending in C<$/> must
6065
6106
  use C<$$/> instead.
6066
6107
 
6067
- 4) The condition may only test tags from the file being processed. To
6068
- process one file based on tags from another, two steps are required. For
6069
- example, to process XMP sidecar files in directory C<DIR> based on tags from
6070
- the associated NEF:
6071
-
6072
- exiftool -if EXPR -p '$directory/$filename' -ext nef DIR > nef.txt
6073
- exiftool -@ nef.txt -srcfile %d%f.xmp ...
6108
+ 4) The condition accesses only tags from the file being processed unless the
6109
+ B<-fileNUM> option is used to read an alternate file and the corresponding
6110
+ family 8 group name is specified for the tag. See the B<-fileNUM> option
6111
+ details for more information.
6074
6112
 
6075
6113
  5) The B<-a> option has no effect on the evaluation of the expression, and
6076
6114
  the values of duplicate tags are accessible only by specifying a group name
@@ -6254,10 +6292,12 @@ for EXIF this is the individual IFD (the family 1 group).
6254
6292
  When reading, causes information to be extracted from .gz and .bz2
6255
6293
  compressed images (only one image per archive; requires gzip and bzip2 to be
6256
6294
  available). When writing, causes compressed information to be written if
6257
- supported by the metadata format (eg. compressed textual metadata in PNG),
6258
- disables the recommended padding in embedded XMP (saving 2424 bytes when
6259
- writing XMP in a file), and writes XMP in shorthand format -- the equivalent
6260
- of setting the API Compress=1 and Compact="NoPadding,Shorthand".
6295
+ supported by the metadata format (eg. PNG supports compressed textual
6296
+ metadata, JXL supports compressed EXIF and XML, and MIE supports any
6297
+ compressed metadata), disables the recommended padding in embedded XMP
6298
+ (saving 2424 bytes when writing XMP in a file), and writes XMP in shorthand
6299
+ format -- the equivalent of setting the API Compress=1 and
6300
+ Compact="NoPadding,Shorthand".
6261
6301
 
6262
6302
  =back
6263
6303
 
@@ -6482,13 +6522,14 @@ load exiftool for each invocation.
6482
6522
 
6483
6523
  =over 5
6484
6524
 
6485
- =item B<-api> I<OPT[[^]=[VAL]]>
6525
+ =item B<-api> [I<OPT[[^]=[VAL]]>]
6486
6526
 
6487
6527
  Set ExifTool API option. I<OPT> is an API option name. The option value is
6488
6528
  set to 1 if I<=VAL> is omitted. If I<VAL> is omitted, the option value is
6489
- set to undef if C<=> is used, or an empty string with C<^=>. See
6490
- L<Image::ExifTool Options|Image::ExifTool/Options> for a list of available
6491
- API options. This overrides API options set via the config file.
6529
+ set to undef if C<=> is used, or an empty string with C<^=>. If I<OPT> is
6530
+ not specified a list of available options is returned. See
6531
+ L<Image::ExifTool Options|Image::ExifTool/Options> for option details. This
6532
+ overrides API options set via the config file.
6492
6533
 
6493
6534
  =item B<-common_args>
6494
6535
 
@@ -6544,11 +6585,22 @@ option no longer suppresses the output "{readyNUM}" message.
6544
6585
 
6545
6586
  =item B<-file>I<NUM> I<ALTFILE>
6546
6587
 
6547
- Read tags from an alternate source file. These tags are accessed via the
6588
+ Read tags from an alternate source file. Among other things, this allows
6589
+ tags from different files to be compared and combined using the B<-if> and
6590
+ B<-p> options. Tags from alternate files are accessed via the corresponding
6548
6591
  family 8 group name (eg. C<File1:TAG> for the B<-file1> option, C<File2:TAG>
6549
- for B<-file2>, etc). I<ALTFILE> may contain filename formatting codes %d,
6550
- %f and %e. Among other things, this allows tags from different files to be
6551
- compared and combined using the B<-if> and B<-p> options.
6592
+ for B<-file2>, etc). I<ALTFILE> may contain filename formatting codes like
6593
+ the B<-w> option (%d, %f, etc), and/or tag names with a leading C<$> symbol
6594
+ to access tags from the source file in the same way as the B<-p> option (so
6595
+ any other dollar symbol in the file name must be doubled, eg.
6596
+ C<money$$.jpg>). For example, assuming that the OriginalFileName tag has
6597
+ been set in the edited file, a command to copy Rights from the original file
6598
+ could look like this:
6599
+
6600
+ exiftool -file1 '$originalfilename' '-rights<file1:rights' edited.jpg
6601
+
6602
+ Composite tags may access tags from alternate files using the appropriate
6603
+ (case-sensitive) family 8 group name.
6552
6604
 
6553
6605
  =item B<-list_dir>
6554
6606
 
@@ -6731,6 +6783,14 @@ rewritten unnecessarily:
6731
6783
 
6732
6784
  Note that function names are case sensitive.
6733
6785
 
6786
+ ExifTool 12.64 adds an API NoDups option which makes the NoDups helper
6787
+ function largely redundant, with all the functionality except the ability to
6788
+ avoid rewriting the file if there are no duplicates, but with the advantage
6789
+ the duplicates may be removed when accumulating list items from multiple
6790
+ sources. An equivalent to the above commands using this feature would be:
6791
+
6792
+ exiftool -tagsfromfile @ -keywords -api nodups a.jpg
6793
+
6734
6794
  =head1 WINDOWS UNICODE FILE NAMES
6735
6795
 
6736
6796
  In Windows, command-line arguments are specified using the current code page