exiftool-vendored.pl 12.73.0 → 12.78.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.
- package/bin/Changes +94 -6
- package/bin/MANIFEST +4 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +46 -45
- package/bin/config_files/example.config +10 -2
- package/bin/exiftool +143 -94
- package/bin/lib/File/RandomAccess.pm +31 -5
- package/bin/lib/File/RandomAccess.pod +4 -4
- package/bin/lib/Image/ExifTool/7Z.pm +3 -3
- package/bin/lib/Image/ExifTool/AFCP.pm +2 -2
- package/bin/lib/Image/ExifTool/BZZ.pm +2 -2
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -7
- package/bin/lib/Image/ExifTool/Canon.pm +17 -13
- package/bin/lib/Image/ExifTool/CanonVRD.pm +8 -2
- package/bin/lib/Image/ExifTool/DICOM.pm +2 -2
- package/bin/lib/Image/ExifTool/DNG.pm +4 -4
- package/bin/lib/Image/ExifTool/Exif.pm +54 -5
- package/bin/lib/Image/ExifTool/FLIR.pm +2 -2
- package/bin/lib/Image/ExifTool/Fixup.pm +3 -3
- package/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
- package/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
- package/bin/lib/Image/ExifTool/GPS.pm +5 -3
- package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/lib/Image/ExifTool/Geolocation.pm +237 -0
- package/bin/lib/Image/ExifTool/Geotag.pm +4 -4
- package/bin/lib/Image/ExifTool/HtmlDump.pm +7 -4
- package/bin/lib/Image/ExifTool/ID3.pm +2 -2
- package/bin/lib/Image/ExifTool/Import.pm +9 -6
- package/bin/lib/Image/ExifTool/JSON.pm +11 -11
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +51 -12
- package/bin/lib/Image/ExifTool/MIE.pm +3 -3
- package/bin/lib/Image/ExifTool/MWG.pm +1 -0
- package/bin/lib/Image/ExifTool/MacOS.pm +19 -4
- package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- package/bin/lib/Image/ExifTool/Nikon.pm +5 -3
- package/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
- package/bin/lib/Image/ExifTool/Ogg.pm +4 -3
- package/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- package/bin/lib/Image/ExifTool/PDF.pm +59 -9
- package/bin/lib/Image/ExifTool/PLIST.pm +3 -3
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
- package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
- package/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- package/bin/lib/Image/ExifTool/PostScript.pm +2 -2
- package/bin/lib/Image/ExifTool/QuickTime.pm +223 -117
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +260 -242
- package/bin/lib/Image/ExifTool/RSRC.pm +2 -2
- package/bin/lib/Image/ExifTool/Samsung.pm +4 -4
- package/bin/lib/Image/ExifTool/Shift.pl +1 -2
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
- package/bin/lib/Image/ExifTool/Sony.pm +3 -3
- package/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- package/bin/lib/Image/ExifTool/TagLookup.pm +85 -8
- package/bin/lib/Image/ExifTool/TagNames.pod +148 -8
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteExif.pl +26 -23
- package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +15 -2
- package/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
- package/bin/lib/Image/ExifTool/Writer.pl +77 -52
- package/bin/lib/Image/ExifTool/XMP.pm +2 -1
- package/bin/lib/Image/ExifTool/XMP2.pl +9 -0
- package/bin/lib/Image/ExifTool/ZIP.pm +6 -6
- package/bin/lib/Image/ExifTool.pm +204 -63
- package/bin/lib/Image/ExifTool.pod +118 -94
- package/bin/perl-Image-ExifTool.spec +45 -44
- package/bin/pp_build_exe.args +4 -230
- package/package.json +4 -4
|
@@ -26,6 +26,7 @@ sub RemoveNewValuesForGroup($$);
|
|
|
26
26
|
sub GetWriteGroup1($$);
|
|
27
27
|
sub Sanitize($$);
|
|
28
28
|
sub ConvInv($$$$$;$$);
|
|
29
|
+
sub PushValue($$$;$);
|
|
29
30
|
|
|
30
31
|
my $loadedAllTables; # flag indicating we loaded all tables
|
|
31
32
|
my $advFmtSelf; # ExifTool object during evaluation of advanced formatting expr
|
|
@@ -136,12 +137,12 @@ my %rawType = (
|
|
|
136
137
|
# 1) these names must either exist in %dirMap, or be translated in InitWriteDirs())
|
|
137
138
|
# 2) any dependencies must be added to %excludeGroups
|
|
138
139
|
my @delGroups = qw(
|
|
139
|
-
Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 APP12
|
|
141
|
+
APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix FotoStation
|
|
142
|
+
GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC ItemList JFIF
|
|
143
|
+
Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF Nextbase NikonApp
|
|
144
|
+
NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs PrintIM
|
|
145
|
+
QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
|
|
145
146
|
);
|
|
146
147
|
# family 2 group names that we can delete
|
|
147
148
|
my @delGroup2 = qw(
|
|
@@ -226,7 +227,7 @@ my %allFam0 = (
|
|
|
226
227
|
|
|
227
228
|
my @writableMacOSTags = qw(
|
|
228
229
|
FileCreateDate MDItemFinderComment MDItemFSCreationDate MDItemFSLabel MDItemUserTags
|
|
229
|
-
XAttrQuarantine
|
|
230
|
+
XAttrQuarantine XAttrMDItemWhereFroms
|
|
230
231
|
);
|
|
231
232
|
|
|
232
233
|
# min/max values for integer formats
|
|
@@ -1260,7 +1261,7 @@ sub SetNewValuesFromFile($$;@)
|
|
|
1260
1261
|
}
|
|
1261
1262
|
# expand shortcuts
|
|
1262
1263
|
@setTags and ExpandShortcuts(\@setTags);
|
|
1263
|
-
my $srcExifTool =
|
|
1264
|
+
my $srcExifTool = Image::ExifTool->new;
|
|
1264
1265
|
# set flag to indicate we are being called from inside SetNewValuesFromFile()
|
|
1265
1266
|
$$srcExifTool{TAGS_FROM_FILE} = 1;
|
|
1266
1267
|
# synchronize and increment the file sequence number
|
|
@@ -1295,6 +1296,7 @@ sub SetNewValuesFromFile($$;@)
|
|
|
1295
1296
|
FastScan => $$options{FastScan},
|
|
1296
1297
|
Filter => $$options{Filter},
|
|
1297
1298
|
FixBase => $$options{FixBase},
|
|
1299
|
+
Geolocation => $$options{Geolocation},
|
|
1298
1300
|
GlobalTimeShift => $$options{GlobalTimeShift},
|
|
1299
1301
|
HexTagIDs => $$options{HexTagIDs},
|
|
1300
1302
|
IgnoreMinorErrors=>$$options{IgnoreMinorErrors},
|
|
@@ -1582,7 +1584,7 @@ SET: foreach $set (@setList) {
|
|
|
1582
1584
|
my $opts = $$set[3];
|
|
1583
1585
|
# handle expressions
|
|
1584
1586
|
if ($$opts{EXPR}) {
|
|
1585
|
-
my $val = $srcExifTool->InsertTagValues(
|
|
1587
|
+
my $val = $srcExifTool->InsertTagValues($$set[1], \@tags, 'Error');
|
|
1586
1588
|
my $err = $$srcExifTool{VALUE}{Error};
|
|
1587
1589
|
if ($err) {
|
|
1588
1590
|
# pass on any error as a warning unless it is suppressed
|
|
@@ -2180,7 +2182,7 @@ sub SetSystemTags($$)
|
|
|
2180
2182
|
$result = $res if $res == 1 or not $result;
|
|
2181
2183
|
last;
|
|
2182
2184
|
} elsif ($tag ne 'FileCreateDate') {
|
|
2183
|
-
$self->WarnOnce('Can only set MDItem tags on
|
|
2185
|
+
$self->WarnOnce('Can only set MDItem tags on MacOS');
|
|
2184
2186
|
last;
|
|
2185
2187
|
}
|
|
2186
2188
|
}
|
|
@@ -2432,7 +2434,7 @@ sub WriteInfo($$;$$)
|
|
|
2432
2434
|
#
|
|
2433
2435
|
until ($$self{VALUE}{Error}) {
|
|
2434
2436
|
# create random access file object (disable seek test in case of straight copy)
|
|
2435
|
-
$raf or $raf =
|
|
2437
|
+
$raf or $raf = File::RandomAccess->new($inRef, 1);
|
|
2436
2438
|
$raf->BinMode();
|
|
2437
2439
|
if ($numNew == $numPseudo) {
|
|
2438
2440
|
$rtnVal = 1;
|
|
@@ -2703,7 +2705,7 @@ sub GetAllTags(;$)
|
|
|
2703
2705
|
my (%allTags, @groups);
|
|
2704
2706
|
@groups = split ':', $group if $group;
|
|
2705
2707
|
|
|
2706
|
-
my $et =
|
|
2708
|
+
my $et = Image::ExifTool->new;
|
|
2707
2709
|
LoadAllTables(); # first load all our tables
|
|
2708
2710
|
my @tableNames = keys %allTables;
|
|
2709
2711
|
|
|
@@ -2748,7 +2750,7 @@ sub GetWritableTags(;$)
|
|
|
2748
2750
|
my (%writableTags, @groups);
|
|
2749
2751
|
@groups = split ':', $group if $group;
|
|
2750
2752
|
|
|
2751
|
-
my $et =
|
|
2753
|
+
my $et = Image::ExifTool->new;
|
|
2752
2754
|
LoadAllTables();
|
|
2753
2755
|
my @tableNames = keys %allTables;
|
|
2754
2756
|
|
|
@@ -3124,11 +3126,37 @@ Conv: for (;;) {
|
|
|
3124
3126
|
return($val, $err);
|
|
3125
3127
|
}
|
|
3126
3128
|
|
|
3129
|
+
#------------------------------------------------------------------------------
|
|
3130
|
+
# Dereference value and push onto list
|
|
3131
|
+
# Inputs: 0) ExifTool ref, 1) value, 2) list ref, 3) flag to push MissingTagValue for undef value
|
|
3132
|
+
sub PushValue($$$;$)
|
|
3133
|
+
{
|
|
3134
|
+
local $_;
|
|
3135
|
+
my ($self, $val, $list, $missing) = @_;
|
|
3136
|
+
if (ref $val eq 'ARRAY' and ref $$val[0] ne 'HASH') {
|
|
3137
|
+
$self->PushValue($_, $list, $missing) foreach @$val;
|
|
3138
|
+
} elsif (ref $val eq 'SCALAR') {
|
|
3139
|
+
if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
|
|
3140
|
+
push @$list, $$val;
|
|
3141
|
+
} else {
|
|
3142
|
+
push @$list, 'Binary data ' . length($$val) . ' bytes';
|
|
3143
|
+
}
|
|
3144
|
+
} elsif (ref $val eq 'HASH' or ref $val eq 'ARRAY') {
|
|
3145
|
+
require 'Image/ExifTool/XMPStruct.pl';
|
|
3146
|
+
push @$list, Image::ExifTool::XMP::SerializeStruct($self, $val);
|
|
3147
|
+
} elsif (not defined $val) {
|
|
3148
|
+
my $mval = $$self{OPTIONS}{MissingTagValue};
|
|
3149
|
+
push @$list, $mval if $missing and defined $mval;
|
|
3150
|
+
} else {
|
|
3151
|
+
push @$list, $val;
|
|
3152
|
+
}
|
|
3153
|
+
}
|
|
3154
|
+
|
|
3127
3155
|
#------------------------------------------------------------------------------
|
|
3128
3156
|
# Convert tag names to values or variables in a string
|
|
3129
3157
|
# (eg. '${EXIF:ISO}x $$' --> '100x $' without hash ref, or "$info{'EXIF:ISO'}x $" with)
|
|
3130
|
-
# Inputs: 0) ExifTool object ref, 1)
|
|
3131
|
-
# 2)
|
|
3158
|
+
# Inputs: 0) ExifTool object ref, 1) string with embedded tag names,
|
|
3159
|
+
# 2) reference to list of found tags or undef to use FOUND_TAGS, 3) Options:
|
|
3132
3160
|
# undef - set missing tags to ''
|
|
3133
3161
|
# 'Error' - issue minor error on missing tag (and return undef)
|
|
3134
3162
|
# 'Warn' - issue minor warning on missing tag (and return undef)
|
|
@@ -3145,20 +3173,22 @@ Conv: for (;;) {
|
|
|
3145
3173
|
# - advanced feature allows Perl expressions inside braces (eg. '${model;tr/ //d}')
|
|
3146
3174
|
# - an error/warning in an advanced expression ("${TAG;EXPR}") generates an error
|
|
3147
3175
|
# if option set to 'Error', or a warning otherwise
|
|
3148
|
-
sub InsertTagValues(
|
|
3176
|
+
sub InsertTagValues($$;$$$$)
|
|
3149
3177
|
{
|
|
3150
3178
|
local $_;
|
|
3151
|
-
my ($self, $
|
|
3179
|
+
my ($self, $line, $foundTags, $opt, $docGrp, $cache) = @_;
|
|
3152
3180
|
my $rtnStr = '';
|
|
3153
3181
|
my ($docNum, $tag);
|
|
3182
|
+
|
|
3154
3183
|
if ($docGrp) {
|
|
3155
3184
|
$docNum = $docGrp =~ /(\d+)$/ ? $1 : 0;
|
|
3156
3185
|
} else {
|
|
3157
3186
|
undef $cache; # no cache if no document groups
|
|
3158
3187
|
}
|
|
3188
|
+
$foundTags or $foundTags = $$self{FOUND_TAGS} || [];
|
|
3159
3189
|
while ($line =~ s/(.*?)\$(\{\s*)?([-\w]*\w|\$|\/)//s) {
|
|
3160
3190
|
my ($pre, $bra, $var) = ($1, $2, $3);
|
|
3161
|
-
my (@tags, $
|
|
3191
|
+
my (@tags, $tg, $val, @val, $type, $expr, $didExpr, $level, $asList);
|
|
3162
3192
|
# "$$" represents a "$" symbol, and "$/" is a newline
|
|
3163
3193
|
if ($var eq '$' or $var eq '/') {
|
|
3164
3194
|
$line =~ s/^\s*\}// if $bra;
|
|
@@ -3261,15 +3291,24 @@ sub InsertTagValues($$$;$$$)
|
|
|
3261
3291
|
} elsif (defined $$et{OPTIONS}{UserParam}{$lcTag}) {
|
|
3262
3292
|
$val = $$et{OPTIONS}{UserParam}{$lcTag};
|
|
3263
3293
|
} elsif ($tag =~ /(.*):(.+)/) {
|
|
3264
|
-
my $group;
|
|
3294
|
+
my ($group, @matches);
|
|
3265
3295
|
($group, $tag) = ($1, $2);
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3296
|
+
# join values of all matching tags if "All" group is used
|
|
3297
|
+
# (and remove "All" from group prefix)
|
|
3298
|
+
if ($group =~ s/(^|:)(all|\*)(:|$)/$1 and $3/ei) {
|
|
3299
|
+
if (lc $tag eq 'all') {
|
|
3300
|
+
@matches = $group ? $et->GroupMatches($group, $fileTags) : @$fileTags;
|
|
3301
|
+
} else {
|
|
3302
|
+
@matches = grep /^$tag(\s|$)/i, @$fileTags;
|
|
3303
|
+
@matches = $et->GroupMatches($group, \@matches) if $group;
|
|
3304
|
+
}
|
|
3305
|
+
$self->PushValue(scalar $et->GetValue($_, $type), \@val) foreach @matches;
|
|
3306
|
+
} elsif (lc $tag eq 'all') {
|
|
3307
|
+
# return "1" if any tag from the specified group exists
|
|
3308
|
+
$val = $et->GroupMatches($group, $fileTags) ? 1 : 0;
|
|
3270
3309
|
} else {
|
|
3271
3310
|
# find the specified tag
|
|
3272
|
-
|
|
3311
|
+
@matches = grep /^$tag(\s|$)/i, @$fileTags;
|
|
3273
3312
|
@matches = $et->GroupMatches($group, \@matches);
|
|
3274
3313
|
foreach $tg (@matches) {
|
|
3275
3314
|
if (defined $val and $tg =~ / \((\d+)\)$/) {
|
|
@@ -3298,31 +3337,15 @@ sub InsertTagValues($$$;$$$)
|
|
|
3298
3337
|
}
|
|
3299
3338
|
}
|
|
3300
3339
|
$self->Options(ListJoin => $oldListJoin) if $asList;
|
|
3301
|
-
|
|
3302
|
-
push @val, @$val;
|
|
3303
|
-
undef $val;
|
|
3304
|
-
last unless @tags;
|
|
3305
|
-
} elsif (ref $val eq 'SCALAR') {
|
|
3306
|
-
if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
|
|
3307
|
-
$val = $$val;
|
|
3308
|
-
} else {
|
|
3309
|
-
$val = 'Binary data ' . length($$val) . ' bytes';
|
|
3310
|
-
}
|
|
3311
|
-
} elsif (ref $val eq 'HASH') {
|
|
3312
|
-
require 'Image/ExifTool/XMPStruct.pl';
|
|
3313
|
-
$val = Image::ExifTool::XMP::SerializeStruct($self, $val);
|
|
3314
|
-
} elsif (not defined $val) {
|
|
3315
|
-
$val = $$self{OPTIONS}{MissingTagValue} if $asList;
|
|
3316
|
-
}
|
|
3317
|
-
last unless @tags;
|
|
3318
|
-
push @val, $val if defined $val;
|
|
3340
|
+
$self->PushValue($val, \@val, $asList);
|
|
3319
3341
|
undef $val;
|
|
3342
|
+
last unless @tags;
|
|
3320
3343
|
}
|
|
3321
3344
|
if (@val) {
|
|
3322
|
-
|
|
3345
|
+
$self->PushValue($val, \@val) if defined $val;
|
|
3323
3346
|
$val = join $$self{OPTIONS}{ListSep}, @val;
|
|
3324
|
-
}
|
|
3325
|
-
|
|
3347
|
+
} elsif (defined $val) {
|
|
3348
|
+
$self->PushValue($val, \@val); # (so the eval has access to @val if required)
|
|
3326
3349
|
}
|
|
3327
3350
|
# evaluate advanced formatting expression if given (eg. "${TAG;EXPR}")
|
|
3328
3351
|
if (defined $expr and defined $val) {
|
|
@@ -3331,7 +3354,7 @@ sub InsertTagValues($$$;$$$)
|
|
|
3331
3354
|
$advFmtSelf = $self;
|
|
3332
3355
|
if ($asList) {
|
|
3333
3356
|
foreach (@val) {
|
|
3334
|
-
#### eval advanced formatting expression ($_, $self, @val, $advFmtSelf)
|
|
3357
|
+
#### eval advanced formatting expression ($_, $self, @val, $tag, $advFmtSelf)
|
|
3335
3358
|
eval $expr;
|
|
3336
3359
|
$@ and $evalWarning = $@;
|
|
3337
3360
|
}
|
|
@@ -3340,7 +3363,7 @@ sub InsertTagValues($$$;$$$)
|
|
|
3340
3363
|
$val = @val ? join $$self{OPTIONS}{ListSep}, @val : undef;
|
|
3341
3364
|
} else {
|
|
3342
3365
|
$_ = $val;
|
|
3343
|
-
#### eval advanced formatting expression ($_, $self, @val, $advFmtSelf)
|
|
3366
|
+
#### eval advanced formatting expression ($_, $self, @val, $tag, $advFmtSelf)
|
|
3344
3367
|
eval $expr;
|
|
3345
3368
|
$@ and $evalWarning = $@;
|
|
3346
3369
|
$val = ref $_ eq 'ARRAY' ? join($$self{OPTIONS}{ListSep}, @$_): $_;
|
|
@@ -3395,6 +3418,7 @@ sub InsertTagValues($$$;$$$)
|
|
|
3395
3418
|
#------------------------------------------------------------------------------
|
|
3396
3419
|
# Reformat date/time value in $_ based on specified format string
|
|
3397
3420
|
# Inputs: 0) date/time format string
|
|
3421
|
+
# Returns: Reformatted date/time string
|
|
3398
3422
|
sub DateFmt($)
|
|
3399
3423
|
{
|
|
3400
3424
|
my $et = bless { OPTIONS => { DateFormat => shift, StrictDate => 1 } };
|
|
@@ -3406,6 +3430,7 @@ sub DateFmt($)
|
|
|
3406
3430
|
$_ = $et->ConvertDateTime($_);
|
|
3407
3431
|
defined $_ or warn "Error converting date/time\n";
|
|
3408
3432
|
$$advFmtSelf{GLOBAL_TIME_OFFSET} = $$et{GLOBAL_TIME_OFFSET} if $shift;
|
|
3433
|
+
return $_;
|
|
3409
3434
|
}
|
|
3410
3435
|
|
|
3411
3436
|
#------------------------------------------------------------------------------
|
|
@@ -3515,7 +3540,7 @@ sub CreateDirectory($$)
|
|
|
3515
3540
|
}
|
|
3516
3541
|
unless ($k32CreateDir) {
|
|
3517
3542
|
return -1 if defined $k32CreateDir;
|
|
3518
|
-
$k32CreateDir =
|
|
3543
|
+
$k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
|
|
3519
3544
|
unless ($k32CreateDir) {
|
|
3520
3545
|
$self->Warn('Error calling Win32::API::CreateDirectoryW');
|
|
3521
3546
|
$k32CreateDir = 0;
|
|
@@ -6233,7 +6258,7 @@ sub WriteJPEG($$)
|
|
|
6233
6258
|
last unless $$editDirs{CIFF};
|
|
6234
6259
|
my $newData = '';
|
|
6235
6260
|
my %dirInfo = (
|
|
6236
|
-
RAF =>
|
|
6261
|
+
RAF => File::RandomAccess->new($segDataPt),
|
|
6237
6262
|
OutFile => \$newData,
|
|
6238
6263
|
);
|
|
6239
6264
|
require Image::ExifTool::CanonRaw;
|
|
@@ -6952,7 +6977,7 @@ sub SetFileTime($$;$$$$)
|
|
|
6952
6977
|
}
|
|
6953
6978
|
unless ($k32SetFileTime) {
|
|
6954
6979
|
return 0 if defined $k32SetFileTime;
|
|
6955
|
-
$k32SetFileTime =
|
|
6980
|
+
$k32SetFileTime = Win32::API->new('KERNEL32', 'SetFileTime', 'NPPP', 'I');
|
|
6956
6981
|
unless ($k32SetFileTime) {
|
|
6957
6982
|
$self->Warn('Error calling Win32::API::SetFileTime');
|
|
6958
6983
|
$k32SetFileTime = 0;
|
|
@@ -7196,7 +7221,7 @@ sub WriteBinaryData($$$)
|
|
|
7196
7221
|
$$self{HiddenData} = {
|
|
7197
7222
|
Offset => $offset,
|
|
7198
7223
|
Size => $size,
|
|
7199
|
-
Fixup =>
|
|
7224
|
+
Fixup => Image::ExifTool::Fixup->new,
|
|
7200
7225
|
Base => $$dirInfo{Base},
|
|
7201
7226
|
};
|
|
7202
7227
|
next;
|
|
@@ -7205,7 +7230,7 @@ sub WriteBinaryData($$$)
|
|
|
7205
7230
|
next unless $$tagInfo{DataTag} eq 'PreviewImage' and $$self{FILE_TYPE} eq 'JPEG';
|
|
7206
7231
|
my $previewInfo = $$self{PREVIEW_INFO};
|
|
7207
7232
|
$previewInfo or $previewInfo = $$self{PREVIEW_INFO} = {
|
|
7208
|
-
Fixup =>
|
|
7233
|
+
Fixup => Image::ExifTool::Fixup->new,
|
|
7209
7234
|
};
|
|
7210
7235
|
# set flag indicating we are using short pointers
|
|
7211
7236
|
$$previewInfo{IsShort} = 1 unless $format eq 'int32u';
|
|
@@ -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.63';
|
|
54
54
|
@ISA = qw(Exporter);
|
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
|
56
56
|
|
|
@@ -3644,6 +3644,7 @@ NoLoop:
|
|
|
3644
3644
|
IgnoreProp => $$subdir{IgnoreProp}, # (allow XML to ignore specified properties)
|
|
3645
3645
|
IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
|
|
3646
3646
|
NoStruct => 1, # (don't try to build structures since this isn't true XMP)
|
|
3647
|
+
NoBlockSave => 1,# (don't save as a block because we already did this)
|
|
3647
3648
|
);
|
|
3648
3649
|
my $oldOrder = GetByteOrder();
|
|
3649
3650
|
SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
|
|
@@ -2191,6 +2191,15 @@ my %sSubVersion = (
|
|
|
2191
2191
|
GROUPS => { 0 => 'SVG', 2 => 'Unknown' },
|
|
2192
2192
|
LANG_INFO => \&GetLangInfo,
|
|
2193
2193
|
NAMESPACE => undef, # variable namespace
|
|
2194
|
+
'c2pa:manifest' => {
|
|
2195
|
+
Name => 'JUMBF',
|
|
2196
|
+
Groups => { 0 => 'JUMBF' },
|
|
2197
|
+
RawConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
|
2198
|
+
SubDirectory => {
|
|
2199
|
+
TagTable => 'Image::ExifTool::Jpeg2000::Main',
|
|
2200
|
+
ByteOrder => 'BigEndian',
|
|
2201
|
+
},
|
|
2202
|
+
},
|
|
2194
2203
|
);
|
|
2195
2204
|
|
|
2196
2205
|
#------------------------------------------------------------------------------
|
|
@@ -20,7 +20,7 @@ use strict;
|
|
|
20
20
|
use vars qw($VERSION $warnString);
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
|
|
23
|
-
$VERSION = '1.
|
|
23
|
+
$VERSION = '1.31';
|
|
24
24
|
|
|
25
25
|
sub WarnProc($) { $warnString = $_[0]; }
|
|
26
26
|
|
|
@@ -367,7 +367,7 @@ sub ProcessRAR($$)
|
|
|
367
367
|
# read the header and create new RAF object for reading it
|
|
368
368
|
my $header;
|
|
369
369
|
$raf->Read($header, $headSize) == $headSize or last;
|
|
370
|
-
my $rafHdr =
|
|
370
|
+
my $rafHdr = File::RandomAccess->new(\$header);
|
|
371
371
|
my $headType = ReadULEB($rafHdr); # get header type
|
|
372
372
|
|
|
373
373
|
if ($headType == 4) { # encryption block
|
|
@@ -550,14 +550,14 @@ sub ProcessZIP($$)
|
|
|
550
550
|
} elsif (eval { require IO::String }) {
|
|
551
551
|
# read the whole file into memory (what else can I do?)
|
|
552
552
|
$raf->Slurp();
|
|
553
|
-
$fh =
|
|
553
|
+
$fh = IO::String->new(${$raf->{BUFF_PT}});
|
|
554
554
|
} else {
|
|
555
555
|
my $type = $raf->{FILE_PT} ? 'pipe or socket' : 'scalar reference';
|
|
556
556
|
$et->Warn("Install IO::String to decode compressed ZIP information from a $type");
|
|
557
557
|
last;
|
|
558
558
|
}
|
|
559
559
|
$et->VPrint(1, " --- using Archive::Zip ---\n");
|
|
560
|
-
$zip =
|
|
560
|
+
$zip = Archive::Zip->new;
|
|
561
561
|
# catch all warnings! (Archive::Zip is bad for this)
|
|
562
562
|
local $SIG{'__WARN__'} = \&WarnProc;
|
|
563
563
|
my $status = $zip->readFromFileHandle($fh);
|
|
@@ -568,8 +568,8 @@ sub ProcessZIP($$)
|
|
|
568
568
|
# a failed test with Perl 5.6.2 GNU/Linux 2.6.32-5-686 i686-linux-64int-ld
|
|
569
569
|
$raf->Seek(0,0);
|
|
570
570
|
$raf->Slurp();
|
|
571
|
-
$fh =
|
|
572
|
-
$zip =
|
|
571
|
+
$fh = IO::String->new(${$raf->{BUFF_PT}});
|
|
572
|
+
$zip = Archive::Zip->new;
|
|
573
573
|
$status = $zip->readFromFileHandle($fh);
|
|
574
574
|
}
|
|
575
575
|
if ($status) {
|