exiftool_vendored 12.93.0 → 12.96.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 27899 tags, with 17464 unique tag names.
15
+ They contain a total of 27985 tags, with 17475 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
@@ -9331,6 +9331,7 @@ Unknown only to reduce the volume of the normal output.
9331
9331
  ColorData9 Canon ColorData9
9332
9332
  ColorData10 Canon ColorData10
9333
9333
  ColorData11 Canon ColorData11
9334
+ ColorData12 Canon ColorData12
9334
9335
  ColorDataUnknown Canon ColorDataUnknown
9335
9336
  0x4002 CRWParam? no
9336
9337
  0x4003 ColorInfo Canon ColorInfo
@@ -11437,6 +11438,97 @@ These tags are used by the EOS R3, R7 and R6mkII
11437
11438
  641 SpecularWhiteLevel int16u
11438
11439
  642 LinearityUpperMargin int16u
11439
11440
 
11441
+ =head3 Canon ColorData12 Tags
11442
+
11443
+ These tags are used by the EOS R1 and R5mkII
11444
+
11445
+ Index2 Tag Name Writable
11446
+ ------ -------- --------
11447
+ 0 ColorDataVersion int16s
11448
+ 105 WB_RGGBLevelsAsShot int16s[4]
11449
+ 109 ColorTempAsShot int16s
11450
+ 110 WB_RGGBLevelsDaylight int16s[4]
11451
+ 114 ColorTempDaylight int16s
11452
+ 115 WB_RGGBLevelsShade int16s[4]
11453
+ 119 ColorTempShade int16s
11454
+ 120 WB_RGGBLevelsCloudy int16s[4]
11455
+ 124 ColorTempCloudy int16s
11456
+ 125 WB_RGGBLevelsTungsten int16s[4]
11457
+ 129 ColorTempTungsten int16s
11458
+ 130 WB_RGGBLevelsFluorescent int16s[4]
11459
+ 134 ColorTempFluorescent int16s
11460
+ 135 WB_RGGBLevelsFlash int16s[4]
11461
+ 139 ColorTempFlash int16s
11462
+ 140 WB_RGGBLevelsUnknown2? int16s[4]
11463
+ 144 ColorTempUnknown2? int16s
11464
+ 145 WB_RGGBLevelsUnknown3? int16s[4]
11465
+ 149 ColorTempUnknown3? int16s
11466
+ 150 WB_RGGBLevelsUnknown4? int16s[4]
11467
+ 154 ColorTempUnknown4? int16s
11468
+ 155 WB_RGGBLevelsUnknown5? int16s[4]
11469
+ 159 ColorTempUnknown5? int16s
11470
+ 160 WB_RGGBLevelsUnknown6? int16s[4]
11471
+ 164 ColorTempUnknown6? int16s
11472
+ 165 WB_RGGBLevelsUnknown7? int16s[4]
11473
+ 169 ColorTempUnknown7? int16s
11474
+ 170 WB_RGGBLevelsUnknown8? int16s[4]
11475
+ 174 ColorTempUnknown8? int16s
11476
+ 175 WB_RGGBLevelsUnknown9? int16s[4]
11477
+ 179 ColorTempUnknown9? int16s
11478
+ 180 WB_RGGBLevelsUnknown10? int16s[4]
11479
+ 184 ColorTempUnknown10? int16s
11480
+ 185 WB_RGGBLevelsUnknown11? int16s[4]
11481
+ 189 ColorTempUnknown11? int16s
11482
+ 190 WB_RGGBLevelsUnknown12? int16s[4]
11483
+ 194 ColorTempUnknown12? int16s
11484
+ 195 WB_RGGBLevelsUnknown13? int16s[4]
11485
+ 199 ColorTempUnknown13? int16s
11486
+ 200 WB_RGGBLevelsUnknown14? int16s[4]
11487
+ 204 ColorTempUnknown14? int16s
11488
+ 205 WB_RGGBLevelsUnknown15? int16s[4]
11489
+ 209 ColorTempUnknown15? int16s
11490
+ 210 WB_RGGBLevelsUnknown16? int16s[4]
11491
+ 214 ColorTempUnknown16? int16s
11492
+ 215 WB_RGGBLevelsUnknown17? int16s[4]
11493
+ 219 ColorTempUnknown17? int16s
11494
+ 220 WB_RGGBLevelsUnknown18? int16s[4]
11495
+ 224 ColorTempUnknown18? int16s
11496
+ 225 WB_RGGBLevelsUnknown19? int16s[4]
11497
+ 229 ColorTempUnknown19? int16s
11498
+ 230 WB_RGGBLevelsUnknown20? int16s[4]
11499
+ 234 ColorTempUnknown20? int16s
11500
+ 235 WB_RGGBLevelsUnknown21? int16s[4]
11501
+ 239 ColorTempUnknown21? int16s
11502
+ 240 WB_RGGBLevelsUnknown22? int16s[4]
11503
+ 244 ColorTempUnknown22? int16s
11504
+ 245 WB_RGGBLevelsUnknown23? int16s[4]
11505
+ 249 ColorTempUnknown23? int16s
11506
+ 250 WB_RGGBLevelsUnknown24? int16s[4]
11507
+ 254 ColorTempUnknown24? int16s
11508
+ 255 WB_RGGBLevelsUnknown25? int16s[4]
11509
+ 259 ColorTempUnknown25? int16s
11510
+ 260 WB_RGGBLevelsUnknown26? int16s[4]
11511
+ 264 ColorTempUnknown26? int16s
11512
+ 265 WB_RGGBLevelsUnknown27? int16s[4]
11513
+ 269 ColorTempUnknown27? int16s
11514
+ 270 WB_RGGBLevelsUnknown28? int16s[4]
11515
+ 274 ColorTempUnknown28? int16s
11516
+ 275 WB_RGGBLevelsUnknown29? int16s[4]
11517
+ 279 ColorTempUnknown29? int16s
11518
+ 280 WB_RGGBLevelsUnknown30? int16s[4]
11519
+ 284 ColorTempUnknown30? int16s
11520
+ 285 WB_RGGBLevelsUnknown31? int16s[4]
11521
+ 289 ColorTempUnknown31? int16s
11522
+ 290 WB_RGGBLevelsUnknown32? int16s[4]
11523
+ 294 ColorTempUnknown32? int16s
11524
+ 295 WB_RGGBLevelsUnknown33? int16s[4]
11525
+ 299 ColorTempUnknown33? int16s
11526
+ 320 ColorCalib? Canon ColorCalib
11527
+ 383 PerChannelBlackLevel int16u[4]
11528
+ 660 NormalWhiteLevel int16u
11529
+ 661 SpecularWhiteLevel int16u
11530
+ 662 LinearityUpperMargin int16u
11531
+
11440
11532
  =head3 Canon ColorDataUnknown Tags
