exiftool_vendored 12.92.0 → 12.93.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +15 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +2 -2
- data/bin/lib/Image/ExifTool/Canon.pm +8 -3
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +2 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +56 -1
- data/bin/lib/Image/ExifTool/OpenEXR.pm +3 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +7 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +117 -37
- data/bin/lib/Image/ExifTool/Samsung.pm +5 -3
- data/bin/lib/Image/ExifTool/TagLookup.pm +6 -4
- data/bin/lib/Image/ExifTool/TagNames.pod +7 -4
- data/bin/lib/Image/ExifTool/Writer.pl +4 -1
- data/bin/lib/Image/ExifTool.pm +1 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30869a5b033fa93062cf6f635c5cddb484e8ce9671e8b5b803329edf5d34ee7a
|
4
|
+
data.tar.gz: 0b886b032d88c6cf22d4052795a6bbc4bd69cc33e40c8a4e308359e5d4ae454f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c563c23c4d432f21bbf8ae3ce284fbb7c325540a92bb6c7dd1a693afbe16d3e091b015779094e2f2db5d70ef1e73bc4bc4fb34d8044cb2ae62fa992dc7a085f
|
7
|
+
data.tar.gz: 8a6cfea51bf26dff8cec28964277ea72446fc6ec3eb877f0c8082c8362dee69b9cb421253af1f3f8b073d067e5b29acb0364ed580ce346880c6541a945a7a706
|
data/bin/Changes
CHANGED
@@ -7,13 +7,25 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 12.76. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Aug. 20, 2024 - Version 12.93
|
11
|
+
|
12
|
+
- Added a new Nikon LensID
|
13
|
+
- Added a couple of new OpenEXR Compression types
|
14
|
+
- Added a couple of new QuickTime Keys tags
|
15
|
+
- Decode timed metadata from E-ACE B44 DashCam videos
|
16
|
+
- Make "Unrecognized" Samsung Meta warnings minor
|
17
|
+
- Fixed bug in -listg6 option which resulted in "uninitialized value" warnings
|
18
|
+
- Fixed decoding of Func1Button and Func2Button for the Nikon Z6/Z7
|
19
|
+
- Fixed bug reading JUMB metadata from JXL images
|
20
|
+
|
10
21
|
July 24, 2024 - Version 12.92
|
11
22
|
|
12
|
-
- Removed -w from exiftool shebang
|
23
|
+
- Removed -w from exiftool shebang due to compatibility issues on some systems
|
13
24
|
|
14
25
|
July 24, 2024 - Version 12.91
|
15
26
|
|
16
|
-
-
|
27
|
+
- Added a couple of new OpenEXR Compression values (github#276)
|
28
|
+
- Updated 2 test files that were causing failed tests (ExifTool itself is
|
17
29
|
unchanged)
|
18
30
|
|
19
31
|
July 24, 2024 - Version 12.90
|
@@ -25,7 +37,7 @@ July 24, 2024 - Version 12.90
|
|
25
37
|
- Drop Nikon ShotInfo record when copying MakerNotes from NEF to JPG if it is
|
26
38
|
larger than 50000 bytes (then MakerNotes would be too large for a single
|
27
39
|
JPEG segment)
|
28
|
-
- Changed exiftool shebang
|
40
|
+
- Changed exiftool shebang to use env: "#!/usr/bin/env perl -w"
|
29
41
|
- Revert change of 12.84 to iterate through sub-documents with the -p option
|
30
42
|
only if -ee is used
|
31
43
|
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
109
109
|
terminal window to extract and run ExifTool:
|
110
110
|
|
111
111
|
cd ~/Desktop
|
112
|
-
gzip -dc Image-ExifTool-12.
|
113
|
-
cd Image-ExifTool-12.
|
112
|
+
gzip -dc Image-ExifTool-12.93.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-12.93
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
115
115
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '12.
|
14
|
+
my $version = '12.93';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -5684,7 +5684,7 @@ with this command:
|
|
5684
5684
|
|
5685
5685
|
produces output like this:
|
5686
5686
|
|
5687
|
-
-- Generated by ExifTool 12.
|
5687
|
+
-- Generated by ExifTool 12.93 --
|
5688
5688
|
File: a.jpg - 2003:10:31 15:44:19
|
5689
5689
|
(f/5.6, 1/60s, ISO 100)
|
5690
5690
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
88
88
|
sub ProcessExifInfo($$$);
|
89
89
|
sub SwapWords($);
|
90
90
|
|
91
|
-
$VERSION = '4.
|
91
|
+
$VERSION = '4.80';
|
92
92
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
@@ -9199,14 +9199,19 @@ my %filterConv = (
|
|
9199
9199
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
9200
9200
|
},
|
9201
9201
|
8 => {
|
9202
|
-
Name => '
|
9202
|
+
Name => 'MinFocalLength2',
|
9203
|
+
Notes => q{
|
9204
|
+
these seem to be min/max focal length without teleconverter, as opposed to
|
9205
|
+
MinFocalLength and MaxFocalLength which include the effect of a
|
9206
|
+
teleconverter
|
9207
|
+
}, #forum16309
|
9203
9208
|
ValueConv => '$val / 10',
|
9204
9209
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
9205
9210
|
PrintConv => '"$val mm"',
|
9206
9211
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
9207
9212
|
},
|
9208
9213
|
9 => {
|
9209
|
-
Name => '
|
9214
|
+
Name => 'MaxFocalLength2',
|
9210
9215
|
ValueConv => '$val / 10',
|
9211
9216
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
9212
9217
|
PrintConv => '"$val mm"',
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.40';
|
20
20
|
|
21
21
|
sub ProcessJpeg2000Box($$$);
|
22
22
|
sub ProcessJUMD($$$);
|
@@ -1442,7 +1442,7 @@ sub ProcessBrotli($$$)
|
|
1442
1442
|
}
|
1443
1443
|
} elsif ($type eq 'jumb') {
|
1444
1444
|
return undef if $isWriting; # (can't yet write JUMBF)
|
1445
|
-
Image::ExifTool::ProcessJUMB($et, \%dirInfo, $tagTablePtr); # (untested)
|
1445
|
+
Image::ExifTool::Jpeg2000::ProcessJUMB($et, \%dirInfo, $tagTablePtr); # (untested)
|
1446
1446
|
}
|
1447
1447
|
if ($isWriting) {
|
1448
1448
|
return undef unless defined $dat;
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
65
65
|
use Image::ExifTool::GPS;
|
66
66
|
use Image::ExifTool::XMP;
|
67
67
|
|
68
|
-
$VERSION = '4.
|
68
|
+
$VERSION = '4.37';
|
69
69
|
|
70
70
|
sub LensIDConv($$$);
|
71
71
|
sub ProcessNikonAVI($$$);
|
@@ -367,6 +367,7 @@ sub GetAFPointGrid($$;$);
|
|
367
367
|
'02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro',
|
368
368
|
'7E 54 37 37 0C 0C 4B 06' => 'Sigma 24mm F1.4 DG HSM | A', #30
|
369
369
|
'26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
|
370
|
+
'BC 54 3C 3C 0C 0C 4B 46' => 'Sigma 28mm F1.4 DG HSM | A', #30
|
370
371
|
'48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
|
371
372
|
'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
|
372
373
|
'91 54 44 44 0C 0C 4B 06' => 'Sigma 35mm F1.4 DG HSM', #30
|
@@ -17,12 +17,57 @@ use strict;
|
|
17
17
|
use vars qw($VERSION);
|
18
18
|
use Image::ExifTool qw(:DataAccess :Utils);
|
19
19
|
|
20
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.08';
|
21
21
|
|
22
22
|
sub ProcessNikonSettings($$$);
|
23
23
|
|
24
24
|
my %enableDisable = ( 1 => 'Enable', 2 => 'Disable' );
|
25
25
|
|
26
|
+
my %funcButtonZ6 = ( #forum16316
|
27
|
+
1 => 'AF-On or Subject Tracking', # (bug in 3.xx firmware?)
|
28
|
+
2 => 'AF Lock Only',
|
29
|
+
3 => 'AE Lock (hold)',
|
30
|
+
4 => 'AE Lock (reset on release)',
|
31
|
+
5 => 'AE Lock Only',
|
32
|
+
6 => 'AE/AF Lock',
|
33
|
+
7 => 'FV Lock',
|
34
|
+
8 => 'Flash Disable/Enable',
|
35
|
+
9 => 'Preview',
|
36
|
+
10 => 'Matrix Metering',
|
37
|
+
11 => 'Center-weighted Metering',
|
38
|
+
12 => 'Spot Metering',
|
39
|
+
13 => 'Highlight-weighted Metering',
|
40
|
+
14 => 'Bracketing Burst',
|
41
|
+
15 => 'Synchronized Release (Master)',
|
42
|
+
16 => 'Synchronized Release (Remote)', # no settings map to 17 or 18
|
43
|
+
19 => '+NEF(RAW)',
|
44
|
+
20 => 'Framing Grid Display',
|
45
|
+
# 21 - missing
|
46
|
+
22 => 'Zoom On/Off',
|
47
|
+
# 23 - missing
|
48
|
+
24 => 'My Menu',
|
49
|
+
25 => 'My Menu Top Item',
|
50
|
+
26 => 'Playback',
|
51
|
+
27 => 'Protect',
|
52
|
+
28 => 'Image Area',
|
53
|
+
29 => 'Image Quality',
|
54
|
+
30 => 'White Balance',
|
55
|
+
31 => 'Picture Control',
|
56
|
+
32 => 'Active D-Lighting',
|
57
|
+
33 => 'Metering',
|
58
|
+
34 => 'Flash Mode',
|
59
|
+
35 => 'Focus Mode',
|
60
|
+
36 => 'Auto Bracketing',
|
61
|
+
37 => 'Multiple Exposure',
|
62
|
+
38 => 'HDR',
|
63
|
+
39 => 'Exposure Delay Mode',
|
64
|
+
40 => 'Shutter/Aperture Lock',
|
65
|
+
41 => 'Focus Peaking',
|
66
|
+
42 => 'Rating',
|
67
|
+
43 => 'Non-CPU Lens',
|
68
|
+
44 => 'None',
|
69
|
+
);
|
70
|
+
|
26
71
|
my %funcButtonZ7m2 = (
|
27
72
|
1 => 'AF-On',
|
28
73
|
2 => 'AF Lock Only',
|
@@ -1117,6 +1162,11 @@ my %infoZSeries = (
|
|
1117
1162
|
Name => 'Func1Button',
|
1118
1163
|
PrintConv => \%previewButtonD6,
|
1119
1164
|
%infoD6,
|
1165
|
+
},{ # CSf2-a (Z6)
|
1166
|
+
Name => 'Func1Button',
|
1167
|
+
Condition => '$$self{Model} =~ /^NIKON Z [67]\b/',
|
1168
|
+
Notes => 'Z6 and Z7',
|
1169
|
+
PrintConv => \%funcButtonZ6,
|
1120
1170
|
},{ # CSf2-a (Z7_2)
|
1121
1171
|
Name => 'Func1Button',
|
1122
1172
|
PrintConv => \%funcButtonZ7m2,
|
@@ -1126,6 +1176,11 @@ my %infoZSeries = (
|
|
1126
1176
|
Name => 'Func2Button',
|
1127
1177
|
PrintConv => \%previewButtonD6,
|
1128
1178
|
%infoD6,
|
1179
|
+
},{ # CSf2-b (Z6)
|
1180
|
+
Name => 'Func2Button',
|
1181
|
+
Condition => '$$self{Model} =~ /^NIKON Z [67]\b/',
|
1182
|
+
Notes => 'Z6 and Z7',
|
1183
|
+
PrintConv => \%funcButtonZ6,
|
1129
1184
|
},{ # CSf2-b (Z7_2)
|
1130
1185
|
Name => 'Func2Button',
|
1131
1186
|
PrintConv => \%funcButtonZ7m2,
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
use Image::ExifTool::GPS;
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.07';
|
20
20
|
|
21
21
|
# supported EXR value format types (other types are extracted as undef binary data)
|
22
22
|
my %formatType = (
|
@@ -91,6 +91,8 @@ my %formatType = (
|
|
91
91
|
5 => 'PXR24',
|
92
92
|
6 => 'B44',
|
93
93
|
7 => 'B44A',
|
94
|
+
8 => 'DWAA', #github276
|
95
|
+
9 => 'DWAB', #github276
|
94
96
|
},
|
95
97
|
},
|
96
98
|
dataWindow => { },
|
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
48
48
|
use Image::ExifTool::Exif;
|
49
49
|
use Image::ExifTool::GPS;
|
50
50
|
|
51
|
-
$VERSION = '
|
51
|
+
$VERSION = '3.00';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -6606,6 +6606,12 @@ my %userDefined = (
|
|
6606
6606
|
PrintConv => '$val * 1e6 . " microseconds"',
|
6607
6607
|
PrintConvInv => '$val =~ s/ .*//; $val * 1e-6',
|
6608
6608
|
},
|
6609
|
+
'camera.focal_length.35mm_equivalent' => {
|
6610
|
+
Name => 'FocalLengthIn35mmFormat',
|
6611
|
+
PrintConv => '"$val mm"',
|
6612
|
+
PrintConvInv => '$val=~s/\s*mm$//;$val',
|
6613
|
+
},
|
6614
|
+
'camera.lens_model' => { Name => 'LensModel' },
|
6609
6615
|
'location.ISO6709' => {
|
6610
6616
|
Name => 'GPSCoordinates',
|
6611
6617
|
Groups => { 2 => 'Location' },
|
@@ -109,7 +109,7 @@ my %insvLimit = (
|
|
109
109
|
The tags below are extracted from timed metadata in QuickTime and other
|
110
110
|
formats of video files when the ExtractEmbedded option is used. Although
|
111
111
|
most of these tags are combined into the single table below, ExifTool
|
112
|
-
currently reads
|
112
|
+
currently reads 77 different formats of timed GPS metadata from video files.
|
113
113
|
},
|
114
114
|
VARS => { NO_ID => 1 },
|
115
115
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -757,6 +757,15 @@ my %insvLimit = (
|
|
757
757
|
10 => { Name => 'FusionYPR', Format => 'float[3]' },
|
758
758
|
);
|
759
759
|
|
760
|
+
#------------------------------------------------------------------------------
|
761
|
+
# Convert unsigned 4-byte integer to signed
|
762
|
+
# Inputs: <none> (uses value in $_)
|
763
|
+
# Returns: signed integet
|
764
|
+
sub MakeSigned()
|
765
|
+
{
|
766
|
+
return $_ < 0x80000000 ? $_ : $_ - 4294967296;
|
767
|
+
}
|
768
|
+
|
760
769
|
#------------------------------------------------------------------------------
|
761
770
|
# Save information from keys in OtherSampleDesc directory for processing timed metadata
|
762
771
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
@@ -1474,6 +1483,31 @@ sub ConvertLatLon($$)
|
|
1474
1483
|
$_[1] = $deg + ($_[1] - $deg * 100) / 60;
|
1475
1484
|
}
|
1476
1485
|
|
1486
|
+
#------------------------------------------------------------------------------
|
1487
|
+
# Decrypt Lucky data
|
1488
|
+
# Inputs: 0) string to decrypt, 1) encryption key
|
1489
|
+
# Returns: decrypted string
|
1490
|
+
my @luckyKeys = ('luckychip gps', 'customer ## gps');
|
1491
|
+
sub DecryptLucky($$) {
|
1492
|
+
my ($str, $key) = @_;
|
1493
|
+
my @str = unpack('C*', $str);
|
1494
|
+
my @key = unpack('C*', $key);
|
1495
|
+
my @enc = (0..255);
|
1496
|
+
my ($i, $j, $k) = (0, 0, 0);
|
1497
|
+
do {
|
1498
|
+
$j = ($j + $enc[$i] + $key[$i % length($key)]) & 0xff;
|
1499
|
+
@enc[$i,$j] = @enc[$j,$i];
|
1500
|
+
} while (++$i < 256);
|
1501
|
+
($i, $j, $k) = (0, 0, 0);
|
1502
|
+
do {
|
1503
|
+
$j = ($j + 1) & 0xff;
|
1504
|
+
$k = ($k + $enc[$j]) & 0xff;
|
1505
|
+
@enc[$j,$k] = @enc[$k,$j];
|
1506
|
+
$str[$i] ^= $enc[($enc[$j] + $enc[$k]) & 0xff];
|
1507
|
+
} while (++$i < @str);
|
1508
|
+
return pack('C*', @str);
|
1509
|
+
}
|
1510
|
+
|
1477
1511
|
#------------------------------------------------------------------------------
|
1478
1512
|
# Process "freeGPS " data blocks
|
1479
1513
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref {DataPt,SampleTime,SampleDuration}, 2) tagTable ref
|
@@ -1589,40 +1623,87 @@ sub ProcessFreeGPS($$$)
|
|
1589
1623
|
}
|
1590
1624
|
if (defined $lat) {
|
1591
1625
|
# extract accelerometer readings if GPS was valid
|
1592
|
-
|
1593
|
-
|
1594
|
-
map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
|
1626
|
+
# and change to signed integer and divide by 256
|
1627
|
+
@acc = map { MakeSigned / 256 } unpack('x68V3', $$dataPt);
|
1595
1628
|
}
|
1596
1629
|
|
1597
|
-
} elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])/s) {
|
1630
|
+
} elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])\0/s) {
|
1598
1631
|
|
1599
|
-
$debug and $et->FoundTag(GPSType => 3);
|
1600
|
-
# decode freeGPS from ViofoA119v3 dashcam (similar to Novatek GPS format)
|
1601
|
-
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1602
|
-
# 0010: 05 00 00 00 2f 00 00 00 03 00 00 00 13 00 00 00 [..../...........]
|
1603
|
-
# 0020: 09 00 00 00 1b 00 00 00 41 4e 57 00 25 d1 99 45 [........ANW.%..E]
|
1604
|
-
# 0030: f1 47 40 46 66 66 d2 41 85 eb 83 41 00 00 00 00 [.G@Fff.A...A....]
|
1605
1632
|
($latRef, $lonRef) = ($1, $2);
|
1606
1633
|
($hr,$min,$sec,$yr,$mon,$day) = unpack('x16V6', $$dataPt);
|
1607
|
-
|
1608
|
-
|
1609
|
-
|
1610
|
-
|
1611
|
-
|
1612
|
-
|
1613
|
-
$
|
1614
|
-
|
1615
|
-
|
1616
|
-
}
|
1617
|
-
$
|
1618
|
-
|
1619
|
-
|
1620
|
-
|
1621
|
-
|
1622
|
-
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1634
|
+
# test for base64-encoded and encrypted lucky gps strings
|
1635
|
+
my ($notEnc, $notStr, $lt, $ln);
|
1636
|
+
if (length($$dataPt) < 0x78) {
|
1637
|
+
$notEnc = $notStr = 1;
|
1638
|
+
} else {
|
1639
|
+
$lt = substr($$dataPt, 0x2c, 20), # latitude
|
1640
|
+
$ln = substr($$dataPt, 0x40, 20), # longitude
|
1641
|
+
/^[A-Za-z0-9+\/]{8,20}={0,2}\0*$/ or $notEnc = 1, last foreach ($lt, $ln);
|
1642
|
+
/^\d{1,5}\.\d+\0*$/ or $notStr = 1, last foreach ($lt, $ln);
|
1643
|
+
}
|
1644
|
+
if ($notEnc and $notStr) {
|
1645
|
+
|
1646
|
+
$debug and $et->FoundTag(GPSType => '3a');
|
1647
|
+
# decode freeGPS from ViofoA119v3 dashcam (similar to Novatek GPS format)
|
1648
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1649
|
+
# 0010: 05 00 00 00 2f 00 00 00 03 00 00 00 13 00 00 00 [..../...........]
|
1650
|
+
# 0020: 09 00 00 00 1b 00 00 00 41 4e 57 00 25 d1 99 45 [........ANW.%..E]
|
1651
|
+
# 0030: f1 47 40 46 66 66 d2 41 85 eb 83 41 00 00 00 00 [.G@Fff.A...A....]
|
1652
|
+
if ($yr >= 2000) {
|
1653
|
+
# Kenwood dashcam sometimes stores absolute year and local time
|
1654
|
+
# (but sometimes year since 2000 and UTC time in same video!)
|
1655
|
+
require Time::Local;
|
1656
|
+
my $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$yr);
|
1657
|
+
($sec,$min,$hr,$day,$mon,$yr) = gmtime($time);
|
1658
|
+
$yr += 1900;
|
1659
|
+
++$mon;
|
1660
|
+
$et->WarnOnce('Converting GPSDateTime to UTC based on local time zone',1);
|
1661
|
+
}
|
1662
|
+
$lat = GetFloat($dataPt, 0x2c);
|
1663
|
+
$lon = GetFloat($dataPt, 0x30);
|
1664
|
+
$spd = GetFloat($dataPt, 0x34) * $knotsToKph;
|
1665
|
+
$trk = GetFloat($dataPt, 0x38);
|
1666
|
+
# (may be all zeros or int16u counting from 1 to 6 if not valid)
|
1667
|
+
my $tmp = substr($$dataPt, 60, 12);
|
1668
|
+
if ($tmp ne "\0\0\0\0\0\0\0\0\0\0\0\0" and $tmp ne "\x01\0\x02\0\x03\0\x04\0\x05\0\x06\0") {
|
1669
|
+
@acc = map { MakeSigned / 256 } unpack('V3', $tmp);
|
1670
|
+
}
|
1671
|
+
|
1672
|
+
} else {
|
1673
|
+
|
1674
|
+
$debug and $et->FoundTag(GPSType => '3b');
|
1675
|
+
# decode freeGPS from E-ACE B44 dashcam
|
1676
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1677
|
+
# 0010: 08 00 00 00 22 00 00 00 01 00 00 00 18 00 00 00 [...."...........]
|
1678
|
+
# 0020: 08 00 00 00 10 00 00 00 41 4e 45 00 67 4e 69 69 [........ANE.gNii]
|
1679
|
+
# 0030: 5a 38 4a 54 74 48 63 61 36 74 77 3d 00 00 00 00 [Z8JTtHca6tw=....]
|
1680
|
+
# 0040: 68 74 75 69 5a 4d 4a 53 73 58 55 58 37 4e 6f 3d [htuiZMJSsXUX7No=]
|
1681
|
+
# 0050: 00 00 00 00 64 3b ac 41 e1 3a 1d 43 2b 01 00 00 [....d;.A.:.C+...]
|
1682
|
+
# 0060: fd ff ff ff 43 00 00 00 32 4a 37 31 50 70 55 48 [....C...2J71PpUH]
|
1683
|
+
# 0070: 37 69 68 66 00 00 00 00 00 00 00 00 00 00 00 00 [7ihf............]
|
1684
|
+
# (16-byte string at 0x68 is base64 encoded and encrypted 'luckychip' string)
|
1685
|
+
$spd = GetFloat($dataPt, 0x54) * $knotsToKph;
|
1686
|
+
$trk = GetFloat($dataPt, 0x58);
|
1687
|
+
@acc = map MakeSigned, unpack('x92V3', $$dataPt);
|
1688
|
+
# (accelerometer scaling is roughly 300=1G, but this doesn't seem to be exact for each
|
1689
|
+
# axis, so leave the values as raw. The axes are positive acceleration up,left,forward)
|
1690
|
+
if ($notEnc) { # (not encrypted)
|
1691
|
+
($lat = $lt) =~ s/\0+$//;
|
1692
|
+
($lon = $ln) =~ s/\0+$//;
|
1693
|
+
} else {
|
1694
|
+
# decode base64 strings
|
1695
|
+
require Image::ExifTool::XMP;
|
1696
|
+
$_ = ${Image::ExifTool::XMP::DecodeBase64($_)} foreach ($lt, $ln);
|
1697
|
+
# try various keys to decrypt lat/lon
|
1698
|
+
my ($i, $ch, $key) = (0, 'a', $luckyKeys[0]);
|
1699
|
+
for (; $i<20; ++$i) {
|
1700
|
+
$i and ($key = $luckyKeys[1]) =~ s/#/$ch/g, ++$ch;
|
1701
|
+
($lat = DecryptLucky($lt, $key)) =~ /^\d{1,4}\.\d+$/ or undef($lat), next;
|
1702
|
+
($lon = DecryptLucky($ln, $key)) =~ /^\d{1,5}\.\d+$/ or undef($lon), next;
|
1703
|
+
last;
|
1704
|
+
}
|
1705
|
+
$lon or $et->WarnOnce('Unknown encryption for latitude/longitude');
|
1706
|
+
}
|
1626
1707
|
}
|
1627
1708
|
|
1628
1709
|
} elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) {
|
@@ -1683,7 +1764,7 @@ sub ProcessFreeGPS($$$)
|
|
1683
1764
|
$trk -= 360 if $trk >= 360;
|
1684
1765
|
undef @acc;
|
1685
1766
|
} else {
|
1686
|
-
|
1767
|
+
@acc = map { MakeSigned / 1000 } @acc; # (NC)
|
1687
1768
|
}
|
1688
1769
|
|
1689
1770
|
} elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
|
@@ -1787,7 +1868,7 @@ sub ProcessFreeGPS($$$)
|
|
1787
1868
|
return 0;
|
1788
1869
|
}
|
1789
1870
|
# (not sure about acc scaling)
|
1790
|
-
|
1871
|
+
@acc = map { MakeSigned / 1000 } @acc;
|
1791
1872
|
$lon = GetFloat($dataPt, 0x5c);
|
1792
1873
|
$lat = GetFloat($dataPt, 0x60);
|
1793
1874
|
$spd = GetFloat($dataPt, 0x64) * $knotsToKph;
|
@@ -1932,7 +2013,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
1932
2013
|
# 0x7c - int32s[3] accelerometer * 1000
|
1933
2014
|
($latRef, $lonRef) = ($1, $2);
|
1934
2015
|
($hr,$min,$sec,$yr,$mon,$day,@acc) = unpack('x48V3x52V6', $$dataPt);
|
1935
|
-
|
2016
|
+
@acc = map { MakeSigned / 1000 } @acc;
|
1936
2017
|
$lat = GetDouble($dataPt, 0x40);
|
1937
2018
|
$lon = GetDouble($dataPt, 0x50);
|
1938
2019
|
$spd = GetDouble($dataPt, 0x60) * $knotsToKph;
|
@@ -1948,8 +2029,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
1948
2029
|
$lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
|
1949
2030
|
$spd = GetFloat(\$dat, 12) * $knotsToKph;
|
1950
2031
|
$trk = GetFloat(\$dat, 16);
|
1951
|
-
@acc = unpack('x20V3', $dat);
|
1952
|
-
map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc;
|
2032
|
+
@acc = map MakeSigned, unpack('x20V3', $dat);
|
1953
2033
|
ConvertLatLon($lat, $lon);
|
1954
2034
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
1955
2035
|
$et->HandleTag($tagTbl, GPSLatitude => $lat * (substr($dat,1,1) eq 'S' ? -1 : 1));
|
@@ -1983,7 +2063,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
1983
2063
|
$lon = abs(GetDouble($dataPt, 48)); # (abs just to be safe)
|
1984
2064
|
$spd = GetDouble($dataPt, 64) * $knotsToKph;
|
1985
2065
|
$trk = GetDouble($dataPt, 72);
|
1986
|
-
|
2066
|
+
@acc = map { MakeSigned / 1000 } @acc; # (NC)
|
1987
2067
|
# (not necessary to read RMC sentence because we already have it all)
|
1988
2068
|
|
1989
2069
|
} elsif ($$dataPt =~ /^.{72}A[NS][EW]\0/s) {
|
@@ -2117,7 +2197,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2117
2197
|
$day < 1 or $day > 31 or
|
2118
2198
|
$hr > 59 or $min > 59 or $sec > 600;
|
2119
2199
|
# change lat/lon to signed integer and divide by 1e7
|
2120
|
-
|
2200
|
+
($lat, $lon) = map { MakeSigned / 1e7 } $lat, $lon;
|
2121
2201
|
$trk -= 0x10000 if $trk >= 0x8000; # make it signed
|
2122
2202
|
$trk /= 100;
|
2123
2203
|
$trk += 360 if $trk < 0;
|
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
23
23
|
use Image::ExifTool::Exif;
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.58';
|
26
26
|
|
27
27
|
sub WriteSTMN($$$);
|
28
28
|
sub ProcessINFO($$$);
|
@@ -957,7 +957,7 @@ my %formatMinMax = (
|
|
957
957
|
Samsung models such as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
958
958
|
HEIC images from models such as the S10+.
|
959
959
|
},
|
960
|
-
'0x0001-name' => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
|
960
|
+
'0x0001-name' => 'EmbeddedImageName', # ("DualShot_1","DualShot_2","SingleShot")
|
961
961
|
'0x0001' => [
|
962
962
|
{
|
963
963
|
Name => 'EmbeddedImage',
|
@@ -970,6 +970,7 @@ my %formatMinMax = (
|
|
970
970
|
Groups => { 2 => 'Preview' },
|
971
971
|
Binary => 1,
|
972
972
|
},
|
973
|
+
# (have also seen the string "BOKEH" here (SM-A226B)
|
973
974
|
],
|
974
975
|
'0x0100-name' => 'EmbeddedAudioFileName', # ("SoundShot_000")
|
975
976
|
'0x0100' => { Name => 'EmbeddedAudioFile', Groups => { 2 => 'Audio' }, Binary => 1 },
|
@@ -1265,6 +1266,7 @@ my %formatMinMax = (
|
|
1265
1266
|
'0x0b40' => { # (SM-N975X front camera)
|
1266
1267
|
Name => 'SingleShotMeta',
|
1267
1268
|
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::SingleShotMeta' },
|
1269
|
+
# (have also see the string "BOKEH_INFO" here (SM-A226B)
|
1268
1270
|
},
|
1269
1271
|
# 0x0b41-name - seen 'SingeShot_DepthMap_1' (Yes, "Singe") (SM-N975X front camera)
|
1270
1272
|
'0x0b41' => { Name => 'SingleShotDepthMap', Binary => 1 },
|
@@ -1493,7 +1495,7 @@ sub ProcessSamsungMeta($$$)
|
|
1493
1495
|
my $pos = $$dirInfo{DirStart};
|
1494
1496
|
my $end = $$dirInfo{DirLen} + $pos;
|
1495
1497
|
unless ($pos + 8 <= $end and substr($$dataPt, $pos, 4) eq 'DOFS') {
|
1496
|
-
$et->Warn("Unrecognized $dirName data");
|
1498
|
+
$et->Warn("Unrecognized $dirName data", 1);
|
1497
1499
|
return 0;
|
1498
1500
|
}
|
1499
1501
|
my $ver = Get32u($dataPt, $pos + 4);
|
@@ -3133,7 +3133,7 @@ my %tagLookup = (
|
|
3133
3133
|
'focallength' => { 7 => 0x1d, 8 => 0xa, 9 => 0x23, 10 => 0x9, 11 => 0x1d, 12 => 0x9, 13 => 0x1e, 14 => 0x1d, 15 => 0x1d, 16 => 0x1e, 17 => 0x1e, 18 => 0x1e, 19 => 0x28, 20 => 0x1e, 21 => 0x23, 22 => 0x1e, 23 => 0x1e, 24 => 0x23, 25 => 0x23, 26 => 0x23, 27 => 0x23, 28 => 0x1e, 29 => 0x23, 61 => 0x1, 64 => 0x7, 117 => 0x1d, 123 => 0x920a, 151 => 0x1d, 167 => 'FocalLength', 185 => 0x12, 233 => 0xa, 234 => 0xb, 238 => [0xc,0x3c], 343 => 0x1, 385 => 0x1d, 394 => 0x403, 417 => 0x1500, 436 => 0xe, 464 => 0x1278, 465 => 0x1134, 466 => 0x32c, 467 => 0x32c, 468 => 0x30a, 520 => 'FocalLength' },
|
3134
3134
|
'focallength2' => { 456 => [0x23,0x25,0x29] },
|
3135
3135
|
'focallength35mm' => { 339 => 'FocalLength35mm' },
|
3136
|
-
'focallengthin35mmformat' => { 123 => 0xa405, 424 => 0xa01a, 520 => 'FocalLengthIn35mmFilm' },
|
3136
|
+
'focallengthin35mmformat' => { 123 => 0xa405, 404 => 'camera.focal_length.35mm_equivalent', 424 => 0xa01a, 520 => 'FocalLengthIn35mmFilm' },
|
3137
3137
|
'focallengthtelezoom' => { 436 => 0x10 },
|
3138
3138
|
'focalplaneafpointarea' => { 469 => 0x2 },
|
3139
3139
|
'focalplaneafpointlocation1' => { 469 => 0x6 },
|
@@ -4116,7 +4116,7 @@ my %tagLookup = (
|
|
4116
4116
|
'lensmanualdistortionamount' => { 514 => 'LensManualDistortionAmount', 516 => 'LensManualDistortionAmount' },
|
4117
4117
|
'lensmanufacturer' => { 182 => 'LensManufacturer' },
|
4118
4118
|
'lensmaxaperturerange' => { 427 => 0x2b },
|
4119
|
-
'lensmodel' => { 7 => 0x937, 14 => 0x92b, 15 => 0x933, 67 => 0x95, 123 => 0xa434, 167 => 'Model', 182 => 'LensModel', 235 => 0x18a, 236 => 0x18b, 237 => 0x2ac, 326 => 0x203, 381 => 0xc, 394 => 0x412, 521 => 'LensModel' },
|
4119
|
+
'lensmodel' => { 7 => 0x937, 14 => 0x92b, 15 => 0x933, 67 => 0x95, 123 => 0xa434, 167 => 'Model', 182 => 'LensModel', 235 => 0x18a, 236 => 0x18b, 237 => 0x2ac, 326 => 0x203, 381 => 0xc, 394 => 0x412, 404 => 'camera.lens_model', 521 => 'LensModel' },
|
4120
4120
|
'lensmodulationoptimizer' => { 131 => 0x1045 },
|
4121
4121
|
'lensmount' => { 439 => 0x99, 464 => 0x1892, 466 => 0x18be, 467 => 0x18ee, 468 => 0x17f2, 470 => 0x105, 471 => 0x105, 482 => 0x604, 483 => 0x5e },
|
4122
4122
|
'lensmount2' => { 487 => 0x8 },
|
@@ -4727,7 +4727,8 @@ my %tagLookup = (
|
|
4727
4727
|
'maxavailwidth' => { 528 => 'MaxAvailWidth' },
|
4728
4728
|
'maxcontinuousrelease' => { 305 => 0xb, 306 => 0xc, 308 => '12.1', 309 => '12.1', 314 => 0xc, 315 => 0xb, 318 => '12.1', 319 => '12.1', 321 => 0x3d, 322 => 0x3d, 323 => 0x3d },
|
4729
4729
|
'maxfaces' => { 329 => 0x1202 },
|
4730
|
-
'maxfocallength' => { 7 => 0xe6, 8 => 0x10, 9 => 0x1ab, 10 => 0x13, 11 => 0x115, 12 => 0x13, 13 => 0x153, 14 => 0xda, 16 => 0xfa, 17 => 0xee, 18 => 0x103, 19 => 0x95, 20 => 0xea, 21 => 0x157, 22 => 0xee, 23 => 0xec, 24 => 0x12b, 25 => 0x165, 26 => 0x16a, 27 => 0x188, 28 => 0x116, 29 => 0x18d, 36 => 0x17,
|
4730
|
+
'maxfocallength' => { 7 => 0xe6, 8 => 0x10, 9 => 0x1ab, 10 => 0x13, 11 => 0x115, 12 => 0x13, 13 => 0x153, 14 => 0xda, 16 => 0xfa, 17 => 0xee, 18 => 0x103, 19 => 0x95, 20 => 0xea, 21 => 0x157, 22 => 0xee, 23 => 0xec, 24 => 0x12b, 25 => 0x165, 26 => 0x16a, 27 => 0x188, 28 => 0x116, 29 => 0x18d, 36 => 0x17, 131 => 0x1405, 167 => 'MaxFocalLength', 232 => 0x9, 233 => 0xe, 234 => 0xf, 238 => 0x10, 326 => 0x208, 464 => 0x127c, 465 => 0x1138, 466 => 0x330, 467 => 0x330, 468 => 0x30e },
|
4731
|
+
'maxfocallength2' => { 64 => 0x9 },
|
4731
4732
|
'maximumdensityrange' => { 137 => 0x8c },
|
4732
4733
|
'maxpagesize' => { 548 => 'MaxPageSize' },
|
4733
4734
|
'maxpagesizeh' => { 548 => [\'MaxPageSize','MaxPageSizeH'] },
|
@@ -4830,7 +4831,8 @@ my %tagLookup = (
|
|
4830
4831
|
'mime' => { 499 => 'Mime' },
|
4831
4832
|
'minaperture' => { 36 => 0x1b, 142 => 0x3f8, 167 => 'MinAperture', 375 => '0.2' },
|
4832
4833
|
'minaperturevalue' => { 394 => 0x415 },
|
4833
|
-
'minfocallength' => { 7 => 0xe4, 8 => 0xe, 9 => 0x1a9, 10 => 0x11, 11 => 0x113, 12 => 0x11, 13 => 0x151, 14 => 0xd8, 16 => 0xf8, 17 => 0xec, 18 => 0x101, 19 => 0x93, 20 => 0xe8, 21 => 0x155, 22 => 0xec, 23 => 0xea, 24 => 0x129, 25 => 0x163, 26 => 0x168, 27 => 0x186, 28 => 0x114, 29 => 0x18b, 36 => 0x18,
|
4834
|
+
'minfocallength' => { 7 => 0xe4, 8 => 0xe, 9 => 0x1a9, 10 => 0x11, 11 => 0x113, 12 => 0x11, 13 => 0x151, 14 => 0xd8, 16 => 0xf8, 17 => 0xec, 18 => 0x101, 19 => 0x93, 20 => 0xe8, 21 => 0x155, 22 => 0xec, 23 => 0xea, 24 => 0x129, 25 => 0x163, 26 => 0x168, 27 => 0x186, 28 => 0x114, 29 => 0x18b, 36 => 0x18, 131 => 0x1404, 167 => 'MinFocalLength', 232 => 0x8, 233 => 0xd, 234 => 0xe, 238 => 0xf, 326 => 0x207, 464 => 0x127a, 465 => 0x1136, 466 => 0x32e, 467 => 0x32e, 468 => 0x30c },
|
4835
|
+
'minfocallength2' => { 64 => 0x8 },
|
4834
4836
|
'minfocusdistance' => { 375 => 0x3 },
|
4835
4837
|
'minimumiso' => { 349 => 0xe8 },
|
4836
4838
|
'minintegrationrows' => { 142 => 0x1874 },
|
@@ -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 27899 tags, with 17464 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
|
@@ -11601,8 +11601,8 @@ Information about creative filter settings.
|
|
11601
11601
|
4 RollAngle int32s
|
11602
11602
|
5 PitchAngle int32s
|
11603
11603
|
7 FocalLength int32s
|
11604
|
-
8
|
11605
|
-
9
|
11604
|
+
8 MinFocalLength2 int32s
|
11605
|
+
9 MaxFocalLength2 int32s
|
11606
11606
|
|
11607
11607
|
=head3 Canon CTMD Tags
|
11608
11608
|
|
@@ -29618,7 +29618,7 @@ for the official QuickTime specification.
|
|
29618
29618
|
The tags below are extracted from timed metadata in QuickTime and other
|
29619
29619
|
formats of video files when the ExtractEmbedded option is used. Although
|
29620
29620
|
most of these tags are combined into the single table below, ExifTool
|
29621
|
-
currently reads
|
29621
|
+
currently reads 77 different formats of timed GPS metadata from video files.
|
29622
29622
|
|
29623
29623
|
Tag Name Writable
|
29624
29624
|
-------- --------
|
@@ -29818,9 +29818,12 @@ changed via the config file.
|
|
29818
29818
|
'artist' Artist yes
|
29819
29819
|
'artwork' Artwork yes
|
29820
29820
|
'author' Author yes
|
29821
|
+
'camera.focal_length.35mm_equivalent'
|
29822
|
+
FocalLengthIn35mmFormat yes
|
29821
29823
|
'camera.framereadouttimeinmicroseconds'
|
29822
29824
|
FrameReadoutTime yes
|
29823
29825
|
'camera.identifier' CameraIdentifier yes
|
29826
|
+
'camera.lens_model' LensModel yes
|
29824
29827
|
'collection.user' UserCollection yes
|
29825
29828
|
'com.android.capture.fps' AndroidCaptureFPS yes
|
29826
29829
|
'com.android.version' AndroidVersion yes
|
@@ -2835,7 +2835,10 @@ sub GetAllGroups($;$)
|
|
2835
2835
|
$family == 3 and return('Doc#', 'Main');
|
2836
2836
|
$family == 4 and return('Copy#');
|
2837
2837
|
$family == 5 and return('[too many possibilities to list]');
|
2838
|
-
$family == 6
|
2838
|
+
if ($family == 6) {
|
2839
|
+
my $fn = \%Image::ExifTool::Exif::formatNumber;
|
2840
|
+
return(sort { $$fn{$a} <=> $$fn{$b} } keys %$fn);
|
2841
|
+
}
|
2839
2842
|
$family == 8 and return('File#');
|
2840
2843
|
|
2841
2844
|
LoadAllTables(); # first load all our tables
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
30
30
|
%static_vars $advFmtSelf);
|
31
31
|
|
32
|
-
$VERSION = '12.
|
32
|
+
$VERSION = '12.93';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 12.
|
4
|
+
version: 12.93.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|