exiftool_vendored 12.95.0 → 12.96.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 +6 -0
- 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/Geotag.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +20 -14
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +34 -35
- 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: 470de93eb9d8ccb910e0eb1526fb6b9e1e45cbbeb4a88f63c11ddb4bf33d12b8
|
4
|
+
data.tar.gz: 90cf2dd30483d655432ef216f8af1751878fc02b140167eb2f301d856c96109d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c22dbe664b9eb4ff2327da76ffeea627b45cc47815e3699202d162503c3129c3a31d5b6f2c380dffdedff2a4dccd6a2bd86b68a8ed2e9003b43168788f1df7f8
|
7
|
+
data.tar.gz: 1c86569ae1b1a15088e5ff7a9b13b339ecec57b7df35f97d531e29908fe26d10967ccd71b0a4feba0d6a5e37849cbbfea7526000072fe34692141ce694169717
|
data/bin/Changes
CHANGED
@@ -7,6 +7,12 @@ 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
|
+
Sept. 1, 2024 - Version 12.96
|
11
|
+
|
12
|
+
- More improvements to handling of trailers on video files (and add ability to
|
13
|
+
write videos which have an unknown trailer)
|
14
|
+
- Fixed problem geotagging from some newer Google Takeout files
|
15
|
+
|
10
16
|
Aug. 30, 2024 - Version 12.95
|
11
17
|
|
12
18
|
- Added a couple of new CanonModelID values
|
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.96.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-12.96
|
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.96';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -5655,7 +5655,7 @@ with this command:
|
|
5655
5655
|
|
5656
5656
|
produces output like this:
|
5657
5657
|
|
5658
|
-
-- Generated by ExifTool 12.
|
5658
|
+
-- Generated by ExifTool 12.96 --
|
5659
5659
|
File: a.jpg - 2003:10:31 15:44:19
|
5660
5660
|
(f/5.6, 1/60s, ISO 100)
|
5661
5661
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:Public);
|
32
32
|
use Image::ExifTool::GPS;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.78';
|
35
35
|
|
36
36
|
sub JITTER() { return 2 } # maximum time jitter
|
37
37
|
|
@@ -323,7 +323,7 @@ sub LoadTrackLog($$;$)
|
|
323
323
|
# Google Takeout JSON format
|
324
324
|
$format = 'JSON';
|
325
325
|
$sortFixes = 1; # (fixes are not all in order for this format)
|
326
|
-
} elsif (/"durationMinutesOffsetFromStartTime"\s*:/) {
|
326
|
+
} elsif (/"(durationMinutesOffsetFromStartTime|startTime)"\s*:/) {
|
327
327
|
$format = 'JSON'; # new Google Takeout JSON format (fixes seem to be in order)
|
328
328
|
$raf->Seek(0,0); # rewind to start of file
|
329
329
|
} else {
|
@@ -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 = '3.
|
51
|
+
$VERSION = '3.02';
|
52
52
|
|
53
53
|
sub ProcessMOV($$;$);
|
54
54
|
sub ProcessKeys($$$);
|
@@ -9528,7 +9528,7 @@ sub ProcessMOV($$;$)
|
|
9528
9528
|
my $dirID = $$dirInfo{DirID} || '';
|
9529
9529
|
my $charsetQuickTime = $et->Options('CharsetQuickTime');
|
9530
9530
|
my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
|
9531
|
-
my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
|
9531
|
+
my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr, $trailer);
|
9532
9532
|
|
9533
9533
|
my $topLevel = not $$et{InQuickTime};
|
9534
9534
|
$$et{InQuickTime} = 1;
|
@@ -9557,6 +9557,17 @@ sub ProcessMOV($$;$)
|
|
9557
9557
|
$tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
|
9558
9558
|
}
|
9559
9559
|
($size, $tag) = unpack('Na4', $buff);
|
9560
|
+
my $fast = $$et{OPTIONS}{FastScan} || 0;
|
9561
|
+
# check for Insta360 trailer
|
9562
|
+
if ($topLevel and not $fast) {
|
9563
|
+
my $pos = $raf->Tell();
|
9564
|
+
if ($raf->Seek(-40, 2) and $raf->Read($buff, 40) == 40 and
|
9565
|
+
substr($buff, 8) eq '8db42d694ccc418790edff439fe026bf')
|
9566
|
+
{
|
9567
|
+
$trailer = [ 'Insta360', $raf->Tell() - unpack('V',$buff) ];
|
9568
|
+
}
|
9569
|
+
$raf->Seek($pos,0) or return 0;
|
9570
|
+
}
|
9560
9571
|
if ($dataPt) {
|
9561
9572
|
$verbose and $et->VerboseDir($$dirInfo{DirName});
|
9562
9573
|
} else {
|
@@ -9595,7 +9606,6 @@ sub ProcessMOV($$;$)
|
|
9595
9606
|
# have XMP take priority except for HEIC
|
9596
9607
|
$$et{PRIORITY_DIR} = 'XMP' unless $fileType and $fileType eq 'HEIC';
|
9597
9608
|
}
|
9598
|
-
my $fast = $$et{OPTIONS}{FastScan} || 0;
|
9599
9609
|
$$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
|
9600
9610
|
|
9601
9611
|
my $ee = $$et{OPTIONS}{ExtractEmbedded};
|
@@ -10136,6 +10146,10 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10136
10146
|
$dataPos += $size + 8; # point to start of next atom data
|
10137
10147
|
last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
|
10138
10148
|
$lastPos = $raf->Tell() + $dirBase;
|
10149
|
+
if ($trailer and $lastPos >= $$trailer[1]) {
|
10150
|
+
$et->Warn(sprintf('%s trailer at offset 0x%x', @$trailer), 1);
|
10151
|
+
last;
|
10152
|
+
}
|
10139
10153
|
$raf->Read($buff, 8) == 8 or last;
|
10140
10154
|
$lastTag = $tag if $$tagTablePtr{$tag} and $tag ne 'free'; # (Insta360 sometimes puts free block before trailer)
|
10141
10155
|
($size, $tag) = unpack('Na4', $buff);
|
@@ -10143,19 +10157,11 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10143
10157
|
}
|
10144
10158
|
if ($warnStr) {
|
10145
10159
|
# assume this is an unknown trailer if it comes immediately after
|
10146
|
-
# mdat or moov
|
10147
|
-
|
10148
|
-
if (($lastTag eq 'mdat' or $lastTag eq 'moov' or $lastTag eq 'free') and
|
10160
|
+
# mdat or moov and has a tag name we don't recognize
|
10161
|
+
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and
|
10149
10162
|
(not $$tagTablePtr{$tag} or ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
10150
10163
|
{
|
10151
|
-
|
10152
|
-
substr($buff, 8) eq '8db42d694ccc418790edff439fe026bf' and
|
10153
|
-
$lastPos == $raf->Tell() - unpack('V',$buff))
|
10154
|
-
{
|
10155
|
-
$et->Warn(sprintf('Insta360 trailer at offset 0x%x', $lastPos), 1);
|
10156
|
-
} else {
|
10157
|
-
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
10158
|
-
}
|
10164
|
+
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
10159
10165
|
} else {
|
10160
10166
|
$et->Warn($warnStr);
|
10161
10167
|
}
|
@@ -847,7 +847,7 @@ sub WriteQuickTime($$$)
|
|
847
847
|
$et or return 1; # allow dummy access to autoload this package
|
848
848
|
my ($mdat, @mdat, @mdatEdit, $edit, $track, $outBuff, $co, $term, $delCount);
|
849
849
|
my (%langTags, $canCreate, $delGrp, %boxPos, %didDir, $writeLast, $err, $atomCount);
|
850
|
-
my ($tag, $lastTag, $lastPos, $errStr, $
|
850
|
+
my ($tag, $lastTag, $lastPos, $errStr, $trailer, $buf2);
|
851
851
|
my $outfile = $$dirInfo{OutFile} || return 0;
|
852
852
|
my $raf = $$dirInfo{RAF}; # (will be null for lower-level atoms)
|
853
853
|
my $dataPt = $$dirInfo{DataPt}; # (will be null for top-level atoms)
|
@@ -860,6 +860,16 @@ sub WriteQuickTime($$$)
|
|
860
860
|
my $createKeys = 0;
|
861
861
|
my ($rtnVal, $rtnErr) = $dataPt ? (undef, undef) : (1, 0);
|
862
862
|
|
863
|
+
# check for Insta360 trailer at top level
|
864
|
+
if ($raf) {
|
865
|
+
my $pos = $raf->Tell();
|
866
|
+
if ($raf->Seek(-40, 2) and $raf->Read($buf2, 40) == 40 and
|
867
|
+
substr($buf2, 8) eq '8db42d694ccc418790edff439fe026bf')
|
868
|
+
{
|
869
|
+
$trailer = [ 'Insta360', $raf->Tell() - unpack('V',$buf2) ];
|
870
|
+
}
|
871
|
+
$raf->Seek($pos, 0) or return 0;
|
872
|
+
}
|
863
873
|
if ($dataPt) {
|
864
874
|
$raf = File::RandomAccess->new($dataPt);
|
865
875
|
} else {
|
@@ -924,6 +934,11 @@ sub WriteQuickTime($$$)
|
|
924
934
|
|
925
935
|
for (;;) { # loop through all atoms at this level
|
926
936
|
$lastPos = $raf->Tell();
|
937
|
+
# stop processing if we reached a known trailer
|
938
|
+
if ($trailer and $lastPos >= $$trailer[1]) {
|
939
|
+
$errStr = "Corrupted $$trailer[0] trailer" if $lastPos != $$trailer[1];
|
940
|
+
last;
|
941
|
+
}
|
927
942
|
$lastTag = $tag if $$tagTablePtr{$tag}; # keep track of last known tag
|
928
943
|
if (defined $atomCount and --$atomCount < 0 and $dataPt) {
|
929
944
|
# stop processing now and just copy the rest of the atom
|
@@ -1524,38 +1539,18 @@ sub WriteQuickTime($$$)
|
|
1524
1539
|
}
|
1525
1540
|
# ($errStr is set if there was an error that could possibly be due to an unknown trailer)
|
1526
1541
|
if ($errStr) {
|
1527
|
-
if (($lastTag eq 'mdat' or $lastTag eq 'moov'
|
1528
|
-
|
1542
|
+
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and not $dataPt and (not $$tagTablePtr{$tag} or
|
1543
|
+
ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
1529
1544
|
{
|
1530
|
-
# identify known trailers
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1545
|
+
# identify other known trailers
|
1546
|
+
$buf2 = '';
|
1547
|
+
$raf->Seek($lastPos,0) and $raf->Read($buf2,8);
|
1548
|
+
if ($buf2 eq 'CCCCCCCC') {
|
1549
|
+
$trailer = [ 'Kenwood', $lastPos ];
|
1550
|
+
} elsif ($buf2 =~ /^(gpsa|gps0|gsen|gsea)...\0/s) {
|
1551
|
+
$trailer = [ 'RIFF', $lastPos ];
|
1536
1552
|
} else {
|
1537
|
-
$
|
1538
|
-
$raf->Seek($lastPos,0) and $raf->Read($buf2,8);
|
1539
|
-
if ($buf2 eq 'CCCCCCCC') {
|
1540
|
-
$copyTrailer = [ $lastPos, 'Kenwood' ];
|
1541
|
-
} elsif ($buf2 =~ /^(gpsa|gps0|gsen|gsea)...\0/s) {
|
1542
|
-
$copyTrailer = [ $lastPos, 'RIFF' ];
|
1543
|
-
}
|
1544
|
-
}
|
1545
|
-
# are we deleting the trailer?
|
1546
|
-
my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
|
1547
|
-
if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
|
1548
|
-
$errStr =~ s/ is too large.*//;
|
1549
|
-
if ($copyTrailer) {
|
1550
|
-
$et->Warn("Deleted $$copyTrailer[1] trailer", 1);
|
1551
|
-
undef $copyTrailer;
|
1552
|
-
} else {
|
1553
|
-
$et->Warn('Deleted unknown trailer with ' . lcfirst($errStr), 1);
|
1554
|
-
}
|
1555
|
-
} elsif (not $copyTrailer) {
|
1556
|
-
$et->Warn('Unknown trailer with ' . lcfirst($errStr));
|
1557
|
-
$et->Error('Use "-trailer=" to delete unknown trailer');
|
1558
|
-
# (we don't currently copy an unknown trailer due to the chance it could be corrupted data)
|
1553
|
+
$trailer = [ 'Unknown', $lastPos ];
|
1559
1554
|
}
|
1560
1555
|
} else {
|
1561
1556
|
$et->Error($errStr);
|
@@ -2011,16 +2006,20 @@ sub WriteQuickTime($$$)
|
|
2011
2006
|
Write($outfile, $writeLast) or $rtnVal = 0 if $writeLast;
|
2012
2007
|
|
2013
2008
|
# copy trailer if necessary
|
2014
|
-
if ($
|
2015
|
-
|
2016
|
-
|
2009
|
+
if ($rtnVal and $trailer) {
|
2010
|
+
# are we deleting the trailer?
|
2011
|
+
my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
|
2012
|
+
if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
|
2013
|
+
$et->Warn("Deleted $$trailer[0] trailer", 1);
|
2014
|
+
} elsif ($raf->Seek($$trailer[1])) {
|
2015
|
+
$et->Warn(sprintf('Copying %s trailer from offset 0x%x', @$trailer), 1);
|
2017
2016
|
while ($raf->Read($buf2, 65536)) {
|
2018
2017
|
Write($outfile, $buf2) or $rtnVal = 0, last;
|
2019
2018
|
}
|
2020
2019
|
} else {
|
2021
|
-
$et->Error('Error copying Insta360 trailer');
|
2022
2020
|
$rtnVal = 0;
|
2023
2021
|
}
|
2022
|
+
$rtnVal or $et->Error("Error copying $$trailer[0] trailer");
|
2024
2023
|
}
|
2025
2024
|
return $rtnVal;
|
2026
2025
|
}
|
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.96';
|
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.96.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-09-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|