exiftool_vendored 13.31.0 → 13.34.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +56 -1
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +47 -46
  7. data/bin/exiftool +114 -89
  8. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -5
  9. data/bin/lib/Image/ExifTool/Canon.pm +19 -2
  10. data/bin/lib/Image/ExifTool/Exif.pm +9 -6
  11. data/bin/lib/Image/ExifTool/FlashPix.pm +4 -159
  12. data/bin/lib/Image/ExifTool/FujiFilm.pm +11 -3
  13. data/bin/lib/Image/ExifTool/Geotag.pm +5 -3
  14. data/bin/lib/Image/ExifTool/GoPro.pm +14 -2
  15. data/bin/lib/Image/ExifTool/LNK.pm +4 -1
  16. data/bin/lib/Image/ExifTool/Lang/cs.pm +0 -1
  17. data/bin/lib/Image/ExifTool/Lang/de.pm +0 -1
  18. data/bin/lib/Image/ExifTool/Lang/fr.pm +0 -1
  19. data/bin/lib/Image/ExifTool/Lang/it.pm +0 -1
  20. data/bin/lib/Image/ExifTool/Lang/ja.pm +0 -1
  21. data/bin/lib/Image/ExifTool/Lang/nl.pm +0 -1
  22. data/bin/lib/Image/ExifTool/Lang/pl.pm +0 -1
  23. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1
  24. data/bin/lib/Image/ExifTool/Microsoft.pm +158 -1
  25. data/bin/lib/Image/ExifTool/Minolta.pm +4 -2
  26. data/bin/lib/Image/ExifTool/Nikon.pm +72 -37
  27. data/bin/lib/Image/ExifTool/NikonCustom.pm +40 -10
  28. data/bin/lib/Image/ExifTool/Olympus.pm +254 -34
  29. data/bin/lib/Image/ExifTool/Panasonic.pm +3 -3
  30. data/bin/lib/Image/ExifTool/Pentax.pm +340 -61
  31. data/bin/lib/Image/ExifTool/QuickTime.pm +11 -4
  32. data/bin/lib/Image/ExifTool/README +2 -1
  33. data/bin/lib/Image/ExifTool/Sony.pm +44 -17
  34. data/bin/lib/Image/ExifTool/TNEF.pm +487 -0
  35. data/bin/lib/Image/ExifTool/TagLookup.pm +4380 -4265
  36. data/bin/lib/Image/ExifTool/TagNames.pod +265 -19
  37. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -12
  38. data/bin/lib/Image/ExifTool/Writer.pl +19 -15
  39. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  40. data/bin/lib/Image/ExifTool.pm +12 -4
  41. data/bin/lib/Image/ExifTool.pod +50 -44
  42. data/bin/perl-Image-ExifTool.spec +46 -45
  43. data/lib/exiftool_vendored/version.rb +1 -1
  44. 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.34';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -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;
