exiftool_vendored 12.50.0 → 12.52.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.
- checksums.yaml +4 -4
- data/bin/Changes +39 -2
- data/bin/MANIFEST +2 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +5 -4
- data/bin/lib/Image/ExifTool/Casio.pm +3 -3
- data/bin/lib/Image/ExifTool/FLIR.pm +6 -5
- data/bin/lib/Image/ExifTool/GPS.pm +11 -5
- data/bin/lib/Image/ExifTool/Geotag.pm +12 -4
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -0
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +24 -3
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +6015 -759
- data/bin/lib/Image/ExifTool/Lang/sk.pm +1927 -0
- data/bin/lib/Image/ExifTool/Matroska.pm +261 -45
- data/bin/lib/Image/ExifTool/Nikon.pm +470 -272
- data/bin/lib/Image/ExifTool/NikonCustom.pm +139 -106
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -2
- data/bin/lib/Image/ExifTool/PNG.pm +8 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +4 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +44 -11
- data/bin/lib/Image/ExifTool/README +2 -1
- data/bin/lib/Image/ExifTool/Sony.pm +4 -4
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +11 -6
- data/bin/lib/Image/ExifTool/TagLookup.pm +4543 -4491
- data/bin/lib/Image/ExifTool/TagNames.pod +227 -37
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +12 -7
- data/bin/lib/Image/ExifTool/WriteXMP.pl +15 -1
- data/bin/lib/Image/ExifTool/Writer.pl +33 -13
- data/bin/lib/Image/ExifTool/ZIP.pm +19 -7
- data/bin/lib/Image/ExifTool.pm +36 -15
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -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 26197 tags, with 16717 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
|
|
@@ -14436,6 +14436,8 @@ These tags are extracted from encrypted data in images from the Z9.
|
|
|
14436
14436
|
60143 PitchAngle fixed32u
|
|
14437
14437
|
60147 YawAngle fixed32u
|
|
14438
14438
|
60491 MenuSettingsZ9 Nikon MenuSettingsZ9
|
|
14439
|
+
-
|
|
14440
|
+
Nikon MenuSettingsZ9Firmware3
|
|
14439
14441
|
|
|
14440
14442
|
=head3 Nikon MenuSettingsZ9 Tags
|
|
14441
14443
|
|
|
@@ -14513,6 +14515,79 @@ These tags are used by the Z9.
|
|
|
14513
14515
|
1636 USBPowerDelivery? int8u
|
|
14514
14516
|
1645 SensorShield? int8u
|
|
14515
14517
|
|
|
14518
|
+
=head3 Nikon MenuSettingsZ9Firmware3 Tags
|
|
14519
|
+
|
|
14520
|
+
These tags are used by the Z9 firmware 3.00.
|
|
14521
|
+
|
|
14522
|
+
Index1 Tag Name Writable
|
|
14523
|
+
--------------- --------
|
|
14524
|
+
154 MultipleExposureMode int8u
|
|
14525
|
+
156 MultiExposureShots int8u
|
|
14526
|
+
204 Intervals int32u
|
|
14527
|
+
208 ShotsPerInterval int32u
|
|
14528
|
+
248 FocusShiftNumberShots int8u
|
|
14529
|
+
252 FocusShiftStepWidth int8u
|
|
14530
|
+
256 FocusShiftInterval int8u~
|
|
14531
|
+
260 FocusShiftExposureLock? int8u
|
|
14532
|
+
290 PhotoShootingMenuBank int8u
|
|
14533
|
+
292 ExtendedMenuBanks int8u
|
|
14534
|
+
328 PhotoShootingMenuBankImageArea int8u
|
|
14535
|
+
342 AutoISO int8u
|
|
14536
|
+
344 ISOAutoHiLimit? int16u
|
|
14537
|
+
346 ISOAutoFlashLimit? int16u
|
|
14538
|
+
354 ISOAutoShutterTime no
|
|
14539
|
+
436 MovieVignetteControl? int8u
|
|
14540
|
+
438 DiffractionCompensation int8u
|
|
14541
|
+
440 FlickerReductionShooting int8u
|
|
14542
|
+
548 AFAreaMode int8u
|
|
14543
|
+
550 VRMode int8u
|
|
14544
|
+
554 BracketSet int8u
|
|
14545
|
+
556 BracketProgram int8u
|
|
14546
|
+
558 BracketIncrement int8u
|
|
14547
|
+
576 SecondarySlotFunction int8u
|
|
14548
|
+
592 DXCropAlert int8u
|
|
14549
|
+
594 SubjectDetection int8u
|
|
14550
|
+
636 HighFrequencyFlickerReductionShooting? int8u
|
|
14551
|
+
646 MovieImageArea? int8u & 0x01
|
|
14552
|
+
656 MovieType? int8u
|
|
14553
|
+
658 MovieISOAutoHiLimit? int16u
|
|
14554
|
+
660 MovieISOAutoControlManualMode? int8u
|
|
14555
|
+
662 MovieISOAutoManualMode? int16u
|
|
14556
|
+
736 MovieActiveD-Lighting? int8u
|
|
14557
|
+
738 MovieHighISONoiseReduction? int8u
|
|
14558
|
+
744 MovieFlickerReduction int8u
|
|
14559
|
+
746 MovieMeteringMode? int8u
|
|
14560
|
+
748 MovieFocusMode? int8u
|
|
14561
|
+
750 MovieAFAreaMode int8u
|
|
14562
|
+
752 MovieVRMode? int8u
|
|
14563
|
+
756 MovieElectronicVR? int8u
|
|
14564
|
+
758 MovieSoundRecording? int8u
|
|
14565
|
+
760 MicrophoneSensitivity? int8u
|
|
14566
|
+
762 MicrophoneAttenuator? int8u
|
|
14567
|
+
764 MicrophoneFrequencyResponse? int8u
|
|
14568
|
+
766 WindNoiseReduction? int8u
|
|
14569
|
+
788 MovieToneMap? int8u
|
|
14570
|
+
794 MovieFrameSize? int8u
|
|
14571
|
+
796 MovieFrameRate? int8u
|
|
14572
|
+
802 MicrophoneJackPower? int8u
|
|
14573
|
+
803 MovieDXCropAlert? int8u
|
|
14574
|
+
804 MovieSubjectDetection? int8u
|
|
14575
|
+
812 MovieHighResZoom? int8u
|
|
14576
|
+
847 CustomSettingsZ9 NikonCustom SettingsZ9
|
|
14577
|
+
1474 Language? int8u
|
|
14578
|
+
1476 TimeZone int8u
|
|
14579
|
+
1482 MonitorBrightness? int8u
|
|
14580
|
+
1504 AFFineTune? int8u
|
|
14581
|
+
1600 HDMIOutputResolution int8u
|
|
14582
|
+
1613 SetClockFromLocationData? int8u
|
|
14583
|
+
1620 AirplaneMode? int8u
|
|
14584
|
+
1621 EmptySlotRelease? int8u
|
|
14585
|
+
1656 EnergySavingMode? int8u
|
|
14586
|
+
1680 RecordLocationData? int8u
|
|
14587
|
+
1684 USBPowerDelivery? int8u
|
|
14588
|
+
1693 SensorShield? int8u
|
|
14589
|
+
1754 FocusShiftAutoReset? int8u
|
|
14590
|
+
|
|
14516
14591
|
=head3 Nikon ShotInfo Tags
|
|
14517
14592
|
|
|
14518
14593
|
This information is encrypted for ShotInfoVersion 02xx, and some tags are
|
|
@@ -16306,7 +16381,9 @@ Custom settings for the Z9.
|
|
|
16306
16381
|
191 UseDialWithoutHold? int8u
|
|
16307
16382
|
193 ReverseIndicators? int8u
|
|
16308
16383
|
195 MovieFunc1Button int8u
|
|
16384
|
+
199 MovieFunc2Button int8u
|
|
16309
16385
|
203 MovieAF-OnButton int8u
|
|
16386
|
+
215 MovieLensControlRing int8u
|
|
16310
16387
|
217 MovieMultiSelector? int8u
|
|
16311
16388
|
221 MovieAFSpeed int8u
|
|
16312
16389
|
223 MovieAFSpeedApply int8u
|
|
@@ -23588,6 +23665,7 @@ writes only EXIF, IPTC and XMP tags in Jpeg2000 images.
|
|
|
23588
23665
|
'bfil' BinaryFilter no
|
|
23589
23666
|
'bidb' BinaryData no
|
|
23590
23667
|
'bpcc' BitsPerComponent no
|
|
23668
|
+
'c2sh' C2PASaltHash no
|
|
23591
23669
|
'cbor' CBORData CBOR
|
|
23592
23670
|
'cdef' ComponentDefinition no
|
|
23593
23671
|
'cgrp' ColorGroup no
|
|
@@ -25710,6 +25788,7 @@ check if speed is more of a concern.
|
|
|
25710
25788
|
'acTL' AnimationControl PNG AnimationControl
|
|
25711
25789
|
'bKGD' BackgroundColor no
|
|
25712
25790
|
'cHRM' PrimaryChromaticities PNG PrimaryChromaticities
|
|
25791
|
+
'caBX' JUMBF Jpeg2000
|
|
25713
25792
|
'dSIG' DigitalSignature no
|
|
25714
25793
|
'eXIf' eXIf EXIF
|
|
25715
25794
|
'fRAc' FractalParameters no
|
|
@@ -27543,64 +27622,64 @@ View Camera Motion Metadata of MP4 videos. See
|
|
|
27543
27622
|
L<https://developers.google.com/streetview/publish/camm-spec> for the
|
|
27544
27623
|
specification.
|
|
27545
27624
|
|
|
27546
|
-
|
|
27625
|
+
Tag ID Tag Name Writable
|
|
27547
27626
|
------ -------- --------
|
|
27548
|
-
|
|
27627
|
+
0x0004 AngleAxis no
|
|
27549
27628
|
|
|
27550
27629
|
=head3 QuickTime camm1 Tags
|
|
27551
27630
|
|
|
27552
|
-
|
|
27631
|
+
Tag ID Tag Name Writable
|
|
27553
27632
|
------ -------- --------
|
|
27554
|
-
|
|
27555
|
-
|
|
27633
|
+
0x0004 PixelExposureTime no
|
|
27634
|
+
0x0008 RollingShutterSkewTime no
|
|
27556
27635
|
|
|
27557
27636
|
=head3 QuickTime camm2 Tags
|
|
27558
27637
|
|
|
27559
|
-
|
|
27638
|
+
Tag ID Tag Name Writable
|
|
27560
27639
|
------ -------- --------
|
|
27561
|
-
|
|
27640
|
+
0x0004 AngularVelocity no
|
|
27562
27641
|
|
|
27563
27642
|
=head3 QuickTime camm3 Tags
|
|
27564
27643
|
|
|
27565
|
-
|
|
27644
|
+
Tag ID Tag Name Writable
|
|
27566
27645
|
------ -------- --------
|
|
27567
|
-
|
|
27646
|
+
0x0004 Acceleration no
|
|
27568
27647
|
|
|
27569
27648
|
=head3 QuickTime camm4 Tags
|
|
27570
27649
|
|
|
27571
|
-
|
|
27650
|
+
Tag ID Tag Name Writable
|
|
27572
27651
|
------ -------- --------
|
|
27573
|
-
|
|
27652
|
+
0x0004 Position no
|
|
27574
27653
|
|
|
27575
27654
|
=head3 QuickTime camm5 Tags
|
|
27576
27655
|
|
|
27577
|
-
|
|
27656
|
+
Tag ID Tag Name Writable
|
|
27578
27657
|
------ -------- --------
|
|
27579
|
-
|
|
27580
|
-
|
|
27581
|
-
|
|
27658
|
+
0x0004 GPSLatitude no
|
|
27659
|
+
0x000c GPSLongitude no
|
|
27660
|
+
0x0014 GPSAltitude no
|
|
27582
27661
|
|
|
27583
27662
|
=head3 QuickTime camm6 Tags
|
|
27584
27663
|
|
|
27585
|
-
|
|
27664
|
+
Tag ID Tag Name Writable
|
|
27586
27665
|
------ -------- --------
|
|
27587
|
-
|
|
27588
|
-
|
|
27589
|
-
|
|
27590
|
-
|
|
27591
|
-
|
|
27592
|
-
|
|
27593
|
-
|
|
27594
|
-
|
|
27595
|
-
|
|
27596
|
-
|
|
27597
|
-
|
|
27666
|
+
0x0004 GPSDateTime no
|
|
27667
|
+
0x000c GPSMeasureMode no
|
|
27668
|
+
0x0010 GPSLatitude no
|
|
27669
|
+
0x0018 GPSLongitude no
|
|
27670
|
+
0x0020 GPSAltitude no
|
|
27671
|
+
0x0024 GPSHorizontalAccuracy no
|
|
27672
|
+
0x0028 GPSVerticalAccuracy no
|
|
27673
|
+
0x002c GPSVelocityEast no
|
|
27674
|
+
0x0030 GPSVelocityNorth no
|
|
27675
|
+
0x0034 GPSVelocityUp no
|
|
27676
|
+
0x0038 GPSSpeedAccuracy no
|
|
27598
27677
|
|
|
27599
27678
|
=head3 QuickTime camm7 Tags
|
|
27600
27679
|
|
|
27601
|
-
|
|
27680
|
+
Tag ID Tag Name Writable
|
|
27602
27681
|
------ -------- --------
|
|
27603
|
-
|
|
27682
|
+
0x0004 MagneticField no
|
|
27604
27683
|
|
|
27605
27684
|
=head3 QuickTime marl Tags
|
|
27606
27685
|
|
|
@@ -27880,7 +27959,7 @@ QuickTimeHandler option may be set to 0 to avoid this.
|
|
|
27880
27959
|
'pcst' Podcast int8s
|
|
27881
27960
|
'perf' Performer string
|
|
27882
27961
|
'pgap' PlayGap int8s
|
|
27883
|
-
'plID' PlayListID int32s[
|
|
27962
|
+
'plID' PlayListID int32s[2]
|
|
27884
27963
|
'prID' ProductID string
|
|
27885
27964
|
'purd' PurchaseDate string
|
|
27886
27965
|
'purl' PodcastURL string
|
|
@@ -30319,7 +30398,7 @@ Matroska specification.
|
|
|
30319
30398
|
0x037e ChapterCountry no
|
|
30320
30399
|
0x0444 SegmentFamily? no
|
|
30321
30400
|
0x0461 DateTimeOriginal no
|
|
30322
|
-
0x047a
|
|
30401
|
+
0x047a TagLanguageBCP47 no
|
|
30323
30402
|
0x0484 TagDefault no
|
|
30324
30403
|
0x0485 TagBinary no
|
|
30325
30404
|
0x0487 TagString no
|
|
@@ -30377,10 +30456,10 @@ Matroska specification.
|
|
|
30377
30456
|
0x23a2 CodecPrivate? no
|
|
30378
30457
|
0x23c0 Targets Matroska
|
|
30379
30458
|
0x23c3 ChapterPhysicalEquivalent no
|
|
30380
|
-
0x23c4 TagChapterUID
|
|
30381
|
-
0x23c5 TagTrackUID
|
|
30382
|
-
0x23c6 TagAttachmentUID
|
|
30383
|
-
0x23c9 TagEditionUID
|
|
30459
|
+
0x23c4 TagChapterUID no
|
|
30460
|
+
0x23c5 TagTrackUID no
|
|
30461
|
+
0x23c6 TagAttachmentUID no
|
|
30462
|
+
0x23c9 TagEditionUID no
|
|
30384
30463
|
0x23ca TargetType no
|
|
30385
30464
|
0x2532 SignedElement? no
|
|
30386
30465
|
0x2624 TrackTranslate Matroska
|
|
@@ -30408,7 +30487,7 @@ Matroska specification.
|
|
|
30408
30487
|
0x3384 SegmentFileName no
|
|
30409
30488
|
0x33a4 SegmentUID? no
|
|
30410
30489
|
0x33c4 ChapterUID? no
|
|
30411
|
-
0x33c5 TrackUID
|
|
30490
|
+
0x33c5 TrackUID no
|
|
30412
30491
|
0x3446 TrackAttachmentUID no
|
|
30413
30492
|
0x35a1 BlockAdditions Matroska
|
|
30414
30493
|
0x38b5 OutputAudioSampleRate no
|
|
@@ -30468,6 +30547,116 @@ for the specification.
|
|
|
30468
30547
|
0x7674 ProjectionPosePitch no
|
|
30469
30548
|
0x7675 ProjectionPoseRoll no
|
|
30470
30549
|
|
|
30550
|
+
=head3 Matroska Tags
|
|
30551
|
+
|
|
30552
|
+
Standardized Matroska tags (see
|
|
30553
|
+
L<https://www.matroska.org/technical/tagging.html>).
|
|
30554
|
+
|
|
30555
|
+
Tag ID Tag Name Writable
|
|
30556
|
+
------ -------- --------
|
|
30557
|
+
'ACCOMPANIMENT' Accompaniment no
|
|
30558
|
+
'ACTOR' Actor no
|
|
30559
|
+
'ADDRESS' Address no
|
|
30560
|
+
'ARRANGER' Arranger no
|
|
30561
|
+
'ARTIST' Artist no
|
|
30562
|
+
'ART_DIRECTOR' ArtDirector no
|
|
30563
|
+
'ASSISTANT_DIRECTOR' AssistantDirector no
|
|
30564
|
+
'BARCODE' Barcode no
|
|
30565
|
+
'BPM' BPM no
|
|
30566
|
+
'BPS' BPS no
|
|
30567
|
+
'CATALOG_NUMBER' CatalogNumber no
|
|
30568
|
+
'CHARACTER' Character no
|
|
30569
|
+
'CHOREGRAPHER' Choregrapher no
|
|
30570
|
+
'COMMENT' Comment no
|
|
30571
|
+
'COMPOSER' Composer no
|
|
30572
|
+
'COMPOSER_NATIONALITY' ComposerNationality no
|
|
30573
|
+
'COMPOSITION_LOCATION' CompositionLocation no
|
|
30574
|
+
'CONDUCTOR' Conductor no
|
|
30575
|
+
'CONTENT_TYPE' ContentType no
|
|
30576
|
+
'COPRODUCER' Coproducer no
|
|
30577
|
+
'COPYRIGHT' Copyright no
|
|
30578
|
+
'COSTUME_DESIGNER' CostumeDesigner no
|
|
30579
|
+
'COUNTRY' Country no
|
|
30580
|
+
'DATE_DIGITIZED' CreateDate no
|
|
30581
|
+
'DATE_ENCODED' DateEncoded no
|
|
30582
|
+
'DATE_PURCHASED' DatePurchased no
|
|
30583
|
+
'DATE_RECORDED' DateTimeOriginal no
|
|
30584
|
+
'DATE_RELEASED' DateReleased no
|
|
30585
|
+
'DATE_TAGGED' DateTagged no
|
|
30586
|
+
'DATE_WRITTEN' DateWritten no
|
|
30587
|
+
'DESCRIPTION' Description no
|
|
30588
|
+
'DIRECTOR' Director no
|
|
30589
|
+
'DIRECTOR_OF_PHOTOGRAPHY'
|
|
30590
|
+
DirectorOfPhotography no
|
|
30591
|
+
'DISTRIBUTED_BY' DistributedBy no
|
|
30592
|
+
'EDITED_BY' EditedBy no
|
|
30593
|
+
'EMAIL' Email no
|
|
30594
|
+
'ENCODED_BY' EncodedBy no
|
|
30595
|
+
'ENCODER' Encoder no
|
|
30596
|
+
'ENCODER_SETTINGS' EncoderSettings no
|
|
30597
|
+
'EXECUTIVE_PRODUCER' ExecutiveProducer no
|
|
30598
|
+
'FAX' FAX no
|
|
30599
|
+
'FPS' FPS no
|
|
30600
|
+
'GENRE' Genre no
|
|
30601
|
+
'IMDB' IMDB no
|
|
30602
|
+
'INITIAL_KEY' InitialKey no
|
|
30603
|
+
'INSTRUMENTS' Instruments no
|
|
30604
|
+
'ISBN' ISBN no
|
|
30605
|
+
'ISRC' ISRC no
|
|
30606
|
+
'KEYWORDS' Keywords no
|
|
30607
|
+
'LABEL' Label no
|
|
30608
|
+
'LABEL_CODE' LabelCode no
|
|
30609
|
+
'LAW_RATING' LawRating no
|
|
30610
|
+
'LCCN' Lccn no
|
|
30611
|
+
'LEAD_PERFORMER' LeadPerformer no
|
|
30612
|
+
'LICENSE' License no
|
|
30613
|
+
'LYRICIST' Lyricist no
|
|
30614
|
+
'LYRICS' Lyrics no
|
|
30615
|
+
'MASTERED_BY' MasteredBy no
|
|
30616
|
+
'MCDI' MCDI no
|
|
30617
|
+
'MEASURE' Measure no
|
|
30618
|
+
'MIXED_BY' MixedBy no
|
|
30619
|
+
'MOOD' Mood no
|
|
30620
|
+
'ORIGINAL' Original no
|
|
30621
|
+
'ORIGINAL_MEDIA_TYPE' OriginalMediaType no
|
|
30622
|
+
'PART_NUMBER' PartNumber no
|
|
30623
|
+
'PART_OFFSET' PartOffset no
|
|
30624
|
+
'PERIOD' Period no
|
|
30625
|
+
'PHONE' Phone no
|
|
30626
|
+
'PLAY_COUNTER' PlayCounter no
|
|
30627
|
+
'PRODUCER' Producer no
|
|
30628
|
+
'PRODUCTION_COPYRIGHT' ProductionCopyright no
|
|
30629
|
+
'PRODUCTION_DESIGNER' ProductionDesigner no
|
|
30630
|
+
'PRODUCTION_STUDIO' ProductionStudio no
|
|
30631
|
+
'PUBLISHER' Publisher no
|
|
30632
|
+
'PURCHASE_CURRENCY' PurchaseCurrency no
|
|
30633
|
+
'PURCHASE_INFO' PurchaseInfo no
|
|
30634
|
+
'PURCHASE_ITEM' PurchaseItem no
|
|
30635
|
+
'PURCHASE_OWNER' PurchaseOwner no
|
|
30636
|
+
'PURCHASE_PRICE' PurchasePrice no
|
|
30637
|
+
'RATING' Rating no
|
|
30638
|
+
'RECORDING_LOCATION' RecordingLocation no
|
|
30639
|
+
'REMIXED_BY' RemixedBy no
|
|
30640
|
+
'REPLAYGAIN_GAIN' ReplaygainGain no
|
|
30641
|
+
'REPLAYGAIN_PEAK' ReplaygainPeak no
|
|
30642
|
+
'SAMPLE' Sample no
|
|
30643
|
+
'SCREENPLAY_BY' ScreenplayBy no
|
|
30644
|
+
'SORT_WITH' SortWith no
|
|
30645
|
+
'SOUND_ENGINEER' SoundEngineer no
|
|
30646
|
+
'SUBJECT' Subject no
|
|
30647
|
+
'SUBTITLE' Subtitle no
|
|
30648
|
+
'SUMMARY' Summary no
|
|
30649
|
+
'SYNOPSIS' Synopsis no
|
|
30650
|
+
'TERMS_OF_USE' TermsOfUse no
|
|
30651
|
+
'THANKS_TO' ThanksTo no
|
|
30652
|
+
'TITLE' Title no
|
|
30653
|
+
'TMDB' TMDB no
|
|
30654
|
+
'TOTAL_PARTS' TotalParts no
|
|
30655
|
+
'TUNING' Tuning no
|
|
30656
|
+
'TVDB' TVDB no
|
|
30657
|
+
'URL' URL no
|
|
30658
|
+
'WRITTEN_BY' WrittenBy no
|
|
30659
|
+
|
|
30471
30660
|
=head2 MOI Tags
|
|
30472
30661
|
|
|
30473
30662
|
MOI files store information about associated MOD or TOD files, and are
|
|
@@ -37487,6 +37676,7 @@ FileName.
|
|
|
37487
37676
|
ProcessingTime ExifTool no
|
|
37488
37677
|
RAFVersion File no
|
|
37489
37678
|
ResourceForkSize System no
|
|
37679
|
+
SphericalVideoXML GSpherical yes!
|
|
37490
37680
|
SymLink - yes!
|
|
37491
37681
|
TestName - yes!
|
|
37492
37682
|
ThumbnailImage File no
|
|
@@ -306,14 +306,17 @@ sub CheckQTValue($$$)
|
|
|
306
306
|
|
|
307
307
|
#------------------------------------------------------------------------------
|
|
308
308
|
# Format QuickTime value for writing
|
|
309
|
-
# Inputs: 0) ExifTool ref, 1) value ref, 2)
|
|
310
|
-
# Returns: Flags for QT data type, and reformats value as required
|
|
309
|
+
# Inputs: 0) ExifTool ref, 1) value ref, 2) tagInfo ref, 3) Format (or undef)
|
|
310
|
+
# Returns: Flags for QT data type, and reformats value as required (sets to undef on error)
|
|
311
311
|
sub FormatQTValue($$;$$)
|
|
312
312
|
{
|
|
313
|
-
my ($et, $valPt, $
|
|
313
|
+
my ($et, $valPt, $tagInfo, $format) = @_;
|
|
314
|
+
my $writable = $$tagInfo{Writable};
|
|
315
|
+
my $count = $$tagInfo{Count};
|
|
314
316
|
my $flags;
|
|
317
|
+
$format or $format = $$tagInfo{Format};
|
|
315
318
|
if ($format and $format ne 'string' or not $format and $writable and $writable ne 'string') {
|
|
316
|
-
$$valPt = WriteValue($$valPt, $format || $writable);
|
|
319
|
+
$$valPt = WriteValue($$valPt, $format || $writable, $count);
|
|
317
320
|
if ($writable and $qtFormat{$writable}) {
|
|
318
321
|
$flags = $qtFormat{$writable};
|
|
319
322
|
} else {
|
|
@@ -329,6 +332,7 @@ sub FormatQTValue($$;$$)
|
|
|
329
332
|
$flags = 0x01; # UTF8
|
|
330
333
|
$$valPt = $et->Encode($$valPt, 'UTF8');
|
|
331
334
|
}
|
|
335
|
+
defined $$valPt or $et->WarnOnce("Error converting value for $$tagInfo{Name}");
|
|
332
336
|
return $flags;
|
|
333
337
|
}
|
|
334
338
|
|
|
@@ -1139,7 +1143,7 @@ sub WriteQuickTime($$$)
|
|
|
1139
1143
|
my $newVal = $et->GetNewValue($nvHash);
|
|
1140
1144
|
next unless defined $newVal;
|
|
1141
1145
|
my $prVal = $newVal;
|
|
1142
|
-
my $flags = FormatQTValue($et, \$newVal, $
|
|
1146
|
+
my $flags = FormatQTValue($et, \$newVal, $tagInfo, $format);
|
|
1143
1147
|
next unless defined $newVal;
|
|
1144
1148
|
my ($ctry, $lang) = (0, 0);
|
|
1145
1149
|
if ($$ti{LangCode}) {
|
|
@@ -1220,7 +1224,8 @@ sub WriteQuickTime($$$)
|
|
|
1220
1224
|
}
|
|
1221
1225
|
my $prVal = $newVal;
|
|
1222
1226
|
# format new value for writing (and get new flags)
|
|
1223
|
-
$flags = FormatQTValue($et, \$newVal, $
|
|
1227
|
+
$flags = FormatQTValue($et, \$newVal, $tagInfo, $format);
|
|
1228
|
+
next unless defined $newVal;
|
|
1224
1229
|
my $grp = $et->GetGroup($langInfo, 1);
|
|
1225
1230
|
$et->VerboseValue("- $grp:$$langInfo{Name}", $val);
|
|
1226
1231
|
$et->VerboseValue("+ $grp:$$langInfo{Name}", $prVal);
|
|
@@ -1463,7 +1468,7 @@ sub WriteQuickTime($$$)
|
|
|
1463
1468
|
my $newVal = $et->GetNewValue($nvHash);
|
|
1464
1469
|
next unless defined $newVal;
|
|
1465
1470
|
my $prVal = $newVal;
|
|
1466
|
-
my $flags = FormatQTValue($et, \$newVal,
|
|
1471
|
+
my $flags = FormatQTValue($et, \$newVal, $tagInfo);
|
|
1467
1472
|
next unless defined $newVal;
|
|
1468
1473
|
my ($ctry, $lang) = (0, 0);
|
|
1469
1474
|
# handle alternate languages
|
|
@@ -561,7 +561,21 @@ sub AddStructType($$$$;$)
|
|
|
561
561
|
}
|
|
562
562
|
|
|
563
563
|
#------------------------------------------------------------------------------
|
|
564
|
-
#
|
|
564
|
+
# Process SphericalVideoXML (see XMP-GSpherical tags documentation)
|
|
565
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
566
|
+
# Returns: SphericalVideoXML data
|
|
567
|
+
sub ProcessGSpherical($$$)
|
|
568
|
+
{
|
|
569
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
570
|
+
# extract SphericalVideoXML as a block if requested
|
|
571
|
+
if ($$et{REQ_TAG_LOOKUP}{sphericalvideoxml}) {
|
|
572
|
+
$et->FoundTag(SphericalVideoXML => substr(${$$dirInfo{DataPt}}, 16));
|
|
573
|
+
}
|
|
574
|
+
return Image::ExifTool::XMP::ProcessXMP($et, $dirInfo, $tagTablePtr);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
#------------------------------------------------------------------------------
|
|
578
|
+
# Hack to use XMP writer for SphericalVideoXML (see XMP-GSpherical tags documentation)
|
|
565
579
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
566
580
|
# Returns: SphericalVideoXML data
|
|
567
581
|
sub WriteGSpherical($$$)
|
|
@@ -707,9 +707,13 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
707
707
|
$writeGroup or $writeGroup = $group0;
|
|
708
708
|
# get priority for this group
|
|
709
709
|
unless ($priority) {
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
710
|
+
if ($$tagInfo{Avoid} and $$tagInfo{WriteAlso}) {
|
|
711
|
+
$priority = 0;
|
|
712
|
+
} else {
|
|
713
|
+
$priority = $$self{WRITE_PRIORITY}{lc($writeGroup)};
|
|
714
|
+
unless ($priority) {
|
|
715
|
+
$priority = $$self{WRITE_PRIORITY}{lc($group0)} || 0;
|
|
716
|
+
}
|
|
713
717
|
}
|
|
714
718
|
}
|
|
715
719
|
# adjust priority based on Preferred level for this tag
|
|
@@ -830,6 +834,8 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
830
834
|
$tag = $$tagInfo{Name}; # get tag name for warnings
|
|
831
835
|
my $lcTag = lc $tag;
|
|
832
836
|
my $pref = $preferred{$lcTag} || { };
|
|
837
|
+
# don't write Avoid-ed tags with side effect unless preferred
|
|
838
|
+
next if not $$pref{$tagInfo} and $$tagInfo{Avoid} and $$tagInfo{WriteAlso};
|
|
833
839
|
my $shift = $options{Shift};
|
|
834
840
|
my $addValue = $options{AddValue};
|
|
835
841
|
if (defined $shift) {
|
|
@@ -971,6 +977,7 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
971
977
|
$self->GetNewValueHash($tagInfo, $writeGroup, 'delete', $options{ProtectSaved});
|
|
972
978
|
# also delete related tag previous new values
|
|
973
979
|
if ($$tagInfo{WriteAlso}) {
|
|
980
|
+
$$self{INDENT2} = '+';
|
|
974
981
|
my ($wgrp, $wtag);
|
|
975
982
|
if ($$tagInfo{WriteGroup} and $$tagInfo{WriteGroup} eq 'All' and $writeGroup) {
|
|
976
983
|
$wgrp = $writeGroup . ':';
|
|
@@ -981,6 +988,7 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
981
988
|
my ($n,$e) = $self->SetNewValue($wgrp . $wtag, undef, Replace=>2);
|
|
982
989
|
$numSet += $n;
|
|
983
990
|
}
|
|
991
|
+
$$self{INDENT2} = '';
|
|
984
992
|
}
|
|
985
993
|
$options{Replace} == 2 and ++$numSet, next;
|
|
986
994
|
}
|
|
@@ -1022,7 +1030,7 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
1022
1030
|
require 'Image/ExifTool/XMPStruct.pl';
|
|
1023
1031
|
$_ = Image::ExifTool::XMP::SerializeStruct($_);
|
|
1024
1032
|
}
|
|
1025
|
-
print $out "$verb $wgrp1:$tag$fromList if value is '${_}'\n";
|
|
1033
|
+
print $out "$$self{INDENT2}$verb $wgrp1:$tag$fromList if value is '${_}'\n";
|
|
1026
1034
|
}
|
|
1027
1035
|
}
|
|
1028
1036
|
}
|
|
@@ -1086,15 +1094,25 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
1086
1094
|
push @{$$nvHash{Value}}, ref $val eq 'ARRAY' ? @$val : $val;
|
|
1087
1095
|
}
|
|
1088
1096
|
if ($verbose > 1) {
|
|
1089
|
-
my $ifExists
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1097
|
+
my $ifExists;
|
|
1098
|
+
if ($$tagInfo{IsComposite}) {
|
|
1099
|
+
# (composite tags don't technically exist in the file)
|
|
1100
|
+
if ($$tagInfo{WriteAlso}) {
|
|
1101
|
+
$ifExists = ' (+' . join(',+',sort keys %{$$tagInfo{WriteAlso}}) . '):';
|
|
1102
|
+
} else {
|
|
1103
|
+
$ifExists = '';
|
|
1104
|
+
}
|
|
1105
|
+
} else {
|
|
1106
|
+
$ifExists = $$nvHash{IsCreating} ? ( $createOnly ?
|
|
1107
|
+
($$nvHash{IsCreating} == 2 ?
|
|
1108
|
+
" if $writeGroup exists and tag doesn't" :
|
|
1109
|
+
" if tag doesn't exist") :
|
|
1110
|
+
($$nvHash{IsCreating} == 2 ? " if $writeGroup exists" : '')) :
|
|
1094
1111
|
(($$nvHash{DelValue} and @{$$nvHash{DelValue}}) ?
|
|
1095
|
-
|
|
1112
|
+
' if tag was deleted' : ' if tag exists');
|
|
1113
|
+
}
|
|
1096
1114
|
my $verb = ($shift ? 'Shifting' : ($addValue ? 'Adding' : 'Writing'));
|
|
1097
|
-
print $out "$verb $wgrp1:$tag$ifExists\n";
|
|
1115
|
+
print $out "$$self{INDENT2}$verb $wgrp1:$tag$ifExists\n";
|
|
1098
1116
|
}
|
|
1099
1117
|
}
|
|
1100
1118
|
} elsif ($permanent) {
|
|
@@ -1109,7 +1127,7 @@ TAG: foreach $tagInfo (@matchingTags) {
|
|
|
1109
1127
|
$self->GetNewValueHash($tagInfo, $writeGroup, 'delete');
|
|
1110
1128
|
my $nvHash = $self->GetNewValueHash($tagInfo, $writeGroup, 'create');
|
|
1111
1129
|
$$nvHash{WantGroup} = $wantGroup;
|
|
1112
|
-
$verbose > 1 and print $out "Deleting $wgrp1:$tag\n";
|
|
1130
|
+
$verbose > 1 and print $out "$$self{INDENT2}Deleting $wgrp1:$tag\n";
|
|
1113
1131
|
}
|
|
1114
1132
|
$$setTags{$tagInfo} = 1 if $setTags;
|
|
1115
1133
|
$prioritySet = 1 if $$pref{$tagInfo};
|
|
@@ -1118,6 +1136,7 @@ WriteAlso:
|
|
|
1118
1136
|
# also write related tags
|
|
1119
1137
|
my $writeAlso = $$tagInfo{WriteAlso};
|
|
1120
1138
|
if ($writeAlso) {
|
|
1139
|
+
$$self{INDENT2} = '+'; # indicate related tag with a leading "+"
|
|
1121
1140
|
my ($wgrp, $wtag, $n);
|
|
1122
1141
|
if ($$tagInfo{WriteGroup} and $$tagInfo{WriteGroup} eq 'All' and $writeGroup) {
|
|
1123
1142
|
$wgrp = $writeGroup . ':';
|
|
@@ -1137,7 +1156,7 @@ WriteAlso:
|
|
|
1137
1156
|
SetTags => \%alsoWrote, # remember tags already written
|
|
1138
1157
|
);
|
|
1139
1158
|
undef $evalWarning;
|
|
1140
|
-
#### eval WriteAlso ($val)
|
|
1159
|
+
#### eval WriteAlso ($val,%opts)
|
|
1141
1160
|
my $v = eval $$writeAlso{$wtag};
|
|
1142
1161
|
# we wanted to do the eval in case there are side effect, but we
|
|
1143
1162
|
# don't want to write a value for a tag that is being deleted:
|
|
@@ -1159,6 +1178,7 @@ WriteAlso:
|
|
|
1159
1178
|
}
|
|
1160
1179
|
}
|
|
1161
1180
|
}
|
|
1181
|
+
$$self{INDENT2} = '';
|
|
1162
1182
|
}
|
|
1163
1183
|
}
|
|
1164
1184
|
# print warning if we couldn't set our priority tag
|
|
@@ -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.28';
|
|
23
23
|
|
|
24
24
|
sub WarnProc($) { $warnString = $_[0]; }
|
|
25
25
|
|
|
@@ -385,6 +385,18 @@ sub HandleMember($$;$)
|
|
|
385
385
|
$et->HandleTag($tagTablePtr, '_com', $com) if defined $com and length $com;
|
|
386
386
|
}
|
|
387
387
|
|
|
388
|
+
#------------------------------------------------------------------------------
|
|
389
|
+
# Extract file from ZIP archive
|
|
390
|
+
# Inputs: 0) ExifTool ref, 1) Zip object ref, 2) file name
|
|
391
|
+
# Returns: zip member or undef it it didn't exist
|
|
392
|
+
sub ExtractFile($$$)
|
|
393
|
+
{
|
|
394
|
+
my ($et, $zip, $file) = @_;
|
|
395
|
+
my $result = $zip->memberNamed($file);
|
|
396
|
+
$et->VPrint(1, " (Extracting '${file}' from zip archive)\n");
|
|
397
|
+
return $result;
|
|
398
|
+
}
|
|
399
|
+
|
|
388
400
|
#------------------------------------------------------------------------------
|
|
389
401
|
# Extract information from a ZIP file
|
|
390
402
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
|
@@ -460,7 +472,7 @@ sub ProcessZIP($$)
|
|
|
460
472
|
# check for an Office Open file (DOCX, etc)
|
|
461
473
|
# --> read '[Content_Types].xml' to determine the file type
|
|
462
474
|
my ($mime, @members);
|
|
463
|
-
my $cType = $zip
|
|
475
|
+
my $cType = ExtractFile($et, $zip, '[Content_Types].xml');
|
|
464
476
|
if ($cType) {
|
|
465
477
|
($buff, $status) = $zip->contents($cType);
|
|
466
478
|
if (not $status and (
|
|
@@ -501,7 +513,7 @@ sub ProcessZIP($$)
|
|
|
501
513
|
}
|
|
502
514
|
|
|
503
515
|
# check for an Open Document, IDML or EPUB file
|
|
504
|
-
my $mType = $zip
|
|
516
|
+
my $mType = ExtractFile($et, $zip, 'mimetype');
|
|
505
517
|
if ($mType) {
|
|
506
518
|
($mime, $status) = $zip->contents($mType);
|
|
507
519
|
if (not $status and $mime =~ /([\x21-\xfe]+)/s) {
|
|
@@ -510,9 +522,9 @@ sub ProcessZIP($$)
|
|
|
510
522
|
$et->SetFileType($openDocType{$mime} || 'ZIP', $mime);
|
|
511
523
|
$et->Warn("Unrecognized MIMEType $mime") unless $openDocType{$mime};
|
|
512
524
|
# extract Open Document metadata from "meta.xml"
|
|
513
|
-
my $meta = $zip
|
|
525
|
+
my $meta = ExtractFile($et, $zip, 'meta.xml');
|
|
514
526
|
# IDML files have metadata in a different place (ref 6)
|
|
515
|
-
$meta or $meta = $zip
|
|
527
|
+
$meta or $meta = ExtractFile($et, $zip, 'META-INF/metadata.xml');
|
|
516
528
|
if ($meta) {
|
|
517
529
|
($buff, $status) = $zip->contents($meta);
|
|
518
530
|
unless ($status) {
|
|
@@ -532,7 +544,7 @@ sub ProcessZIP($$)
|
|
|
532
544
|
# process rootfile of EPUB container if applicable
|
|
533
545
|
for (;;) {
|
|
534
546
|
last if $meta and $mime ne 'application/epub+zip';
|
|
535
|
-
my $container = $zip
|
|
547
|
+
my $container = ExtractFile($et, $zip, 'META-INF/container.xml');
|
|
536
548
|
($buff, $status) = $zip->contents($container);
|
|
537
549
|
last if $status;
|
|
538
550
|
$buff =~ /<rootfile\s+[^>]*?\bfull-path=(['"])(.*?)\1/s or last;
|
|
@@ -570,7 +582,7 @@ sub ProcessZIP($$)
|
|
|
570
582
|
my $type;
|
|
571
583
|
my %tag = ( jpg => 'PreviewImage', png => 'PreviewPNG' );
|
|
572
584
|
foreach $type ('jpg', 'png') {
|
|
573
|
-
my $thumb = $zip
|
|
585
|
+
my $thumb = ExtractFile($et, $zip, "Thumbnails/thumbnail.$type");
|
|
574
586
|
next unless $thumb;
|
|
575
587
|
($buff, $status) = $zip->contents($thumb);
|
|
576
588
|
$et->FoundTag($tag{$type}, $buff) unless $status;
|