exiftool_vendored 13.58.0 → 13.59.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.
- checksums.yaml +4 -4
- data/bin/Changes +23 -1
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -2
- data/bin/config_files/example.config +1 -1
- data/bin/config_files/novelty.config +51 -0
- data/bin/exiftool +11 -9
- data/bin/lib/Image/ExifTool/Canon.pm +5 -3
- data/bin/lib/Image/ExifTool/DJI.pm +22 -5
- data/bin/lib/Image/ExifTool/Exif.pm +7 -7
- data/bin/lib/Image/ExifTool/FujiFilm.pm +14 -9
- data/bin/lib/Image/ExifTool/Import.pm +18 -9
- data/bin/lib/Image/ExifTool/Pentax.pm +6 -1
- data/bin/lib/Image/ExifTool/Sony.pm +68 -28
- data/bin/lib/Image/ExifTool/TagLookup.pm +3 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +36 -12
- data/bin/lib/Image/ExifTool/WriteXMP.pl +9 -0
- data/bin/lib/Image/ExifTool/Writer.pl +12 -0
- data/bin/lib/Image/ExifTool/XMP.pm +7 -4
- data/bin/lib/Image/ExifTool.pm +41 -13
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9ce05a515790dd95ab7268976c98a631cd914f89751e06325c85c4d5621295bc
|
|
4
|
+
data.tar.gz: d944c0936aea71dd27276c9591ac5e2568070f8a2088df644e8a019a42b98467
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f299b91c8e5085bf0f661ef597d551e3859c41c879ce8a2c14fdc4038396ea9882fd74f60a556c58d944b70db558b9719ced4cb4874784bd1d64b01c45cf4590
|
|
7
|
+
data.tar.gz: b2d2edf181e10759f40853133e294e1ed52dfbf14d7e90c94d2548d71c6bfa2c10d3203f77fb83fad1e787babb67e129e1275a66bf230899d6c357c9676b8619
|
data/bin/Changes
CHANGED
|
@@ -7,6 +7,28 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 13.55. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
May 27, 2026 - Version 13.59
|
|
11
|
+
|
|
12
|
+
- Security update
|
|
13
|
+
- Added NewUUID Extra tag (thanks Daniel Dumitriu, github #421)
|
|
14
|
+
- Added a new Canon RF lens (thanks Norbert Wasser)
|
|
15
|
+
- Added config_files/novelty.config to the distribution (github #422)
|
|
16
|
+
- Decode tags from the Sony ILCE-7RM6 (thanks Jos Roost)
|
|
17
|
+
- Decode a new FujiFilm tag (thanks Iliah Borg)
|
|
18
|
+
- Decode a few more DJI protobuf tags
|
|
19
|
+
- Decode a new Ricoh Pentax tag
|
|
20
|
+
- Issue Error instead of Warning when writing XMP with some problems which
|
|
21
|
+
could cause loss of data
|
|
22
|
+
- Improved error message when reading wrongly encoded CSV or JSON file
|
|
23
|
+
- Enhanced -config option to allow piped input with "-config -"
|
|
24
|
+
- Enhanced -validate option to do more strict checking of EXIF-for-XMP tags
|
|
25
|
+
- Patched -sort option avoid inconsistent output ordering of same-named tags
|
|
26
|
+
- Patched Composite SubSec date/time tags to specify the EXIF group for the
|
|
27
|
+
SubSec and OffsetTime tags upon which they are based (avoids non-standard
|
|
28
|
+
XMP tags from being incorrectly used here)
|
|
29
|
+
- Fixed bug in -diff feature when finding differences for specific tags and a
|
|
30
|
+
specified tag was missing from the source file
|
|
31
|
+
|
|
10
32
|
May 5, 2026 - Version 13.58
|
|
11
33
|
|
|
12
34
|
- Added a few new Nikon Z lenses (thanks Warren Hatch)
|
|
@@ -105,7 +127,7 @@ Feb. 19, 2026 - Version 13.51
|
|
|
105
127
|
|
|
106
128
|
Feb. 7, 2026 - Version 13.50 (production release)
|
|
107
129
|
|
|
108
|
-
- Security update (MacOS only
|
|
130
|
+
- Security update (MacOS only)
|
|
109
131
|
- Added a few new Sony lenses (thanks Jos Roost)
|
|
110
132
|
- Added a couple of new Canon lenses (thanks Norbert Wasser)
|
|
111
133
|
- Decode another Samsung trailer tag
|
data/bin/MANIFEST
CHANGED
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
|
@@ -111,8 +111,8 @@ your home directory, then you would type the following commands in a
|
|
|
111
111
|
terminal window to extract and run ExifTool:
|
|
112
112
|
|
|
113
113
|
cd ~/Desktop
|
|
114
|
-
gzip -dc Image-ExifTool-13.
|
|
115
|
-
cd Image-ExifTool-13.
|
|
114
|
+
gzip -dc Image-ExifTool-13.59.tar.gz | tar -xf -
|
|
115
|
+
cd Image-ExifTool-13.59
|
|
116
116
|
./exiftool t/images/ExifTool.jpg
|
|
117
117
|
|
|
118
118
|
Note: These commands extract meta information from one of the test images.
|
|
@@ -213,6 +213,7 @@ distribution package:
|
|
|
213
213
|
guano.config - Decode individual tags from Guano metadata
|
|
214
214
|
local_time.config - Determine local time from GPS information
|
|
215
215
|
nksc.config - Decode tags in Nikon ViewNX NKSC files
|
|
216
|
+
novelty.config - Definitions for XMP Novelty Theory tags
|
|
216
217
|
onone.config - Definitions for writing On1 XMP tags
|
|
217
218
|
photoshop_paths.config - For extracting or copying Photoshop paths
|
|
218
219
|
picasa_faces.config - Convert from Picasa to MWG/MP face regions
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
# new PNG tags are added to the PNG::TextualData table:
|
|
137
137
|
'Image::ExifTool::PNG::TextualData' => {
|
|
138
138
|
# Example 12. PNG:NewPngTag1
|
|
139
|
-
NewPngTag1 => { },
|
|
139
|
+
NewPngTag1 => { }, # (Writable is 'string' by default for XMP tags)
|
|
140
140
|
# Example 13. PNG:NewPngTag2
|
|
141
141
|
NewPngTag2 => { iTXt => 1 }, # (force this tag to be written as iTXt)
|
|
142
142
|
# Example 14. PNG:NewPngTag3
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#------------------------------------------------------------------------------
|
|
2
|
+
# File: novelty.config
|
|
3
|
+
#
|
|
4
|
+
# Description: This config file defines Novelty Theory XMP tags for writing.
|
|
5
|
+
#
|
|
6
|
+
# Notes: Tags for annotating timestamped media (video, photo, audio)
|
|
7
|
+
# with metadata in the context of Terence McKenna's Novelty
|
|
8
|
+
# Theory framework (see The Invisible Landscape, 1975).
|
|
9
|
+
# Published and maintained at http://hexart.pl/novelty/1.0/
|
|
10
|
+
# for use by archival projects documenting media against the
|
|
11
|
+
# McKenna timewave.
|
|
12
|
+
#
|
|
13
|
+
# Requires: ExifTool version 7.00 or later
|
|
14
|
+
#
|
|
15
|
+
# Revisions: 2026-05-27 - P. Harvey Created (from github #422)
|
|
16
|
+
#------------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
%Image::ExifTool::UserDefined = (
|
|
19
|
+
'Image::ExifTool::XMP::Main' => {
|
|
20
|
+
novelty => {
|
|
21
|
+
SubDirectory => { TagTable => 'Image::ExifTool::UserDefined::novelty' },
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
# Novelty Theory XMP namespace (http://hexart.pl/novelty/1.0/)
|
|
27
|
+
%Image::ExifTool::UserDefined::novelty = (
|
|
28
|
+
GROUPS => { 0 => 'XMP', 1 => 'XMP-novelty', 2 => 'Other' },
|
|
29
|
+
NAMESPACE => { novelty => 'http://hexart.pl/novelty/1.0/' },
|
|
30
|
+
WRITABLE => 'string',
|
|
31
|
+
NoveltyIndex => { Writable => 'real' },
|
|
32
|
+
TimewavePosition => { },
|
|
33
|
+
Concrescence => { },
|
|
34
|
+
EschatonCoordinates => { },
|
|
35
|
+
StrangeAttractor => { },
|
|
36
|
+
HabitNoveltyRatio => { },
|
|
37
|
+
WaveformType => { },
|
|
38
|
+
Protocol => { },
|
|
39
|
+
Operator => { },
|
|
40
|
+
Intent => { },
|
|
41
|
+
Witness => { },
|
|
42
|
+
CosmicSign => { },
|
|
43
|
+
Frequency => { },
|
|
44
|
+
SacredGeometry => { },
|
|
45
|
+
Dimension => { },
|
|
46
|
+
Lineage => { },
|
|
47
|
+
Mantra => { },
|
|
48
|
+
Seal => { Avoid => 1 }, # avoid conflict with XMP-seal:Seal
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
1; #end
|
data/bin/exiftool
CHANGED
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '13.
|
|
14
|
+
my $version = '13.59';
|
|
15
15
|
|
|
16
16
|
$^W = 1; # enable global warnings
|
|
17
17
|
|
|
@@ -2437,7 +2437,8 @@ sub GetImageInfo($$)
|
|
|
2437
2437
|
if (defined $tag) {
|
|
2438
2438
|
$done{$tag} = 1;
|
|
2439
2439
|
$g = $et->GetGroup($tag, $showGroup);
|
|
2440
|
-
}
|
|
2440
|
+
}
|
|
2441
|
+
unless ($g) { # ($g could be '' if requesting non-existent tag, and this will sort last)
|
|
2441
2442
|
for (;;) {
|
|
2442
2443
|
$tag2 = shift @found2;
|
|
2443
2444
|
defined $tag2 or $g = '', last;
|
|
@@ -4664,6 +4665,7 @@ sub FilenameSPrintf($;$@)
|
|
|
4664
4665
|
$part{F} = $part{f} . $part{E};
|
|
4665
4666
|
($part{D} = $part{d}) =~ s{/+$}{};
|
|
4666
4667
|
@part{qw(t g s o)} = @extra;
|
|
4668
|
+
$part{o} =~ s(^.*[/\\])()s if $part{o}; # remove directory if it exists
|
|
4667
4669
|
my ($filename, $pos) = ('', 0);
|
|
4668
4670
|
while ($fmt =~ /(%([-+]?)(\d*)([.:]?)(\d*)([lu]?)([dDfFeEtgso]))/g) {
|
|
4669
4671
|
$filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
|
|
@@ -6160,7 +6162,7 @@ with this command:
|
|
|
6160
6162
|
|
|
6161
6163
|
produces output like this:
|
|
6162
6164
|
|
|
6163
|
-
-- Generated by ExifTool 13.
|
|
6165
|
+
-- Generated by ExifTool 13.59 --
|
|
6164
6166
|
File: a.jpg - 2003:10:31 15:44:19
|
|
6165
6167
|
(f/5.6, 1/60s, ISO 100)
|
|
6166
6168
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6457,12 +6459,12 @@ between B<-W> and B<-w>:
|
|
|
6457
6459
|
|
|
6458
6460
|
2) B<-W> supports four additional format codes: %t, %g and %s represent the
|
|
6459
6461
|
tag name, group name, and suggested extension for the output file (based on
|
|
6460
|
-
the format of the data), and %o
|
|
6461
|
-
|
|
6462
|
-
extension). The %g code may be followed by a single digit to
|
|
6463
|
-
group family number (eg. %g1), otherwise family 0 is assumed.
|
|
6464
|
-
width/position/case specifiers may be used with these format
|
|
6465
|
-
exactly the same way as with %f and %e.
|
|
6462
|
+
the format of the data), and %o is the value of the OriginalRawFileName or
|
|
6463
|
+
OriginalFileName tag from the input file (without directory name, but
|
|
6464
|
+
including extension). The %g code may be followed by a single digit to
|
|
6465
|
+
specify the group family number (eg. %g1), otherwise family 0 is assumed.
|
|
6466
|
+
The substring width/position/case specifiers may be used with these format
|
|
6467
|
+
codes in exactly the same way as with %f and %e.
|
|
6466
6468
|
|
|
6467
6469
|
3) The argument for B<-W> is interpreted as a file name if it contains no
|
|
6468
6470
|
format codes. (For B<-w>, this would be a file extension.) This change
|
|
@@ -646,9 +646,10 @@ $VERSION = '5.07';
|
|
|
646
646
|
'61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
|
|
647
647
|
'61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
|
|
648
648
|
'61182.65' => 'Canon RF 85mm F1.4 L VCM', #github350
|
|
649
|
-
'61182.66' => 'Canon RF
|
|
650
|
-
'61182.67' => 'Canon RF
|
|
651
|
-
'61182.68' => 'Canon RF 14mm
|
|
649
|
+
'61182.66' => 'Canon RF 20-50mm F4 L IS USM PZ', #42
|
|
650
|
+
'61182.67' => 'Canon RF 45mm F1.2 STM', #42
|
|
651
|
+
'61182.68' => 'Canon RF 7-14mm F2.8-3.5 L FISHEYE STM', #42
|
|
652
|
+
'61182.69' => 'Canon RF 14mm F1.4 L VCM', #42
|
|
652
653
|
65535 => 'n/a',
|
|
653
654
|
);
|
|
654
655
|
|
|
@@ -7132,6 +7133,7 @@ my %ciMaxFocal = (
|
|
|
7132
7133
|
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
|
7133
7134
|
327 => 'Canon RF 20mm F1.4 L VCM', #42
|
|
7134
7135
|
328 => 'Canon RF 85mm F1.4 L VCM', #42/github350
|
|
7136
|
+
329 => 'Canon RF 20-50mm F4 L IS USM PZ', #42
|
|
7135
7137
|
330 => 'Canon RF 45mm F1.2 STM', #42
|
|
7136
7138
|
331 => 'Canon RF 7-14mm F2.8-3.5 L FISHEYE STM', #42
|
|
7137
7139
|
332 => 'Canon RF 14mm F1.4 L VCM', #42
|
|
@@ -18,7 +18,7 @@ use Image::ExifTool::XMP;
|
|
|
18
18
|
use Image::ExifTool::GPS;
|
|
19
19
|
use Image::ExifTool::Protobuf;
|
|
20
20
|
|
|
21
|
-
$VERSION = '1.
|
|
21
|
+
$VERSION = '1.19';
|
|
22
22
|
|
|
23
23
|
sub ProcessDJIInfo($$$);
|
|
24
24
|
sub ProcessSettings($$$);
|
|
@@ -275,7 +275,9 @@ my %convFloat2 = (
|
|
|
275
275
|
Name => 'FrameInfo',
|
|
276
276
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
277
277
|
},
|
|
278
|
-
'dvtm_ac203_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
|
278
|
+
#WRONG (forum17996) 'dvtm_ac203_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
|
279
|
+
'dvtm_ac203_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' }, #forum17996
|
|
280
|
+
'dvtm_ac203_3-2-3-1' => { Name => 'ISO', Format => 'float' }, #forum17996
|
|
279
281
|
'dvtm_ac203_3-2-4-1' => { # (NC)
|
|
280
282
|
Name => 'ShutterSpeed',
|
|
281
283
|
Format => 'rational',
|
|
@@ -315,6 +317,8 @@ my %convFloat2 = (
|
|
|
315
317
|
Name => 'FrameInfo',
|
|
316
318
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
317
319
|
},
|
|
320
|
+
'dvtm_ac204_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' }, #forum17996
|
|
321
|
+
'dvtm_ac204_3-2-3-1' => { Name => 'ISO', Format => 'float' }, #forum17996
|
|
318
322
|
'dvtm_ac204_3-2-4-1' => { # (NC)
|
|
319
323
|
Name => 'ShutterSpeed',
|
|
320
324
|
Format => 'rational',
|
|
@@ -354,6 +358,8 @@ my %convFloat2 = (
|
|
|
354
358
|
Name => 'FrameInfo',
|
|
355
359
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
356
360
|
},
|
|
361
|
+
'dvtm_ac206_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' }, #forum17996
|
|
362
|
+
'dvtm_ac206_3-2-3-1' => { Name => 'ISO', Format => 'float' }, #forum17996
|
|
357
363
|
'dvtm_ac206_3-2-4-1' => { # (NC)
|
|
358
364
|
Name => 'ShutterSpeed',
|
|
359
365
|
Format => 'rational',
|
|
@@ -395,7 +401,7 @@ my %convFloat2 = (
|
|
|
395
401
|
Name => 'FrameInfo',
|
|
396
402
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
397
403
|
},
|
|
398
|
-
|
|
404
|
+
'dvtm_AVATA2_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
399
405
|
'dvtm_AVATA2_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
|
|
400
406
|
Name => 'TimeStamp',
|
|
401
407
|
Groups => { 2 => 'Time' },
|
|
@@ -437,6 +443,7 @@ my %convFloat2 = (
|
|
|
437
443
|
Name => 'FrameInfo',
|
|
438
444
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
439
445
|
},
|
|
446
|
+
'dvtm_wm265e_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
440
447
|
# dvtm_wm265e_3-2-1-4 - model code?
|
|
441
448
|
'dvtm_wm265e_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
|
442
449
|
'dvtm_wm265e_3-2-3-1' => {
|
|
@@ -469,6 +476,7 @@ my %convFloat2 = (
|
|
|
469
476
|
Name => 'FrameInfo',
|
|
470
477
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
471
478
|
},
|
|
479
|
+
'dvtm_pm320_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
472
480
|
'dvtm_pm320_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
|
473
481
|
'dvtm_pm320_3-2-3-1' => {
|
|
474
482
|
Name => 'ShutterSpeed',
|
|
@@ -504,6 +512,7 @@ my %convFloat2 = (
|
|
|
504
512
|
Name => 'FrameInfo',
|
|
505
513
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
506
514
|
},
|
|
515
|
+
'dvtm_Mini4_Pro_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
507
516
|
'dvtm_Mini4_Pro_3-2-7-1' => { Name => 'ISO', Format => 'float' },
|
|
508
517
|
'dvtm_Mini4_Pro_3-2-10-1' => {
|
|
509
518
|
Name => 'ShutterSpeed',
|
|
@@ -546,7 +555,7 @@ my %convFloat2 = (
|
|
|
546
555
|
Name => 'FrameInfo',
|
|
547
556
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
548
557
|
},
|
|
549
|
-
|
|
558
|
+
'dvtm_dji_neo_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
550
559
|
'dvtm_dji_neo_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
|
|
551
560
|
Name => 'TimeStamp',
|
|
552
561
|
Groups => { 2 => 'Time' },
|
|
@@ -586,6 +595,7 @@ my %convFloat2 = (
|
|
|
586
595
|
Name => 'FrameInfo',
|
|
587
596
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
588
597
|
},
|
|
598
|
+
'dvtm_Air3_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' }, # (NC)
|
|
589
599
|
'dvtm_Air3_3-1-2' => {
|
|
590
600
|
Name => 'TimeStamp',
|
|
591
601
|
Groups => { 2 => 'Time' },
|
|
@@ -626,6 +636,7 @@ my %convFloat2 = (
|
|
|
626
636
|
Name => 'FrameInfo',
|
|
627
637
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
628
638
|
},
|
|
639
|
+
'dvtm_Air3s_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' }, # (NC)
|
|
629
640
|
'dvtm_Air3s_3-1-2' => {
|
|
630
641
|
Name => 'TimeStamp',
|
|
631
642
|
Groups => { 2 => 'Time' },
|
|
@@ -659,10 +670,11 @@ my %convFloat2 = (
|
|
|
659
670
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
|
660
671
|
},
|
|
661
672
|
#
|
|
662
|
-
# Osmo 360 (similar to Action 4/5)
|
|
673
|
+
# Osmo 360 (similar to Action 4/5/6)
|
|
663
674
|
#
|
|
664
675
|
'dvtm_oq101_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo 360' },
|
|
665
676
|
'dvtm_oq101_1-1-10' => 'Model',
|
|
677
|
+
'dvtm_oq101_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
666
678
|
'dvtm_oq101_3-1-2' => {
|
|
667
679
|
Name => 'TimeStamp',
|
|
668
680
|
Groups => { 2 => 'Time' },
|
|
@@ -706,6 +718,7 @@ my %convFloat2 = (
|
|
|
706
718
|
Name => 'FrameInfo',
|
|
707
719
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
708
720
|
},
|
|
721
|
+
'dvtm_PP-101_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
709
722
|
'dvtm_PP-101_3-1-2' => {
|
|
710
723
|
Name => 'TimeStamp',
|
|
711
724
|
Groups => { 2 => 'Time' },
|
|
@@ -728,6 +741,7 @@ my %convFloat2 = (
|
|
|
728
741
|
Name => 'FrameInfo',
|
|
729
742
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
730
743
|
},
|
|
744
|
+
'dvtm_wa345e_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
731
745
|
'dvtm_wa345e_3-1-2' => {
|
|
732
746
|
Name => 'TimeStamp',
|
|
733
747
|
Groups => { 2 => 'Time' },
|
|
@@ -765,6 +779,7 @@ my %convFloat2 = (
|
|
|
765
779
|
Name => 'FrameInfo',
|
|
766
780
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
767
781
|
},
|
|
782
|
+
'dvtm_wm261_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
768
783
|
'dvtm_wm261_3-1-2' => {
|
|
769
784
|
Name => 'TimeStamp',
|
|
770
785
|
Groups => { 2 => 'Time' },
|
|
@@ -815,6 +830,7 @@ my %convFloat2 = (
|
|
|
815
830
|
Name => 'FrameInfo',
|
|
816
831
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
|
817
832
|
},
|
|
833
|
+
'dvtm_Mavic4_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' },
|
|
818
834
|
'dvtm_Mavic4_3-1-2' => {
|
|
819
835
|
Name => 'TimeStamp',
|
|
820
836
|
Groups => { 2 => 'Time' },
|
|
@@ -849,6 +865,7 @@ my %convFloat2 = (
|
|
|
849
865
|
#
|
|
850
866
|
'dvtm_Mini5Pro_1-1-5' => { Name => 'SerialNumber', Notes => 'Mini 5 Pro' }, # (NC)
|
|
851
867
|
'dvtm_Mini5Pro_1-1-10' => 'Model', # (NC)
|
|
868
|
+
'dvtm_Mini5Pro_3-1-1' => { Name => 'FrameNumber', Format => 'unsigned' }, # (NC)
|
|
852
869
|
'dvtm_Mini5Pro_3-2-37-1' => { Name => 'Temperature', Format => 'float' }, # (NC)
|
|
853
870
|
'dvtm_Mini5Pro_3-3-4-1' => {
|
|
854
871
|
Name => 'GPSInfo',
|
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
58
58
|
use Image::ExifTool::MakerNotes;
|
|
59
59
|
|
|
60
|
-
$VERSION = '4.
|
|
60
|
+
$VERSION = '4.65';
|
|
61
61
|
|
|
62
62
|
sub ProcessExif($$$);
|
|
63
63
|
sub WriteExif($$$);
|
|
@@ -5170,8 +5170,8 @@ my %subSecConv = (
|
|
|
5170
5170
|
0 => 'EXIF:DateTimeOriginal',
|
|
5171
5171
|
},
|
|
5172
5172
|
Desire => {
|
|
5173
|
-
1 => 'SubSecTimeOriginal',
|
|
5174
|
-
2 => 'OffsetTimeOriginal',
|
|
5173
|
+
1 => 'EXIF:SubSecTimeOriginal',
|
|
5174
|
+
2 => 'EXIF:OffsetTimeOriginal',
|
|
5175
5175
|
},
|
|
5176
5176
|
WriteAlso => {
|
|
5177
5177
|
'EXIF:DateTimeOriginal' => '($val and $val=~/^(\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2})/) ? $1 : undef',
|
|
@@ -5189,8 +5189,8 @@ my %subSecConv = (
|
|
|
5189
5189
|
0 => 'EXIF:CreateDate',
|
|
5190
5190
|
},
|
|
5191
5191
|
Desire => {
|
|
5192
|
-
1 => 'SubSecTimeDigitized',
|
|
5193
|
-
2 => 'OffsetTimeDigitized',
|
|
5192
|
+
1 => 'EXIF:SubSecTimeDigitized',
|
|
5193
|
+
2 => 'EXIF:OffsetTimeDigitized',
|
|
5194
5194
|
},
|
|
5195
5195
|
WriteAlso => {
|
|
5196
5196
|
'EXIF:CreateDate' => '($val and $val=~/^(\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2})/) ? $1 : undef',
|
|
@@ -5208,8 +5208,8 @@ my %subSecConv = (
|
|
|
5208
5208
|
0 => 'EXIF:ModifyDate',
|
|
5209
5209
|
},
|
|
5210
5210
|
Desire => {
|
|
5211
|
-
1 => 'SubSecTime',
|
|
5212
|
-
2 => 'OffsetTime',
|
|
5211
|
+
1 => 'EXIF:SubSecTime',
|
|
5212
|
+
2 => 'EXIF:OffsetTime',
|
|
5213
5213
|
},
|
|
5214
5214
|
WriteAlso => {
|
|
5215
5215
|
'EXIF:ModifyDate' => '($val and $val=~/^(\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2})/) ? $1 : undef',
|
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
32
32
|
use Image::ExifTool::Exif;
|
|
33
33
|
|
|
34
|
-
$VERSION = '2.
|
|
34
|
+
$VERSION = '2.02';
|
|
35
35
|
|
|
36
36
|
sub ProcessFujiDir($$$);
|
|
37
37
|
sub ProcessFaceRec($$$);
|
|
@@ -1373,37 +1373,37 @@ my %faceCategories = (
|
|
|
1373
1373
|
Count => 4, # (ignore the duplicate values)
|
|
1374
1374
|
},
|
|
1375
1375
|
0x2100 => { #IB
|
|
1376
|
-
Name => 'WB_GRGBLevelsDaylight',
|
|
1376
|
+
Name => 'WB_GRGBLevelsDaylight', # (EXIF Fine Weather)
|
|
1377
1377
|
Format => 'int16u',
|
|
1378
1378
|
Count => 4,
|
|
1379
1379
|
},
|
|
1380
1380
|
0x2200 => { #IB
|
|
1381
|
-
Name => 'WB_GRGBLevelsCloudy',
|
|
1381
|
+
Name => 'WB_GRGBLevelsCloudy', # (EXIF Shade)
|
|
1382
1382
|
Format => 'int16u',
|
|
1383
1383
|
Count => 4,
|
|
1384
1384
|
},
|
|
1385
1385
|
0x2300 => { #IB
|
|
1386
|
-
Name => 'WB_GRGBLevelsDaylightFluor',
|
|
1386
|
+
Name => 'WB_GRGBLevelsDaylightFluor', # (EXIF FL_D)
|
|
1387
1387
|
Format => 'int16u',
|
|
1388
1388
|
Count => 4,
|
|
1389
1389
|
},
|
|
1390
1390
|
0x2301 => { #IB
|
|
1391
|
-
Name => 'WB_GRGBLevelsDayWhiteFluor',
|
|
1391
|
+
Name => 'WB_GRGBLevelsDayWhiteFluor', # (EXIF FL_N)
|
|
1392
1392
|
Format => 'int16u',
|
|
1393
1393
|
Count => 4,
|
|
1394
1394
|
},
|
|
1395
1395
|
0x2302 => { #IB
|
|
1396
|
-
Name => 'WB_GRGBLevelsWhiteFluorescent',
|
|
1396
|
+
Name => 'WB_GRGBLevelsWhiteFluorescent', # (EXIF FL_W)
|
|
1397
1397
|
Format => 'int16u',
|
|
1398
1398
|
Count => 4,
|
|
1399
1399
|
},
|
|
1400
1400
|
0x2310 => { #IB
|
|
1401
|
-
Name => 'WB_GRGBLevelsWarmWhiteFluor',
|
|
1401
|
+
Name => 'WB_GRGBLevelsWarmWhiteFluor', # (EXIF FL_WW)
|
|
1402
1402
|
Format => 'int16u',
|
|
1403
1403
|
Count => 4,
|
|
1404
1404
|
},
|
|
1405
1405
|
0x2311 => { #IB
|
|
1406
|
-
Name => 'WB_GRGBLevelsLivingRoomWarmWhiteFluor',
|
|
1406
|
+
Name => 'WB_GRGBLevelsLivingRoomWarmWhiteFluor', # (EXIF FL_L)
|
|
1407
1407
|
Format => 'int16u',
|
|
1408
1408
|
Count => 4,
|
|
1409
1409
|
},
|
|
@@ -1412,9 +1412,14 @@ my %faceCategories = (
|
|
|
1412
1412
|
Format => 'int16u',
|
|
1413
1413
|
Count => 4,
|
|
1414
1414
|
},
|
|
1415
|
+
0x2410 => { #IB
|
|
1416
|
+
Name => 'WB_GRGBLevelsFlash',
|
|
1417
|
+
Format => 'int16u',
|
|
1418
|
+
Count => 4,
|
|
1419
|
+
},
|
|
1415
1420
|
# 0x2f00 => WB_GRGBLevelsCustom: int32u count, then count * (int16u GRGBGRGB), ref IB
|
|
1416
1421
|
0x2ff0 => {
|
|
1417
|
-
Name => 'WB_GRGBLevels',
|
|
1422
|
+
Name => 'WB_GRGBLevels', # (as shot)
|
|
1418
1423
|
Format => 'int16u',
|
|
1419
1424
|
Count => 4,
|
|
1420
1425
|
},
|
|
@@ -12,7 +12,7 @@ require Exporter;
|
|
|
12
12
|
|
|
13
13
|
use vars qw($VERSION @ISA @EXPORT_OK);
|
|
14
14
|
|
|
15
|
-
$VERSION = '1.
|
|
15
|
+
$VERSION = '1.15';
|
|
16
16
|
@ISA = qw(Exporter);
|
|
17
17
|
@EXPORT_OK = qw(ReadCSV ReadJSON);
|
|
18
18
|
|
|
@@ -100,19 +100,22 @@ sub ReadCSV($$;$$)
|
|
|
100
100
|
# terminate at first blank tag name (eg. extra comma at end of line)
|
|
101
101
|
last unless length $_;
|
|
102
102
|
@tags or s/^\xef\xbb\xbf//; # remove UTF-8 BOM if it exists
|
|
103
|
-
/^([-_0-9A-Z]+:)*[-_0-9A-Z]+#?$/i
|
|
103
|
+
unless (/^([-_0-9A-Z]+:)*[-_0-9A-Z]+#?$/i) {
|
|
104
|
+
/\0/ and $err = "Format error in $file (doesn't look like UTF-8)", last;
|
|
105
|
+
$err = "Invalid tag name '${_}' in $file", last;
|
|
106
|
+
}
|
|
104
107
|
push(@tags, $_);
|
|
105
108
|
}
|
|
106
109
|
last if $err;
|
|
107
|
-
@tags or $err =
|
|
110
|
+
@tags or $err = "No tags found in $file", last;
|
|
108
111
|
# fix "SourceFile" case if necessary
|
|
109
112
|
$tags[0] = 'SourceFile' if lc $tags[0] eq 'sourcefile';
|
|
110
113
|
}
|
|
111
114
|
}
|
|
112
115
|
close CSVFILE if $openedFile;
|
|
113
116
|
undef $raf;
|
|
114
|
-
$err =
|
|
115
|
-
return $err
|
|
117
|
+
$err = "No SourceFile column in $file" unless $found or $err;
|
|
118
|
+
return $err || undef;
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
#------------------------------------------------------------------------------
|
|
@@ -248,7 +251,7 @@ sub ReadJSON($$;$$)
|
|
|
248
251
|
{
|
|
249
252
|
local $_;
|
|
250
253
|
my ($file, $database, $missingValue, $chset) = @_;
|
|
251
|
-
my ($raf, $openedFile);
|
|
254
|
+
my ($raf, $openedFile, $buff);
|
|
252
255
|
|
|
253
256
|
# initialize character set for converting "\uHHHH" chars
|
|
254
257
|
$charset = $chset || 'UTF8';
|
|
@@ -260,7 +263,7 @@ sub ReadJSON($$;$$)
|
|
|
260
263
|
$file = 'JSON file';
|
|
261
264
|
} elsif (ref $file eq 'SCALAR') {
|
|
262
265
|
$raf = File::RandomAccess->new($file);
|
|
263
|
-
$file = 'in memory';
|
|
266
|
+
$file = 'JSON in memory';
|
|
264
267
|
} else {
|
|
265
268
|
open JSONFILE, $file or return "Error opening JSON file '${file}'";
|
|
266
269
|
binmode JSONFILE;
|
|
@@ -270,7 +273,13 @@ sub ReadJSON($$;$$)
|
|
|
270
273
|
my $obj = ReadJSONObject($raf);
|
|
271
274
|
close JSONFILE if $openedFile;
|
|
272
275
|
unless (ref $obj eq 'ARRAY') {
|
|
273
|
-
ref $obj eq 'HASH'
|
|
276
|
+
unless (ref $obj eq 'HASH') {
|
|
277
|
+
my $err = "Format error in $file";
|
|
278
|
+
if ($raf->Seek(0,0) and $raf->Read($buff, 64) and $buff =~ /\0/) {
|
|
279
|
+
$err .= " (doesn't look like UTF-8)";
|
|
280
|
+
}
|
|
281
|
+
return $err;
|
|
282
|
+
}
|
|
274
283
|
$obj = [ $obj ];
|
|
275
284
|
}
|
|
276
285
|
my ($info, $found);
|
|
@@ -292,7 +301,7 @@ sub ReadJSON($$;$$)
|
|
|
292
301
|
$$database{$$info{SourceFile}} = $info;
|
|
293
302
|
$found = 1;
|
|
294
303
|
}
|
|
295
|
-
return $found ? undef : "No valid JSON objects in
|
|
304
|
+
return $found ? undef : "No valid JSON objects in $file";
|
|
296
305
|
}
|
|
297
306
|
|
|
298
307
|
|
|
@@ -59,7 +59,7 @@ use Image::ExifTool::Exif;
|
|
|
59
59
|
use Image::ExifTool::GPS;
|
|
60
60
|
use Image::ExifTool::HP;
|
|
61
61
|
|
|
62
|
-
$VERSION = '3.
|
|
62
|
+
$VERSION = '3.63';
|
|
63
63
|
|
|
64
64
|
sub CryptShutterCount($$);
|
|
65
65
|
sub PrintFilter($$$);
|
|
@@ -2743,6 +2743,11 @@ my %binaryDataAttrs = (
|
|
|
2743
2743
|
},
|
|
2744
2744
|
},
|
|
2745
2745
|
},
|
|
2746
|
+
0x009e => { #https://www.dpreview.com/forums/threads/gr-iv-hdf-dng-exif-data.4837151/#post-68693164
|
|
2747
|
+
Name => 'HDF', # (Highlight Diffusion Filter)
|
|
2748
|
+
Writable => 'int8u',
|
|
2749
|
+
PrintConv => { 0 => 'Off', 1 => 'On' },
|
|
2750
|
+
},
|
|
2746
2751
|
0x0200 => { #5
|
|
2747
2752
|
Name => 'BlackPoint',
|
|
2748
2753
|
Writable => 'int16u',
|