exiftool-vendored.pl 12.99.0 → 13.0.1

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.
package/bin/Changes CHANGED
@@ -4,9 +4,28 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 12.76. (Other versions are
7
+ Note: The most recent production release is Version 13.00. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Oct. 29, 2024 - Version 13.00 (production release)
11
+
12
+ - Added support for reading GPS from Autel Evo II drone videos
13
+ - Added a new PhaseOne RawFormat value
14
+ - Updated XMP-exifEX tags, exif2xmp.args and xmp2exif.args according to the
15
+ 2024 EXIF for XMP specification
16
+ - Updated Geolocation databases from current geonames.org files
17
+ - Updated the MIME types for a couple of font formats
18
+ - Enhanced -diff option to work with -ec (C-style escape of special chars)
19
+ - Changed name of EXIF Title tag to ImageTitle to correspond with specifiation
20
+ - Reverted a geotag warning message to remove debugging information that was
21
+ added in version 12.67 and moved this information into a -v3 verbose message
22
+ - Patched Perl bug which gave "Can't spawn" warning in Windows if control-C
23
+ was pressed while displaying the exiftool application help
24
+ - Fixed API StructFormat JSONQ setting to properly quote values in structures
25
+ - Fixed incorrect AudioStreamType for M2TS videos containing a PGS stream
26
+ - Fixed -diff option so "same tags" messages are only shown when -v is added
27
+ (as per the documentation)
28
+
10
29
  Oct. 18, 2024 - Version 12.99
11
30
 
12
31
  - Added -diff option to compare the metadata in two files
@@ -23,8 +42,8 @@ Oct. 18, 2024 - Version 12.99
23
42
  - Structured values returned as HASH references with the Struct option may
24
43
  contain a new "_ordered_keys_" entry used to preserve the order of the
25
44
  entries
26
- - Added the OrderedKeys method to
27
- return the ordered or sorted keys from a returned structure value
45
+ - Added the OrderedKeys method to return the ordered or sorted keys from a
46
+ returned structure value
28
47
 
29
48
  Oct. 8, 2024 - Version 12.98
30
49
 
package/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "12.99"
53
+ "version" : "13.00"
54
54
  }
package/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '12.99'
34
+ version: '13.00'
package/bin/README CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-12.99.tar.gz | tar -xf -
113
- cd Image-ExifTool-12.99
112
+ gzip -dc Image-ExifTool-13.00.tar.gz | tar -xf -
113
+ cd Image-ExifTool-13.00
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
@@ -13,6 +13,7 @@
13
13
  # 2015/01/12 - PH Avoid copying to non-standard namespaces
14
14
  # 2018/05/07 - PH Added support for GPSDestXxxRef tags
15
15
  # 2022/03/31 - PH IPTC Photometadata Mapping Guidelines 2202.1 update
16
+ # 2024/10/24 - PH Additions for the 2024 EXIF for XMP spec
16
17
  #
17
18
  # References: http://www.metadataworkinggroup.org/specs/
18
19
  # https://iptc.org/std/photometadata/documentation/mappingguidelines/
@@ -50,4 +51,7 @@
50
51
  -XMP:GPSDestLatitude < Composite:GPSDestLatitude
51
52
  -XMP:GPSDestLongitude < Composite:GPSDestLongitude
52
53
  -XMP:GPSDateTime < Composite:GPSDateTime
54
+ # new for the 2024 EXIF for XMP specification
55
+ -XMP-exifEX:PhotographicSensitivity < EXIF:ISO
56
+ -XMP-exif:DateTimeDigitized < EXIF:CreateDate
53
57
  # end
@@ -17,6 +17,7 @@
17
17
  # 2022/03/31 - PH IPTC Photometadata Mapping Guidelines 2202.1 update
18
18
  # 2023/01/30 - PH Also write Composite:SubSecDateTimeOriginal from
19
19
  # XMP-exif:DateTimeOriginal
20
+ # 2024/10/24 - PH Additions for the 2024 EXIF for XMP spec
20
21
  #
21
22
  # References: http://www.metadataworkinggroup.org/specs/
22
23
  # https://iptc.org/std/photometadata/documentation/mappingguidelines/
@@ -36,6 +37,9 @@
36
37
  -EXIF:all < XMP-tiff:all
37
38
  -EXIF:ImageDescription < XMP-dc:Description
38
39
  -EXIF:DateTimeOriginal < XMP-photoshop:DateCreated
40
+ # new for the 2024 EXIF for XMP specification
41
+ -EXIF:ISO < XMP-exifEX:PhotographicSensitivity
42
+ -EXIF:CreateDate < XMP-exif:DateTimeDigitized
39
43
  # the following SubSec tags also write/delete the corresponding EXIF
40
44
  # SubSecTime and OffsetTime tags as appropriate
41
45
  -Composite:SubSecDateTimeOriginal < XMP-exif:DateTimeOriginal
package/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.99';
14
+ my $version = '13.00';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -2378,7 +2378,7 @@ sub GetImageInfo($$)
2378
2378
  $done2{$t2} = 1;
