exiftool-vendored.exe 12.76.0 → 12.78.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.
- package/bin/exiftool_files/Changes +46 -4
- package/bin/exiftool_files/README +3 -3
- package/bin/exiftool_files/config_files/example.config +10 -2
- package/bin/exiftool_files/exiftool.pl +50 -14
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +12 -9
- package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +7 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +52 -4
- package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +5 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.pm +237 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +9 -9
- package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +19 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +5 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +183 -11
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +77 -3
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +113 -4
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +14 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +9 -8
- package/bin/exiftool_files/lib/Image/ExifTool.pm +163 -38
- package/bin/exiftool_files/lib/Image/ExifTool.pod +44 -25
- package/package.json +3 -3
|
@@ -137,12 +137,12 @@ my %rawType = (
|
|
|
137
137
|
# 1) these names must either exist in %dirMap, or be translated in InitWriteDirs())
|
|
138
138
|
# 2) any dependencies must be added to %excludeGroups
|
|
139
139
|
my @delGroups = qw(
|
|
140
|
-
Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 APP12
|
|
141
|
+
APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix FotoStation
|
|
142
|
+
GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC ItemList JFIF
|
|
143
|
+
Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF Nextbase NikonApp
|
|
144
|
+
NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs PrintIM
|
|
145
|
+
QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
|
|
146
146
|
);
|
|
147
147
|
# family 2 group names that we can delete
|
|
148
148
|
my @delGroup2 = qw(
|
|
@@ -227,7 +227,7 @@ my %allFam0 = (
|
|
|
227
227
|
|
|
228
228
|
my @writableMacOSTags = qw(
|
|
229
229
|
FileCreateDate MDItemFinderComment MDItemFSCreationDate MDItemFSLabel MDItemUserTags
|
|
230
|
-
XAttrQuarantine
|
|
230
|
+
XAttrQuarantine XAttrMDItemWhereFroms
|
|
231
231
|
);
|
|
232
232
|
|
|
233
233
|
# min/max values for integer formats
|
|
@@ -1296,6 +1296,7 @@ sub SetNewValuesFromFile($$;@)
|
|
|
1296
1296
|
FastScan => $$options{FastScan},
|
|
1297
1297
|
Filter => $$options{Filter},
|
|
1298
1298
|
FixBase => $$options{FixBase},
|
|
1299
|
+
Geolocation => $$options{Geolocation},
|
|
1299
1300
|
GlobalTimeShift => $$options{GlobalTimeShift},
|
|
1300
1301
|
HexTagIDs => $$options{HexTagIDs},
|
|
1301
1302
|
IgnoreMinorErrors=>$$options{IgnoreMinorErrors},
|
|
@@ -2181,7 +2182,7 @@ sub SetSystemTags($$)
|
|
|
2181
2182
|
$result = $res if $res == 1 or not $result;
|
|
2182
2183
|
last;
|
|
2183
2184
|
} elsif ($tag ne 'FileCreateDate') {
|
|
2184
|
-
$self->WarnOnce('Can only set MDItem tags on
|
|
2185
|
+
$self->WarnOnce('Can only set MDItem tags on MacOS');
|
|
2185
2186
|
last;
|
|
2186
2187
|
}
|
|
2187
2188
|
}
|
|
@@ -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);
|
|
31
31
|
|
|
32
|
-
$VERSION = '12.
|
|
32
|
+
$VERSION = '12.78';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -953,7 +953,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
|
|
|
953
953
|
JPEG => '\xff\xd8\xff',
|
|
954
954
|
JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:',
|
|
955
955
|
JUMBF=> '.{4}jumb\0.{3}jumd',
|
|
956
|
-
JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ',
|
|
956
|
+
JXL => '(\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl )',
|
|
957
957
|
LFP => '\x89LFP\x0d\x0a\x1a\x0a',
|
|
958
958
|
LIF => '\x70\0{3}.{4}\x2a.{4}<\0',
|
|
959
959
|
LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
|
|
@@ -1101,6 +1101,9 @@ my @availableOptions = (
|
|
|
1101
1101
|
[ 'Filter', undef, 'output filter for all tag values' ],
|
|
1102
1102
|
[ 'FilterW', undef, 'input filter when writing tag values' ],
|
|
1103
1103
|
[ 'FixBase', undef, 'fix maker notes base offsets' ],
|
|
1104
|
+
[ 'Geolocation', undef, 'generate geolocation tags' ],
|
|
1105
|
+
[ 'GeolocMinPop', undef, 'minimum geolocation population' ],
|
|
1106
|
+
[ 'GeolocMaxDist', undef, 'maximum geolocation distance' ],
|
|
1104
1107
|
[ 'GeoMaxIntSecs', 1800, 'geotag maximum interpolation time (secs)' ],
|
|
1105
1108
|
[ 'GeoMaxExtSecs', 1800, 'geotag maximum extrapolation time (secs)' ],
|
|
1106
1109
|
[ 'GeoMaxHDOP', undef, 'geotag maximum HDOP' ],
|
|
@@ -1168,6 +1171,7 @@ my @defaultWriteGroups = qw(
|
|
|
1168
1171
|
|
|
1169
1172
|
# group hash for ExifTool-generated tags
|
|
1170
1173
|
my %allGroupsExifTool = ( 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'ExifTool' );
|
|
1174
|
+
my %geoGroups = ( Groups => { 0 => 'ExifTool', 1 => 'ExifTool', 2 => 'Location' } );
|
|
1171
1175
|
|
|
1172
1176
|
# special tag names (not used for tag info)
|
|
1173
1177
|
%specialTags = map { $_ => 1 } qw(
|
|
@@ -1749,6 +1753,11 @@ my %systemTagsNotes = (
|
|
|
1749
1753
|
Notes => 'PDF-format embedded preview image',
|
|
1750
1754
|
Binary => 1,
|
|
1751
1755
|
},
|
|
1756
|
+
PreviewJXL => {
|
|
1757
|
+
Groups => { 2 => 'Preview' },
|
|
1758
|
+
Notes => 'JXL-format embedded preview image',
|
|
1759
|
+
Binary => 1,
|
|
1760
|
+
},
|
|
1752
1761
|
ExifByteOrder => {
|
|
1753
1762
|
Writable => 1,
|
|
1754
1763
|
DelCheck => q{"Can't delete"},
|
|
@@ -1957,6 +1966,82 @@ my %systemTagsNotes = (
|
|
|
1957
1966
|
the this hash value and the hash type in the file.
|
|
1958
1967
|
},
|
|
1959
1968
|
},
|
|
1969
|
+
Geolocate => {
|
|
1970
|
+
Writable => 1,
|
|
1971
|
+
WriteOnly => 1,
|
|
1972
|
+
WriteNothing => 1,
|
|
1973
|
+
AllowGroup => '(xmp|iptc)',
|
|
1974
|
+
Notes => q{
|
|
1975
|
+
this write-only tag accepts GPS coordinates in the same form as GPSPosition
|
|
1976
|
+
and by default writes XMP City, State, CountryCode and Country, but the IPTC
|
|
1977
|
+
group may be specified to instead write IPTC City, Province-State,
|
|
1978
|
+
Country-PrimaryLocationCode and Country-PrimaryLocationName. Writable
|
|
1979
|
+
regardless of the API Geolocation option setting
|
|
1980
|
+
},
|
|
1981
|
+
DelCheck => q{
|
|
1982
|
+
my $grp = lc($wantGroup || 'xmp');
|
|
1983
|
+
if ($grp eq 'xmp') {
|
|
1984
|
+
$self->SetNewValue('XMP:'.$_) foreach qw(City State CountryCode Country);
|
|
1985
|
+
} elsif ($grp eq 'iptc') {
|
|
1986
|
+
$self->SetNewValue('IPTC:'.$_) foreach qw(City Province-State Country-PrimaryLocationCode Country-PrimaryLocationName);
|
|
1987
|
+
}
|
|
1988
|
+
return '';
|
|
1989
|
+
},
|
|
1990
|
+
ValueConvInv => q{
|
|
1991
|
+
my ($lat, $lon) = split /[, ]+/, $val;
|
|
1992
|
+
defined $lat and defined $lon or warn('Invalid GPS position, use "Lat, Lon"'), return undef;
|
|
1993
|
+
my $grp = lc($wantGroup || 'xmp');
|
|
1994
|
+
if ($grp ne 'xmp' and $grp ne 'iptc') {
|
|
1995
|
+
warn "Invalid group name for Geolocate\n";
|
|
1996
|
+
} else {
|
|
1997
|
+
require Image::ExifTool::Geolocation;
|
|
1998
|
+
my @a = Image::ExifTool::Geolocation::Geolocate($lat, $lon,
|
|
1999
|
+
$$self{OPTIONS}{GeolocMinPop}, $$self{OPTIONS}{GeolocMaxDist});
|
|
2000
|
+
my $i = 0;
|
|
2001
|
+
if (not defined $a[0]) {
|
|
2002
|
+
warn "No suitable geolocation found\n";
|
|
2003
|
+
} elsif ($grp eq 'xmp') {
|
|
2004
|
+
foreach (qw(City State CountryCode Country)) {
|
|
2005
|
+
next unless defined $a[$i++];
|
|
2006
|
+
$self->SetNewValue('XMP:'.$_, $self->Decode($a[$i-1],'UTF8'));
|
|
2007
|
+
}
|
|
2008
|
+
} else {
|
|
2009
|
+
$a[2] .= ' '; # pad country code with space to meet IPTC length requirements
|
|
2010
|
+
foreach (qw(City Province-State Country-PrimaryLocationCode Country-PrimaryLocationName)) {
|
|
2011
|
+
next unless defined $a[$i++];
|
|
2012
|
+
$self->SetNewValue('IPTC:'.$_, $self->Decode($a[$i-1],'UTF8'));
|
|
2013
|
+
}
|
|
2014
|
+
}
|
|
2015
|
+
}
|
|
2016
|
+
return '';
|
|
2017
|
+
},
|
|
2018
|
+
PrintConvInv => q{
|
|
2019
|
+
return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/ or
|
|
2020
|
+
$val =~ /^\s*(-?\d+(?:\.\d+)?)\s*(-?\d+(?:\.\d+)?)\s*$/;
|
|
2021
|
+
my ($lat, $lon) = ($1, $2);
|
|
2022
|
+
require Image::ExifTool::GPS;
|
|
2023
|
+
$lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat");
|
|
2024
|
+
$lon = Image::ExifTool::GPS::ToDegrees($lon, 1, "lon");
|
|
2025
|
+
return "$lat $lon";
|
|
2026
|
+
},
|
|
2027
|
+
},
|
|
2028
|
+
GeolocationCity => {
|
|
2029
|
+
%geoGroups,
|
|
2030
|
+
Notes => q{
|
|
2031
|
+
name of city nearest to the current GPS coordinates. Geolocation tags are
|
|
2032
|
+
generated only if API Geolocation option is set
|
|
2033
|
+
},
|
|
2034
|
+
},
|
|
2035
|
+
GeolocationRegion => { %geoGroups, Notes => 'geolocation state, province or region' },
|
|
2036
|
+
GeolocationCountry => { %geoGroups, Notes => 'geolocation country name' },
|
|
2037
|
+
GeolocationCountryCode=>{%geoGroups, Notes => 'geolocation country code' },
|
|
2038
|
+
GeolocationTimeZone => { %geoGroups, Notes => 'geolocation time zone name' },
|
|
2039
|
+
GeolocationPopulation=>{ %geoGroups, Notes => 'city population rounded to 1 significant digit' },
|
|
2040
|
+
GeolocationDistance => { %geoGroups, Notes => 'distance in km from current GPS to city', PrintConv => '"$val km"' },
|
|
2041
|
+
GeolocationBearing => { %geoGroups, Notes => 'compass bearing to city center' },
|
|
2042
|
+
GeolocationPosition => { %geoGroups, Notes => 'approximate GPS coordinates of city',
|
|
2043
|
+
PrintConv => '$val =~ s/ /, /; $val',
|
|
2044
|
+
},
|
|
1960
2045
|
);
|
|
1961
2046
|
|
|
1962
2047
|
# tags defined by UserParam option (added at runtime)
|
|
@@ -2738,7 +2823,7 @@ sub ExtractInfo($;@)
|
|
|
2738
2823
|
if ($isDir or (defined $stat[2] and ($stat[2] & 0170000) == 0040000)) {
|
|
2739
2824
|
$self->FoundTag('FileType', 'DIR');
|
|
2740
2825
|
$self->FoundTag('FileTypeExtension', '');
|
|
2741
|
-
$self->
|
|
2826
|
+
$self->DoneExtract();
|
|
2742
2827
|
$raf->Close() if $raf;
|
|
2743
2828
|
return 1;
|
|
2744
2829
|
}
|
|
@@ -2756,7 +2841,7 @@ sub ExtractInfo($;@)
|
|
|
2756
2841
|
} else {
|
|
2757
2842
|
$self->Error('Unknown file type');
|
|
2758
2843
|
}
|
|
2759
|
-
$self->
|
|
2844
|
+
$self->DoneExtract();
|
|
2760
2845
|
last; # don't read the file
|
|
2761
2846
|
}
|
|
2762
2847
|
if (@fileTypeList) {
|
|
@@ -2924,7 +3009,7 @@ sub ExtractInfo($;@)
|
|
|
2924
3009
|
}
|
|
2925
3010
|
unless ($reEntry) {
|
|
2926
3011
|
$$self{PATH} = [ ]; # reset PATH
|
|
2927
|
-
$self->
|
|
3012
|
+
$self->DoneExtract();
|
|
2928
3013
|
# do our HTML dump if requested
|
|
2929
3014
|
if ($$self{HTML_DUMP}) {
|
|
2930
3015
|
$raf->Seek(0, 2); # seek to end of file
|
|
@@ -2959,27 +3044,10 @@ sub ExtractInfo($;@)
|
|
|
2959
3044
|
last; # (loop was a cheap "goto")
|
|
2960
3045
|
}
|
|
2961
3046
|
|
|
2962
|
-
#
|
|
2963
|
-
|
|
2964
|
-
Image::ExifTool::Validate::FinishValidate($self, $$req{validate});
|
|
2965
|
-
}
|
|
2966
|
-
|
|
3047
|
+
# Note: This should be the only tag generated after BuildCompositeTags,
|
|
3048
|
+
# and as such it can't be used in user-defined Composite tags
|
|
2967
3049
|
@startTime and $self->FoundTag('ProcessingTime', Time::HiRes::tv_interval(\@startTime));
|
|
2968
3050
|
|
|
2969
|
-
# add user-defined parameters that ended with '!'
|
|
2970
|
-
if (%{$$options{UserParam}}) {
|
|
2971
|
-
my $doMsg = $$options{Verbose};
|
|
2972
|
-
my $table = GetTagTable('Image::ExifTool::UserParam');
|
|
2973
|
-
foreach (sort keys %{$$options{UserParam}}) {
|
|
2974
|
-
next unless /#$/;
|
|
2975
|
-
if ($doMsg) {
|
|
2976
|
-
$self->VPrint(0, "UserParam tags:\n");
|
|
2977
|
-
undef $doMsg;
|
|
2978
|
-
}
|
|
2979
|
-
$self->HandleTag($table, $_, $$options{UserParam}{$_});
|
|
2980
|
-
}
|
|
2981
|
-
}
|
|
2982
|
-
|
|
2983
3051
|
# restore original options
|
|
2984
3052
|
%saveOptions and $$self{OPTIONS} = \%saveOptions;
|
|
2985
3053
|
|
|
@@ -2987,13 +3055,6 @@ sub ExtractInfo($;@)
|
|
|
2987
3055
|
# restore necessary members when exiting re-entrant code
|
|
2988
3056
|
$$self{$_} = $$reEntry{$_} foreach keys %$reEntry;
|
|
2989
3057
|
SetByteOrder($saveOrder);
|
|
2990
|
-
} elsif ($$self{ImageDataHash}) {
|
|
2991
|
-
my $digest = $$self{ImageDataHash}->hexdigest;
|
|
2992
|
-
# (don't store empty digest)
|
|
2993
|
-
$self->FoundTag(ImageDataHash => $digest) unless
|
|
2994
|
-
$digest eq 'd41d8cd98f00b204e9800998ecf8427e' or
|
|
2995
|
-
$digest eq 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' or
|
|
2996
|
-
$digest eq 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e';
|
|
2997
3058
|
}
|
|
2998
3059
|
|
|
2999
3060
|
# ($type may be undef without an Error when processing sub-documents)
|
|
@@ -4164,17 +4225,80 @@ sub CombineInfo($;@)
|
|
|
4164
4225
|
}
|
|
4165
4226
|
|
|
4166
4227
|
#------------------------------------------------------------------------------
|
|
4167
|
-
#
|
|
4228
|
+
# Finish generating tags after extracting information from a file
|
|
4168
4229
|
# Inputs: 0) ExifTool ref
|
|
4169
|
-
# Notes:
|
|
4170
|
-
#
|
|
4171
|
-
#
|
|
4172
|
-
|
|
4230
|
+
# Notes: The sequencing here is a bit tricky because tags from the main file
|
|
4231
|
+
# may be used in the names of alternate files, so we finish generating
|
|
4232
|
+
# all main file tags first (including all Composite tags which don't
|
|
4233
|
+
# rely on alternate files) before extracting tags from alternate files,
|
|
4234
|
+
# then we finish by generating the remaingin Composite tags.
|
|
4235
|
+
sub DoneExtract($)
|
|
4173
4236
|
{
|
|
4174
4237
|
my $self = shift;
|
|
4175
4238
|
# extract information from alternate files if necessary
|
|
4176
4239
|
my ($g8, $altExifTool);
|
|
4177
4240
|
my $opts = $$self{OPTIONS};
|
|
4241
|
+
|
|
4242
|
+
# generate ImageDataHash if requested
|
|
4243
|
+
if ($$self{ImageDataHash}) {
|
|
4244
|
+
my $digest = $$self{ImageDataHash}->hexdigest;
|
|
4245
|
+
# (don't store empty digest)
|
|
4246
|
+
$self->FoundTag(ImageDataHash => $digest) unless
|
|
4247
|
+
$digest eq 'd41d8cd98f00b204e9800998ecf8427e' or
|
|
4248
|
+
$digest eq 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' or
|
|
4249
|
+
$digest eq 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e';
|
|
4250
|
+
}
|
|
4251
|
+
# generate Validate tag if requested
|
|
4252
|
+
if ($$opts{Validate}) {
|
|
4253
|
+
Image::ExifTool::Validate::FinishValidate($self, $$self{REQ_TAG_LOOKUP}{validate});
|
|
4254
|
+
}
|
|
4255
|
+
# generate geolocation tags if requested
|
|
4256
|
+
if ($$opts{Geolocation} and ((defined $$self{VALUE}{GPSLatitude} and
|
|
4257
|
+
defined $$self{VALUE}{GPSLongitude}) or $$self{VALUE}{GPSCoordinates} or
|
|
4258
|
+
$$opts{Geolocation} =~ /,/))
|
|
4259
|
+
{
|
|
4260
|
+
my $lat = $self->GetValue('GPSLatitude', 'ValueConv');
|
|
4261
|
+
my $lon = $self->GetValue('GPSLongitude', 'ValueConv');
|
|
4262
|
+
if (defined $lat and defined $lon) {
|
|
4263
|
+
my $latRef = $$self{VALUE}{GPSLatitudeRef};
|
|
4264
|
+
my $lonRef = $$self{VALUE}{GPSLongitudeRef};
|
|
4265
|
+
$lat = -$lat if $lat and $lat > 0 and $latRef and $latRef eq 'S';
|
|
4266
|
+
$lon = -$lon if $lon and $lon > 0 and $lonRef and $lonRef eq 'W';
|
|
4267
|
+
} elsif ($$self{VALUE}{GPSCoordinates}) {
|
|
4268
|
+
my $pos = $self->GetValue('GPSCoordinates', 'ValueConv');
|
|
4269
|
+
($lat, $lon) = split /[, ]+/, $pos;
|
|
4270
|
+
} else {
|
|
4271
|
+
($lat, $lon) = split /[, ]+/, $$opts{Geolocation};
|
|
4272
|
+
}
|
|
4273
|
+
if (defined $lat and defined $lon) {
|
|
4274
|
+
require Image::ExifTool::Geolocation;
|
|
4275
|
+
my @geo = Image::ExifTool::Geolocation::Geolocate($lat, $lon, $$opts{GeolocMinPop}, $$opts{GeolocMaxDist});
|
|
4276
|
+
if ($geo[0]) {
|
|
4277
|
+
$self->FoundTag(GeolocationCity => $self->Decode($geo[0],'UTF8'));
|
|
4278
|
+
$self->FoundTag(GeolocationRegion => $self->Decode($geo[1],'UTF8')) if $geo[1];
|
|
4279
|
+
$self->FoundTag(GeolocationCountryCode => $geo[2]);
|
|
4280
|
+
$self->FoundTag(GeolocationCountry => $geo[3]) if $geo[3];
|
|
4281
|
+
$self->FoundTag(GeolocationTimeZone => $geo[4]) if $geo[4];
|
|
4282
|
+
$self->FoundTag(GeolocationPopulation => $geo[5]);
|
|
4283
|
+
$self->FoundTag(GeolocationDistance => $geo[6]);
|
|
4284
|
+
$self->FoundTag(GeolocationBearing => $geo[7]) if defined $geo[7];
|
|
4285
|
+
$self->FoundTag(GeolocationPosition => "$geo[8] $geo[9]");
|
|
4286
|
+
}
|
|
4287
|
+
}
|
|
4288
|
+
}
|
|
4289
|
+
# generate tags for user-defined parameters that ended with '#'
|
|
4290
|
+
if (%{$$opts{UserParam}}) {
|
|
4291
|
+
my $doMsg = $$opts{Verbose};
|
|
4292
|
+
my $table = GetTagTable('Image::ExifTool::UserParam');
|
|
4293
|
+
foreach (sort keys %{$$opts{UserParam}}) {
|
|
4294
|
+
next unless /#$/;
|
|
4295
|
+
if ($doMsg) {
|
|
4296
|
+
$self->VPrint(0, "UserParam tags:\n");
|
|
4297
|
+
undef $doMsg;
|
|
4298
|
+
}
|
|
4299
|
+
$self->HandleTag($table, $_, $$opts{UserParam}{$_});
|
|
4300
|
+
}
|
|
4301
|
+
}
|
|
4178
4302
|
if ($$opts{Composite} and (not $$opts{FastScan} or $$opts{FastScan} < 5)) {
|
|
4179
4303
|
# build all composite tags except those requiring tags from alternate files
|
|
4180
4304
|
$self->BuildCompositeTags();
|
|
@@ -4185,6 +4309,7 @@ sub ExtractAltInfo($)
|
|
|
4185
4309
|
$$altExifTool{OPTIONS} = $$self{OPTIONS};
|
|
4186
4310
|
$$altExifTool{GLOBAL_TIME_OFFSET} = $$self{GLOBAL_TIME_OFFSET};
|
|
4187
4311
|
$$altExifTool{REQ_TAG_LOOKUP} = $$self{REQ_TAG_LOOKUP};
|
|
4312
|
+
$$altExifTool{ReqTagAlreadySet} = 1;
|
|
4188
4313
|
my $fileName = $$altExifTool{ALT_FILE};
|
|
4189
4314
|
# allow tags from the main file to be used in the alternate file names
|
|
4190
4315
|
# (eg. -file1 '$originalfilename')
|
|
@@ -4554,7 +4679,7 @@ sub ParseArguments($;@)
|
|
|
4554
4679
|
my (@exclude, $wasExcludeOpt);
|
|
4555
4680
|
|
|
4556
4681
|
$$self{REQUESTED_TAGS} = [ ];
|
|
4557
|
-
$$self{REQ_TAG_LOOKUP} = { };
|
|
4682
|
+
$$self{REQ_TAG_LOOKUP} = { } unless $$self{ReqTagAlreadySet};
|
|
4558
4683
|
$$self{EXCL_TAG_LOOKUP} = { };
|
|
4559
4684
|
$$self{IO_TAG_LIST} = undef;
|
|
4560
4685
|
delete $$self{EXCL_XMP_LOOKUP};
|
|
@@ -5811,7 +5936,7 @@ sub Decode($$$;$$$)
|
|
|
5811
5936
|
# Inputs: 0) ExifTool object ref, 1) string, 2) destination character set name,
|
|
5812
5937
|
# 3) optional destination byte order (2-byte and 4-byte fixed-width sets only)
|
|
5813
5938
|
# Returns: string in specified encoding
|
|
5814
|
-
sub Encode(
|
|
5939
|
+
sub Encode($$;$$)
|
|
5815
5940
|
{
|
|
5816
5941
|
my ($self, $val, $to, $toOrder) = @_;
|
|
5817
5942
|
return $self->Decode($val, undef, undef, $to, $toOrder);
|
|
@@ -71,7 +71,7 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
71
71
|
3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
|
|
72
72
|
7Z r | DV r | JPEG r/w | OFR r | RWZ r
|
|
73
73
|
A r | DVB r/w | JSON r | OGG r | RM r
|
|
74
|
-
AA r | DVR-MS r | JXL r
|
|
74
|
+
AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
|
|
75
75
|
AAC r | DYLIB r | K25 r | ONP r | SKETCH r
|
|
76
76
|
AAE r | EIP r | KDC r | OPUS r | SO r
|
|
77
77
|
AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
|
|
@@ -592,9 +592,10 @@ Format for printing GPS coordinates. This is a printf format string with
|
|
|
592
592
|
specifiers for degrees, minutes and seconds in that order, however minutes
|
|
593
593
|
and seconds may be omitted. If the hemisphere is known, a reference
|
|
594
594
|
direction (N, S, E or W) is appended to each printed coordinate, but adding
|
|
595
|
-
a C<+> to the first format specifier (eg. C<%+.6f>
|
|
596
|
-
coordinate instead
|
|
597
|
-
|
|
595
|
+
a C<+> or C<-> to the first format specifier (eg. C<%+.6f> or C<%-.6f>)
|
|
596
|
+
prints a signed coordinate instead (C<+> also adds a leading plus sign to
|
|
597
|
+
positive coordinates, while C<-> does not). For example, the following
|
|
598
|
+
table gives the output for the same coordinate using various formats:
|
|
598
599
|
|
|
599
600
|
CoordFormat Example Output
|
|
600
601
|
------------------- ------------------
|
|
@@ -714,6 +715,24 @@ value to be added to the maker notes base offset. It may also be set to the
|
|
|
714
715
|
empty string ('') for ExifTool will take its best guess at the correct base,
|
|
715
716
|
or undef (the default) for no base adjustment.
|
|
716
717
|
|
|
718
|
+
=item Geolocation
|
|
719
|
+
|
|
720
|
+
Flag to generate geolocation tags based on current GPSLatitude/GPSLongitude.
|
|
721
|
+
This feature uses a database with cities over a population of 1000 from
|
|
722
|
+
geonames.org. May be set to a string of the form "Lat,Lon" (eg.
|
|
723
|
+
"44.56,-72.33") to act as default GPS coordinates for files not containing
|
|
724
|
+
this information. See the comments in Geolocation.pm for more details.
|
|
725
|
+
Default is undef.
|
|
726
|
+
|
|
727
|
+
=item GeolocMaxDist
|
|
728
|
+
|
|
729
|
+
Maximum distance in km to the geolocation city. The Geolocation tags are
|
|
730
|
+
not generated if the distance is greater than this. Default is undef.
|
|
731
|
+
|
|
732
|
+
=item GeolocMinPop
|
|
733
|
+
|
|
734
|
+
Minimum population for the Geolocation city.
|
|
735
|
+
|
|
717
736
|
=item GeoMaxIntSecs
|
|
718
737
|
|
|
719
738
|
Maximum interpolation time in seconds for geotagging. Geotagging is treated
|
|
@@ -2470,27 +2489,27 @@ MIE-Lens, MIE-Main, MIE-MakerNotes, MIE-Meta, MIE-Orient, MIE-Preview,
|
|
|
2470
2489
|
MIE-Thumbnail, MIE-UTM, MIE-Unknown, MIE-Video, MIFF, MISB, MNG, MOBI, MOI,
|
|
2471
2490
|
MPC, MPEG, MPF0, MPImage, MS-DOC, MXF, MacOS, MakerNotes, MakerUnknown,
|
|
2472
2491
|
Matroska, MediaJukebox, Meta, MetaIFD, Microsoft, Minolta, MinoltaRaw,
|
|
2473
|
-
Motorola, NITF, Nikon, NikonCapture, NikonCustom, NikonScan,
|
|
2474
|
-
NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF,
|
|
2475
|
-
PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Parrot,
|
|
2476
|
-
PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo,
|
|
2477
|
-
PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2,
|
|
2478
|
-
RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR,
|
|
2479
|
-
Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh,
|
|
2480
|
-
SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado,
|
|
2481
|
-
Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent,
|
|
2482
|
-
VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP,
|
|
2483
|
-
XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth,
|
|
2484
|
-
XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP,
|
|
2485
|
-
XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi,
|
|
2486
|
-
XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs,
|
|
2487
|
-
XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
|
|
2488
|
-
XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
|
|
2489
|
-
XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
|
|
2490
|
-
XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
|
|
2491
|
-
XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
|
|
2492
|
-
XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
|
|
2493
|
-
XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
|
|
2492
|
+
Motorola, NITF, Nextbase, Nikon, NikonCapture, NikonCustom, NikonScan,
|
|
2493
|
+
NikonSettings, NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF,
|
|
2494
|
+
PICT, PNG, PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Parrot,
|
|
2495
|
+
Pentax, PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo,
|
|
2496
|
+
PostScript, PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2,
|
|
2497
|
+
RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR,
|
|
2498
|
+
Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh,
|
|
2499
|
+
SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado,
|
|
2500
|
+
Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent,
|
|
2501
|
+
Track#, UserData, VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP,
|
|
2502
|
+
XMP-DICOM, XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth,
|
|
2503
|
+
XMP-GFocus, XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP,
|
|
2504
|
+
XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi,
|
|
2505
|
+
XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs,
|
|
2506
|
+
XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
|
|
2507
|
+
XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
|
|
2508
|
+
XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
|
|
2509
|
+
XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
|
|
2510
|
+
XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
|
|
2511
|
+
XMP-prism, XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
|
|
2512
|
+
XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
|
|
2494
2513
|
XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
|
|
2495
2514
|
|
|
2496
2515
|
=item Family 2 (Category):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "exiftool-vendored.exe",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.78.0",
|
|
4
4
|
"description": "Vendored win32 ExifTool for Node.js",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"homepage": "https://github.com/mceachen/exiftool-vendored.exe#readme",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"mocha": "^10.3.0",
|
|
45
|
-
"npm-check-updates": "^16.14.
|
|
45
|
+
"npm-check-updates": "^16.14.15",
|
|
46
46
|
"prettier": "^3.2.5",
|
|
47
|
-
"release-it": "^17.
|
|
47
|
+
"release-it": "^17.1.1"
|
|
48
48
|
}
|
|
49
49
|
}
|