exiftool_vendored 12.56.0 → 12.58.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +35 -2
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/config_files/rotate_regions.config +1 -1
  7. data/bin/exiftool +95 -47
  8. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  9. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +19 -15
  11. data/bin/lib/Image/ExifTool/Canon.pm +26 -6
  12. data/bin/lib/Image/ExifTool/DJI.pm +28 -2
  13. data/bin/lib/Image/ExifTool/Exif.pm +24 -5
  14. data/bin/lib/Image/ExifTool/FlashPix.pm +6 -2
  15. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
  16. data/bin/lib/Image/ExifTool/GPS.pm +7 -2
  17. data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
  18. data/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
  19. data/bin/lib/Image/ExifTool/LNK.pm +5 -4
  20. data/bin/lib/Image/ExifTool/MIE.pm +3 -3
  21. data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
  22. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  23. data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
  24. data/bin/lib/Image/ExifTool/Nikon.pm +998 -903
  25. data/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
  26. data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  27. data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
  28. data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
  29. data/bin/lib/Image/ExifTool/Photoshop.pm +38 -7
  30. data/bin/lib/Image/ExifTool/QuickTime.pm +23 -7
  31. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +3 -1
  32. data/bin/lib/Image/ExifTool/README +19 -2
  33. data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
  34. data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
  35. data/bin/lib/Image/ExifTool/Sigma.pm +5 -4
  36. data/bin/lib/Image/ExifTool/Sony.pm +23 -1
  37. data/bin/lib/Image/ExifTool/TagLookup.pm +4670 -4628
  38. data/bin/lib/Image/ExifTool/TagNames.pod +261 -89
  39. data/bin/lib/Image/ExifTool/Validate.pm +5 -5
  40. data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
  41. data/bin/lib/Image/ExifTool/Writer.pl +39 -17
  42. data/bin/lib/Image/ExifTool/XMP.pm +2 -2
  43. data/bin/lib/Image/ExifTool.pm +94 -33
  44. data/bin/lib/Image/ExifTool.pod +4 -4
  45. data/bin/perl-Image-ExifTool.spec +1 -1
  46. data/lib/exiftool_vendored/version.rb +1 -1
  47. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 868b41884f8ad70975ed61e8b20a68ed6528884fddb24c3cac299e10efdb7eb5
4
- data.tar.gz: 62539abf29b08ec70f5846bd3e290fd475fc98a043f80a5515520fbcecd2bbb1
3
+ metadata.gz: daebca4fbc1adcea00bcf7dc637e328f4534a115f69a17f10bca60f8a21dee01
4
+ data.tar.gz: 512c1da726768d49d97b8262303f8c524b4ea23ccc8c25f1350f93a121813be4
5
5
  SHA512:
6
- metadata.gz: cc4ed320dc2e6455b3b71a5b41080f0d7d97e5f67ed3a7ee7acc61528c18d6f4daa353724a41a2c26eec0bc9a137a2f5221f7adb536d12d813187264f7cb2ec1
7
- data.tar.gz: 21594ef130d424275c02a3cc27f87064df0b6fa49245e6469a7c767fbf67821436ee22d44a5db2bbaff6909e976cc8a69498892f6a4b77e58a40c29bbe78e5c1
6
+ metadata.gz: 6d29ac70643b583a0d01c512e2054700e15cdf60091042ed4de7c3de85feca75fcd94b2201691a0360875c02b293cc00632c6dce29888e735a488dac50712c70
7
+ data.tar.gz: cee8f9dcbe026dc2e5bb1de5db902904c460c6e71cf4ab9ac64b9f2a8357c3857be328912f1deedf3f51c00f99b50f07b463884e60f235f858ef33bf5cd417f7
data/bin/Changes CHANGED
@@ -7,10 +7,43 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.50. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Mar. 15, 2023 - Version 12.58
11
+
12
+ - Added Extra ImageDataMD5 tag to calculate MD5 of image data only
13
+ - Added support for reading DJI APP4 and APP7 JPEG segments
14
+ - Added a new SonyModelID value
15
+ - Decode a few new Nikon tags (thanks Warren Hatch)
16
+ - Downgraded "Windows file times" to a minor warning when Win32::API or
17
+ Win32API::File is not installed while reading metadata
18
+ - Patched possible runtime warning when API IgnoreTags option is used to
19
+ ignore FileType
20
+ - Fixed problem extracting NetName from Windows LNK files
21
+ - Fixed issue where the %C filename format code would increment the count on
22
+ an output filename collision, but it is supposed to count the input files
23
+
24
+ Feb. 23, 2023 - Version 12.57
25
+
26
+ - Added two new Nikon Z lenses (thanks LibRaw)
27
+ - Added a new Sigma LensType (thanks LibRaw)
28
+ - Added a new Olympus LensType (thanks Herb)
29
+ - Decode more new Nikon tags (thanks Warren Hatch)
30
+ - Decode Photoshop LayerColors, LayerSections and LayerVisible tags
31
+ - Improved Verbose output for QuickTime-format files
32
+ - Set family 1 group name for Garmin GPS from uuid atom
33
+ - Enhanced -progress option to allow message to be displayed every NUM files
34
+ - Significant improvements to parsing of Nikon ShotInfo records for newer
35
+ models
36
+ - Removed hex dump of APP segments from -v3 output when writing
37
+ - Fixed bug writing negative MIE GPS coordinates
38
+ - Fixed bug where a duplicate XMP could be generated when writing XMP to a
39
+ JPEG XL image which already contained XMP
40
+ - Fixed problem where HEAD lines may be duplicated in an output file if the -p
41
+ option was combined with -w+ or -W+
42
+
10
43
  Feb. 9, 2023 - Version 12.56
