exiftool_vendored 11.94.0 → 12.06.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/bin/Changes +163 -3
- data/bin/MANIFEST +5 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +32 -32
- data/bin/exiftool +152 -52
- data/bin/lib/Image/ExifTool.pm +166 -115
- data/bin/lib/Image/ExifTool.pod +108 -81
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +13 -7
- data/bin/lib/Image/ExifTool/Canon.pm +6 -3
- data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
- data/bin/lib/Image/ExifTool/DPX.pm +56 -2
- data/bin/lib/Image/ExifTool/DarwinCore.pm +16 -3
- data/bin/lib/Image/ExifTool/Exif.pm +15 -6
- data/bin/lib/Image/ExifTool/Font.pm +9 -2
- data/bin/lib/Image/ExifTool/GIF.pm +5 -0
- data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
- data/bin/lib/Image/ExifTool/Geotag.pm +69 -21
- data/bin/lib/Image/ExifTool/GoPro.pm +10 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +91 -12
- data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +44 -24
- data/bin/lib/Image/ExifTool/MWG.pm +9 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +3 -2
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
- data/bin/lib/Image/ExifTool/Nikon.pm +156 -18
- data/bin/lib/Image/ExifTool/Olympus.pm +34 -17
- data/bin/lib/Image/ExifTool/PNG.pm +14 -3
- data/bin/lib/Image/ExifTool/PPM.pm +5 -5
- data/bin/lib/Image/ExifTool/Panasonic.pm +147 -13
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +33 -0
- data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +3 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +277 -33
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +460 -67
- data/bin/lib/Image/ExifTool/README +21 -20
- data/bin/lib/Image/ExifTool/RIFF.pm +123 -3
- data/bin/lib/Image/ExifTool/RTF.pm +12 -7
- data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -0
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
- data/bin/lib/Image/ExifTool/Sony.pm +379 -12
- data/bin/lib/Image/ExifTool/TagLookup.pm +1959 -1874
- data/bin/lib/Image/ExifTool/TagNames.pod +346 -55
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +26 -15
- data/bin/lib/Image/ExifTool/Writer.pl +52 -23
- data/bin/lib/Image/ExifTool/XMP.pm +41 -4
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
- data/bin/perl-Image-ExifTool.spec +31 -31
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -4
@@ -6,6 +6,7 @@
|
|
6
6
|
# Revisions: 2013-09-19 - P. Harvey created
|
7
7
|
#
|
8
8
|
# References: 1) http://www.cineon.com/ff_draft.php
|
9
|
+
# 2) Harry Mallon private communication
|
9
10
|
#------------------------------------------------------------------------------
|
10
11
|
|
11
12
|
package Image::ExifTool::DPX;
|
@@ -14,7 +15,7 @@ use strict;
|
|
14
15
|
use vars qw($VERSION);
|
15
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
17
|
|
17
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.04';
|
18
19
|
|
19
20
|
# DPX tags
|
20
21
|
%Image::ExifTool::DPX::Main = (
|
@@ -86,6 +87,56 @@ $VERSION = '1.03';
|
|
86
87
|
156 => 'User-defined 8 component element',
|
87
88
|
},
|
88
89
|
},
|
90
|
+
801 => { #2
|
91
|
+
Name => 'TransferCharacteristic',
|
92
|
+
Format => 'int8u',
|
93
|
+
PrintConv => {
|
94
|
+
0 => 'User-defined',
|
95
|
+
1 => 'Printing density',
|
96
|
+
2 => 'Linear',
|
97
|
+
3 => 'Logarithmic',
|
98
|
+
4 => 'Unspecified video',
|
99
|
+
5 => 'SMPTE 274M',
|
100
|
+
6 => 'ITU-R 704-4',
|
101
|
+
7 => 'ITU-R 601-5 system B or G (625)',
|
102
|
+
8 => 'ITU-R 601-5 system M (525)',
|
103
|
+
9 => 'Composite video (NTSC)',
|
104
|
+
10 => 'Composite video (PAL)',
|
105
|
+
11 => 'Z (depth) - linear',
|
106
|
+
12 => 'Z (depth) - homogeneous',
|
107
|
+
13 => 'SMPTE ADX',
|
108
|
+
14 => 'ITU-R 2020 NCL',
|
109
|
+
15 => 'ITU-R 2020 CL',
|
110
|
+
16 => 'IEC 61966-2-4 xvYCC',
|
111
|
+
17 => 'ITU-R 2100 NCL/PQ',
|
112
|
+
18 => 'ITU-R 2100 ICtCp/PQ',
|
113
|
+
19 => 'ITU-R 2100 NCL/HLG',
|
114
|
+
20 => 'ITU-R 2100 ICtCp/HLG',
|
115
|
+
21 => 'RP 431-2:2011 Gama 2.6',
|
116
|
+
22 => 'IEC 61966-2-1 sRGB',
|
117
|
+
},
|
118
|
+
},
|
119
|
+
802 => { #2
|
120
|
+
Name => 'ColorimetricSpecification',
|
121
|
+
Format => 'int8u',
|
122
|
+
PrintConv => {
|
123
|
+
0 => 'User-defined',
|
124
|
+
1 => 'Printing density',
|
125
|
+
4 => 'Unspecified video',
|
126
|
+
5 => 'SMPTE 274M',
|
127
|
+
6 => 'ITU-R 704-4',
|
128
|
+
7 => 'ITU-R 601-5 system B or G (625)',
|
129
|
+
8 => 'ITU-R 601-5 system M (525)',
|
130
|
+
9 => 'Composite video (NTSC)',
|
131
|
+
10 => 'Composite video (PAL)',
|
132
|
+
13 => 'SMPTE ADX',
|
133
|
+
14 => 'ITU-R 2020',
|
134
|
+
15 => 'P3D65',
|
135
|
+
16 => 'P3DCI',
|
136
|
+
17 => 'P3D60',
|
137
|
+
18 => 'ACES',
|
138
|
+
},
|
139
|
+
},
|
89
140
|
803 => { Name => 'BitDepth', Format => 'int8u' },
|
90
141
|
820 => { Name => 'ImageDescription', Format => 'string[32]' },
|
91
142
|
892 => { Name => 'Image2Description', Format => 'string[32]', RawConv => '$val=~/[^\xff]/ ? $val : undef' },
|
@@ -106,9 +157,12 @@ $VERSION = '1.03';
|
|
106
157
|
1556=> { Name => 'InputDeviceName', Format => 'string[32]' },
|
107
158
|
1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' },
|
108
159
|
# 1620=> { Name => 'AspectRatio', Format => 'int32u' },
|
109
|
-
1724 => { Name => '
|
160
|
+
1724 => { Name => 'OriginalFrameRate',Format => 'float' },
|
161
|
+
1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '$val =~ /\d/ ? $val : undef' }, #2
|
110
162
|
1732 => { Name => 'FrameID', Format => 'string[32]' },
|
111
163
|
1764 => { Name => 'SlateInformation', Format => 'string[100]' },
|
164
|
+
1920 => { Name => 'TimeCode', Format => 'int32u' }, #2
|
165
|
+
1940 => { Name => 'FrameRate', Format => 'float', RawConv => '$val =~ /\d/ ? $val : undef' }, #2
|
112
166
|
1972 => { Name => 'Reserved5', Format => 'string[76]', Unknown => 1 },
|
113
167
|
2048 => { Name => 'UserID', Format => 'string[32]' },
|
114
168
|
);
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION);
|
16
16
|
use Image::ExifTool::XMP;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.04';
|
19
19
|
|
20
20
|
my %dateTimeInfo = (
|
21
21
|
# NOTE: Do NOT put "Groups" here because Groups hash must not be common!
|
@@ -28,7 +28,7 @@ my %dateTimeInfo = (
|
|
28
28
|
my %materialSample = (
|
29
29
|
STRUCT_NAME => 'DarwinCore MaterialSample',
|
30
30
|
NAMESPACE => 'dwc',
|
31
|
-
materialSampleID
|
31
|
+
materialSampleID => { },
|
32
32
|
);
|
33
33
|
|
34
34
|
my %event = (
|
@@ -40,7 +40,20 @@ my %event = (
|
|
40
40
|
eventDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
|
41
41
|
eventID => { },
|
42
42
|
eventRemarks => { Writable => 'lang-alt' },
|
43
|
-
eventTime
|
43
|
+
eventTime => {
|
44
|
+
Groups => { 2 => 'Time' },
|
45
|
+
Writable => 'string', # (so we can format this ourself)
|
46
|
+
Shift => 'Time',
|
47
|
+
# (pass straight through if this isn't a full date/time value)
|
48
|
+
ValueConv => 'Image::ExifTool::XMP::ConvertXMPDate($val)',
|
49
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
50
|
+
ValueConvInv => 'Image::ExifTool::XMP::FormatXMPDate($val) or $val',
|
51
|
+
PrintConvInv => q{
|
52
|
+
my $v = $self->InverseDateTime($val,undef,1);
|
53
|
+
undef $Image::ExifTool::evalWarning;
|
54
|
+
return $v || $val;
|
55
|
+
},
|
56
|
+
},
|
44
57
|
fieldNotes => { },
|
45
58
|
fieldNumber => { },
|
46
59
|
habitat => { },
|
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
57
57
|
use Image::ExifTool::MakerNotes;
|
58
58
|
|
59
|
-
$VERSION = '4.
|
59
|
+
$VERSION = '4.31';
|
60
60
|
|
61
61
|
sub ProcessExif($$$);
|
62
62
|
sub WriteExif($$$);
|
@@ -4715,8 +4715,8 @@ my %subSecConv = (
|
|
4715
4715
|
},
|
4716
4716
|
LensID => {
|
4717
4717
|
Groups => { 2 => 'Camera' },
|
4718
|
-
Require => 'LensType',
|
4719
4718
|
Desire => {
|
4719
|
+
0 => 'LensType',
|
4720
4720
|
1 => 'FocalLength',
|
4721
4721
|
2 => 'MaxAperture',
|
4722
4722
|
3 => 'MaxApertureValue',
|
@@ -4735,16 +4735,25 @@ my %subSecConv = (
|
|
4735
4735
|
Applies only to LensType values with a lookup table. May be configured
|
4736
4736
|
by adding user-defined lenses
|
4737
4737
|
},
|
4738
|
-
# this LensID is only valid if the LensType has a PrintConv
|
4738
|
+
# this LensID is only valid if the LensType has a PrintConv,
|
4739
|
+
# or LensType or LensModel are the model name
|
4739
4740
|
RawConv => q{
|
4740
4741
|
my $printConv = $$self{TAG_INFO}{LensType}{PrintConv};
|
4741
|
-
return $val if ref $printConv eq 'HASH' or
|
4742
|
-
ref $$printConv[0] eq 'HASH') or
|
4742
|
+
return $val if ref $printConv eq 'HASH' or
|
4743
|
+
(ref $printConv eq 'ARRAY' and ref $$printConv[0] eq 'HASH') or
|
4744
|
+
(defined $val[0] and $val[0] =~ /(mm|\d\/F)/) or
|
4745
|
+
(defined $val[6] and $val[6] =~ /(mm|\d\/F)/);
|
4743
4746
|
return undef;
|
4744
4747
|
},
|
4745
|
-
ValueConv => '$val',
|
4748
|
+
ValueConv => '$val[0] || $val[6]',
|
4746
4749
|
PrintConv => q{
|
4747
4750
|
my $pcv;
|
4751
|
+
# use LensModel ([6]) if LensType ([0]) is not populated
|
4752
|
+
# (iPhone populates LensModel but not LensType)
|
4753
|
+
if (not defined $val[0] and defined $val[6]) {
|
4754
|
+
$val[0] = $val[6];
|
4755
|
+
$prt[0] = $prt[6];
|
4756
|
+
}
|
4748
4757
|
# use LensType2 instead of LensType if available and valid (Sony E-mount lenses)
|
4749
4758
|
# (0x8000 or greater; 0 for several older/3rd-party E-mount lenses)
|
4750
4759
|
if (defined $val[9] and ($val[9] & 0x8000 or $val[9] == 0)) {
|
@@ -19,7 +19,7 @@ use strict;
|
|
19
19
|
use vars qw($VERSION %ttLang);
|
20
20
|
use Image::ExifTool qw(:DataAccess :Utils);
|
21
21
|
|
22
|
-
$VERSION = '1.
|
22
|
+
$VERSION = '1.10';
|
23
23
|
|
24
24
|
sub ProcessOTF($$);
|
25
25
|
|
@@ -589,6 +589,11 @@ sub ProcessFont($$)
|
|
589
589
|
$et->HandleTag($tagTablePtr, 'postfont', $2);
|
590
590
|
}
|
591
591
|
$rtnVal = 1;
|
592
|
+
} elsif ($buff =~ /^(wOF[F2])/) {
|
593
|
+
my $type = $1 eq 'wOFF' ? 'woff' : 'woff2';
|
594
|
+
$et->SetFileType(uc($type), "font/$type");
|
595
|
+
# (don't yet extract metadata from these files)
|
596
|
+
$rtnVal = 1;
|
592
597
|
} else {
|
593
598
|
$rtnVal = 0;
|
594
599
|
}
|
@@ -611,7 +616,9 @@ This module is used by Image::ExifTool
|
|
611
616
|
|
612
617
|
This module contains the routines required by Image::ExifTool to read meta
|
613
618
|
information from various format font files. Currently recognized font file
|
614
|
-
types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM.
|
619
|
+
types are OTF, TTF, TTC, DFONT, PFA, PFB, PFM, AFM, ACFM and AMFM. As well,
|
620
|
+
WOFF and WOFF2 font files are identified, but metadata is not currently
|
621
|
+
extracted from these formats.
|
615
622
|
|
616
623
|
=head1 AUTHOR
|
617
624
|
|
@@ -115,6 +115,11 @@ my %gifMap = (
|
|
115
115
|
ValueConv => '$val + 1',
|
116
116
|
},
|
117
117
|
5 => 'BackgroundColor',
|
118
|
+
6 => {
|
119
|
+
Name => 'AspectRatio',
|
120
|
+
RawConv => '$val ? $val : undef',
|
121
|
+
ValueConv => '($val + 15) / 64',
|
122
|
+
},
|
118
123
|
);
|
119
124
|
|
120
125
|
# GIF Netscape 2.0 animation extension (ref 3)
|
@@ -573,6 +573,8 @@ my %epsg_vertcs = (
|
|
573
573
|
3053 => 'Hjorsey 1955 Lambert',
|
574
574
|
3057 => 'ISN93 Lambert 1993',
|
575
575
|
3300 => 'Estonian Coordinate System of 1992',
|
576
|
+
3786 => 'Popular Visualisation CRS / Mercator', #PH (NC)
|
577
|
+
3857 => 'WGS 84 / Pseudo-Mercator', #PH (NC)
|
576
578
|
20137 => 'Adindan UTM zone 37N',
|
577
579
|
20138 => 'Adindan UTM zone 38N',
|
578
580
|
20248 => 'AGD66 AMG zone 48',
|
@@ -25,8 +25,9 @@ package Image::ExifTool::Geotag;
|
|
25
25
|
use strict;
|
26
26
|
use vars qw($VERSION);
|
27
27
|
use Image::ExifTool qw(:Public);
|
28
|
+
use Image::ExifTool::GPS;
|
28
29
|
|
29
|
-
$VERSION = '1.
|
30
|
+
$VERSION = '1.62';
|
30
31
|
|
31
32
|
sub JITTER() { return 2 } # maximum time jitter
|
32
33
|
|
@@ -229,9 +230,41 @@ sub LoadTrackLog($$;$)
|
|
229
230
|
$format = 'Winplus';
|
230
231
|
} elsif (/^\s*\d+\s+.*\sypr\s*$/ and (@tmp=split) == 12) {
|
231
232
|
$format = 'Bramor';
|
232
|
-
} elsif (/\
|
233
|
+
} elsif (/\b(GPS)?Date/i and /\b(GPS)?(Date)?Time/i and /,/) {
|
234
|
+
chomp;
|
233
235
|
@csvHeadings = split ',';
|
234
236
|
$format = 'CSV';
|
237
|
+
# convert recognized headings to our parameter names
|
238
|
+
foreach (@csvHeadings) {
|
239
|
+
my $param;
|
240
|
+
s/^GPS ?//; # remove leading "GPS" to simplify regex patterns
|
241
|
+
if (/^Date ?Time/i) { # ExifTool addition
|
242
|
+
$param = 'datetime';
|
243
|
+
} elsif (/^Date/i) {
|
244
|
+
$param = 'date';
|
245
|
+
} elsif (/^Time/i) {
|
246
|
+
$param = 'time';
|
247
|
+
} elsif (/^(Pos)?Lat/i) {
|
248
|
+
$param = 'lat';
|
249
|
+
} elsif (/^(Pos)?Lon/i) {
|
250
|
+
$param = 'lon';
|
251
|
+
} elsif (/^(Pos)?Alt/i) {
|
252
|
+
$param = 'alt';
|
253
|
+
} elsif (/^(Angle)?(Heading|Track)/i) {
|
254
|
+
$param = 'track';
|
255
|
+
} elsif (/^(Angle)?Pitch/i or /^Camera ?Elevation ?Angle/i) {
|
256
|
+
$param = 'pitch';
|
257
|
+
} elsif (/^(Angle)?Roll/i) {
|
258
|
+
$param = 'roll';
|
259
|
+
}
|
260
|
+
if ($param) {
|
261
|
+
$et->VPrint(2, "CSV column '${_}' is $param\n");
|
262
|
+
$_ = $param;
|
263
|
+
} else {
|
264
|
+
$et->VPrint(2, "CSV column '${_}' ignored\n");
|
265
|
+
$_ = ''; # ignore this column
|
266
|
+
}
|
267
|
+
}
|
235
268
|
next;
|
236
269
|
} else {
|
237
270
|
# search only first 50 lines of file for a valid fix
|
@@ -388,35 +421,50 @@ DoneFix: $isDate = 1;
|
|
388
421
|
# set necessary flags for extra available information
|
389
422
|
@$has{qw(alt track orient)} = (1,1,1);
|
390
423
|
goto DoneFix; # save this fix
|
424
|
+
} elsif ($format eq 'CSV') {
|
425
|
+
chomp;
|
426
|
+
my @vals = split ',';
|
391
427
|
#
|
392
428
|
# CSV format output of GPS/IMU POS system
|
429
|
+
# Date* - date in DD/MM/YYYY format
|
430
|
+
# Time* - time in HH:MM:SS.SSS format
|
431
|
+
# [Pos]Lat* - latitude in decimal degrees
|
432
|
+
# [Pos]Lon* - longitude in decimal degrees
|
433
|
+
# [Pos]Alt* - altitude in m relative to sea level
|
434
|
+
# [Angle]Heading* - GPSTrack in degrees true
|
435
|
+
# [Angle]Pitch* - pitch angle in degrees
|
436
|
+
# [Angle]Roll* - roll angle in degrees
|
437
|
+
# (ExifTool enhancements allow for standard tag names or descriptions as the column headings,
|
438
|
+
# add support for time zones and flexible coordinates, and allow a new DateTime column)
|
393
439
|
#
|
394
|
-
|
395
|
-
|
396
|
-
my ($label, $date, $secs);
|
397
|
-
foreach $label (@csvHeadings) {
|
440
|
+
my ($param, $date, $secs);
|
441
|
+
foreach $param (@csvHeadings) {
|
398
442
|
my $val = shift @vals;
|
399
443
|
last unless defined $val;
|
400
|
-
|
444
|
+
next unless $param;
|
445
|
+
if ($param eq 'datetime') {
|
446
|
+
local $SIG{'__WARN__'} = sub { };
|
447
|
+
my $dateTime = $et->InverseDateTime($val);
|
448
|
+
if ($dateTime) {
|
449
|
+
$date = Image::ExifTool::GetUnixTime($val, 2);
|
450
|
+
$secs = 0;
|
451
|
+
}
|
452
|
+
} elsif ($param eq 'date') {
|
401
453
|
if ($val =~ m{^(\d{2})/(\d{2})/(\d{4})$}) {
|
402
454
|
$date = Time::Local::timegm(0,0,0,$1,$2-1,$3);
|
455
|
+
} elsif ($val =~ /(\d{4}).*?(\d{2}).*?(\d{2})/) {
|
456
|
+
$date = Time::Local::timegm(0,0,0,$3,$2-1,$1);
|
403
457
|
}
|
404
|
-
} elsif ($
|
405
|
-
if ($val =~ /^(\d{1,2}):(\d{2}):(\d{2}(\.\d+)?)
|
458
|
+
} elsif ($param eq 'time') {
|
459
|
+
if ($val =~ /^(\d{1,2}):(\d{2}):(\d{2}(\.\d+)?).*?(([-+])(\d{1,2}):?(\d{2}))?/) {
|
406
460
|
$secs = (($1 * 60) + $2) * 60 + $3;
|
461
|
+
# adjust for time zone if specified
|
462
|
+
$secs += ($7 * 60 + $8) * ($6 eq '-' ? 60 : -60) if $5;
|
407
463
|
}
|
408
|
-
} elsif ($
|
409
|
-
$$fix{
|
410
|
-
}
|
411
|
-
$$fix{
|
412
|
-
} elsif ($label =~ /^(Pos)?Alt/) {
|
413
|
-
$$fix{alt} = $val;
|
414
|
-
} elsif ($label =~ /^(Angle)?Heading/) {
|
415
|
-
$$fix{track} = $val;
|
416
|
-
} elsif ($label =~ /^(Angle)?Pitch/) {
|
417
|
-
$$fix{pitch} = $val;
|
418
|
-
} elsif ($label =~ /^(Angle)?Roll/) {
|
419
|
-
$$fix{roll} = $val;
|
464
|
+
} elsif ($param eq 'lat' or $param eq 'lon') {
|
465
|
+
$$fix{$param} = Image::ExifTool::GPS::ToDegrees($val, 1);
|
466
|
+
} else {
|
467
|
+
$$fix{$param} = $val;
|
420
468
|
}
|
421
469
|
}
|
422
470
|
if ($date and defined $secs and defined $$fix{lat} and defined $$fix{lon}) {
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::QuickTime;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.04';
|
20
20
|
|
21
21
|
sub ProcessGoPro($$$);
|
22
22
|
sub ProcessString($$$);
|
@@ -590,6 +590,7 @@ sub ProcessString($$$)
|
|
590
590
|
# Process GoPro metadata (gpmd samples, GPMF box, or APP6) (ref PH/1/2)
|
591
591
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
592
592
|
# Returns: 1 on success
|
593
|
+
# - with hack to check for encrypted text in gpmd data (Rove Stealth 4K)
|
593
594
|
sub ProcessGoPro($$$)
|
594
595
|
{
|
595
596
|
my ($et, $dirInfo, $tagTablePtr) = @_;
|
@@ -601,6 +602,14 @@ sub ProcessGoPro($$$)
|
|
601
602
|
my $unknown = $verbose || $et->Options('Unknown');
|
602
603
|
my ($size, $type, $unit, $scal, $setGroup0);
|
603
604
|
|
605
|
+
# the Rove Stealth 4K writes encrypted text here, so check for this first
|
606
|
+
# (really should check for this before loading GoPro module, but I was lazy) PHIL
|
607
|
+
if ($$dataPt =~ /^\0\0\xf2\xe1\xf0\xeeTT/) {
|
608
|
+
$et->VerboseDir('gpmd encrypted text', undef, length($$dataPt));
|
609
|
+
my $strmTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
610
|
+
Image::ExifTool::QuickTime::Process_text($et, $strmTbl, $dataPt);
|
611
|
+
return 1;
|
612
|
+
}
|
604
613
|
$et->VerboseDir($$dirInfo{DirName} || 'GPMF', undef, $dirEnd-$pos) if $verbose;
|
605
614
|
if ($pos) {
|
606
615
|
my $parent = $$dirInfo{Parent};
|
@@ -890,7 +890,7 @@ sub ParsePictureTiming($$)
|
|
890
890
|
|
891
891
|
#------------------------------------------------------------------------------
|
892
892
|
# Process H.264 Supplementary Enhancement Information (ref 1/PH)
|
893
|
-
# Inputs: 0)
|
893
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
894
894
|
# Returns: 1 if we processed payload type 5
|
895
895
|
# Payload types:
|
896
896
|
# 0 - buffer period
|
@@ -13,7 +13,7 @@ use vars qw($VERSION);
|
|
13
13
|
use Image::ExifTool; # only for FinishTiffDump()
|
14
14
|
use Image::ExifTool::HTML qw(EscapeHTML);
|
15
15
|
|
16
|
-
$VERSION = '1.
|
16
|
+
$VERSION = '1.39';
|
17
17
|
|
18
18
|
sub DumpTable($$$;$$$$$$);
|
19
19
|
sub Open($$$;@);
|
@@ -122,7 +122,7 @@ function doClick(e)
|
|
122
122
|
if (!clicked) {
|
123
123
|
firstOutEvt = lastInEvt = undefined;
|
124
124
|
high(e, 2);
|
125
|
-
clicked = 1;
|
125
|
+
if (hlist) clicked = 1;
|
126
126
|
} else {
|
127
127
|
clicked = 0;
|
128
128
|
if (firstOutEvt) high(firstOutEvt, 0);
|
@@ -1,13 +1,15 @@
|
|
1
1
|
#------------------------------------------------------------------------------
|
2
2
|
# File: ID3.pm
|
3
3
|
#
|
4
|
-
# Description: Read ID3 meta information
|
4
|
+
# Description: Read ID3 and Lyrics3 meta information
|
5
5
|
#
|
6
6
|
# Revisions: 09/12/2005 - P. Harvey Created
|
7
|
+
# 09/08/2020 - PH Added Lyrics3 support
|
7
8
|
#
|
8
9
|
# References: 1) http://www.id3.org/
|
9
10
|
# 2) http://www.mp3-tech.org/
|
10
11
|
# 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
|
12
|
+
# 4) https://id3.org/Lyrics3
|
11
13
|
#------------------------------------------------------------------------------
|
12
14
|
|
13
15
|
package Image::ExifTool::ID3;
|
@@ -16,7 +18,7 @@ use strict;
|
|
16
18
|
use vars qw($VERSION);
|
17
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
20
|
|
19
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.55';
|
20
22
|
|
21
23
|
sub ProcessID3v2($$$);
|
22
24
|
sub ProcessPrivate($$$);
|
@@ -68,13 +70,13 @@ my %dateTimeConv = (
|
|
68
70
|
%Image::ExifTool::ID3::Main = (
|
69
71
|
VARS => { NO_ID => 1 },
|
70
72
|
NOTES => q{
|
71
|
-
ExifTool extracts ID3 information from MP3, MPEG, AIFF, OGG,
|
72
|
-
and RealAudio files. ID3v2 tags which support multiple
|
73
|
-
Comment and Lyrics) are extracted by specifying the tag name,
|
74
|
-
dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
75
|
-
See L<http://www.id3.org/> for the official ID3
|
76
|
-
L<http://www.loc.gov/standards/iso639-2/php/code_list.php>
|
77
|
-
639-2 language codes.
|
73
|
+
ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, AIFF, OGG,
|
74
|
+
FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
75
|
+
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
76
|
+
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
77
|
+
"Comment-spa"). See L<http://www.id3.org/> for the official ID3
|
78
|
+
specification and L<http://www.loc.gov/standards/iso639-2/php/code_list.php>
|
79
|
+
for a list of ISO 639-2 language codes.
|
78
80
|
},
|
79
81
|
ID3v1 => {
|
80
82
|
Name => 'ID3v1',
|
@@ -98,6 +100,24 @@ my %dateTimeConv = (
|
|
98
100
|
},
|
99
101
|
);
|
100
102
|
|
103
|
+
# Lyrics3 tags (ref 4)
|
104
|
+
%Image::ExifTool::ID3::Lyrics3 = (
|
105
|
+
GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' },
|
106
|
+
NOTES => q{
|
107
|
+
ExifTool extracts Lyrics3 version 1.00 and 2.00 tags from any file that
|
108
|
+
supports ID3. See L<https://id3.org/Lyrics3> for the specification.
|
109
|
+
},
|
110
|
+
IND => 'Indications',
|
111
|
+
LYR => 'Lyrics',
|
112
|
+
INF => 'AdditionalInfo',
|
113
|
+
AUT => { Name => 'Author', Groups => { 2 => 'Author' } },
|
114
|
+
EAL => 'ExtendedAlbumName',
|
115
|
+
EAR => 'ExtendedArtistName',
|
116
|
+
ETT => 'ExtendedTrackTitle',
|
117
|
+
IMG => 'AssociatedImageFile',
|
118
|
+
CRC => 'CRC', #PH
|
119
|
+
);
|
120
|
+
|
101
121
|
# Mapping for ID3v1 Genre numbers
|
102
122
|
my %genre = (
|
103
123
|
0 => 'Blues',
|
@@ -613,6 +633,9 @@ my %id3v2_common = (
|
|
613
633
|
Name => 'OlympusDSS',
|
614
634
|
SubDirectory => { TagTable => 'Image::ExifTool::Olympus::DSS' },
|
615
635
|
},
|
636
|
+
GRP1 => 'Grouping',
|
637
|
+
MVNM => 'MovementName', # (NC)
|
638
|
+
MVIN => 'MovementNumber', # (NC)
|
616
639
|
);
|
617
640
|
|
618
641
|
# Tags for ID3v2.3 (http://www.id3.org/id3v2.3.0)
|
@@ -1318,6 +1341,8 @@ sub ProcessID3v2($$$)
|
|
1318
1341
|
} elsif ($$tagInfo{Format} or $$tagInfo{SubDirectory}) {
|
1319
1342
|
$et->HandleTag($tagTablePtr, $id, undef, DataPt => \$val);
|
1320
1343
|
next;
|
1344
|
+
} elsif ($id eq 'GRP1' or $id eq 'MVNM' or $id eq 'MVIN') {
|
1345
|
+
$val =~ s/(^\0+|\0+$)//g; # (PH guess)
|
1321
1346
|
} elsif (not $$tagInfo{Binary}) {
|
1322
1347
|
$et->Warn("Don't know how to handle $id frame");
|
1323
1348
|
next;
|
@@ -1342,7 +1367,7 @@ sub ProcessID3v2($$$)
|
|
1342
1367
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
1343
1368
|
# Returns: 1 on success, 0 if this file didn't contain ID3 information
|
1344
1369
|
# - also processes audio data if any ID3 information was found
|
1345
|
-
# - sets ExifTool DoneID3 to 1 when called, or to
|
1370
|
+
# - sets ExifTool DoneID3 to 1 when called, or to trailer size if an ID3v1 trailer exists
|
1346
1371
|
sub ProcessID3($$)
|
1347
1372
|
{
|
1348
1373
|
my ($et, $dirInfo) = @_;
|
@@ -1421,8 +1446,9 @@ sub ProcessID3($$)
|
|
1421
1446
|
#
|
1422
1447
|
# read ID3v1 trailer if it exists
|
1423
1448
|
#
|
1449
|
+
my $trailSize = 0;
|
1424
1450
|
if ($raf->Seek(-128, 2) and $raf->Read($tBuff, 128) == 128 and $tBuff =~ /^TAG/) {
|
1425
|
-
|
1451
|
+
$trailSize = 128;
|
1426
1452
|
%id3Trailer = (
|
1427
1453
|
DataPt => \$tBuff,
|
1428
1454
|
DataPos => $raf->Tell() - 128,
|
@@ -1432,8 +1458,59 @@ sub ProcessID3($$)
|
|
1432
1458
|
$id3Len += length($tBuff);
|
1433
1459
|
$rtnVal = 1;
|
1434
1460
|
# load 'Enhanced TAG' information if available
|
1435
|
-
|
1461
|
+
my $eSize = 227; # size of ID3 Enhanced TAG info
|
1462
|
+
if ($raf->Seek(-$trailSize - $eSize, 2) and $raf->Read($eBuff, $eSize) == $eSize and $eBuff =~ /^TAG+/) {
|
1436
1463
|
$id3Trailer{EnhancedTAG} = \$eBuff;
|
1464
|
+
$trailSize += $eSize;
|
1465
|
+
}
|
1466
|
+
$$et{DoneID3} = $trailSize; # save trailer size
|
1467
|
+
}
|
1468
|
+
#
|
1469
|
+
# read Lyrics3 trailer if it exists
|
1470
|
+
#
|
1471
|
+
if ($raf->Seek(-$trailSize-15, 2) and $raf->Read($buff, 15) == 15 and $buff =~ /^(.{6})LYRICS(END|200)$/) {
|
1472
|
+
my $ver = $2; # Lyrics3 version ('END' for version 1)
|
1473
|
+
my $len = ($ver eq 'END') ? 5100 : $1 + 15; # max Lyrics3 length
|
1474
|
+
my $tbl = GetTagTable('Image::ExifTool::ID3::Lyrics3');
|
1475
|
+
$len = $raf->Tell() if $len > $raf->Tell();
|
1476
|
+
if ($raf->Seek(-$len, 1) and $raf->Read($buff, $len) == $len and $buff =~ /LYRICSBEGIN/g) {
|
1477
|
+
my $pos = pos($buff);
|
1478
|
+
$$et{DoneID3} = $trailSize + $len - $pos + 11; # update trailer length
|
1479
|
+
my $oldIndent = $$et{INDENT};
|
1480
|
+
$$et{INDENT} .= '| ';
|
1481
|
+
if ($et->Options('Verbose')) {
|
1482
|
+
$et->VPrint(0, "Lyrics3:\n");
|
1483
|
+
$et->VerboseDir('Lyrics3', undef, $len);
|
1484
|
+
if ($pos > 11) {
|
1485
|
+
$buff = substr($buff, $pos - 11);
|
1486
|
+
$pos = 11;
|
1487
|
+
}
|
1488
|
+
$et->VerboseDump(\$buff);
|
1489
|
+
}
|
1490
|
+
if ($ver eq 'END') {
|
1491
|
+
# Lyrics3 v1.00
|
1492
|
+
my $val = substr($buff, $pos, $len - $pos - 9);
|
1493
|
+
$et->HandleTag($tbl, 'LYR', $et->Decode($val, 'Latin'));
|
1494
|
+
} else {
|
1495
|
+
# Lyrics3 v2.00
|
1496
|
+
for (;;) {
|
1497
|
+
# (note: the size field is 5 digits,, not 6 as per the documentation)
|
1498
|
+
last unless $buff =~ /\G(.{3})(\d{5})/g;
|
1499
|
+
my ($tag, $size) = ($1, $2);
|
1500
|
+
$pos += 8;
|
1501
|
+
last if $pos + $size > length($buff);
|
1502
|
+
unless ($$tbl{$tag}) {
|
1503
|
+
AddTagToTable($tbl, $tag, { Name => Image::ExifTool::MakeTagName("Lyrics3_$tag") });
|
1504
|
+
}
|
1505
|
+
$et->HandleTag($tbl, $tag, $et->Decode(substr($buff, $pos, $size), 'Latin'));
|
1506
|
+
$pos += $size;
|
1507
|
+
pos($buff) = $pos;
|
1508
|
+
}
|
1509
|
+
$pos == length($buff) - 15 or $et->Warn('Malformed Lyrics3 v2.00 block');
|
1510
|
+
}
|
1511
|
+
$$et{INDENT} = $oldIndent;
|
1512
|
+
} else {
|
1513
|
+
$et->Warn('Error reading Lyrics3 trailer');
|
1437
1514
|
}
|
1438
1515
|
}
|
1439
1516
|
#
|
@@ -1578,6 +1655,8 @@ under the same terms as Perl itself.
|
|
1578
1655
|
|
1579
1656
|
=item L<http://www.fortunecity.com/underworld/sonic/3/id3tag.html>
|
1580
1657
|
|
1658
|
+
=item L<https://id3.org/Lyrics3>
|
1659
|
+
|
1581
1660
|
=back
|
1582
1661
|
|
1583
1662
|
=head1 SEE ALSO
|