Skip to content

Commit

Permalink
v12.77 and v12.78
Browse files Browse the repository at this point in the history
  • Loading branch information
mceachen committed Mar 7, 2024
1 parent 0d314e6 commit fa3e976
Show file tree
Hide file tree
Showing 34 changed files with 1,340 additions and 629 deletions.
50 changes: 46 additions & 4 deletions bin/Changes
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,47 @@ RSS feed: https://exiftool.org/rss.xml
Note: The most recent production release is Version 12.76. (Other versions are
considered development releases, and are not uploaded to MetaCPAN.)

Mar. 5, 2024 - Version 12.78 - "Geolocation"

- Added new Geolocation feature and write-only Geolocate tag
- Added new config file entry (@Image::ExifTool::UserDefined::Arguments) to
allow default command-line arguments to be specified
- Added print conversion for TIFF-EPStandardID
- Added ability to delete Nextbase information from MP4 videos
- Decode timed GPS from MP4 videos written by Nextbase software
- Decode a number of new tags from Nextbase MP4 videos
- Decode a few new tags from Garmin MP4 videos
- Extract PreviewJXL images from DNG 1.7 files
- Generate Validate, ImageDataHash and UserParam tags earlier to allow them to
be used in UserDefined Composite tags
- Enhanced the -c option so a minus sign in the format specification prints a
signed coordinate without a leading "+" for positive numbers
- Changed formatting of some Accelerometer tags for consistency
- Changed behaviour of -ee3 option to do a brute-force scan for freeGPS in the
media data even when referenced by 'gps ' atom
- Other internal changes to decoding of timed GPS from videos
- Fixed problem were ExifTool would give up on extracting some types of timed
GPS from videos after 100 void fixes
- Fixed bug that could cause runtime error when reading Ogg files
- Fixed issue where some tags from alternate files using the -fileNUM option
weren't generated as requested
- API Changes:
- Added Geolocation,
GeolocMaxDist and
GeolocMinPop API options

Feb. 16, 2024 - Version 12.77

- Added new Olympus CameraType and LensType value (thanks herb)
- Added a new Canon Irix LensType
- Added the ability to delete MacOS XAttrMDItemWhereFroms
- Decode a few new Canon DPP tags (thanks John Moyer)
- Decode timed GPS from Adzome GS65H MOV videos
- Improved handling of XML-unfriendly characters in JSON field names (fixes
issue where -X option could produce invalid XML when reading JSON with the
-struct option)
- Fixed decoding of ShutterCount for Canon G5X-ii CR3 files

Jan. 31, 2024 - Version 12.76 (production release)

