From e9436ba08ea5b7f71aa3ffa7e3cec082beb41606 Mon Sep 17 00:00:00 2001 From: morozgrafix Date: Wed, 9 Oct 2024 15:50:33 -0700 Subject: [PATCH] Upgrading to exiftool v12.98 --- bin/Changes | 10 ++++- bin/META.json | 2 +- bin/META.yml | 2 +- bin/README | 4 +- bin/exiftool | 17 ++++---- bin/lib/File/RandomAccess.pm | 7 ++- bin/lib/Image/ExifTool.pm | 19 ++++---- bin/lib/Image/ExifTool/InDesign.pm | 7 +-- bin/lib/Image/ExifTool/Jpeg2000.pm | 3 +- bin/lib/Image/ExifTool/M2TS.pm | 8 ++++ bin/lib/Image/ExifTool/QuickTime.pm | 13 +++--- bin/lib/Image/ExifTool/Sony.pm | 7 ++- bin/lib/Image/ExifTool/TagNames.pod | 6 +-- bin/lib/Image/ExifTool/WritePDF.pl | 68 ++++++++++++++++++++--------- bin/lib/Image/ExifTool/XMP.pm | 11 +++-- bin/perl-Image-ExifTool.spec | 2 +- lib/exiftool_vendored/version.rb | 2 +- 17 files changed, 125 insertions(+), 63 deletions(-) diff --git a/bin/Changes b/bin/Changes index afe2a83..8d296fe 100644 --- a/bin/Changes +++ b/bin/Changes @@ -7,6 +7,14 @@ RSS feed: https://exiftool.org/rss.xml Note: The most recent production release is Version 12.76. (Other versions are considered development releases, and are not uploaded to MetaCPAN.) +Oct. 8, 2024 - Version 12.98 + + - Added write support for PDF files with huge offsets + - Added a number of new Sony LensType values (thanks Jos Roost) + - Require -v4 or higher to output "JPG RST" lines + - Patched problem with -fast option when reading HEIC file via a pipe + - Patched to avoid hang when reading some corrupted XMP + Sept. 25, 2024 - Version 12.97 - Added ability to ignore up to 4095 bytes of garbage at the end of an INDD @@ -143,7 +151,7 @@ June 7, 2024 - Version 12.86 - Patched some Olympus WB_RBLevels tags to allow 4 values to be written as per some newer models - Fixed issue when writing IPTC date tags with a date/time value containing -subseconds with 4 or more digits + subseconds with 4 or more digits May 21, 2024 - Version 12.85 diff --git a/bin/META.json b/bin/META.json index 973afba..9ac3bb9 100644 --- a/bin/META.json +++ b/bin/META.json @@ -50,5 +50,5 @@ } }, "release_status" : "stable", - "version" : "12.97" + "version" : "12.98" } diff --git a/bin/META.yml b/bin/META.yml index bbb9acc..1681ed0 100644 --- a/bin/META.yml +++ b/bin/META.yml @@ -31,4 +31,4 @@ recommends: Time::HiRes: '0' requires: perl: '5.004' -version: '12.97' +version: '12.98' diff --git a/bin/README b/bin/README index 487e396..b23ffdb 100644 --- a/bin/README +++ b/bin/README @@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a terminal window to extract and run ExifTool: cd ~/Desktop - gzip -dc Image-ExifTool-12.97.tar.gz | tar -xf - - cd Image-ExifTool-12.97 + gzip -dc Image-ExifTool-12.98.tar.gz | tar -xf - + cd Image-ExifTool-12.98 ./exiftool t/images/ExifTool.jpg Note: These commands extract meta information from one of the test images. diff --git a/bin/exiftool b/bin/exiftool index 6976b06..fc42e88 100755 --- a/bin/exiftool +++ b/bin/exiftool @@ -11,7 +11,7 @@ use strict; use warnings; require 5.004; -my $version = '12.97'; +my $version = '12.98'; # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool' my $exePath; @@ -5662,7 +5662,7 @@ with this command: produces output like this: - -- Generated by ExifTool 12.97 -- + -- Generated by ExifTool 12.98 -- File: a.jpg - 2003:10:31 15:44:19 (f/5.6, 1/60s, ISO 100) File: b.jpg - 2006:05:23 11:57:38 @@ -6204,9 +6204,10 @@ B<-fileNUM> option is used to read an alternate file and the corresponding family 8 group name is specified for the tag. See the B<-fileNUM> option details for more information. -5) The B<-a> option has no effect on the evaluation of the expression, and -the values of duplicate tags are accessible only by specifying a group name -(such as a family 4 instance number, eg. C<$Copy1:TAG>, C<$Copy2:TAG>, etc). +5) The B<-a> (Duplicates) option is implied when B<-if> is used without a +fast I, and the values of duplicate tags are accessible by specifying a +group name in the expression (such as a family 4 instance number, eg. +C<$Copy1:TAG>, C<$Copy2:TAG>, etc). 6) A special "OK" UserParam is available to test the success of the previous command when B<-execute> was used, and may be used like any other tag in the @@ -6472,9 +6473,9 @@ B<-f> adds 'flags' and 'struct' attributes if applicable. The flags are formatted as a comma-separated list of the following possible values: Avoid, Binary, List, Mandatory, Permanent, Protected, Unknown and Unsafe (see the L). For XMP List -tags, the list type (Alt, Bag or Seq) is added to the flags, and flattened -structure tags are indicated by a Flattened flag with 'struct' giving the ID -of the parent structure. +tags, the list type (Alt, Bag or Seq) is also given, and flattened structure +tags are indicated by a Flattened flag with 'struct' giving the ID of the +parent structure. Note that none of the B<-list> options require an input I. diff --git a/bin/lib/File/RandomAccess.pm b/bin/lib/File/RandomAccess.pm index b4e6da8..9b6696f 100644 --- a/bin/lib/File/RandomAccess.pm +++ b/bin/lib/File/RandomAccess.pm @@ -41,7 +41,7 @@ require 5.002; require Exporter; use vars qw($VERSION @ISA @EXPORT_OK); -$VERSION = '1.12'; +$VERSION = '1.13'; @ISA = qw(Exporter); sub Read($$$); @@ -158,7 +158,10 @@ sub Seek($$;$) $self->Slurp(); # read whole file into buffer $newPos = $num + $self->{LEN}; # relative to end of file } - if ($newPos >= 0) { + if ($newPos >= 0 and + # can't go backwards in unbuffered non-seekable file + (not $self->{NoBuffer} or $newPos >= $self->{POS})) + { $self->{POS} = $newPos; $rtnVal = 1; } diff --git a/bin/lib/Image/ExifTool.pm b/bin/lib/Image/ExifTool.pm index 5f5f5f3..5a02017 100644 --- a/bin/lib/Image/ExifTool.pm +++ b/bin/lib/Image/ExifTool.pm @@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes %jpegMarker %specialTags %fileTypeLookup $testLen $exeDir %static_vars $advFmtSelf); -$VERSION = '12.97'; +$VERSION = '12.98'; $RELEASE = ''; @ISA = qw(Exporter); %EXPORT_TAGS = ( @@ -1466,12 +1466,12 @@ my %systemTagsNotes = ( PrintConv => sub { my ($mask, $val) = (0400, oct(shift)); my %types = ( - 0010000 => 'p', - 0020000 => 'c', - 0040000 => 'd', - 0060000 => 'b', - 0120000 => 'l', - 0140000 => 's', + 0010000 => 'p', # FIFO + 0020000 => 'c', # character special file + 0040000 => 'd', # directory + 0060000 => 'b', # block special file + 0120000 => 'l', # sym link + 0140000 => 's', # socket link ); my $str = $types{$val & 0170000} || '-'; while ($mask) { @@ -7290,7 +7290,10 @@ sub ProcessJPEG($$;$) last; # all done parsing file } elsif (defined $markerLenBytes{$marker}) { # handle other stand-alone markers and segments we skipped over - $verbose and $marker and print $out "${indent}JPEG $markerName\n"; + if ($verbose and $marker) { + next if $verbose < 4 and ($marker & 0xf8) == 0xd0; + print $out "${indent}JPEG $markerName\n"; + } next; } elsif ($marker == 0xdb and length($$segDataPt) and # DQT # save the DQT data only if JPEGDigest has been requested diff --git a/bin/lib/Image/ExifTool/InDesign.pm b/bin/lib/Image/ExifTool/InDesign.pm index 2131fef..51f8ec2 100644 --- a/bin/lib/Image/ExifTool/InDesign.pm +++ b/bin/lib/Image/ExifTool/InDesign.pm @@ -14,7 +14,7 @@ use strict; use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.08'; +$VERSION = '1.09'; # map for writing metadata to InDesign files (currently only write XMP) my %indMap = ( @@ -104,9 +104,10 @@ sub ProcessIND($$) # this must be null padding or we have a possible error last if $hdr =~ /^\0+$/; # (could be up to 4095 bytes of non-null garbage plus 4095 null bytes from ExifTool) - $raf->Read($buff, 8196) and $hdr .= $buff; + $raf->Read($buff, 8192) and $hdr .= $buff; + my $n = length $hdr; $hdr =~ s/\0+$//; # remove trailing nulls - if (length($hdr) > 4095) { + if ($n > 8190 or length($hdr) > 4095) { $err = 'Corrupt file or unsupported InDesign version'; last; } diff --git a/bin/lib/Image/ExifTool/Jpeg2000.pm b/bin/lib/Image/ExifTool/Jpeg2000.pm index 7428c11..b6cd509 100644 --- a/bin/lib/Image/ExifTool/Jpeg2000.pm +++ b/bin/lib/Image/ExifTool/Jpeg2000.pm @@ -16,7 +16,7 @@ use strict; use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.40'; +$VERSION = '1.41'; sub ProcessJpeg2000Box($$$); sub ProcessJUMD($$$); @@ -574,6 +574,7 @@ my %j2cMarker = ( 2 => { Name => 'CompatibleBrands', Format => 'undef[$size-8]', + List => 1, # (for documentation only) # ignore any entry with a null, and return others as a list ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', }, diff --git a/bin/lib/Image/ExifTool/M2TS.pm b/bin/lib/Image/ExifTool/M2TS.pm index 6b769da..ad62473 100644 --- a/bin/lib/Image/ExifTool/M2TS.pm +++ b/bin/lib/Image/ExifTool/M2TS.pm @@ -328,6 +328,14 @@ sub ParsePID($$$$$) $more = 1; # read past unknown 0x15 packets if ExtractEmbedded > 2 } } +# still have a lot of questions about how to decode this... +# (see https://exiftool.org/forum/index.php?topic=16486 and ../testpics/gps_video/forum16486.ts) +# } elsif ($type == 6) { +# my @a = unpack('x17x2NNx2nx2nx2nx2Cx2a4x2a5x2Nx2Nx2nx2Nx2Nx2Nx2nx2nx2Nx2nx2n', $$dataPt . " "); +# my $hi = shift @a; +# $a[0] = Image::ExifTool::ConvertUnixTime(($a[0] + $hi * 4294967296) * 1e-6, undef, 6); +# print "@a\n"; +# $more = 1; } elsif ($type < 0) { if ($$dataPt =~ /^(.{164})?(.{24})A[NS][EW]/s) { # (Blueskysea B4K, Novatek NT96670) diff --git a/bin/lib/Image/ExifTool/QuickTime.pm b/bin/lib/Image/ExifTool/QuickTime.pm index a84648b..2561df2 100644 --- a/bin/lib/Image/ExifTool/QuickTime.pm +++ b/bin/lib/Image/ExifTool/QuickTime.pm @@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; use Image::ExifTool::GPS; -$VERSION = '3.02'; +$VERSION = '3.03'; sub ProcessMOV($$;$); sub ProcessKeys($$$); @@ -935,6 +935,7 @@ my %userDefined = ( 2 => { Name => 'CompatibleBrands', Format => 'undef[$size-8]', + List => 1, # (for documentation only) # ignore any entry with a null, and return others as a list ValueConv => 'my @a=($val=~/.{4}/sg); @a=grep(!/\0/,@a); \@a', }, @@ -2551,7 +2552,7 @@ my %userDefined = ( TTID => { Name => 'TomTomID', ValueConv => 'unpack("x4H*",$val)' }, TTVI => { Name => 'TomTomVI', Format => 'int32u', Unknown => 1 }, # seen: "0 1 61 508 508" # TTVD seen: "normal 720p 60fps 60fps 16/9 wide 1x" - TTVD => { Name => 'TomTomVD', ValueConv => 'my @a = ($val =~ /[\x20-\x7f]+/g); "@a"' }, + TTVD => { Name => 'TomTomVD', ValueConv => 'my @a = ($val =~ /[\x20-\x7f]+/g); "@a"', List => 1 }, ); # User-specific media data atoms (ref 11) @@ -9151,7 +9152,7 @@ sub HandleItemInfo($) $et->ProcessDirectory(\%dirInfo, $subTable, $proc); delete $$et{DOC_NUM}; } - $raf->Seek($curPos, 0); # seek back to original position + $raf->Seek($curPos, 0) or $et->Warn('Seek error'), last; # seek back to original position pop @{$$et{PATH}}; } # process the item properties now that we should know their associations and document numbers @@ -9577,7 +9578,7 @@ sub ProcessMOV($$;$) if ($tag eq 'ftyp' and $size >= 12) { # read ftyp atom to see what type of file this is if ($raf->Read($buff, $size-8) == $size-8) { - $raf->Seek(-($size-8), 1); + $raf->Seek(-($size-8), 1) or $et->Warn('Seek error'), return 0; my $type = substr($buff, 0, 4); $$et{save_ftyp} = $type; # see if we know the extension for this file type @@ -9629,7 +9630,7 @@ sub ProcessMOV($$;$) # a zero size isn't legal for contained atoms, but Canon uses it to # terminate the CNTH atom (eg. CanonEOS100D.mov), so tolerate it here my $pos = $raf->Tell() - 4; - $raf->Seek(0,2); + $raf->Seek(0,2) or $et->Warn('Seek error'), return 0; my $str = $$dirInfo{DirName} . ' with ' . ($raf->Tell() - $pos) . ' bytes'; $et->VPrint(0,"$$et{INDENT}\[Terminator found in $str remaining]"); } else { @@ -9638,7 +9639,7 @@ sub ProcessMOV($$;$) if ($$tagTablePtr{"$tag-size"}) { my $pos = $raf->Tell(); unless ($fast) { - $raf->Seek(0, 2); + $raf->Seek(0, 2) or $et->Warn('Seek error'), return 0; $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos); } $et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"}; diff --git a/bin/lib/Image/ExifTool/Sony.pm b/bin/lib/Image/ExifTool/Sony.pm index bb2b912..1e3dad3 100644 --- a/bin/lib/Image/ExifTool/Sony.pm +++ b/bin/lib/Image/ExifTool/Sony.pm @@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; use Image::ExifTool::Minolta; -$VERSION = '3.69'; +$VERSION = '3.70'; sub ProcessSRF($$$); sub ProcessSR2($$$); @@ -170,6 +170,7 @@ sub PrintInvLensSpec($;$$); 32885 => 'Sony FE 16-35mm F2.8 GM II', #JR 32886 => 'Sony FE 300mm F2.8 GM OSS', #JR 32887 => 'Sony E PZ 16-50mm F3.5-5.6 OSS II', #JR + 32888 => 'Sony FE 85mm F1.4 GM II', #JR # (comment this out so LensID will report the LensModel, which is more useful) # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount) @@ -241,6 +242,8 @@ sub PrintInvLensSpec($;$$); 49474.9 => 'Viltrox 75mm F1.2 E', #JR '49474.10' => 'Viltrox 20mm F2.8 FE', #JR 49475 => 'Tamron 50-300mm F4.5-6.3 Di III VC VXD', #JR (Model A069) + 49476 => 'Tamron 28-300mm F4-7.1 Di III VC VXD', #JR (Model A074) + 49477 => 'Tamron 90mm F2.8 Di III Macro VXD', #JR (Model F072) 49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01) 49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01) @@ -299,6 +302,7 @@ sub PrintInvLensSpec($;$$); 50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023) 50548 => 'Sigma 15mm F1.4 DG DN DIAGONAL FISHEYE | A', #JR (024) 50549 => 'Sigma 50mm F1.2 DG DN | A', #JR (024) + 50550 => 'Sigma 28-105mm F2.8 DG DN | A', #JR (024) 50551 => 'Sigma 28-45mm F1.8 DG DN | A', #JR (024) 50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR @@ -315,6 +319,7 @@ sub PrintInvLensSpec($;$$); 51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR 51006 => 'Voigtlander APO-LANTHAR 35mm F2 Aspherical', #JR 51007 => 'Voigtlander NOKTON 50mm F1 Aspherical', #JR + 51008 => 'Voigtlander NOKTON 75mm F1.5 Aspherical', #JR # lenses listed in the Sigma MC-11 list, but not yet seen: # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014) diff --git a/bin/lib/Image/ExifTool/TagNames.pod b/bin/lib/Image/ExifTool/TagNames.pod index 45238ae..3eca97c 100644 --- a/bin/lib/Image/ExifTool/TagNames.pod +++ b/bin/lib/Image/ExifTool/TagNames.pod @@ -26108,7 +26108,7 @@ the image undisplayable. ------ -------- -------- 0 MajorBrand no 1 MinorVersion no - 2 CompatibleBrands no + 2 CompatibleBrands no+ =head3 Jpeg2000 ImageHeader Tags @@ -30230,7 +30230,7 @@ Tags found in Pittasoft Blackvue dashcam "free" data. ------ -------- -------- 0 MajorBrand no 1 MinorVersion no - 2 CompatibleBrands no + 2 CompatibleBrands no+ =head3 QuickTime OtherMeta Tags @@ -31280,7 +31280,7 @@ Tags found in TomTom Bandit Action Cam MP4 videos. 'TTAD' TomTomAD QuickTime Stream 'TTHL' TomTomHL? no 'TTID' TomTomID no - 'TTVD' TomTomVD no + 'TTVD' TomTomVD no+ 'TTVI' TomTomVI? no =head3 QuickTime HintTrackInfo Tags diff --git a/bin/lib/Image/ExifTool/WritePDF.pl b/bin/lib/Image/ExifTool/WritePDF.pl index b2b222d..30b00f0 100644 --- a/bin/lib/Image/ExifTool/WritePDF.pl +++ b/bin/lib/Image/ExifTool/WritePDF.pl @@ -184,11 +184,19 @@ ($) { my $dict = shift; my %xrefFree; - # from the start we have only written xref stream entries in 'CNn' format, - # so we can simplify things for now and only support this type of entry + # we write xref stream entries in 'CNn' or 'CNNn' format (with 8-byte 'NN' offset), my $w = $$dict{W}; - if (ref $w eq 'ARRAY' and "@$w" eq '1 4 2') { - my $size = $$dict{_entry_size}; # this will be 7 for 'CNn' + if (ref $w eq 'ARRAY') { + my $bytes = "@$w"; + my $fmt; + if ($bytes eq '1 4 2') { + $fmt = 'CNn'; + } elsif ($bytes eq '1 8 2') { + $fmt = 'CNNn'; + } else { + return \%xrefFree; + } + my $size = $$dict{_entry_size}; # this will be 7 for 'CNn' or 11 for 'CNNn' my $index = $$dict{Index}; my $len = length $$dict{_stream}; # scan the table for free objects @@ -200,7 +208,12 @@ ($) my $count = $$index[$i*2+1]; for ($j=0; $j<$count; ++$j) { last if $pos + $size > $len; - my @t = unpack("x$pos CNn", $$dict{_stream}); + my @t = unpack("x$pos $fmt", $$dict{_stream}); + if (@t == 4) { + $t[1] = $t[1] * 4294967296 + $t[2]; + $t[2] = $t[3]; + @t = 3; + } # add entry if object was free $xrefFree{$start+$j} = [ $t[1], $t[2], 'f' ] if $t[0] == 0; $pos += $size; # step to next entry @@ -657,24 +670,37 @@ ($$) $newXRef{$nextObject++} = [ Tell($outfile) - $$et{PDFBase} + length($/), 0, 'n' ]; $$mainDict{Size} = $nextObject; # create xref stream and Index entry - $$mainDict{W} = [ 1, 4, 2 ]; # int8u, int32u, int16u ('CNn') - $$mainDict{Index} = [ ]; - $$mainDict{_stream} = ''; - my @ids = sort { $a <=> $b } keys %newXRef; - while (@ids) { - my $startID = $ids[0]; - for (;;) { - $id = shift @ids; - my ($pos, $gen, $type) = @{$newXRef{$id}}; - if ($pos > 0xffffffff) { - $et->Error('Huge files not yet supported'); - last; + my $bits = 4; +Restart: for (;;) { + $$mainDict{W} = [ 1, $bits, 2 ]; # int8u, int32u/int64u, int16u ('CNn' or 'CNNn') + $$mainDict{Index} = [ ]; + $$mainDict{_stream} = ''; + my @ids = sort { $a <=> $b } keys %newXRef; + while (@ids) { + my $startID = $ids[0]; + for (;;) { + $id = shift @ids; + my ($pos, $gen, $type) = @{$newXRef{$id}}; + if ($pos > 0xffffffff) { + if ($bits == 4) { + # switch to 64-bit integer offsets + $bits = 8; + next Restart; + } + } + if ($bits == 4) { + $$mainDict{_stream} .= pack('CNn', $type eq 'f' ? 0 : 1, $pos, $gen); + } else { + my $hi = int($pos / 4294967296); + my $lo = $pos - $hi * 4294967296; + $$mainDict{_stream} .= pack('CNNn', $type eq 'f' ? 0 : 1, $hi, $lo, $gen); + } + last if not @ids or $ids[0] != $id + 1; } - $$mainDict{_stream} .= pack('CNn', $type eq 'f' ? 0 : 1, $pos, $gen); - last if not @ids or $ids[0] != $id + 1; + # add Index entries for this section of the xref stream + push @{$$mainDict{Index}}, $startID, $id - $startID + 1; } - # add Index entries for this section of the xref stream - push @{$$mainDict{Index}}, $startID, $id - $startID + 1; + last; } # write the xref stream object $keyExt = "$id 0 obj"; # (set anyway, but xref stream should NOT be encrypted) diff --git a/bin/lib/Image/ExifTool/XMP.pm b/bin/lib/Image/ExifTool/XMP.pm index 1a7a87a..72201f6 100644 --- a/bin/lib/Image/ExifTool/XMP.pm +++ b/bin/lib/Image/ExifTool/XMP.pm @@ -50,7 +50,7 @@ use Image::ExifTool::Exif; use Image::ExifTool::GPS; require Exporter; -$VERSION = '3.66'; +$VERSION = '3.67'; @ISA = qw(Exporter); @EXPORT_OK = qw(EscapeXML UnescapeXML); @@ -3777,8 +3777,13 @@ sub ParseXMPElement($$$;$$$$) # extract property attributes my ($parseResource, %attrs, @attrs); - while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) { - my ($attr, $val) = ($1, $3); +# this hangs Perl (v5.18.4) for a specific capture string [patched in ExifTool 12.98] +# while ($attrs =~ m/(\S+?)\s*=\s*(['"])(.*?)\2/sg) { + while ($attrs =~ /(\S+?)\s*=\s*(['"])/g) { + my ($attr, $quote) = ($1, $2); + my $p0 = pos($attrs); + last unless $attrs =~ /$quote/g; + my $val = substr($attrs, $p0, pos($attrs)-$p0-1); # handle namespace prefixes (defined by xmlns:PREFIX, or used with PREFIX:tag) if ($attr =~ /(.*?):/) { if ($1 eq 'xmlns') { diff --git a/bin/perl-Image-ExifTool.spec b/bin/perl-Image-ExifTool.spec index 0be43d0..200d941 100644 --- a/bin/perl-Image-ExifTool.spec +++ b/bin/perl-Image-ExifTool.spec @@ -1,6 +1,6 @@ Summary: perl module for image data extraction Name: perl-Image-ExifTool -Version: 12.97 +Version: 12.98 Release: 1 License: Artistic/GPL Group: Development/Libraries/Perl diff --git a/lib/exiftool_vendored/version.rb b/lib/exiftool_vendored/version.rb index 505d25f..71b8bfd 100644 --- a/lib/exiftool_vendored/version.rb +++ b/lib/exiftool_vendored/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module ExiftoolVendored - VERSION = Gem::Version.new('12.97.0') + VERSION = Gem::Version.new('12.98.0') end