exiftool_vendored 12.73.0 → 12.74.0

Sign up to get free protection for your applications and to get access to all the features.
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