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.
- checksums.yaml +4 -4
- data/bin/Changes +35 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/rotate_regions.config +1 -1
- data/bin/exiftool +95 -47
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +19 -15
- data/bin/lib/Image/ExifTool/Canon.pm +26 -6
- data/bin/lib/Image/ExifTool/DJI.pm +28 -2
- data/bin/lib/Image/ExifTool/Exif.pm +24 -5
- data/bin/lib/Image/ExifTool/FlashPix.pm +6 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/GPS.pm +7 -2
- data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- data/bin/lib/Image/ExifTool/LNK.pm +5 -4
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
- data/bin/lib/Image/ExifTool/Nikon.pm +998 -903
- 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/Pentax.pm +8 -5
- data/bin/lib/Image/ExifTool/Photoshop.pm +38 -7
- data/bin/lib/Image/ExifTool/QuickTime.pm +23 -7
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +3 -1
- data/bin/lib/Image/ExifTool/README +19 -2
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +5 -4
- data/bin/lib/Image/ExifTool/Sony.pm +23 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4670 -4628
- data/bin/lib/Image/ExifTool/TagNames.pod +261 -89
- data/bin/lib/Image/ExifTool/Validate.pm +5 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
- data/bin/lib/Image/ExifTool/Writer.pl +39 -17
- data/bin/lib/Image/ExifTool/XMP.pm +2 -2
- data/bin/lib/Image/ExifTool.pm +94 -33
- 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: daebca4fbc1adcea00bcf7dc637e328f4534a115f69a17f10bca60f8a21dee01
|
4
|
+
data.tar.gz: 512c1da726768d49d97b8262303f8c524b4ea23ccc8c25f1350f93a121813be4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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)
|
13
|
-
- Added read support for InfiRay
|
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
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.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
|
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.
|
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, '-
|
255
|
-
'-efile' => 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, '-
|
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, '-
|
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
|
-
|
1124
|
-
|
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
|
-
|
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 (
|
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
|
-
$
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
$
|
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{$
|
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]]
|
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>).
|
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.
|
4741
|
-
a group name of C<*> (or C<All>) may be used to extract all instances
|
4742
|
-
tag (as if B<-a> was used). Note that arguments containing wildcards
|
4743
|
-
be quoted on the command line of most systems to prevent shell
|
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
|
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
|
5453
|
-
|
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.
|
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 "##" (
|
6128
|
-
|
6129
|
-
|
6130
|
-
|
6131
|
-
to
|
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.
|
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.
|
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{
|
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.
|
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.
|
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
|
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 ($
|
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, $
|
1228
|
-
} else {
|
1229
|
-
$index = $_;
|
1235
|
+
$index = sprintf('0x%.*x', $dig, $index & $mask);
|
1230
1236
|
}
|
1231
|
-
} elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/
|
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);
|