- Properly implement patch of 12.45 to avoid duplicating raw data when writing
Expand All @@ -19,6 +60,7 @@ Jan. 30, 2024 - Version 12.75 (production release)
- CORRUPTION WARNING: Fixed bug introduced in 12.45 which could result in
corrupted Sony ARW images from some newer models when rewriting lossless
compressed ARW images which were previously edited by 12.44 or earlier
(the corruption is repairable, but requires a special version of ExifTool)
- Added ability to read C2PA JUMBF metadata from PDF and SVG files
- Added ability to extract JUMBF metadata as a block
- Added read support for C2PA (JUMBF-format) files
Expand Down Expand Up @@ -547,7 +589,7 @@ Oct. 13, 2022 - Version 12.48
"Z" are actually in Zulu time -- a bit of a mess really)
- Prevent dynamically-generated Unknown tags from being extracted when the
-validate option is used without -u
- Patched to better handle irregular timestamps in streaming GPS of NextBase
- Patched to better handle irregular timestamps in streaming GPS of Nextbase
dashcam videos
- Fixed incompatibility with Sigma Photo Pro which could result in Sigma Photo
Pro corrupting an ExifTool-edited X3F image (the section length in the
Expand Down Expand Up @@ -1419,7 +1461,7 @@ Mar. 19, 2020 - Version 11.92
- Added a new Nikon LensID (thanks Wolfgang Exler)
- Decode a few new Leica tags (thanks Tim Gray)
- Decode AccelerometerData from Samsung Gear 360 videos
- Fixed a couple of problems decoding timed GPS metadata from NextBase dashcam
- Fixed a couple of problems decoding timed GPS metadata from Nextbase dashcam
videos
- Fixed problem where -X option could produce invalid XML when reading
corrupted XMP
Expand Down Expand Up @@ -2308,7 +2350,7 @@ Oct. 16, 2018 - Version 11.14

Oct. 9, 2018 - Version 11.13

- Decode GPS from NextBase 512G dashcam MOV videos (different than 512GW)
- Decode GPS from Nextbase 512G dashcam MOV videos (different than 512GW)
- Added a new Canon LensType (thanks LibRaw)
- Minor improvements to verbose dump of streaming GPS metadata
- Reverted change of version 10.71 which resulted in Windows not recognizing
Expand All @@ -2327,7 +2369,7 @@ Oct. 2, 2018 - Version 11.12
- Added a new Sony/Minolta LensType (thanks LibRaw and Jos Roost)
- Added a new Nikon LensID
- Decode a few new Sony SRF2 tags (thanks LibRaw)
- Decode GPS from NextBase 512GW dashcam MOV videos
- Decode GPS from Nextbase 512GW dashcam MOV videos
- Validate MS-DOC FIB before extracting contained tags
- Fixed bug extracting GPSSpeed for some dashcam models

Expand Down
4 changes: 4 additions & 0 deletions bin/MANIFEST
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,8 @@ lib/Image/ExifTool/GIF.pm
lib/Image/ExifTool/GIMP.pm
lib/Image/ExifTool/GPS.pm
lib/Image/ExifTool/GeoTiff.pm
lib/Image/ExifTool/Geolocation.dat
lib/Image/ExifTool/Geolocation.pm
lib/Image/ExifTool/Geotag.pm
lib/Image/ExifTool/GoPro.pm
lib/Image/ExifTool/H264.pm
Expand Down Expand Up @@ -543,6 +545,7 @@ t/ExifTool_32.out
t/ExifTool_33.out
t/ExifTool_34.out
t/ExifTool_35.out
t/ExifTool_36.out
t/ExifTool_4.out
t/ExifTool_5.out
t/ExifTool_6.out
Expand Down Expand Up @@ -920,6 +923,7 @@ t/Writer_58.out
t/Writer_59.out
t/Writer_6.out
t/Writer_60.out
t/Writer_61.out
t/Writer_7.out
t/Writer_9.out
t/XISF.t
Expand Down
2 changes: 1 addition & 1 deletion bin/META.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@
}
},
"release_status" : "stable",
"version" : "12.76"
"version" : "12.78"
}
2 changes: 1 addition & 1 deletion bin/META.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ recommends:
Time::HiRes: 0
requires:
perl: 5.004
version: 12.76
version: 12.78
6 changes: 3 additions & 3 deletions bin/README
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ supported by ExifTool (r = read, w = write, c = create):
3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
7Z r | DV r | JPEG r/w | OFR r | RWZ r
A r | DVB r/w | JSON r | OGG r | RM r
AA r | DVR-MS r | JXL r | OGV r | SEQ r
AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
AAC r | DYLIB r | K25 r | ONP r | SKETCH r
AAE r | EIP r | KDC r | OPUS r | SO r
AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
Expand Down Expand Up @@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
terminal window to extract and run ExifTool:

cd ~/Desktop
gzip -dc Image-ExifTool-12.76.tar.gz | tar -xf -
cd Image-ExifTool-12.76
gzip -dc Image-ExifTool-12.78.tar.gz | tar -xf -
cd Image-ExifTool-12.78
./exiftool t/images/ExifTool.jpg

Note: These commands extract meta information from one of the test images.
Expand Down
12 changes: 10 additions & 2 deletions bin/config_files/example.config
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
# Notes: This example file shows how to define your own shortcuts and
# add new EXIF, IPTC, XMP, PNG, MIE and Composite tags, as well
# as how to specify preferred lenses for the LensID tag, and
# define new file types and default ExifTool option values.
# define new file types and default ExifTool API options and
# command-line arguments.
#
# Note that unknown tags may be extracted even if they aren't
# defined, but tags must be defined to be written. Also note
Expand Down Expand Up @@ -345,7 +346,7 @@ use Image::ExifTool::MIE;
use Image::ExifTool::QuickTime;
$Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;

# Specify default ExifTool option values
# Specify default ExifTool API options
# (see the Options function documentation for available options)
%Image::ExifTool::UserDefined::Options = (
CoordFormat => '%.6f', # change default GPS coordinate format
Expand All @@ -354,5 +355,12 @@ $Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
RequestAll => 3, # request additional tags not normally generated
);

# Specify default exiftool command-line arguments
# - inserted before all other options except -config
# - applies to all -execute'd commands
@Image::ExifTool::UserDefined::Arguments = (
'-i', 'HIDDEN', # ignore hidden files by default (names beginning with ".")
);

