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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +88 -2
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/Makefile.PL +1 -0
  7. data/bin/README +47 -46
  8. data/bin/exiftool +155 -120
  9. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
  10. data/bin/lib/Image/ExifTool/Canon.pm +46 -6
  11. data/bin/lib/Image/ExifTool/DJI.pm +54 -3
  12. data/bin/lib/Image/ExifTool/Exif.pm +9 -6
  13. data/bin/lib/Image/ExifTool/FlashPix.pm +4 -159
  14. data/bin/lib/Image/ExifTool/FujiFilm.pm +97 -32
  15. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  16. data/bin/lib/Image/ExifTool/Geotag.pm +5 -3
  17. data/bin/lib/Image/ExifTool/GoPro.pm +14 -2
  18. data/bin/lib/Image/ExifTool/LNK.pm +4 -1
  19. data/bin/lib/Image/ExifTool/Lang/cs.pm +0 -1
  20. data/bin/lib/Image/ExifTool/Lang/de.pm +0 -1
  21. data/bin/lib/Image/ExifTool/Lang/fr.pm +0 -1
  22. data/bin/lib/Image/ExifTool/Lang/it.pm +0 -1
  23. data/bin/lib/Image/ExifTool/Lang/ja.pm +0 -1
  24. data/bin/lib/Image/ExifTool/Lang/nl.pm +0 -1
  25. data/bin/lib/Image/ExifTool/Lang/pl.pm +0 -1
  26. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1
  27. data/bin/lib/Image/ExifTool/M2TS.pm +2 -4
  28. data/bin/lib/Image/ExifTool/Microsoft.pm +158 -1
  29. data/bin/lib/Image/ExifTool/Minolta.pm +4 -2
  30. data/bin/lib/Image/ExifTool/Nikon.pm +73 -37
  31. data/bin/lib/Image/ExifTool/NikonCustom.pm +40 -10
  32. data/bin/lib/Image/ExifTool/Olympus.pm +258 -34
  33. data/bin/lib/Image/ExifTool/Panasonic.pm +3 -3
  34. data/bin/lib/Image/ExifTool/Pentax.pm +341 -61
  35. data/bin/lib/Image/ExifTool/Protobuf.pm +1 -1
  36. data/bin/lib/Image/ExifTool/QuickTime.pm +11 -4
  37. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
  38. data/bin/lib/Image/ExifTool/README +2 -1
  39. data/bin/lib/Image/ExifTool/RIFF.pm +5 -3
  40. data/bin/lib/Image/ExifTool/Sony.pm +46 -17
  41. data/bin/lib/Image/ExifTool/TNEF.pm +487 -0
  42. data/bin/lib/Image/ExifTool/TagLookup.pm +4384 -4265
  43. data/bin/lib/Image/ExifTool/TagNames.pod +291 -27
  44. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -12
  45. data/bin/lib/Image/ExifTool/Writer.pl +21 -16
  46. data/bin/lib/Image/ExifTool/XMP.pm +8 -2
  47. data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
  48. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  49. data/bin/lib/Image/ExifTool.pm +14 -4
  50. data/bin/lib/Image/ExifTool.pod +50 -44
  51. data/bin/perl-Image-ExifTool.spec +46 -45
  52. data/lib/exiftool_vendored/version.rb +1 -1
  53. 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.31';
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
- # must double any '$' symbols in the original file name because
2146
- # they are used for tag names in a -fileNUM argument
2147
- $altName =~ s/\$/\$\$/g;
2148
- $altName = FilenameSPrintf($altFile{$g8}, $altName);
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
- unless ($result) {
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, $doc, $grp, $lastDoc, $cache);
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; ++$doc) {
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 or ref $a eq 'SCALAR';
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 =~ tr/\\/\//; # use forward slashes
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 =~ tr/\\/\// if $^O eq 'MSWin32' and defined $path; # use forward slashes
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 | DOCX r | ITC r | NUMBERS r | RAM r
5058
- 3FR r | DPX r | J2C r | NXD r | RAR r
5059
- 3G2 r/w | DR4 r/w/c | JNG r/w | O r | RAW r/w
5060
- 3GP r/w | DSS r | JP2 r/w | ODP r | RIFF r
5061
- 7Z r | DV r | JPEG r/w | ODS r | RSRC r
5062
- A r | DVB r/w | JSON r | ODT r | RTF r
5063
- AA r | DVR-MS r | JXL r/w | OFR r | RW2 r/w
5064
- AAC r | DYLIB r | K25 r | OGG r | RWL r/w
5065
- AAE r | EIP r | KDC r | OGV r | RWZ r
5066
- AAX r/w | EPS r/w | KEY r | ONP r | RM r
5067
- ACR r | EPUB r | LA r | OPUS r | SEQ r
5068
- AFM r | ERF r/w | LFP r | ORF r/w | SKETCH r
5069
- AI r/w | EXE r | LIF r | ORI r/w | SO r
5070
- AIFF r | EXIF r/w/c | LNK r | OTF r | SR2 r/w
5071
- APE r | EXR r | LRV r/w | PAC r | SRF r
5072
- ARQ r/w | EXV r/w/c | M2TS r | PAGES r | SRW r/w
5073
- ARW r/w | F4A/V r/w | M4A/V r/w | PBM r/w | SVG r
5074
- ASF r | FFF r/w | MACOS r | PCAP r | SWF r
5075
- AVI r | FITS r | MAX r | PCAPNG r | THM r/w
5076
- AVIF r/w | FLA r | MEF r/w | PCD r | TIFF r/w
5077
- AZW r | FLAC r | MIE r/w/c | PCX r | TORRENT r
5078
- BMP r | FLIF r/w | MIFF r | PDB r | TTC r
5079
- BPG r | FLV r | MKA r | PDF r/w | TTF r
5080
- BTF r | FPF r | MKS r | PEF r/w | TXT r
5081
- C2PA r | FPX r | MKV r | PFA r | VCF r
5082
- CHM r | GIF r/w | MNG r/w | PFB r | VNT r
5083
- COS r | GLV r/w | MOBI r | PFM r | VRD r/w/c
5084
- CR2 r/w | GPR r/w | MODD r | PGF r | VSD r
5085
- CR3 r/w | GZ r | MOI r | PGM r/w | WAV r
5086
- CRM r/w | HDP r/w | MOS r/w | PLIST r | WDP r/w
5087
- CRW r/w | HDR r | MOV r/w | PICT r | WEBP r/w
5088
- CS1 r/w | HEIC r/w | MP3 r | PMP r | WEBM r
5089
- CSV r | HEIF r/w | MP4 r/w | PNG r/w | WMA r
5090
- CUR r | HTML r | MPC r | PPM r/w | WMV r
5091
- CZI r | ICC r/w/c | MPG r | PPT r | WPG r
5092
- DCM r | ICO r | MPO r/w | PPTX r | WTV r
5093
- DCP r/w | ICS r | MQV r/w | PS r/w | WV r
5094
- DCR r | IDML r | MRC r | PSB r/w | X3F r/w
5095
- DFONT r | IIQ r/w | MRW r/w | PSD r/w | XCF r
5096
- DIVX r | IND r/w | MXF r | PSP r | XISF r
5097
- DJVU r | INSP r/w | NEF r/w | QTIF r/w | XLS r
5098
- DLL r | INSV r | NKA r | R3D r | XLSX r
5099
- DNG r/w | INX r | NKSC r/w | RA r | XMP r/w/c
5100
- DOC r | ISO r | NRW r/w | RAF r/w | ZIP 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> or
5813
- B<-tagsFromFile> options. When B<-f> is used, the value of any missing tag
5814
- is set to a dash (C<->) by default, but this may be configured via the API
5815
- MissingTagValue option. B<-f> is also used to add a 'flags' attribute to
5816
- the B<-listx> output, or to allow tags to be deleted when writing with the
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, and the length of the "hex" output is limited by the API
5883
- LimitLongValues setting. The B<-b> option may be added to output binary
5884
- data, encoded in base64 if necessary (indicated by ASCII "base64:" as the
5885
- first 7 bytes of the value), and B<-t> may be added to include tag table
5886
- information (see B<-t> for details). The JSON output is UTF-8 regardless of
5887
- any B<-L> or B<-charset> option setting, but the UTF-8 validation is
5888
- disabled if a character set other than UTF-8 is specified.
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 philharvey66 at gmail.com
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> conditions.
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.31 --
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) Some binary data blocks are not extracted unless specified explicitly.
6606
- These tags are not available for use in the B<-if> condition unless they are
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 API RequestTags option is automatically set for all tags used in the
6632
- B<-if> condition.
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<-if> strings to be set to an empty string
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<-p> options as if they were any other tag. Appending a hash
7258
- tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also causes the
7259
- parameter to be extracted as a normal tag in the UserParam group. Similar
7260
- to the B<-api> option, the parameter value is set to 1 if I<=VAL> is
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<-p> option argument, or a B<-tagsFromFile>
7272
- redirection string. Tag names within these strings are prefixed by a C<$>
7273
- symbol, and an arbitrary Perl expression may be applied to the tag value by
7274
- placing braces around the tag name and inserting the expression after the
7275
- name, separated by a semicolon (ie. C<${TAG;EXPR}>). The expression acts on
7276
- the value of the tag through the default input variable (C<$_>), and has
7277
- access to the full ExifTool API through the current ExifTool object
7278
- (C<$self>) and the tag key (C<$tag>). It may contain any valid Perl code,
7279
- including translation (C<tr///>) and substitution (C<s///>) operations, but
7280
- note that braces within the expression must be balanced. The example below
7281
- prints the camera Make with spaces translated to underlines, and multiple
7282
- consecutive underlines replaced by a single underline:
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 2.32
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://web.archive.org/web/20190624045241if_/http://www.cipa.jp:80/std/documents/e/DC-008-Translation-2019-E.pdf>
278
- for the official EXIF 2.32 specification.
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, $wasLong, $prefix);
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
- $wasLong = 1 if $wID <= $self->{LONG_ID}->{$tableName};
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);