11441
11533
 
11442
11534
  Index2 Tag Name Writable
@@ -29818,16 +29910,18 @@ changed via the config file.
29818
29910
  'artist' Artist yes
29819
29911
  'artwork' Artwork yes
29820
29912
  'author' Author yes
29821
- 'camera.focal_length.35mm_equivalent'
29822
- FocalLengthIn35mmFormat yes
29823
29913
  'camera.framereadouttimeinmicroseconds'
29824
29914
  FrameReadoutTime yes
29825
29915
  'camera.identifier' CameraIdentifier yes
29826
- 'camera.lens_model' LensModel yes
29827
29916
  'collection.user' UserCollection yes
29828
- 'com.android.capture.fps' AndroidCaptureFPS yes
29917
+ 'com.android.capture.fps' AndroidCaptureFPS float
29918
+ 'com.android.manufacturer' AndroidMake yes
29919
+ 'com.android.model' AndroidModel yes
29829
29920
  'com.android.version' AndroidVersion yes
29830
29921
  'com.apple.photos.captureMode' CaptureMode yes
29922
+ 'com.xiaomi.hdr10' XiaomiHDR10 int32s
29923
+ 'com.xiaomi.preview_video_cover'
29924
+ XiaomiPreviewVideoCover int32s
29831
29925
  'comment' Comment yes
29832
29926
  'compatible_brands' CompatibleBrands yes/
29833
29927
  'content.identifier' ContentIdentifier yes
@@ -29887,6 +29981,7 @@ changed via the config file.
29887
29981
  'title' Title yes
29888
29982
  'version' Version yes
29889
29983
  'video-orientation' VideoOrientation no
29984
+ 'xiaomi.exifInfo.videoinfo' XiaomiExifInfo yes
29890
29985
  'year' Year yes