11
44
 
12
- - Added support for VNT (both Scene7 Vignette and V-Note document) files
13
- - Added read support for InfiRay APP2 metadata (thanks Marcos Del Sol Vives)
45
+ - Added support for VNT files (both Scene7 Vignette and V-Note document)
46
+ - Added read support for InfiRay IJPEG metadata (thanks Marcos Del Sol Vives)
14
47
  - Added some new Sony LensType values (thanks Jos Roost and Francois Piette)
15
48
  - Added a new FujiFilm VideoRecordingMode value (thanks Greybeard)
16
49
  - Added two new Canon LensTypes and CanonModelIDs (thanks Norbert Wasser)
data/bin/META.json CHANGED
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.56"
50
+ "version" : "12.58"
51
51
  }
data/bin/META.yml CHANGED
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.56
31
+ version: 12.58
data/bin/README CHANGED
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.56.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.56
110
+ gzip -dc Image-ExifTool-12.58.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.58
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
@@ -17,7 +17,7 @@
17
17
  # RotateMPRegionCW90
18
18
  # RotateMPRegionCW180
19
19
  # RotateMPRegionCW270
20
- # These tags will rotate a MWG Region clockwise 90, 180, or 270 degrees.
20
+ # These tags will rotate an MP Region clockwise 90, 180, or 270 degrees.
21
21
  # Example:
22
22
  # exiftool -config rotate_regions.config "-RegionInfoMP<RotateMPRegionCW90" FILE
23
23
  #
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.56';
14
+ my $version = '12.58';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -77,6 +77,7 @@ sub AcceptFile($);
77
77
  sub SlurpFile($$);
78
78
  sub FilterArgfileLine($);
79
79
  sub ReadStayOpen($);
80
+ sub Progress($$);
80
81
  sub PrintTagList($@);
81
82
  sub PrintErrors($$$);
82
83
 
@@ -182,7 +183,9 @@ my $pause; # pause before returning
182
183
  my $preserveTime; # flag to preserve times of updated files (2=preserve FileCreateDate only)
183
184
  my $progress; # flag to calculate total files to process (0=calculate but don't display)
184
185
  my $progressCount; # count of files processed
186
+ my $progressIncr; # increment for progress counter
185
187
  my $progressMax; # total number of files to process
188
+ my $progressNext; # next progress count to output
186
189
  my $progStr; # progress message string
187
190
  my $quiet; # flag to disable printing of informational messages / warnings
188
191
  my $rafStdin; # File::RandomAccess for stdin (if necessary to rewind)
@@ -211,6 +214,7 @@ my $validFile; # flag indicating we processed a valid file
211
214
  my $verbose; # verbose setting
212
215
  my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
213
216
  my $windowTitle; # title for console window
217
+ my %wroteHEAD; # list of output txt files to which we wrote HEAD
214
218
  my $xml; # flag for XML-formatted output
215
219
 
216
220
  # flag to keep the input -@ argfile open:
@@ -251,17 +255,15 @@ my %optArgs = (
251
255
  '-csvdelim' => 1,
252
256
  '-d' => 1, '-dateformat' => 1,
253
257
  '-D' => 0, # necessary to avoid matching lower-case equivalent
254
- '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
255
- '-efile' => 1, '-efile1' => 1, '-efile2' => 1, '-efile3' => 1, '-efile4' => 1,
256
- '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
258
+ '-echo' => 1, '-echo#' => 1,
259
+ '-efile' => 1, '-efile#' => 1, '-efile!' => 1, '-efile#!' => 1,
257
260
  '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
258
261
  '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
259
- '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
260
- '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
262
+ '-fileorder' => 1, '-fileorder#' => 1,
261
263
  '-geotag' => 1,
262
264
  '-globaltimeshift' => 1,
263
265
  '-i' => 1, '-ignore' => 1,
264
- '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
266
+ '-if' => 1, '-if#' => 1,
265
267
  '-lang' => 0, # (optional arg; cannot begin with "-")
266
268
  '-listitem' => 1,
267
269
  '-o' => 1, '-out' => 1,
@@ -489,7 +491,9 @@ undef $outOpt;
489
491
  undef $preserveTime;
490
492
  undef $progress;
491
493
  undef $progressCount;
494
+ undef $progressIncr;
492
495
  undef $progressMax;
496
+ undef $progressNext;
493
497
  undef $recurse;
494
498
  undef $scanWritable;
495
499
  undef $sectHeader;
@@ -1119,9 +1123,11 @@ for (;;) {
1119
1123
  }
1120
1124
  (/^P$/ or $a eq 'preserve') and $preserveTime = 1, next;
1121
1125
  /^password$/i and $mt->Options(Password => shift), next;
1122
- if (/^progress(:.*)?$/i) {
1123
- if ($1) {
1124
- $windowTitle = substr $1, 1;
1126
+ if (/^progress(\d*)(:.*)?$/i) {
1127
+ $progressIncr = $1 || 1;
1128
+ $progressNext = 0; # start showing progress at the first file
1129
+ if ($2) {
1130
+ $windowTitle = substr $2, 1;
1125
1131
  $windowTitle = 'ExifTool %p%%' unless length $windowTitle;
1126
1132
  $windowTitle =~ /%\d*[bpr]/ and $progress = 0 unless defined $progress;
1127
1133
  } else {
@@ -1239,7 +1245,8 @@ for (;;) {
1239
1245
  next;
1240
1246
  }
1241
1247
  if (/^(w|textout|tagout)([!+]*)$/i) {
1242
- $textOut = shift || Warn("Expecting output extension for -$_ option\n");
1248
+ # (note: all logic ignores $textOut of 0 or '')
1249
+ $textOut = shift || Warn("Expecting argument for -$_ option\n");
1243
1250
  my ($t1, $t2) = ($1, $2);
1244
1251
  $textOverwrite = 0;
1245
1252
  $textOverwrite += 1 if $t2 =~ /!/; # overwrite
@@ -1711,7 +1718,7 @@ if (defined $showGroup and not (@tags and $allGroup) and ($sortOpt or not define
1711
1718
  $mt->Options(Sort => "Group$showGroup");
1712
1719
  }
1713
1720
 
1714
- if (defined $textOut) {
1721
+ if ($textOut) {
1715
1722
  CleanFilename($textOut); # make all forward slashes
1716
1723
  # add '.' before output extension if necessary
1717
1724
  $textOut = ".$textOut" unless $textOut =~ /[.%]/ or defined $tagOut;
@@ -1935,7 +1942,7 @@ sub GetImageInfo($$)
1935
1942
  my (@foundTags, $info, $file, $ind);
1936
1943
 
1937
1944
  # set window title for this file if necessary
1938
- if (defined $windowTitle) {
1945
+ if (defined $windowTitle and $progressCount >= $progressNext) {
1939
1946
  my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
1940
1947
  my $title = $windowTitle;
1941
1948
  my ($num, $denom) = split '/', $prog;
@@ -1951,6 +1958,7 @@ sub GetImageInfo($$)
1951
1958
  );
1952
1959
  $title =~ s/%([%bfpr])/$lkup{$1}/eg;
1953
1960
  SetWindowTitle($title);
1961
+ undef $progressNext;
1954
1962
  }
1955
1963
  unless (length $orig or $outOpt) {
1956
1964
  Warn qq(Error: Zero-length file name - ""\n);
@@ -2044,7 +2052,7 @@ sub GetImageInfo($$)
2044
2052
  undef @foundTags if $fastCondition; # ignore if we didn't get all tags
2045
2053
  }
2046
2054
  unless ($result) {
2047
- $verbose and print $vout "-------- $file (failed condition)$progStr\n";
2055
+ Progress($vout, "-------- $file (failed condition)") if $verbose;
2048
2056
  EFile($file, 2);
2049
2057
  ++$countFailed;
2050
2058
  return;
@@ -2054,7 +2062,7 @@ sub GetImageInfo($$)
2054
2062
  undef $info if $verbose or defined $fastCondition;
2055
2063
  }
2056
2064
  if (defined $deleteOrig) {
2057
- print $vout "======== $file$progStr\n" if defined $verbose;
2065
+ Progress($vout, "======== $file") if defined $verbose;
2058
2066
  ++$count;
2059
2067
  my $original = "${file}_original";
2060
2068
  $et->Exists($original) or return;
@@ -2084,12 +2092,12 @@ sub GetImageInfo($$)
2084
2092
  }
2085
2093
 
2086
2094
  if ($isWriting) {
2087
- print $vout "======== $file$progStr\n" if defined $verbose;
2095
+ Progress($vout, "======== $file") if defined $verbose;
2088
2096
  SetImageInfo($et, $file, $orig);
2089
2097
  $info = $et->GetInfo('Warning', 'Error');
2090
2098
  PrintErrors($et, $info, $file);
2091
2099
  # close output text file if necessary
2092
- if ($outfile) {
2100
+ if (defined $outfile) {
2093
2101
  undef $tmpText;
2094
2102
  close($fp);
2095
2103
  $et->Options(TextOut => $vout);
@@ -2108,7 +2116,7 @@ sub GetImageInfo($$)
2108
2116
  unless ($file eq '-' or $et->Exists($file)) {
2109
2117
  Warn "Error: File not found - $file\n";
2110
2118
  FileNotFound($file);
2111
- $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
2119
+ defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
2112
2120
  EFile($file);
2113
2121
  ++$countBad;
2114
2122
  return;
@@ -2125,7 +2133,7 @@ sub GetImageInfo($$)
2125
2133
  }
2126
2134
  }
2127
2135
  $o = \*STDERR if $progress and not $o;
2128
- $o and print $o "======== $file$progStr\n";
2136
+ Progress($o, "======== $file") if $o;
2129
2137
  if ($info) {
2130
2138
  # get the information we wanted
2131
2139
  if (@tags and not %printFmt) {
@@ -2147,7 +2155,7 @@ sub GetImageInfo($$)
2147
2155
  }
2148
2156
  # all done now if we already wrote output text file (eg. verbose option)
2149
2157
  if ($fp) {
2150
- if ($outfile) {
2158
+ if (defined $outfile) {
2151
2159
  $et->Options(TextOut => \*STDOUT);
2152
2160
  undef $tmpText;
2153
2161
  if ($info->{Error}) {
@@ -2176,7 +2184,7 @@ sub GetImageInfo($$)
2176
2184
  }
2177
2185
 
2178
2186
  # open output file (or stdout if no output file) if not done already
2179
- unless ($outfile or $tagOut) {
2187
+ unless (defined $outfile or $tagOut) {
2180
2188
  ($fp, $outfile, $append) = OpenOutputFile($orig);
2181
2189
  $fp or EFile($file), ++$countBad, return;
2182
2190
  $tmpText = $outfile unless $append;
@@ -2201,6 +2209,10 @@ sub GetImageInfo($$)
2201
2209
  my $skipBody;
2202
2210
  foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
2203
2211
  my $prf = $printFmt{$type} or next;
2212
+ if ($type eq 'HEAD' and defined $outfile) {
2213
+ next if $wroteHEAD{$outfile};
2214
+ $wroteHEAD{$outfile} = 1;
2215
+ }
2204
2216
  next if $type eq 'BODY' and $skipBody;
2205
2217
  if ($lastDoc) {
2206
2218
  if ($doc) {
@@ -2238,7 +2250,7 @@ sub GetImageInfo($$)
2238
2250
  }
2239
2251
  }
2240
2252
  }
2241
- delete $printFmt{HEAD} unless $outfile; # print header only once per output file
2253
+ delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
2242
2254
  my $errs = $et->GetInfo('Warning', 'Error');
2243
2255
  PrintErrors($et, $errs, $file) and EFile($file);
2244
2256
  } elsif (not $disableOutput) {
@@ -2394,7 +2406,7 @@ TAG: foreach $tag (@foundTags) {
2394
2406
  next TAG;
2395
2407
  }
2396
2408
  my @groups = $et->GetGroup($tag);
2397
- $outfile and close($fp), undef($tmpText); # (shouldn't happen)
2409
+ defined $outfile and close($fp), undef($tmpText); # (shouldn't happen)
2398
2410
  my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName');
2399
2411
  ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org);
2400
2412
  $fp or ++$countBad, next TAG;
@@ -2700,7 +2712,7 @@ TAG: foreach $tag (@foundTags) {
2700
2712
  }
2701
2713
  }
2702
2714
  }
2703
- if ($outfile) {
2715
+ if (defined $outfile) {
2704
2716
  if ($textOverwrite & 0x02) {
2705
2717
  # save state of this file if we may be appending
2706
2718
  $outComma{$outfile} = $comma;
@@ -3661,8 +3673,19 @@ sub ProcessFiles($;$)
3661
3673
  foreach $file (@files) {
3662
3674
  $et->Options(CharsetFileName => 'UTF8') if $utf8FileName{$file};
3663
3675
  if (defined $progressMax) {
3676
+ unless (defined $progressNext) {
3677
+ $progressNext = $progressCount + $progressIncr;
3678
+ $progressNext -= $progressNext % $progressIncr;
3679
+ $progressNext = $progressMax if $progressNext > $progressMax;
3680
+ }
3664
3681
  ++$progressCount;
3665
- $progStr = " [$progressCount/$progressMax]" if $progress;
3682
+ if ($progress) {
3683
+ if ($progressCount >= $progressNext) {
3684
+ $progStr = " [$progressCount/$progressMax]";
3685
+ } else {
3686
+ undef $progStr; # don't update progress yet
3687
+ }
3688
+ }
3666
3689
  }
3667
3690
  if ($et->IsDirectory($file) and not $listDir) {
3668
3691
  $multiFile = $validFile = 1;
@@ -3670,7 +3693,7 @@ sub ProcessFiles($;$)
3670
3693
  } elsif ($filterFlag and not AcceptFile($file)) {
3671
3694
  if ($et->Exists($file)) {
3672
3695
  $filtered = 1;
3673
- $verbose and print $vout "-------- $file (wrong extension)$progStr\n";
3696
+ Progress($vout, "-------- $file (wrong extension)") if $verbose;
3674
3697
  } else {
3675
3698
  Warn "Error: File not found - $file\n";
3676
3699
  FileNotFound($file);
@@ -4167,7 +4190,6 @@ sub NextUnusedFilename($;$)
4167
4190
  }
4168
4191
  ++$copy;
4169
4192
  ++$alpha;
4170
- ++$seq;
4171
4193
  }
4172
4194
  }
4173
4195
 
@@ -4373,9 +4395,13 @@ sub ReadStayOpen($)
4373
4395
  undef $optArgs;
4374
4396
  next unless $lastOpt eq '-stay_open' or $lastOpt eq '-@';
4375
4397
  } else {
4376
- $optArgs = $optArgs{$arg};
4377
4398
  $lastOpt = lc $arg;
4378
- $optArgs = $optArgs{$lastOpt} unless defined $optArgs;
4399
+ $optArgs = $optArgs{$arg};
4400
+ unless (defined $optArgs) {
4401
+ $optArgs = $optArgs{$lastOpt};
4402
+ # handle options with trailing numbers
4403
+ $optArgs = $optArgs{"$1#$2"} if not defined $optArgs and $lastOpt =~ /^(.*?)\d+(!?)$/;
4404
+ }
4379
4405
  next unless $lastOpt =~ /^-execute\d*$/;
4380
4406
  }
4381
4407
  $processArgs = 1;
@@ -4426,6 +4452,18 @@ sub EFile($$)
4426
4452
  }
4427
4453
  }
4428
4454
 
4455
+ #------------------------------------------------------------------------------
4456
+ # Print progress message if it is time for it
4457
+ # Inputs: 0) file ref, 1) message
4458
+ sub Progress($$)
4459
+ {
4460
+ my ($file, $msg) = @_;
4461
+ if (defined $progStr) {
4462
+ print $file $msg, $progStr, "\n";
4463
+ undef $progressNext;
4464
+ }
4465
+ }
4466
+
4429
4467
  #------------------------------------------------------------------------------
4430
4468
  # Print list of tags
4431
4469
  # Inputs: 0) message, 1-N) list of tag names
@@ -4672,7 +4710,7 @@ L<Processing control|/Processing control>
4672
4710
  -overwrite_original_in_place Overwrite original by copying tmp file
4673
4711
  -P (-preserve) Preserve file modification date/time
4674
4712
  -password PASSWD Password for processing protected files
4675
- -progress[:[TITLE]] Show file progress count
4713
+ -progress[NUM][:[TITLE]] Show file progress count
4676
4714
  -q (-quiet) Quiet processing
4677
4715
  -r[.] (-recurse) Recursively process subdirectories
4678
4716
  -scanForXMP Brute force XMP scan
@@ -4728,8 +4766,9 @@ L<Image::ExifTool::TagNames|Image::ExifTool::TagNames> for documentation on
4728
4766
  available tag names. A tag name may include leading group names separated
4729
4767
  by colons (eg. C<-EXIF:CreateDate>, or C<-Doc1:XMP:Creator>), and each group
4730
4768
  name may be prefixed by a digit to specify family number (eg.
4731
- C<-1IPTC:City>). Use the B<-listg> option to list available group names by
4732
- family.
4769
+ C<-1IPTC:City>). (Note that the API SavePath and SaveFormat options must be
4770
+ used for the family 5 and 6 groups respectively to be available.) Use the
4771
+ B<-listg> option to list available group names by family.
4733
4772
 
4734
4773
  A special tag name of C<All> may be used to indicate all meta information
4735
4774
  (ie. B<-All>). This is particularly useful when a group name is specified
@@ -4737,10 +4776,11 @@ to extract all information in a group (but beware that unless the B<-a>
4737
4776
  option is also used, some tags in the group may be suppressed by same-named
4738
4777
  tags in other groups). The wildcard characters C<?> and C<*> may be used in
4739
4778
  a tag name to match any single character and zero or more characters
4740
- respectively. These may not be used in a group name, with the exception that
4741
- a group name of C<*> (or C<All>) may be used to extract all instances of a
4742
- tag (as if B<-a> was used). Note that arguments containing wildcards must
4743
- be quoted on the command line of most systems to prevent shell globbing.
4779
+ respectively. These may not be used in a group name, with the exception
4780
+ that a group name of C<*> (or C<All>) may be used to extract all instances
4781
+ of a tag (as if B<-a> was used). Note that arguments containing wildcards
4782
+ must be quoted on the command line of most systems to prevent shell
4783
+ globbing.
4744
4784
 
4745
4785
  A C<#> may be appended to the tag name to disable the print conversion on a
4746
4786
  per-tag basis (see the B<-n> option). This may also be used when writing or
@@ -4819,6 +4859,9 @@ are removed if the containing group is deleted:
4819
4859
  - Deleting EXIF only removes ExifIFD which also deletes
4820
4860
  InteropIFD and MakerNotes.
4821
4861
 
4862
+ MOV/MP4 Video:
4863
+ - Deleting ItemList also deletes Keys tags.
4864
+
4822
4865
  Notes:
4823
4866
 
4824
4867
  1) B<Many tag values may be assigned in a single command>. If two
@@ -4915,7 +4958,9 @@ prevent shell redirection, and there is no C<=> sign as when assigning new
4915
4958
  values. Source and/or destination tags may be prefixed by a group name
4916
4959
  and/or suffixed by C<#>. Wildcards are allowed in both the source and
4917
4960
  destination tag names. A destination group and/or tag name of C<All> or
4918
- C<*> writes to the same family 1 group and/or tag name as the source. If no
4961
+ C<*> writes to the same family 1 group and/or tag name as the source (but
4962
+ the family may be specified by adding a leading number to the group name,
4963
+ eg. C<0All> writes to the same family 0 group as the source). If no
4919
4964
  destination group is specified, the information is written to the preferred
4920
4965
  group. Whitespace around the C<E<gt>> or C<E<lt>> is ignored. As a
4921
4966
  convenience, C<-tagsFromFile @> is assumed for any redirected tags which are
@@ -5449,8 +5494,9 @@ which case the string is loaded from the contents of the file. Tag names in
5449
5494
  the format file or string begin with a C<$> symbol and may contain leading
5450
5495
  group names and/or a trailing C<#> (to disable print conversion). Case is
5451
5496
  not significant. Braces C<{}> may be used around the tag name to separate
5452
- it from subsequent text. Use C<$$> to represent a C<$> symbol, and C<$/>
5453
- for a newline.
5497
+ it from subsequent text (and must be used if subsequent text begins with an
5498
+ alphanumeric character, hyphen, underline, colon or number sign). Use C<$$>
5499
+ to represent a C<$> symbol, and C<$/> for a newline.
5454
5500
 
5455
5501
  Multiple B<-p> options may be used, each contributing a line (or more) of
5456
5502
  text to the output. Lines beginning with C<#[HEAD]> and C<#[TAIL]> are
@@ -5477,7 +5523,7 @@ with this command:
5477
5523
 
5478
5524
  produces output like this:
5479
5525
 
5480
- -- Generated by ExifTool 12.56 --
5526
+ -- Generated by ExifTool 12.58 --
5481
5527
  File: a.jpg - 2003:10:31 15:44:19
5482
5528
  (f/5.6, 1/60s, ISO 100)
5483
5529
  File: b.jpg - 2006:05:23 11:57:38
@@ -6110,7 +6156,7 @@ If a password is required but not given, a warning is issued and the
6110
6156
  document is not processed. This option is ignored if a password is not
6111
6157
  required.
6112
6158
 
6113
- =item B<-progress>[:[I<TITLE>]]
6159
+ =item B<-progress>[NUM][:[I<TITLE>]]
6114
6160
 
6115
6161
  Show the progress when processing files. Without a colon, the B<-progress>
6116
6162
  option adds a progress count in brackets after the name of each processed
@@ -6118,17 +6164,19 @@ file, giving the current file number and the total number of files to be
6118
6164
  processed. Implies the B<-v0> option, causing the names of processed files
6119
6165
  to also be printed when writing. When combined with the B<-if> option, the
6120
6166
  total count includes all files before the condition is applied, but files
6121
- that fail the condition will not have their names printed.
6167
+ that fail the condition will not have their names printed. If NUM is
6168
+ specified, the progress is shown every NUM input files.
6122
6169
 
6123
6170
  If followed by a colon (ie. B<-progress:>), the console window title is set
6124
6171
  according to the specified I<TITLE> string. If no I<TITLE> is given, a
6125
6172
  default I<TITLE> string of "ExifTool %p%%" is assumed. In the string, %f
6126
6173
  represents the file name, %p is the progress as a percent, %r is the
6127
- progress as a ratio, %##b is a progress bar of width "##" (20 characters if
6128
- "##" is omitted), and %% is a % character. May be combined with the normal
6129
- B<-progress> option to also show the progress count in console messages.
6130
- (Note: For this feature to function correctly on Mac/Linux, stderr must go
6131
- to the console.)
6174
+ progress as a ratio, %##b is a progress bar of width "##" (where "##" is an
6175
+ integer specifying the bar width in characters, or 20 characters by default
6176
+ if "##" is omitted), and %% is a % character. May be combined with the
6177
+ normal B<-progress> option to also show the progress count in console
6178
+ messages. (Note: For this feature to function correctly on Mac/Linux, stderr
6179
+ must go to the console.)
6132
6180
 
6133
6181
  =item B<-q> (B<-quiet>)
6134
6182
 
@@ -18,7 +18,7 @@ use vars qw($VERSION);
18
18
  use Image::ExifTool qw(:DataAccess :Utils);
19
19
  use Image::ExifTool::ID3;
20
20
 
21
- $VERSION = '1.11';
21
+ $VERSION = '1.12';
22
22
 
23
23
  # information for time/date-based tags (time zero is Jan 1, 1904)
24
24
  my %timeInfo = (
@@ -203,7 +203,7 @@ sub ProcessAIFF($$)
203
203
  return 1 if $fast3;
204
204
  $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main');
205
205
  # modify FileType to indicate a multi-page document
206
- $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM';
206
+ $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM' and $$et{VALUE}{FileType};
207
207
  $type = 'DjVu';
208
208
  } else {
209
209
  return 0 unless $buff =~ /^FORM....(AIF(F|C))/s;
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.06';
18
+ $VERSION = '1.07';
19
19
 
20
20
  # APE metadata blocks
21
21
  %Image::ExifTool::APE::Main = (
@@ -133,7 +133,7 @@ sub ProcessAPE($$)
133
133
 
134
134
  # check APE signature and process audio information
135
135
  # unless this is some other type of file
136
- unless ($$et{VALUE}{FileType}) {
136
+ unless ($$et{FileType}) {
137
137
  $raf->Read($buff, 32) == 32 or return 0;
138
138
  $buff =~ /^(MAC |APETAGEX)/ or return 0;
139
139
  $et->SetFileType();
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
35
35
  use Image::ExifTool::Validate;
36
36
  use Image::ExifTool::MacOS;
37
37
 
38
- $VERSION = '3.50';
38
+ $VERSION = '3.52';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -184,7 +184,8 @@ gives the order of values for a serial data stream.
184
184
  A B<Tag Name> is the handle by which the information is accessed in
185
185
  ExifTool. In some instances, more than one name may correspond to a single
186
186
  tag ID. In these cases, the actual name used depends on the context in
187
- which the information is found. Case is not significant for tag names. A
187
+ which the information is found. Valid characters in a tag name are A-Z,
188
+ a-z, 0-9, hyphen (-) and underline (_). Case is not significant. A
188
189
  question mark (C<?>) after a tag name indicates that the information is
189
190
  either not understood, not verified, or not very useful -- these tags are
190
191
  not extracted by ExifTool unless the L<Unknown|../ExifTool.html#Unknown> (-u) option is enabled. Be
@@ -445,6 +446,11 @@ QuickTime-based files; it extracts other track-specific and timed metadata,
445
446
  but can not yet edit tags in these locations (with the exception of
446
447
  track-level date/time tags).
447
448
 
449
+ Beware that the Keys tags are actually stored inside the ItemList in the
450
+ file, so deleting the ItemList group as a block (ie. C<-ItemList:all=>) also
451
+ deletes Keys tags. Instead, to preserve Keys tags the ItemList tags may be
452
+ deleted individually with C<-QuickTime:ItemList:all=>.
453
+
448
454
  Alternate language tags may be accessed for
449
455
  L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
450
456
  L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding
@@ -1051,7 +1057,7 @@ TagID: foreach $tagID (@keys) {
1051
1057
  if ($$tagInfo{SubIFD}) {
1052
1058
  warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
1053
1059
  } else {
1054
- warn "Warning: SubIFD flag not set for $short $name\n" if $isSub;
1060
+ warn "Warning: SubIFD flag not set for $short $name\n" if $isSub and not $processBinaryData;
1055
1061
  }
1056
1062
  if ($$tagInfo{Notes}) {
1057
1063
  my $note = $$tagInfo{Notes};
@@ -1201,6 +1207,7 @@ TagID: foreach $tagID (@keys) {
1201
1207
  $sepTable{$s} = $printConv;
1202
1208
  # add PrintHex flag to PrintConv so we can check it later
1203
1209
  $$printConv{PrintHex} = 1 if $$tagInfo{PrintHex};
1210
+ $$printConv{PrintInt} = 1 if $$tagInfo{PrintInt};
1204
1211
  $$printConv{PrintString} = 1 if $$tagInfo{PrintString};
1205
1212
  } else {
1206
1213
  $caseInsensitive = 0;
@@ -1216,22 +1223,18 @@ TagID: foreach $tagID (@keys) {
1216
1223
  next if $_ eq '' and $$printConv{$_} eq '';
1217
1224
  $_ eq 'BITMASK' and $bits = $$printConv{$_}, next;
1218
1225
  $_ eq 'OTHER' and next;
1219
- my $index;
1220
- if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and /^-?\d+$/) {
1226
+ my $index = $_;
1227
+ $index =~ s/\.\d+$// if $$tagInfo{PrintInt};
1228
+ if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and $index =~ /^-?\d+$/) {
1221
1229
  my $dig = $$tagInfo{PrintHex} || 1;
1222
- if ($_ >= 0) {
1223
- $index = sprintf('0x%.*x', $dig, $_);
1230
+ if ($index >= 0) {
1231
+ $index = sprintf('0x%.*x', $dig, $index);
1224
1232
  } elsif ($format and $format =~ /int(16|32)/) {
1225
1233
  # mask off unused bits of signed integer hex value
1226
1234
  my $mask = { 16 => 0xffff, 32 => 0xffffffff }->{$1};
1227
- $index = sprintf('0x%.*x', $dig, $_ & $mask);
1228
- } else {
1229
- $index = $_;
1235
+ $index = sprintf('0x%.*x', $dig, $index & $mask);
1230
1236
  }
1231
- } elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and not $$tagInfo{PrintString}) {
1232
- $index = $_;
1233
- } else {
1234
- $index = $_;
1237
+ } elsif ($$tagInfo{PrintString} or not /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/) {
1235
1238
  # translate unprintable values
1236
1239
  if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) {
1237
1240
  $index = qq{"$index"};
@@ -2205,7 +2208,7 @@ sub WriteTagNames($$)
2205
2208
  my $wid = 0;
2206
2209
  my @keys;
2207
2210
  foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
2208
- next if /^(Notes|PrintHex|PrintString|OTHER)$/;
2211
+ next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER)$/;
2209
2212
  $align = '' if $align and /[^\d]/;
2210
2213
  my $w = length($_) + length($$printConv{$_});
2211
2214
  $wid = $w if $wid < $w;
@@ -2233,6 +2236,7 @@ sub WriteTagNames($$)
2233
2236
  if (defined $key) {
2234
2237
  $index = $key;
2235
2238
  $prt = '= ' . EscapeHTML($$printConv{$key});
2239
+ $index =~ s/\.\d+$// if $$printConv{PrintInt};
2236
2240
  if ($$printConv{PrintHex}) {
2237
2241
  $index =~ s/(\.\d+)$//; # remove decimal
2238
2242
  $index = sprintf('0x%x',$index);