exiftool_vendored 12.10.0 → 12.11.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.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +17 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +74 -28
- data/bin/lib/Image/ExifTool.pm +8 -7
- data/bin/lib/Image/ExifTool.pod +5 -4
- data/bin/lib/Image/ExifTool/Canon.pm +13 -11
- data/bin/lib/Image/ExifTool/Import.pm +12 -9
- data/bin/lib/Image/ExifTool/MPF.pm +2 -2
- data/bin/lib/Image/ExifTool/Olympus.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +10 -3
- data/bin/lib/Image/ExifTool/Stim.pm +2 -2
- data/bin/lib/Image/ExifTool/TagNames.pod +5 -4
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +4 -3
- data/bin/lib/Image/ExifTool/Writer.pl +2 -0
- 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: b7f2c837f1bff7860cad5011a04c5671d88d4a761c197c2442c73791c5d87b22
|
4
|
+
data.tar.gz: 49b1ea22c9fe6668b08f0b021cbe492cc9b870d931d92a4fe127ba7ada41d757
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a66c9d7b5f2f9f4118ff5c4355fbff604a7173c0b6a90349e2884624a55e1216e77b9e00c958515447d58d5f9d3e612f48e6608aeea8ae6ee3528512c39db1b2
|
7
|
+
data.tar.gz: 6d74f8b745f7c964dad82bca92d98c07b318d4895d12d4f10cfc2e8c212d326abdd02e60afff8af7e936c2b89802277b4ae79b4f3d1da2642f0ffd9e4717d0eb
|
data/bin/Changes
CHANGED
@@ -7,6 +7,23 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 12.00. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to CPAN.)
|
9
9
|
|
10
|
+
Nov. 27, 2020 - Version 12.11
|
11
|
+
|
12
|
+
- Added -csvDelim option
|
13
|
+
- Added new Canon and Olympus LensType values (thanks LibRaw)
|
14
|
+
- Added a warning if ICC_Profile is deleted from an image (github issue #63)
|
15
|
+
- EndDir() function for -if option now works when -fileOrder is used
|
16
|
+
- Changed FileSize conversion to use binary prefixes since that is how the
|
17
|
+
conversion is currently done (eg. MiB instead of MB)
|
18
|
+
- Patched -csv option so columns aren't resorted when using -G option and one
|
19
|
+
of the tags is missing from a file
|
20
|
+
- Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
|
21
|
+
to MP4 videos
|
22
|
+
- Fixed problem where the tags available in a -p format string were limited to
|
23
|
+
the same as the -if[NUM] option when NUM was specified
|
24
|
+
- Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
|
25
|
+
models
|
26
|
+
|
10
27
|
Nov. 12, 2020 - Version 12.10
|
11
28
|
|
12
29
|
- Added -validate test for proper TIFF magic number in JPEG EXIF header
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -106,8 +106,8 @@ your home directory, then you would type the following commands in a
|
|
106
106
|
terminal window to extract and run ExifTool:
|
107
107
|
|
108
108
|
cd ~/Desktop
|
109
|
-
gzip -dc Image-ExifTool-12.
|
110
|
-
cd Image-ExifTool-12.
|
109
|
+
gzip -dc Image-ExifTool-12.11.tar.gz | tar -xf -
|
110
|
+
cd Image-ExifTool-12.11
|
111
111
|
./exiftool t/images/ExifTool.jpg
|
112
112
|
|
113
113
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
use strict;
|
11
11
|
require 5.004;
|
12
12
|
|
13
|
-
my $version = '12.
|
13
|
+
my $version = '12.11';
|
14
14
|
|
15
15
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
16
16
|
my $exeDir;
|
@@ -136,12 +136,13 @@ my $countSameWr; # count files written OK but not changed
|
|
136
136
|
my $critical; # flag for critical operations (disable CTRL-C)
|
137
137
|
my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
|
138
138
|
my $csvAdd; # flag to add CSV information to existing lists
|
139
|
+
my $csvDelim; # delimiter for CSV files
|
139
140
|
my $csvSaveCount; # save counter for last CSV file loaded
|
140
141
|
my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
|
141
142
|
my $disableOutput; # flag to disable normal output
|
142
143
|
my $doSetFileName; # flag set if FileName may be written
|
143
144
|
my $doUnzip; # flag to extract info from .gz and .bz2 files
|
144
|
-
my ($end,$endDir); # flags to end processing
|
145
|
+
my ($end,$endDir,%endDir); # flags to end processing
|
145
146
|
my $escapeC; # C-style escape
|
146
147
|
my $escapeHTML; # flag to escape printed values for html
|
147
148
|
my $evalWarning; # warning from eval
|
@@ -239,6 +240,7 @@ my %optArgs = (
|
|
239
240
|
'-c' => 1, '-coordformat' => 1,
|
240
241
|
'-charset' => 0, # (optional arg; OK because arg cannot begin with "-")
|
241
242
|
'-config' => 1,
|
243
|
+
'-csvdelim' => 1,
|
242
244
|
'-d' => 1, '-dateformat' => 1,
|
243
245
|
'-D' => 0, # necessary to avoid matching lower-case equivalent
|
244
246
|
'-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
|
@@ -246,11 +248,12 @@ my %optArgs = (
|
|
246
248
|
'-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
|
247
249
|
'-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
|
248
250
|
'-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
|
249
|
-
'-fileorder' => 1,
|
251
|
+
'-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
|
252
|
+
'-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
|
250
253
|
'-geotag' => 1,
|
251
254
|
'-globaltimeshift' => 1,
|
252
255
|
'-i' => 1, '-ignore' => 1,
|
253
|
-
'-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1,
|
256
|
+
'-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
|
254
257
|
'-lang' => 0, # (optional arg; cannot begin with "-")
|
255
258
|
'-listitem' => 1,
|
256
259
|
'-o' => 1, '-out' => 1,
|
@@ -429,6 +432,7 @@ undef %countLink;
|
|
429
432
|
undef %created;
|
430
433
|
undef %csvTags;
|
431
434
|
undef %database;
|
435
|
+
undef %endDir;
|
432
436
|
undef %filterExt;
|
433
437
|
undef %ignore;
|
434
438
|
undef %printFmt;
|
@@ -500,6 +504,7 @@ $countGoodCr = 0;
|
|
500
504
|
$countGoodWr = 0;
|
501
505
|
$countNewDir = 0;
|
502
506
|
$countSameWr = 0;
|
507
|
+
$csvDelim = ',';
|
503
508
|
$csvSaveCount = 0;
|
504
509
|
$fileTrailer = '';
|
505
510
|
$filterFlag = 0;
|
@@ -821,7 +826,7 @@ for (;;) {
|
|
821
826
|
next;
|
822
827
|
}
|
823
828
|
/^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
|
824
|
-
if (/^csv(\+?=.*)
|
829
|
+
if (/^csv(\+?=.*)?$/i) {
|
825
830
|
my $csvFile = $1;
|
826
831
|
# must process on 2nd pass so -f and -charset options are available
|
827
832
|
unless ($pass) {
|
@@ -841,7 +846,7 @@ for (;;) {
|
|
841
846
|
if ($mt->Open(\*CSVFILE, $csvFile)) {
|
842
847
|
binmode CSVFILE;
|
843
848
|
require Image::ExifTool::Import;
|
844
|
-
$msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint);
|
849
|
+
$msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
|
845
850
|
close(CSVFILE);
|
846
851
|
} else {
|
847
852
|
$msg = "Error opening CSV file '${csvFile}'";
|
@@ -852,6 +857,11 @@ for (;;) {
|
|
852
857
|
$csv = 'CSV';
|
853
858
|
next;
|
854
859
|
}
|
860
|
+
if (/^csvdelim$/i) {
|
861
|
+
$csvDelim = shift;
|
862
|
+
defined $csvDelim or Error("Expecting argument for -csvDelim option\n"), $badCmd=1;
|
863
|
+
next;
|
864
|
+
}
|
855
865
|
if (/^d$/ or $a eq 'dateformat') {
|
856
866
|
my $fmt = shift;
|
857
867
|
$fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
|
@@ -1982,6 +1992,7 @@ sub GetImageInfo($$)
|
|
1982
1992
|
}
|
1983
1993
|
last unless $result;
|
1984
1994
|
}
|
1995
|
+
undef @foundTags if $fastCondition; # ignore if we didn't get all tags
|
1985
1996
|
}
|
1986
1997
|
unless ($result) {
|
1987
1998
|
$verbose and print $vout "-------- $file (failed condition)$progStr\n";
|
@@ -2235,7 +2246,9 @@ sub GetImageInfo($$)
|
|
2235
2246
|
my $noDups = ($json or ($xml and $outFormat > 0));
|
2236
2247
|
my $printConv = $et->Options('PrintConv');
|
2237
2248
|
my $lastGroup = '';
|
2249
|
+
my $i = -1;
|
2238
2250
|
TAG: foreach $tag (@foundTags) {
|
2251
|
+
++$i; # keep track on index in @foundTags
|
2239
2252
|
my $tagName = GetTagName($tag);
|
2240
2253
|
my ($group, $valList);
|
2241
2254
|
# get the value for this tag
|
@@ -2353,26 +2366,38 @@ TAG: foreach $tag (@foundTags) {
|
|
2353
2366
|
}
|
2354
2367
|
# save information for CSV output
|
2355
2368
|
if ($csv) {
|
2356
|
-
my $
|
2357
|
-
$
|
2369
|
+
my $tn = $tagName;
|
2370
|
+
$tn .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
|
2371
|
+
my $gt = $group ? "$group:$tn" : $tn;
|
2358
2372
|
# (tag-name case may be different if some tags don't exist
|
2359
2373
|
# in a file, so all logic must use lower-case tag names)
|
2360
|
-
my $lcTag = lc $
|
2374
|
+
my $lcTag = lc $gt;
|
2361
2375
|
# override existing entry only if top priority
|
2362
2376
|
next if defined $csvInfo{$lcTag} and $tag =~ /\(/;
|
2363
2377
|
$csvInfo{$lcTag} = $val;
|
2364
2378
|
if (defined $csvTags{$lcTag}) {
|
2365
2379
|
# overwrite with actual extracted tag name
|
2366
2380
|
# (note: can't check "if defined $val" here because -f may be used)
|
2367
|
-
$csvTags{$lcTag} = $
|
2368
|
-
|
2369
|
-
|
2370
|
-
|
2371
|
-
|
2372
|
-
|
2373
|
-
|
2374
|
-
|
2375
|
-
|
2381
|
+
$csvTags{$lcTag} = $gt if defined $$info{$tag};
|
2382
|
+
next;
|
2383
|
+
}
|
2384
|
+
# must check for "Unknown" group (for tags that don't exist)
|
2385
|
+
if ($group and defined $csvTags[$i] and $csvTags[$i] =~ /^(.*):$tn$/i) {
|
2386
|
+
next if $group eq 'Unknown'; # nothing more to do if we don't know tag group
|
2387
|
+
if ($1 eq 'unknown') {
|
2388
|
+
# replace unknown entry in CSV tag lookup and list
|
2389
|
+
delete $csvTags{$csvTags[$i]};
|
2390
|
+
$csvTags{$lcTag} = defined($val) ? $gt : '';
|
2391
|
+
$csvTags[$i] = $lcTag;
|
2392
|
+
next;
|
2393
|
+
}
|
2394
|
+
}
|
2395
|
+
# (don't save unextracted tag name unless -f was used)
|
2396
|
+
$csvTags{$lcTag} = defined($val) ? $gt : '';
|
2397
|
+
if (@csvFiles == 1) {
|
2398
|
+
push @csvTags, $lcTag; # save order of tags for first file
|
2399
|
+
} elsif (@csvTags) {
|
2400
|
+
undef @csvTags;
|
2376
2401
|
}
|
2377
2402
|
next;
|
2378
2403
|
}
|
@@ -3298,7 +3323,7 @@ sub FormatCSV($)
|
|
3298
3323
|
# the -b option is used to encode as Base64. It is unclear whether or not this
|
3299
3324
|
# is valid CSV, but some readers may not like it. (If this becomes a problem,
|
3300
3325
|
# in the future values may need to be truncated at the first NULL character.)
|
3301
|
-
$val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[
|
3326
|
+
$val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/;
|
3302
3327
|
return $val;
|
3303
3328
|
}
|
3304
3329
|
|
@@ -3311,9 +3336,9 @@ sub PrintCSV()
|
|
3311
3336
|
@csvTags or @csvTags = sort keys %csvTags;
|
3312
3337
|
# make a list of tags actually found
|
3313
3338
|
foreach $lcTag (@csvTags) {
|
3314
|
-
push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
|
3339
|
+
push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
|
3315
3340
|
}
|
3316
|
-
print join(
|
3341
|
+
print join($csvDelim, 'SourceFile', @tags), "\n";
|
3317
3342
|
my $empty = defined($forcePrint) ? $forcePrint : '';
|
3318
3343
|
foreach $file (@csvFiles) {
|
3319
3344
|
my @vals = (FormatCSV($file)); # start with full file name
|
@@ -3324,7 +3349,7 @@ sub PrintCSV()
|
|
3324
3349
|
defined $val or push(@vals,$empty), next;
|
3325
3350
|
push @vals, FormatCSV($val);
|
3326
3351
|
}
|
3327
|
-
print join(
|
3352
|
+
print join($csvDelim, @vals), "\n";
|
3328
3353
|
}
|
3329
3354
|
}
|
3330
3355
|
|
@@ -3560,8 +3585,18 @@ sub ProcessFiles($;$)
|
|
3560
3585
|
if ($list) {
|
3561
3586
|
push(@$list, $file);
|
3562
3587
|
} else {
|
3588
|
+
if (%endDir) {
|
3589
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($file);
|
3590
|
+
next if $endDir{$d};
|
3591
|
+
}
|
3563
3592
|
GetImageInfo($et, $file);
|
3564
3593
|
$end and Warn("End called - $file\n");
|
3594
|
+
if ($endDir) {
|
3595
|
+
Warn("EndDir called - $file\n");
|
3596
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($file);
|
3597
|
+
$endDir{$d} = 1;
|
3598
|
+
undef $endDir;
|
3599
|
+
}
|
3565
3600
|
}
|
3566
3601
|
}
|
3567
3602
|
$et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
|
@@ -3691,8 +3726,9 @@ sub ScanDir($$;$)
|
|
3691
3726
|
if ($endDir) {
|
3692
3727
|
$path =~ s(/$)();
|
3693
3728
|
Warn("EndDir called - $path\n");
|
3694
|
-
|
3729
|
+
$endDir{$path} = 1;
|
3695
3730
|
$endThisDir = 1;
|
3731
|
+
undef $endDir;
|
3696
3732
|
}
|
3697
3733
|
}
|
3698
3734
|
}
|
@@ -4486,6 +4522,7 @@ L<Input-output text formatting|/Input-output text formatting>
|
|
4486
4522
|
-c FMT (-coordFormat) Set format for GPS coordinates
|
4487
4523
|
-charset [[TYPE=]CHARSET] Specify encoding for special characters
|
4488
4524
|
-csv[[+]=CSVFILE] Export/import tags in CSV format
|
4525
|
+
-csvDelim STR Set delimiter for CSV file
|
4489
4526
|
-d FMT (-dateFormat) Set format for date/time values
|
4490
4527
|
-D (-decimal) Show tag ID numbers in decimal
|
4491
4528
|
-E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
|
@@ -5005,8 +5042,11 @@ tag names (with optional group names) for each column of the file, and
|
|
5005
5042
|
values must be separated by commas. A special "SourceFile" column specifies
|
5006
5043
|
the files associated with each row of information (and a SourceFile of "*"
|
5007
5044
|
may be used to define default tags to be imported for all files which are
|
5008
|
-
combined with any tags specified for the specific SourceFile processed).
|
5009
|
-
|
5045
|
+
combined with any tags specified for the specific SourceFile processed). The
|
5046
|
+
B<-csvDelim> option may be used to change the input/output field delimiter
|
5047
|
+
if something other than a comma is required.
|
5048
|
+
|
5049
|
+
The following examples demonstrate basic use of the B<-csv> option:
|
5010
5050
|
|
5011
5051
|
# generate CSV file with common tags from all images in a directory
|
5012
5052
|
exiftool -common -csv dir > out.csv
|
@@ -5053,6 +5093,11 @@ option. When processing a large number of files, it is recommended to
|
|
5053
5093
|
either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
|
5054
5094
|
generate a fixed-column CSV file instead of using the B<-csv> option.
|
5055
5095
|
|
5096
|
+
=item B<-csvDelim> I<STR>
|
5097
|
+
|
5098
|
+
Set the delimiter for separating CSV entries for the B<-csv> option.
|
5099
|
+
Default is ','.
|
5100
|
+
|
5056
5101
|
=item B<-d> I<FMT> (B<-dateFormat>)
|
5057
5102
|
|
5058
5103
|
Set the format for date/time tag values. The I<FMT> string may contain
|
@@ -5304,7 +5349,7 @@ with this command:
|
|
5304
5349
|
|
5305
5350
|
produces output like this:
|
5306
5351
|
|
5307
|
-
-- Generated by ExifTool 12.
|
5352
|
+
-- Generated by ExifTool 12.11 --
|
5308
5353
|
File: a.jpg - 2003:10:31 15:44:19
|
5309
5354
|
(f/5.6, 1/60s, ISO 100)
|
5310
5355
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -5712,7 +5757,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
|
|
5712
5757
|
metadata from the file, and returns only pseudo System tags, but still reads
|
5713
5758
|
the file header to obtain an educated guess at FileType. B<-fast4> doesn't
|
5714
5759
|
even read the file header, and returns only System tags and a FileType based
|
5715
|
-
on the file extension.
|
5760
|
+
on the file extension. B<-fast5> also disables generation of the Composite
|
5761
|
+
tags (like B<-e>). Has no effect when writing.
|
5716
5762
|
|
5717
5763
|
Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
|
5718
5764
|
condition, or when ordering files with the B<-fileOrder> option. See the
|
@@ -5780,7 +5826,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
|
|
5780
5826
|
executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
|
5781
5827
|
B<-fast> option documentation for details). Without I<NUM>, only one
|
5782
5828
|
processing pass is done at the level specified by the B<-fast> option. For
|
5783
|
-
example, using B<-
|
5829
|
+
example, using B<-if5> is possible if I<EXPR> uses only pseudo System tags,
|
5784
5830
|
and may significantly speed processing if enough files fail the condition.
|
5785
5831
|
|
5786
5832
|
The expression has access to the current ExifTool object through C<$self>,
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
28
28
|
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
|
30
30
|
|
31
|
-
$VERSION = '12.
|
31
|
+
$VERSION = '12.11';
|
32
32
|
$RELEASE = '';
|
33
33
|
@ISA = qw(Exporter);
|
34
34
|
%EXPORT_TAGS = (
|
@@ -2505,6 +2505,7 @@ sub ExtractInfo($;@)
|
|
2505
2505
|
} else {
|
2506
2506
|
$self->Error('Unknown file type');
|
2507
2507
|
}
|
2508
|
+
$self->BuildCompositeTags() if $fast == 4 and $$options{Composite};
|
2508
2509
|
last; # don't read the file
|
2509
2510
|
}
|
2510
2511
|
if (@fileTypeList) {
|
@@ -5732,12 +5733,12 @@ sub ConvertFileSize($)
|
|
5732
5733
|
{
|
5733
5734
|
my $val = shift;
|
5734
5735
|
$val < 2048 and return "$val bytes";
|
5735
|
-
$val < 10240 and return sprintf('%.1f
|
5736
|
-
$val < 2097152 and return sprintf('%.0f
|
5737
|
-
$val < 10485760 and return sprintf('%.1f
|
5738
|
-
$val < 2147483648 and return sprintf('%.0f
|
5739
|
-
$val < 10737418240 and return sprintf('%.1f
|
5740
|
-
return sprintf('%.0f
|
5736
|
+
$val < 10240 and return sprintf('%.1f KiB', $val / 1024);
|
5737
|
+
$val < 2097152 and return sprintf('%.0f KiB', $val / 1024);
|
5738
|
+
$val < 10485760 and return sprintf('%.1f MiB', $val / 1048576);
|
5739
|
+
$val < 2147483648 and return sprintf('%.0f MiB', $val / 1048576);
|
5740
|
+
$val < 10737418240 and return sprintf('%.1f GiB', $val / 1073741824);
|
5741
|
+
return sprintf('%.0f GiB', $val / 1073741824);
|
5741
5742
|
}
|
5742
5743
|
|
5743
5744
|
#------------------------------------------------------------------------------
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -644,10 +644,11 @@ file types. With a value of 2, ExifTool will also avoid extracting any EXIF
|
|
644
644
|
MakerNote information, and will stop parsing at the IDAT chunk of PNG
|
645
645
|
images. (By the PNG specification, metadata is allowed after IDAT, but
|
646
646
|
ExifTool always writes it before because some utilities will ignore it
|
647
|
-
otherwise.) When set to 3 or
|
648
|
-
generated. For 3, the file header is read to provide an educated guess
|
649
|
-
FileType. For 4, the file is not read at all and FileType is determined
|
650
|
-
based on the file's extension.
|
647
|
+
otherwise.) When set to 3 or higher, only pseudo system tags and FileType
|
648
|
+
are generated. For 3, the file header is read to provide an educated guess
|
649
|
+
at FileType. For 4, the file is not read at all and FileType is determined
|
650
|
+
based on the file's extension. For 5, generation of Composite tags is also
|
651
|
+
disabled (like setting L</Composite> to 0). Default is undef.
|
651
652
|
|
652
653
|
=item Filter
|
653
654
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
88
88
|
sub ProcessExifInfo($$$);
|
89
89
|
sub SwapWords($);
|
90
90
|
|
91
|
-
$VERSION = '4.
|
91
|
+
$VERSION = '4.41';
|
92
92
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
@@ -578,16 +578,17 @@ $VERSION = '4.40';
|
|
578
578
|
61182.7 => 'Canon RF 15-35mm F2.8L IS USM',
|
579
579
|
61182.8 => 'Canon RF 24-240mm F4-6.3 IS USM',
|
580
580
|
61182.9 => 'Canon RF 70-200mm F2.8L IS USM',
|
581
|
-
61182.10 => 'Canon RF
|
582
|
-
61182.11 => 'Canon RF 600mm F11 IS STM
|
583
|
-
61182.12 => 'Canon RF 600mm F11 IS STM +
|
584
|
-
61182.13 => 'Canon RF
|
585
|
-
61182.14 => 'Canon RF 800mm F11 IS STM
|
586
|
-
61182.15 => 'Canon RF 800mm F11 IS STM +
|
587
|
-
61182.16 => 'Canon RF
|
588
|
-
61182.17 => 'Canon RF
|
589
|
-
61182.18 => 'Canon RF 100-500mm F4.5-7.1L IS USM
|
590
|
-
61182.19 => 'Canon RF 100-500mm F4.5-7.1L IS USM +
|
581
|
+
61182.10 => 'Canon RF 85mm F2 MACRO IS STM',
|
582
|
+
61182.11 => 'Canon RF 600mm F11 IS STM',
|
583
|
+
61182.12 => 'Canon RF 600mm F11 IS STM + RF1.4x',
|
584
|
+
61182.13 => 'Canon RF 600mm F11 IS STM + RF2x',
|
585
|
+
61182.14 => 'Canon RF 800mm F11 IS STM',
|
586
|
+
61182.15 => 'Canon RF 800mm F11 IS STM + RF1.4x',
|
587
|
+
61182.16 => 'Canon RF 800mm F11 IS STM + RF2x',
|
588
|
+
61182.17 => 'Canon RF 24-105mm F4-7.1 IS STM',
|
589
|
+
61182.18 => 'Canon RF 100-500mm F4.5-7.1L IS USM',
|
590
|
+
61182.19 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
|
591
|
+
61182.20 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
|
591
592
|
65535 => 'n/a',
|
592
593
|
);
|
593
594
|
|
@@ -6722,6 +6723,7 @@ my %ciMaxFocal = (
|
|
6722
6723
|
264 => 'Canon RF 15-35mm F2.8L IS USM',
|
6723
6724
|
265 => 'Canon RF 24-240mm F4-6.3 IS USM',
|
6724
6725
|
266 => 'Canon RF 70-200mm F2.8L IS USM',
|
6726
|
+
267 => 'Canon RF 85mm F2 MACRO IS STM',
|
6725
6727
|
268 => 'Canon RF 600mm F11 IS STM',
|
6726
6728
|
269 => 'Canon RF 600mm F11 IS STM + RF1.4x',
|
6727
6729
|
270 => 'Canon RF 600mm F11 IS STM + RF2x',
|
@@ -23,14 +23,15 @@ my $charset;
|
|
23
23
|
|
24
24
|
#------------------------------------------------------------------------------
|
25
25
|
# Read CSV file
|
26
|
-
# Inputs: 0) CSV file name, file ref or RAF ref, 1) database hash ref,
|
26
|
+
# Inputs: 0) CSV file name, file ref or RAF ref, 1) database hash ref,
|
27
|
+
# 2) missing tag value, 3) delimiter if other than ','
|
27
28
|
# Returns: undef on success, or error string
|
28
29
|
# Notes: There are various flavours of CSV, but here we assume that only
|
29
30
|
# double quotes are escaped, and they are escaped by doubling them
|
30
|
-
sub ReadCSV(
|
31
|
+
sub ReadCSV($$;$$)
|
31
32
|
{
|
32
33
|
local ($_, $/);
|
33
|
-
my ($file, $database, $missingValue) = @_;
|
34
|
+
my ($file, $database, $missingValue, $delim) = @_;
|
34
35
|
my ($buff, @tags, $found, $err, $raf, $openedFile);
|
35
36
|
|
36
37
|
if (UNIVERSAL::isa($file, 'File::RandomAccess')) {
|
@@ -45,6 +46,7 @@ sub ReadCSV($$;$)
|
|
45
46
|
$openedFile = 1;
|
46
47
|
$raf = new File::RandomAccess(\*CSVFILE);
|
47
48
|
}
|
49
|
+
$delim = ',' unless defined $delim;
|
48
50
|
# set input record separator by first newline found in the file
|
49
51
|
# (safe because first line should contain only tag names)
|
50
52
|
while ($raf->Read($buff, 65536)) {
|
@@ -53,18 +55,18 @@ sub ReadCSV($$;$)
|
|
53
55
|
$raf->Seek(0,0);
|
54
56
|
while ($raf->ReadLine($buff)) {
|
55
57
|
my (@vals, $v, $i, %fileInfo);
|
56
|
-
my @toks = split
|
58
|
+
my @toks = split /\Q$delim/, $buff;
|
57
59
|
while (@toks) {
|
58
60
|
($v = shift @toks) =~ s/^ +//; # remove leading spaces
|
59
61
|
if ($v =~ s/^"//) {
|
60
62
|
# quoted value must end in an odd number of quotes
|
61
63
|
while ($v !~ /("+)\s*$/ or not length($1) & 1) {
|
62
64
|
if (@toks) {
|
63
|
-
$v .=
|
65
|
+
$v .= $delim . shift @toks;
|
64
66
|
} else {
|
65
67
|
# read another line from the file
|
66
68
|
$raf->ReadLine($buff) or last;
|
67
|
-
@toks = split
|
69
|
+
@toks = split /\Q$delim/, $buff;
|
68
70
|
last unless @toks;
|
69
71
|
$v .= shift @toks;
|
70
72
|
}
|
@@ -330,9 +332,10 @@ Read CSV or JSON file into a database hash.
|
|
330
332
|
2) Optional string used to represent an undefined (missing) tag value.
|
331
333
|
(Used for deleting tags.)
|
332
334
|
|
333
|
-
3)
|
334
|
-
|
335
|
-
|
335
|
+
3) For ReadCSV this gives the delimiter for CSV entries, with a default of
|
336
|
+
",". For ReadJSON this is the character set for converting Unicode escape
|
337
|
+
sequences in strings, with a default of "UTF8". See the ExifTool Charset
|
338
|
+
option for a list of valid character sets.
|
336
339
|
|
337
340
|
=item Return Value:
|
338
341
|
|
@@ -28,8 +28,8 @@ sub ProcessMPImageList($$$);
|
|
28
28
|
from this segment is stored as a JPEG trailer. The MPF tags are not
|
29
29
|
writable, however the MPF segment may be deleted as a group (with "MPF:All")
|
30
30
|
but then the JPEG trailer should also be deleted (with "Trailer:All"). See
|
31
|
-
L<http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
|
32
|
-
specification.
|
31
|
+
L<https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
|
32
|
+
for the official specification.
|
33
33
|
},
|
34
34
|
0xb000 => 'MPFVersion',
|
35
35
|
0xb001 => 'NumberOfImages',
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
40
40
|
use Image::ExifTool::Exif;
|
41
41
|
use Image::ExifTool::APP12;
|
42
42
|
|
43
|
-
$VERSION = '2.
|
43
|
+
$VERSION = '2.70';
|
44
44
|
|
45
45
|
sub PrintLensInfo($$$);
|
46
46
|
|
@@ -109,6 +109,7 @@ my %olympusLensTypes = (
|
|
109
109
|
'0 32 00' => 'Olympus Zuiko Digital ED 14-35mm F2.0 SWD', #PH
|
110
110
|
'0 32 10' => 'Olympus M.Zuiko Digital ED 12-200mm F3.5-6.3', #IB
|
111
111
|
'0 33 00' => 'Olympus Zuiko Digital 25mm F2.8', #PH
|
112
|
+
'0 33 10' => 'Olympus M.Zuiko Digital 150-400mm F4.5 TC1.25x IS Pro', #IB
|
112
113
|
'0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
|
113
114
|
'0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB
|
114
115
|
'0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
|
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
|
|
58
58
|
use Image::ExifTool::GPS;
|
59
59
|
use Image::ExifTool::HP;
|
60
60
|
|
61
|
-
$VERSION = '3.
|
61
|
+
$VERSION = '3.35';
|
62
62
|
|
63
63
|
sub CryptShutterCount($$);
|
64
64
|
sub PrintFilter($$$);
|
@@ -2894,13 +2894,20 @@ my %binaryDataAttrs = (
|
|
2894
2894
|
Writable => 'string',
|
2895
2895
|
Notes => 'left blank by some cameras',
|
2896
2896
|
},
|
2897
|
-
0x022a => { #PH (
|
2897
|
+
0x022a => [{ #PH (RICOH models (GR III))
|
2898
|
+
Name => 'FilterInfo',
|
2899
|
+
Condition => '$$self{Make} =~ /^RICOH/',
|
2900
|
+
SubDirectory => {
|
2901
|
+
TagTable => 'Image::ExifTool::Pentax::FilterInfo',
|
2902
|
+
ByteOrder => 'LittleEndian',
|
2903
|
+
},
|
2904
|
+
},{ #PH (K-5)
|
2898
2905
|
Name => 'FilterInfo',
|
2899
2906
|
SubDirectory => {
|
2900
2907
|
TagTable => 'Image::ExifTool::Pentax::FilterInfo',
|
2901
2908
|
ByteOrder => 'BigEndian',
|
2902
2909
|
},
|
2903
|
-
},
|
2910
|
+
}],
|
2904
2911
|
0x022b => { #PH (K-5)
|
2905
2912
|
Name => 'LevelInfo',
|
2906
2913
|
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LevelInfo' },
|
@@ -21,8 +21,8 @@ $VERSION = '1.01';
|
|
21
21
|
NOTES => q{
|
22
22
|
These tags are part of the CIPA Stereo Still Image specification, and are
|
23
23
|
found in the APP3 "Stim" segment of JPEG images. See
|
24
|
-
L<http://www.cipa.jp/std/documents/e/DC-006_E.pdf>
|
25
|
-
official specification.
|
24
|
+
L<https://web.archive.org/web/20190718152459/http://www.cipa.jp/std/documents/e/DC-006_E.pdf>
|
25
|
+
for the official specification.
|
26
26
|
},
|
27
27
|
0 => 'StimVersion',
|
28
28
|
1 => {
|
@@ -15614,6 +15614,7 @@ These tags are used in Pentax/Asahi cameras.
|
|
15614
15614
|
0x0228 FaceSize Pentax FaceSize
|
15615
15615
|
0x0229 SerialNumber string
|
15616
15616
|
0x022a FilterInfo Pentax FilterInfo
|
15617
|
+
Pentax FilterInfo
|
15617
15618
|
0x022b LevelInfo Pentax LevelInfo
|
15618
15619
|
0x022d WBLevels Pentax WBLevels
|
15619
15620
|
0x022e Artist string
|
@@ -19939,8 +19940,8 @@ found in the APP2 "MPF" segment of JPEG images. MPImage data referenced
|
|
19939
19940
|
from this segment is stored as a JPEG trailer. The MPF tags are not
|
19940
19941
|
writable, however the MPF segment may be deleted as a group (with "MPF:All")
|
19941
19942
|
but then the JPEG trailer should also be deleted (with "Trailer:All"). See
|
19942
|
-
L<http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
|
19943
|
-
specification.
|
19943
|
+
L<https://web.archive.org/web/20190713230858/http://www.cipa.jp/std/documents/e/DC-007_E.pdf>
|
19944
|
+
for the official specification.
|
19944
19945
|
|
19945
19946
|
Tag ID Tag Name Writable
|
19946
19947
|
------ -------- --------
|
@@ -19985,8 +19986,8 @@ embedded images.
|
|
19985
19986
|
|
19986
19987
|
These tags are part of the CIPA Stereo Still Image specification, and are
|
19987
19988
|
found in the APP3 "Stim" segment of JPEG images. See
|
19988
|
-
L<http://www.cipa.jp/std/documents/e/DC-006_E.pdf>
|
19989
|
-
official specification.
|
19989
|
+
L<https://web.archive.org/web/20190718152459/http://www.cipa.jp/std/documents/e/DC-006_E.pdf>
|
19990
|
+
for the official specification.
|
19990
19991
|
|
19991
19992
|
Tag ID Tag Name Writable
|
19992
19993
|
------ -------- --------
|
@@ -159,11 +159,12 @@ sub ConvInvISO6709($)
|
|
159
159
|
my @a = split ' ', $val;
|
160
160
|
if (@a == 2 or @a == 3) {
|
161
161
|
# latitude must have 2 digits before the decimal, and longitude 3,
|
162
|
-
# and all values must start with a "+" or "-"
|
163
|
-
|
162
|
+
# and all values must start with a "+" or "-", and Google Photos
|
163
|
+
# requires at least 3 digits after the decimal point
|
164
|
+
my @fmt = ('%s%02d.%s%s','%s%03d.%s%s','%s%d.%s%s');
|
164
165
|
foreach (@a) {
|
165
166
|
return undef unless Image::ExifTool::IsFloat($_);
|
166
|
-
$_ =~ s/^([-+]?)(\d+)/sprintf(shift(@fmt)
|
167
|
+
$_ =~ s/^([-+]?)(\d+)\.?(\d*)/sprintf(shift(@fmt),$1||'+',$2,$3,length($3)<3 ? '0'x(3-length($3)) : '')/e;
|
167
168
|
}
|
168
169
|
return join '', @a, '/';
|
169
170
|
}
|
@@ -4035,6 +4035,7 @@ sub WriteDirectory($$$;$)
|
|
4035
4035
|
if ($dataPt or $$dirInfo{RAF}) {
|
4036
4036
|
++$$self{CHANGED};
|
4037
4037
|
$out and print $out " Deleting $grp1\n";
|
4038
|
+
$self->Warn('ICC_Profile deleted. Image colors may be affected') if $grp1 eq 'ICC_Profile';
|
4038
4039
|
# can no longer validate TIFF_END if deleting an entire IFD
|
4039
4040
|
delete $$self{TIFF_END} if $dirName =~ /IFD/;
|
4040
4041
|
}
|
@@ -5910,6 +5911,7 @@ sub WriteJPEG($$)
|
|
5910
5911
|
# group delete of APP segments
|
5911
5912
|
if ($$delGroup{$dirName}) {
|
5912
5913
|
$verbose and print $out " Deleting $dirName segment\n";
|
5914
|
+
$self->Warn('ICC_Profile deleted. Image colors may be affected') if $dirName eq 'ICC_Profile';
|
5913
5915
|
++$$self{CHANGED};
|
5914
5916
|
next Marker;
|
5915
5917
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 12.
|
4
|
+
version: 12.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-11-
|
12
|
+
date: 2020-11-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|