@@ -2529,7 +2537,7 @@ T2: foreach $t2 (@tags2) {
2529
2537
  # print the results for this file
2530
2538
  if (%printFmt) {
2531
2539
  # output using print format file (-p) option
2532
- my ($type, $doc, $grp, $lastDoc, $cache);
2540
+ my ($type, @doc, $grp, $lastDoc, $cache);
2533
2541
  $fileTrailer = '';
2534
2542
  # repeat for each embedded document if necessary (only if -ee used)
2535
2543
  if ($et->Options('ExtractEmbedded')) {
@@ -2538,7 +2546,8 @@ T2: foreach $t2 (@tags2) {
2538
2546
  } else {
2539
2547
  $lastDoc = 0;
2540
2548
  }
2541
- for ($doc=0; $doc<=$lastDoc; ++$doc) {
2549
+ for ($doc[0]=0; $doc[0]<=$lastDoc; ) {
2550
+ my $doc = join '-', @doc;
2542
2551
  my ($skipBody, $opt);
2543
2552
  foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
2544
2553
  my $prf = $printFmt{$type} or next;
@@ -2548,7 +2557,7 @@ T2: foreach $t2 (@tags2) {
2548
2557
  }
2549
2558
  next if $type eq 'BODY' and $skipBody;
2550
2559
  # silence "IF" warnings and warnings for subdocuments > 1
2551
- if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})) {
2560
+ if ($type eq 'IF' or (($doc[0] > 1 or @doc > 1) and not $$et{OPTIONS}{IgnoreMinorErrors})) {
2552
2561
  $opt = 'Silent';
2553
2562
  } else {
2554
2563
  $opt = 'Warn';
@@ -2587,6 +2596,14 @@ T2: foreach $t2 (@tags2) {
2587
2596
  print $fp @lines;
2588
2597
  }
2589
2598
  }
2599
+ # find next available doc-subdoc
2600
+ push @doc, 1;
2601
+ while (@doc > 1) {
2602
+ my $nextDoc = join '-', @doc;
2603
+ last if $$et{HAS_DOC}{$nextDoc};
2604
+ pop @doc;
2605
+ ++$doc[-1];
2606
+ }
2590
2607
  }
2591
2608
  delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
2592
2609
  my $errs = $et->GetInfo('Warning', 'Error');
@@ -4518,6 +4535,10 @@ sub SuggestedExtension($$$)
4518
4535
  } elsif ($$valPt =~ /^.{4}ftyp(3gp|mp4|f4v|qt )/s) {
4519
4536
  my %movType = ( 'qt ' => 'mov' );
4520
4537
  $ext = $movType{$1} || $1;
4538
+ } elsif ($$valPt =~ /^<(!DOCTYPE )?html/i) {
4539
+ $ext = 'html';
4540
+ } elsif ($$valPt =~ /^[\n\r]*\{[\n\r]*\\rtf/) {
4541
+ $ext = 'rtf';
4521
4542
  } elsif ($$valPt !~ /^.{0,4096}\0/s) {
4522
4543
  $ext = 'txt';
4523
4544
  } elsif ($$valPt =~ /^BM.{15}\0/s) {
@@ -5054,50 +5075,51 @@ supported by ExifTool (r = read, w = write, c = create):
5054
5075
 
5055
5076
  File Types
5056
5077
  ------------+-------------+-------------+-------------+------------
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
5078
+ 360 r/w | DPX r | JNG r/w | ODP r | RSRC r
5079
+ 3FR r | DR4 r/w/c | JP2 r/w | ODS r | RTF r
5080
+ 3G2 r/w | DSS r | JPEG r/w | ODT r | RW2 r/w
5081
+ 3GP r/w | DV r | JSON r | OFR r | RWL r/w
5082
+ 7Z r | DVB r/w | JXL r/w | OGG r | RWZ r
5083
+ A r | DVR-MS r | K25 r | OGV r | RM r
5084
+ AA r | DYLIB r | KDC r | ONP r | SEQ r
5085
+ AAC r | EIP r | KEY r | OPUS r | SKETCH r
5086
+ AAE r | EPS r/w | LA r | ORF r/w | SO r
5087
+ AAX r/w | EPUB r | LFP r | ORI r/w | SR2 r/w
5088
+ ACR r | ERF r/w | LIF r | OTF r | SRF r
5089
+ AFM r | EXE r | LNK r | PAC r | SRW r/w
5090
+ AI r/w | EXIF r/w/c | LRV r/w | PAGES r | SVG r
5091
+ AIFF r | EXR r | M2TS r | PBM r/w | SWF r
5092
+ APE r | EXV r/w/c | M4A/V r/w | PCAP r | THM r/w
5093
+ ARQ r/w | F4A/V r/w | MACOS r | PCAPNG r | TIFF r/w
5094
+ ARW r/w | FFF r/w | MAX r | PCD r | TNEF r
5095
+ ASF r | FITS r | MEF r/w | PCX r | TORRENT r
5096
+ AVI r | FLA r | MIE r/w/c | PDB r | TTC r
5097
+ AVIF r/w | FLAC r | MIFF r | PDF r/w | TTF r
5098
+ AZW r | FLIF r/w | MKA r | PEF r/w | TXT r
5099
+ BMP r | FLV r | MKS r | PFA r | VCF r
5100
+ BPG r | FPF r | MKV r | PFB r | VNT r
5101
+ BTF r | FPX r | MNG r/w | PFM r | VRD r/w/c
5102
+ C2PA r | GIF r/w | MOBI r | PGF r | VSD r
5103
+ CHM r | GLV r/w | MODD r | PGM r/w | WAV r
5104
+ COS r | GPR r/w | MOI r | PLIST r | WDP r/w
5105
+ CR2 r/w | GZ r | MOS r/w | PICT r | WEBP r/w
5106
+ CR3 r/w | HDP r/w | MOV r/w | PMP r | WEBM r
5107
+ CRM r/w | HDR r | MP3 r | PNG r/w | WMA r
5108
+ CRW r/w | HEIC r/w | MP4 r/w | PPM r/w | WMV r
5109
+ CS1 r/w | HEIF r/w | MPC r | PPT r | WPG r
5110
+ CSV r | HTML r | MPG r | PPTX r | WTV r
5111
+ CUR r | ICC r/w/c | MPO r/w | PS r/w | WV r
5112
+ CZI r | ICO r | MQV r/w | PSB r/w | X3F r/w
5113
+ DCM r | ICS r | MRC r | PSD r/w | XCF r
5114
+ DCP r/w | IDML r | MRW r/w | PSP r | XISF r
5115
+ DCR r | IIQ r/w | MXF r | QTIF r/w | XLS r
5116
+ DFONT r | IND r/w | NEF r/w | R3D r | XLSX r
5117
+ DIVX r | INSP r/w | NKA r | RA r | XMP r/w/c
5118
+ DJVU r | INSV r | NKSC r/w | RAF r/w | ZIP r
5119
+ DLL r | INX r | NRW r/w | RAM r |
5120
+ DNG r/w | ISO r | NUMBERS r | RAR r |
5121
+ DOC r | ITC r | NXD r | RAW r/w |
5122
+ DOCX r | J2C r | O r | RIFF r |
5101
5123
 
5102
5124
  Meta Information
5103
5125
  ----------------------+----------------------+---------------------
@@ -5809,12 +5831,12 @@ escaped. The inverse conversion is applied when writing tags.
5809
5831
  =item B<-f> (B<-forcePrint>)
5810
5832
 
5811
5833
  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.
5834
+ tags specified on the command line, or with the B<-p>, B<-if> (unless the
5835
+ API UndefTags option is set), B<-fileNUM> or B<-tagsFromFile> options. When
5836
+ B<-f> is used, the value of any missing tag is set to a dash (C<->) by
5837
+ default, but this may be configured via the API MissingTagValue option.
5838
+ B<-f> is also used to add a 'flags' attribute to the B<-listx> output, or to
5839
+ allow tags to be deleted when writing with the B<-csv>=I<CSVFILE> feature.
5818
5840
 
5819
5841
  =item B<-g>[I<NUM>][:I<NUM>...] (B<-groupHeadings>)
5820
5842
 
@@ -5979,7 +6001,7 @@ translation, follow these steps (you must have Perl installed for this):
5979
6001
  6. Edit the generated language module lib/Image/ExifTool/Lang/ru.pm, and
5980
6002
  search and replace all 'MISSING' strings in the file with your translations.
5981
6003
 
5982
- 7. Email the module ('ru.pm' in this example) to philharvey66 at gmail.com
6004
+ 7. Email the module ('ru.pm' in this example) to exiftool@gmail.com
5983
6005
 
5984
6006
  8. Thank you!!
5985
6007
 
@@ -5989,7 +6011,7 @@ For list-type tags, this causes only the item with the specified index to be
5989
6011
  extracted. I<INDEX> is 0 for the first item in the list. Negative indices
5990
6012
  may also be used to reference items from the end of the list. Has no effect
5991
6013
  on single-valued tags. Also applies to tag values when copying from a tag,
5992
- and in B<-if> conditions.
6014
+ and in B<-if>, B<-p> and B<-fileNUM> arguments.
5993
6015
 
5994
6016
  =item B<-n> (B<--printConv>)
5995
6017
 
@@ -6054,7 +6076,7 @@ with this command:
6054
6076
 
6055
6077
  produces output like this:
6056
6078
 
6057
- -- Generated by ExifTool 13.31 --
6079
+ -- Generated by ExifTool 13.34 --
6058
6080
  File: a.jpg - 2003:10:31 15:44:19
6059
6081
  (f/5.6, 1/60s, ISO 100)
6060
6082
  File: b.jpg - 2006:05:23 11:57:38
@@ -6602,11 +6624,8 @@ Notes:
6602
6624
 
6603
6625
  1) The B<-n> and B<-b> options also apply to tags used in I<EXPR>.
6604
6626
 
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.)
6627
+ 2) The API RequestTags option is automatically set for all tags used in the
6628
+ B<-if> condition.
6610
6629
 