2379
2379
  }
2380
2380
  my $str = '';
2381
- ($v > 1 or $same) and $str = " ($same same tag" . ($same==1 ? '' : 's') . ')';
2381
+ $v and ($same or $v > 1) and $str = " ($same same tag" . ($same==1 ? '' : 's') . ')';
2382
2382
  if (not $allGroup) {
2383
2383
  print $fp "---- $g2 ----$str\n" if $g2 and ($str or @diffs);
2384
2384
  } elsif ($str and $g2) {
@@ -2418,12 +2418,12 @@ sub GetImageInfo($$)
2418
2418
  $grp .= ' ' x (15 - length($grp)) if length($grp) < 15 and $outFormat < 2;
2419
2419
  push @diffs, sprintf "< %s %s%s: %s\n", $grp, $name, $pad, Printable($val);
2420
2420
  if (defined $val2) {
2421
- $v < 3 and $grp = ' ' x length($grp), $name = ' ' x $len;
2421
+ $grp = ' ' x length($grp), $name = ' ' x $len if $v < 3;
2422
2422
  push @diffs, sprintf "> %s %s%s: %s\n", $grp, $name, $pad, Printable($val2);
2423
2423
  }
2424
2424
  } else {
2425
2425
  push @diffs, sprintf "< %s%s: %s\n", $name, $pad, Printable($val);
2426
- $v < 3 and $name = ' ' x $len;
2426
+ $name = ' ' x $len if $v < 3;
2427
2427
  push @diffs, sprintf "> %s%s %s\n", $name, $pad, Printable($val2) if defined $val2;
2428
2428
  }
2429
2429
  }
@@ -3638,7 +3638,7 @@ sub FormatJSON($$$;$)
3638
3638
  print $fp $bra;
3639
3639
  foreach (@$val) {
3640
3640
  print $fp ',' if $comma;
3641
- FormatJSON($fp, $_, $ind);
3641
+ FormatJSON($fp, $_, $ind, $quote);
3642
3642
  $comma = 1,
3643
3643
  }
3644
3644
  print $fp $ket,
@@ -3654,7 +3654,7 @@ sub FormatJSON($$$;$)
3654
3654
  if ($showTagID and $_ eq 'id' and $showTagID eq 'H' and $$val{$_} =~ /^\d+\.\d+$/) {
3655
3655
  print $fp qq{"$$val{$_}"};
3656
3656
  } else {
3657
- FormatJSON($fp, $$val{$_}, "$ind ");
3657
+ FormatJSON($fp, $$val{$_}, "$ind ", $quote);
3658
3658
  }
3659
3659
  $comma = 1,
3660
3660
  }
@@ -3820,7 +3820,14 @@ sub Printable($)
3820
3820
  $val = '(Binary data '.length($$val).' bytes)';
3821
3821
  }
3822
3822
  }
3823
- $val =~ tr/\0-\x1f\x7f/./; # translate unprintable characters
3823
+ if ($escapeC) {
3824
+ $val =~ s/([\0-\x1f\\\x7f])/$escC{$1} || sprintf('\x%.2x', ord $1)/eg;
3825
+ } else {
3826
+ # translate unprintable chars in value and remove trailing spaces
3827
+ $val =~ tr/\x01-\x1f\x7f/./;
3828
+ $val =~ s/\x00//g;
3829
+ $val =~ s/\s+$//;
3830
+ }
3824
3831
  return $val;
3825
3832
  }
3826
3833
 
@@ -5130,13 +5137,13 @@ may be used to to indicate any XMP namespace (eg. C<--xmp-all:dabs>).
5130
5137
  Write a new value for the specified tag (eg. C<-comment=wow>), or delete the
5131
5138
  tag if no I<VALUE> is given (eg. C<-comment=>). C<+=> and C<-=> are used to
5132
5139
  add or remove existing entries from a list, or to shift date/time values
5133
- (see L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> and note 6 below
5134
- for more details). C<+=> may also be used to increment numerical values (or
5135
- decrement if I<VALUE> is negative), and C<-=> may be used to conditionally
5136
- delete or replace a tag (see L</WRITING EXAMPLES> for examples). C<^=> is
5137
- used to write an empty string instead of deleting the tag when no I<VALUE>
5138
- is given, but otherwise it is equivalent to C<=>. (Note that the caret must
5139
- be quoted on the Windows command line.)
5140
+ (see L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> and notes 6 and
5141
+ 7 below for more details). C<+=> may also be used to increment numerical
5142
+ values (or decrement if I<VALUE> is negative), and C<-=> may be used to
5143
+ conditionally delete or replace a tag (see L</WRITING EXAMPLES> for
5144
+ examples). C<^=> is used to write an empty string instead of deleting the
5145
+ tag when no I<VALUE> is given, but otherwise it is equivalent to C<=>.
5146
+ (Note that the caret must be quoted on the Windows command line.)
5140
5147
 
5141
5148
  I<TAG> may contain one or more leading family 0, 1, 2 or 7 group names,
5142
5149
  prefixed by optional family numbers, and separated colons. If no group name
