exiftool_vendored 12.58.0 → 12.60.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 +45 -3
- data/bin/MANIFEST +4 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +1 -0
- data/bin/exiftool +81 -54
- data/bin/lib/Image/ExifTool/CanonRaw.pm +5 -1
- data/bin/lib/Image/ExifTool/DJI.pm +2 -2
- data/bin/lib/Image/ExifTool/Exif.pm +53 -14
- data/bin/lib/Image/ExifTool/FlashPix.pm +27 -9
- data/bin/lib/Image/ExifTool/FujiFilm.pm +6 -3
- data/bin/lib/Image/ExifTool/Geotag.pm +30 -7
- data/bin/lib/Image/ExifTool/LIF.pm +10 -2
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +6 -5
- data/bin/lib/Image/ExifTool/Olympus.pm +87 -7
- data/bin/lib/Image/ExifTool/PNG.pm +10 -2
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +21 -6
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +37 -5
- data/bin/lib/Image/ExifTool/RIFF.pm +32 -11
- data/bin/lib/Image/ExifTool/Ricoh.pm +2 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +9 -3
- data/bin/lib/Image/ExifTool/Sony.pm +2 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +2254 -2246
- data/bin/lib/Image/ExifTool/TagNames.pod +45 -25
- data/bin/lib/Image/ExifTool/WriteExif.pl +13 -13
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +111 -19
- data/bin/lib/Image/ExifTool/XMP.pm +18 -3
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool.pm +109 -17
- data/bin/lib/Image/ExifTool.pod +40 -5
- 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: 348c2538720f815bacaf609de1dbb52e18f720663ea9e2194c92941b5f80d5ec
|
|
4
|
+
data.tar.gz: 124c2564aba8f2fa4af8b2bf16c654b46624031b38bb64e6ed4ed3d6cc2fb596
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b32a41d3586f914940ddfc5f3f947c323006f627ce6c3a050f34111817776e26a4a5e535f56194998ec38aa5ea7f27e350388fbbd517dd366d826324c9dcd9e4
|
|
7
|
+
data.tar.gz: 9b3d5cb69b62ca6bc41293ec56110e0c28e7510561303bc8c3f3eb0ee01500f5c92dd8ff60ace8f53c54c64a28c92cfa84b0fbebe7238cb190872433c62f4103
|
data/bin/Changes
CHANGED
|
@@ -4,9 +4,51 @@ ExifTool Version History
|
|
|
4
4
|
|
|
5
5
|
RSS feed: https://exiftool.org/rss.xml
|
|
6
6
|
|
|
7
|
-
Note: The most recent production release is Version 12.
|
|
7
|
+
Note: The most recent production release is Version 12.60. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Apr. 5, 2023 - Version 12.60 (production release)
|
|
11
|
+
|
|
12
|
+
- Added a new Sony FileFormat value
|
|
13
|
+
- Added Validate warning about duplicate EXIF
|
|
14
|
+
- Added ability to edit JPEG APP1 EXIF segment with incorrect header
|
|
15
|
+
- Decode a few new Sony ARW tags
|
|
16
|
+
- Improved -htmldump of non-EXIF-based maker notes
|
|
17
|
+
- Enhanced -geotag from CSV files support GPSSpeed (with variable units),
|
|
18
|
+
"bearing" for GPSTrack, and GPSDateTime in format "dd.mm.YYYY HH:MM:SS"
|
|
19
|
+
- Enhanced ImageDataMD5 to also support CRW, RAF, X3F and AVIF images
|
|
20
|
+
- Enhanced -efile option to also record updated and created file names
|
|
21
|
+
- Family 8 group names may now also be used in Composite Require/Desire tags
|
|
22
|
+
- Fixed handling of undefined tags in -if conditions to conform with
|
|
23
|
+
documentation and match -p and -tagsFromFile behaviour when -m or -f option
|
|
24
|
+
is used
|
|
25
|
+
- Fixed problem where setting the Geotime value didn't work when using an
|
|
26
|
+
advanced-formatting expression containing a greater-than symbol (>)
|
|
27
|
+
|
|
28
|
+
Mar. 28, 2023 - Version 12.59
|
|
29
|
+
|
|
30
|
+
- COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
|
|
31
|
+
to include all data from the SOS to the EOI (including the SOS marker but
|
|
32
|
+
not the EOI marker)
|
|
33
|
+
- Added new -fileNUM option to load tags from alternate files
|
|
34
|
+
- Added family 8 groups for accessing tags from alternate files
|
|
35
|
+
- Added new XMP-et:OriginalImageMD5 tag for storing ImageDataMD5 value
|
|
36
|
+
- Added verbose ImageDataMD5 message for JPEG files
|
|
37
|
+
- Added a new Nikon LensID (thanks Warren Hatch)
|
|
38
|
+
- Decode a new Olympus tag and improved decoding of another (thanks Herb)
|
|
39
|
+
- Decode a couple of new PanasonicRaw tags
|
|
40
|
+
- Decode image coordinates for a couple more VNT object types
|
|
41
|
+
- Enhanced ImageDataMD5 to also support MRW, CR3, IIQ, PNG, MOV/MP4 and some
|
|
42
|
+
RIFF-based files
|
|
43
|
+
- Improved verbose messages when deleting NikonApp trailer
|
|
44
|
+
- Patched to avoid structure warnings when copying tags from Nikon files
|
|
45
|
+
containing NKSC metadata
|
|
46
|
+
- Fixed %-C filename format code to work properly with the -fileOrder and
|
|
47
|
+
-progress options
|
|
48
|
+
- Fixed potential ValueConv warning when reading LIF files
|
|
49
|
+
- API Changes:
|
|
50
|
+
- Added SetAlternateFile method
|
|
51
|
+
|
|
10
52
|
Mar. 15, 2023 - Version 12.58
|
|
11
53
|
|
|
12
54
|
- Added Extra ImageDataMD5 tag to calculate MD5 of image data only
|
|
@@ -171,6 +213,8 @@ Nov. 8, 2022 - Version 12.50 (production release)
|
|
|
171
213
|
- Fixed inconsistent year and time zone for Kenwood dashcam timed GPS in MP4
|
|
172
214
|
videos
|
|
173
215
|
|
|
216
|
+
History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
|
|
217
|
+
|
|
174
218
|
Oct. 19, 2022 - Version 12.49
|
|
175
219
|
|
|
176
220
|
- Added read support for Windows ICO and CUR files
|
|
@@ -338,8 +382,6 @@ June 1, 2022 - Version 12.42 (production release)
|
|
|
338
382
|
- Patched to allow PDF Encrypt object to be "null"
|
|
339
383
|
- Fixed bug reading ICC_Profile 'meta' tags
|
|
340
384
|
|
|
341
|
-
History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
|
|
342
|
-
|
|
343
385
|
Apr. 7, 2022 - Version 12.41
|
|
344
386
|
|
|
345
387
|
- Added support for "OM SYSTEM" maker notes
|
data/bin/MANIFEST
CHANGED
|
@@ -530,6 +530,9 @@ t/ExifTool_3.out
|
|
|
530
530
|
t/ExifTool_30.out
|
|
531
531
|
t/ExifTool_31.out
|
|
532
532
|
t/ExifTool_32.out
|
|
533
|
+
t/ExifTool_33.out
|
|
534
|
+
t/ExifTool_34.out
|
|
535
|
+
t/ExifTool_35.out
|
|
533
536
|
t/ExifTool_4.out
|
|
534
537
|
t/ExifTool_5.out
|
|
535
538
|
t/ExifTool_6.out
|
|
@@ -903,6 +906,7 @@ t/Writer_56.out
|
|
|
903
906
|
t/Writer_58.out
|
|
904
907
|
t/Writer_59.out
|
|
905
908
|
t/Writer_6.out
|
|
909
|
+
t/Writer_60.out
|
|
906
910
|
t/Writer_7.out
|
|
907
911
|
t/Writer_9.out
|
|
908
912
|
t/XMP.t
|
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.60.tar.gz | tar -xf -
|
|
111
|
+
cd Image-ExifTool-12.60
|
|
112
112
|
./exiftool t/images/ExifTool.jpg
|
|
113
113
|
|
|
114
114
|
Note: These commands extract meta information from one of the test images.
|
|
@@ -210,6 +210,7 @@
|
|
|
210
210
|
3 => 'PreviewImage (1)',
|
|
211
211
|
# (if the MPF has 2 previews, MPImage3 could be the larger one)
|
|
212
212
|
4 => 'MPImage3',
|
|
213
|
+
5 => 'JpgFromRaw2', # in RW2 from newer Panasonic models
|
|
213
214
|
},
|
|
214
215
|
# ValueConv may also be a code reference
|
|
215
216
|
# Inputs: 0) reference to list of values, 1) ExifTool object
|
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.60';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
BEGIN {
|
|
@@ -103,6 +103,7 @@ my @newValues; # list of new tag values to set
|
|
|
103
103
|
my @requestTags; # tags to request (for -p or -if option arguments)
|
|
104
104
|
my @srcFmt; # source file name format strings
|
|
105
105
|
my @tags; # list of tags to extract
|
|
106
|
+
my %altFile; # alternate files to extract information (keyed by lower-case family 8 group)
|
|
106
107
|
my %appended; # list of files appended to
|
|
107
108
|
my %countLink; # count hard and symbolic links made
|
|
108
109
|
my %created; # list of files we created
|
|
@@ -115,6 +116,7 @@ my %outComma; # flag that output text file needs a comma
|
|
|
115
116
|
my %outTrailer; # trailer for output text file
|
|
116
117
|
my %preserveTime; # preserved timestamps for files
|
|
117
118
|
my %printFmt; # the contents of the print format file
|
|
119
|
+
my %seqFileDir; # file sequence number in each directory
|
|
118
120
|
my %setTags; # hash of list references for tags to set from files
|
|
119
121
|
my %setTagsList; # list of other tag lists for multiple -tagsFromFile from the same file
|
|
120
122
|
my %usedFileName; # lookup for file names we already used in TestName feature
|
|
@@ -196,7 +198,7 @@ my $saveCount; # count the number of times we will/did call SaveNewValues()
|
|
|
196
198
|
my $scanWritable; # flag to process only writable file types
|
|
197
199
|
my $sectHeader; # current section header for -p option
|
|
198
200
|
my $sectTrailer; # section trailer for -p option
|
|
199
|
-
my $
|
|
201
|
+
my $seqFileDir; # sequential file number used for %-C
|
|
200
202
|
my $seqFileNum; # sequential file number used for %C
|
|
201
203
|
my $setCharset; # character set setting ('default' if not set and -csv -b used)
|
|
202
204
|
my $showGroup; # number of group to show (may be zero or '')
|
|
@@ -450,6 +452,7 @@ undef %outComma;
|
|
|
450
452
|
undef %outTrailer;
|
|
451
453
|
undef %printFmt;
|
|
452
454
|
undef %preserveTime;
|
|
455
|
+
undef %seqFileDir;
|
|
453
456
|
undef %setTags;
|
|
454
457
|
undef %setTagsList;
|
|
455
458
|
undef %usedFileName;
|
|
@@ -536,7 +539,7 @@ $quiet = 0;
|
|
|
536
539
|
$rtnVal = 0;
|
|
537
540
|
$saveCount = 0;
|
|
538
541
|
$sectTrailer = '';
|
|
539
|
-
$
|
|
542
|
+
$seqFileDir = 0;
|
|
540
543
|
$seqFileNum = 0;
|
|
541
544
|
$tabFormat = 0;
|
|
542
545
|
$vout = \*STDOUT;
|
|
@@ -919,12 +922,14 @@ for (;;) {
|
|
|
919
922
|
$mt->Options(Duplicates => 1);
|
|
920
923
|
next;
|
|
921
924
|
}
|
|
922
|
-
if (/^efile(\d)?(!)?$/i) {
|
|
925
|
+
if (/^efile(\d+)?(!)?$/i) {
|
|
923
926
|
my $arg = shift;
|
|
924
927
|
defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
|
|
925
|
-
$efile[0] = $arg if not $1 or $1 & 0x01
|
|
926
|
-
$efile[1] = $arg if $1 and $1 & 0x02;
|
|
927
|
-
$efile[2] = $arg if $1 and $1 & 0x04;
|
|
928
|
+
$efile[0] = $arg if not $1 or $1 & 0x01;# error
|
|
929
|
+
$efile[1] = $arg if $1 and $1 & 0x02; # unchanged
|
|
930
|
+
$efile[2] = $arg if $1 and $1 & 0x04; # failed -if condition
|
|
931
|
+
$efile[3] = $arg if $1 and $1 & 0x08; # updated
|
|
932
|
+
$efile[4] = $arg if $1 and $1 & 0x016; # created
|
|
928
933
|
unlink $arg if $2;
|
|
929
934
|
next;
|
|
930
935
|
}
|
|
@@ -950,6 +955,10 @@ for (;;) {
|
|
|
950
955
|
$mt->Options(FastScan => (length $1 ? $1 : 1));
|
|
951
956
|
next;
|
|
952
957
|
}
|
|
958
|
+
if (/^(file\d+)$/i) {
|
|
959
|
+
$altFile{lc $1} = shift or Error("Expecting file name for -file option\n"), $badCmd=1, next;
|
|
960
|
+
next;
|
|
961
|
+
}
|
|
953
962
|
if (/^fileorder(\d*)$/i) {
|
|
954
963
|
push @fileOrder, shift if @ARGV;
|
|
955
964
|
my $num = $1 || 0;
|
|
@@ -1330,7 +1339,7 @@ for (;;) {
|
|
|
1330
1339
|
AddSetTagsFile($setTagsFile = '@') if not $setTagsFile and /(<|>)/;
|
|
1331
1340
|
if ($setTagsFile) {
|
|
1332
1341
|
push @{$setTags{$setTagsFile}}, $_;
|
|
1333
|
-
if (
|
|
1342
|
+
if ($1 eq '>') {
|
|
1334
1343
|
$useMWG = 1 if /^(.*>\s*)?mwg:/si;
|
|
1335
1344
|
if (/\b(filename|directory|testname)#?$/i) {
|
|
1336
1345
|
$doSetFileName = 1;
|
|
@@ -1939,7 +1948,7 @@ Exit $rtnValApp; # all done
|
|
|
1939
1948
|
sub GetImageInfo($$)
|
|
1940
1949
|
{
|
|
1941
1950
|
my ($et, $orig) = @_;
|
|
1942
|
-
my (@foundTags, $info, $file, $ind);
|
|
1951
|
+
my (@foundTags, $info, $file, $ind, $g8);
|
|
1943
1952
|
|
|
1944
1953
|
# set window title for this file if necessary
|
|
1945
1954
|
if (defined $windowTitle and $progressCount >= $progressNext) {
|
|
@@ -1982,6 +1991,11 @@ sub GetImageInfo($$)
|
|
|
1982
1991
|
} else {
|
|
1983
1992
|
$file = $orig;
|
|
1984
1993
|
}
|
|
1994
|
+
# set alternate file names
|
|
1995
|
+
foreach $g8 (sort keys %altFile) {
|
|
1996
|
+
my $altName = FilenameSPrintf($altFile{$g8}, $orig);
|
|
1997
|
+
$et->SetAlternateFile($g8, $altName);
|
|
1998
|
+
}
|
|
1985
1999
|
|
|
1986
2000
|
my $pipe = $file;
|
|
1987
2001
|
if ($doUnzip) {
|
|
@@ -2071,6 +2085,7 @@ sub GetImageInfo($$)
|
|
|
2071
2085
|
push @delFiles, $original;
|
|
2072
2086
|
} elsif ($et->Rename($original, $file)) {
|
|
2073
2087
|
$verbose and print $vout "Restored from $original\n";
|
|
2088
|
+
EFile($file, 3);
|
|
2074
2089
|
++$countGoodWr;
|
|
2075
2090
|
} else {
|
|
2076
2091
|
Warn "Error renaming $original\n";
|
|
@@ -2080,6 +2095,8 @@ sub GetImageInfo($$)
|
|
|
2080
2095
|
return;
|
|
2081
2096
|
}
|
|
2082
2097
|
++$seqFileNum; # increment our file counter
|
|
2098
|
+
my ($dir) = Image::ExifTool::SplitFileName($orig);
|
|
2099
|
+
$seqFileDir = $seqFileDir{$dir} = ($seqFileDir{$dir} || 0) + 1;
|
|
2083
2100
|
|
|
2084
2101
|
my $lineCount = 0;
|
|
2085
2102
|
my ($fp, $outfile, $append);
|
|
@@ -3028,6 +3045,7 @@ sub SetImageInfo($$$)
|
|
|
3028
3045
|
$r3 = $et->SetSystemTags($file);
|
|
3029
3046
|
}
|
|
3030
3047
|
if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
|
|
3048
|
+
EFile($infile, 3);
|
|
3031
3049
|
++$countGoodWr;
|
|
3032
3050
|
} elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
|
|
3033
3051
|
EFile($infile);
|
|
@@ -3142,6 +3160,7 @@ sub SetImageInfo($$$)
|
|
|
3142
3160
|
$preserveTime{$file} = [ $aTime, $mTime, $cTime ];
|
|
3143
3161
|
}
|
|
3144
3162
|
}
|
|
3163
|
+
EFile($infile, 3);
|
|
3145
3164
|
++$countGoodWr;
|
|
3146
3165
|
} else {
|
|
3147
3166
|
close(NEW_FILE);
|
|
@@ -3157,6 +3176,7 @@ sub SetImageInfo($$$)
|
|
|
3157
3176
|
# simply rename temporary file to replace original
|
|
3158
3177
|
# (if we didn't already rename it to add "_original")
|
|
3159
3178
|
} elsif ($et->Rename($tmpFile, $dstFile)) {
|
|
3179
|
+
EFile($infile, 3);
|
|
3160
3180
|
++$countGoodWr;
|
|
3161
3181
|
} else {
|
|
3162
3182
|
my $newFile = $tmpFile;
|
|
@@ -3174,21 +3194,26 @@ sub SetImageInfo($$$)
|
|
|
3174
3194
|
# (don't delete tmp file now because it is all we have left)
|
|
3175
3195
|
++$countBadWr;
|
|
3176
3196
|
} else {
|
|
3197
|
+
EFile($infile, 3);
|
|
3177
3198
|
++$countGoodWr;
|
|
3178
3199
|
}
|
|
3179
3200
|
}
|
|
3180
3201
|
} elsif ($overwriteOrig) {
|
|
3181
3202
|
# erase original file
|
|
3203
|
+
EFile($infile, 3);
|
|
3182
3204
|
$et->Unlink($file) or Warn "Error erasing original $file\n";
|
|
3183
3205
|
++$countGoodWr;
|
|
3184
3206
|
} else {
|
|
3207
|
+
EFile($infile, 4);
|
|
3185
3208
|
++$countGoodCr;
|
|
3186
3209
|
}
|
|
3187
3210
|
} else {
|
|
3188
3211
|
# this file was created from scratch, not edited
|
|
3212
|
+
EFile($infile, 4);
|
|
3189
3213
|
++$countGoodCr;
|
|
3190
3214
|
}
|
|
3191
3215
|
} else {
|
|
3216
|
+
EFile($infile, 3);
|
|
3192
3217
|
++$countGoodWr;
|
|
3193
3218
|
}
|
|
3194
3219
|
} elsif ($success) {
|
|
@@ -3741,8 +3766,6 @@ sub ScanDir($$;$)
|
|
|
3741
3766
|
$utf8Name = 1;
|
|
3742
3767
|
}
|
|
3743
3768
|
return if $ignore{$dir};
|
|
3744
|
-
my $oldBase = $seqFileBase;
|
|
3745
|
-
$seqFileBase = $seqFileNum;
|
|
3746
3769
|
# use Win32::FindFile on Windows if available
|
|
3747
3770
|
# (ReadDir will croak if there is a wildcard, so check for this)
|
|
3748
3771
|
if ($^O eq 'MSWin32' and $dir !~ /[*?]/) {
|
|
@@ -3774,7 +3797,6 @@ sub ScanDir($$;$)
|
|
|
3774
3797
|
# use standard perl library routines to read directory
|
|
3775
3798
|
unless (opendir(DIR_HANDLE, $dir)) {
|
|
3776
3799
|
Warn("Error opening directory $dir\n");
|
|
3777
|
-
$seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
|
|
3778
3800
|
return;
|
|
3779
3801
|
}
|
|
3780
3802
|
@fileList = readdir(DIR_HANDLE);
|
|
@@ -3854,8 +3876,6 @@ sub ScanDir($$;$)
|
|
|
3854
3876
|
}
|
|
3855
3877
|
++$countDir;
|
|
3856
3878
|
$et->Options(CharsetFileName => $enc); # restore original setting
|
|
3857
|
-
# update sequential file base for parent directory
|
|
3858
|
-
$seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
|
|
3859
3879
|
}
|
|
3860
3880
|
|
|
3861
3881
|
#------------------------------------------------------------------------------
|
|
@@ -4151,16 +4171,15 @@ sub NextUnusedFilename($;$)
|
|
|
4151
4171
|
return $fmt unless $fmt =~ /%[-+]?\d*\.?\d*[lun]?[cC]/;
|
|
4152
4172
|
my %sep = ( '-' => '-', '+' => '_' );
|
|
4153
4173
|
my ($copy, $alpha) = (0, 'a');
|
|
4154
|
-
my $seq = $seqFileNum - 1;
|
|
4155
4174
|
for (;;) {
|
|
4156
4175
|
my ($filename, $pos) = ('', 0);
|
|
4157
4176
|
while ($fmt =~ /(%([-+]?)(\d*)(\.?)(\d*)([lun]?)([cC]))/g) {
|
|
4158
4177
|
$filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
|
|
4159
4178
|
$pos = pos($fmt);
|
|
4160
4179
|
my ($sign, $wid, $dec, $wid2, $mod, $tok) = ($2, $3 || 0, $4, $5 || 0, $6, $7);
|
|
4161
|
-
my $
|
|
4180
|
+
my $seq;
|
|
4162
4181
|
if ($tok eq 'C') {
|
|
4163
|
-
$
|
|
4182
|
+
$seq = $wid + ($sign eq '-' ? $seqFileDir : $seqFileNum) - 1;
|
|
4164
4183
|
$wid = $wid2;
|
|
4165
4184
|
} else {
|
|
4166
4185
|
next unless $dec or $copy;
|
|
@@ -4169,13 +4188,13 @@ sub NextUnusedFilename($;$)
|
|
|
4169
4188
|
$filename .= $sep{$sign} if $sign;
|
|
4170
4189
|
}
|
|
4171
4190
|
if ($mod and $mod ne 'n') {
|
|
4172
|
-
my $a = $tok eq 'C' ? Num2Alpha($
|
|
4191
|
+
my $a = $tok eq 'C' ? Num2Alpha($seq) : $alpha;
|
|
4173
4192
|
my $str = ($wid and $wid > length $a) ? 'a' x ($wid - length($a)) : '';
|
|
4174
4193
|
$str .= $a;
|
|
4175
4194
|
$str = uc $str if $mod eq 'u';
|
|
4176
4195
|
$filename .= $str;
|
|
4177
4196
|
} else {
|
|
4178
|
-
my $c = $tok eq 'C' ?
|
|
4197
|
+
my $c = $tok eq 'C' ? $seq : $copy;
|
|
4179
4198
|
my $num = $c + ($mod ? 1 : 0);
|
|
4180
4199
|
$filename .= $wid ? sprintf("%.${wid}d",$num) : $num;
|
|
4181
4200
|
}
|
|
@@ -4431,7 +4450,7 @@ sub ReadStayOpen($)
|
|
|
4431
4450
|
|
|
4432
4451
|
#------------------------------------------------------------------------------
|
|
4433
4452
|
# Add new entry to -efile output file
|
|
4434
|
-
# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed)
|
|
4453
|
+
# Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed, 3=updated, 4=created)
|
|
4435
4454
|
sub EFile($$)
|
|
4436
4455
|
{
|
|
4437
4456
|
my $entry = shift;
|
|
@@ -4746,6 +4765,7 @@ L<Advanced options|/Advanced options>
|
|
|
4746
4765
|
-echo[NUM] TEXT Echo text to stdout or stderr
|
|
4747
4766
|
-efile[NUM][!] ERRFILE Save names of files with errors
|
|
4748
4767
|
-execute[NUM] Execute multiple commands on one line
|
|
4768
|
+
-fileNUM ALTFILE Load tags from alternate file
|
|
4749
4769
|
-list_dir List directories, not their contents
|
|
4750
4770
|
-srcfile FMT Process a different source file
|
|
4751
4771
|
-stay_open FLAG Keep reading -@ argfile even after EOF
|
|
@@ -5018,16 +5038,14 @@ for list-type tags and conditional replacements because each copy operation
|
|
|
5018
5038
|
on a tag overrides any previous operations. While this avoids duplicate
|
|
5019
5039
|
list items when copying groups of tags from a file containing redundant
|
|
5020
5040
|
information, it also prevents values of different tags from being copied
|
|
5021
|
-
into the same list when this is the intent.
|
|
5022
|
-
|
|
5041
|
+
into the same list when this is the intent. To accumulate values
|
|
5042
|
+
from different operations into the same list, add a C<+> after the initial
|
|
5043
|
+
C<-> of the argument. For example:
|
|
5023
5044
|
|
|
5024
|
-
exiftool -
|
|
5045
|
+
exiftool -tagsfromfile @ '-subject<make' '-+subject<model' ...
|
|
5025
5046
|
|
|
5026
|
-
Similarly,
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
Other than these differences, the B<-tagsFromFile> and B<-addTagsFromFile>
|
|
5030
|
-
options are equivalent.
|
|
5047
|
+
Similarly, C<-+DSTTAG> must be used when conditionally replacing a tag to
|
|
5048
|
+
prevent overriding earlier conditions.
|
|
5031
5049
|
|
|
5032
5050
|
6) The B<-a> option (allow duplicate tags) is always in effect when copying
|
|
5033
5051
|
tags from I<SRCFILE>, but the highest priority tag is always copied last so
|
|
@@ -5294,12 +5312,12 @@ escaped. The inverse conversion is applied when writing tags.
|
|
|
5294
5312
|
|
|
5295
5313
|
=item B<-f> (B<-forcePrint>)
|
|
5296
5314
|
|
|
5297
|
-
Force printing of tags even if
|
|
5298
|
-
|
|
5299
|
-
|
|
5300
|
-
|
|
5301
|
-
MissingTagValue option.
|
|
5302
|
-
B<-listx> output, or to allow tags to be deleted when writing with the
|
|
5315
|
+
Force printing of tags even if they don't exist. This option applies to
|
|
5316
|
+
tags specified on the command line, or with the B<-p>, B<-if> or
|
|
5317
|
+
B<-tagsFromFile> options. When B<-f> is used, the value of any missing tag
|
|
5318
|
+
is set to a dash (C<->) by default, but this may be configured via the API
|
|
5319
|
+
MissingTagValue option. B<-f> is also used to add a 'flags' attribute to
|
|
5320
|
+
the B<-listx> output, or to allow tags to be deleted when writing with the
|
|
5303
5321
|
B<-csv>=I<CSVFILE> feature.
|
|
5304
5322
|
|
|
5305
5323
|
=item B<-g>[I<NUM>][:I<NUM>...] (B<-groupHeadings>)
|
|
@@ -5307,15 +5325,15 @@ B<-csv>=I<CSVFILE> feature.
|
|
|
5307
5325
|
Organize output by tag group. I<NUM> specifies a group family number, and
|
|
5308
5326
|
may be 0 (general location), 1 (specific location), 2 (category), 3
|
|
5309
5327
|
(document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF
|
|
5310
|
-
format)
|
|
5311
|
-
specified. May be combined with other options to add group
|
|
5312
|
-
output. Multiple families may be specified by separating them
|
|
5313
|
-
By default the resulting group name is simplified by removing
|
|
5314
|
-
C<Main:> and collapsing adjacent identical group names, but this
|
|
5315
|
-
avoided by placing a colon before the first family number (eg.
|
|
5316
|
-
Use the B<-listg> option to list group names for a specified
|
|
5317
|
-
API SavePath and SaveFormat options are automatically enabled
|
|
5318
|
-
respective family 5 or 6 group names are requested. See the
|
|
5328
|
+
format), 7 (tag ID) or 8 (file number). B<-g0> is assumed if a family
|
|
5329
|
+
number is not specified. May be combined with other options to add group
|
|
5330
|
+
names to the output. Multiple families may be specified by separating them
|
|
5331
|
+
with colons. By default the resulting group name is simplified by removing
|
|
5332
|
+
any leading C<Main:> and collapsing adjacent identical group names, but this
|
|
5333
|
+
can be avoided by placing a colon before the first family number (eg.
|
|
5334
|
+
B<-g:3:1>). Use the B<-listg> option to list group names for a specified
|
|
5335
|
+
family. The API SavePath and SaveFormat options are automatically enabled
|
|
5336
|
+
if the respective family 5 or 6 group names are requested. See the
|
|
5319
5337
|
L<API GetGroup documentation|Image::ExifTool/GetGroup> for more information.
|
|
5320
5338
|
|
|
5321
5339
|
=item B<-G>[I<NUM>][:I<NUM>...] (B<-groupNames>)
|
|
@@ -5523,7 +5541,7 @@ with this command:
|
|
|
5523
5541
|
|
|
5524
5542
|
produces output like this:
|
|
5525
5543
|
|
|
5526
|
-
-- Generated by ExifTool 12.
|
|
5544
|
+
-- Generated by ExifTool 12.60 --
|
|
5527
5545
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5528
5546
|
(f/5.6, 1/60s, ISO 100)
|
|
5529
5547
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6414,12 +6432,12 @@ I<SHIFT> string. For example:
|
|
|
6414
6432
|
|
|
6415
6433
|
Add features from specified plug-in I<MODULE>. Currently, the MWG module is
|
|
6416
6434
|
the only plug-in module distributed with exiftool. This module adds
|
|
6417
|
-
read/write support for tags as recommended by the Metadata Working Group.
|
|
6418
|
-
|
|
6419
|
-
for any tag
|
|
6420
|
-
documentation|Image::ExifTool::TagNames/MWG Tags> for more
|
|
6421
|
-
that this option is not reversible, and remains in effect
|
|
6422
|
-
application terminates, even across the B<-execute> option.
|
|
6435
|
+
read/write support for tags as recommended by the Metadata Working Group. As
|
|
6436
|
+
a convenience, C<-use MWG> is assumed if the group name prefix starts with
|
|
6437
|
+
C<MWG:> exactly for any requested tag. See the
|
|
6438
|
+
L<MWG Tags documentation|Image::ExifTool::TagNames/MWG Tags> for more
|
|
6439
|
+
details. Note that this option is not reversible, and remains in effect
|
|
6440
|
+
until the application terminates, even across the B<-execute> option.
|
|
6423
6441
|
|
|
6424
6442
|
=back
|
|
6425
6443
|
|
|
@@ -6505,10 +6523,11 @@ exit status of the command (see L</EXIT STATUS>).
|
|
|
6505
6523
|
|
|
6506
6524
|
Save the names of files giving errors (I<NUM> missing or 1), files that were
|
|
6507
6525
|
unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
|
|
6508
|
-
|
|
6509
|
-
|
|
6510
|
-
|
|
6511
|
-
I<ERRFILE>
|
|
6526
|
+
files that were updated (I<NUM> is 8), files that were created (I<NUM> is
|
|
6527
|
+
16), or any combination thereof by summing I<NUM> (eg. B<-efile3> is the
|
|
6528
|
+
same has having both B<-efile> and B<-efile2> options with the same
|
|
6529
|
+
I<ERRFILE>). By default, file names are appended to any existing I<ERRFILE>,
|
|
6530
|
+
but I<ERRFILE> is overwritten if an exclamation point is added to the option
|
|
6512
6531
|
(eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
|
|
6513
6532
|
option if applicable.
|
|
6514
6533
|
|
|
@@ -6523,6 +6542,14 @@ line. I<NUM> is an optional number that is echoed in the "{ready}" message
|
|
|
6523
6542
|
when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
|
|
6524
6543
|
option no longer suppresses the output "{readyNUM}" message.
|
|
6525
6544
|
|
|
6545
|
+
=item B<-file>I<NUM> I<ALTFILE>
|
|
6546
|
+
|
|
6547
|
+
Read tags from an alternate source file. These tags are accessed via the
|
|
6548
|
+
family 8 group name (eg. C<File1:TAG> for the B<-file1> option, C<File2:TAG>
|
|
6549
|
+
for B<-file2>, etc). I<ALTFILE> may contain filename formatting codes %d,
|
|
6550
|
+
%f and %e. Among other things, this allows tags from different files to be
|
|
6551
|
+
compared and combined using the B<-if> and B<-p> options.
|
|
6552
|
+
|
|
6526
6553
|
=item B<-list_dir>
|
|
6527
6554
|
|
|
6528
6555
|
List directories themselves instead of their contents. This option
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
21
21
|
use Image::ExifTool::Exif;
|
|
22
22
|
use Image::ExifTool::Canon;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.60';
|
|
25
25
|
|
|
26
26
|
sub WriteCRW($$);
|
|
27
27
|
sub ProcessCanonRaw($$$);
|
|
@@ -698,6 +698,10 @@ sub ProcessCanonRaw($$$)
|
|
|
698
698
|
$format ne 'string' and not $subdir;
|
|
699
699
|
} else {
|
|
700
700
|
$valueDataPos = $ptr;
|
|
701
|
+
# do MD5 of image data if requested
|
|
702
|
+
if ($$et{ImageDataMD5} and $tagID == 0x2005) {
|
|
703
|
+
$raf->Seek($ptr, 0) and $et->ImageDataMD5($raf, $size, 'raw');
|
|
704
|
+
}
|
|
701
705
|
if ($size <= 512 or ($verbose > 2 and $size <= 65536)
|
|
702
706
|
or ($tagInfo and ($$tagInfo{SubDirectory}
|
|
703
707
|
or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) )))
|
|
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
|
|
|
16
16
|
use Image::ExifTool::XMP;
|
|
17
17
|
use Image::ExifTool::GPS;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.08';
|
|
20
20
|
|
|
21
21
|
sub ProcessDJIInfo($$$);
|
|
22
22
|
|
|
@@ -104,7 +104,7 @@ my %convFloat2 = (
|
|
|
104
104
|
0x00 => { Name => 'AmbientTemperature', Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' }, # (NC)
|
|
105
105
|
0x04 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
|
|
106
106
|
0x08 => { Name => 'Emissivity', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
|
|
107
|
-
0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g
|
|
107
|
+
0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %%",$val*100)' },
|
|
108
108
|
0x10 => { Name => 'ReflectedTemperature',Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' },
|
|
109
109
|
0x65 => { Name => 'IDString', Format => 'string[16]' }, # (NC)
|
|
110
110
|
);
|