exiftool_vendored 12.73.0 → 12.74.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +26 -1
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/exiftool +49 -40
  7. data/bin/lib/File/RandomAccess.pm +31 -5
  8. data/bin/lib/File/RandomAccess.pod +4 -4
  9. data/bin/lib/Image/ExifTool/7Z.pm +3 -3
  10. data/bin/lib/Image/ExifTool/AFCP.pm +2 -2
  11. data/bin/lib/Image/ExifTool/BZZ.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +5 -5
  13. data/bin/lib/Image/ExifTool/Canon.pm +3 -3
  14. data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
  15. data/bin/lib/Image/ExifTool/DICOM.pm +2 -2
  16. data/bin/lib/Image/ExifTool/DNG.pm +4 -4
  17. data/bin/lib/Image/ExifTool/Exif.pm +2 -2
  18. data/bin/lib/Image/ExifTool/FLIR.pm +2 -2
  19. data/bin/lib/Image/ExifTool/Fixup.pm +3 -3
  20. data/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
  21. data/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
  22. data/bin/lib/Image/ExifTool/Geotag.pm +3 -3
  23. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
  24. data/bin/lib/Image/ExifTool/ID3.pm +2 -2
  25. data/bin/lib/Image/ExifTool/Import.pm +5 -5
  26. data/bin/lib/Image/ExifTool/JSON.pm +2 -2
  27. data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
  28. data/bin/lib/Image/ExifTool/MIE.pm +3 -3
  29. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  30. data/bin/lib/Image/ExifTool/Nikon.pm +3 -1
  31. data/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
  32. data/bin/lib/Image/ExifTool/Ogg.pm +2 -2
  33. data/bin/lib/Image/ExifTool/PLIST.pm +3 -3
  34. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
  35. data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
  36. data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
  37. data/bin/lib/Image/ExifTool/PostScript.pm +2 -2
  38. data/bin/lib/Image/ExifTool/QuickTime.pm +40 -107
  39. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +8 -6
  40. data/bin/lib/Image/ExifTool/RSRC.pm +2 -2
  41. data/bin/lib/Image/ExifTool/Samsung.pm +4 -4
  42. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  43. data/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
  44. data/bin/lib/Image/ExifTool/Sony.pm +3 -3
  45. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  46. data/bin/lib/Image/ExifTool/TagLookup.pm +5 -5
  47. data/bin/lib/Image/ExifTool/TagNames.pod +5 -1
  48. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  49. data/bin/lib/Image/ExifTool/WriteExif.pl +15 -15
  50. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  51. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
  52. data/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
  53. data/bin/lib/Image/ExifTool/Writer.pl +66 -42
  54. data/bin/lib/Image/ExifTool/ZIP.pm +6 -6
  55. data/bin/lib/Image/ExifTool.pm +27 -23
  56. data/bin/lib/Image/ExifTool.pod +7 -6
  57. data/bin/perl-Image-ExifTool.spec +1 -1
  58. data/lib/exiftool_vendored/version.rb +1 -1
  59. metadata +2 -2
@@ -1083,6 +1083,8 @@ sub WriteXMP($$;$)
1083
1083
  # delete all structure (or pseudo-structure) elements
1084
1084
  require 'Image/ExifTool/XMPStruct.pl';
1085
1085
  ($deleted, $added, $existed) = DeleteStruct($et, \%capture, \$path, $nvHash, \$changed);
1086
+ # don't add if it didn't exist and not IsCreating and Avoid
1087
+ undef $added if not $existed and not $$nvHash{IsCreating} and $$tagInfo{Avoid};
1086
1088
  next unless $deleted or $added or $et->IsOverwriting($nvHash);
1087
1089
  next if $existed and $$nvHash{CreateOnly};
1088
1090
  } elsif ($cap) {
@@ -1262,8 +1264,8 @@ sub WriteXMP($$;$)
1262
1264
  # check to see if we want to create this tag
1263
1265
  # (create non-avoided tags in XMP data files by default)
1264
1266
  my $isCreating = ($$nvHash{IsCreating} or (($isStruct or
1265
- ($preferred and not $$tagInfo{Avoid} and
1266
- not defined $$nvHash{Shift})) and not $$nvHash{EditOnly}));
1267
+ ($preferred and not defined $$nvHash{Shift})) and
1268
+ not $$tagInfo{Avoid} and not $$nvHash{EditOnly}));
1267
1269
 
