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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80eb52ce82e2830a23dcaaa3b12c1a6a1629b2ac95475c6c96f21b2d1313cf67
4
- data.tar.gz: 5bdf2a271cc97053b66c1b836d3268ab0229ab568e20df3f6b5b35da3124c6f3
3
+ metadata.gz: 9ce05a515790dd95ab7268976c98a631cd914f89751e06325c85c4d5621295bc
4
+ data.tar.gz: d944c0936aea71dd27276c9591ac5e2568070f8a2088df644e8a019a42b98467
5
5
  SHA512:
6
- metadata.gz: 5e11b14441c11c34b7d667af8a60d26314d3ae9281294a6b345f5a383ac5037cc96684f840a1d7f75e9ab21ca24b6c7355a79ff1e192d084fedfe13d65aee900
7
- data.tar.gz: bced11b21e11fbb5ccd250a6ebd5f58c3e00699b5e289a3e772c137ae0b7b26227e2495f71d9b8e6bd98216b1301c49184d2cd8042273060c444940f6ebcc95b
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, thanks Tay Kiat Loong)
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
@@ -29,6 +29,7 @@ config_files/gps2utm.config
29
29
  config_files/guano.config
30
30
  config_files/local_time.config
31
31
  config_files/nksc.config
32
+ config_files/novelty.config
32
33
  config_files/onone.config
33
34
  config_files/photoshop_paths.config
34
35
  config_files/picasa_faces.config
data/bin/META.json CHANGED
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.58",
53
+ "version" : "13.59",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
data/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.58'
34
+ version: '13.59'
35
35
  x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
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.58.tar.gz | tar -xf -
115
- cd Image-ExifTool-13.58
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.58';
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
- } else {
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.58 --
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 represents the value of the
6461
- OriginalRawFileName or OriginalFileName tag from the input file (including
6462
- extension). The %g code may be followed by a single digit to specify the
6463
- group family number (eg. %g1), otherwise family 0 is assumed. The substring
6464
- width/position/case specifiers may be used with these format codes in
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 45mm F1.2 STM', #42
650
- '61182.67' => 'Canon RF 7-14mm F2.8-3.5 L FISHEYE STM', #42
651
- '61182.68' => 'Canon RF 14mm F1.4 L VCM', #42
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.18';
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
- # dvtm_AVATA2_3-1-1 - frame number (starting at 1)
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
- # dvtm_dji_neo_3-1-1 - frame number (starting at 1)
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.64';
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.01';
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.14';
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 or $err = "Invalid tag name '${_}'", last;
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 = 'No tags found', last;
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 = 'No SourceFile column' unless $found or $err;
115
- return $err ? "$err in $file" : undef;
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' or return "Format error in JSON file '${file}'";
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 '${file}'";
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';
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',