#------------------------------------------------------------------------------
1; #end
63 changes: 49 additions & 14 deletions bin/exiftool
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use strict;
use warnings;
require 5.004;

my $version = '12.76';
my $version = '12.78';

# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
my $exePath;
Expand Down Expand Up @@ -166,6 +166,7 @@ my $filtered; # flag indicating file was filtered by name
my $filterFlag; # file filter flag (0x01=deny extensions, 0x02=allow extensions, 0x04=add ext)
my $fixLen; # flag to fix description lengths when writing alternate languages
my $forcePrint; # string to use for missing tag values (undef to not print them)
my $geoOnly; # flag to extract Geolocation tags only
my $helped; # flag to avoid printing help if no tags specified
my $html; # flag for html-formatted output (2=html dump)
my $interrupted; # flag set if CTRL-C is pressed during a critical process
Expand Down Expand Up @@ -490,6 +491,7 @@ undef $fileHeader;
undef $filtered;
undef $fixLen;
undef $forcePrint;
undef $geoOnly;
undef $ignoreHidden;
undef $joinLists;
undef $langOpt;
Expand Down Expand Up @@ -587,6 +589,11 @@ if (not $preserveTime and $^O eq 'MSWin32') {
$preserveTime = 2 if eval { require Win32::API } and eval { require Win32API::File };
}

# add user-defined command-line arguments
if (@Image::ExifTool::UserDefined::Arguments) {
unshift @ARGV, @Image::ExifTool::UserDefined::Arguments;
}

# parse command-line options in 2 passes...
# pass 1: set all of our ExifTool options
# pass 2: print all of our help and informational output (-list, -ver, etc)
Expand Down Expand Up @@ -1414,6 +1421,13 @@ if ($useMWG and not defined $mt->Options('CharsetEXIF')) {
$mt->Options(CharsetEXIF => 'UTF8');
}

# allow geolocation without input file if set to a position
if (not @files and not $outOpt and not @newValues) {
my $loc = $mt->Options('Geolocation');
# use undocumented feature to input JSON file directly from command line
$loc and $loc =~ /,/ and push(@files, qq(\@JSON:{})), $geoOnly = 1;
}

# print help
unless ((@tags and not $outOpt) or @files or @newValues) {
if ($doGlob and $doGlob == 2) {
Expand Down Expand Up @@ -2113,6 +2127,11 @@ sub GetImageInfo($$)
# can't make use of $info if verbose because we must reprocess
# the file anyway to generate the verbose output
undef $info if $verbose or defined $fastCondition;
} elsif ($file =~ s/^(\@JSON:)(.*)/$1/) {
# read JSON file from command line
my $dat = $2;
$info = $et->ImageInfo(\$dat, \@foundTags);
if ($geoOnly) { /^Geolocation/ or delete $$info{$_} foreach keys %$info }
}
if (defined $deleteOrig) {
Progress($vout, "======== $file") if defined $verbose;
Expand Down Expand Up @@ -2169,7 +2188,7 @@ sub GetImageInfo($$)
}

# extract information from this file
unless ($file eq '-' or $et->Exists($file)) {
unless ($file eq '-' or $et->Exists($file) or $info) {
Warn "Error: File not found - $file\n";
FileNotFound($file);
defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
Expand Down Expand Up @@ -2354,7 +2373,7 @@ sub GetImageInfo($$)
# set delimiters for JSON or PHP output
($bra, $ket, $sep) = $json == 1 ? ('{','}',':') : ('Array(',')',' =>');
print $fp ",\n" if $comma;
print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file));
print $fp qq($bra\n "SourceFile"$sep ), EscapeJSON(MyConvertFileName($et,$file),1);
$comma = 1;
$ind = (defined $showGroup and not $allGroup) ? ' ' : ' ';
} elsif ($csv) {
Expand Down Expand Up @@ -3372,7 +3391,22 @@ sub FormatXML($$$)
my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val;
foreach (@keys) {
# (some variable-namespace XML structure fields may have a different group)
my $tok = /:/ ? $_ : ($grp . ':' . $_);
my ($ns, $tg) = ($grp, $_);
if (/^(.*?):(.*)/) {
if ($grp eq 'JSON') {
$tg =~ tr/:/_/; # colons in JSON structure elements are not namespaces
} else {
($ns, $tg) = ($1, $2);
}
}
# validate XML attribute name
my $name;
foreach $name ($ns, $tg) {
# make sure name is valid for XML
$name =~ tr/-_A-Za-z0-9.//dc;
$name = '_' . $name if $name !~ /^[_A-Za-z]/;
}
my $tok = $ns . ':' . $tg;
$val2 .= "\n$ind <$tok" . FormatXML($$val{$_}, "$ind ", $grp) . "</$tok>";
}
$val = "$val2\n$ind";
Expand Down Expand Up @@ -3515,15 +3549,15 @@ sub PrintCSV()
}

