exiftool_vendored 12.18.0 → 12.22.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.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +54 -0
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +1 -8
- data/bin/exiftool +70 -32
- data/bin/fmt_files/gpx.fmt +1 -1
- data/bin/fmt_files/gpx_wpt.fmt +1 -1
- data/bin/fmt_files/kml.fmt +1 -1
- data/bin/fmt_files/kml_track.fmt +1 -1
- data/bin/lib/Image/ExifTool.pm +74 -24
- data/bin/lib/Image/ExifTool.pod +33 -25
- data/bin/lib/Image/ExifTool/Apple.pm +3 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +20 -10
- data/bin/lib/Image/ExifTool/Canon.pm +6 -1
- data/bin/lib/Image/ExifTool/DJI.pm +6 -6
- data/bin/lib/Image/ExifTool/Exif.pm +5 -2
- data/bin/lib/Image/ExifTool/FITS.pm +13 -2
- data/bin/lib/Image/ExifTool/GPS.pm +22 -11
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -2
- data/bin/lib/Image/ExifTool/M2TS.pm +40 -4
- data/bin/lib/Image/ExifTool/MIE.pm +2 -2
- data/bin/lib/Image/ExifTool/Microsoft.pm +296 -82
- data/bin/lib/Image/ExifTool/Nikon.pm +2 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +28 -12
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +6 -5
- data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -0
- data/bin/lib/Image/ExifTool/Sony.pm +51 -17
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +4031 -4022
- data/bin/lib/Image/ExifTool/TagNames.pod +130 -95
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -5
- data/bin/lib/Image/ExifTool/Writer.pl +43 -10
- data/bin/lib/Image/ExifTool/XMP.pm +4 -4
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2862287affdad95022ad8df06fd1b420c2861e28f5daefa50c627c42db2e396
|
4
|
+
data.tar.gz: 90b7804c201830e6cacc5b28b9ba29ef4a5fff7bb6a1cb26db1fce970495769e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85a74e99266a89cf019066af0227b8d6515b153d2d5612814afa1bac1faffa874e6defa7aa524577a4031154cc81f0b74277136476cf35c6bb2aa9cc35e1148f
|
7
|
+
data.tar.gz: 42911ad4e1f2c03ff6a95cc25f3fcb47f8fbda099d6cfb669e72fefa9c743b002865225d872d179654dc79f3958d6e94feb20d7bfb317e3006c7b8bdee195e98
|
data/bin/Changes
CHANGED
@@ -7,6 +7,60 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 12.16. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Mar. 17, 2021 - Version 12.22
|
11
|
+
|
12
|
+
- Added a few new Sony LensTypes and a new SonyModelID (thanks Jos Roost and
|
13
|
+
LibRaw)
|
14
|
+
- Added Extra BaseName tag
|
15
|
+
- Added a new CanonModelID (thanks LibRaw)
|
16
|
+
- Decode timed GPS from unlisted programs in M2TS videos with the -ee3 option
|
17
|
+
- Decode more Sony rtmd tags
|
18
|
+
- Decode some tags for the Sony ILME-FX3 (thanks Jos Roost)
|
19
|
+
- Allow negative values to be written to XMP-aux:LensID
|
20
|
+
- Recognize HEVC video program in M2TS files
|
21
|
+
- Enhanced -b option so --b suppresses tags with binary data
|
22
|
+
- Improved flexibility when writing GPS coordinates:
|
23
|
+
- Now pulls latitude and longitude from a combined GPSCoordinates string
|
24
|
+
- Recognizes the full word "South" and "West" to write negative coordinates
|
25
|
+
- Improved warning when trying to write an integer QuickTime date/time tag and
|
26
|
+
Time::Local is not available
|
27
|
+
- Convert GPSSpeed from mph to km/h in timed GPS from Garmin MP4 videos
|
28
|
+
|
29
|
+
Feb. 24, 2021 - Version 12.21
|
30
|
+
|
31
|
+
- Added a few new iOS QuickTime tags
|
32
|
+
- Decode a couple more Sony rtmd tags
|
33
|
+
- Patch to avoid possible "Use of uninitialized value" warning when attempting
|
34
|
+
to write QuickTime date/time tags with an invalid value
|
35
|
+
- Fixed problem writing Microsoft Xtra tags
|
36
|
+
- Fixed Windows daylight savings time patch for file times that was broken in
|
37
|
+
12.19 (however directory times will not yet handle DST properly)
|
38
|
+
|
39
|
+
Feb. 23, 2021 - Version 12.20
|
40
|
+
|
41
|
+
- Added ability to write some Microsoft Xtra tags in MOV/MP4 videos
|
42
|
+
- Added two new Canon LensType values (thanks Norbert Wasser)
|
43
|
+
- Added a new Nikon LensID
|
44
|
+
- Fixed problem reading FITS comments that start before column 11
|
45
|
+
|
46
|
+
Feb. 18, 2021 - Version 12.19
|
47
|
+
|
48
|
+
- Added -list_dir option
|
49
|
+
- Added the "ls-l" Shortcut tag
|
50
|
+
- Extract Comment and History from FITS files
|
51
|
+
- Enhanced FilePermissions to include device type (similar to "ls -l")
|
52
|
+
- Changed the name of Apple ContentIdentifier tag to MediaGroupUUID
|
53
|
+
(thanks Neal Krawetz)
|
54
|
+
- Fixed a potential "substr outside of string" runtime error when reading
|
55
|
+
corrupted EXIF
|
56
|
+
- Fixed edge case where NikonScanIFD may not be copied properly when copying
|
57
|
+
MakerNotes to another file
|
58
|
+
- API Changes:
|
59
|
+
- Added ability to read/write System tags of directories
|
60
|
+
- Enhanced GetAllGroups() to support family 7 and take optional ExifTool
|
61
|
+
reference
|
62
|
+
- Changed QuickTimeHandler option default to 1
|
63
|
+
|
10
64
|
Feb. 9, 2021 - Version 12.18
|
11
65
|
|
12
66
|
- Added a new SonyModelID
|
data/bin/MANIFEST
CHANGED
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -106,8 +106,8 @@ your home directory, then you would type the following commands in a
|
|
106
106
|
terminal window to extract and run ExifTool:
|
107
107
|
|
108
108
|
cd ~/Desktop
|
109
|
-
gzip -dc Image-ExifTool-12.
|
110
|
-
cd Image-ExifTool-12.
|
109
|
+
gzip -dc Image-ExifTool-12.22.tar.gz | tar -xf -
|
110
|
+
cd Image-ExifTool-12.22
|
111
111
|
./exiftool t/images/ExifTool.jpg
|
112
112
|
|
113
113
|
Note: These commands extract meta information from one of the test images.
|
@@ -165,14 +165,7 @@
|
|
165
165
|
# specified, then at least one of the Desire'd tags must exist. See
|
166
166
|
# the Composite table in Image::ExifTool::Exif for more examples,
|
167
167
|
# and lib/Image/ExifTool/README for all of the details.
|
168
|
-
|
169
|
-
Require => {
|
170
|
-
0 => 'FileName',
|
171
|
-
},
|
172
|
-
# remove the extension from FileName
|
173
|
-
ValueConv => '$val[0] =~ /(.*)\./ ? $1 : $val[0]',
|
174
|
-
},
|
175
|
-
# the next few examples demonstrate simplifications which may be
|
168
|
+
# The first few examples demonstrate simplifications which may be
|
176
169
|
# used if only one tag is Require'd or Desire'd:
|
177
170
|
# 1) the Require lookup may be replaced with a simple tag name
|
178
171
|
# 2) "$val" may be used to represent "$val[0]" in the expression
|
data/bin/exiftool
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
use strict;
|
11
11
|
require 5.004;
|
12
12
|
|
13
|
-
my $version = '12.
|
13
|
+
my $version = '12.22';
|
14
14
|
|
15
15
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
16
16
|
my $exeDir;
|
@@ -159,14 +159,17 @@ my $forcePrint; # string to use for missing tag values (undef to not print t
|
|
159
159
|
my $helped; # flag to avoid printing help if no tags specified
|
160
160
|
my $html; # flag for html-formatted output (2=html dump)
|
161
161
|
my $interrupted; # flag set if CTRL-C is pressed during a critical process
|
162
|
+
my $isBinary; # true if value is a SCALAR ref
|
162
163
|
my $isWriting; # flag set if we are writing tags
|
163
164
|
my $joinLists; # flag set to join list values into a single string
|
164
165
|
my $json; # flag for JSON/PHP output format (1=JSON, 2=PHP)
|
165
166
|
my $langOpt; # language option
|
167
|
+
my $listDir; # treat a directory as a regular file
|
166
168
|
my $listItem; # item number for extracting single item from a list
|
167
169
|
my $listSep; # list item separator (', ' by default)
|
168
170
|
my $mt; # main ExifTool object
|
169
171
|
my $multiFile; # non-zero if we are scanning multiple files
|
172
|
+
my $noBinary; # flag set to ignore binary tags
|
170
173
|
my $outFormat; # -1=Canon format, 0=same-line, 1=tag names, 2=values only
|
171
174
|
my $outOpt; # output file or directory name
|
172
175
|
my $overwriteOrig; # flag to overwrite original file (1=overwrite, 2=in place)
|
@@ -203,7 +206,6 @@ my $validFile; # flag indicating we processed a valid file
|
|
203
206
|
my $verbose; # verbose setting
|
204
207
|
my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
|
205
208
|
my $windowTitle; # title for console window
|
206
|
-
my $isBinary; # true if value is a SCALAR ref
|
207
209
|
my $xml; # flag for XML-formatted output
|
208
210
|
|
209
211
|
# flag to keep the input -@ argfile open:
|
@@ -474,6 +476,7 @@ undef $joinLists;
|
|
474
476
|
undef $langOpt;
|
475
477
|
undef $listItem;
|
476
478
|
undef $multiFile;
|
479
|
+
undef $noBinary;
|
477
480
|
undef $outOpt;
|
478
481
|
undef $preserveTime;
|
479
482
|
undef $progress;
|
@@ -691,7 +694,7 @@ for (;;) {
|
|
691
694
|
} else { # 'g(\d*)'
|
692
695
|
# list all groups in specified family
|
693
696
|
my $family = $2 || 0;
|
694
|
-
PrintTagList("Groups in family $family", GetAllGroups($family));
|
697
|
+
PrintTagList("Groups in family $family", $mt->GetAllGroups($family));
|
695
698
|
}
|
696
699
|
next;
|
697
700
|
}
|
@@ -792,7 +795,11 @@ for (;;) {
|
|
792
795
|
next;
|
793
796
|
}
|
794
797
|
/^arg(s|format)$/i and $argFormat = 1, next;
|
795
|
-
/^b(inary)?$/i
|
798
|
+
if (/^(-?)b(inary)?$/i) {
|
799
|
+
($binaryOutput, $noBinary) = $1 ? (undef, 1) : (1, undef);
|
800
|
+
$mt->Options(Binary => $binaryOutput, NoPDFList => $binaryOutput);
|
801
|
+
next;
|
802
|
+
}
|
796
803
|
if (/^c(oordFormat)?$/i) {
|
797
804
|
my $fmt = shift;
|
798
805
|
$fmt or Error("Expecting coordinate format for -c option\n"), $badCmd=1, next;
|
@@ -876,6 +883,7 @@ for (;;) {
|
|
876
883
|
}
|
877
884
|
(/^D$/ or $a eq 'decimal') and $showTagID = 'D', next;
|
878
885
|
/^delete_original(!?)$/i and $deleteOrig = ($1 ? 2 : 1), next;
|
886
|
+
/^list_dir$/i and $listDir = 1, next;
|
879
887
|
(/^e$/ or $a eq '-composite') and $mt->Options(Composite => 0), next;
|
880
888
|
(/^-e$/ or $a eq 'composite') and $mt->Options(Composite => 1), next;
|
881
889
|
(/^E$/ or $a eq 'escapehtml') and require Image::ExifTool::HTML and $escapeHTML = 1, next;
|
@@ -2270,6 +2278,7 @@ TAG: foreach $tag (@foundTags) {
|
|
2270
2278
|
next unless $$et{REQ_TAG_LOOKUP}{$lcTag};
|
2271
2279
|
}
|
2272
2280
|
$val = ConvertBinary($val); # convert SCALAR references
|
2281
|
+
next unless defined $val;
|
2273
2282
|
if ($structOpt) {
|
2274
2283
|
# serialize structure if necessary
|
2275
2284
|
$val = Image::ExifTool::XMP::SerializeStruct($val) unless $xml or $json;
|
@@ -2708,7 +2717,7 @@ sub SetImageInfo($$$)
|
|
2708
2717
|
return 0;
|
2709
2718
|
}
|
2710
2719
|
}
|
2711
|
-
if (not $isStdout and ($et->IsDirectory($outfile) or $outfile =~ /\/$/)) {
|
2720
|
+
if (not $isStdout and (($et->IsDirectory($outfile) and not $listDir) or $outfile =~ /\/$/)) {
|
2712
2721
|
$outfile .= '/' unless $outfile =~ /\/$/;
|
2713
2722
|
my $name = $file;
|
2714
2723
|
$name =~ s/^.*\///s; # remove directory name
|
@@ -2911,6 +2920,10 @@ sub SetImageInfo($$$)
|
|
2911
2920
|
unless (defined $tmpFile) {
|
2912
2921
|
# count the number of tags and pseudo-tags we are writing
|
2913
2922
|
my ($numSet, $numPseudo) = $et->CountNewValues();
|
2923
|
+
if ($numSet != $numPseudo and $et->IsDirectory($file)) {
|
2924
|
+
print $vout "Can't write real tags to a directory - $infile\n" if defined $verbose;
|
2925
|
+
$numSet = $numPseudo;
|
2926
|
+
}
|
2914
2927
|
if ($et->Exists($file)) {
|
2915
2928
|
unless ($numSet) {
|
2916
2929
|
# no need to write if no tags set
|
@@ -3395,20 +3408,25 @@ sub AddGroups($$$$)
|
|
3395
3408
|
#------------------------------------------------------------------------------
|
3396
3409
|
# Convert binary data (SCALAR references) for printing
|
3397
3410
|
# Inputs: 0) object reference
|
3398
|
-
# Returns: converted object
|
3411
|
+
# Returns: converted object, or undef if we don't want binary objects
|
3399
3412
|
sub ConvertBinary($)
|
3400
3413
|
{
|
3401
3414
|
my $obj = shift;
|
3402
3415
|
my ($key, $val);
|
3403
3416
|
if (ref $obj eq 'HASH') {
|
3404
3417
|
foreach $key (keys %$obj) {
|
3405
|
-
|
3418
|
+
next unless ref $$obj{$key};
|
3419
|
+
$$obj{$key} = ConvertBinary($$obj{$key});
|
3420
|
+
return undef unless defined $$obj{$key};
|
3406
3421
|
}
|
3407
3422
|
} elsif (ref $obj eq 'ARRAY') {
|
3408
3423
|
foreach $val (@$obj) {
|
3409
|
-
|
3424
|
+
next unless ref $val;
|
3425
|
+
$val = ConvertBinary($val);
|
3426
|
+
return undef unless defined $val;
|
3410
3427
|
}
|
3411
3428
|
} elsif (ref $obj eq 'SCALAR') {
|
3429
|
+
return undef if $noBinary;
|
3412
3430
|
# (binaryOutput flag is set to 0 for binary mode of XML/PHP/JSON output formats)
|
3413
3431
|
if (defined $binaryOutput) {
|
3414
3432
|
$obj = $$obj;
|
@@ -3585,7 +3603,7 @@ sub ProcessFiles($;$)
|
|
3585
3603
|
++$progressCount;
|
3586
3604
|
$progStr = " [$progressCount/$progressMax]" if $progress;
|
3587
3605
|
}
|
3588
|
-
if ($et->IsDirectory($file)) {
|
3606
|
+
if ($et->IsDirectory($file) and not $listDir) {
|
3589
3607
|
$multiFile = $validFile = 1;
|
3590
3608
|
ScanDir($et, $file, $list);
|
3591
3609
|
} elsif ($filterFlag and not AcceptFile($file)) {
|
@@ -4624,6 +4642,7 @@ L<Advanced options|/Advanced options>
|
|
4624
4642
|
-echo[NUM] TEXT Echo text to stdout or stderr
|
4625
4643
|
-efile[NUM][!] ERRFILE Save names of files with errors
|
4626
4644
|
-execute[NUM] Execute multiple commands on one line
|
4645
|
+
-list_dir List directories, not their contents
|
4627
4646
|
-srcfile FMT Process a different source file
|
4628
4647
|
-stay_open FLAG Keep reading -@ argfile even after EOF
|
4629
4648
|
-userParam PARAM[[^]=[VAL]] Set user parameter (API UserParam opt)
|
@@ -4932,7 +4951,7 @@ documentation above for a complete description.
|
|
4932
4951
|
=head3 Input-output text formatting
|
4933
4952
|
|
4934
4953
|
Note that trailing spaces are removed from extracted values for most output
|
4935
|
-
text formats. The exceptions are
|
4954
|
+
text formats. The exceptions are B<-b>, B<-csv>, B<-j> and B<-X>.
|
4936
4955
|
|
4937
4956
|
=over 5
|
4938
4957
|
|
@@ -4958,17 +4977,21 @@ maintain separate list items when writing metadata back to image files, and
|
|
4958
4977
|
the B<-struct> option may be used when extracting to preserve structured XMP
|
4959
4978
|
information.
|
4960
4979
|
|
4961
|
-
=item B<-b> (B<-binary>)
|
4980
|
+
=item B<-b>, B<--b> (B<-binary>, B<--binary>)
|
4981
|
+
|
4982
|
+
Output requested metadata in binary format without tag names or descriptions
|
4983
|
+
(B<-b> or B<-binary>). This option is mainly used for extracting embedded
|
4984
|
+
images or other binary data, but it may also be useful for some text strings
|
4985
|
+
since control characters (such as newlines) are not replaced by '.' as they
|
4986
|
+
are in the default output. By default, list items are separated by a
|
4987
|
+
newline when extracted with the B<-b> option, but this may be changed (see
|
4988
|
+
the B<-sep> option for details). May be combined with B<-j>, B<-php> or
|
4989
|
+
B<-X> to extract binary data in JSON, PHP or XML format, but note that
|
4990
|
+
"unsafe" tags must be specified explicitly to be extracted as binary in
|
4991
|
+
these formats.
|
4962
4992
|
|
4963
|
-
|
4964
|
-
|
4965
|
-
other binary data, but it may also be useful for some text strings since
|
4966
|
-
control characters (such as newlines) are not replaced by '.' as they are in
|
4967
|
-
the default output. By default, list items are separated by a newline when
|
4968
|
-
extracted with the B<-b> option, but this may be changed (see the B<-sep>
|
4969
|
-
option for details). May be combined with C<-j>, C<-php> or C<-X> to
|
4970
|
-
extract binary data in JSON, PHP or XML format, but note that "unsafe" tags
|
4971
|
-
must be specified explicitly to be extracted as binary in these formats.
|
4993
|
+
With a leading double dash (B<--b> or B<--binary>), tags which contain
|
4994
|
+
binary data are suppressed in the output when reading.
|
4972
4995
|
|
4973
4996
|
=item B<-c> I<FMT> (B<-coordFormat>)
|
4974
4997
|
|
@@ -5369,7 +5392,7 @@ with this command:
|
|
5369
5392
|
|
5370
5393
|
produces output like this:
|
5371
5394
|
|
5372
|
-
-- Generated by ExifTool 12.
|
5395
|
+
-- Generated by ExifTool 12.22 --
|
5373
5396
|
File: a.jpg - 2003:10:31 15:44:19
|
5374
5397
|
(f/5.6, 1/60s, ISO 100)
|
5375
5398
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -5729,7 +5752,8 @@ L<https://exiftool.org/geotag.html#Inverse> for examples.
|
|
5729
5752
|
Setting I<NUM> to 2 causes the H264 video stream in MP4 videos to be parsed
|
5730
5753
|
until the first Supplemental Enhancement Information (SEI) message is
|
5731
5754
|
decoded, or 3 to parse the entire H624 stream and decode all SEI
|
5732
|
-
information.
|
5755
|
+
information. For M2TS videos, a setting of 3 causes the entire file to be
|
5756
|
+
parsed in search of unlisted programs which may contain timed GPS.
|
5733
5757
|
|
5734
5758
|
=item B<-ext>[+] I<EXT>, B<--ext> I<EXT> (B<-extension>)
|
5735
5759
|
|
@@ -5818,10 +5842,10 @@ Ignore specified directory name. I<DIR> may be either an individual folder
|
|
5818
5842
|
name, or a full path. If a full path is specified, it must match the
|
5819
5843
|
Directory tag exactly to be ignored. Use multiple B<-i> options to ignore
|
5820
5844
|
more than one directory name. A special I<DIR> value of C<SYMLINKS> (case
|
5821
|
-
sensitive) may be specified to
|
5822
|
-
is used. As well, a value of C<HIDDEN>
|
5823
|
-
ignore files with names that start with a
|
5824
|
-
systems) when scanning a directory.
|
5845
|
+
sensitive) may be specified to avoid recursing into directories which are
|
5846
|
+
symbolic links when the B<-r> option is used. As well, a value of C<HIDDEN>
|
5847
|
+
(case sensitive) may be used to ignore files with names that start with a
|
5848
|
+
"." (ie. hidden files on Unix systems) when scanning a directory.
|
5825
5849
|
|
5826
5850
|
=item B<-if>[I<NUM>] I<EXPR>
|
5827
5851
|
|
@@ -6247,7 +6271,7 @@ As a convenience, C<-use MWG> is assumed if the C<MWG> group is specified
|
|
6247
6271
|
for any tag on the command line. See the L<MWG Tags
|
6248
6272
|
documentation|Image::ExifTool::TagNames/MWG Tags> for more details. Note
|
6249
6273
|
that this option is not reversible, and remains in effect until the
|
6250
|
-
application terminates, even across the
|
6274
|
+
application terminates, even across the B<-execute> option.
|
6251
6275
|
|
6252
6276
|
=back
|
6253
6277
|
|
@@ -6351,6 +6375,20 @@ line. I<NUM> is an optional number that is echoed in the "{ready}" message
|
|
6351
6375
|
when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
|
6352
6376
|
option no longer suppresses the output "{readyNUM}" message.
|
6353
6377
|
|
6378
|
+
=item B<-list_dir>
|
6379
|
+
|
6380
|
+
List directories themselves instead of their contents. This option
|
6381
|
+
effectively causes directories to be treated as normal files when reading
|
6382
|
+
and writing. For example, with this option the output of the C<ls -la>
|
6383
|
+
command on Mac/Linux may be approximated by this exiftool command:
|
6384
|
+
|
6385
|
+
exiftool -list_dir -T -ls-l -api systemtags -fast5 .* *
|
6386
|
+
|
6387
|
+
(The B<-T> option formats the output in tab-separated columns, B<-ls-l> is a
|
6388
|
+
L<shortcut tag|Image::ExifTool::Shortcuts>, the API SystemTags option is
|
6389
|
+
required to extract some necessary tags, and the B<-fast5> option is added
|
6390
|
+
for speed since only system tags are being extracted.)
|
6391
|
+
|
6354
6392
|
=item B<-srcfile> I<FMT>
|
6355
6393
|
|
6356
6394
|
Specify a different source file to be processed based on the name of the
|
@@ -6398,7 +6436,7 @@ buffered output.) ExifTool will then execute the command with the arguments
|
|
6398
6436
|
received up to this point, send a "{ready}" message to stdout when done
|
6399
6437
|
(unless the B<-q> or B<-T> option is used), and continue trying to read
|
6400
6438
|
arguments for the next command from I<ARGFILE>. To aid in command/response
|
6401
|
-
synchronization, any number appended to the
|
6439
|
+
synchronization, any number appended to the B<-execute> option is echoed in
|
6402
6440
|
the "{ready}" message. For example, C<-execute613> results in "{ready613}".
|
6403
6441
|
When this number is added, B<-q> no longer suppresses the "{ready}" message.
|
6404
6442
|
(Also, see the B<-echo3> and B<-echo4> options for additional ways to pass
|
@@ -6533,8 +6571,8 @@ complete list). Setting this triggers the use of Windows wide-character i/o
|
|
6533
6571
|
routines, thus providing support for most Unicode file names (see note 4).
|
6534
6572
|
But note that it is not trivial to pass properly encoded file names on the
|
6535
6573
|
Windows command line (see L<https://exiftool.org/faq.html#Q18> for details),
|
6536
|
-
so placing them in a UTF-8 encoded B<-@> argfile and using
|
6537
|
-
filename=utf8> is recommended if possible.
|
6574
|
+
so placing them in a UTF-8 encoded B<-@> argfile and using
|
6575
|
+
C<-charset filename=utf8> is recommended if possible.
|
6538
6576
|
|
6539
6577
|
A warning is issued if a specified filename contains special characters and
|
6540
6578
|
the filename character set was not provided. However, the warning may be
|
@@ -6608,7 +6646,7 @@ Print all meta information in an image, including duplicate and unknown
|
|
6608
6646
|
tags, sorted by group (for family 1). For performance reasons, this command
|
6609
6647
|
may not extract all available metadata. (Metadata in embedded documents,
|
6610
6648
|
metadata extracted by external utilities, and metadata requiring excessive
|
6611
|
-
processing time may not be extracted). Add C<-
|
6649
|
+
processing time may not be extracted). Add C<-ee3> and C<-api RequestAll=3>
|
6612
6650
|
to the command to extract absolutely everything available.
|
6613
6651
|
|
6614
6652
|
=item exiftool -common dir
|
@@ -6677,7 +6715,7 @@ L<Image::ExifTool::TagNames|Image::ExifTool::TagNames>).
|
|
6677
6715
|
Print one line of output containing the file name and DateTimeOriginal for
|
6678
6716
|
each image in directory C<dir>.
|
6679
6717
|
|
6680
|
-
=item exiftool -
|
6718
|
+
=item exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts
|
6681
6719
|
|
6682
6720
|
Extract all GPS positions from an AVCHD video.
|
6683
6721
|
|
data/bin/fmt_files/gpx.fmt
CHANGED
data/bin/fmt_files/gpx_wpt.fmt
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# Description: Example ExifTool print format file to generate GPX waypoints
|
5
5
|
# with pictures
|
6
6
|
#
|
7
|
-
# Usage: exiftool -p gpx_wpt.fmt -
|
7
|
+
# Usage: exiftool -p gpx_wpt.fmt -ee3 FILE [...] > out.gpx
|
8
8
|
#
|
9
9
|
# Requires: ExifTool version 10.49 or later
|
10
10
|
#
|
data/bin/fmt_files/kml.fmt
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# 2020/01/11 - F. Kotov Limited image preview size to 500px
|
16
16
|
#
|
17
17
|
# Notes: 1) Input files must contain GPSLatitude and GPSLongitude.
|
18
|
-
# 2) Add the -
|
18
|
+
# 2) Add the -ee3 option to extract the full track from video files.
|
19
19
|
# 3) For Google Earth to be able to find the images, the input
|
20
20
|
# images must be specified using relative paths, and "out.kml"
|
21
21
|
# must stay in the same directory as where the command was run.
|
data/bin/fmt_files/kml_track.fmt
CHANGED
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
28
28
|
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
|
30
30
|
|
31
|
-
$VERSION = '12.
|
31
|
+
$VERSION = '12.22';
|
32
32
|
$RELEASE = '';
|
33
33
|
@ISA = qw(Exporter);
|
34
34
|
%EXPORT_TAGS = (
|
@@ -42,7 +42,7 @@ $RELEASE = '';
|
|
42
42
|
DataAccess => [qw(
|
43
43
|
ReadValue GetByteOrder SetByteOrder ToggleByteOrder Get8u Get8s Get16u
|
44
44
|
Get16s Get32u Get32s Get64u GetFloat GetDouble GetFixed32s Write
|
45
|
-
WriteValue Tell Set8u Set8s Set16u Set32u Set64u
|
45
|
+
WriteValue Tell Set8u Set8s Set16u Set32u Set64u Set64s
|
46
46
|
)],
|
47
47
|
Utils => [qw(GetTagTable TagTableKeys GetTagInfoList AddTagToTable HexDump)],
|
48
48
|
Vars => [qw(%allTables @tableOrder @fileTypes)],
|
@@ -70,7 +70,7 @@ sub SetFileName($$;$$$);
|
|
70
70
|
sub SetSystemTags($$);
|
71
71
|
sub GetAllTags(;$);
|
72
72
|
sub GetWritableTags(;$);
|
73
|
-
sub GetAllGroups(
|
73
|
+
sub GetAllGroups($;$);
|
74
74
|
sub GetNewGroups($);
|
75
75
|
sub GetDeleteGroups();
|
76
76
|
sub AddUserDefinedTags($%);
|
@@ -89,6 +89,7 @@ sub Get64u($$);
|
|
89
89
|
sub GetFixed64s($$);
|
90
90
|
sub GetExtended($$);
|
91
91
|
sub Set64u(@);
|
92
|
+
sub Set64s(@);
|
92
93
|
sub DecodeBits($$;$);
|
93
94
|
sub EncodeBits($$;$$);
|
94
95
|
sub Filter($$$);
|
@@ -266,6 +267,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
266
267
|
DIB => ['BMP', 'Device Independent Bitmap'],
|
267
268
|
DIC => 'DICM',
|
268
269
|
DICM => ['DICOM','Digital Imaging and Communications in Medicine'],
|
270
|
+
DIR => ['DIR', 'Directory'],
|
269
271
|
DIVX => ['ASF', 'DivX media format'],
|
270
272
|
DJV => 'DJVU',
|
271
273
|
DJVU => ['AIFF', 'DjVu image'],
|
@@ -1129,6 +1131,13 @@ my %systemTagsNotes = (
|
|
1129
1131
|
RawConv => '$self->ConvertFileName($val)',
|
1130
1132
|
ValueConvInv => '$self->InverseFileName($val)',
|
1131
1133
|
},
|
1134
|
+
BaseName => {
|
1135
|
+
Groups => { 1 => 'System', 2 => 'Other' },
|
1136
|
+
Notes => q{
|
1137
|
+
file name without extension. Not generated unless specifically requested or
|
1138
|
+
the L<RequestAll|../ExifTool.html#RequestAll> API option is set
|
1139
|
+
},
|
1140
|
+
},
|
1132
1141
|
FilePath => {
|
1133
1142
|
Groups => { 1 => 'System', 2 => 'Other' },
|
1134
1143
|
Notes => q{
|
@@ -1270,10 +1279,19 @@ my %systemTagsNotes = (
|
|
1270
1279
|
WritePseudo => 1,
|
1271
1280
|
DelCheck => q{"Can't delete"},
|
1272
1281
|
Protected => 1, # all writable pseudo-tags must be protected!
|
1273
|
-
ValueConv => 'sprintf("%.3o", $val
|
1274
|
-
ValueConvInv => 'oct($val)',
|
1282
|
+
ValueConv => 'sprintf("%.3o", $val)',
|
1283
|
+
ValueConvInv => 'oct($val & 07777)',
|
1275
1284
|
PrintConv => sub {
|
1276
|
-
my ($mask, $
|
1285
|
+
my ($mask, $val) = (0400, oct(shift));
|
1286
|
+
my %types = (
|
1287
|
+
0010000 => 'p',
|
1288
|
+
0020000 => 'c',
|
1289
|
+
0040000 => 'd',
|
1290
|
+
0060000 => 'b',
|
1291
|
+
0120000 => 'l',
|
1292
|
+
0140000 => 's',
|
1293
|
+
);
|
1294
|
+
my $str = $types{$val & 0170000} || '-';
|
1277
1295
|
while ($mask) {
|
1278
1296
|
foreach (qw(r w x)) {
|
1279
1297
|
$str .= $val & $mask ? $_ : '-';
|
@@ -1284,6 +1302,7 @@ my %systemTagsNotes = (
|
|
1284
1302
|
},
|
1285
1303
|
PrintConvInv => sub {
|
1286
1304
|
my ($bit, $val, $str) = (8, 0, shift);
|
1305
|
+
$str = substr($str, 1) if length($str) == 10;
|
1287
1306
|
return undef if length($str) != 9;
|
1288
1307
|
while ($bit >= 0) {
|
1289
1308
|
foreach (qw(r w x)) {
|
@@ -2271,7 +2290,7 @@ sub ClearOptions($)
|
|
2271
2290
|
NoPDFList => undef, # flag to avoid splitting PDF List-type tag values
|
2272
2291
|
Password => undef, # password for password-protected PDF documents
|
2273
2292
|
PrintConv => 1, # flag to enable print conversion
|
2274
|
-
QuickTimeHandler =>
|
2293
|
+
QuickTimeHandler => 1, # flag to add mdir Handler to newly created Meta box
|
2275
2294
|
QuickTimeUTC=> undef, # assume that QuickTime date/time tags are stored as UTC
|
2276
2295
|
RequestAll => undef, # extract all tags that must be specifically requested
|
2277
2296
|
RequestTags => undef, # extra tags to request (on top of those in the tag list)
|
@@ -2321,7 +2340,7 @@ sub ExtractInfo($;@)
|
|
2321
2340
|
my $fast = $$options{FastScan} || 0;
|
2322
2341
|
my $req = $$self{REQ_TAG_LOOKUP};
|
2323
2342
|
my $reqAll = $$options{RequestAll} || 0;
|
2324
|
-
my (%saveOptions, $reEntry, $rsize, $type, @startTime, $saveOrder);
|
2343
|
+
my (%saveOptions, $reEntry, $rsize, $type, @startTime, $saveOrder, $isDir);
|
2325
2344
|
|
2326
2345
|
# check for internal ReEntry option to allow recursive calls to ExtractInfo
|
2327
2346
|
if (ref $_[1] eq 'HASH' and $_[1]{ReEntry} and
|
@@ -2394,6 +2413,11 @@ sub ExtractInfo($;@)
|
|
2394
2413
|
$realname =~ /\|$/ and $realname =~ s/^.*?"(.*?)".*/$1/s;
|
2395
2414
|
my ($dir, $name) = SplitFileName($realname);
|
2396
2415
|
$self->FoundTag('FileName', $name);
|
2416
|
+
if ($$req{basename} or
|
2417
|
+
($reqAll and not $$self{EXCL_TAG_LOOKUP}{basename}))
|
2418
|
+
{
|
2419
|
+
$self->FoundTag('BaseName', $name =~ /(.*)\./ ? $1 : $name);
|
2420
|
+
}
|
2397
2421
|
$self->FoundTag('Directory', $dir) if defined $dir and length $dir;
|
2398
2422
|
if ($$req{filepath} or
|
2399
2423
|
($reqAll and not $$self{EXCL_TAG_LOOKUP}{filepath}))
|
@@ -2417,6 +2441,8 @@ sub ExtractInfo($;@)
|
|
2417
2441
|
# in Windows cmd shell pipe even though it really failed
|
2418
2442
|
$$raf{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/;
|
2419
2443
|
$$self{RAF} = $raf;
|
2444
|
+
} elsif ($self->IsDirectory($filename)) {
|
2445
|
+
$isDir = 1;
|
2420
2446
|
} else {
|
2421
2447
|
$self->Error('Error opening file');
|
2422
2448
|
}
|
@@ -2425,28 +2451,34 @@ sub ExtractInfo($;@)
|
|
2425
2451
|
}
|
2426
2452
|
}
|
2427
2453
|
|
2428
|
-
while ($raf) {
|
2429
|
-
my (@stat, $
|
2454
|
+
while ($raf or $isDir) {
|
2455
|
+
my (@stat, $plainFile);
|
2430
2456
|
if ($reEntry) {
|
2431
2457
|
# we already set these tags
|
2458
|
+
} elsif (not $raf) {
|
2459
|
+
@stat = stat $filename;
|
2432
2460
|
} elsif (not $$raf{FILE_PT}) {
|
2433
2461
|
# get file size from image in memory
|
2434
2462
|
$self->FoundTag('FileSize', length ${$$raf{BUFF_PT}});
|
2435
2463
|
} elsif (-f $$raf{FILE_PT}) {
|
2436
2464
|
# get file tags if this is a plain file
|
2437
|
-
$fileSize = -s _;
|
2438
2465
|
@stat = stat _;
|
2439
|
-
|
2440
|
-
|
2441
|
-
$self->
|
2442
|
-
$self->FoundTag('FileModifyDate', $mTime) if defined $mTime;
|
2443
|
-
$self->FoundTag('FileAccessDate', $aTime) if defined $aTime;
|
2444
|
-
my $cTag = $^O eq 'MSWin32' ? 'FileCreateDate' : 'FileInodeChangeDate';
|
2445
|
-
$self->FoundTag($cTag, $cTime) if defined $cTime;
|
2446
|
-
$self->FoundTag('FilePermissions', $stat[2]) if defined $stat[2];
|
2466
|
+
$plainFile = 1;
|
2467
|
+
# hack to patch Windows daylight savings time bug
|
2468
|
+
@stat[8,9,10] = $self->GetFileTime($$raf{FILE_PT}) if $^O eq 'MSWin32';
|
2447
2469
|
} else {
|
2470
|
+
# (note that Windows directories will still show the
|
2471
|
+
# daylight savings time bug -- should fix this sometime)
|
2448
2472
|
@stat = stat $$raf{FILE_PT};
|
2449
2473
|
}
|
2474
|
+
my $fileSize = $stat[7];
|
2475
|
+
$self->FoundTag('FileSize', $stat[7]) if defined $stat[7];
|
2476
|
+
$self->FoundTag('ResourceForkSize', $rsize) if $rsize;
|
2477
|
+
$self->FoundTag('FileModifyDate', $stat[9]) if defined $stat[9];
|
2478
|
+
$self->FoundTag('FileAccessDate', $stat[8]) if defined $stat[8];
|
2479
|
+
my $cTag = $^O eq 'MSWin32' ? 'FileCreateDate' : 'FileInodeChangeDate';
|
2480
|
+
$self->FoundTag($cTag, $stat[10]) if defined $stat[10];
|
2481
|
+
$self->FoundTag('FilePermissions', $stat[2]) if defined $stat[2];
|
2450
2482
|
# extract more system info if SystemTags option is set
|
2451
2483
|
if (@stat) {
|
2452
2484
|
my $sys = $$options{SystemTags} || ($reqAll and not defined $$options{SystemTags});
|
@@ -2486,11 +2518,18 @@ sub ExtractInfo($;@)
|
|
2486
2518
|
if ($crDate or $mdItem or $xattr) {
|
2487
2519
|
require Image::ExifTool::MacOS;
|
2488
2520
|
Image::ExifTool::MacOS::GetFileCreateDate($self, $filename) if $crDate;
|
2489
|
-
Image::ExifTool::MacOS::ExtractMDItemTags($self, $filename) if $mdItem;
|
2521
|
+
Image::ExifTool::MacOS::ExtractMDItemTags($self, $filename) if $mdItem and $plainFile;
|
2490
2522
|
Image::ExifTool::MacOS::ExtractXAttrTags($self, $filename) if $xattr;
|
2491
2523
|
}
|
2492
2524
|
}
|
2493
|
-
|
2525
|
+
# do whatever else we can with directories, then return
|
2526
|
+
if ($isDir or (defined $stat[2] and ($stat[2] & 0170000) == 0040000)) {
|
2527
|
+
$self->FoundTag('FileType', 'DIR');
|
2528
|
+
$self->FoundTag('FileTypeExtension', '');
|
2529
|
+
$self->BuildCompositeTags() if $$options{Composite};
|
2530
|
+
$raf->Close() if $raf;
|
2531
|
+
return 1;
|
2532
|
+
}
|
2494
2533
|
# get list of file types to check
|
2495
2534
|
my ($tiffType, %noMagic, $recognizedExt);
|
2496
2535
|
my $ext = $$self{FILE_EXT} = GetFileExtension($realname);
|
@@ -4079,7 +4118,14 @@ sub GetFileTime($$)
|
|
4079
4118
|
# open file by name if necessary
|
4080
4119
|
unless (ref $file) {
|
4081
4120
|
local *FH;
|
4082
|
-
$self->Open(\*FH, $file)
|
4121
|
+
unless ($self->Open(\*FH, $file)) {
|
4122
|
+
if ($self->IsDirectory($file)) {
|
4123
|
+
my @rtn = (stat $file)[8, 9, 10];
|
4124
|
+
return @rtn if defined $rtn[0];
|
4125
|
+
}
|
4126
|
+
$self->Warn("GetFileTime error for '${file}'");
|
4127
|
+
return ();
|
4128
|
+
}
|
4083
4129
|
$file = *FH; # (not \*FH, so *FH will be kept open until $file goes out of scope)
|
4084
4130
|
}
|
4085
4131
|
# on Windows, try to work around incorrect file times when daylight saving time is in effect
|
@@ -5710,7 +5756,11 @@ sub GetUnixTime($;$)
|
|
5710
5756
|
my ($timeStr, $isLocal) = @_;
|
5711
5757
|
return 0 if $timeStr eq '0000:00:00 00:00:00';
|
5712
5758
|
my @tm = ($timeStr =~ /^(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)(.*)/);
|
5713
|
-
return undef unless @tm == 7
|
5759
|
+
return undef unless @tm == 7;
|
5760
|
+
unless (eval { require Time::Local }) {
|
5761
|
+
warn "Time::Local is not installed\n";
|
5762
|
+
return undef;
|
5763
|
+
}
|
5714
5764
|
my ($tzStr, $tzSec) = (pop(@tm), 0);
|
5715
5765
|
# use specified timezone offset (if given) instead of local system time
|
5716
5766
|
# if we are converting a local time value
|
@@ -5908,7 +5958,7 @@ sub ProcessTrailers($$)
|
|
5908
5958
|
for (;;) { # loop through all trailers
|
5909
5959
|
my ($proc, $outBuff);
|
5910
5960
|
if ($dirName eq 'Insta360') {
|
5911
|
-
require
|
5961
|
+
require 'Image/ExifTool/QuickTimeStream.pl';
|
5912
5962
|
$proc = 'Image::ExifTool::QuickTime::ProcessInsta360';
|
5913
5963
|
} else {
|
5914
5964
|
require "Image/ExifTool/$dirName.pm";
|