exiftool_vendored 12.81.0 → 12.82.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 +19 -1
- 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 +13 -7
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +44 -31
- data/bin/lib/Image/ExifTool/FujiFilm.pm +9 -2
- data/bin/lib/Image/ExifTool/GM.pm +543 -0
- data/bin/lib/Image/ExifTool/Geolocation.pm +43 -20
- data/bin/lib/Image/ExifTool/Nikon.pm +3 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +28 -23
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +61 -30
- data/bin/lib/Image/ExifTool/README +2 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +26 -1
- data/bin/lib/Image/ExifTool/TagNames.pod +392 -237
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +3 -1
- data/bin/lib/Image/ExifTool/Writer.pl +2 -2
- data/bin/lib/Image/ExifTool/XMP.pm +3 -2
- data/bin/lib/Image/ExifTool.pm +27 -5
- data/bin/lib/Image/ExifTool.pod +18 -11
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e72fd223e20ba074cc12f4a4b8746c48911099845c2b0bdabb3066ba3b68c930
|
4
|
+
data.tar.gz: 03c78c3768b36216b3ad2c5d83d1fbd9e3e702581d2bd2cd09ce85b895fe169e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a0c7336b467061e914f44977a25fa24cb67572998306b21b1019b346ecd423a908774759c9af636f79ff3467624762cd5437d5c347e1a6475f78e6ea839fba5
|
7
|
+
data.tar.gz: b654799b378c684a8d2ec1d2638e3d16de1d9daf91b67f1c0c681fc1407872e057f94b90d630a0cc2218ec286c4d92e5c0a2df4f01ed730f9852feb527857d98
|
data/bin/Changes
CHANGED
@@ -7,6 +7,24 @@ 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
|
+
Apr. 5, 2024 - Version 12.82 - "GM PDR"
|
11
|
+
|
12
|
+
- Added support for reading GM PDR data from MP4 videos written by cars such
|
13
|
+
as Corvettes and Cameros
|
14
|
+
- Added support for reading timed GPS from Wolfbox dashcam videos
|
15
|
+
- Added "Unknown trailer" to QuickTime warnings originating from an unknown
|
16
|
+
trailer
|
17
|
+
- Added a new Nikon LensID
|
18
|
+
- Extract PreviewImage from Chigee AIO-5 dashcam videos
|
19
|
+
- Changed name and print conversion of a recently added FujiFilm tag
|
20
|
+
- Only issue "Tag not defined" warnings for the first sub-document when using
|
21
|
+
the -p option
|
22
|
+
- Fixed a Nikon Z lens name (github #250)
|
23
|
+
- Fixed Windows version so -sort works properly with -listgeo
|
24
|
+
- API Changes:
|
25
|
+
- Added PrintCSV option for optimized extraction of GM PDR data in CSV
|
26
|
+
format
|
27
|
+
|
10
28
|
Mar. 27, 2024 - Version 12.81
|
11
29
|
|
12
30
|
- Added ability to read EXIF and XMP from EXR images
|
@@ -19,8 +37,8 @@ Mar. 27, 2024 - Version 12.81
|
|
19
37
|
- Added support for new version of Canon DR4 files
|
20
38
|
- Added a number of new iTunesInfo tags
|
21
39
|
- Added a new Olympus LensType
|
22
|
-
- Allow regular expressions to be used when writing Geolocate tag
|
23
40
|
- Decode a number of new Nikon tags (thanks Warren Hatch)
|
41
|
+
- Allow regular expressions to be used when writing Geolocate tag
|
24
42
|
- Enhanced writing of Geolocate tag to also write Keys:LocationName
|
25
43
|
- Cache the results of the last reverse geolocation search to speed batch
|
26
44
|
processing when multiple files have the same search parameters
|
data/bin/MANIFEST
CHANGED
@@ -80,6 +80,7 @@ html/TagNames/FujiFilm.html
|
|
80
80
|
html/TagNames/GE.html
|
81
81
|
html/TagNames/GIF.html
|
82
82
|
html/TagNames/GIMP.html
|
83
|
+
html/TagNames/GM.html
|
83
84
|
html/TagNames/GPS.html
|
84
85
|
html/TagNames/GeoTiff.html
|
85
86
|
html/TagNames/GoPro.html
|
@@ -293,6 +294,7 @@ lib/Image/ExifTool/FujiFilm.pm
|
|
293
294
|
lib/Image/ExifTool/GE.pm
|
294
295
|
lib/Image/ExifTool/GIF.pm
|
295
296
|
lib/Image/ExifTool/GIMP.pm
|
297
|
+
lib/Image/ExifTool/GM.pm
|
296
298
|
lib/Image/ExifTool/GPS.pm
|
297
299
|
lib/Image/ExifTool/GeoLang/cs.pm
|
298
300
|
lib/Image/ExifTool/GeoLang/de.pm
|
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.82.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-12.82
|
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.82';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -217,7 +217,7 @@ my $tmpFile; # temporary file to delete on exit
|
|
217
217
|
my $tmpText; # temporary text file
|
218
218
|
my $validFile; # flag indicating we processed a valid file
|
219
219
|
my $verbose; # verbose setting
|
220
|
-
my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
|
220
|
+
my $vout; # verbose output file reference (\*STDOUT or \*STDERR by default)
|
221
221
|
my $windowTitle; # title for console window
|
222
222
|
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
223
223
|
my $xml; # flag for XML-formatted output
|
@@ -735,10 +735,11 @@ for (;;) {
|
|
735
735
|
push @isUTF8, 10 if $isAlt;
|
736
736
|
for ($i=0; ; ++$i) {
|
737
737
|
my @entry = Image::ExifTool::Geolocation::GetEntry($i,$langOpt,1) or last;
|
738
|
-
push @entry, Image::ExifTool::Geolocation::GetAltNames($i,1) if $isAlt;
|
739
738
|
next if $minPop and $entry[7] < $minPop;
|
740
739
|
next if %fcodes and $neg ? $fcodes{lc $entry[6]} : not $fcodes{lc $entry[6]};
|
740
|
+
push @entry, Image::ExifTool::Geolocation::GetAltNames($i,1) if $isAlt;
|
741
741
|
$_ = defined $_ ? $mt->Decode($_, 'UTF8') : '' foreach @entry[@isUTF8];
|
742
|
+
pop @entry if $isAlt and not $entry[10];
|
742
743
|
print join(',', @entry), "\n";
|
743
744
|
}
|
744
745
|
} else { # 'g(\d*)'
|
@@ -2180,7 +2181,7 @@ sub GetImageInfo($$)
|
|
2180
2181
|
|
2181
2182
|
my $lineCount = 0;
|
2182
2183
|
my ($fp, $outfile, $append);
|
2183
|
-
if ($textOut and $verbose and not $tagOut) {
|
2184
|
+
if ($textOut and ($verbose or $et->Options('PrintCSV')) and not $tagOut) {
|
2184
2185
|
($fp, $outfile, $append) = OpenOutputFile($orig);
|
2185
2186
|
$fp or EFile($file), ++$countBad, return;
|
2186
2187
|
# delete file if we exit prematurely (unless appending)
|
@@ -2303,7 +2304,7 @@ sub GetImageInfo($$)
|
|
2303
2304
|
$lastDoc = 0;
|
2304
2305
|
}
|
2305
2306
|
for ($doc=0; $doc<=$lastDoc; ++$doc) {
|
2306
|
-
my $skipBody;
|
2307
|
+
my ($skipBody, $opt);
|
2307
2308
|
foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
|
2308
2309
|
my $prf = $printFmt{$type} or next;
|
2309
2310
|
if ($type eq 'HEAD' and defined $outfile) {
|
@@ -2311,6 +2312,12 @@ sub GetImageInfo($$)
|
|
2311
2312
|
$wroteHEAD{$outfile} = 1;
|
2312
2313
|
}
|
2313
2314
|
next if $type eq 'BODY' and $skipBody;
|
2315
|
+
# silence "IF" warnings and warnings for subdocuments > 1
|
2316
|
+
if ($type eq 'IF' or ($doc > 1 and not $$et{OPTIONS}{IgnoreMinorErrors})) {
|
2317
|
+
$opt = 'Silent';
|
2318
|
+
} else {
|
2319
|
+
$opt = 'Warn';
|
2320
|
+
}
|
2314
2321
|
if ($lastDoc) {
|
2315
2322
|
if ($doc) {
|
2316
2323
|
next if $type eq 'HEAD' or $type eq 'TAIL'; # only repeat SECT/IF/BODY/ENDS
|
@@ -2320,7 +2327,6 @@ sub GetImageInfo($$)
|
|
2320
2327
|
}
|
2321
2328
|
}
|
2322
2329
|
my @lines;
|
2323
|
-
my $opt = $type eq 'IF' ? 'Silent' : 'Warn'; # silence "IF" warnings
|
2324
2330
|
foreach (@$prf) {
|
2325
2331
|
my $line = $et->InsertTagValues($_, \@foundTags, $opt, $grp, $cache);
|
2326
2332
|
if ($type eq 'IF') {
|
@@ -5662,7 +5668,7 @@ with this command:
|
|
5662
5668
|
|
5663
5669
|
produces output like this:
|
5664
5670
|
|
5665
|
-
-- Generated by ExifTool 12.
|
5671
|
+
-- Generated by ExifTool 12.82 --
|
5666
5672
|
File: a.jpg - 2003:10:31 15:44:19
|
5667
5673
|
(f/5.6, 1/60s, ISO 100)
|
5668
5674
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
35
35
|
use Image::ExifTool::Validate;
|
36
36
|
use Image::ExifTool::MacOS;
|
37
37
|
|
38
|
-
$VERSION = '3.
|
38
|
+
$VERSION = '3.55';
|
39
39
|
@ISA = qw(Exporter);
|
40
40
|
|
41
41
|
sub NumbersFirst($$);
|
@@ -95,16 +95,9 @@ my %tweakOrder = (
|
|
95
95
|
Lytro => 'SigmaRaw',
|
96
96
|
PhotoMechanic => 'FotoStation',
|
97
97
|
Microsoft => 'PhotoMechanic',
|
98
|
-
'Microsoft::MP'=> 'Microsoft::MP1',
|
99
98
|
GIMP => 'Microsoft',
|
100
|
-
'Nikon::CameraSettingsD300' => 'Nikon::ShotInfoD300b',
|
101
|
-
'Pentax::LensData' => 'Pentax::LensInfo2',
|
102
|
-
'Sony::SRF2' => 'Sony::SRF',
|
103
99
|
DarwinCore => 'AFCP',
|
104
|
-
|
105
|
-
'MWG::Keywords' => 'MWG::Regions',
|
106
|
-
'MWG::Collections' => 'MWG::Keywords',
|
107
|
-
'GoPro::fdsc' => 'GoPro::KBAT',
|
100
|
+
MWG => 'Shortcuts',
|
108
101
|
);
|
109
102
|
|
110
103
|
# list of all recognized Format strings
|
@@ -671,6 +664,15 @@ will extract all available information even for tags not listed.
|
|
671
664
|
Tags in these tables are referred to as "pseudo" tags because their
|
672
665
|
information is not stored in the file itself. As such, B<Writable> tags in
|
673
666
|
these tables may be changed without having to rewrite the file.
|
667
|
+
},
|
668
|
+
GM => q{
|
669
|
+
These tags are extracted from GM/Cosworth PDR (Performance Data Recorder)
|
670
|
+
information found in videos from General Motors cars such as Corvette and
|
671
|
+
Camero.
|
672
|
+
|
673
|
+
Use the API L<PrintCSV|../ExifTool.html#PrintCSV> option to output all timed
|
674
|
+
PDR data in CSV format at greatly increased speed and with much lower memory
|
675
|
+
usage.
|
674
676
|
},
|
675
677
|
PodTrailer => q{
|
676
678
|
~head1 NOTES
|
@@ -708,7 +710,7 @@ my %shortcutNotes = (
|
|
708
710
|
color space when deleting all other metadata
|
709
711
|
},
|
710
712
|
CommonIFD0 => q{
|
711
|
-
common metadata tags found in IFD0 of TIFF-format images. Used to
|
713
|
+
common metadata tags found in IFD0 of TIFF-format images. Used to simplify
|
712
714
|
deletion of all metadata from these images. See
|
713
715
|
L<FAQ number 7|../faq.html#Q7> for details
|
714
716
|
},
|
@@ -852,7 +854,7 @@ sub new
|
|
852
854
|
my ($tagID, $binaryTable, $noID, $hexID, $isIPTC, $isXMP);
|
853
855
|
$isIPTC = 1 if $writeProc and $writeProc eq \&Image::ExifTool::IPTC::WriteIPTC;
|
854
856
|
# generate flattened tag names for structure fields if this is an XMP table
|
855
|
-
if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP') {
|
857
|
+
if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP' or $$vars{ADD_FLATTENED}) {
|
856
858
|
Image::ExifTool::XMP::AddFlattenedTags($table);
|
857
859
|
$isXMP = 1;
|
858
860
|
}
|
@@ -1526,7 +1528,8 @@ TagID: foreach $tagID (@keys) {
|
|
1526
1528
|
my $fullName = ($strName =~ / / ? '' : 'XMP ') . "$strName Struct";
|
1527
1529
|
my $info = $tagNameInfo{$fullName} = [ ];
|
1528
1530
|
my $tag;
|
1529
|
-
|
1531
|
+
my $order = $$struct{SORT_ORDER} || [ sort keys %$struct ];
|
1532
|
+
foreach $tag (@$order) {
|
1530
1533
|
my $tagInfo = $$struct{$tag};
|
1531
1534
|
next unless ref $tagInfo eq 'HASH' and $tag ne 'NAMESPACE' and $tag ne 'GROUPS';
|
1532
1535
|
warn "WARNING: $strName Struct containes $tag\n" if $Image::ExifTool::specialTags{$tag};
|
@@ -1539,6 +1542,8 @@ TagID: foreach $tagID (@keys) {
|
|
1539
1542
|
push @vals, $writable;
|
1540
1543
|
$structs{$writable} = 1;
|
1541
1544
|
$writable = "=$writable";
|
1545
|
+
} elsif (defined $$tagInfo{Writable}) {
|
1546
|
+
$writable = 'no';
|
1542
1547
|
} else {
|
1543
1548
|
$writable = 'string';
|
1544
1549
|
}
|
@@ -1548,7 +1553,7 @@ TagID: foreach $tagID (@keys) {
|
|
1548
1553
|
# handle PrintConv lookups in Structure elements
|
1549
1554
|
my $printConv = $$tagInfo{PrintConv};
|
1550
1555
|
if (ref $printConv eq 'HASH') {
|
1551
|
-
foreach (sort keys %$printConv) {
|
1556
|
+
foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
|
1552
1557
|
next if /^(OTHER|BITMASK)$/;
|
1553
1558
|
push @vals, "$_ = $$printConv{$_}";
|
1554
1559
|
}
|
@@ -1822,24 +1827,7 @@ sub TweakOrder($$)
|
|
1822
1827
|
local $_;
|
1823
1828
|
my ($sortedTables, $tweakOrder) = @_;
|
1824
1829
|
my @tweak = sort keys %$tweakOrder;
|
1825
|
-
my (%
|
1826
|
-
# flag files which have a "Main" table
|
1827
|
-
foreach (@$sortedTables) {
|
1828
|
-
$addedMain{$1} = 0 if /^Image::ExifTool::(\w+)::(\w+)/ and $2 eq 'Main';
|
1829
|
-
}
|
1830
|
-
# make sure that the main table always comes first in each file
|
1831
|
-
foreach (@$sortedTables) {
|
1832
|
-
if (/^Image::ExifTool::(\w+)::(\w+)/) {
|
1833
|
-
if ($addedMain{$1}) {
|
1834
|
-
next if $2 eq 'Main'; # don't add again
|
1835
|
-
} elsif (defined $addedMain{$1}) {
|
1836
|
-
push @sorted, "Image::ExifTool::${1}::Main" if $2 ne 'Main';
|
1837
|
-
$addedMain{$1} = 1;
|
1838
|
-
}
|
1839
|
-
}
|
1840
|
-
push @sorted, $_;
|
1841
|
-
}
|
1842
|
-
@$sortedTables = @sorted;
|
1830
|
+
my (@sorted, %hasMain, %module, $entry);
|
1843
1831
|
# apply manual tweaks
|
1844
1832
|
while (@tweak) {
|
1845
1833
|
my $table = shift @tweak;
|
@@ -1858,6 +1846,31 @@ sub TweakOrder($$)
|
|
1858
1846
|
}
|
1859
1847
|
@$sortedTables = (@notMoving, @moving, @after);
|
1860
1848
|
}
|
1849
|
+
# flag modules which have a "Main" table, and organize tables by module name
|
1850
|
+
foreach (@$sortedTables) {
|
1851
|
+
if (not /^Image::ExifTool::(\w+)::(\w+)/) {
|
1852
|
+
push @sorted, $_;
|
1853
|
+
} else {
|
1854
|
+
$hasMain{$1} = 1 if $2 eq 'Main';
|
1855
|
+
push @sorted, $module{$1} = [ ] unless $module{$1};
|
1856
|
+
push @{$module{$1}}, $_;
|
1857
|
+
}
|
1858
|
+
}
|
1859
|
+
# force MWG::Composite table first
|
1860
|
+
my @mwg = ( 'Image::ExifTool::MWG::Composite' );
|
1861
|
+
/Composite/ or push @mwg, $_ foreach @{$module{MWG}};
|
1862
|
+
@{$module{MWG}} = @mwg;
|
1863
|
+
# make sure that the main table always comes first in each file
|
1864
|
+
# and that all other tables from this group follow
|
1865
|
+
@$sortedTables = ( );
|
1866
|
+
foreach $entry (@sorted) {
|
1867
|
+
ref $entry or push(@$sortedTables, $entry), next;
|
1868
|
+
$$entry[0] =~ /^Image::ExifTool::(\w+)::(\w+)/ or die 'Internal error';
|
1869
|
+
my $main = "Image::ExifTool::$1::Main";
|
1870
|
+
# main table must come first (even if it doesn't exist)
|
1871
|
+
push @$sortedTables, $main if $hasMain{$1};
|
1872
|
+
$_ eq $main or push(@$sortedTables, $_) foreach @$entry;
|
1873
|
+
}
|
1861
1874
|
}
|
1862
1875
|
|
1863
1876
|
#------------------------------------------------------------------------------
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
use Image::ExifTool::Exif;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.94';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -550,7 +550,14 @@ my %faceCategories = (
|
|
550
550
|
3 => 'Electronic Front Curtain', #10
|
551
551
|
},
|
552
552
|
},
|
553
|
-
0x1051 => {
|
553
|
+
0x1051 => { #forum15784
|
554
|
+
Name => 'CropFlag',
|
555
|
+
Writable => 'int8u',
|
556
|
+
Notes => q(
|
557
|
+
this tag exists only if the image was cropped, and is 0 for cropped JPG
|
558
|
+
image or 1 for a cropped RAF
|
559
|
+
),
|
560
|
+
},
|
554
561
|
0x1052 => { Name => 'CropTopLeft', Writable => 'int32u' }, #forum15784
|
555
562
|
0x1053 => { Name => 'CropSize', Writable => 'int32u' }, #forum15784
|
556
563
|
# 0x1100 - This may not work well for newer cameras (ref forum12682)
|