#------------------------------------------------------------------------------
# Add tag groups from structure fields to a list
# Add tag groups from structure fields to a list for xmlns
# Inputs: 0) tag value, 1) parent group, 2) group hash ref, 3) group list ref
sub AddGroups($$$$)
{
my ($val, $grp, $groupHash, $groupList) = @_;
my ($key, $val2);
if (ref $val eq 'HASH') {
foreach $key (sort keys %$val) {
if ($key =~ /(.*?):/ and not $$groupHash{$1}) {
if ($key =~ /^(.*?):/ and not $$groupHash{$1} and $grp ne 'JSON') {
$$groupHash{$1} = $grp;
push @$groupList, $1;
}
Expand Down Expand Up @@ -4655,7 +4689,7 @@ supported by ExifTool (r = read, w = write, c = create):
3GP r/w | DSS r | JP2 r/w | ODT r | RWL r/w
7Z r | DV r | JPEG r/w | OFR r | RWZ r
A r | DVB r/w | JSON r | OGG r | RM r
AA r | DVR-MS r | JXL r | OGV r | SEQ r
AA r | DVR-MS r | JXL r/w | OGV r | SEQ r
AAC r | DYLIB r | K25 r | ONP r | SKETCH r
AAE r | EIP r | KDC r | OPUS r | SO r
AAX r/w | EPS r/w | KEY r | ORF r/w | SR2 r/w
Expand Down Expand Up @@ -4824,7 +4858,7 @@ L<Advanced options|/Advanced options>
-common_args Define common arguments
-config CFGFILE Specify configuration file name
-echo[NUM] TEXT Echo text to stdout or stderr
-efile[NUM][!] ERRFILE Save names of files with errors
-efile[NUM][!] TXTFILE Save names of files with errors
-execute[NUM] Execute multiple commands on one line
-fileNUM ALTFILE Load tags from alternate file
-list_dir List directories, not their contents
Expand Down Expand Up @@ -5216,8 +5250,9 @@ Notes:
when copying tags using the B<-tagsFromFile> option.
2) If the hemisphere is known, a reference direction (N, S, E or W) is
appended to each printed coordinate, but adding a C<+> to the format
specifier (eg. C<%+.6f>) prints a signed coordinate instead.
appended to each printed coordinate, but adding a C<+> or C<-> to the format
specifier (eg. C<%+.6f> or C<%-.6f>) prints a signed coordinate instead.
(C<+> adds a leading "+" for positive coordinates, but C<-> does not.)
3) This print formatting may be disabled with the B<-n> option to extract
coordinates as signed decimal degrees.
Expand Down Expand Up @@ -5605,7 +5640,7 @@ with this command:
produces output like this:
-- Generated by ExifTool 12.76 --
-- Generated by ExifTool 12.78 --
File: a.jpg - 2003:10:31 15:44:19
(f/5.6, 1/60s, ISO 100)
File: b.jpg - 2006:05:23 11:57:38
Expand Down Expand Up @@ -6596,15 +6631,15 @@ respectively) after processing is complete. For B<-echo3> and B<-echo4>,
"${status}" may be used in the I<TEXT> string to represent the numerical
exit status of the command (see L</EXIT STATUS>).
=item B<-efile>[I<NUM>][!] I<ERRFILE>
=item B<-efile>[I<NUM>][!] I<TXTFILE>
Save the names of files giving errors (I<NUM> missing or 1), files that were
unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
files that were updated (I<NUM> is 8), files that were created (I<NUM> is
16), or any combination thereof by summing I<NUM> (eg. B<-efile3> is the
same has having both B<-efile> and B<-efile2> options with the same
I<ERRFILE>). By default, file names are appended to any existing I<ERRFILE>,
but I<ERRFILE> is overwritten if an exclamation point is added to the option
I<TXTFILE>). By default, file names are appended to any existing I<TXTFILE>,
but I<TXTFILE> is overwritten if an exclamation point is added to the option
(eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
option if applicable.
Expand Down

0 comments on commit fa3e976

Please sign in to comment.