exiftool_vendored 12.56.0 → 12.57.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +21 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +74 -30
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +4 -0
- data/bin/lib/Image/ExifTool/GPS.pm +7 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/Nikon.pm +665 -845
- data/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
- data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +36 -5
- data/bin/lib/Image/ExifTool/QuickTime.pm +18 -2
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +2 -0
- data/bin/lib/Image/ExifTool/README +11 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +2 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4654 -4628
- data/bin/lib/Image/ExifTool/TagNames.pod +194 -86
- data/bin/lib/Image/ExifTool/Writer.pl +36 -16
- data/bin/lib/Image/ExifTool.pm +38 -22
- data/bin/lib/Image/ExifTool.pod +4 -4
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c02a2a1efe1fc3f63f7527ed968432fc73d7e1ebeda7cfbf424413b8907bd0c
|
4
|
+
data.tar.gz: 5140c2587870d324d63d4d35beb70d1cbbecb92a78fb6ea55d9885cf9f320c1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edd012dc39bc24a6b257f147e5d698648c686aa54e1ac04229cd3cd4880a91d96e21f6f017305a6d763826470ef1f990e94221320bd1d7ee0a73fb5cb2b32ab4
|
7
|
+
data.tar.gz: 78856db2a60493444afe450c663d190553147b651140c2f18a2a2641e8c9bc0d5af7f31bd0db4a5f55c89f72b460119192889f4f10190cad3a21bffae976e630
|
data/bin/Changes
CHANGED
@@ -7,10 +7,29 @@ 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
|
+
Feb. 23, 2023 - Version 12.57
|
11
|
+
|
12
|
+
- Added two new Nikon Z lenses (thanks LibRaw)
|
13
|
+
- Added a new Sigma LensType (thanks LibRaw)
|
14
|
+
- Added a new Olympus LensType (thanks Herb)
|
15
|
+
- Decode more new Nikon tags (thanks Warren Hatch)
|
16
|
+
- Decode Photoshop LayerColors, LayerSections and LayerVisible tags
|
17
|
+
- Improved Verbose output for QuickTime-format files
|
18
|
+
- Set family 1 group name for Garmin GPS from uuid atom
|
19
|
+
- Enhanced -progress option to allow message to be displayed every NUM files
|
20
|
+
- Significant improvements to parsing of Nikon ShotInfo records for newer
|
21
|
+
models
|
22
|
+
- Removed hex dump of APP segments from -v3 output when writing
|
23
|
+
- Fixed bug writing negative MIE GPS coordinates
|
24
|
+
- Fixed bug where a duplicate XMP could be generated when writing XMP to a
|
25
|
+
JPEG XL image which already contained XMP
|
26
|
+
- Fixed problem where HEAD lines may be duplicated in an output file if the -p
|
27
|
+
option was combined with -w+ or -W+
|
28
|
+
|
10
29
|
Feb. 9, 2023 - Version 12.56
|
11
30
|
|
12
|
-
- Added support for VNT (both Scene7 Vignette and V-Note document)
|
13
|
-
- Added read support for InfiRay
|
31
|
+
- Added support for VNT files (both Scene7 Vignette and V-Note document)
|
32
|
+
- Added read support for InfiRay IJPEG metadata (thanks Marcos Del Sol Vives)
|
14
33
|
- Added some new Sony LensType values (thanks Jos Roost and Francois Piette)
|
15
34
|
- Added a new FujiFilm VideoRecordingMode value (thanks Greybeard)
|
16
35
|
- Added two new Canon LensTypes and CanonModelIDs (thanks Norbert Wasser)
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
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.
|
111
|
-
cd Image-ExifTool-12.
|
110
|
+
gzip -dc Image-ExifTool-12.57.tar.gz | tar -xf -
|
111
|
+
cd Image-ExifTool-12.57
|
112
112
|
./exiftool t/images/ExifTool.jpg
|
113
113
|
|
114
114
|
Note: These commands extract meta information from one of the test images.
|
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.
|
14
|
+
my $version = '12.57';
|
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:
|
@@ -489,7 +493,9 @@ undef $outOpt;
|
|
489
493
|
undef $preserveTime;
|
490
494
|
undef $progress;
|
491
495
|
undef $progressCount;
|
496
|
+
undef $progressIncr;
|
492
497
|
undef $progressMax;
|
498
|
+
undef $progressNext;
|
493
499
|
undef $recurse;
|
494
500
|
undef $scanWritable;
|
495
501
|
undef $sectHeader;
|
@@ -1119,9 +1125,11 @@ for (;;) {
|
|
1119
1125
|
}
|
1120
1126
|
(/^P$/ or $a eq 'preserve') and $preserveTime = 1, next;
|
1121
1127
|
/^password$/i and $mt->Options(Password => shift), next;
|
1122
|
-
if (/^progress(:.*)?$/i) {
|
1123
|
-
|
1124
|
-
|
1128
|
+
if (/^progress(\d*)(:.*)?$/i) {
|
1129
|
+
$progressIncr = $1 || 1;
|
1130
|
+
$progressNext = 0; # start showing progress at the first file
|
1131
|
+
if ($2) {
|
1132
|
+
$windowTitle = substr $2, 1;
|
1125
1133
|
$windowTitle = 'ExifTool %p%%' unless length $windowTitle;
|
1126
1134
|
$windowTitle =~ /%\d*[bpr]/ and $progress = 0 unless defined $progress;
|
1127
1135
|
} else {
|
@@ -1239,7 +1247,8 @@ for (;;) {
|
|
1239
1247
|
next;
|
1240
1248
|
}
|
1241
1249
|
if (/^(w|textout|tagout)([!+]*)$/i) {
|
1242
|
-
|
1250
|
+
# (note: all logic ignores $textOut of 0 or '')
|
1251
|
+
$textOut = shift || Warn("Expecting argument for -$_ option\n");
|
1243
1252
|
my ($t1, $t2) = ($1, $2);
|
1244
1253
|
$textOverwrite = 0;
|
1245
1254
|
$textOverwrite += 1 if $t2 =~ /!/; # overwrite
|
@@ -1711,7 +1720,7 @@ if (defined $showGroup and not (@tags and $allGroup) and ($sortOpt or not define
|
|
1711
1720
|
$mt->Options(Sort => "Group$showGroup");
|
1712
1721
|
}
|
1713
1722
|
|
1714
|
-
if (
|
1723
|
+
if ($textOut) {
|
1715
1724
|
CleanFilename($textOut); # make all forward slashes
|
1716
1725
|
# add '.' before output extension if necessary
|
1717
1726
|
$textOut = ".$textOut" unless $textOut =~ /[.%]/ or defined $tagOut;
|
@@ -1935,7 +1944,7 @@ sub GetImageInfo($$)
|
|
1935
1944
|
my (@foundTags, $info, $file, $ind);
|
1936
1945
|
|
1937
1946
|
# set window title for this file if necessary
|
1938
|
-
if (defined $windowTitle) {
|
1947
|
+
if (defined $windowTitle and $progressCount >= $progressNext) {
|
1939
1948
|
my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
|
1940
1949
|
my $title = $windowTitle;
|
1941
1950
|
my ($num, $denom) = split '/', $prog;
|
@@ -1951,6 +1960,7 @@ sub GetImageInfo($$)
|
|
1951
1960
|
);
|
1952
1961
|
$title =~ s/%([%bfpr])/$lkup{$1}/eg;
|
1953
1962
|
SetWindowTitle($title);
|
1963
|
+
undef $progressNext;
|
1954
1964
|
}
|
1955
1965
|
unless (length $orig or $outOpt) {
|
1956
1966
|
Warn qq(Error: Zero-length file name - ""\n);
|
@@ -2044,7 +2054,7 @@ sub GetImageInfo($$)
|
|
2044
2054
|
undef @foundTags if $fastCondition; # ignore if we didn't get all tags
|
2045
2055
|
}
|
2046
2056
|
unless ($result) {
|
2047
|
-
$
|
2057
|
+
Progress($vout, "-------- $file (failed condition)") if $verbose;
|
2048
2058
|
EFile($file, 2);
|
2049
2059
|
++$countFailed;
|
2050
2060
|
return;
|
@@ -2054,7 +2064,7 @@ sub GetImageInfo($$)
|
|
2054
2064
|
undef $info if $verbose or defined $fastCondition;
|
2055
2065
|
}
|
2056
2066
|
if (defined $deleteOrig) {
|
2057
|
-
|
2067
|
+
Progress($vout, "======== $file") if defined $verbose;
|
2058
2068
|
++$count;
|
2059
2069
|
my $original = "${file}_original";
|
2060
2070
|
$et->Exists($original) or return;
|
@@ -2084,12 +2094,12 @@ sub GetImageInfo($$)
|
|
2084
2094
|
}
|
2085
2095
|
|
2086
2096
|
if ($isWriting) {
|
2087
|
-
|
2097
|
+
Progress($vout, "======== $file") if defined $verbose;
|
2088
2098
|
SetImageInfo($et, $file, $orig);
|
2089
2099
|
$info = $et->GetInfo('Warning', 'Error');
|
2090
2100
|
PrintErrors($et, $info, $file);
|
2091
2101
|
# close output text file if necessary
|
2092
|
-
if ($outfile) {
|
2102
|
+
if (defined $outfile) {
|
2093
2103
|
undef $tmpText;
|
2094
2104
|
close($fp);
|
2095
2105
|
$et->Options(TextOut => $vout);
|
@@ -2108,7 +2118,7 @@ sub GetImageInfo($$)
|
|
2108
2118
|
unless ($file eq '-' or $et->Exists($file)) {
|
2109
2119
|
Warn "Error: File not found - $file\n";
|
2110
2120
|
FileNotFound($file);
|
2111
|
-
$outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
|
2121
|
+
defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
|
2112
2122
|
EFile($file);
|
2113
2123
|
++$countBad;
|
2114
2124
|
return;
|
@@ -2125,7 +2135,7 @@ sub GetImageInfo($$)
|
|
2125
2135
|
}
|
2126
2136
|
}
|
2127
2137
|
$o = \*STDERR if $progress and not $o;
|
2128
|
-
$o
|
2138
|
+
Progress($o, "======== $file") if $o;
|
2129
2139
|
if ($info) {
|
2130
2140
|
# get the information we wanted
|
2131
2141
|
if (@tags and not %printFmt) {
|
@@ -2147,7 +2157,7 @@ sub GetImageInfo($$)
|
|
2147
2157
|
}
|
2148
2158
|
# all done now if we already wrote output text file (eg. verbose option)
|
2149
2159
|
if ($fp) {
|
2150
|
-
if ($outfile) {
|
2160
|
+
if (defined $outfile) {
|
2151
2161
|
$et->Options(TextOut => \*STDOUT);
|
2152
2162
|
undef $tmpText;
|
2153
2163
|
if ($info->{Error}) {
|
@@ -2176,7 +2186,7 @@ sub GetImageInfo($$)
|
|
2176
2186
|
}
|
2177
2187
|
|
2178
2188
|
# open output file (or stdout if no output file) if not done already
|
2179
|
-
unless ($outfile or $tagOut) {
|
2189
|
+
unless (defined $outfile or $tagOut) {
|
2180
2190
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2181
2191
|
$fp or EFile($file), ++$countBad, return;
|
2182
2192
|
$tmpText = $outfile unless $append;
|
@@ -2201,6 +2211,10 @@ sub GetImageInfo($$)
|
|
2201
2211
|
my $skipBody;
|
2202
2212
|
foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
|
2203
2213
|
my $prf = $printFmt{$type} or next;
|
2214
|
+
if ($type eq 'HEAD' and defined $outfile) {
|
2215
|
+
next if $wroteHEAD{$outfile};
|
2216
|
+
$wroteHEAD{$outfile} = 1;
|
2217
|
+
}
|
2204
2218
|
next if $type eq 'BODY' and $skipBody;
|
2205
2219
|
if ($lastDoc) {
|
2206
2220
|
if ($doc) {
|
@@ -2238,7 +2252,7 @@ sub GetImageInfo($$)
|
|
2238
2252
|
}
|
2239
2253
|
}
|
2240
2254
|
}
|
2241
|
-
delete $printFmt{HEAD} unless $outfile; # print header only once per output file
|
2255
|
+
delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
|
2242
2256
|
my $errs = $et->GetInfo('Warning', 'Error');
|
2243
2257
|
PrintErrors($et, $errs, $file) and EFile($file);
|
2244
2258
|
} elsif (not $disableOutput) {
|
@@ -2394,7 +2408,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2394
2408
|
next TAG;
|
2395
2409
|
}
|
2396
2410
|
my @groups = $et->GetGroup($tag);
|
2397
|
-
$outfile and close($fp), undef($tmpText); # (shouldn't happen)
|
2411
|
+
defined $outfile and close($fp), undef($tmpText); # (shouldn't happen)
|
2398
2412
|
my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName');
|
2399
2413
|
($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org);
|
2400
2414
|
$fp or ++$countBad, next TAG;
|
@@ -2700,7 +2714,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2700
2714
|
}
|
2701
2715
|
}
|
2702
2716
|
}
|
2703
|
-
if ($outfile) {
|
2717
|
+
if (defined $outfile) {
|
2704
2718
|
if ($textOverwrite & 0x02) {
|
2705
2719
|
# save state of this file if we may be appending
|
2706
2720
|
$outComma{$outfile} = $comma;
|
@@ -3661,8 +3675,19 @@ sub ProcessFiles($;$)
|
|
3661
3675
|
foreach $file (@files) {
|
3662
3676
|
$et->Options(CharsetFileName => 'UTF8') if $utf8FileName{$file};
|
3663
3677
|
if (defined $progressMax) {
|
3678
|
+
unless (defined $progressNext) {
|
3679
|
+
$progressNext = $progressCount + $progressIncr;
|
3680
|
+
$progressNext -= $progressNext % $progressIncr;
|
3681
|
+
$progressNext = $progressMax if $progressNext > $progressMax;
|
3682
|
+
}
|
3664
3683
|
++$progressCount;
|
3665
|
-
|
3684
|
+
if ($progress) {
|
3685
|
+
if ($progressCount >= $progressNext) {
|
3686
|
+
$progStr = " [$progressCount/$progressMax]";
|
3687
|
+
} else {
|
3688
|
+
undef $progStr; # don't update progress yet
|
3689
|
+
}
|
3690
|
+
}
|
3666
3691
|
}
|
3667
3692
|
if ($et->IsDirectory($file) and not $listDir) {
|
3668
3693
|
$multiFile = $validFile = 1;
|
@@ -3670,7 +3695,7 @@ sub ProcessFiles($;$)
|
|
3670
3695
|
} elsif ($filterFlag and not AcceptFile($file)) {
|
3671
3696
|
if ($et->Exists($file)) {
|
3672
3697
|
$filtered = 1;
|
3673
|
-
$
|
3698
|
+
Progress($vout, "-------- $file (wrong extension)") if $verbose;
|
3674
3699
|
} else {
|
3675
3700
|
Warn "Error: File not found - $file\n";
|
3676
3701
|
FileNotFound($file);
|
@@ -4426,6 +4451,18 @@ sub EFile($$)
|
|
4426
4451
|
}
|
4427
4452
|
}
|
4428
4453
|
|
4454
|
+
#------------------------------------------------------------------------------
|
4455
|
+
# Print progress message if it is time for it
|
4456
|
+
# Inputs: 0) file ref, 1) message
|
4457
|
+
sub Progress($$)
|
4458
|
+
{
|
4459
|
+
my ($file, $msg) = @_;
|
4460
|
+
if (defined $progStr) {
|
4461
|
+
print $file $msg, $progStr, "\n";
|
4462
|
+
undef $progressNext;
|
4463
|
+
}
|
4464
|
+
}
|
4465
|
+
|
4429
4466
|
#------------------------------------------------------------------------------
|
4430
4467
|
# Print list of tags
|
4431
4468
|
# Inputs: 0) message, 1-N) list of tag names
|
@@ -4672,7 +4709,7 @@ L<Processing control|/Processing control>
|
|
4672
4709
|
-overwrite_original_in_place Overwrite original by copying tmp file
|
4673
4710
|
-P (-preserve) Preserve file modification date/time
|
4674
4711
|
-password PASSWD Password for processing protected files
|
4675
|
-
-progress[:[TITLE]]
|
4712
|
+
-progress[NUM][:[TITLE]] Show file progress count
|
4676
4713
|
-q (-quiet) Quiet processing
|
4677
4714
|
-r[.] (-recurse) Recursively process subdirectories
|
4678
4715
|
-scanForXMP Brute force XMP scan
|
@@ -4819,6 +4856,9 @@ are removed if the containing group is deleted:
|
|
4819
4856
|
- Deleting EXIF only removes ExifIFD which also deletes
|
4820
4857
|
InteropIFD and MakerNotes.
|
4821
4858
|
|
4859
|
+
MOV/MP4 video:
|
4860
|
+
- Deleting ItemList also deletes Keys tags
|
4861
|
+
|
4822
4862
|
Notes:
|
4823
4863
|
|
4824
4864
|
1) B<Many tag values may be assigned in a single command>. If two
|
@@ -4915,7 +4955,9 @@ prevent shell redirection, and there is no C<=> sign as when assigning new
|
|
4915
4955
|
values. Source and/or destination tags may be prefixed by a group name
|
4916
4956
|
and/or suffixed by C<#>. Wildcards are allowed in both the source and
|
4917
4957
|
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
|
4958
|
+
C<*> writes to the same family 1 group and/or tag name as the source (but
|
4959
|
+
the family may be specified by adding a leading number to the group name,
|
4960
|
+
eg. C<0All> writes to the same family 0 group as the source). If no
|
4919
4961
|
destination group is specified, the information is written to the preferred
|
4920
4962
|
group. Whitespace around the C<E<gt>> or C<E<lt>> is ignored. As a
|
4921
4963
|
convenience, C<-tagsFromFile @> is assumed for any redirected tags which are
|
@@ -5477,7 +5519,7 @@ with this command:
|
|
5477
5519
|
|
5478
5520
|
produces output like this:
|
5479
5521
|
|
5480
|
-
-- Generated by ExifTool 12.
|
5522
|
+
-- Generated by ExifTool 12.57 --
|
5481
5523
|
File: a.jpg - 2003:10:31 15:44:19
|
5482
5524
|
(f/5.6, 1/60s, ISO 100)
|
5483
5525
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6110,7 +6152,7 @@ If a password is required but not given, a warning is issued and the
|
|
6110
6152
|
document is not processed. This option is ignored if a password is not
|
6111
6153
|
required.
|
6112
6154
|
|
6113
|
-
=item B<-progress>[:[I<TITLE>]]
|
6155
|
+
=item B<-progress>[NUM][:[I<TITLE>]]
|
6114
6156
|
|
6115
6157
|
Show the progress when processing files. Without a colon, the B<-progress>
|
6116
6158
|
option adds a progress count in brackets after the name of each processed
|
@@ -6118,17 +6160,19 @@ file, giving the current file number and the total number of files to be
|
|
6118
6160
|
processed. Implies the B<-v0> option, causing the names of processed files
|
6119
6161
|
to also be printed when writing. When combined with the B<-if> option, the
|
6120
6162
|
total count includes all files before the condition is applied, but files
|
6121
|
-
that fail the condition will not have their names printed.
|
6163
|
+
that fail the condition will not have their names printed. If NUM is
|
6164
|
+
specified, the progress is shown every NUM input files.
|
6122
6165
|
|
6123
6166
|
If followed by a colon (ie. B<-progress:>), the console window title is set
|
6124
6167
|
according to the specified I<TITLE> string. If no I<TITLE> is given, a
|
6125
6168
|
default I<TITLE> string of "ExifTool %p%%" is assumed. In the string, %f
|
6126
6169
|
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 "##" (
|
6128
|
-
|
6129
|
-
|
6130
|
-
|
6131
|
-
to
|
6170
|
+
progress as a ratio, %##b is a progress bar of width "##" (where "##" is an
|
6171
|
+
integer specifying the bar width in characters, or 20 characters by default
|
6172
|
+
if "##" is omitted), and %% is a % character. May be combined with the
|
6173
|
+
normal B<-progress> option to also show the progress count in console
|
6174
|
+
messages. (Note: For this feature to function correctly on Mac/Linux, stderr
|
6175
|
+
must go to the console.)
|
6132
6176
|
|
6133
6177
|
=item B<-q> (B<-quiet>)
|
6134
6178
|
|
@@ -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.
|
38
|
+
$VERSION = '3.51';
|
39
39
|
@ISA = qw(Exporter);
|
40
40
|
|
41
41
|
sub NumbersFirst($$);
|
@@ -445,6 +445,11 @@ QuickTime-based files; it extracts other track-specific and timed metadata,
|
|
445
445
|
but can not yet edit tags in these locations (with the exception of
|
446
446
|
track-level date/time tags).
|
447
447
|
|
448
|
+
Beware that the Keys tags are actually stored inside the ItemList in the
|
449
|
+
file, so deleting the ItemList group as a block (ie. C<-ItemList:all=>) also
|
450
|
+
deletes Keys tags. Instead, to preserve Keys tags the ItemList tags may be
|
451
|
+
deleted individually with C<-QuickTime:ItemList:all=>.
|
452
|
+
|
448
453
|
Alternate language tags may be accessed for
|
449
454
|
L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
|
450
455
|
L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding
|
@@ -1051,7 +1056,7 @@ TagID: foreach $tagID (@keys) {
|
|
1051
1056
|
if ($$tagInfo{SubIFD}) {
|
1052
1057
|
warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
|
1053
1058
|
} else {
|
1054
|
-
warn "Warning: SubIFD flag not set for $short $name\n" if $isSub;
|
1059
|
+
warn "Warning: SubIFD flag not set for $short $name\n" if $isSub and not $processBinaryData;
|
1055
1060
|
}
|
1056
1061
|
if ($$tagInfo{Notes}) {
|
1057
1062
|
my $note = $$tagInfo{Notes};
|
@@ -318,6 +318,10 @@ my %fpxFileType = (
|
|
318
318
|
unrecognized Windows Compound Binary file as a FlashPix (FPX) file. See
|
319
319
|
L<http://graphcomp.com/info/specs/livepicture/fpx.pdf> for the FlashPix
|
320
320
|
specification.
|
321
|
+
|
322
|
+
Note that Microsoft is not consistent with the time zone used for some
|
323
|
+
date/time tags, and it may be either UTC or local time depending on the
|
324
|
+
software used to create the file.
|
321
325
|
},
|
322
326
|
"\x05SummaryInformation" => {
|
323
327
|
Name => 'SummaryInfo',
|
@@ -482,13 +482,13 @@ sub PrintTimeStamp($)
|
|
482
482
|
#------------------------------------------------------------------------------
|
483
483
|
# Convert degrees to DMS, or whatever the current settings are
|
484
484
|
# Inputs: 0) ExifTool reference, 1) Value in degrees,
|
485
|
-
# 2) format code (0=no format, 1=CoordFormat, 2=XMP format)
|
485
|
+
# 2) format code (0=no format, 1=CoordFormat, 2=XMP format, 3=signed unformatted)
|
486
486
|
# 3) 'N' or 'E' if sign is significant and N/S/E/W should be added
|
487
487
|
# Returns: DMS string
|
488
488
|
sub ToDMS($$;$$)
|
489
489
|
{
|
490
490
|
my ($et, $val, $doPrintConv, $ref) = @_;
|
491
|
-
my ($fmt, @fmt, $num, $sign, $rtnVal);
|
491
|
+
my ($fmt, @fmt, $num, $sign, $rtnVal, $neg);
|
492
492
|
|
493
493
|
unless (length $val) {
|
494
494
|
# don't convert an empty value
|
@@ -505,6 +505,10 @@ sub ToDMS($$;$$)
|
|
505
505
|
}
|
506
506
|
$ref = " $ref" unless $doPrintConv and $doPrintConv eq '2';
|
507
507
|
} else {
|
508
|
+
if ($doPrintConv and $doPrintConv eq '3') {
|
509
|
+
$neg = 1 if $val < 0;
|
510
|
+
$doPrintConv = 0;
|
511
|
+
}
|
508
512
|
$val = abs($val);
|
509
513
|
$ref = '';
|
510
514
|
}
|
@@ -554,6 +558,7 @@ sub ToDMS($$;$$)
|
|
554
558
|
# trim trailing zeros in XMP
|
555
559
|
$rtnVal =~ s/(\d)0+$ref$/$1$ref/ if $doPrintConv eq '2';
|
556
560
|
} else {
|
561
|
+
$neg and map { $_ *= -1 } @c;
|
557
562
|
$rtnVal = "@c$ref";
|
558
563
|
}
|
559
564
|
return $rtnVal;
|
@@ -59,7 +59,7 @@ my %jp2Map = (
|
|
59
59
|
# map of where information is written in a JXL image
|
60
60
|
my %jxlMap = (
|
61
61
|
IFD0 => 'Exif',
|
62
|
-
XMP => '
|
62
|
+
XMP => 'xml ',
|
63
63
|
'Exif' => 'JP2',
|
64
64
|
IFD1 => 'IFD0',
|
65
65
|
EXIF => 'IFD0', # to write EXIF as a block
|
@@ -827,8 +827,8 @@ sub CreateNewBoxes($$)
|
|
827
827
|
# add UUID boxes (and/or JXL Exif/XML boxes)
|
828
828
|
foreach $dirName (sort keys %$addDirs) {
|
829
829
|
# handle JPEG XL XMP and EXIF
|
830
|
-
if ($dirName eq '
|
831
|
-
my ($tag, $dir) = $dirName eq '
|
830
|
+
if ($dirName eq 'xml ' or $dirName eq 'Exif') {
|
831
|
+
my ($tag, $dir) = $dirName eq 'xml ' ? ('xml ', 'XMP') : ('Exif', 'EXIF');
|
832
832
|
my $tagInfo = $Image::ExifTool::Jpeg2000::Main{$tag};
|
833
833
|
$tagInfo = $$tagInfo[1] if ref $tagInfo eq 'ARRAY'; # (hack for stupid JXL XMP)
|
834
834
|
my $subdir = $$tagInfo{SubDirectory};
|
@@ -1123,8 +1123,8 @@ sub ProcessJpeg2000Box($$$)
|
|
1123
1123
|
my $subTable = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
|
1124
1124
|
if ($outfile) {
|
1125
1125
|
# remove this directory from our create list
|
1126
|
-
delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; # (eg. 'EXIF')
|
1127
|
-
delete $$et{AddJp2Dirs}{$boxID}; # (eg. 'Exif')
|
1126
|
+
delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; # (eg. 'EXIF' or 'XMP')
|
1127
|
+
delete $$et{AddJp2Dirs}{$boxID}; # (eg. 'Exif' or 'xml ')
|
1128
1128
|
my $newdir;
|
1129
1129
|
# only edit writable UUID, Exif and jp2h boxes
|
1130
1130
|
if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL}) or
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::Exif;
|
15
15
|
use Image::ExifTool::GPS;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.51';
|
18
18
|
|
19
19
|
sub ProcessMIE($$);
|
20
20
|
sub ProcessMIEGroup($$$);
|
@@ -391,7 +391,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
391
391
|
-30", "-40.5", "40 30 0.00 S"
|
392
392
|
},
|
393
393
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
394
|
-
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val,
|
394
|
+
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 3)',
|
395
395
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
396
396
|
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
|
397
397
|
},
|
@@ -404,7 +404,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
404
404
|
negative, but may be entered as positive numbers with a trailing 'W'
|
405
405
|
},
|
406
406
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
407
|
-
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val,
|
407
|
+
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 3)',
|
408
408
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
409
409
|
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
|
410
410
|
},
|