6611
6630
  3) Tags in the string are interpolated in a similar way to B<-p> before the
6612
6631
  expression is evaluated. In this interpolation, C<$/> is converted to a
@@ -6628,8 +6647,11 @@ C<$Copy1:TAG>, C<$Copy2:TAG>, etc).
6628
6647
  command when B<-execute> was used, and may be used like any other tag in the
6629
6648
  condition (ie. "$OK").
6630
6649
 
6631
- 7) The API RequestTags option is automatically set for all tags used in the
6632
- B<-if> condition.
6650
+ 7) The values of undefined tags in the expression are affected by the B<-f>
6651
+ and B<-m> options unless the API UndefTags option is also set.
6652
+
6653
+ 8) The condition fails if a Perl error occurs. This could happen for
6654
+ instance if an undefined value (eg. a missing tag) is used improperly.
6633
6655
 
6634
6656
  =item B<-m> (B<-ignoreMinorErrors>)
6635
6657
 
@@ -6641,8 +6663,9 @@ so ExifTool leaves it up to you to make the final decision. Minor errors
6641
6663
  and warnings are indicated by "[minor]" at the start of the message.
6642
6664
  Warnings which affect processing when ignored are indicated by "[Minor]"
6643
6665
  (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.
6666
+ B<-tagsFromFile>, B<-p>, B<-if> and B<-fileNUM> strings to be set to an
6667
+ empty string rather than an undefined value (but this may be avoided for
6668
+ B<-if> using the API UndefTags option).
6646
6669
 
6647
6670
  =item B<-o> I<OUTFILE> or I<FMT> (B<-out>)
6648
6671
 
@@ -7254,11 +7277,11 @@ Set user parameter. I<PARAM> is an arbitrary user parameter name. This is
7254
7277
  an interface to the API UserParam option (see the
7255
7278
  L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
7256
7279
  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
7280
+ B<-if>, B<-p> and B<-fileNUM> options as if they were any other tag.
7281
+ Appending a hash tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also
7282
+ causes the parameter to be extracted as a normal tag in the UserParam group.
7283
+ Similar to the B<-api> option, the parameter value is set to 1 if I<=VAL>
7284
+ is omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
7262
7285
  I<VAL> is omitted with C<^=>.
7263
7286
 
7264
7287
  exiftool -p '$test from $filename' -userparam test=Hello FILE
@@ -7268,18 +7291,20 @@ I<VAL> is omitted with C<^=>.
7268
7291
  =head3 Advanced formatting feature
7269
7292
 
7270
7293
  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:
7294
+ interpolated within a B<-if>, B<-p> or B<-fileNUM> argument, or a
7295
+ B<-tagsFromFile> redirection string. Tag names within these strings are
7296
+ prefixed by a C<$> symbol, and an arbitrary Perl expression may be applied
7297
+ to the tag value by placing braces around the tag name and inserting the
7298
+ expression after the name, separated by a semicolon (ie. C<${TAG;EXPR}>).
7299
+ The expression acts on the value of the tag through the default input
7300
+ variable (C<$_>), and has access to the full ExifTool API through the
7301
+ current ExifTool object (C<$self>) and the tag key (C<$tag>). It may
7302
+ contain any valid Perl code, including translation (C<tr///>) and
7303
+ substitution (C<s///>) operations, but note that braces within the
7304
+ expression must be balanced. If the expression does not modify C<$_> the
7305
+ original tag value is returned. The example below prints the camera Make
7306
+ with spaces translated to underlines, and multiple consecutive underlines
7307
+ replaced by a single underline:
7283
7308
 
7284
7309
  exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg
7285
7310
 
@@ -7298,6 +7323,8 @@ used in file names.)
7298
7323
 
7299
7324
  =head4 Helper functions
7300
7325
 
7326
+ Note that function names are case sensitive.
7327
+
7301
7328
  C<DateFmt>
7302
7329
 
7303
7330
  Simplifies reformatting of individual date/time values. This function acts
@@ -7335,8 +7362,6 @@ rewritten unnecessarily:
7335
7362
 
7336
7363
  exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
7337
7364
 
7338
- Note that function names are case sensitive.
7339
-
7340
7365
  ExifTool 12.64 adds an API NoDups option which makes the NoDups helper
7341
7366
  function largely redundant, with all the functionality except the ability to
7342
7367
  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);
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.92';
91
+ $VERSION = '4.95';
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)
@@ -2151,6 +2151,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2151
2151
  TagTable => 'Image::ExifTool::Canon::RawBurstInfo',
2152
2152
  }
