exiftool_vendored 12.99.0 → 13.03.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 +76 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/arg_files/exif2xmp.args +4 -0
- data/bin/arg_files/xmp2exif.args +4 -0
- data/bin/exiftool +121 -50
- data/bin/lib/Image/ExifTool/Apple.pm +2 -2
- data/bin/lib/Image/ExifTool/CBOR.pm +4 -1
- data/bin/lib/Image/ExifTool/Canon.pm +35 -26
- data/bin/lib/Image/ExifTool/Exif.pm +15 -9
- data/bin/lib/Image/ExifTool/FlashPix.pm +5 -9
- data/bin/lib/Image/ExifTool/GIF.pm +143 -92
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +6 -5
- data/bin/lib/Image/ExifTool/GoPro.pm +2 -2
- data/bin/lib/Image/ExifTool/JPEG.pm +9 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +2 -2
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MacOS.pm +2 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +10 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +5 -2
- data/bin/lib/Image/ExifTool/PDF.pm +35 -4
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +11 -2
- data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +6 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +69 -7
- data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5596 -5582
- data/bin/lib/Image/ExifTool/TagNames.pod +75 -21
- data/bin/lib/Image/ExifTool/Text.pm +3 -2
- data/bin/lib/Image/ExifTool/Validate.pm +2 -2
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +13 -4
- data/bin/lib/Image/ExifTool/Writer.pl +42 -66
- data/bin/lib/Image/ExifTool/XMP.pm +19 -4
- data/bin/lib/Image/ExifTool/XMP2.pl +60 -0
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -2
- data/bin/lib/Image/ExifTool.pm +204 -86
- data/bin/lib/Image/ExifTool.pod +58 -31
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 28175 tags, with 17499 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -147,8 +147,10 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
147
147
|
DJI-DBG DJI Info
|
148
148
|
'APP8' SPIFF JPEG SPIFF
|
149
149
|
InfiRayIsothermal InfiRay Isothermal
|
150
|
+
SEAL XMP SEAL
|
150
151
|
'APP9' MediaJukebox JPEG MediaJukebox
|
151
152
|
InfiRaySensor InfiRay Sensor
|
153
|
+
SEAL XMP SEAL
|
152
154
|
'APP10' Comment no
|
153
155
|
'APP11' JPEG-HDR JPEG HDR
|
154
156
|
JUMBF Jpeg2000
|
@@ -871,7 +873,7 @@ for the official EXIF 2.32 specification.
|
|
871
873
|
0xa433 LensMake ExifIFD string
|
872
874
|
0xa434 LensModel ExifIFD string
|
873
875
|
0xa435 LensSerialNumber ExifIFD string
|
874
|
-
0xa436
|
876
|
+
0xa436 ImageTitle ExifIFD string
|
875
877
|
0xa437 Photographer ExifIFD string
|
876
878
|
0xa438 ImageEditor ExifIFD string
|
877
879
|
0xa439 CameraFirmware ExifIFD string
|
@@ -1053,6 +1055,7 @@ for the official EXIF 2.32 specification.
|
|
1053
1055
|
0xcd49 JXLDistance IFD0 float
|
1054
1056
|
0xcd4a JXLEffort IFD0 int32u
|
1055
1057
|
0xcd4b JXLDecodeSpeed IFD0 int32u
|
1058
|
+
0xcea1 SEAL IFD0 XMP SEAL
|
1056
1059
|
0xea1c Padding ExifIFD undef!
|
1057
1060
|
0xea1d OffsetSchema ExifIFD int32s!
|
1058
1061
|
0xfde8 OwnerName ExifIFD string/
|
@@ -1427,6 +1430,7 @@ L<http://www.adobe.com/devnet/xmp/> for the official XMP specification.
|
|
1427
1430
|
pur XMP pur
|
1428
1431
|
rdf XMP rdf
|
1429
1432
|
sdc Nikon sdc
|
1433
|
+
seal XMP seal
|
1430
1434
|
swf XMP swf
|
1431
1435
|
tiff XMP tiff
|
1432
1436
|
x XMP x
|
@@ -4605,7 +4609,7 @@ These tags belong to the ExifTool XMP-exif family 1 group.
|
|
4605
4609
|
GPSTrack rational
|
4606
4610
|
GPSTrackRef string
|
4607
4611
|
GPSVersionID string
|
4608
|
-
ImageUniqueID string
|
4612
|
+
ImageUniqueID string/
|
4609
4613
|
ISO integer+
|
4610
4614
|
LightSource string
|
4611
4615
|
MakerNote string
|
@@ -4686,6 +4690,7 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
|
|
4686
4690
|
Acceleration rational
|
4687
4691
|
SerialNumber string
|
4688
4692
|
CameraElevationAngle rational
|
4693
|
+
CameraFirmware string
|
4689
4694
|
OwnerName string
|
4690
4695
|
CompositeImage integer
|
4691
4696
|
CompositeImageCount integer+
|
@@ -4702,6 +4707,10 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
|
|
4702
4707
|
CompImageValues rational_+
|
4703
4708
|
Gamma rational
|
4704
4709
|
Humidity rational
|
4710
|
+
ImageEditingSoftware string
|
4711
|
+
ImageEditor string
|
4712
|
+
ImageTitle string
|
4713
|
+
ImageUniqueID string
|
4705
4714
|
InteropIndex string
|
4706
4715
|
ISOSpeed integer
|
4707
4716
|
ISOSpeedLatitudeyyy integer
|
@@ -4710,8 +4719,11 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
|
|
4710
4719
|
LensModel string
|
4711
4720
|
LensSerialNumber string
|
4712
4721
|
LensInfo rational+
|
4722
|
+
MetadataEditingSoftware string
|
4723
|
+
Photographer string
|
4713
4724
|
PhotographicSensitivity integer
|
4714
4725
|
Pressure rational
|
4726
|
+
RAWDevelopingSoftware string
|
4715
4727
|
RecommendedExposureIndex integer
|
4716
4728
|
SensitivityType integer
|
4717
4729
|
StandardOutputSensitivity integer
|
@@ -6144,6 +6156,37 @@ These tags belong to the ExifTool XMP-rdf family 1 group.
|
|
6144
6156
|
-------- --------
|
6145
6157
|
About string!
|
6146
6158
|
|
6159
|
+
=head3 XMP seal Tags
|
6160
|
+
|
6161
|
+
SEAL embedded in XMP.
|
6162
|
+
|
6163
|
+
These tags belong to the ExifTool XMP-seal family 1 group.
|
6164
|
+
|
6165
|
+
Tag Name Writable
|
6166
|
+
-------- --------
|
6167
|
+
Seal XMP SEAL
|
6168
|
+
|
6169
|
+
=head3 XMP SEAL Tags
|
6170
|
+
|
6171
|
+
These tags are used in SEAL content authentification, which is actually XML
|
6172
|
+
format, not XMP. ExifTool has read/delete support for SEAL information in
|
6173
|
+
JPG, TIFF, XMP, PNG, WEBP, HEIC, PPM, MOV and MP4 files, and read-only
|
6174
|
+
support in PDF, MKV and WAV. Use C<-seal:all=> on the command line to
|
6175
|
+
delete SEAL information in supported formats.
|
6176
|
+
|
6177
|
+
Tag ID Tag Name Writable
|
6178
|
+
------ -------- --------
|
6179
|
+
'b' ByteRange no
|
6180
|
+
'copyright' Copyright no
|
6181
|
+
'd' Domain no
|
6182
|
+
'da' DigestAlgorithm no
|
6183
|
+
'info' SEALComment no
|
6184
|
+
'ka' KeyAlgorithm no
|
6185
|
+
'kv' KeyVersion no
|
6186
|
+
's' Signature no
|
6187
|
+
'seal' SEALVersion no
|
6188
|
+
'sf' SignatureFormat no
|
6189
|
+
|
6147
6190
|
=head3 XMP swf Tags
|
6148
6191
|
|
6149
6192
|
Adobe SWF namespace tags.
|
@@ -28121,6 +28164,7 @@ check if speed is more of a concern.
|
|
28121
28164
|
'sPLT' SuggestedPalette no
|
28122
28165
|
'sRGB' SRGBRendering yes!
|
28123
28166
|
'sTER' StereoImage PNG StereoImage
|
28167
|
+
'seAl' SEAL XMP SEAL
|
28124
28168
|
'tEXt' TextualData PNG TextualData
|
28125
28169
|
'tIME' ModifyDate yes
|
28126
28170
|
'tRNS' Transparency no
|
@@ -29224,7 +29268,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
|
|
29224
29268
|
|
29225
29269
|
Tag ID Tag Name Writable
|
29226
29270
|
------ -------- --------
|
29227
|
-
'_stream'
|
29271
|
+
'_stream' PhotoshopStream Photoshop
|
29228
29272
|
|
29229
29273
|
=head3 PDF Illustrator Tags
|
29230
29274
|
|
@@ -29247,7 +29291,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
|
|
29247
29291
|
|
29248
29292
|
Tag ID Tag Name Writable
|
29249
29293
|
------ -------- --------
|
29250
|
-
'_stream'
|
29294
|
+
'_stream' AIStream PostScript
|
29251
29295
|
|
29252
29296
|
=head3 PDF Resources Tags
|
29253
29297
|
|
@@ -29276,7 +29320,7 @@ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
|
|
29276
29320
|
|
29277
29321
|
Tag ID Tag Name Writable
|
29278
29322
|
------ -------- --------
|
29279
|
-
'_stream'
|
29323
|
+
'_stream' ICC_Profile ICC_Profile
|
29280
29324
|
|
29281
29325
|
=head3 PDF Properties Tags
|
29282
29326
|
|
@@ -29844,6 +29888,7 @@ for the official QuickTime specification.
|
|
29844
29888
|
'GPS ' GPSDataList2? no
|
29845
29889
|
'IDIT' DateTimeOriginal string
|
29846
29890
|
'PICT' PreviewPICT no
|
29891
|
+
'SEAL' SEAL XMP SEAL
|
29847
29892
|
'_htc' HTCInfo QuickTime HTCInfo
|
29848
29893
|
'ardt' ARDroneFile no
|
29849
29894
|
'cust' CustomInfo no
|
@@ -30187,22 +30232,29 @@ changed via the config file.
|
|
30187
30232
|
|
30188
30233
|
=head3 QuickTime tx3g Tags
|
30189
30234
|
|
30190
|
-
Tags extracted from the tx3g sbtl timed metadata of Yuneec drones,
|
30191
|
-
subtitle text in some other videos.
|
30235
|
+
Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
|
30236
|
+
and subtitle text in some other videos.
|
30192
30237
|
|
30193
|
-
Tag ID
|
30194
|
-
------
|
30195
|
-
'Alt'
|
30196
|
-
'DateTime'
|
30197
|
-
'
|
30198
|
-
'
|
30199
|
-
'
|
30200
|
-
'
|
30201
|
-
'
|
30202
|
-
'
|
30203
|
-
'
|
30204
|
-
'
|
30205
|
-
'
|
30238
|
+
Tag ID Tag Name Writable
|
30239
|
+
------ -------- --------
|
30240
|
+
'Alt' GPSAltitude no
|
30241
|
+
'DateTime' DateTime no
|
30242
|
+
'EV' ExposureCompensation no
|
30243
|
+
'F-NUM' FNumber no
|
30244
|
+
'GPSDateTime' GPSDateTime no
|
30245
|
+
'GimPitch' GimbalPitch no
|
30246
|
+
'GimRoll' GimbalRoll no
|
30247
|
+
'GimYaw' GimbalYaw no
|
30248
|
+
'HomeLat' GPSHomeLatitude no
|
30249
|
+
'HomeLon' GPSHomeLongitude no
|
30250
|
+
'ISO' ISO no
|
30251
|
+
'Lat' GPSLatitude no
|
30252
|
+
'Lon' GPSLongitude no
|
30253
|
+
'Pitch' Pitch no
|
30254
|
+
'Roll' Roll no
|
30255
|
+
'SHUTTER' ExposureTime no
|
30256
|
+
'Text' Text no
|
30257
|
+
'Yaw' Yaw no
|
30206
30258
|
|
30207
30259
|
=head3 QuickTime HTCInfo Tags
|
30208
30260
|
|
@@ -31636,6 +31688,7 @@ metadata to WEBP images, but can't yet write to other RIFF-based formats.
|
|
31636
31688
|
'LIST_hydt' PentaxData Pentax AVI
|
31637
31689
|
'LIST_ncdt' NikonData Nikon AVI
|
31638
31690
|
'LIST_pntx' PentaxData2 Pentax AVI
|
31691
|
+
'SEAL' SEAL XMP SEAL
|
31639
31692
|
'SGLT' BikeBroAccel QuickTime Stream
|
31640
31693
|
'SLLT' BikeBroGPS QuickTime Stream
|
31641
31694
|
'VP8 ' VP8Bitstream RIFF VP8
|
@@ -33243,6 +33296,7 @@ Matroska specification.
|
|
33243
33296
|
0xb538667 SignatureSlot Matroska
|
33244
33297
|
0xc53bb6b Cues Matroska
|
33245
33298
|
0xf43b675 Cluster Matroska
|
33299
|
+
0x5345414c SEAL XMP SEAL
|
33246
33300
|
|
33247
33301
|
=head3 Matroska Projection Tags
|
33248
33302
|
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION);
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.05';
|
19
19
|
|
20
20
|
# Text tags
|
21
21
|
%Image::ExifTool::Text::Main = (
|
@@ -191,7 +191,8 @@ sub ProcessTXT($$)
|
|
191
191
|
$enc = 'unknown-8bit';
|
192
192
|
}
|
193
193
|
}
|
194
|
-
|
194
|
+
# ($$et{VALUE}{MIMEEncoding} may be undef if it was ignored)
|
195
|
+
if (defined $$et{VALUE}{MIMEEncoding} and $$et{VALUE}{MIMEEncoding} ne $enc) {
|
195
196
|
$$et{VALUE}{MIMEEncoding} = $enc;
|
196
197
|
$et->VPrint(0," MIMEEncoding [override] = $enc\n");
|
197
198
|
}
|
@@ -17,7 +17,7 @@ package Image::ExifTool::Validate;
|
|
17
17
|
use strict;
|
18
18
|
use vars qw($VERSION %exifSpec);
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.24';
|
21
21
|
|
22
22
|
use Image::ExifTool qw(:Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
@@ -575,7 +575,7 @@ sub FinishValidate($$)
|
|
575
575
|
# get all tags in this group
|
576
576
|
foreach $key (sort keys %{$$et{VALUE}}) {
|
577
577
|
next unless $et->GetGroup($key, 1) eq $grp;
|
578
|
-
next if $$et{TAG_EXTRA}{$key}
|
578
|
+
next if $$et{TAG_EXTRA}{$key}{G3}; # ignore sub-documents
|
579
579
|
# fill in %val lookup with values based on tag ID
|
580
580
|
my $tag = $$et{TAG_INFO}{$key}{TagID};
|
581
581
|
$val{$tag} = $$et{VALUE}{$key};
|
@@ -34,6 +34,11 @@ my %webpMap = (
|
|
34
34
|
MakerNotes => 'ExifIFD',
|
35
35
|
);
|
36
36
|
|
37
|
+
my %deletableGroup = (
|
38
|
+
"XMP\0" => 'XMP', # delete incorrectly written "XMP\0" tag with XMP group
|
39
|
+
SEAL => 'SEAL', # delete SEAL tag with SEAL group
|
40
|
+
);
|
41
|
+
|
37
42
|
#------------------------------------------------------------------------------
|
38
43
|
# Write RIFF file (currently WebP-type only)
|
39
44
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref
|
@@ -46,6 +51,7 @@ sub WriteRIFF($$)
|
|
46
51
|
my $outfile = $$dirInfo{OutFile};
|
47
52
|
my $outsize = 0;
|
48
53
|
my $raf = $$dirInfo{RAF};
|
54
|
+
my $verbose = $et->Options('Verbose');
|
49
55
|
my ($buff, $err, $pass, %has, %dirDat, $imageWidth, $imageHeight);
|
50
56
|
|
51
57
|
# do this in 2 passes so we can set the size of the containing RIFF chunk
|
@@ -65,6 +71,7 @@ sub WriteRIFF($$)
|
|
65
71
|
SetByteOrder('II');
|
66
72
|
|
67
73
|
# determine which directories we must write for this file type
|
74
|
+
$et->Options(Verbose => 0) if $pass; # (avoid duplicate Verbose options here)
|
68
75
|
$et->InitWriteDirs(\%webpMap);
|
69
76
|
my $addDirs = $$et{ADD_DIRS};
|
70
77
|
my $editDirs = $$et{EDIT_DIRS};
|
@@ -73,6 +80,7 @@ sub WriteRIFF($$)
|
|
73
80
|
|
74
81
|
# write header
|
75
82
|
if ($pass) {
|
83
|
+
$et->Options(Verbose => $verbose);
|
76
84
|
my $needsVP8X = ($has{ANIM} or $has{'XMP '} or $has{EXIF} or
|
77
85
|
$has{ALPH} or $has{ICCP});
|
78
86
|
if ($has{VP8X} and not $needsVP8X and $$et{CHANGED}) {
|
@@ -146,13 +154,14 @@ sub WriteRIFF($$)
|
|
146
154
|
# RIFF chunks are padded to an even number of bytes
|
147
155
|
my $len2 = $len + ($len & 0x01);
|
148
156
|
# handle incorrect "XMP\0" chunk ID written by Google software
|
149
|
-
if ($tag
|
150
|
-
if ($$et{DEL_GROUP}{
|
151
|
-
# just ignore this chunk if deleting
|
157
|
+
if ($deletableGroup{$tag}) {
|
158
|
+
if ($$et{DEL_GROUP}{$deletableGroup{$tag}}) {
|
159
|
+
# just ignore this chunk if deleting the associated group
|
152
160
|
$raf->Seek($len2, 1) or $et->Error('Seek error'), last;
|
161
|
+
$et->VPrint(0, " Deleting $deletableGroup{$tag}\n") if $pass;
|
153
162
|
++$$et{CHANGED};
|
154
163
|
next;
|
155
|
-
}
|
164
|
+
} elsif ($tag eq "XMP\0") {
|
156
165
|
$et->Warn('Incorrect XMP tag ID',1) if $pass;
|
157
166
|
}
|
158
167
|
}
|
@@ -43,6 +43,7 @@ my %tiffMap = (
|
|
43
43
|
PrintIM => 'IFD0',
|
44
44
|
IPTC => 'IFD0',
|
45
45
|
Photoshop => 'IFD0',
|
46
|
+
SEAL => 'IFD0',
|
46
47
|
InteropIFD => 'ExifIFD',
|
47
48
|
MakerNotes => 'ExifIFD',
|
48
49
|
CanonVRD => 'MakerNotes', # (so VRDOffset will get updated)
|
@@ -74,6 +75,7 @@ my %jpegMap = (
|
|
74
75
|
Meta => 'APP3',
|
75
76
|
MetaIFD => 'Meta',
|
76
77
|
RMETA => 'APP5',
|
78
|
+
SEAL => ['APP8','APP9'], # (note: add 'IFD0' if this is a possibility)
|
77
79
|
Ducky => 'APP12',
|
78
80
|
Photoshop => 'APP13',
|
79
81
|
Adobe => 'APP14',
|
@@ -140,7 +142,7 @@ my @delGroups = qw(
|
|
140
142
|
GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC ItemList JFIF
|
141
143
|
Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF Nextbase NikonApp
|
142
144
|
NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs PrintIM
|
143
|
-
QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
|
145
|
+
QuickTime RMETA RSRC SEAL SubIFD Trailer UserData XML XML-* XMP XMP-*
|
144
146
|
);
|
145
147
|
# family 2 group names that we can delete
|
146
148
|
my @delGroup2 = qw(
|
@@ -152,6 +154,7 @@ my %delMore = (
|
|
152
154
|
QuickTime => [ qw(ItemList UserData Keys) ],
|
153
155
|
XMP => [ 'XMP-*' ],
|
154
156
|
XML => [ 'XML-*' ],
|
157
|
+
SEAL => [ 'XMP-SEAL' ],
|
155
158
|
);
|
156
159
|
|
157
160
|
# family 0 groups where directories should never be deleted
|
@@ -1291,67 +1294,29 @@ sub SetNewValuesFromFile($$;@)
|
|
1291
1294
|
# ! DON'T FORGET!! Must consider each new !
|
1292
1295
|
# ! option to decide how it is handled here. !
|
1293
1296
|
# +------------------------------------------+
|
1297
|
+
foreach (qw(ByteUnit Charset CharsetEXIF CharsetFileName CharsetID3 CharsetIPTC
|
1298
|
+
CharsetPhotoshop Composite DateFormat Debug EncodeHangs Escape ExtendedXMP
|
1299
|
+
ExtractEmbedded FastScan Filter FixBase Geolocation GeolocAltNames
|
1300
|
+
GeolocFeature GeolocMinPop GeolocMaxDist GlobalTimeShift HexTagIDs
|
1301
|
+
IgnoreGroups IgnoreMinorErrors IgnoreTags ImageHashType Lang
|
1302
|
+
LargeFileSupport ListItem ListSep MDItemTags MissingTagValue NoPDFList
|
1303
|
+
NoWarning Password PrintConv QuickTimeUTC RequestTags SaveFormat SavePath
|
1304
|
+
ScanForXMP StructFormat SystemTags TimeZone Unknown UserParam Validate
|
1305
|
+
WindowsLongPath WindowsWideFile XAttrTags XMPAutoConv))
|
1306
|
+
{
|
1307
|
+
$srcExifTool->Options($_ => $$options{$_});
|
1308
|
+
}
|
1294
1309
|
$srcExifTool->Options(
|
1295
1310
|
Binary => 1,
|
1296
|
-
ByteUnit => $$options{ByteUnit},
|
1297
|
-
Charset => $$options{Charset},
|
1298
|
-
CharsetEXIF => $$options{CharsetEXIF},
|
1299
|
-
CharsetFileName => $$options{CharsetFileName},
|
1300
|
-
CharsetID3 => $$options{CharsetID3},
|
1301
|
-
CharsetIPTC => $$options{CharsetIPTC},
|
1302
|
-
CharsetPhotoshop=> $$options{CharsetPhotoshop},
|
1303
|
-
Composite => $$options{Composite},
|
1304
1311
|
CoordFormat => $$options{CoordFormat} || '%d %d %.8f', # copy coordinates at high resolution unless otherwise specified
|
1305
|
-
DateFormat => $$options{DateFormat},
|
1306
1312
|
Duplicates => 1,
|
1307
|
-
Escape => $$options{Escape},
|
1308
1313
|
# Exclude (set below)
|
1309
|
-
ExtendedXMP => $$options{ExtendedXMP},
|
1310
|
-
ExtractEmbedded => $$options{ExtractEmbedded},
|
1311
|
-
FastScan => $$options{FastScan},
|
1312
|
-
Filter => $$options{Filter},
|
1313
|
-
FixBase => $$options{FixBase},
|
1314
|
-
Geolocation => $$options{Geolocation},
|
1315
|
-
GeolocAltNames => $$options{GeolocAltNames},
|
1316
|
-
GeolocFeature => $$options{GeolocFeature},
|
1317
|
-
GeolocMinPop => $$options{GeolocMinPop},
|
1318
|
-
GeolocMaxDist => $$options{GeolocMaxDist},
|
1319
|
-
GlobalTimeShift => $$options{GlobalTimeShift},
|
1320
|
-
HexTagIDs => $$options{HexTagIDs},
|
1321
|
-
IgnoreGroups => $$options{IgnoreGroups},
|
1322
|
-
IgnoreMinorErrors=>$$options{IgnoreMinorErrors},
|
1323
|
-
IgnoreTags => $$options{IgnoreTags},
|
1324
|
-
ImageHashType => $$options{ImageHashType},
|
1325
|
-
Lang => $$options{Lang},
|
1326
|
-
LargeFileSupport=> $$options{LargeFileSupport},
|
1327
1314
|
LimitLongValues => 10000000, # (10 MB)
|
1328
1315
|
List => 1,
|
1329
|
-
ListItem => $$options{ListItem},
|
1330
|
-
ListSep => $$options{ListSep},
|
1331
1316
|
MakerNotes => $$options{FastScan} && $$options{FastScan} > 1 ? undef : 1,
|
1332
|
-
|
1333
|
-
MissingTagValue => $$options{MissingTagValue},
|
1334
|
-
NoPDFList => $$options{NoPDFList},
|
1335
|
-
NoWarning => $$options{NoWarning},
|
1336
|
-
Password => $$options{Password},
|
1337
|
-
PrintConv => $$options{PrintConv},
|
1338
|
-
QuickTimeUTC => $$options{QuickTimeUTC},
|
1339
|
-
RequestAll => $$options{RequestAll} || 1, # (is this still necessary now that RequestTags are being set?)
|
1340
|
-
RequestTags => $$options{RequestTags},
|
1341
|
-
SaveFormat => $$options{SaveFormat},
|
1342
|
-
SavePath => $$options{SavePath},
|
1343
|
-
ScanForXMP => $$options{ScanForXMP},
|
1317
|
+
RequestAll => $$options{RequestAll} || 1, # (must request all because reqTags doesn't cover wildcards)
|
1344
1318
|
StrictDate => defined $$options{StrictDate} ? $$options{StrictDate} : 1,
|
1345
1319
|
Struct => $structOpt,
|
1346
|
-
StructFormat => $$options{StructFormat},
|
1347
|
-
SystemTags => $$options{SystemTags},
|
1348
|
-
TimeZone => $$options{TimeZone},
|
1349
|
-
Unknown => $$options{Unknown},
|
1350
|
-
UserParam => $$options{UserParam},
|
1351
|
-
Validate => $$options{Validate},
|
1352
|
-
WindowsWideFile => $$options{WindowsWideFile},
|
1353
|
-
XAttrTags => $$options{XAttrTags},
|
1354
|
-
XMPAutoConv => $$options{XMPAutoConv},
|
1355
1320
|
);
|
1356
1321
|
# reset Geolocation option if we aren't copying any geolocation tags
|
1357
1322
|
if ($$options{Geolocation} and not grep /\bGeolocation/i, @setTags) {
|
@@ -1362,11 +1327,8 @@ sub SetNewValuesFromFile($$;@)
|
|
1362
1327
|
$$srcExifTool{ALT_EXIFTOOL} = $$self{ALT_EXIFTOOL};
|
1363
1328
|
foreach $tag (@setTags) {
|
1364
1329
|
next if ref $tag;
|
1365
|
-
|
1366
|
-
|
1367
|
-
push @exclude, $1;
|
1368
|
-
next;
|
1369
|
-
}
|
1330
|
+
# avoid extracting tags that are excluded
|
1331
|
+
$tag =~ /^-(.*)/ and push(@exclude, $1), next;
|
1370
1332
|
# add specified tags to list of requested tags
|
1371
1333
|
$_ = $tag;
|
1372
1334
|
if (/(.+?)\s*(>|<)\s*(.+)/) {
|
@@ -2376,9 +2338,13 @@ sub WriteInfo($$;$$)
|
|
2376
2338
|
} elsif (UNIVERSAL::isa($inRef,'File::RandomAccess')) {
|
2377
2339
|
$inRef->Seek(0);
|
2378
2340
|
$raf = $inRef;
|
2379
|
-
} elsif ($] >= 5.006 and (
|
2341
|
+
} elsif ($] >= 5.006 and ($$self{OPTIONS}{EncodeHangs} or
|
2342
|
+
eval { require Encode; Encode::is_utf8($$inRef) } or $@))
|
2343
|
+
{
|
2344
|
+
local $SIG{'__WARN__'} = \&SetWarning;
|
2380
2345
|
# convert image data from UTF-8 to character stream if necessary
|
2381
|
-
my $buff = $@ ? pack('C*',unpack($] < 5.010000 ?
|
2346
|
+
my $buff = ($$self{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
|
2347
|
+
'U0C*' : 'C0C*', $$inRef)) : Encode::encode('utf8', $$inRef);
|
2382
2348
|
if (defined $outfile) {
|
2383
2349
|
$inRef = \$buff;
|
2384
2350
|
} else {
|
@@ -2951,10 +2917,15 @@ sub Sanitize($$)
|
|
2951
2917
|
$$valPt = $$$valPt if ref $$valPt eq 'SCALAR';
|
2952
2918
|
# make sure the Perl UTF-8 flag is OFF for the value if perl 5.6 or greater
|
2953
2919
|
# (otherwise our byte manipulations get corrupted!!)
|
2954
|
-
|
2920
|
+
# NOTE: Don't use Encode on Windows becase "require Encode" on Windows hangs if cwd is a long path name!!
|
2921
|
+
if ($] >= 5.006 and ($$self{OPTIONS}{EncodeHangs} or
|
2922
|
+
eval { require Encode; Encode::is_utf8($$valPt) } or $@))
|
2923
|
+
{
|
2924
|
+
# (SIG handling was added in 10.39. Not sure why, but I've added this to other similar code for 13.02)
|
2955
2925
|
local $SIG{'__WARN__'} = \&SetWarning;
|
2956
2926
|
# repack by hand if Encode isn't available
|
2957
|
-
$$valPt = $@ ? pack('C*',unpack($] < 5.010000 ?
|
2927
|
+
$$valPt = ($$self{OPTIONS}{EncodeHangs} or $@) ? pack('C*', unpack($] < 5.010000 ?
|
2928
|
+
'U0C*' : 'C0C*', $$valPt)) : Encode::encode('utf8', $$valPt);
|
2958
2929
|
}
|
2959
2930
|
# un-escape value if necessary
|
2960
2931
|
if ($$self{OPTIONS}{Escape}) {
|
@@ -3012,7 +2983,7 @@ Conv: for (;;) {
|
|
3012
2983
|
$err2 = eval $$tagInfo{WriteCheck};
|
3013
2984
|
$@ and warn($@), $err2 = 'Error evaluating WriteCheck';
|
3014
2985
|
}
|
3015
|
-
unless ($err2) {
|
2986
|
+
unless (defined $err2) {
|
3016
2987
|
my $table = $$tagInfo{Table};
|
3017
2988
|
if ($table and $$table{CHECK_PROC} and not $$tagInfo{RawConvInv}) {
|
3018
2989
|
my $checkProc = $$table{CHECK_PROC};
|
@@ -3295,7 +3266,7 @@ sub InsertTagValues($$;$$$$)
|
|
3295
3266
|
my @matches = grep /^$tag(\s|$)/i, @$foundTags;
|
3296
3267
|
@matches = $self->GroupMatches($group, \@matches) if defined $group;
|
3297
3268
|
foreach (@matches) {
|
3298
|
-
my $doc = $$ex{$_}
|
3269
|
+
my $doc = $$ex{$_}{G3} || 0;
|
3299
3270
|
if (defined $$cacheTag[$doc]) {
|
3300
3271
|
next unless $$cacheTag[$doc] =~ / \((\d+)\)$/;
|
3301
3272
|
my $cur = $1;
|
@@ -6650,6 +6621,11 @@ sub WriteJPEG($$)
|
|
6650
6621
|
$segType = 'Ricoh RMETA';
|
6651
6622
|
$$delGroup{RMETA} and $del = 1;
|
6652
6623
|
}
|
6624
|
+
} elsif ($marker == 0xe8 or $marker == 0xe9) { # APP8/9 (SEAL)
|
6625
|
+
if ($$segDataPt =~ /^SEAL\0/) {
|
6626
|
+
$segType = 'SEAL';
|
6627
|
+
$$delGroup{SEAL} and $del = 1;
|
6628
|
+
}
|
6653
6629
|
} elsif ($marker == 0xeb) { # APP10 (JUMBF)
|
6654
6630
|
if ($$segDataPt =~ /^JP/) {
|
6655
6631
|
$segType = 'JUMBF';
|
@@ -7016,7 +6992,7 @@ sub SetFileTime($$;$$$$)
|
|
7016
6992
|
# get Win32 handle, needed for SetFileTime
|
7017
6993
|
my $win32Handle = eval { Win32API::File::GetOsFHandle($file) };
|
7018
6994
|
unless ($win32Handle) {
|
7019
|
-
$self->Warn('Win32API::File
|
6995
|
+
$self->Warn('Win32API::File GetOsFHandle returned invalid handle');
|
7020
6996
|
return 0;
|
7021
6997
|
}
|
7022
6998
|
# convert Unix seconds to FILETIME structs
|
@@ -7034,13 +7010,13 @@ sub SetFileTime($$;$$$$)
|
|
7034
7010
|
return 0 if defined $k32SetFileTime;
|
7035
7011
|
$k32SetFileTime = Win32::API->new('KERNEL32', 'SetFileTime', 'NPPP', 'I');
|
7036
7012
|
unless ($k32SetFileTime) {
|
7037
|
-
$self->Warn('Error
|
7013
|
+
$self->Warn('Error loading Win32::API SetFileTime');
|
7038
7014
|
$k32SetFileTime = 0;
|
7039
7015
|
return 0;
|
7040
7016
|
}
|
7041
7017
|
}
|
7042
7018
|
unless ($k32SetFileTime->Call($win32Handle, $ctime, $atime, $mtime)) {
|
7043
|
-
$self->Warn('Win32::API
|
7019
|
+
$self->Warn('Win32::API SetFileTime returned ' . Win32::GetLastError());
|
7044
7020
|
return 0;
|
7045
7021
|
}
|
7046
7022
|
return 1;
|
@@ -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.69';
|
54
54
|
@ISA = qw(Exporter);
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
56
56
|
|
@@ -203,6 +203,7 @@ my %xmpNS = (
|
|
203
203
|
hdr_metadata => 'http://ns.adobe.com/hdr-metadata/1.0/',
|
204
204
|
hdrgm => 'http://ns.adobe.com/hdr-gain-map/1.0/',
|
205
205
|
xmpDSA => 'http://leica-camera.com/digital-shift-assistant/1.0/',
|
206
|
+
seal => 'http://ns.seal/2024/1.0/',
|
206
207
|
# Note: Google uses a prefix of 'Container', but this conflicts with the
|
207
208
|
# Device Container namespace, also by Google. So call this one GContainer
|
208
209
|
GContainer=> 'http://ns.google.com/photos/1.0/container/',
|
@@ -933,6 +934,10 @@ my %sRangeMask = (
|
|
933
934
|
Name => 'xmpDSA',
|
934
935
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::DSA' },
|
935
936
|
},
|
937
|
+
seal => {
|
938
|
+
Name => 'seal',
|
939
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::seal' },
|
940
|
+
},
|
936
941
|
GContainer => {
|
937
942
|
Name => 'GContainer',
|
938
943
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::GContainer' },
|
@@ -2016,6 +2021,7 @@ my %sPantryItem = (
|
|
2016
2021
|
Writable => 'integer',
|
2017
2022
|
List => 'Seq',
|
2018
2023
|
AutoSplit => 1,
|
2024
|
+
Notes => 'deprecated',
|
2019
2025
|
},
|
2020
2026
|
OECF => {
|
2021
2027
|
Name => 'Opto-ElectricConvFactor',
|
@@ -2267,7 +2273,7 @@ my %sPantryItem = (
|
|
2267
2273
|
3 => 'Distant',
|
2268
2274
|
},
|
2269
2275
|
},
|
2270
|
-
ImageUniqueID => { },
|
2276
|
+
ImageUniqueID => { Avoid => 1, Notes => 'moved to exifEX namespace in 2024 spec' },
|
2271
2277
|
GPSVersionID => { Groups => { 2 => 'Location' } },
|
2272
2278
|
GPSLatitude => { Groups => { 2 => 'Location' }, %latConv },
|
2273
2279
|
GPSLongitude => { Groups => { 2 => 'Location' }, %longConv },
|
@@ -2509,6 +2515,15 @@ my %sPantryItem = (
|
|
2509
2515
|
Values => { List => 'Seq', Writable => 'rational' },
|
2510
2516
|
},
|
2511
2517
|
},
|
2518
|
+
# new in Exif 3.0
|
2519
|
+
ImageUniqueID => { },
|
2520
|
+
ImageTitle => { },
|
2521
|
+
ImageEditor => { },
|
2522
|
+
Photographer => { Groups => { 2 => 'Author' } },
|
2523
|
+
CameraFirmware => { Groups => { 2 => 'Camera' } },
|
2524
|
+
RAWDevelopingSoftware => { },
|
2525
|
+
ImageEditingSoftware => { },
|
2526
|
+
MetadataEditingSoftware => { },
|
2512
2527
|
);
|
2513
2528
|
|
2514
2529
|
# Auxiliary namespace properties (aux) - not fully documented (ref PH)
|
@@ -3616,7 +3631,7 @@ NoLoop:
|
|
3616
3631
|
# store the value for this tag
|
3617
3632
|
my $key = $et->FoundTag($tagInfo, $val) or return 0;
|
3618
3633
|
# save original components of rational numbers (used when copying)
|
3619
|
-
$$et{
|
3634
|
+
$$et{TAG_EXTRA}{$key}{Rational} = $rational if defined $rational;
|
3620
3635
|
# save structure/list information if necessary
|
3621
3636
|
if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
|
3622
3637
|
not $$et{NO_STRUCT})
|
@@ -4132,7 +4147,7 @@ sub ParseXMPElement($$$;$$$$)
|
|
4132
4147
|
|
4133
4148
|
#------------------------------------------------------------------------------
|
4134
4149
|
# Process XMP data
|
4135
|
-
# Inputs: 0) ExifTool
|
4150
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
4136
4151
|
# Returns: 1 on success
|
4137
4152
|
# Notes: The following flavours of XMP files are currently recognized:
|
4138
4153
|
# - standard XMP with xpacket, x:xmpmeta and rdf:RDF elements
|