@@ -5211,6 +5218,10 @@ tag, overriding any other values previously assigned to the tag on the same
5211
5218
  command line. To shift a date/time value and copy it to another tag in the
5212
5219
  same operation, use the B<-globalTimeShift> option.
5213
5220
 
5221
+ 7) The C<+=> operator may not be used to shift a List-type date/time tag
5222
+ (eg. XMP-dc:Date) because C<+=> is used to add elements to the list.
5223
+ Instead, the B<-globalTimeShift> option should be used.
5224
+
5214
5225
  Special feature: Integer values may be specified in hexadecimal with a
5215
5226
  leading C<0x>, and simple rational values may be specified as fractions.
5216
5227
 
@@ -5834,7 +5845,7 @@ with this command:
5834
5845
 
5835
5846
  produces output like this:
5836
5847
 
5837
- -- Generated by ExifTool 12.99 --
5848
+ -- Generated by ExifTool 13.00 --
5838
5849
  File: a.jpg - 2003:10:31 15:44:19
5839
5850
  (f/5.6, 1/60s, ISO 100)
5840
5851
  File: b.jpg - 2006:05:23 11:57:38
@@ -6683,8 +6694,8 @@ The B<-g> and B<-G> options may be used to organize the output by the
6683
6694
  specified family of groups, with B<-G1> being the default. The B<-a> option
6684
6695
  is implied. Adding B<-v> includes a count of the number of tags that are
6685
6696
  the same in each group. The following text formatting options are valid
6686
- when B<-diff> is used: B<-c>, B<-charset>, B<-d>, B<-E>, B<-L>, B<-lang>,
6687
- B<-n>, B<-s>, B<-sep>, B<-struct> and B<-w>.
6697
+ when B<-diff> is used: B<-c>, B<-charset>, B<-d>, B<-E>, B<-ec>, B<-ex>,
6698
+ B<-L>, B<-lang>, B<-n>, B<-s>, B<-sep>, B<-struct> and B<-w>.
6688
6699
 
6689
6700
  =item B<-geotag> I<TRKFILE>
6690
6701
 
@@ -2931,7 +2931,7 @@ my %opcodeInfo = (
2931
2931
  0xa433 => { Name => 'LensMake', Writable => 'string' }, #24
2932
2932
  0xa434 => { Name => 'LensModel', Writable => 'string' }, #24
2933
2933
  0xa435 => { Name => 'LensSerialNumber', Writable => 'string' }, #24
2934
- 0xa436 => { Name => 'Title', Writable => 'string', Avoid => 1 }, #33
2934
+ 0xa436 => { Name => 'ImageTitle', Writable => 'string' }, #33
2935
2935
  0xa437 => { Name => 'Photographer', Writable => 'string' }, #33
2936
2936
  0xa438 => { Name => 'ImageEditor', Writable => 'string' }, #33
2937
2937
  0xa439 => { Name => 'CameraFirmware', Writable => 'string' }, #33
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:Public);
32
32
  use Image::ExifTool::GPS;
33
33
 
34
- $VERSION = '1.78';
34
+ $VERSION = '1.79';
35
35
 
36
36
  sub JITTER() { return 2 } # maximum time jitter
37
37
 
@@ -1127,8 +1127,9 @@ sub SetGeoValues($$;$)
1127
1127
  $iExt = $i1;
1128
1128
  }
1129
1129
  if (abs($time - $tn) > $geoMaxExtSecs) {
1130
- $err or $err = 'Time is too far from nearest GPS fix'.' '.abs($time-$tn).' > '.$geoMaxExtSecs;
1131
- $et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), "\n") if $verbose > 2;
1130
+ $err or $err = 'Time is too far from nearest GPS fix';
1131
+ $et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), ' (',
1132
+ int(abs $time-$tn), " sec away)\n") if $verbose > 2;
1132
1133
  $fix = { } if $$geotag{DateTimeOnly};
