exiftool_vendored 12.56.0 → 12.58.0

Sign up to get free protection for your applications and to get access to all the features.
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);