29891
29986
 
29892
29987
  =head3 QuickTime FaceInfo Tags
@@ -39366,6 +39461,7 @@ AFM, ACFM and AMFM font files.
39366
39461
  Tag ID Tag Name Writable
39367
39462
  ------ -------- --------
39368
39463
  'AFM' AFM Font AFM
39464
+ 'C2PA' C2PA Jpeg2000
39369
39465
  'PFM' PFMHeader Font PFM
39370
39466
  'PSInfo' PSFontInfo Font PSInfo
39371
39467
  'fontname' FontName no
@@ -847,7 +847,7 @@ sub WriteQuickTime($$$)
847
847
  $et or return 1; # allow dummy access to autoload this package
848
848
  my ($mdat, @mdat, @mdatEdit, $edit, $track, $outBuff, $co, $term, $delCount);
849
849
  my (%langTags, $canCreate, $delGrp, %boxPos, %didDir, $writeLast, $err, $atomCount);
850
- my ($tag, $lastTag, $errStr);
850
+ my ($tag, $lastTag, $lastPos, $errStr, $trailer, $buf2);
851
851
  my $outfile = $$dirInfo{OutFile} || return 0;
852
852
  my $raf = $$dirInfo{RAF}; # (will be null for lower-level atoms)
853
853
  my $dataPt = $$dirInfo{DataPt}; # (will be null for top-level atoms)
@@ -860,6 +860,16 @@ sub WriteQuickTime($$$)
860
860
  my $createKeys = 0;
861
861
  my ($rtnVal, $rtnErr) = $dataPt ? (undef, undef) : (1, 0);
862
862
 