1268
1270
  # don't add new values unless...
1269
1271
  # ...tag existed before and was deleted, or we added it to a list
@@ -26,6 +26,7 @@ sub RemoveNewValuesForGroup($$);
26
26
  sub GetWriteGroup1($$);
27
27
  sub Sanitize($$);
28
28
  sub ConvInv($$$$$;$$);
29
+ sub PushValue($$$;$);
29
30
 
30
31
  my $loadedAllTables; # flag indicating we loaded all tables
31
32
  my $advFmtSelf; # ExifTool object during evaluation of advanced formatting expr
@@ -1260,7 +1261,7 @@ sub SetNewValuesFromFile($$;@)
1260
1261
  }
1261
1262
  # expand shortcuts
1262
1263
  @setTags and ExpandShortcuts(\@setTags);
1263
- my $srcExifTool = new Image::ExifTool;
1264
+ my $srcExifTool = Image::ExifTool->new;
1264
1265
  # set flag to indicate we are being called from inside SetNewValuesFromFile()
1265
1266
  $$srcExifTool{TAGS_FROM_FILE} = 1;
1266
1267
  # synchronize and increment the file sequence number
@@ -1582,7 +1583,7 @@ SET: foreach $set (@setList) {
1582
1583
  my $opts = $$set[3];
1583
1584
  # handle expressions
1584
1585
  if ($$opts{EXPR}) {
1585
- my $val = $srcExifTool->InsertTagValues(\@tags, $$set[1], 'Error');
1586
+ my $val = $srcExifTool->InsertTagValues($$set[1], \@tags, 'Error');
1586
1587
  my $err = $$srcExifTool{VALUE}{Error};
1587
1588
  if ($err) {
1588
1589
  # pass on any error as a warning unless it is suppressed
@@ -2432,7 +2433,7 @@ sub WriteInfo($$;$$)
2432
2433
  #
2433
2434
  until ($$self{VALUE}{Error}) {
2434
2435
  # create random access file object (disable seek test in case of straight copy)
2435
- $raf or $raf = new File::RandomAccess($inRef, 1);
2436
+ $raf or $raf = File::RandomAccess->new($inRef, 1);
2436
2437
  $raf->BinMode();
2437
2438
  if ($numNew == $numPseudo) {
2438
2439
  $rtnVal = 1;
@@ -2703,7 +2704,7 @@ sub GetAllTags(;$)
2703
2704
  my (%allTags, @groups);
2704
2705
  @groups = split ':', $group if $group;
2705
2706
 
2706
- my $et = new Image::ExifTool;
2707
+ my $et = Image::ExifTool->new;
2707
2708
  LoadAllTables(); # first load all our tables
2708
2709
  my @tableNames = keys %allTables;
2709
2710
 
@@ -2748,7 +2749,7 @@ sub GetWritableTags(;$)
2748
2749
  my (%writableTags, @groups);
2749
2750
  @groups = split ':', $group if $group;
2750
2751
 
2751
- my $et = new Image::ExifTool;
2752
+ my $et = Image::ExifTool->new;
2752
2753
  LoadAllTables();
2753
2754
  my @tableNames = keys %allTables;
2754
2755
 
@@ -3124,11 +3125,37 @@ Conv: for (;;) {
3124
3125
  return($val, $err);
3125
3126
  }
3126
3127
 
3128
+ #------------------------------------------------------------------------------
3129
+ # Dereference value and push onto list
3130
+ # Inputs: 0) ExifTool ref, 1) value, 2) list ref, 3) flag to push MissingTagValue for undef value
3131
+ sub PushValue($$$;$)
3132
+ {
3133
+ local $_;
3134
+ my ($self, $val, $list, $missing) = @_;
3135
+ if (ref $val eq 'ARRAY' and ref $$val[0] ne 'HASH') {
3136
+ $self->PushValue($_, $list, $missing) foreach @$val;
3137
+ } elsif (ref $val eq 'SCALAR') {
3138
+ if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
3139
+ push @$list, $$val;
3140
+ } else {
3141
+ push @$list, 'Binary data ' . length($$val) . ' bytes';
3142
+ }
3143
+ } elsif (ref $val eq 'HASH' or ref $val eq 'ARRAY') {
3144
+ require 'Image/ExifTool/XMPStruct.pl';
3145
+ push @$list, Image::ExifTool::XMP::SerializeStruct($self, $val);
3146
+ } elsif (not defined $val) {
3147
+ my $mval = $$self{OPTIONS}{MissingTagValue};
3148
+ push @$list, $mval if $missing and defined $mval;
3149
+ } else {
3150
+ push @$list, $val;
3151
+ }
3152
+ }
3153
+
3127
3154
  #------------------------------------------------------------------------------
3128
3155
  # Convert tag names to values or variables in a string
3129
3156
  # (eg. '${EXIF:ISO}x $$' --> '100x $' without hash ref, or "$info{'EXIF:ISO'}x $" with)
3130
- # Inputs: 0) ExifTool object ref, 1) reference to list of found tags
3131
- # 2) string with embedded tag names, 3) Options:
3157
+ # Inputs: 0) ExifTool object ref, 1) string with embedded tag names,
3158
+ # 2) reference to list of found tags or undef to use FOUND_TAGS, 3) Options:
3132
3159
  # undef - set missing tags to ''
3133
3160
  # 'Error' - issue minor error on missing tag (and return undef)
3134
3161
  # 'Warn' - issue minor warning on missing tag (and return undef)
@@ -3145,20 +3172,22 @@ Conv: for (;;) {
3145
3172
  # - advanced feature allows Perl expressions inside braces (eg. '${model;tr/ //d}')
3146
3173
  # - an error/warning in an advanced expression ("${TAG;EXPR}") generates an error
3147
3174
  # if option set to 'Error', or a warning otherwise
3148
- sub InsertTagValues($$$;$$$)
3175
+ sub InsertTagValues($$;$$$$)
3149
3176
  {
3150
3177
  local $_;
3151
- my ($self, $foundTags, $line, $opt, $docGrp, $cache) = @_;
3178
+ my ($self, $line, $foundTags, $opt, $docGrp, $cache) = @_;
3152
3179
  my $rtnStr = '';
3153
3180
  my ($docNum, $tag);
3181
+
3154
3182
  if ($docGrp) {
3155
3183
  $docNum = $docGrp =~ /(\d+)$/ ? $1 : 0;
3156
3184
  } else {
3157
3185
  undef $cache; # no cache if no document groups
3158
3186
  }
3187
+ $foundTags or $foundTags = $$self{FOUND_TAGS} || [];
3159
3188
  while ($line =~ s/(.*?)\$(\{\s*)?([-\w]*\w|\$|\/)//s) {
3160
3189
  my ($pre, $bra, $var) = ($1, $2, $3);
3161
- my (@tags, $val, $tg, @val, $type, $expr, $didExpr, $level, $asList);
3190
+ my (@tags, $tg, $val, @val, $type, $expr, $didExpr, $level, $asList);
3162
3191
  # "$$" represents a "$" symbol, and "$/" is a newline
3163
3192
  if ($var eq '$' or $var eq '/') {
3164
3193
  $line =~ s/^\s*\}// if $bra;
@@ -3261,15 +3290,24 @@ sub InsertTagValues($$$;$$$)
3261
3290
  } elsif (defined $$et{OPTIONS}{UserParam}{$lcTag}) {
3262
3291
  $val = $$et{OPTIONS}{UserParam}{$lcTag};
3263
3292
  } elsif ($tag =~ /(.*):(.+)/) {
3264
- my $group;
3293
+ my ($group, @matches);
3265
3294
  ($group, $tag) = ($1, $2);
3266
- if (lc $tag eq 'all') {
3267
- # see if any tag from the specified group exists
3268
- my $match = $et->GroupMatches($group, $fileTags);
3269
- $val = $match ? 1 : 0;
3295
+ # join values of all matching tags if "All" group is used
3296
+ # (and remove "All" from group prefix)
3297
+ if ($group =~ s/(^|:)(all|\*)(:|$)/$1 and $3/ei) {
3298
+ if (lc $tag eq 'all') {
3299
+ @matches = $group ? $et->GroupMatches($group, $fileTags) : @$fileTags;
3300
+ } else {
3301
+ @matches = grep /^$tag(\s|$)/i, @$fileTags;
3302
+ @matches = $et->GroupMatches($group, \@matches) if $group;
3303
+ }
3304
+ $self->PushValue(scalar $et->GetValue($_, $type), \@val) foreach @matches;
3305
+ } elsif (lc $tag eq 'all') {
3306
+ # return "1" if any tag from the specified group exists
3307
+ $val = $et->GroupMatches($group, $fileTags) ? 1 : 0;
3270
3308
  } else {
3271
3309
  # find the specified tag
3272
- my @matches = grep /^$tag(\s|$)/i, @$fileTags;
3310
+ @matches = grep /^$tag(\s|$)/i, @$fileTags;
3273
3311
  @matches = $et->GroupMatches($group, \@matches);
3274
3312
  foreach $tg (@matches) {
3275
3313
  if (defined $val and $tg =~ / \((\d+)\)$/) {
@@ -3298,31 +3336,15 @@ sub InsertTagValues($$$;$$$)
3298
3336
  }
3299
3337
  }
3300
3338
  $self->Options(ListJoin => $oldListJoin) if $asList;
3301
- if (ref $val eq 'ARRAY') {
3302
- push @val, @$val;
3303
- undef $val;
3304
- last unless @tags;
3305
- } elsif (ref $val eq 'SCALAR') {
3306
- if ($$self{OPTIONS}{Binary} or $$val =~ /^Binary data/) {
3307
- $val = $$val;
3308
- } else {
3309
- $val = 'Binary data ' . length($$val) . ' bytes';
3310
- }
3311
- } elsif (ref $val eq 'HASH') {
3312
- require 'Image/ExifTool/XMPStruct.pl';
3313
- $val = Image::ExifTool::XMP::SerializeStruct($self, $val);
3314
- } elsif (not defined $val) {
3315
- $val = $$self{OPTIONS}{MissingTagValue} if $asList;
3316
- }
3317
- last unless @tags;
3318
- push @val, $val if defined $val;
3339
+ $self->PushValue($val, \@val, $asList);
3319
3340
  undef $val;
3341
+ last unless @tags;
3320
3342
  }
3321
3343
  if (@val) {
3322
- push @val, $val if defined $val;
3344
+ $self->PushValue($val, \@val) if defined $val;
3323
3345
  $val = join $$self{OPTIONS}{ListSep}, @val;
3324
- } else {
3325
- push @val, $val if defined $val; # (so the eval has access to @val if required)
3346
+ } elsif (defined $val) {
3347
+ $self->PushValue($val, \@val); # (so the eval has access to @val if required)
3326
3348
  }
3327
3349
  # evaluate advanced formatting expression if given (eg. "${TAG;EXPR}")
3328
3350
  if (defined $expr and defined $val) {
@@ -3395,6 +3417,7 @@ sub InsertTagValues($$$;$$$)
3395
3417
  #------------------------------------------------------------------------------
3396
3418
  # Reformat date/time value in $_ based on specified format string
3397
3419
  # Inputs: 0) date/time format string
3420
+ # Returns: Reformatted date/time string
3398
3421
  sub DateFmt($)
3399
3422
  {
3400
3423
  my $et = bless { OPTIONS => { DateFormat => shift, StrictDate => 1 } };
@@ -3406,6 +3429,7 @@ sub DateFmt($)
3406
3429
  $_ = $et->ConvertDateTime($_);
3407
3430
  defined $_ or warn "Error converting date/time\n";
3408
3431
  $$advFmtSelf{GLOBAL_TIME_OFFSET} = $$et{GLOBAL_TIME_OFFSET} if $shift;
3432
+ return $_;
3409
3433
  }
3410
3434
 
3411
3435
  #------------------------------------------------------------------------------
@@ -3515,7 +3539,7 @@ sub CreateDirectory($$)
3515
3539
  }
3516
3540
  unless ($k32CreateDir) {
3517
3541
  return -1 if defined $k32CreateDir;
3518
- $k32CreateDir = new Win32::API('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
3542
+ $k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
3519
3543
  unless ($k32CreateDir) {
3520
3544
  $self->Warn('Error calling Win32::API::CreateDirectoryW');
3521
3545
  $k32CreateDir = 0;
@@ -6233,7 +6257,7 @@ sub WriteJPEG($$)
6233
6257
  last unless $$editDirs{CIFF};
6234
6258
  my $newData = '';
6235
6259
  my %dirInfo = (
6236
- RAF => new File::RandomAccess($segDataPt),
6260
+ RAF => File::RandomAccess->new($segDataPt),
6237
6261
  OutFile => \$newData,
6238
6262
  );
6239
6263
  require Image::ExifTool::CanonRaw;
@@ -6952,7 +6976,7 @@ sub SetFileTime($$;$$$$)
6952
6976
  }
6953
6977
  unless ($k32SetFileTime) {
6954
6978
  return 0 if defined $k32SetFileTime;
6955
- $k32SetFileTime = new Win32::API('KERNEL32', 'SetFileTime', 'NPPP', 'I');
6979
+ $k32SetFileTime = Win32::API->new('KERNEL32', 'SetFileTime', 'NPPP', 'I');
6956
6980
  unless ($k32SetFileTime) {
6957
6981
  $self->Warn('Error calling Win32::API::SetFileTime');
6958
6982
  $k32SetFileTime = 0;
@@ -7196,7 +7220,7 @@ sub WriteBinaryData($$$)
7196
7220
  $$self{HiddenData} = {
7197
7221
  Offset => $offset,
7198
7222
  Size => $size,
7199
- Fixup => new Image::ExifTool::Fixup,
7223
+ Fixup => Image::ExifTool::Fixup->new,
7200
7224
  Base => $$dirInfo{Base},
7201
7225
  };
7202
7226
  next;
@@ -7205,7 +7229,7 @@ sub WriteBinaryData($$$)
7205
7229
  next unless $$tagInfo{DataTag} eq 'PreviewImage' and $$self{FILE_TYPE} eq 'JPEG';
7206
7230
  my $previewInfo = $$self{PREVIEW_INFO};
7207
7231
  $previewInfo or $previewInfo = $$self{PREVIEW_INFO} = {
7208
- Fixup => new Image::ExifTool::Fixup,
7232
+ Fixup => Image::ExifTool::Fixup->new,
7209
7233
  };
7210
7234
  # set flag indicating we are using short pointers
7211
7235
  $$previewInfo{IsShort} = 1 unless $format eq 'int32u';
@@ -20,7 +20,7 @@ use strict;
20
20
  use vars qw($VERSION $warnString);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
 
23
- $VERSION = '1.30';
23
+ $VERSION = '1.31';
24
24
 
25
25
  sub WarnProc($) { $warnString = $_[0]; }
26
26
 
@@ -367,7 +367,7 @@ sub ProcessRAR($$)
367
367
  # read the header and create new RAF object for reading it
368
368
  my $header;
369
369
  $raf->Read($header, $headSize) == $headSize or last;
370
- my $rafHdr = new File::RandomAccess(\$header);
370
+ my $rafHdr = File::RandomAccess->new(\$header);
371
371
  my $headType = ReadULEB($rafHdr); # get header type
372
372
 
373
373
  if ($headType == 4) { # encryption block
@@ -550,14 +550,14 @@ sub ProcessZIP($$)
550
550
  } elsif (eval { require IO::String }) {
551
551
  # read the whole file into memory (what else can I do?)
552
552
  $raf->Slurp();
553
- $fh = new IO::String ${$raf->{BUFF_PT}};
553
+ $fh = IO::String->new(${$raf->{BUFF_PT}});
554
554
  } else {
555
555
  my $type = $raf->{FILE_PT} ? 'pipe or socket' : 'scalar reference';
556
556
  $et->Warn("Install IO::String to decode compressed ZIP information from a $type");
557
557
  last;
558
558
  }
559
559
  $et->VPrint(1, " --- using Archive::Zip ---\n");
560
- $zip = new Archive::Zip;
560
+ $zip = Archive::Zip->new;
561
561
  # catch all warnings! (Archive::Zip is bad for this)
562
562
  local $SIG{'__WARN__'} = \&WarnProc;
563
563
  my $status = $zip->readFromFileHandle($fh);
@@ -568,8 +568,8 @@ sub ProcessZIP($$)
568
568
  # a failed test with Perl 5.6.2 GNU/Linux 2.6.32-5-686 i686-linux-64int-ld
569
569
  $raf->Seek(0,0);
570
570
  $raf->Slurp();
571
- $fh = new IO::String ${$raf->{BUFF_PT}};
572
- $zip = new Archive::Zip;
571
+ $fh = IO::String->new(${$raf->{BUFF_PT}});
572
+ $zip = Archive::Zip->new;
573
573
  $status = $zip->readFromFileHandle($fh);
574
574
  }
575
575
  if ($status) {
@@ -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);
31
31
 
32
- $VERSION = '12.73';
32
+ $VERSION = '12.74';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -77,7 +77,7 @@ sub GetDeleteGroups();
77
77
  sub AddUserDefinedTags($%);
78
78
  sub SetAlternateFile($$$);
79
79
  # non-public routines below
80
- sub InsertTagValues($$$;$$$);
80
+ sub InsertTagValues($$;$$$$);
81
81
  sub IsWritable($);
82
82
  sub IsSameFile($$$);
83
83
  sub IsRawType($);
@@ -2196,7 +2196,7 @@ sub new
2196
2196
  # use Image::ExifTool 'ImageInfo';
2197
2197
  # my $info = ImageInfo($file, 'DateTimeOriginal', 'ImageSize');
2198
2198
  # - or -
2199
- # my $et = new Image::ExifTool;
2199
+ # my $et = Image::ExifTool->new;
2200
2200
  # my $info = $et->ImageInfo($file, \@tagList, {Sort=>'Group0'} );
2201
2201
  sub ImageInfo($;@)
2202
2202
  {
@@ -2206,7 +2206,7 @@ sub ImageInfo($;@)
2206
2206
  if (ref $_[0] and UNIVERSAL::isa($_[0],'Image::ExifTool')) {
2207
2207
  $self = shift;
2208
2208
  } else {
2209
- $self = new Image::ExifTool;
2209
+ $self = Image::ExifTool->new;
2210
2210
  }
2211
2211
  my %saveOptions = %{$$self{OPTIONS}}; # save original options
2212
2212
 
@@ -2529,7 +2529,7 @@ sub ExtractInfo($;@)
2529
2529
  FILE_TYPE => $$self{FILE_TYPE},
2530
2530
  };
2531
2531
  $saveOrder = GetByteOrder(),
2532
- $$self{RAF} = new File::RandomAccess($_[0]);
2532
+ $$self{RAF} = File::RandomAccess->new($_[0]);
2533
2533
  $$self{PROCESSED} = { };
2534
2534
  delete $$self{EXIF_DATA};
2535
2535
  delete $$self{EXIF_POS};
@@ -2636,7 +2636,7 @@ sub ExtractInfo($;@)
2636
2636
  # open the file
2637
2637
  if ($self->Open(\*EXIFTOOL_FILE, $filename)) {
2638
2638
  # create random access file object
2639
- $raf = new File::RandomAccess(\*EXIFTOOL_FILE);
2639
+ $raf = File::RandomAccess->new(\*EXIFTOOL_FILE);
2640
2640
  # patch to force pipe to be buffered because seek returns success
2641
2641
  # in Windows cmd shell pipe even though it really failed
2642
2642
  $$raf{TESTED} = -1 if $filename eq '-' or $filename =~ /\|$/;
@@ -2767,12 +2767,16 @@ sub ExtractInfo($;@)
2767
2767
  $raf->BinMode(); # set binary mode before we start reading
2768
2768
  my $pos = $raf->Tell(); # get file position so we can rewind
2769
2769
  # loop through list of file types to test
2770
- my ($buff, $seekErr);
2770
+ my ($buff, $err);
2771
2771
  my %dirInfo = ( RAF => $raf, Base => $pos, TestBuff => \$buff );
2772
2772
  # read start of file for testing
2773
- $raf->Read($buff, $testLen) or $buff = '';
2774
- $raf->Seek($pos, 0) or $seekErr = 1;
2775
- until ($seekErr) {
2773
+ if ($raf->Read($buff, $testLen)) {
2774
+ $raf->Seek($pos, 0) or $err = 'Error seeking in file';
2775
+ } else {
2776
+ $err = $$raf{ERROR};
2777
+ $buff = '';
2778
+ }
2779
+ until ($err) {
2776
2780
  my $unkHeader;
2777
2781
  $type = shift @fileTypeList;
2778
2782
  if ($type) {
@@ -2795,7 +2799,7 @@ sub ExtractInfo($;@)
2795
2799
  $type = ($1 eq "\xff\xd8\xff") ? 'JPEG' : 'TIFF';
2796
2800
  my $skip = pos($buff) - length($1);
2797
2801
  $dirInfo{Base} = $pos + $skip;
2798
- $raf->Seek($pos + $skip, 0) or $seekErr = 1, last;
2802
+ $raf->Seek($pos + $skip, 0) or $err = 'Error seeking in file', last;
2799
2803
  $self->Warn("Processing $type-like data after unknown $skip-byte header");
2800
2804
  $unkHeader = 1 unless $$self{DOC_NUM};
2801
2805
  }
@@ -2841,14 +2845,13 @@ sub ExtractInfo($;@)
2841
2845
  last;
2842
2846
  }
2843
2847
  # seek back to try again from the same position in the file
2844
- $raf->Seek($pos, 0) or $seekErr = 1, last;
2848
+ $raf->Seek($pos, 0) or $err = 'Error seeking in file';
2845
2849
  }
2846
- if (not defined $type and not $$self{DOC_NUM}) {
2850
+ if (not $err and not defined $type and not $$self{DOC_NUM}) {
2847
2851
  # if we were given a single image with a known type there
2848
2852
  # must be a format error since we couldn't read it, otherwise
2849
2853
  # it is likely we don't support images of this type
2850
2854
  my $fileType = GetFileType($realname) || '';
2851
- my $err;
2852
2855
  if (not length $buff) {
2853
2856
  $err = 'File is empty';
2854
2857
  } else {
@@ -2889,10 +2892,9 @@ sub ExtractInfo($;@)
2889
2892
  }
2890
2893
  }
2891
2894
  }
2892
- $self->Error($err);
2893
2895
  }
2894
- if ($seekErr) {
2895
- $self->Error('Error seeking in file');
2896
+ if ($err) {
2897
+ $self->Error($err);
2896
2898
  } elsif ($self->Options('ScanForXMP') and (not defined $type or
2897
2899
  (not $fast and not $$self{FoundXMP})))
2898
2900
  {
@@ -4114,7 +4116,7 @@ sub Init($)
4114
4116
  $$self{FileType} = ''; # identified file type
4115
4117
  if ($self->Options('HtmlDump')) {
4116
4118
  require Image::ExifTool::HtmlDump;
4117
- $$self{HTML_DUMP} = new Image::ExifTool::HtmlDump;
4119
+ $$self{HTML_DUMP} = Image::ExifTool::HtmlDump->new;
4118
4120
  }
4119
4121
  # make sure our TextOut is a file reference
4120
4122
  $$self{OPTIONS}{TextOut} = \*STDOUT unless ref $$self{OPTIONS}{TextOut};
@@ -4177,7 +4179,7 @@ sub ExtractAltInfo($)
4177
4179
  # (eg. -file1 '$originalfilename')
4178
4180
  if ($fileName =~ /\$/) {
4179
4181
  my @tags = reverse sort keys %{$$self{VALUE}};
4180
- $fileName = $self->InsertTagValues(\@tags, $fileName, 'Warn');
4182
+ $fileName = $self->InsertTagValues($fileName, \@tags, 'Warn');
4181
4183
  next unless defined $fileName;
4182
4184
  }
4183
4185
  $altExifTool->ExtractInfo($fileName);
@@ -4504,7 +4506,7 @@ sub GetFileTime($$)
4504
4506
  $atime = $mtime = $ctime = pack 'LL', 0, 0;
4505
4507
  unless ($k32GetFileTime) {
4506
4508
  return () if defined $k32GetFileTime;
4507
- $k32GetFileTime = new Win32::API('KERNEL32', 'GetFileTime', 'NPPP', 'I');
4509
+ $k32GetFileTime = Win32::API->new('KERNEL32', 'GetFileTime', 'NPPP', 'I');
4508
4510
  unless ($k32GetFileTime) {
4509
4511
  $self->Warn('Error calling Win32::API::GetFileTime');
4510
4512
  $k32GetFileTime = 0;
@@ -4583,7 +4585,7 @@ sub ParseArguments($;@)
4583
4585
  my $buff = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$$arg)) : Encode::encode('utf8',$$arg);
4584
4586
  $arg = \$buff;
4585
4587
  }
4586
- $$self{RAF} = new File::RandomAccess($arg);
4588
+ $$self{RAF} = File::RandomAccess->new($arg);
4587
4589
  # set filename to empty string to indicate that
4588
4590
  # we have a file but we didn't open it
4589
4591
  $$self{FILENAME} = '';
@@ -6981,7 +6983,7 @@ sub ProcessJPEG($$)
6981
6983
  } elsif ($$segDataPt =~ /^(II|MM).{4}HEAPJPGM/s) {
6982
6984
  next if $fast > 1; # skip processing for very fast
6983
6985
  $dumpType = 'CIFF';
6984
- my %dirInfo = ( RAF => new File::RandomAccess($segDataPt) );
6986
+ my %dirInfo = ( RAF => File::RandomAccess->new($segDataPt) );
6985
6987
  $$self{SET_GROUP1} = 'CIFF';
6986
6988
  push @{$$self{PATH}}, 'CIFF';
6987
6989
  require Image::ExifTool::CanonRaw;
@@ -7506,6 +7508,8 @@ sub ProcessJPEG($$)
7506
7508
  } elsif ($$segDataPt =~ /^AROT\0/ and $length > 10) {
7507
7509
  # iPhone "AROT" segment containing integrated intensity per 16 scan lines
7508
7510
  # (with number of elements N = ImageHeight / 16 - 1, ref PH/NealKrawetz)
7511
+ # "Absolute ROTational difference between two frames"
7512
+ # (see https://www.hackerfactor.com/blog/index.php?/archives/822-Apple-Rot.html)
7509
7513
  $xtra = 'segment (N=' . unpack('x6N', $$segDataPt) . ')';
7510
7514
  }
7511
7515
  } elsif ($marker == 0xeb) { # APP11 (JPEG-HDR, JUMBF)
@@ -8005,7 +8009,7 @@ sub DoProcessTIFF($$;$)
8005
8009
  }
8006
8010
  }
8007
8011
  # update FileType if necessary now that we know more about the file
8008
- if ($$self{DNGVersion} and $$self{FileType} !~ /^(DNG|GPR)$/) {
8012
+ if ($$self{DNGVersion} and $$self{FILE_TYPE} eq 'TIFF' and $$self{FileType} !~ /^(DNG|GPR)$/) {
8009
8013
  # override whatever FileType we set since we now know it is DNG
8010
8014
  $self->OverrideFileType($$self{TIFF_TYPE} = 'DNG');
8011
8015
  }
@@ -619,7 +619,8 @@ DateFormat of "%Y:%m:%d %H:%M:%S").
619
619
  =item Duplicates
620
620
 
621
621
  Flag to return values from tags with duplicate names when extracting
622
- information. Default is 1.
622
+ information. Default is 1. Forced to 1 when copying tags with
623
+ L</SetNewValuesFromFile>.
623
624
 
624
625
  =item Escape
625
626
 
@@ -824,11 +825,11 @@ Default is undef.
824
825
 
825
826
  =item LimitLongValues
826
827
 
827
- When extracting some values that may be very long, the PrintConv values are
828
- length-limited and the value is truncated with an elipsis ("[...]") if it
829
- exceeds a specified length. This option specifies the length limit for
830
- these tags. A setting of 4 or less disables the limit (because the elipsis
831
- string is longer than this). Default is 60.
828
+ When extracting values for some specific tags (usually Unknown tags), the
829
+ PrintConv values are length-limited and the value is truncated with an
830
+ ellipsis ("[...]") if it exceeds a specified length. This option specifies
831
+ the length limit for these tags. A setting of 4 or less disables the limit
832
+ (because the ellipsis string is longer than this). Default is 60.
832
833
 
833
834
  =item ListItem
834
835
 
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.73
3
+ Version: 12.74
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.73.0')
4
+ VERSION = Gem::Version.new('12.74.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.73.0
4
+ version: 12.74.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-01-14 00:00:00.000000000 Z
12
+ date: 2024-01-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool