exiftool_vendored 12.95.0 → 12.96.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 +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
|