exiftool_vendored 12.34.0 → 12.38.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +61 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +65 -37
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -2
- data/bin/lib/Image/ExifTool/Canon.pm +143 -9
- data/bin/lib/Image/ExifTool/CanonCustom.pm +12 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +2 -2
- data/bin/lib/Image/ExifTool/Exif.pm +13 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +33 -8
- data/bin/lib/Image/ExifTool/GIF.pm +5 -1
- data/bin/lib/Image/ExifTool/GPS.pm +14 -10
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -3
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +108 -11
- data/bin/lib/Image/ExifTool/Nikon.pm +1203 -96
- data/bin/lib/Image/ExifTool/NikonCustom.pm +5 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +135 -71
- data/bin/lib/Image/ExifTool/OpenEXR.pm +4 -2
- data/bin/lib/Image/ExifTool/PNG.pm +1 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +14 -2
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +26 -1
- data/bin/lib/Image/ExifTool/Sony.pm +3 -1
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +9 -4
- data/bin/lib/Image/ExifTool/TagLookup.pm +6363 -5846
- data/bin/lib/Image/ExifTool/TagNames.pod +1215 -39
- data/bin/lib/Image/ExifTool/WriteXMP.pl +10 -11
- data/bin/lib/Image/ExifTool/Writer.pl +10 -5
- data/bin/lib/Image/ExifTool/XMP.pm +110 -24
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
- data/bin/lib/Image/ExifTool.pm +51 -12
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -1418,9 +1418,15 @@ sub WriteXMP($$;$)
|
|
1418
1418
|
unless ($uri) {
|
1419
1419
|
$uri = $nsURI{$1}; # we must have added a namespace
|
1420
1420
|
unless ($uri) {
|
1421
|
-
# (namespace may be empty if trying to write empty XMP structure, forum12384)
|
1422
|
-
|
1423
|
-
|
1421
|
+
# (namespace prefix may be empty if trying to write empty XMP structure, forum12384)
|
1422
|
+
if (length $1) {
|
1423
|
+
my $err = "Undefined XMP namespace: $1";
|
1424
|
+
if (not $xmpErr or $err ne $xmpErr) {
|
1425
|
+
$xmpFile ? $et->Error($err) : $et->Warn($err);
|
1426
|
+
$xmpErr = $err;
|
1427
|
+
}
|
1428
|
+
}
|
1429
|
+
next;
|
1424
1430
|
}
|
1425
1431
|
}
|
1426
1432
|
$nsNew{$1} = $uri;
|
@@ -1586,14 +1592,7 @@ sub WriteXMP($$;$)
|
|
1586
1592
|
unless (%capture or $xmpFile or $$dirInfo{InPlace} or $$dirInfo{NoDelete}) {
|
1587
1593
|
$long[-2] = '';
|
1588
1594
|
}
|
1589
|
-
if
|
1590
|
-
if ($xmpFile) {
|
1591
|
-
$et->Error($xmpErr);
|
1592
|
-
return -1;
|
1593
|
-
}
|
1594
|
-
$et->Warn($xmpErr);
|
1595
|
-
return undef;
|
1596
|
-
}
|
1595
|
+
return($xmpFile ? -1 : undef) if $xmpErr;
|
1597
1596
|
$$et{CHANGED} += $changed;
|
1598
1597
|
$debug > 1 and $long[-2] and print $long[-2],"\n";
|
1599
1598
|
return $long[-2] unless $xmpFile;
|
@@ -154,7 +154,7 @@ my %delMore = (
|
|
154
154
|
);
|
155
155
|
|
156
156
|
# family 0 groups where directories should never be deleted
|
157
|
-
my %permanentDir = ( QuickTime => 1 );
|
157
|
+
my %permanentDir = ( QuickTime => 1, Jpeg2000 => 1 );
|
158
158
|
|
159
159
|
# lookup for all valid family 2 groups (lower case)
|
160
160
|
my %family2groups = map { lc $_ => 1 } @delGroup2, 'Unknown';
|
@@ -1400,7 +1400,10 @@ sub SetNewValuesFromFile($$;@)
|
|
1400
1400
|
}
|
1401
1401
|
}
|
1402
1402
|
# validate tag name(s)
|
1403
|
-
$$opts{EXPR} or ValidTagName($tag)
|
1403
|
+
unless ($$opts{EXPR} or ValidTagName($tag)) {
|
1404
|
+
$self->Warn("Invalid tag name '${tag}'. Use '=' not '<' to assign a tag value");
|
1405
|
+
next;
|
1406
|
+
}
|
1404
1407
|
ValidTagName($dstTag) or $self->Warn("Invalid tag name '${dstTag}'"), next;
|
1405
1408
|
# translate '+' and '-' to appropriate SetNewValue option
|
1406
1409
|
if ($opt) {
|
@@ -4775,7 +4778,7 @@ sub InverseDateTime($$;$$)
|
|
4775
4778
|
my ($rtnVal, $tz);
|
4776
4779
|
my $fmt = $$self{OPTIONS}{DateFormat};
|
4777
4780
|
# strip off timezone first if it exists
|
4778
|
-
if (not $fmt and $val =~ s/([
|
4781
|
+
if (not $fmt and $val =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) {
|
4779
4782
|
$tz = sprintf("$1%.2d:$3", $2);
|
4780
4783
|
} elsif (not $fmt and $val =~ s/Z$//i) {
|
4781
4784
|
$tz = 'Z';
|
@@ -4798,6 +4801,8 @@ sub InverseDateTime($$;$$)
|
|
4798
4801
|
$strptimeLib = '';
|
4799
4802
|
}
|
4800
4803
|
}
|
4804
|
+
# handle factional seconds (%f), but only at the end of the string
|
4805
|
+
my $fs = ($fmt =~ s/%f$// and $val =~ s/(\.\d+)\s*$//) ? $1 : '';
|
4801
4806
|
my ($lib, $wrn, @a);
|
4802
4807
|
TryLib: for ($lib=$strptimeLib; ; $lib='') {
|
4803
4808
|
if (not $lib) {
|
@@ -4834,10 +4839,10 @@ TryLib: for ($lib=$strptimeLib; ; $lib='') {
|
|
4834
4839
|
next TryLib;
|
4835
4840
|
}
|
4836
4841
|
} elsif (length($a[$i]) < 2) {
|
4837
|
-
|
4842
|
+
$a[$i] = "0$a[$i]"; # pad to 2 digits if necessary
|
4838
4843
|
}
|
4839
4844
|
}
|
4840
|
-
$val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]);
|
4845
|
+
$val = join(':', @a[5,4,3]) . ' ' . join(':', @a[2,1,0]) . $fs;
|
4841
4846
|
last;
|
4842
4847
|
}
|
4843
4848
|
}
|
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
|
|
50
50
|
use Image::ExifTool::GPS;
|
51
51
|
require Exporter;
|
52
52
|
|
53
|
-
$VERSION = '3.
|
53
|
+
$VERSION = '3.50';
|
54
54
|
@ISA = qw(Exporter);
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
56
56
|
|
@@ -436,9 +436,38 @@ my %sOECF = (
|
|
436
436
|
Names => { List => 'Seq' },
|
437
437
|
Values => { List => 'Seq', Writable => 'rational' },
|
438
438
|
);
|
439
|
-
|
439
|
+
my %sAreaModels = (
|
440
|
+
STRUCT_NAME => 'AreaModels',
|
441
|
+
NAMESPACE => 'crs',
|
442
|
+
ColorRangeMaskAreaSampleInfo => { FlatName => 'ColorSampleInfo' },
|
443
|
+
AreaComponents => { FlatName => 'Components', List => 'Seq' },
|
444
|
+
);
|
445
|
+
my %sCorrRangeMask = (
|
446
|
+
STRUCT_NAME => 'CorrRangeMask',
|
447
|
+
NAMESPACE => 'crs',
|
448
|
+
NOTES => 'Called CorrectionRangeMask by the spec.',
|
449
|
+
Version => { },
|
450
|
+
Type => { },
|
451
|
+
ColorAmount => { Writable => 'real' },
|
452
|
+
LumMin => { Writable => 'real' },
|
453
|
+
LumMax => { Writable => 'real' },
|
454
|
+
LumFeather => { Writable => 'real' },
|
455
|
+
DepthMin => { Writable => 'real' },
|
456
|
+
DepthMax => { Writable => 'real' },
|
457
|
+
DepthFeather=> { Writable => 'real' },
|
458
|
+
# new in LR 11.0
|
459
|
+
Invert => { Writable => 'boolean' },
|
460
|
+
SampleType => { Writable => 'integer' },
|
461
|
+
AreaModels => {
|
462
|
+
List => 'Seq',
|
463
|
+
Struct => \%sAreaModels,
|
464
|
+
},
|
465
|
+
LumRange => { },
|
466
|
+
LuminanceDepthSampleInfo => { },
|
467
|
+
);
|
440
468
|
# new LR2 crs structures (PH)
|
441
|
-
my %sCorrectionMask
|
469
|
+
my %sCorrectionMask;
|
470
|
+
%sCorrectionMask = (
|
442
471
|
STRUCT_NAME => 'CorrectionMask',
|
443
472
|
NAMESPACE => 'crs',
|
444
473
|
# disable List behaviour of flattened Gradient/PaintBasedCorrections
|
@@ -473,19 +502,26 @@ my %sCorrectionMask = (
|
|
473
502
|
Alpha => { Writable => 'real', List => 0 },
|
474
503
|
CenterValue => { Writable => 'real', List => 0 },
|
475
504
|
PerimeterValue=>{ Writable => 'real', List => 0 },
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
505
|
+
# new in LR 11.0 MaskGroupBasedCorrections
|
506
|
+
MaskActive => { Writable => 'boolean', List => 0 },
|
507
|
+
MaskName => { List => 0 },
|
508
|
+
MaskBlendMode=> { Writable => 'integer', List => 0 },
|
509
|
+
MaskInverted => { Writable => 'boolean', List => 0 },
|
510
|
+
MaskSyncID => { List => 0 },
|
511
|
+
MaskVersion => { List => 0 },
|
512
|
+
MaskSubType => { List => 0 },
|
513
|
+
ReferencePoint => { List => 0 },
|
514
|
+
InputDigest => { List => 0 },
|
515
|
+
MaskDigest => { List => 0 },
|
516
|
+
WholeImageArea => { List => 0 },
|
517
|
+
Origin => { List => 0 },
|
518
|
+
Masks => { Struct => \%sCorrectionMask, NoSubStruct => 1 },
|
519
|
+
CorrectionRangeMask => {
|
520
|
+
Name => 'CorrRangeMask',
|
521
|
+
Notes => 'called CorrectionRangeMask by the spec',
|
522
|
+
FlatName => 'Range',
|
523
|
+
Struct => \%sCorrRangeMask,
|
524
|
+
},
|
489
525
|
);
|
490
526
|
my %sCorrection = (
|
491
527
|
STRUCT_NAME => 'Correction',
|
@@ -499,8 +535,8 @@ my %sCorrection = (
|
|
499
535
|
LocalClarity => { FlatName => 'Clarity', Writable => 'real', List => 0 },
|
500
536
|
LocalSharpness => { FlatName => 'Sharpness', Writable => 'real', List => 0 },
|
501
537
|
LocalBrightness => { FlatName => 'Brightness', Writable => 'real', List => 0 },
|
502
|
-
LocalToningHue => { FlatName => '
|
503
|
-
LocalToningSaturation => { FlatName => '
|
538
|
+
LocalToningHue => { FlatName => 'ToningHue', Writable => 'real', List => 0 },
|
539
|
+
LocalToningSaturation => { FlatName => 'ToningSaturation', Writable => 'real', List => 0 },
|
504
540
|
LocalExposure2012 => { FlatName => 'Exposure2012', Writable => 'real', List => 0 },
|
505
541
|
LocalContrast2012 => { FlatName => 'Contrast2012', Writable => 'real', List => 0 },
|
506
542
|
LocalHighlights2012 => { FlatName => 'Highlights2012', Writable => 'real', List => 0 },
|
@@ -516,15 +552,20 @@ my %sCorrection = (
|
|
516
552
|
LocalBlacks2012 => { FlatName => 'Blacks2012', Writable => 'real', List => 0 },
|
517
553
|
LocalDehaze => { FlatName => 'Dehaze', Writable => 'real', List => 0 },
|
518
554
|
LocalTexture => { FlatName => 'Texture', Writable => 'real', List => 0 },
|
555
|
+
# new in LR 11.0
|
519
556
|
CorrectionRangeMask => {
|
557
|
+
Name => 'CorrRangeMask',
|
558
|
+
Notes => 'called CorrectionRangeMask by the spec',
|
520
559
|
FlatName => 'RangeMask',
|
521
|
-
Struct => \%
|
560
|
+
Struct => \%sCorrRangeMask,
|
522
561
|
},
|
523
562
|
CorrectionMasks => {
|
524
563
|
FlatName => 'Mask',
|
525
564
|
Struct => \%sCorrectionMask,
|
526
565
|
List => 'Seq',
|
527
566
|
},
|
567
|
+
CorrectionName => { },
|
568
|
+
CorrectionSyncID => { },
|
528
569
|
);
|
529
570
|
my %sRetouchArea = (
|
530
571
|
STRUCT_NAME => 'RetouchArea',
|
@@ -543,6 +584,30 @@ my %sRetouchArea = (
|
|
543
584
|
List => 'Seq',
|
544
585
|
},
|
545
586
|
);
|
587
|
+
my %sMapInfo = (
|
588
|
+
STRUCT_NAME => 'MapInfo',
|
589
|
+
NAMESPACE => 'crs',
|
590
|
+
NOTES => q{
|
591
|
+
Called RangeMaskMapInfo by the specification, the same as the containing
|
592
|
+
structure.
|
593
|
+
},
|
594
|
+
RGBMin => { },
|
595
|
+
RGBMax => { },
|
596
|
+
LabMin => { },
|
597
|
+
LabMax => { },
|
598
|
+
LumEq => { List => 'Seq' },
|
599
|
+
);
|
600
|
+
my %sRangeMask = (
|
601
|
+
STRUCT_NAME => 'RangeMask',
|
602
|
+
NAMESPACE => 'crs',
|
603
|
+
NOTES => q{
|
604
|
+
This structure is actually called RangeMaskMapInfo, but it only contains one
|
605
|
+
element which is a RangeMaskMapInfo structure (Yes, really!). So these are
|
606
|
+
renamed to RangeMask and MapInfo respectively to avoid confusion and
|
607
|
+
redundancy in the tag names.
|
608
|
+
},
|
609
|
+
RangeMaskMapInfo => { FlatName => 'MapInfo', Struct => \%sMapInfo },
|
610
|
+
);
|
546
611
|
|
547
612
|
# main XMP tag table (tag ID's are used for the family 1 group names)
|
548
613
|
%Image::ExifTool::XMP::Main = (
|
@@ -1581,6 +1646,14 @@ my %sPantryItem = (
|
|
1581
1646
|
AutoToneDigestNoSat => { },
|
1582
1647
|
ToggleStyleDigest => { },
|
1583
1648
|
ToggleStyleAmount => { Writable => 'integer' },
|
1649
|
+
# new for LightRoom 11.0
|
1650
|
+
CompatibleVersion => { },
|
1651
|
+
MaskGroupBasedCorrections => {
|
1652
|
+
FlatName => 'MaskGroupBasedCorr',
|
1653
|
+
Struct => \%sCorrection,
|
1654
|
+
List => 'Seq',
|
1655
|
+
},
|
1656
|
+
RangeMaskMapInfo => { Name => 'RangeMask', Struct => \%sRangeMask, FlatName => 'RangeMask' },
|
1584
1657
|
);
|
1585
1658
|
|
1586
1659
|
# Tiff namespace properties (tiff)
|
@@ -1672,7 +1745,7 @@ my %sPantryItem = (
|
|
1672
1745
|
Software => { },
|
1673
1746
|
Artist => { Groups => { 2 => 'Author' } },
|
1674
1747
|
Copyright => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' },
|
1675
|
-
NativeDigest => { }, #PH
|
1748
|
+
NativeDigest => { Avoid => 1 }, #PH
|
1676
1749
|
);
|
1677
1750
|
|
1678
1751
|
# Exif namespace properties (exif)
|
@@ -2061,8 +2134,8 @@ my %sPantryItem = (
|
|
2061
2134
|
Groups => { 2 => 'Location' },
|
2062
2135
|
Writable => 'integer',
|
2063
2136
|
PrintConv => {
|
2064
|
-
2 => '2-Dimensional',
|
2065
|
-
3 => '3-Dimensional',
|
2137
|
+
2 => '2-Dimensional Measurement',
|
2138
|
+
3 => '3-Dimensional Measurement',
|
2066
2139
|
},
|
2067
2140
|
},
|
2068
2141
|
GPSDOP => { Groups => { 2 => 'Location' }, Writable => 'rational' },
|
@@ -2307,6 +2380,7 @@ my %sPantryItem = (
|
|
2307
2380
|
VignetteCorrectionAlreadyApplied => { Writable => 'boolean' },
|
2308
2381
|
LateralChromaticAberrationCorrectionAlreadyApplied => { Writable => 'boolean' },
|
2309
2382
|
LensDistortInfo => { }, # (LR 7.5.1, 4 signed rational values)
|
2383
|
+
NeutralDensityFactor => { }, # (LR 11.0 - rational value, but denominator seems significant)
|
2310
2384
|
);
|
2311
2385
|
|
2312
2386
|
# IPTC Core namespace properties (Iptc4xmpCore) (ref 4)
|
@@ -2363,6 +2437,7 @@ my %sPantryItem = (
|
|
2363
2437
|
NOTES => 'Adobe Lightroom "lr" namespace tags.',
|
2364
2438
|
privateRTKInfo => { },
|
2365
2439
|
hierarchicalSubject => { List => 'Bag' },
|
2440
|
+
weightedFlatSubject => { List => 'Bag' },
|
2366
2441
|
);
|
2367
2442
|
|
2368
2443
|
# Adobe Album namespace properties (album) (ref PH)
|
@@ -3505,6 +3580,17 @@ sub ParseXMPElement($$$;$$$$)
|
|
3505
3580
|
}
|
3506
3581
|
$start = pos($$dataPt); # start from here the next time around
|
3507
3582
|
|
3583
|
+
# ignore specified XMP namespaces/properties
|
3584
|
+
if ($$et{EXCL_XMP_LOOKUP} and not $isWriting and $prop =~ /^(.+):(.*)/) {
|
3585
|
+
my ($ns, $nm) = (lc($stdXlatNS{$1} || $1), lc($2));
|
3586
|
+
if ($$et{EXCL_XMP_LOOKUP}{"xmp-$ns:all"} or $$et{EXCL_XMP_LOOKUP}{"xmp-$ns:$nm"} or
|
3587
|
+
$$et{EXCL_XMP_LOOKUP}{"xmp-all:$nm"})
|
3588
|
+
{
|
3589
|
+
++$count; # (pretend we found something so we don't store as a tag value)
|
3590
|
+
next;
|
3591
|
+
}
|
3592
|
+
}
|
3593
|
+
|
3508
3594
|
# extract property attributes
|
3509
3595
|
my ($parseResource, %attrs, @attrs);
|
3510
3596
|
while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) {
|
@@ -3602,9 +3688,9 @@ sub ParseXMPElement($$$;$$$$)
|
|
3602
3688
|
if ($nItems == 1000) {
|
3603
3689
|
my ($tg,$ns) = GetXMPTagID($propList);
|
3604
3690
|
if ($isWriting) {
|
3605
|
-
$et->
|
3691
|
+
$et->WarnOnce("Excessive number of items for $ns:$tg. Processing may be slow", 1);
|
3606
3692
|
} elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
|
3607
|
-
$et->
|
3693
|
+
$et->WarnOnce("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
|
3608
3694
|
last;
|
3609
3695
|
}
|
3610
3696
|
}
|
@@ -537,7 +537,7 @@ my %sImageRegion = ( # new in 1.5
|
|
537
537
|
NAMESPACE => 'Iptc4xmpExt',
|
538
538
|
TABLE_DESC => 'XMP IPTC Extension',
|
539
539
|
NOTES => q{
|
540
|
-
This table contains tags defined by the IPTC Extension schema version 1.
|
540
|
+
This table contains tags defined by the IPTC Extension schema version 1.6.
|
541
541
|
The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
|
542
542
|
the family 1 group name. (see
|
543
543
|
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -26,10 +26,10 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
26
26
|
$psAPP13hdr $psAPP13old @loadAllTables %UserDefined $evalWarning
|
27
27
|
%noWriteFile %magicNumber @langs $defaultLang %langName %charsetName
|
28
28
|
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
|
29
|
-
%jpegMarker %specialTags %fileTypeLookup $testLen $
|
29
|
+
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
30
30
|
%static_vars);
|
31
31
|
|
32
|
-
$VERSION = '12.
|
32
|
+
$VERSION = '12.38';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
@@ -1211,10 +1211,10 @@ my %systemTagsNotes = (
|
|
1211
1211
|
ZoneIdentifier => {
|
1212
1212
|
Groups => { 1 => 'System', 2 => 'Other' },
|
1213
1213
|
Notes => q{
|
1214
|
-
Windows only.
|
1215
|
-
data stream, which is used by some Windows browsers to mark
|
1216
|
-
as possibly unsafe to run. May be deleted to remove this
|
1217
|
-
Win32API::File
|
1214
|
+
Windows only. Existence indicates that the file has a Zone.Identifier
|
1215
|
+
alternate data stream, which is used by some Windows browsers to mark
|
1216
|
+
downloaded files as possibly unsafe to run. May be deleted to remove this
|
1217
|
+
stream. Requires Win32API::File
|
1218
1218
|
},
|
1219
1219
|
Writable => 1,
|
1220
1220
|
WritePseudo => 1,
|
@@ -4088,8 +4088,9 @@ sub Open($*$;$)
|
|
4088
4088
|
my ($self, $fh, $file, $mode) = @_;
|
4089
4089
|
|
4090
4090
|
$file =~ s/^([\s&])/.\/$1/; # protect leading whitespace or ampersand
|
4091
|
-
# default to read mode ('<') unless input is a pipe
|
4092
|
-
$mode = ($file =~ /\|$/ ? '' : '<') unless $mode;
|
4091
|
+
# default to read mode ('<') unless input is a trusted pipe
|
4092
|
+
$mode = (($file =~ /\|$/ and $$self{TRUST_PIPE}) ? '' : '<') unless $mode;
|
4093
|
+
undef $$self{TRUST_PIPE};
|
4093
4094
|
if ($mode) {
|
4094
4095
|
if ($self->EncodeFileName($file)) {
|
4095
4096
|
# handle Windows Unicode file name
|
@@ -4252,6 +4253,7 @@ sub ParseArguments($;@)
|
|
4252
4253
|
$$self{REQ_TAG_LOOKUP} = { };
|
4253
4254
|
$$self{EXCL_TAG_LOOKUP} = { };
|
4254
4255
|
$$self{IO_TAG_LIST} = undef;
|
4256
|
+
delete $$self{EXCL_XMP_LOOKUP};
|
4255
4257
|
|
4256
4258
|
# handle our input arguments
|
4257
4259
|
while (@_) {
|
@@ -4335,7 +4337,11 @@ sub ParseArguments($;@)
|
|
4335
4337
|
# generate lookup for excluded tags
|
4336
4338
|
if ($$options{Exclude}) {
|
4337
4339
|
foreach (@{$$options{Exclude}}) {
|
4338
|
-
/([-\w]+)#?$/ and $$self{EXCL_TAG_LOOKUP}{lc
|
4340
|
+
/([-\w]+)#?$/ and $$self{EXCL_TAG_LOOKUP}{lc $1} = 1;
|
4341
|
+
if (/(xmp-.*:[-\w]+)#?/i) {
|
4342
|
+
$$self{EXCL_XMP_LOOKUP} or $$self{EXCL_XMP_LOOKUP} = { };
|
4343
|
+
$$self{EXCL_XMP_LOOKUP}{lc $1} = 1;
|
4344
|
+
}
|
4339
4345
|
}
|
4340
4346
|
# exclude list is used only for EXCL_TAG_LOOKUP when TAGS_FROM_FILE is set
|
4341
4347
|
undef $$options{Exclude} if $$self{TAGS_FROM_FILE};
|
@@ -5677,6 +5683,38 @@ sub ConvertDateTime($$)
|
|
5677
5683
|
unshift @a, 1 while @a < 3; # add month and day if necessary
|
5678
5684
|
unshift @a, 0 while @a < 6; # add h,m,s if necessary
|
5679
5685
|
$a[4] -= 1; # base month is 1
|
5686
|
+
# parse our %f fractional seconds first (and round up seconds if necessary)
|
5687
|
+
# - if there are multiple %f codes, they all get the same number of digits as the first
|
5688
|
+
if ($fmt =~ /%\.?(\d*)f/) {
|
5689
|
+
my $dig = $1;
|
5690
|
+
my $frac = $date =~ /(\.\d+)/ ? $1 : '';
|
5691
|
+
if (not $frac) {
|
5692
|
+
$frac = '.' . ('0' x $dig) if $dig;
|
5693
|
+
} elsif (length $dig) {
|
5694
|
+
if ($dig+1 > length($frac)) {
|
5695
|
+
$frac .= '0' x ($dig+1-length($frac));
|
5696
|
+
} elsif ($dig+1 < length($frac)) {
|
5697
|
+
$frac = sprintf("%.${dig}f", $frac);
|
5698
|
+
while ($frac =~ s/^(\d)// and $1 ne '0') {
|
5699
|
+
# this is a pain, but we must round up to the next second
|
5700
|
+
++$a[0] < 60 and last;
|
5701
|
+
$a[0] = 0;
|
5702
|
+
++$a[1] < 60 and last;
|
5703
|
+
$a[1] = 0;
|
5704
|
+
++$a[2] < 24 and last;
|
5705
|
+
$a[2] = 0;
|
5706
|
+
require 'Image/ExifTool/Shift.pl';
|
5707
|
+
++$a[3] <= DaysInMonth($a[4]+1, $a[5]) and last;
|
5708
|
+
$a[3] = 1;
|
5709
|
+
++$a[4] < 12 and last;
|
5710
|
+
$a[4] = 0;
|
5711
|
+
++$a[5];
|
5712
|
+
last; # (this was a goto)
|
5713
|
+
}
|
5714
|
+
}
|
5715
|
+
}
|
5716
|
+
$fmt =~ s/(^|[^%])((%%)*)%\.?\d*f/$1$2$frac/g;
|
5717
|
+
}
|
5680
5718
|
# parse %z and %s ourself (to handle time zones properly)
|
5681
5719
|
if ($fmt =~ /%[sz]/) {
|
5682
5720
|
# use system time zone unless otherwise specified
|
@@ -6277,7 +6315,7 @@ sub ProcessJPEG($$)
|
|
6277
6315
|
my $markerName = JpegMarkerName($marker);
|
6278
6316
|
$$path[$pn] = $markerName;
|
6279
6317
|
# issue warning if we skipped some garbage
|
6280
|
-
if ($skipped and not $foundSOS) {
|
6318
|
+
if ($skipped and not $foundSOS and $markerName ne 'SOS') {
|
6281
6319
|
$self->Warn("Skipped unknown $skipped bytes after JPEG $markerName segment", 1);
|
6282
6320
|
if ($htmlDump) {
|
6283
6321
|
$self->HDump($nextSegPos-4-$skipped, $skipped, "[unknown $skipped bytes]", undef, 0x08);
|
@@ -8736,6 +8774,7 @@ sub ProcessBinaryData($$$)
|
|
8736
8774
|
# read value now if necessary
|
8737
8775
|
unless (defined $val and not $$tagInfo{SubDirectory}) {
|
8738
8776
|
$val = ReadValue($dataPt, $entry+$offset, $format, $count, $more, \$rational);
|
8777
|
+
next unless defined $val;
|
8739
8778
|
$mask = $$tagInfo{Mask};
|
8740
8779
|
$val = ($val & $mask) >> $$tagInfo{BitShift} if $mask;
|
8741
8780
|
}
|
@@ -8837,8 +8876,8 @@ until ($Image::ExifTool::noConfig) {
|
|
8837
8876
|
$file = $config;
|
8838
8877
|
}
|
8839
8878
|
# also check executable directory unless path is absolute
|
8840
|
-
$
|
8841
|
-
-r $file or $config =~ /^\// or $file =
|
8879
|
+
$exeDir = ($0 =~ /(.*)[\\\/]/) ? $1 : '.' unless defined $exeDir;
|
8880
|
+
-r $file or $config =~ /^\// or $file = "$exeDir/$config";
|
8842
8881
|
unless (-r $file) {
|
8843
8882
|
warn("Config file not found\n") if defined $Image::ExifTool::configFile;
|
8844
8883
|
last;
|
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.38.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: 2021-
|
12
|
+
date: 2021-12-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|