2153
2153
  },
2154
+ # 0x4049 - related to croping (forum13491) - "8 0 0 0" = no crop, "8 1 0 1" = crop enabled
2154
2155
  0x4059 => { #forum16111
2155
2156
  Name => 'LevelInfo',
2156
2157
  SubDirectory => {
@@ -2621,6 +2622,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2621
2622
  # 47 - related to aspect ratio: 100=4:3,70=1:1/16:9,90=3:2,60=4:5 (PH G12)
2622
2623
  # (roughly image area in percent - 4:3=100%,1:1/16:9=75%,3:2=89%,4:5=60%)
2623
2624
  # 48 - 3 for CR2/CR3, 4 or 7 for JPG, -1 for edited JPG (see forum16127)
2625
+ 50 => { #github340
2626
+ Name => 'FocusBracketing',
2627
+ PrintConv => { 0 => 'Disable', 1 => 'Enable' },
2628
+ },
2624
2629
  51 => { #forum16036 (EOS R models)
2625
2630
  Name => 'Clarity',
2626
2631
  PrintConv => {
@@ -2628,6 +2633,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2628
2633
  0x7fff => 'n/a',
2629
2634
  },
2630
2635
  },
2636
+ 52 => { #github336
2637
+ Name => 'HDR-PQ',
2638
+ PrintConv => { %offOn, -1 => 'n/a' },
2639
+ },
2631
2640
  );
2632
2641
 
2633
2642
  # focal length information (MakerNotes tag 0x02)
@@ -8931,7 +8940,7 @@ my %ciMaxFocal = (
8931
8940
  },
8932
8941
  3 => {
8933
8942
  Name => 'HighlightTonePriority',
8934
- PrintConv => \%offOn,
8943
+ PrintConv => { %offOn, 2 => 'Enhanced' }, #github339 (Enhanced)
8935
8944
  },
8936
8945
  4 => {
8937
8946
  Name => 'LongExposureNoiseReduction',
@@ -9323,6 +9332,14 @@ my %filterConv = (
9323
9332
  3 => 'Vehicles',
9324
9333
  },
9325
9334
  },
9335
+ 21 => { #github344 (R6)
9336
+ Name => 'SubjectSwitching',
9337
+ PrintConv => {
9338
+ 0 => 'Initial Priority',
9339
+ 1 => 'On Subject',
9340
+ 2 => 'Switch Subject',
9341
+ },
9342
+ },
9326
9343
  24 => { #forum16068
9327
9344
  Name => 'EyeDetection',
9328
9345
  PrintConv => \%offOn,
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.58';
60
+ $VERSION = '4.60';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -402,7 +402,7 @@ my %opcodeInfo = (
402
402
  THM => 'THM - DCF thumbnail file',
403
403
  },
404
404
  },
405
- 0x2 => { #5
405
+ 0x2 => { #5 (not in the EXIF spec)
406
406
  Name => 'InteropVersion',
407
407
  Description => 'Interoperability Version',
408
408
  Protected => 1,
@@ -2029,7 +2029,7 @@ my %opcodeInfo = (
2029
2029
  OffsetPair => -1,
2030
2030
  },
2031
2031
  0x8782 => 'T88Options', #20
2032
- 0x87ac => 'ImageLayer',
2032
+ 0x87ac => 'ImageLayer', # Defined in the Mixed Raster Content part of RFC 2301
2033
2033
  0x87af => { #30
2034
2034
  Name => 'GeoTiffDirectory',
2035
2035
  Format => 'undef',
@@ -4209,6 +4209,8 @@ my %opcodeInfo = (
4209
4209
  },
4210
4210
  },
4211
4211
  # 0xc7d6 - int8u: 1 (SubIFD1 of Nikon Z6/Z7 NEF)
4212
+ 0xc7d7 => { Name => 'ZIFMetadata', Binary => 1 },
4213
+ 0xc7d8 => { Name => 'ZIFAnnotations', Binary => 1 },
4212
4214
  0xc7e9 => { # DNG 1.5
4213
4215
  Name => 'DepthFormat',
4214
4216
  Writable => 'int16u',
@@ -6360,9 +6362,10 @@ sub ProcessExif($$$)
6360
6362
  $et->Warn("Bad format ($format) for $dir entry $index", $inMakerNotes);
6361
6363
  ++$warnCount;
6362
6364
  }
6363
- # assume corrupted IFD if this is our first entry (except Sony ILCE-7M2 firmware 1.21)
6364
- return 0 unless $index or $$et{Model} eq 'ILCE-7M2';
6365
- next;
6365
+ # assume corrupted IFD if this is our first entry (except Sony ILCE which have an empty first entry)
6366
+ next if $index or $$et{Model} =~ /^ILCE/;
6367
+ # $et->Warn(sprintf('Format code 0x%x encountered -- Possibly corrupted IFD'));
6368
+ return 0;
6366
6369
  }
6367
6370
  }
6368
6371
  my $formatStr = $formatName[$format]; # get name of this format