exiftool-vendored.pl 12.33.0 → 12.40.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/LICENSE +10 -3
- package/bin/Changes +116 -0
- package/bin/MANIFEST +2 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +45 -45
- package/bin/config_files/acdsee.config +6 -6
- package/bin/config_files/photoshop_paths.config +30 -7
- package/bin/config_files/picasa_faces.config +1 -1
- package/bin/config_files/pix4d.config +2 -2
- package/bin/config_files/tiff_version.config +2 -2
- package/bin/exiftool +112 -82
- package/bin/lib/File/RandomAccess.pm +1 -1
- package/bin/lib/File/RandomAccess.pod +2 -2
- package/bin/lib/Image/ExifTool/AES.pm +1 -1
- package/bin/lib/Image/ExifTool/AFCP.pm +1 -1
- package/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/APE.pm +1 -1
- package/bin/lib/Image/ExifTool/APP12.pm +1 -1
- package/bin/lib/Image/ExifTool/ASF.pm +1 -1
- package/bin/lib/Image/ExifTool/Apple.pm +1 -1
- package/bin/lib/Image/ExifTool/Audible.pm +1 -1
- package/bin/lib/Image/ExifTool/BMP.pm +1 -1
- package/bin/lib/Image/ExifTool/BPG.pm +1 -1
- package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +15 -4
- package/bin/lib/Image/ExifTool/CBOR.pm +1 -1
- package/bin/lib/Image/ExifTool/Canon.pm +225 -13
- package/bin/lib/Image/ExifTool/CanonCustom.pm +13 -3
- package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- package/bin/lib/Image/ExifTool/Casio.pm +1 -1
- package/bin/lib/Image/ExifTool/Charset.pm +3 -1
- package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- package/bin/lib/Image/ExifTool/DJI.pm +1 -1
- package/bin/lib/Image/ExifTool/DNG.pm +1 -1
- package/bin/lib/Image/ExifTool/DPX.pm +1 -1
- package/bin/lib/Image/ExifTool/DV.pm +1 -1
- package/bin/lib/Image/ExifTool/DarwinCore.pm +3 -3
- package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- package/bin/lib/Image/ExifTool/EXE.pm +1 -1
- package/bin/lib/Image/ExifTool/Exif.pm +64 -20
- package/bin/lib/Image/ExifTool/FITS.pm +1 -1
- package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- package/bin/lib/Image/ExifTool/FLIF.pm +1 -1
- package/bin/lib/Image/ExifTool/FLIR.pm +48 -11
- package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- package/bin/lib/Image/ExifTool/Flash.pm +1 -1
- package/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
- package/bin/lib/Image/ExifTool/Font.pm +1 -1
- package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- package/bin/lib/Image/ExifTool/GE.pm +1 -1
- package/bin/lib/Image/ExifTool/GIF.pm +6 -2
- package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- package/bin/lib/Image/ExifTool/GPS.pm +15 -11
- package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- package/bin/lib/Image/ExifTool/Geotag.pm +4 -3
- package/bin/lib/Image/ExifTool/GoPro.pm +1 -1
- package/bin/lib/Image/ExifTool/H264.pm +1 -1
- package/bin/lib/Image/ExifTool/HP.pm +1 -1
- package/bin/lib/Image/ExifTool/HTML.pm +1 -1
- package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +97 -5
- package/bin/lib/Image/ExifTool/ID3.pm +1 -1
- package/bin/lib/Image/ExifTool/IPTC.pm +1 -1
- package/bin/lib/Image/ExifTool/ISO.pm +1 -1
- package/bin/lib/Image/ExifTool/ITC.pm +1 -1
- package/bin/lib/Image/ExifTool/Import.pm +1 -1
- package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- package/bin/lib/Image/ExifTool/JPEG.pm +6 -2
- package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- package/bin/lib/Image/ExifTool/JSON.pm +1 -1
- package/bin/lib/Image/ExifTool/JVC.pm +1 -1
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +109 -12
- package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/LIF.pm +1 -1
- package/bin/lib/Image/ExifTool/LNK.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- package/bin/lib/Image/ExifTool/M2TS.pm +1 -1
- package/bin/lib/Image/ExifTool/MIE.pm +1 -1
- package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/MNG.pm +1 -1
- package/bin/lib/Image/ExifTool/MOI.pm +1 -1
- package/bin/lib/Image/ExifTool/MPC.pm +1 -1
- package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- package/bin/lib/Image/ExifTool/MPF.pm +1 -1
- package/bin/lib/Image/ExifTool/MRC.pm +1 -1
- package/bin/lib/Image/ExifTool/MWG.pm +1 -1
- package/bin/lib/Image/ExifTool/MXF.pm +1 -1
- package/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- package/bin/lib/Image/ExifTool/Matroska.pm +9 -5
- package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +1918 -72
- package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- package/bin/lib/Image/ExifTool/NikonCustom.pm +523 -6
- package/bin/lib/Image/ExifTool/NikonSettings.pm +150 -87
- package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- package/bin/lib/Image/ExifTool/OOXML.pm +1 -1
- package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +7 -7
- package/bin/lib/Image/ExifTool/OpenEXR.pm +5 -3
- package/bin/lib/Image/ExifTool/Opus.pm +1 -1
- package/bin/lib/Image/ExifTool/Other.pm +1 -1
- package/bin/lib/Image/ExifTool/PCX.pm +1 -1
- package/bin/lib/Image/ExifTool/PDF.pm +6 -4
- package/bin/lib/Image/ExifTool/PGF.pm +1 -1
- package/bin/lib/Image/ExifTool/PICT.pm +1 -1
- package/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- package/bin/lib/Image/ExifTool/PNG.pm +29 -8
- package/bin/lib/Image/ExifTool/PPM.pm +1 -1
- package/bin/lib/Image/ExifTool/PSP.pm +1 -1
- package/bin/lib/Image/ExifTool/Palm.pm +1 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +3 -2
- package/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
- package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- package/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
- package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- package/bin/lib/Image/ExifTool/QuickTime.pm +25 -7
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +40 -4
- package/bin/lib/Image/ExifTool/README +4 -0
- package/bin/lib/Image/ExifTool/RIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- package/bin/lib/Image/ExifTool/RTF.pm +1 -1
- package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- package/bin/lib/Image/ExifTool/Real.pm +1 -1
- package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- package/bin/lib/Image/ExifTool/Red.pm +1 -1
- package/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
- package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
- package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- package/bin/lib/Image/ExifTool/Shift.pl +3 -1
- package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Sony.pm +34 -12
- package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- package/bin/lib/Image/ExifTool/Stim.pm +1 -1
- package/bin/lib/Image/ExifTool/TagInfoXML.pm +11 -6
- package/bin/lib/Image/ExifTool/TagLookup.pm +6581 -5893
- package/bin/lib/Image/ExifTool/TagNames.pod +1641 -59
- package/bin/lib/Image/ExifTool/Text.pm +1 -1
- package/bin/lib/Image/ExifTool/Theora.pm +1 -1
- package/bin/lib/Image/ExifTool/Torrent.pm +1 -1
- package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- package/bin/lib/Image/ExifTool/VCard.pm +1 -1
- package/bin/lib/Image/ExifTool/Validate.pm +1 -1
- package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- package/bin/lib/Image/ExifTool/WTV.pm +1 -1
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
- package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +19 -4
- package/bin/lib/Image/ExifTool/WriteXMP.pl +13 -12
- package/bin/lib/Image/ExifTool/Writer.pl +56 -10
- package/bin/lib/Image/ExifTool/XMP.pm +169 -54
- package/bin/lib/Image/ExifTool/XMP2.pl +6 -4
- package/bin/lib/Image/ExifTool/XMPStruct.pl +22 -8
- package/bin/lib/Image/ExifTool/ZIP.pm +10 -2
- package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- package/bin/lib/Image/ExifTool/iWork.pm +1 -1
- package/bin/lib/Image/ExifTool.pm +93 -13
- package/bin/lib/Image/ExifTool.pod +80 -70
- package/bin/perl-Image-ExifTool.spec +43 -43
- package/bin/pp_build_exe.args +5 -5
- package/package.json +3 -3
|
@@ -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.51';
|
|
54
54
|
@ISA = qw(Exporter);
|
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
|
56
56
|
|
|
@@ -192,6 +192,9 @@ my %xmpNS = (
|
|
|
192
192
|
GettyImagesGIFT => 'http://xmp.gettyimages.com/gift/1.0/',
|
|
193
193
|
LImage => 'http://ns.leiainc.com/photos/1.0/image/',
|
|
194
194
|
Profile => 'http://ns.google.com/photos/dd/1.0/profile/',
|
|
195
|
+
sdc => 'http://ns.nikon.com/sdc/1.0/',
|
|
196
|
+
ast => 'http://ns.nikon.com/asteroid/1.0/',
|
|
197
|
+
nine => 'http://ns.nikon.com/nine/1.0/',
|
|
195
198
|
);
|
|
196
199
|
|
|
197
200
|
# build reverse namespace lookup
|
|
@@ -436,9 +439,38 @@ my %sOECF = (
|
|
|
436
439
|
Names => { List => 'Seq' },
|
|
437
440
|
Values => { List => 'Seq', Writable => 'rational' },
|
|
438
441
|
);
|
|
439
|
-
|
|
442
|
+
my %sAreaModels = (
|
|
443
|
+
STRUCT_NAME => 'AreaModels',
|
|
444
|
+
NAMESPACE => 'crs',
|
|
445
|
+
ColorRangeMaskAreaSampleInfo => { FlatName => 'ColorSampleInfo' },
|
|
446
|
+
AreaComponents => { FlatName => 'Components', List => 'Seq' },
|
|
447
|
+
);
|
|
448
|
+
my %sCorrRangeMask = (
|
|
449
|
+
STRUCT_NAME => 'CorrRangeMask',
|
|
450
|
+
NAMESPACE => 'crs',
|
|
451
|
+
NOTES => 'Called CorrectionRangeMask by the spec.',
|
|
452
|
+
Version => { },
|
|
453
|
+
Type => { },
|
|
454
|
+
ColorAmount => { Writable => 'real' },
|
|
455
|
+
LumMin => { Writable => 'real' },
|
|
456
|
+
LumMax => { Writable => 'real' },
|
|
457
|
+
LumFeather => { Writable => 'real' },
|
|
458
|
+
DepthMin => { Writable => 'real' },
|
|
459
|
+
DepthMax => { Writable => 'real' },
|
|
460
|
+
DepthFeather=> { Writable => 'real' },
|
|
461
|
+
# new in LR 11.0
|
|
462
|
+
Invert => { Writable => 'boolean' },
|
|
463
|
+
SampleType => { Writable => 'integer' },
|
|
464
|
+
AreaModels => {
|
|
465
|
+
List => 'Seq',
|
|
466
|
+
Struct => \%sAreaModels,
|
|
467
|
+
},
|
|
468
|
+
LumRange => { },
|
|
469
|
+
LuminanceDepthSampleInfo => { },
|
|
470
|
+
);
|
|
440
471
|
# new LR2 crs structures (PH)
|
|
441
|
-
my %sCorrectionMask
|
|
472
|
+
my %sCorrectionMask;
|
|
473
|
+
%sCorrectionMask = (
|
|
442
474
|
STRUCT_NAME => 'CorrectionMask',
|
|
443
475
|
NAMESPACE => 'crs',
|
|
444
476
|
# disable List behaviour of flattened Gradient/PaintBasedCorrections
|
|
@@ -473,19 +505,26 @@ my %sCorrectionMask = (
|
|
|
473
505
|
Alpha => { Writable => 'real', List => 0 },
|
|
474
506
|
CenterValue => { Writable => 'real', List => 0 },
|
|
475
507
|
PerimeterValue=>{ Writable => 'real', List => 0 },
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
508
|
+
# new in LR 11.0 MaskGroupBasedCorrections
|
|
509
|
+
MaskActive => { Writable => 'boolean', List => 0 },
|
|
510
|
+
MaskName => { List => 0 },
|
|
511
|
+
MaskBlendMode=> { Writable => 'integer', List => 0 },
|
|
512
|
+
MaskInverted => { Writable => 'boolean', List => 0 },
|
|
513
|
+
MaskSyncID => { List => 0 },
|
|
514
|
+
MaskVersion => { List => 0 },
|
|
515
|
+
MaskSubType => { List => 0 },
|
|
516
|
+
ReferencePoint => { List => 0 },
|
|
517
|
+
InputDigest => { List => 0 },
|
|
518
|
+
MaskDigest => { List => 0 },
|
|
519
|
+
WholeImageArea => { List => 0 },
|
|
520
|
+
Origin => { List => 0 },
|
|
521
|
+
Masks => { Struct => \%sCorrectionMask, NoSubStruct => 1 },
|
|
522
|
+
CorrectionRangeMask => {
|
|
523
|
+
Name => 'CorrRangeMask',
|
|
524
|
+
Notes => 'called CorrectionRangeMask by the spec',
|
|
525
|
+
FlatName => 'Range',
|
|
526
|
+
Struct => \%sCorrRangeMask,
|
|
527
|
+
},
|
|
489
528
|
);
|
|
490
529
|
my %sCorrection = (
|
|
491
530
|
STRUCT_NAME => 'Correction',
|
|
@@ -499,8 +538,8 @@ my %sCorrection = (
|
|
|
499
538
|
LocalClarity => { FlatName => 'Clarity', Writable => 'real', List => 0 },
|
|
500
539
|
LocalSharpness => { FlatName => 'Sharpness', Writable => 'real', List => 0 },
|
|
501
540
|
LocalBrightness => { FlatName => 'Brightness', Writable => 'real', List => 0 },
|
|
502
|
-
LocalToningHue => { FlatName => '
|
|
503
|
-
LocalToningSaturation => { FlatName => '
|
|
541
|
+
LocalToningHue => { FlatName => 'ToningHue', Writable => 'real', List => 0 },
|
|
542
|
+
LocalToningSaturation => { FlatName => 'ToningSaturation', Writable => 'real', List => 0 },
|
|
504
543
|
LocalExposure2012 => { FlatName => 'Exposure2012', Writable => 'real', List => 0 },
|
|
505
544
|
LocalContrast2012 => { FlatName => 'Contrast2012', Writable => 'real', List => 0 },
|
|
506
545
|
LocalHighlights2012 => { FlatName => 'Highlights2012', Writable => 'real', List => 0 },
|
|
@@ -516,15 +555,20 @@ my %sCorrection = (
|
|
|
516
555
|
LocalBlacks2012 => { FlatName => 'Blacks2012', Writable => 'real', List => 0 },
|
|
517
556
|
LocalDehaze => { FlatName => 'Dehaze', Writable => 'real', List => 0 },
|
|
518
557
|
LocalTexture => { FlatName => 'Texture', Writable => 'real', List => 0 },
|
|
558
|
+
# new in LR 11.0
|
|
519
559
|
CorrectionRangeMask => {
|
|
560
|
+
Name => 'CorrRangeMask',
|
|
561
|
+
Notes => 'called CorrectionRangeMask by the spec',
|
|
520
562
|
FlatName => 'RangeMask',
|
|
521
|
-
Struct => \%
|
|
563
|
+
Struct => \%sCorrRangeMask,
|
|
522
564
|
},
|
|
523
565
|
CorrectionMasks => {
|
|
524
566
|
FlatName => 'Mask',
|
|
525
567
|
Struct => \%sCorrectionMask,
|
|
526
568
|
List => 'Seq',
|
|
527
569
|
},
|
|
570
|
+
CorrectionName => { },
|
|
571
|
+
CorrectionSyncID => { },
|
|
528
572
|
);
|
|
529
573
|
my %sRetouchArea = (
|
|
530
574
|
STRUCT_NAME => 'RetouchArea',
|
|
@@ -543,6 +587,30 @@ my %sRetouchArea = (
|
|
|
543
587
|
List => 'Seq',
|
|
544
588
|
},
|
|
545
589
|
);
|
|
590
|
+
my %sMapInfo = (
|
|
591
|
+
STRUCT_NAME => 'MapInfo',
|
|
592
|
+
NAMESPACE => 'crs',
|
|
593
|
+
NOTES => q{
|
|
594
|
+
Called RangeMaskMapInfo by the specification, the same as the containing
|
|
595
|
+
structure.
|
|
596
|
+
},
|
|
597
|
+
RGBMin => { },
|
|
598
|
+
RGBMax => { },
|
|
599
|
+
LabMin => { },
|
|
600
|
+
LabMax => { },
|
|
601
|
+
LumEq => { List => 'Seq' },
|
|
602
|
+
);
|
|
603
|
+
my %sRangeMask = (
|
|
604
|
+
STRUCT_NAME => 'RangeMask',
|
|
605
|
+
NAMESPACE => 'crs',
|
|
606
|
+
NOTES => q{
|
|
607
|
+
This structure is actually called RangeMaskMapInfo, but it only contains one
|
|
608
|
+
element which is a RangeMaskMapInfo structure (Yes, really!). So these are
|
|
609
|
+
renamed to RangeMask and MapInfo respectively to avoid confusion and
|
|
610
|
+
redundancy in the tag names.
|
|
611
|
+
},
|
|
612
|
+
RangeMaskMapInfo => { FlatName => 'MapInfo', Struct => \%sMapInfo },
|
|
613
|
+
);
|
|
546
614
|
|
|
547
615
|
# main XMP tag table (tag ID's are used for the family 1 group names)
|
|
548
616
|
%Image::ExifTool::XMP::Main = (
|
|
@@ -813,6 +881,18 @@ my %sRetouchArea = (
|
|
|
813
881
|
Name => 'Device',
|
|
814
882
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::Device' },
|
|
815
883
|
},
|
|
884
|
+
sdc => {
|
|
885
|
+
Name => 'sdc',
|
|
886
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::sdc' },
|
|
887
|
+
},
|
|
888
|
+
ast => {
|
|
889
|
+
Name => 'ast',
|
|
890
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::ast' },
|
|
891
|
+
},
|
|
892
|
+
nine => {
|
|
893
|
+
Name => 'nine',
|
|
894
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::nine' },
|
|
895
|
+
},
|
|
816
896
|
);
|
|
817
897
|
|
|
818
898
|
# hack to allow XML containing Dublin Core metadata to be handled like XMP (eg. EPUB - see ZIP.pm)
|
|
@@ -1581,6 +1661,14 @@ my %sPantryItem = (
|
|
|
1581
1661
|
AutoToneDigestNoSat => { },
|
|
1582
1662
|
ToggleStyleDigest => { },
|
|
1583
1663
|
ToggleStyleAmount => { Writable => 'integer' },
|
|
1664
|
+
# new for LightRoom 11.0
|
|
1665
|
+
CompatibleVersion => { },
|
|
1666
|
+
MaskGroupBasedCorrections => {
|
|
1667
|
+
FlatName => 'MaskGroupBasedCorr',
|
|
1668
|
+
Struct => \%sCorrection,
|
|
1669
|
+
List => 'Seq',
|
|
1670
|
+
},
|
|
1671
|
+
RangeMaskMapInfo => { Name => 'RangeMask', Struct => \%sRangeMask, FlatName => 'RangeMask' },
|
|
1584
1672
|
);
|
|
1585
1673
|
|
|
1586
1674
|
# Tiff namespace properties (tiff)
|
|
@@ -1672,7 +1760,7 @@ my %sPantryItem = (
|
|
|
1672
1760
|
Software => { },
|
|
1673
1761
|
Artist => { Groups => { 2 => 'Author' } },
|
|
1674
1762
|
Copyright => { Groups => { 2 => 'Author' }, Writable => 'lang-alt' },
|
|
1675
|
-
NativeDigest => { }, #PH
|
|
1763
|
+
NativeDigest => { Avoid => 1 }, #PH
|
|
1676
1764
|
);
|
|
1677
1765
|
|
|
1678
1766
|
# Exif namespace properties (exif)
|
|
@@ -2061,8 +2149,8 @@ my %sPantryItem = (
|
|
|
2061
2149
|
Groups => { 2 => 'Location' },
|
|
2062
2150
|
Writable => 'integer',
|
|
2063
2151
|
PrintConv => {
|
|
2064
|
-
2 => '2-Dimensional',
|
|
2065
|
-
3 => '3-Dimensional',
|
|
2152
|
+
2 => '2-Dimensional Measurement',
|
|
2153
|
+
3 => '3-Dimensional Measurement',
|
|
2066
2154
|
},
|
|
2067
2155
|
},
|
|
2068
2156
|
GPSDOP => { Groups => { 2 => 'Location' }, Writable => 'rational' },
|
|
@@ -2142,8 +2230,8 @@ my %sPantryItem = (
|
|
|
2142
2230
|
NAMESPACE => 'exifEX',
|
|
2143
2231
|
PRIORITY => 0, # not as reliable as actual EXIF tags
|
|
2144
2232
|
NOTES => q{
|
|
2145
|
-
EXIF tags added by the EXIF 2.
|
|
2146
|
-
L<
|
|
2233
|
+
EXIF tags added by the EXIF 2.32 for XMP specification (see
|
|
2234
|
+
L<https://cipa.jp/std/documents/download_e.html?DC-010-2020_E>).
|
|
2147
2235
|
},
|
|
2148
2236
|
Gamma => { Writable => 'rational' },
|
|
2149
2237
|
PhotographicSensitivity => { Writable => 'integer' },
|
|
@@ -2307,6 +2395,7 @@ my %sPantryItem = (
|
|
|
2307
2395
|
VignetteCorrectionAlreadyApplied => { Writable => 'boolean' },
|
|
2308
2396
|
LateralChromaticAberrationCorrectionAlreadyApplied => { Writable => 'boolean' },
|
|
2309
2397
|
LensDistortInfo => { }, # (LR 7.5.1, 4 signed rational values)
|
|
2398
|
+
NeutralDensityFactor => { }, # (LR 11.0 - rational value, but denominator seems significant)
|
|
2310
2399
|
);
|
|
2311
2400
|
|
|
2312
2401
|
# IPTC Core namespace properties (Iptc4xmpCore) (ref 4)
|
|
@@ -2349,8 +2438,9 @@ my %sPantryItem = (
|
|
|
2349
2438
|
Scene => { Groups => { 2 => 'Other' }, List => 'Bag' },
|
|
2350
2439
|
SubjectCode => { Groups => { 2 => 'Other' }, List => 'Bag' },
|
|
2351
2440
|
# Copyright - have seen this in a sample (Jan 2021), but I think it is non-standard
|
|
2352
|
-
|
|
2353
|
-
|
|
2441
|
+
# new IPTC Core 1.3 properties
|
|
2442
|
+
AltTextAccessibility => { Groups => { 2 => 'Other' }, Writable => 'lang-alt' },
|
|
2443
|
+
ExtDescrAccessibility => { Groups => { 2 => 'Other' }, Writable => 'lang-alt' },
|
|
2354
2444
|
);
|
|
2355
2445
|
|
|
2356
2446
|
# Adobe Lightroom namespace properties (lr) (ref PH)
|
|
@@ -2362,6 +2452,7 @@ my %sPantryItem = (
|
|
|
2362
2452
|
NOTES => 'Adobe Lightroom "lr" namespace tags.',
|
|
2363
2453
|
privateRTKInfo => { },
|
|
2364
2454
|
hierarchicalSubject => { List => 'Bag' },
|
|
2455
|
+
weightedFlatSubject => { List => 'Bag' },
|
|
2365
2456
|
);
|
|
2366
2457
|
|
|
2367
2458
|
# Adobe Album namespace properties (album) (ref PH)
|
|
@@ -3308,6 +3399,10 @@ NoLoop:
|
|
|
3308
3399
|
}
|
|
3309
3400
|
# save property list for verbose "adding" message unless this tag already exists
|
|
3310
3401
|
$added = \@tagList unless $$tagTablePtr{$tagID};
|
|
3402
|
+
# if this is an empty structure, we must add a Struct field
|
|
3403
|
+
if (not length $val and $$attrs{'rdf:parseType'} and $$attrs{'rdf:parseType'} eq 'Resource') {
|
|
3404
|
+
$$tagInfo{Struct} = { STRUCT_NAME => 'XMP Unknown' };
|
|
3405
|
+
}
|
|
3311
3406
|
AddTagToTable($tagTablePtr, $tagID, $tagInfo);
|
|
3312
3407
|
last;
|
|
3313
3408
|
}
|
|
@@ -3362,26 +3457,6 @@ NoLoop:
|
|
|
3362
3457
|
my $key = $et->FoundTag($tagInfo, $val) or return 0;
|
|
3363
3458
|
# save original components of rational numbers (used when copying)
|
|
3364
3459
|
$$et{RATIONAL}{$key} = $rational if defined $rational;
|
|
3365
|
-
# allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
|
|
3366
|
-
if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
|
|
3367
|
-
my $subdir = $$tagInfo{SubDirectory};
|
|
3368
|
-
my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
|
|
3369
|
-
# process subdirectory information
|
|
3370
|
-
my %dirInfo = (
|
|
3371
|
-
DirName => $$subdir{DirName} || $$tagInfo{Name},
|
|
3372
|
-
DataPt => $dataPt,
|
|
3373
|
-
DirLen => length $$dataPt,
|
|
3374
|
-
IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
|
|
3375
|
-
);
|
|
3376
|
-
my $oldOrder = GetByteOrder();
|
|
3377
|
-
SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
|
|
3378
|
-
my $oldNS = $$et{definedNS};
|
|
3379
|
-
delete $$et{definedNS};
|
|
3380
|
-
my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
|
|
3381
|
-
$et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
|
|
3382
|
-
SetByteOrder($oldOrder);
|
|
3383
|
-
$$et{definedNS} = $oldNS;
|
|
3384
|
-
}
|
|
3385
3460
|
# save structure/list information if necessary
|
|
3386
3461
|
if (@structProps and (@structProps > 1 or defined $structProps[0][1]) and
|
|
3387
3462
|
not $$et{NO_STRUCT})
|
|
@@ -3412,6 +3487,29 @@ NoLoop:
|
|
|
3412
3487
|
my $tagID = join('/',@$props);
|
|
3413
3488
|
$et->VerboseInfo($tagID, $tagInfo, Value => $rawVal || $val);
|
|
3414
3489
|
}
|
|
3490
|
+
# allow read-only subdirectories (eg. embedded base64 XMP/IPTC in NKSC files)
|
|
3491
|
+
if ($$tagInfo{SubDirectory} and not $$et{IsWriting}) {
|
|
3492
|
+
my $subdir = $$tagInfo{SubDirectory};
|
|
3493
|
+
my $dataPt = ref $$et{VALUE}{$key} ? $$et{VALUE}{$key} : \$$et{VALUE}{$key};
|
|
3494
|
+
# decode if necessary (eg. Nikon XMP-ast:XMLPackets)
|
|
3495
|
+
$dataPt = DecodeBase64($$dataPt) if $$tagInfo{Encoding} and $$tagInfo{Encoding} eq 'Base64';
|
|
3496
|
+
# process subdirectory information
|
|
3497
|
+
my %dirInfo = (
|
|
3498
|
+
DirName => $$subdir{DirName} || $$tagInfo{Name},
|
|
3499
|
+
DataPt => $dataPt,
|
|
3500
|
+
DirLen => length $$dataPt,
|
|
3501
|
+
IgnoreProp => $$subdir{IgnoreProp}, # (allow XML to ignore specified properties)
|
|
3502
|
+
IsExtended => 1, # (hack to avoid Duplicate warning for embedded XMP)
|
|
3503
|
+
);
|
|
3504
|
+
my $oldOrder = GetByteOrder();
|
|
3505
|
+
SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
|
|
3506
|
+
my $oldNS = $$et{definedNS};
|
|
3507
|
+
delete $$et{definedNS};
|
|
3508
|
+
my $subTablePtr = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
|
|
3509
|
+
$et->ProcessDirectory(\%dirInfo, $subTablePtr, $$subdir{ProcessProc});
|
|
3510
|
+
SetByteOrder($oldOrder);
|
|
3511
|
+
$$et{definedNS} = $oldNS;
|
|
3512
|
+
}
|
|
3415
3513
|
return 1;
|
|
3416
3514
|
}
|
|
3417
3515
|
|
|
@@ -3504,6 +3602,17 @@ sub ParseXMPElement($$$;$$$$)
|
|
|
3504
3602
|
}
|
|
3505
3603
|
$start = pos($$dataPt); # start from here the next time around
|
|
3506
3604
|
|
|
3605
|
+
# ignore specified XMP namespaces/properties
|
|
3606
|
+
if ($$et{EXCL_XMP_LOOKUP} and not $isWriting and $prop =~ /^(.+):(.*)/) {
|
|
3607
|
+
my ($ns, $nm) = (lc($stdXlatNS{$1} || $1), lc($2));
|
|
3608
|
+
if ($$et{EXCL_XMP_LOOKUP}{"xmp-$ns:all"} or $$et{EXCL_XMP_LOOKUP}{"xmp-$ns:$nm"} or
|
|
3609
|
+
$$et{EXCL_XMP_LOOKUP}{"xmp-all:$nm"})
|
|
3610
|
+
{
|
|
3611
|
+
++$count; # (pretend we found something so we don't store as a tag value)
|
|
3612
|
+
next;
|
|
3613
|
+
}
|
|
3614
|
+
}
|
|
3615
|
+
|
|
3507
3616
|
# extract property attributes
|
|
3508
3617
|
my ($parseResource, %attrs, @attrs);
|
|
3509
3618
|
while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) {
|
|
@@ -3601,9 +3710,9 @@ sub ParseXMPElement($$$;$$$$)
|
|
|
3601
3710
|
if ($nItems == 1000) {
|
|
3602
3711
|
my ($tg,$ns) = GetXMPTagID($propList);
|
|
3603
3712
|
if ($isWriting) {
|
|
3604
|
-
$et->
|
|
3713
|
+
$et->WarnOnce("Excessive number of items for $ns:$tg. Processing may be slow", 1);
|
|
3605
3714
|
} elsif (not $$et{OPTIONS}{IgnoreMinorErrors}) {
|
|
3606
|
-
$et->
|
|
3715
|
+
$et->WarnOnce("Extracted only 1000 $ns:$tg items. Ignore minor errors to extract all", 2);
|
|
3607
3716
|
last;
|
|
3608
3717
|
}
|
|
3609
3718
|
}
|
|
@@ -3625,7 +3734,11 @@ sub ParseXMPElement($$$;$$$$)
|
|
|
3625
3734
|
} elsif ($prop eq 'rdf:Description') {
|
|
3626
3735
|
# remove unnecessary rdf:Description elements since parseType='Resource'
|
|
3627
3736
|
# is more efficient (also necessary to make property path consistent)
|
|
3628
|
-
|
|
3737
|
+
if (grep /^rdf:Description$/, @$propList) {
|
|
3738
|
+
$parseResource = 1;
|
|
3739
|
+
# set parseType so we know this is a structure
|
|
3740
|
+
$attrs{'rdf:parseType'} = 'Resource';
|
|
3741
|
+
}
|
|
3629
3742
|
} elsif ($prop eq 'xmp:xmpmeta') {
|
|
3630
3743
|
# patch MicrosoftPhoto unconformity
|
|
3631
3744
|
$prop = 'x:xmpmeta';
|
|
@@ -3975,14 +4088,16 @@ sub ProcessXMP($$;$)
|
|
|
3975
4088
|
} elsif ($buf2 =~ /<plist[\s>]/) {
|
|
3976
4089
|
$type = 'PLIST';
|
|
3977
4090
|
}
|
|
3978
|
-
if ($isSVG and $$et{XMP_CAPTURE}) {
|
|
3979
|
-
$et->Error("ExifTool does not yet support writing of SVG images");
|
|
3980
|
-
return 0;
|
|
3981
|
-
}
|
|
3982
4091
|
}
|
|
3983
4092
|
$isXML = 1;
|
|
3984
4093
|
} elsif ($2 eq '<rdf:RDF') {
|
|
3985
4094
|
$isRDF = 1; # recognize XMP without x:xmpmeta element
|
|
4095
|
+
} elsif ($2 eq '<svg') {
|
|
4096
|
+
$isSVG = $isXML = 1;
|
|
4097
|
+
}
|
|
4098
|
+
if ($isSVG and $$et{XMP_CAPTURE}) {
|
|
4099
|
+
$et->Error("ExifTool does not yet support writing of SVG images");
|
|
4100
|
+
return 0;
|
|
3986
4101
|
}
|
|
3987
4102
|
if ($buff =~ /^\0\0/) {
|
|
3988
4103
|
$fmt = 'N'; # UTF-32 MM with or without BOM
|
|
@@ -4258,7 +4373,7 @@ information.
|
|
|
4258
4373
|
|
|
4259
4374
|
=head1 AUTHOR
|
|
4260
4375
|
|
|
4261
|
-
Copyright 2003-
|
|
4376
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
4262
4377
|
|
|
4263
4378
|
This library is free software; you can redistribute it and/or modify it
|
|
4264
4379
|
under the same terms as Perl itself.
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
# 11) http://www.extensis.com/en/support/kb_article.jsp?articleNumber=6102211
|
|
17
17
|
# 12) XMPSpecificationPart3_May2013, page 58
|
|
18
18
|
# 13) https://developer.android.com/training/camera2/Dynamic-depth-v1.0.pdf
|
|
19
|
+
# 14) http://www.iptc.org/standards/photo-metadata/iptc-standard/
|
|
19
20
|
#------------------------------------------------------------------------------
|
|
20
21
|
|
|
21
22
|
package Image::ExifTool::XMP;
|
|
@@ -530,14 +531,14 @@ my %sImageRegion = ( # new in 1.5
|
|
|
530
531
|
rRole => { Namespace => 'Iptc4xmpExt', FlatName => 'Role', List => 'Bag', Struct => \%sEntity },
|
|
531
532
|
);
|
|
532
533
|
|
|
533
|
-
# IPTC Extension namespace properties (Iptc4xmpExt) (ref 4)
|
|
534
|
+
# IPTC Extension namespace properties (Iptc4xmpExt) (ref 4, 14)
|
|
534
535
|
%Image::ExifTool::XMP::iptcExt = (
|
|
535
536
|
%xmpTableDefaults,
|
|
536
537
|
GROUPS => { 1 => 'XMP-iptcExt', 2 => 'Author' },
|
|
537
538
|
NAMESPACE => 'Iptc4xmpExt',
|
|
538
539
|
TABLE_DESC => 'XMP IPTC Extension',
|
|
539
540
|
NOTES => q{
|
|
540
|
-
This table contains tags defined by the IPTC Extension schema version 1.
|
|
541
|
+
This table contains tags defined by the IPTC Extension schema version 1.6.
|
|
541
542
|
The actual namespace prefix is "Iptc4xmpExt", but ExifTool shortens this for
|
|
542
543
|
the family 1 group name. (see
|
|
543
544
|
L<http://www.iptc.org/standards/photo-metadata/iptc-standard/>)
|
|
@@ -797,7 +798,8 @@ my %sImageRegion = ( # new in 1.5
|
|
|
797
798
|
audioBitsPerSample => { Groups => { 2 => 'Audio' }, Writable => 'integer' },
|
|
798
799
|
# new IPTC Extension schema 1.5 property
|
|
799
800
|
ImageRegion => { Groups => { 2 => 'Image' }, List => 'Bag', Struct => \%sImageRegion },
|
|
800
|
-
|
|
801
|
+
# new Extension 1.6 property
|
|
802
|
+
EventId => { Name => 'EventID', List => 'Bag' },
|
|
801
803
|
);
|
|
802
804
|
|
|
803
805
|
#------------------------------------------------------------------------------
|
|
@@ -2124,7 +2126,7 @@ This file contains definitions for less common XMP namespaces.
|
|
|
2124
2126
|
|
|
2125
2127
|
=head1 AUTHOR
|
|
2126
2128
|
|
|
2127
|
-
Copyright 2003-
|
|
2129
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
2128
2130
|
|
|
2129
2131
|
This library is free software; you can redistribute it and/or modify it
|
|
2130
2132
|
under the same terms as Perl itself.
|
|
@@ -634,15 +634,14 @@ sub RestoreStruct($;$)
|
|
|
634
634
|
local $_;
|
|
635
635
|
my ($et, $keepFlat) = @_;
|
|
636
636
|
my ($key, %structs, %var, %lists, $si, %listKeys, @siList);
|
|
637
|
-
my $ex = $$et{TAG_EXTRA};
|
|
638
637
|
my $valueHash = $$et{VALUE};
|
|
639
638
|
my $fileOrder = $$et{FILE_ORDER};
|
|
640
639
|
my $tagExtra = $$et{TAG_EXTRA};
|
|
641
640
|
foreach $key (keys %{$$et{TAG_INFO}}) {
|
|
642
|
-
$$
|
|
643
|
-
my $structProps = $$
|
|
644
|
-
delete $$
|
|
645
|
-
my $tagInfo = $$et{TAG_INFO}{$key};
|
|
641
|
+
$$tagExtra{$key} or next;
|
|
642
|
+
my $structProps = $$tagExtra{$key}{Struct} or next;
|
|
643
|
+
delete $$tagExtra{$key}{Struct}; # (don't re-use)
|
|
644
|
+
my $tagInfo = $$et{TAG_INFO}{$key}; # tagInfo for flattened tag
|
|
646
645
|
my $table = $$tagInfo{Table};
|
|
647
646
|
my $prop = shift @$structProps;
|
|
648
647
|
my $tag = $$prop[0];
|
|
@@ -829,8 +828,23 @@ sub RestoreStruct($;$)
|
|
|
829
828
|
$var{$_} and push @siList, $_ foreach keys %structs;
|
|
830
829
|
# save new structures in the same order they were read from file
|
|
831
830
|
foreach $si (sort { $var{$a}[1] <=> $var{$b}[1] } @siList) {
|
|
832
|
-
|
|
833
|
-
|
|
831
|
+
# test to see if a tag for this structure has already been generated
|
|
832
|
+
# (this could happen only if one of the structures in a list was empty)
|
|
833
|
+
$key = $var{$si}[0]{Name};
|
|
834
|
+
my $found;
|
|
835
|
+
if ($$valueHash{$key}) {
|
|
836
|
+
my @keys = grep /^$key( \(\d+\))?$/, keys %$valueHash;
|
|
837
|
+
foreach $key (@keys) {
|
|
838
|
+
next unless $$valueHash{$key} eq $structs{$si};
|
|
839
|
+
$found = 1;
|
|
840
|
+
last;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
unless ($found) {
|
|
844
|
+
# otherwise, generate a new tag for this structure
|
|
845
|
+
$key = $et->FoundTag($var{$si}[0], '');
|
|
846
|
+
$$valueHash{$key} = $structs{$si};
|
|
847
|
+
}
|
|
834
848
|
$$fileOrder{$key} = $var{$si}[1];
|
|
835
849
|
}
|
|
836
850
|
}
|
|
@@ -855,7 +869,7 @@ information.
|
|
|
855
869
|
|
|
856
870
|
=head1 AUTHOR
|
|
857
871
|
|
|
858
|
-
Copyright 2003-
|
|
872
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
859
873
|
|
|
860
874
|
This library is free software; you can redistribute it and/or modify it
|
|
861
875
|
under the same terms as Perl itself.
|
|
@@ -19,7 +19,7 @@ use strict;
|
|
|
19
19
|
use vars qw($VERSION $warnString);
|
|
20
20
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
|
|
22
|
-
$VERSION = '1.
|
|
22
|
+
$VERSION = '1.27';
|
|
23
23
|
|
|
24
24
|
sub WarnProc($) { $warnString = $_[0]; }
|
|
25
25
|
|
|
@@ -125,6 +125,7 @@ my %iWorkType = (
|
|
|
125
125
|
Name => 'ZipFileName',
|
|
126
126
|
Format => 'string[$$self{ZipFileNameLength}]',
|
|
127
127
|
},
|
|
128
|
+
_com => 'ZipFileComment',
|
|
128
129
|
);
|
|
129
130
|
|
|
130
131
|
# GNU ZIP tags (ref 3)
|
|
@@ -380,6 +381,8 @@ sub HandleMember($$;$)
|
|
|
380
381
|
$et->HandleTag($tagTablePtr, 9, $member->compressedSize());
|
|
381
382
|
$et->HandleTag($tagTablePtr, 11, $member->uncompressedSize());
|
|
382
383
|
$et->HandleTag($tagTablePtr, 15, $member->fileName());
|
|
384
|
+
my $com = $member->fileComment();
|
|
385
|
+
$et->HandleTag($tagTablePtr, '_com', $com) if defined $com and length $com;
|
|
383
386
|
}
|
|
384
387
|
|
|
385
388
|
#------------------------------------------------------------------------------
|
|
@@ -448,6 +451,10 @@ sub ProcessZIP($$)
|
|
|
448
451
|
$et->Warn("$err reading ZIP file");
|
|
449
452
|
last;
|
|
450
453
|
}
|
|
454
|
+
# extract zip file comment
|
|
455
|
+
my $comment = $zip->zipfileComment();
|
|
456
|
+
$et->FoundTag(Comment => $comment) if defined $comment and length $comment;
|
|
457
|
+
|
|
451
458
|
$$dirInfo{ZIP} = $zip;
|
|
452
459
|
|
|
453
460
|
# check for an Office Open file (DOCX, etc)
|
|
@@ -655,6 +662,7 @@ sub ProcessZIP($$)
|
|
|
655
662
|
DataLen => 30 + $len,
|
|
656
663
|
DirStart => 0,
|
|
657
664
|
DirLen => 30 + $len,
|
|
665
|
+
MixedTags => 1, # (to ignore FileComment tag)
|
|
658
666
|
);
|
|
659
667
|
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
660
668
|
my $flags = Get16u(\$buff, 6);
|
|
@@ -700,7 +708,7 @@ Electronic Publication (EPUB), and Sketch design files (SKETCH).
|
|
|
700
708
|
|
|
701
709
|
=head1 AUTHOR
|
|
702
710
|
|
|
703
|
-
Copyright 2003-
|
|
711
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
704
712
|
|
|
705
713
|
This library is free software; you can redistribute it and/or modify it
|
|
706
714
|
under the same terms as Perl itself.
|
|
@@ -220,7 +220,7 @@ metadata from Zeiss Integrated Software RAW (ZISRAW) CZI files.
|
|
|
220
220
|
|
|
221
221
|
=head1 AUTHOR
|
|
222
222
|
|
|
223
|
-
Copyright 2003-
|
|
223
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
224
224
|
|
|
225
225
|
This library is free software; you can redistribute it and/or modify it
|
|
226
226
|
under the same terms as Perl itself.
|
|
@@ -215,7 +215,7 @@ information from Apple iWork '09 XML+ZIP files.
|
|
|
215
215
|
|
|
216
216
|
=head1 AUTHOR
|
|
217
217
|
|
|
218
|
-
Copyright 2003-
|
|
218
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
219
219
|
|
|
220
220
|
This library is free software; you can redistribute it and/or modify it
|
|
221
221
|
under the same terms as Perl itself.
|