863
+ # check for Insta360 trailer at top level
864
+ if ($raf) {
865
+ my $pos = $raf->Tell();
866
+ if ($raf->Seek(-40, 2) and $raf->Read($buf2, 40) == 40 and
867
+ substr($buf2, 8) eq '8db42d694ccc418790edff439fe026bf')
868
+ {
869
+ $trailer = [ 'Insta360', $raf->Tell() - unpack('V',$buf2) ];
870
+ }
871
+ $raf->Seek($pos, 0) or return 0;
872
+ }
863
873
  if ($dataPt) {
864
874
  $raf = File::RandomAccess->new($dataPt);
865
875
  } else {
@@ -923,6 +933,12 @@ sub WriteQuickTime($$$)
923
933
  $tag = $lastTag = '';
924
934
 
925
935
  for (;;) { # loop through all atoms at this level
936
+ $lastPos = $raf->Tell();
937
+ # stop processing if we reached a known trailer
938
+ if ($trailer and $lastPos >= $$trailer[1]) {
939
+ $errStr = "Corrupted $$trailer[0] trailer" if $lastPos != $$trailer[1];
940
+ last;
941
+ }
926
942
  $lastTag = $tag if $$tagTablePtr{$tag}; # keep track of last known tag
927
943
  if (defined $atomCount and --$atomCount < 0 and $dataPt) {
928
944
  # stop processing now and just copy the rest of the atom
@@ -1526,13 +1542,15 @@ sub WriteQuickTime($$$)
1526
1542
  if (($lastTag eq 'mdat' or $lastTag eq 'moov') and not $dataPt and (not $$tagTablePtr{$tag} or
1527
1543
  ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
1528
1544
  {
1529
- my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
1530
- if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
1531
- $errStr =~ s/ is too large.*//;
1532
- $et->Warn('Deleted unknown trailer with ' . lcfirst($errStr));
1545
+ # identify other known trailers
1546
+ $buf2 = '';
1547
+ $raf->Seek($lastPos,0) and $raf->Read($buf2,8);
1548
+ if ($buf2 eq 'CCCCCCCC') {
1549
+ $trailer = [ 'Kenwood', $lastPos ];
1550
+ } elsif ($buf2 =~ /^(gpsa|gps0|gsen|gsea)...\0/s) {
1551
+ $trailer = [ 'RIFF', $lastPos ];
1533
1552
  } else {
1534
- $et->Warn('Unknown trailer with ' . lcfirst($errStr));
1535
- $et->Error('Use "-trailer=" to delete unknown trailer');
1553
+ $trailer = [ 'Unknown', $lastPos ];
1536
1554
  }
1537
1555
  } else {
1538
1556
  $et->Error($errStr);
@@ -1645,27 +1663,26 @@ sub WriteQuickTime($$$)
1645
1663
  }
1646
1664
  my $subName = $$subdir{DirName} || $$tagInfo{Name};
1647
1665
  # QuickTime hierarchy is complex, so check full directory path before adding
1648
- my $buff;
1649
1666
  if ($createKeys and $curPath eq 'MOV-Movie' and $subName eq 'Meta') {
1650
1667
  $et->VPrint(0, " Creating Meta with mdta Handler and Keys\n");
1651
1668
  # init Meta box for Keys tags with mdta Handler and empty Keys+ItemList
1652
- $buff = "\0\0\0\x20hdlr\0\0\0\0\0\0\0\0mdta\0\0\0\0\0\0\0\0\0\0\0\0" .
1669
+ $buf2 = "\0\0\0\x20hdlr\0\0\0\0\0\0\0\0mdta\0\0\0\0\0\0\0\0\0\0\0\0" .
1653
1670
  "\0\0\0\x10keys\0\0\0\0\0\0\0\0" .
1654
1671
  "\0\0\0\x08ilst";
1655
1672
  } elsif ($createKeys and $curPath eq 'MOV-Movie-Meta') {
1656
- $buff = ($subName eq 'Keys' ? "\0\0\0\0\0\0\0\0" : '');
1673
+ $buf2 = ($subName eq 'Keys' ? "\0\0\0\0\0\0\0\0" : '');
1657
1674
  } elsif ($subName eq 'Meta' and $$et{OPTIONS}{QuickTimeHandler}) {
1658
1675
  $et->VPrint(0, " Creating Meta with mdir Handler\n");
1659
1676
  # init Meta box for ItemList tags with mdir Handler
1660
- $buff = "\0\0\0\x20hdlr\0\0\0\0\0\0\0\0mdir\0\0\0\0\0\0\0\0\0\0\0\0";
1677
+ $buf2 = "\0\0\0\x20hdlr\0\0\0\0\0\0\0\0mdir\0\0\0\0\0\0\0\0\0\0\0\0";
1661
1678
  } else {
1662
1679
  next unless $curPath eq $writePath and $$addDirs{$subName} and $$addDirs{$subName} eq $dirName;
1663
- $buff = ''; # write from scratch
1680
+ $buf2 = ''; # write from scratch
1664
1681
  }
1665
1682
  my %subdirInfo = (
1666
1683
  Parent => $dirName,
1667
1684
  DirName => $subName,
1668
- DataPt => \$buff,
1685
+ DataPt => \$buf2,
1669
1686
  DirStart => 0,
1670
1687
  HasData => $$subdir{HasData},
1671
1688
  OutFile => $outfile,
@@ -1978,9 +1995,8 @@ sub WriteQuickTime($$$)
1978
1995
  $result or $et->Error("Truncated mdat atom"), last;
1979
1996
  } else {
1980
1997
  # mdat continues to end of file
1981
- my $buff;
1982
- while ($raf->Read($buff, 65536)) {
1983
- Write($outfile, $buff) or $rtnVal = 0, last;
1998
+ while ($raf->Read($buf2, 65536)) {
1999
+ Write($outfile, $buf2) or $rtnVal = 0, last;
1984
2000
  }
1985
2001
  }
1986
2002
  }
@@ -1989,6 +2005,22 @@ sub WriteQuickTime($$$)
1989
2005
  # write the stuff that must come last
1990
2006
  Write($outfile, $writeLast) or $rtnVal = 0 if $writeLast;
1991
2007
 
2008
+ # copy trailer if necessary
2009
+ if ($rtnVal and $trailer) {
2010
+ # are we deleting the trailer?
2011
+ my $nvTrail = $et->GetNewValueHash($Image::ExifTool::Extra{Trailer});
2012
+ if ($$et{DEL_GROUP}{Trailer} or ($nvTrail and not ($$nvTrail{Value} and $$nvTrail{Value}[0]))) {
2013
+ $et->Warn("Deleted $$trailer[0] trailer", 1);
2014
+ } elsif ($raf->Seek($$trailer[1])) {
2015
+ $et->Warn(sprintf('Copying %s trailer from offset 0x%x', @$trailer), 1);
2016
+ while ($raf->Read($buf2, 65536)) {
2017
+ Write($outfile, $buf2) or $rtnVal = 0, last;
2018
+ }
2019
+ } else {
2020
+ $rtnVal = 0;
2021
+ }
2022
+ $rtnVal or $et->Error("Error copying $$trailer[0] trailer");
2023
+ }
1992
2024
  return $rtnVal;
1993
2025
  }
1994
2026
 
@@ -19,7 +19,6 @@ use Image::ExifTool::Fixup;
19
19
 
20
20
  sub AssembleRational($$@);
21
21
  sub LastInList($);
22
- sub CreateDirectory($$);
23
22
  sub NextFreeTagKey($$);
24
23
  sub RemoveNewValueHash($$$);
25
24
  sub RemoveNewValuesForGroup($$);
@@ -2085,9 +2084,10 @@ sub SetFileName($$;$$$)
2085
2084
  return 1;
2086
2085
  }
2087
2086
  # create directory for new file if necessary
2088
- my $result;
2089
- if (($result = $self->CreateDirectory($newName)) != 0) {
2090
- if ($result < 0) {
2087
+ my $err = $self->CreateDirectory($newName);
2088
+ if (defined $err) {
2089
+ if ($err) {
2090
+ $self->Warn($err) unless $err =~ /^Error creating/;
2091
2091
  $self->Warn("Error creating directory for '${newName}'");
2092
2092
  return -1;
2093
2093
  }
@@ -3554,55 +3554,6 @@ sub IsRawType($)
3554
3554
  return $rawType{$$self{FileType}};
3555
3555
  }
3556
3556
 
3557
- #------------------------------------------------------------------------------
3558
- # Create directory for specified file
3559
- # Inputs: 0) ExifTool ref, 1) complete file name including path
3560
- # Returns: 1 = directory created, 0 = nothing done, -1 = error
3561
- my $k32CreateDir;
3562
- sub CreateDirectory($$)
3563
- {
3564
- local $_;
3565
- my ($self, $file) = @_;
3566
- my $rtnVal = 0;
3567
- my $enc = $$self{OPTIONS}{CharsetFileName};
3568
- my $dir;
3569
- ($dir = $file) =~ s/[^\/]*$//; # remove filename from path specification
3570
- # recode as UTF-8 if necessary
3571
- if ($dir and not $self->IsDirectory($dir)) {
3572
- my @parts = split /\//, $dir;
3573
- $dir = '';
3574
- foreach (@parts) {
3575
- $dir .= $_;
3576
- if (length $dir and not $self->IsDirectory($dir)) {
3577
- # create directory since it doesn't exist
3578
- my $d2 = $dir; # (must make a copy in case EncodeFileName recodes it)
3579
- if ($self->EncodeFileName($d2)) {
3580
- # handle Windows Unicode directory names
3581
- unless (eval { require Win32::API }) {
3582
- $self->Warn('Install Win32::API to create directories with Unicode names');
3583
- return -1;
3584
- }
3585
- unless ($k32CreateDir) {
3586
- return -1 if defined $k32CreateDir;
3587
- $k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
3588
- unless ($k32CreateDir) {
3589
- $self->Warn('Error calling Win32::API::CreateDirectoryW');
3590
- $k32CreateDir = 0;
3591
- return -1;
3592
- }
3593
- }
3594
- $k32CreateDir->Call($d2, 0) or return -1;
3595
- } else {
3596
- mkdir($d2, 0777) or return -1;
3597
- }
3598
- $rtnVal = 1;
3599
- }
3600
- $dir .= '/';
3601
- }
3602
- }
3603
- return $rtnVal;
3604
- }
3605
-
3606
3557
  #------------------------------------------------------------------------------
3607
3558
  # Copy file attributes from one file to another
3608
3559
  # Inputs: 0) ExifTool ref, 1) source file name, 2) destination file name
@@ -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.93';
32
+ $VERSION = '12.96';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -1873,9 +1873,10 @@ my %systemTagsNotes = (
1873
1873
  this write-only tag is used to define the GPS track log data or track log
1874
1874
  file name. Currently supported track log formats are GPX, NMEA RMC/GGA/GLL,
1875
1875
  KML, IGC, Garmin XML and TCX, Magellan PMGNTRK, Honeywell PTNTHPR, Winplus
1876
- Beacon text, and Bramor gEO log files. May be set to the special value of
1877
- "DATETIMEONLY" (all caps) to set GPS date/time tags if no input track points
1878
- are available. See L<geotag.html|../geotag.html> for details
1876
+ Beacon text, Bramor gEO, Google Takeout JSON, and CSV log files. May be set
1877
+ to the special value of "DATETIMEONLY" (all caps) to set GPS date/time tags
1878
+ if no input track points are available. See L<geotag.html|../geotag.html>
1879
+ for details
1879
1880
  },
1880
1881
  DelCheck => q{
1881
1882
  require Image::ExifTool::Geotag;
@@ -4734,6 +4735,56 @@ sub IsDirectory($$)
4734
4735
  return 0;
4735
4736
  }
4736
4737
 
4738
+ #------------------------------------------------------------------------------
4739
+ # Create directory for specified file
4740
+ # Inputs: 0) ExifTool ref, 1) complete file name including path
4741
+ # Returns: '' = directory created, undef = nothing done, otherwise error string
4742
+ my $k32CreateDir;
4743
+ sub CreateDirectory($$)
4744
+ {
4745
+ local $_;
4746
+ my ($self, $file) = @_;
4747
+ my ($err, $dir);
4748
+ ($dir = $file) =~ s/[^\/]*$//; # remove filename from path specification
4749
+ if ($dir and not $self->IsDirectory($dir)) {
4750
+ my @parts = split /\//, $dir;
4751
+ $dir = '';
4752
+ foreach (@parts) {
4753
+ $dir .= $_;
4754
+ if (length and not $self->IsDirectory($dir) and
4755
+ # don't try to create a network drive root directory
4756
+ not (IsPC() and $dir =~ m{^//[^/]*$}))
4757
+ {
4758
+ my $success;
4759
+ # create directory since it doesn't exist
4760
+ my $d2 = $dir; # (must make a copy in case EncodeFileName recodes it)
4761
+ if ($self->EncodeFileName($d2)) {
4762
+ # handle Windows Unicode directory names
4763
+ unless (eval { require Win32::API }) {
4764
+ $err = 'Install Win32::API to create directories with Unicode names';
4765
+ last;
4766
+ }
4767
+ unless (defined $k32CreateDir) {
4768
+ $k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
4769
+ unless ($k32CreateDir) {
4770
+ $k32CreateDir = 0;
4771
+ # give this error once, then just "Error creating" for subsequent attempts
4772
+ return 'Error accessing Win32::API::CreateDirectoryW';
4773
+ }
4774
+ }
4775
+ $success = $k32CreateDir->Call($d2, 0) if $k32CreateDir;
4776
+ } else {
4777
+ $success = mkdir($d2, 0777);
4778
+ }
4779
+ $success or $err = "Error creating directory $dir", last;
4780
+ $err = '';
4781
+ }
4782
+ $dir .= '/';
4783
+ }
4784
+ }
4785
+ return $err;
4786
+ }
4787
+
4737
4788
  #------------------------------------------------------------------------------
4738
4789
  # Get file times (Unix seconds since the epoch)
4739
4790
  # Inputs: 0) ExifTool ref, 1) file name or ref
@@ -5648,6 +5699,17 @@ sub SetupTagTable($)
5648
5699
  }
5649
5700
  }
5650
5701
 
5702
+ #------------------------------------------------------------------------------
5703
+ # Is this a PC system?
5704
+ # Returns: true for PC systems
5705
+ # uses lookup for O/S names which may use a backslash as a directory separator
5706
+ # (ref File::Spec of PathTools-3.2701)
5707
+ my %isPC = (MSWin32 => 1, os2 => 1, dos => 1, NetWare => 1, symbian => 1, cygwin => 1);
5708
+ sub IsPC()
5709
+ {
5710
+ return $isPC{$^O};
5711
+ }
5712
+
5651
5713
  #------------------------------------------------------------------------------
5652
5714
  # Utilities to check for numerical types
5653
5715
  # Inputs: 0) value; Returns: true if value is a numerical type
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.93
3
+ Version: 12.96
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('12.93.0')
4
+ VERSION = Gem::Version.new('12.96.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.93.0
4
+ version: 12.96.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-08-27 00:00:00.000000000 Z
12
+ date: 2024-09-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool