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.
Files changed (30) hide show
  1. package/bin/exiftool_files/Changes +46 -4
  2. package/bin/exiftool_files/README +3 -3
  3. package/bin/exiftool_files/config_files/example.config +10 -2
  4. package/bin/exiftool_files/exiftool.pl +50 -14
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +12 -9
  6. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +7 -1
  7. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +52 -4
  8. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +5 -3
  9. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  10. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.pm +237 -0
  11. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +2 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +5 -2
  14. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +9 -9
  15. package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -0
  16. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +19 -4
  17. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +2 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +3 -2
  19. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +3 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +5 -5
  21. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +1 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +183 -11
  23. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +253 -237
  24. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +77 -3
  25. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +113 -4
  26. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +14 -1
  27. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +9 -8
  28. package/bin/exiftool_files/lib/Image/ExifTool.pm +163 -38
  29. package/bin/exiftool_files/lib/Image/ExifTool.pod +44 -25
  30. 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
- APP12 APP13 APP14 APP15 CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
142
- FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC
143
- ItemList JFIF Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE MPF
144
- NikonApp NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG PNG-pHYs
145
- PrintIM QuickTime RMETA RSRC SubIFD Trailer UserData XML XML-* XMP XMP-*
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 OS X');
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.76';
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->ExtractAltInfo();
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->ExtractAltInfo();
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->ExtractAltInfo();
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
- # generate Validate tag if requested
2963
- if ($$options{Validate} and not $reEntry) {
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
- # Read metadata from alternate files and build composite tags
4228
+ # Finish generating tags after extracting information from a file
4168
4229
  # Inputs: 0) ExifTool ref
4169
- # Notes: This is called after reading the main file so the tags are available
4170
- # for being used in the file name, but before building Composite tags
4171
- # so tags from the alternate files may be used in the Composite tags
4172
- sub ExtractAltInfo($)
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 | OGV r | SEQ 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>) prints a signed
596
- coordinate instead. For example, the following table gives the output for
597
- the same coordinate using various formats:
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, NikonSettings,
2474
- NineEdits, Nintendo, Ocad, Ogg, Olympus, OpenEXR, Opus, PDF, PICT, PNG,
2475
- PNG-cICP, PNG-pHYs, PSP, Palm, Panasonic, PanasonicRaw, Parrot, Pentax,
2476
- PhaseOne, PhotoCD, PhotoMechanic, Photoshop, PictureInfo, PostScript,
2477
- PreviewIFD, PrintIM, ProfileIFD, Qualcomm, QuickTime, RAF, RAF2, RIFF,
2478
- RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP,
2479
- Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2,
2480
- SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw,
2481
- Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, Track#, UserData,
2482
- VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP, XMP-DICOM,
2483
- XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth, XMP-GFocus,
2484
- XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1,
2485
- XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi, XMP-ast,
2486
- XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs, XMP-dc,
2487
- XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif, XMP-exifEX,
2488
- XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr, XMP-hdrgm,
2489
- XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft,
2490
- XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama, XMP-pdf,
2491
- XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism,
2492
- XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff, XMP-x,
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.76.0",
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.14",
45
+ "npm-check-updates": "^16.14.15",
46
46
  "prettier": "^3.2.5",
47
- "release-it": "^17.0.3"
47
+ "release-it": "^17.1.1"
48
48
  }
49
49
  }