1133
1134
  } else {
1134
1135
  $fix = $$points{$tn};
@@ -32,7 +32,7 @@ use strict;
32
32
  use vars qw($VERSION);
33
33
  use Image::ExifTool qw(:DataAccess :Utils);
34
34
 
35
- $VERSION = '1.25';
35
+ $VERSION = '1.26';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -82,7 +82,7 @@ my %streamType = (
82
82
  0x86 => 'DTS-HD Audio',
83
83
  0x87 => 'E-AC-3 Audio',
84
84
  0x8a => 'DTS Audio',
85
- 0x90 => 'PGS Audio', #https://www.avsforum.com/threads/bass-eq-for-filtered-movies.2995212/page-399
85
+ 0x90 => 'Presentation Graphic Stream (subtitle)', #https://en.wikipedia.org/wiki/Program-specific_information
86
86
  0x91 => 'A52b/AC-3 Audio',
87
87
  0x92 => 'DVD_SPU vls Subtitle',
88
88
  0x94 => 'SDDS Audio',
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
  use Image::ExifTool::Exif;
17
17
 
18
- $VERSION = '1.10';
18
+ $VERSION = '1.11';
19
19
 
20
20
  sub WritePhaseOne($$$);
21
21
  sub ProcessPhaseOne($$$);
@@ -71,6 +71,7 @@ my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' );
71
71
  # >2 = compressed
72
72
  # 5 = non-linear
73
73
  PrintConv => { #PH
74
+ 0 => 'Uncompressed', #https://github.com/darktable-org/darktable/issues/7308
74
75
  1 => 'RAW 1', #? (encrypted)
75
76
  2 => 'RAW 2', #? (encrypted)
76
77
  3 => 'IIQ L', # (now "L14", ref IB)
@@ -591,8 +591,8 @@ my %insvLimit = (
591
591
  GROUPS => { 2 => 'Location' },
592
592
  FIRST_ENTRY => 0,
593
593
  NOTES => q{
594
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
595
- subtitle text in some other videos.
594
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
595
+ and subtitle text in some other videos.
596
596
  },
597
597
  Lat => {
598
598
  Name => 'GPSLatitude',
@@ -619,6 +619,32 @@ my %insvLimit = (
619
619
  PrintConv => '$self->ConvertDateTime($val)',
620
620
  },
621
621
  Text => { Groups => { 2 => 'Other' } },
622
+ # the following tags are extracted from Autel Evo II drone videos
623
+ GPSDateTime => {
624
+ Groups => { 2 => 'Time' },
625
+ Description => 'GPS Date/Time',
626
+ PrintConv => '$self->ConvertDateTime($val)',
627
+ },
628
+ HomeLat => {
629
+ Name => 'GPSHomeLatitude',
630
+ RawConv => '$$self{FoundGPSLatitude} = 1; $val',
631
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
632
+ },
633
+ HomeLon => {
634
+ Name => 'GPSHomeLongitude',
635
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
636
+ },
637
+ ISO => { },
638
+ SHUTTER => {
639
+ Name => 'ExposureTime',
640
+ ValueConv => '1 / $val',
641
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
642
+ },
643
+ 'F-NUM' => {
644
+ Name => 'FNumber',
645
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
646
+ },
647
+ EV => 'ExposureCompensation',
622
648
  );
623
649
 
624
650
  %Image::ExifTool::QuickTime::INSV_MakerNotes = (
@@ -2361,7 +2387,7 @@ sub ParseTag($$$)
2361
2387
  }
2362
2388
 
2363
2389
  #------------------------------------------------------------------------------
2364
- # Process Yuneec 'tx3g' sbtl metadata (ref PH)
2390
+ # Process Yuneec 'tx3g' and Autel sbtl metadata (ref PH)
2365
2391
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2366
2392
  # Returns: 1 on success
2367
2393
  sub Process_tx3g($$$)
@@ -2369,13 +2395,49 @@ sub Process_tx3g($$$)
2369
2395
  my ($et, $dirInfo, $tagTablePtr) = @_;
2370
2396
  my $dataPt = $$dirInfo{DataPt};
2371
2397
  return 0 if length $$dataPt < 2;
2372
- pos($$dataPt) = 2; # skip 2-byte length word
2373
2398
  $et->VerboseDir('tx3g', undef, length($$dataPt)-2);
2374
- $et->HandleTag($tagTablePtr, 'Text', substr($$dataPt, 2));
2375
- if ($$dataPt =~ /^..\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
2399
+ my $text = substr($$dataPt, 2); # remove 2-byte length word
2400
+ $et->HandleTag($tagTablePtr, 'Text', $text);
2401
+ if ($text =~ /^HOME\(/) {
2402
+ # --- sample text from Autel Evo II drone ---
2403
+ # HOME(W: 109.318642, N: 40.769371) 2023-09-12 10:28:07
2404
+ # GPS(W: 109.339287, N: 40.768574, 2371.76m)
2405
+ # HDR ISO:100 SHUTTER:1000 EV:-0.7 F-NUM:1.8
2406
+ # F.PRY (1.0\xc2\xb0, -3.7\xc2\xb0, -59.0\xc2\xb0), G.PRY (-51.1\xc2\xb0, 0.0\xc2\xb0, -58.9\xc2\xb0)
2407
+ my $line;
2408
+ foreach $line (split /\x0a/, $text) {
2409
+ if ($line =~ /^HOME\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+)\)\s*(.*)/) {
2410
+ my ($lon, $lat, $time) = ($2, $4, $5);
2411
+ $lon = -$lon if $1 eq 'W';
2412
+ $lat = -$lat if $3 eq 'S';
2413
+ $time =~ tr/-/:/; # (likely local time zone, but not confirmed)
2414
+ $et->HandleTag($tagTablePtr, GPSDateTime => $time);
2415
+ $et->HandleTag($tagTablePtr, HomeLat => $lat);
2416
+ $et->HandleTag($tagTablePtr, HomeLon => $lon);
2417
+ } elsif ($line =~ /^GPS\(([EW]):\s*(\d+\.\d+),\s*([NS]):\s*(\d+\.\d+),\s*(.*)m/) {
2418
+ my ($lon, $lat, $alt) = ($2, $4, $5);
2419
+ $lon = -$lon if $1 eq 'W';
2420
+ $lat = -$lat if $3 eq 'S';
2421
+ $et->HandleTag($tagTablePtr, Lat => $lat);
2422
+ $et->HandleTag($tagTablePtr, Lon => $lon);
2423
+ $et->HandleTag($tagTablePtr, Alt => $alt);
2424
+ } elsif ($line =~ /^F\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
2425
+ $et->HandleTag($tagTablePtr, Yaw => $1);
2426
+ $et->HandleTag($tagTablePtr, Pitch => $2);
2427
+ $et->HandleTag($tagTablePtr, Roll => $3);
2428
+ if ($line =~ /G\.PRY\s*\((-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0,\s*(-?[\d.]+)\xc2\xb0/) {
2429
+ $et->HandleTag($tagTablePtr, GimYaw => $1);
2430
+ $et->HandleTag($tagTablePtr, GimPitch => $2);
2431
+ $et->HandleTag($tagTablePtr, GimRoll => $3);
2432
+ }
2433
+ } else {
2434
+ $et->HandleTag($tagTablePtr, $1, $2) while $line =~ /([-\w]+):([^:]*[^:\s])(\s|$)/sg;
2435
+ }
2436
+ }
2437
+ } elsif ($text =~ /^\w{3} (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2}) ?([-+])(\d{2}):?(\d{2})$/s) {
2376
2438
  $et->HandleTag($tagTablePtr, 'DateTime', "$1:$2:$3 $4$5$6:$7");
2377
2439
  } else {
2378
- $et->HandleTag($tagTablePtr, $1, $2) while $$dataPt =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
2440
+ $et->HandleTag($tagTablePtr, $1, $2) while $text =~ /(\w+):([^:]*[^:\s])(\s|$)/sg;
2379
2441
  }
2380
2442
  return 1;
2381
2443
  }
@@ -1349,7 +1349,7 @@ my %tagLookup = (
1349
1349
  'camerae-mountversion' => { 490 => 0xb },
1350
1350
  'cameraelevationangle' => { 124 => 0x9405, 524 => 'CameraElevationAngle' },
1351
1351
  'camerafilename' => { 507 => 'CameraFilename' },
1352
- 'camerafirmware' => { 124 => 0xa439 },
1352
+ 'camerafirmware' => { 124 => 0xa439, 524 => 'CameraFirmware' },
1353
1353
  'cameraid' => { 333 => 0x209, 413 => 'cmid', 429 => 0x209 },
1354
1354
  'cameraidentifier' => { 407 => 'camera.identifier' },
1355
1355
  'cameraimage' => { 495 => [\'Cameras','CamerasCameraImage'] },
@@ -3728,8 +3728,8 @@ my %tagLookup = (
3728
3728
  'imagedustoff' => { 300 => 0xfe443a45 },
3729
3729
  'imageeditcount' => { 388 => 0x41 },
3730
3730
  'imageediting' => { 388 => 0x32 },
3731
- 'imageeditingsoftware' => { 124 => 0xa43b },
3732
- 'imageeditor' => { 124 => 0xa438 },
3731
+ 'imageeditingsoftware' => { 124 => 0xa43b, 524 => 'ImageEditingSoftware' },
3732
+ 'imageeditor' => { 124 => 0xa438, 524 => 'ImageEditor' },
3733
3733
  'imageeffects' => { 420 => 0x1010 },
3734
3734
  'imagefileconstraints' => { 338 => 'ImageFileConstraints' },
3735
3735
  'imagefileformatasdelivered' => { 338 => 'ImageFileFormatAsDelivered' },
@@ -3805,9 +3805,10 @@ my %tagLookup = (
3805
3805
  'imagesuppliername' => { 338 => [\'ImageSupplier','ImageSupplierImageSupplierName'] },
3806
3806
  'imagetemperaturemax' => { 126 => 0x1 },
3807
3807
  'imagetemperaturemin' => { 126 => 0x2 },
3808
+ 'imagetitle' => { 124 => 0xa436, 524 => 'ImageTitle' },
3808
3809
  'imagetone' => { 388 => 0x4f },
3809
3810
  'imagetype' => { 136 => 0x82, 338 => 'ImageType' },
3810
- 'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID' },
3811
+ 'imageuniqueid' => { 1 => 0x15, 68 => 0x28, 124 => 0xa420, 522 => 'ImageUniqueID', 523 => 'ImageUniqueID', 524 => 'ImageUniqueID' },
3811
3812
  'imagewidth' => { 124 => 0x100, 193 => 0xe, 397 => 0x10c, 502 => 'ImageWidth', 542 => 'ImageWidth' },
3812
3813
  'inclinationangle' => { 491 => 0x900f },
3813
3814
  'inclinationcorrection' => { 491 => 0x900e },
@@ -4796,7 +4797,7 @@ my %tagLookup = (
4796
4797
  'metadataauthorityidentifier' => { 531 => [\'metadataAuthority','metadataAuthorityIdentifier'] },
4797
4798
  'metadataauthorityname' => { 531 => [\'metadataAuthority','metadataAuthorityName'] },
4798
4799
  'metadatadate' => { 544 => 'MetadataDate' },
4799
- 'metadataeditingsoftware' => { 124 => 0xa43c },
4800
+ 'metadataeditingsoftware' => { 124 => 0xa43c, 524 => 'MetadataEditingSoftware' },
4800
4801
  'metadatalastedited' => { 531 => 'metadataLastEdited' },
4801
4802
  'metadatalasteditor' => { 531 => 'metadataLastEditor' },
4802
4803
  'metadatalasteditoridentifier' => { 531 => [\'metadataLastEditor','metadataLastEditorIdentifier'] },
@@ -5599,7 +5600,7 @@ my %tagLookup = (
5599
5600
  'photoeffectsgreen' => { 302 => 0x6 },
5600
5601
  'photoeffectsred' => { 302 => 0x4 },
5601
5602
  'photoeffectstype' => { 302 => 0x0 },
5602
- 'photographer' => { 124 => 0xa437 },
5603
+ 'photographer' => { 124 => 0xa437, 524 => 'Photographer' },
5603
5604
  'photographicsensitivity' => { 524 => 'PhotographicSensitivity' },
5604
5605
  'photoidentifier' => { 1 => 0x2b },
5605
5606
  'photoinfoplayback' => { 307 => '17.6', 316 => '33.6' },
@@ -5946,7 +5947,7 @@ my %tagLookup = (
5946
5947
  'rawdevcolorspace' => { 334 => 0x108, 335 => 0x109 },
5947
5948
  'rawdevcontrastvalue' => { 334 => 0x106, 335 => 0x105 },
5948
5949
  'rawdeveditstatus' => { 334 => 0x10b },
5949
- 'rawdevelopingsoftware' => { 124 => 0xa43a },
5950
+ 'rawdevelopingsoftware' => { 124 => 0xa43a, 524 => 'RAWDevelopingSoftware' },
5950
5951
  'rawdevelopmentprocess' => { 388 => 0x62 },
5951
5952
  'rawdevengine' => { 334 => 0x109, 335 => 0x10b },
5952
5953
  'rawdevexposurebiasvalue' => { 334 => 0x100, 335 => 0x100 },
@@ -6940,7 +6941,7 @@ my %tagLookup = (
6940
6941
  'timezoneinfo' => { 105 => 0x2 },
6941
6942
  'timezoneoffset' => { 124 => 0x882a },
6942
6943
  'tint' => { 407 => 'player.movie.visual.tint', 517 => 'Tint', 519 => 'Tint' },
6943
- 'title' => { 124 => 0xa436, 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
6944
+ 'title' => { 162 => 'Title', 337 => 'Title', 341 => 'Title', 352 => 0x65, 404 => 'Title', 405 => ['titl',"\xa9nam"], 407 => 'title', 413 => ['titl',"\xa9nam"], 520 => 'title', 533 => 'Title', 544 => 'Title' },
6944
6945
  'togglestyleamount' => { 517 => 'ToggleStyleAmount', 519 => 'ToggleStyleAmount' },
6945
6946
  'togglestyledigest' => { 517 => 'ToggleStyleDigest', 519 => 'ToggleStyleDigest' },
6946
6947
  'tonecomp' => { 241 => 0x81 },
@@ -9742,6 +9743,8 @@ my %tagExists = (
9742
9743
  'gpsframingaltitude' => 1,
9743
9744
  'gpsframinglatitude' => 1,
9744
9745
  'gpsframinglongitude' => 1,
9746
+ 'gpshomelatitude' => 1,
9747
+ 'gpshomelongitude' => 1,
9745
9748
  'gpshorizontalaccuracy' => 1,
9746
9749
  'gpsinfo' => 1,
9747
9750
  'gpslatitude2' => 1,
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 28150 tags, with 17488 unique tag names.
15
+ They contain a total of 28165 tags, with 17491 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -871,7 +871,7 @@ for the official EXIF 2.32 specification.
871
871
  0xa433 LensMake ExifIFD string
872
872
  0xa434 LensModel ExifIFD string
873
873
  0xa435 LensSerialNumber ExifIFD string
874
- 0xa436 Title ExifIFD string/
874
+ 0xa436 ImageTitle ExifIFD string
875
875
  0xa437 Photographer ExifIFD string
876
876
  0xa438 ImageEditor ExifIFD string
877
877
  0xa439 CameraFirmware ExifIFD string
@@ -4605,7 +4605,7 @@ These tags belong to the ExifTool XMP-exif family 1 group.
4605
4605
  GPSTrack rational
4606
4606
  GPSTrackRef string
4607
4607
  GPSVersionID string
4608
- ImageUniqueID string
4608
+ ImageUniqueID string/
4609
4609
  ISO integer+
4610
4610
  LightSource string
4611
4611
  MakerNote string
@@ -4686,6 +4686,7 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4686
4686
  Acceleration rational
4687
4687
  SerialNumber string
4688
4688
  CameraElevationAngle rational
4689
+ CameraFirmware string
4689
4690
  OwnerName string
4690
4691
  CompositeImage integer
4691
4692
  CompositeImageCount integer+
@@ -4702,6 +4703,10 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4702
4703
  CompImageValues rational_+
4703
4704
  Gamma rational
4704
4705
  Humidity rational
4706
+ ImageEditingSoftware string
4707
+ ImageEditor string
4708
+ ImageTitle string
4709
+ ImageUniqueID string
4705
4710
  InteropIndex string
4706
4711
  ISOSpeed integer
4707
4712
  ISOSpeedLatitudeyyy integer
@@ -4710,8 +4715,11 @@ These tags belong to the ExifTool XMP-exifEX family 1 group.
4710
4715
  LensModel string
4711
4716
  LensSerialNumber string
4712
4717
  LensInfo rational+
4718
+ MetadataEditingSoftware string
4719
+ Photographer string
4713
4720
  PhotographicSensitivity integer
4714
4721
  Pressure rational
4722
+ RAWDevelopingSoftware string
4715
4723
  RecommendedExposureIndex integer
4716
4724
  SensitivityType integer
4717
4725
  StandardOutputSensitivity integer
@@ -30187,22 +30195,29 @@ changed via the config file.
30187
30195
 
30188
30196
  =head3 QuickTime tx3g Tags
30189
30197
 
30190
- Tags extracted from the tx3g sbtl timed metadata of Yuneec drones, and
30191
- subtitle text in some other videos.
30198
+ Tags extracted from the tx3g sbtl timed metadata of Yuneec and Autel drones,
30199
+ and subtitle text in some other videos.
30192
30200
 
30193
- Tag ID Tag Name Writable
30194
- ------ -------- --------
30195
- 'Alt' GPSAltitude no
30196
- 'DateTime' DateTime no
30197
- 'GimPitch' GimbalPitch no
30198
- 'GimRoll' GimbalRoll no
30199
- 'GimYaw' GimbalYaw no
30200
- 'Lat' GPSLatitude no
30201
- 'Lon' GPSLongitude no
30202
- 'Pitch' Pitch no
30203
- 'Roll' Roll no
30204
- 'Text' Text no
30205
- 'Yaw' Yaw no
30201
+ Tag ID Tag Name Writable
30202
+ ------ -------- --------
30203
+ 'Alt' GPSAltitude no
30204
+ 'DateTime' DateTime no
30205
+ 'EV' ExposureCompensation no
30206
+ 'F-NUM' FNumber no
30207
+ 'GPSDateTime' GPSDateTime no
30208
+ 'GimPitch' GimbalPitch no
30209
+ 'GimRoll' GimbalRoll no
30210
+ 'GimYaw' GimbalYaw no
30211
+ 'HomeLat' GPSHomeLatitude no
30212
+ 'HomeLon' GPSHomeLongitude no
30213
+ 'ISO' ISO no
30214
+ 'Lat' GPSLatitude no
30215
+ 'Lon' GPSLongitude no
30216
+ 'Pitch' Pitch no
30217
+ 'Roll' Roll no
30218
+ 'SHUTTER' ExposureTime no
30219
+ 'Text' Text no
30220
+ 'Yaw' Yaw no
30206
30221
 
30207
30222
  =head3 QuickTime HTCInfo Tags
30208
30223
 
@@ -2016,6 +2016,7 @@ my %sPantryItem = (
2016
2016
  Writable => 'integer',
2017
2017
  List => 'Seq',
2018
2018
  AutoSplit => 1,
2019
+ Notes => 'deprecated',
2019
2020
  },
2020
2021
  OECF => {
2021
2022
  Name => 'Opto-ElectricConvFactor',
@@ -2267,7 +2268,7 @@ my %sPantryItem = (
2267
2268
  3 => 'Distant',
2268
2269
  },
2269
2270
  },
2270
- ImageUniqueID => { },
2271
+ ImageUniqueID => { Avoid => 1, Notes => 'moved to exifEX namespace in 2024 spec' },
2271
2272
  GPSVersionID => { Groups => { 2 => 'Location' } },
2272
2273
  GPSLatitude => { Groups => { 2 => 'Location' }, %latConv },
2273
2274
  GPSLongitude => { Groups => { 2 => 'Location' }, %longConv },
@@ -2509,6 +2510,15 @@ my %sPantryItem = (
2509
2510
  Values => { List => 'Seq', Writable => 'rational' },
2510
2511
  },
2511
2512
  },
2513
+ # new in Exif 3.0
2514
+ ImageUniqueID => { },
2515
+ ImageTitle => { },
2516
+ ImageEditor => { },
2517
+ Photographer => { Groups => { 2 => 'Author' } },
2518
+ CameraFirmware => { Groups => { 2 => 'Camera' } },
2519
+ RAWDevelopingSoftware => { },
2520
+ ImageEditingSoftware => { },
2521
+ MetadataEditingSoftware => { },
2512
2522
  );
2513
2523
 
2514
2524
  # Auxiliary namespace properties (aux) - not fully documented (ref PH)
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
30
30
  %static_vars $advFmtSelf);
31
31
 
32
- $VERSION = '12.99';
32
+ $VERSION = '13.00';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -740,7 +740,7 @@ my %fileDescription = (
740
740
  OGV => 'video/ogg',
741
741
  ONP => 'application/on1',
742
742
  ORF => 'image/x-olympus-orf',
743
- OTF => 'application/x-font-otf',
743
+ OTF => 'application/font-otf',
744
744
  PAGES=> 'application/x-iwork-pages-sffpages',
745
745
  PBM => 'image/x-portable-bitmap',
746
746
  PCD => 'image/x-photo-cd',
@@ -798,8 +798,8 @@ my %fileDescription = (
798
798
  THMX => 'application/vnd.ms-officetheme',
799
799
  TIFF => 'image/tiff',
800
800
  Torrent => 'application/x-bittorrent',
801
- TTC => 'application/x-font-ttf',
802
- TTF => 'application/x-font-ttf',
801
+ TTC => 'application/font-ttf',
802
+ TTF => 'application/font-ttf',
803
803
  TXT => 'text/plain',
804
804
  VCard=> 'text/vcard',
805
805
  VRD => 'application/octet-stream', #PH (NC)
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.99
3
+ Version: 13.00
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -312,8 +312,8 @@ OPTIONS
312
312
  Write a new value for the specified tag (eg. "-comment=wow"), or
313
313
  delete the tag if no *VALUE* is given (eg. "-comment="). "+=" and
314
314
  "-=" are used to add or remove existing entries from a list, or to
315
- shift date/time values (see Image::ExifTool::Shift.pl and note 6
316
- below for more details). "+=" may also be used to increment
315
+ shift date/time values (see Image::ExifTool::Shift.pl and notes 6
316
+ and 7 below for more details). "+=" may also be used to increment
317
317
  numerical values (or decrement if *VALUE* is negative), and "-="
318
318
  may be used to conditionally delete or replace a tag (see "WRITING
319
319
  EXAMPLES" for examples). "^=" is used to write an empty string
@@ -399,6 +399,10 @@ OPTIONS
399
399
  copy it to another tag in the same operation, use the
400
400
  -globalTimeShift option.
401
401
 
402
+ 7) The "+=" operator may not be used to shift a List-type date/time
403
+ tag (eg. XMP-dc:Date) because "+=" is used to add elements to the
404
+ list. Instead, the -globalTimeShift option should be used.
405
+
402
406
  Special feature: Integer values may be specified in hexadecimal
403
407
  with a leading "0x", and simple rational values may be specified as
404
408
  fractions.
@@ -1035,7 +1039,7 @@ OPTIONS
1035
1039
 
1036
1040
  produces output like this:
1037
1041
 
1038
- -- Generated by ExifTool 12.99 --
1042
+ -- Generated by ExifTool 13.00 --
1039
1043
  File: a.jpg - 2003:10:31 15:44:19
1040
1044
  (f/5.6, 1/60s, ISO 100)
1041
1045
  File: b.jpg - 2006:05:23 11:57:38
@@ -1879,8 +1883,8 @@ OPTIONS
1879
1883
  specified family of groups, with -G1 being the default. The -a
1880
1884
  option is implied. Adding -v includes a count of the number of tags
1881
1885
  that are the same in each group. The following text formatting
1882
- options are valid when -diff is used: -c, -charset, -d, -E, -L,
1883
- -lang, -n, -s, -sep, -struct and -w.
1886
+ options are valid when -diff is used: -c, -charset, -d, -E, -ec,
1887
+ -ex, -L, -lang, -n, -s, -sep, -struct and -w.
1884
1888
 
1885
1889
  -geotag *TRKFILE*
1886
1890
  Geotag images from the specified GPS track log file. Using the
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "exiftool-vendored.pl",
3
- "version": "12.99.0",
3
+ "version": "13.0.1",
4
4
  "description": "Vendored perl ExifTool for Node.js",
5
5
  "main": "./index.js",
6
- "homepage": "https://github.com/mceachen/exiftool-vendored.pl#readme",
6
+ "homepage": "https://github.com/photostructure/exiftool-vendored.pl#readme",
7
7
  "bugs": {
8
- "url": "https://github.com/mceachen/exiftool-vendored/issues"
8
+ "url": "https://github.com/photostructure/exiftool-vendored/issues"
9
9
  },
10
10
  "repository": {
11
11
  "type": "git",
12
- "url": "https://github.com/mceachen/exiftool-vendored.pl.git"
12
+ "url": "git@github.com:photostructure/exiftool-vendored.pl.git"
13
13
  },
14
14
  "os": [
15
15
  "!win32"
@@ -41,8 +41,8 @@
41
41
  }
42
42
  },
43
43
  "devDependencies": {
44
- "mocha": "^10.7.3",
45
- "npm-check-updates": "^17.1.4",
44
+ "mocha": "^10.8.0",
45
+ "npm-check-updates": "^17.1.9",
46
46
  "prettier": "^3.3.3"
47
47
  }
48
48
  }