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.
- 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);
|