From 31cab57d2bfafe736384ce3a0b2d57c18f18cb72 Mon Sep 17 00:00:00 2001 From: morozgrafix Date: Sun, 9 Jun 2024 20:52:05 -0700 Subject: [PATCH] Upgrading to exiftool v12.86 --- bin/Changes | 11 ++++ bin/META.json | 2 +- bin/META.yml | 2 +- bin/README | 4 +- bin/config_files/example.config | 5 ++ bin/exiftool | 4 +- bin/lib/Image/ExifTool.pm | 71 ++++++++++++++--------- bin/lib/Image/ExifTool.pod | 27 +++++---- bin/lib/Image/ExifTool/BuildTagLookup.pm | 5 +- bin/lib/Image/ExifTool/Canon.pm | 31 +++++++++- bin/lib/Image/ExifTool/CanonVRD.pm | 5 +- bin/lib/Image/ExifTool/ID3.pm | 72 +++++++++++++----------- bin/lib/Image/ExifTool/Olympus.pm | 44 +++++++++------ bin/lib/Image/ExifTool/QuickTime.pm | 11 ++-- bin/lib/Image/ExifTool/Samsung.pm | 30 +++++++++- bin/lib/Image/ExifTool/TagLookup.pm | 8 +-- bin/lib/Image/ExifTool/TagNames.pod | 64 ++++++++++----------- bin/lib/Image/ExifTool/WriteIPTC.pl | 2 +- bin/perl-Image-ExifTool.spec | 2 +- lib/exiftool_vendored/version.rb | 2 +- 20 files changed, 252 insertions(+), 150 deletions(-) diff --git a/bin/Changes b/bin/Changes index 1ef0f56..7d4c2d7 100644 --- a/bin/Changes +++ b/bin/Changes @@ -7,6 +7,17 @@ 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.) +June 7, 2024 - Version 12.86 + + - Added a new value for a couple of Olympus tags (thanks Herb) + - Improved handling of ID3 user-defined tags + - Decode all JPEG segments from RICO box in Ricoh MOV videos + - Decode a few new values for some tags written by Canon EOS R cameras + - 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 + May 21, 2024 - Version 12.85 - Added GeolocationFeatureType tag diff --git a/bin/META.json b/bin/META.json index 5d0587d..853f4d8 100644 --- a/bin/META.json +++ b/bin/META.json @@ -50,5 +50,5 @@ } }, "release_status" : "stable", - "version" : "12.85" + "version" : "12.86" } diff --git a/bin/META.yml b/bin/META.yml index 17c64bd..60081dd 100644 --- a/bin/META.yml +++ b/bin/META.yml @@ -31,4 +31,4 @@ recommends: Time::HiRes: 0 requires: perl: 5.004 -version: 12.85 +version: 12.86 diff --git a/bin/README b/bin/README index a57cbd9..bbceb9e 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.85.tar.gz | tar -xf - - cd Image-ExifTool-12.85 + gzip -dc Image-ExifTool-12.86.tar.gz | tar -xf - + cd Image-ExifTool-12.86 ./exiftool t/images/ExifTool.jpg Note: These commands extract meta information from one of the test images. diff --git a/bin/config_files/example.config b/bin/config_files/example.config index 607ecc9..553ba04 100644 --- a/bin/config_files/example.config +++ b/bin/config_files/example.config @@ -293,6 +293,11 @@ NewXMPxxxStructX => { Name => 'SomeOtherName', Flat => 1 }, ); +# the namespace may be registered so ExifTool generates the expected family 1 +# group names when reading if the UserDefined namespace uses a different prefix +require Image::ExifTool::XMP; +Image::ExifTool::XMP::RegisterNamespace(\%Image::ExifTool::UserDefined::xxx); + # Adding a new MIE group requires a few extra definitions use Image::ExifTool::MIE; %Image::ExifTool::UserDefined::MIETest = ( diff --git a/bin/exiftool b/bin/exiftool index 77ee326..f4492bb 100755 --- a/bin/exiftool +++ b/bin/exiftool @@ -11,7 +11,7 @@ use strict; use warnings; require 5.004; -my $version = '12.85'; +my $version = '12.86'; # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool' my $exePath; @@ -5678,7 +5678,7 @@ with this command: produces output like this: - -- Generated by ExifTool 12.85 -- + -- Generated by ExifTool 12.86 -- 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 diff --git a/bin/lib/Image/ExifTool.pm b/bin/lib/Image/ExifTool.pm index 4108ad0..1e64578 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.85'; +$VERSION = '12.86'; $RELEASE = ''; @ISA = qw(Exporter); %EXPORT_TAGS = ( @@ -6859,11 +6859,12 @@ sub DirStart($$;$) #------------------------------------------------------------------------------ # Extract metadata from a jpg image # Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set +# 2) tag table ref to process JPEG-like metadata # Returns: 1 on success, 0 if this wasn't a valid JPEG file -sub ProcessJPEG($$) +sub ProcessJPEG($$;$) { local $_; - my ($self, $dirInfo) = @_; + my ($self, $dirInfo, $optionalTagTable) = @_; my $options = $$self{OPTIONS}; my $verbose = $$options{Verbose}; my $out = $$options{TextOut}; @@ -6871,20 +6872,29 @@ sub ProcessJPEG($$) my $raf = $$dirInfo{RAF}; my $req = $$self{REQ_TAG_LOOKUP}; my $htmlDump = $$self{HTML_DUMP}; - my %dumpParms = ( Out => $out ); - my ($ch, $s, $length, $hash, $hashsize); + my %dumpParms = ( Out => $out, Prefix => $$self{INDENT} ); + my ($ch, $s, $length, $hash, $hashsize, $indent); my ($success, $wantTrailer, $trailInfo, $foundSOS, $gotSize, %jumbfChunk); my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal); my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP); + ($indent = $$self{INDENT}) =~ s/ $//; + unless ($raf) { + $raf = File::RandomAccess->new($$dirInfo{DataPt}); + $self->VerboseDir('JPEG', undef, length(${$$dirInfo{DataPt}})); + } # get pointer to hash object if it exists and we are the top-level JPEG or JP2 if ($$self{FILE_TYPE} =~ /^(JPEG|JP2)$/ and not $$self{DOC_NUM}) { $hash = $$self{ImageDataHash}; $hashsize = 0; } - # check to be sure this is a valid JPG (or J2C, or EXV) file - return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/; + if ($raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/) { + undef $optionalTagTable; + } else { + return 0 unless $optionalTagTable and $s =~ /^\xff[\xe0-\xef]/; + $raf->Seek(-2, 1) or $self->Error('Seek error'), return 1; + } if ($s eq "\xff\x01") { return 0 unless $raf->Read($s, 5) == 5 and $s eq 'Exiv2'; $$self{FILE_TYPE} = 'EXV'; @@ -6902,7 +6912,7 @@ sub ProcessJPEG($$) $$raf{NoBuffer} = 1 if $self->Options('FastScan'); # disable buffering in FastScan mode $dumpParms{MaxLen} = 128 if $verbose < 4; - if ($htmlDump) { + if ($htmlDump and not $optionalTagTable) { $dumpEnd = $raf->Tell(); my ($n, $t, $m) = $s eq 'Exiv2' ? (7,'EXV','TEM') : (2,'JPEG','SOI'); my $pos = $dumpEnd - $n; @@ -6921,6 +6931,7 @@ sub ProcessJPEG($$) Marker: for (;;) { # set marker and data pointer for current segment my $marker = $nextMarker; + last if $marker and $marker < 0; my $segDataPt = $nextSegDataPt; my $segPos = $nextSegPos; my $skipped; @@ -6929,12 +6940,17 @@ sub ProcessJPEG($$) # # read ahead to the next segment unless we have reached EOI, SOS or SOD # - unless ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer and not $hash) or + until ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer and not $hash) or $marker==0x93)) { # read up to next marker (JPEG markers begin with 0xff) my $buff; - $raf->ReadLine($buff) or last; + unless ($raf->ReadLine($buff)) { + last Marker unless $optionalTagTable; + $nextMarker = -1; + $success = 1; + last; + } $skipped = length($buff) - 1; # JPEG markers can be padded with unlimited 0xff's for (;;) { @@ -6946,21 +6962,21 @@ sub ProcessJPEG($$) # read segment data if it exists if (not defined $markerLenBytes{$nextMarker}) { # read record length word - last unless $raf->Read($s, 2) == 2; + last Marker unless $raf->Read($s, 2) == 2; my $len = unpack('n',$s); # get data length - last unless defined($len) and $len >= 2; + last Marker unless defined($len) and $len >= 2; $nextSegPos = $raf->Tell(); $len -= 2; # subtract size of length word - last unless $raf->Read($buff, $len) == $len; + last Marker unless $raf->Read($buff, $len) == $len; $nextSegDataPt = \$buff; # set pointer to our next data } elsif ($markerLenBytes{$nextMarker} == 4) { # handle J2C extensions with 4-byte length word - last unless $raf->Read($s, 4) == 4; + last Marker unless $raf->Read($s, 4) == 4; my $len = unpack('N',$s); # get data length - last unless defined($len) and $len >= 4; + last Marker unless defined($len) and $len >= 4; $nextSegPos = $raf->Tell(); $len -= 4; # subtract size of length word - last unless $raf->Seek($len, 1); + last Marker unless $raf->Seek($len, 1); } elsif ($hash and defined $marker and ($marker == 0x00 or $marker == 0xda or ($marker >= 0xd0 and $marker <= 0xd7))) { @@ -6976,7 +6992,8 @@ sub ProcessJPEG($$) $hashsize += $skipped + 2; } # read second segment too if this was the first - next unless defined $marker; + next Marker unless defined $marker; + last; } # set some useful variables for the current segment my $markerName = JpegMarkerName($marker); @@ -6996,7 +7013,7 @@ sub ProcessJPEG($$) if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) { $length = length $$segDataPt; if ($verbose) { - print $out "JPEG $markerName ($length bytes):\n"; + print $out "${indent}JPEG $markerName ($length bytes):\n"; HexDump($segDataPt, undef, %dumpParms, Addr=>$segPos) if $verbose>2; } elsif ($htmlDump) { $self->HDump($segPos-4, $length+4, "[JPEG $markerName]", undef, 0x08); @@ -7039,7 +7056,7 @@ sub ProcessJPEG($$) next; } elsif ($marker == 0xd9) { # EOI pop @$path; - $verbose and print $out "JPEG EOI\n"; + $verbose and print $out "${indent}JPEG EOI\n"; my $pos = $raf->Tell(); $$self{TrailerStart} = $pos unless $$self{DOC_NUM}; if ($htmlDump and $dumpEnd) { @@ -7100,7 +7117,7 @@ sub ProcessJPEG($$) # adjust PreviewImageStart to this location my $actual = $pos + pos($buff) - 4; if ($start and $start ne $actual and $verbose > 1) { - print $out "(Fixed PreviewImage location: $start -> $actual)\n"; + print $out "${indent}(Fixed PreviewImage location: $start -> $actual)\n"; } # update preview image offsets if ($start) { @@ -7154,7 +7171,7 @@ sub ProcessJPEG($$) pop @$path; $foundSOS = 1; # all done with meta information unless we have a trailer - $verbose and print $out "JPEG SOS\n"; + $verbose and print $out "${indent}JPEG SOS\n"; unless ($fast) { $trailInfo = IdentifyTrailer($raf); # process trailer now unless we are doing verbose dump @@ -7194,7 +7211,7 @@ sub ProcessJPEG($$) last; # all done parsing file } elsif ($marker == 0x93) { pop @$path; - $verbose and print $out "JPEG SOD\n"; + $verbose and print $out "${indent}JPEG SOD\n"; $success = 1; if ($hash and $$self{FILE_TYPE} eq 'JP2') { my $pos = $raf->Tell(); @@ -7205,7 +7222,7 @@ 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 "JPEG $markerName\n"; + $verbose and $marker and 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 @@ -7225,7 +7242,7 @@ sub ProcessJPEG($$) $length = length $$segDataPt; $appBytes += $length + 4 if ($marker & 0xf0) == 0xe0; # total size of APP segments if ($verbose) { - print $out "JPEG $markerName ($length bytes):\n"; + print $out "${indent}JPEG $markerName ($length bytes):\n"; if ($verbose > 2) { my %extraParms = ( Addr => $segPos ); $extraParms{MaxLen} = 128 if $verbose == 4; @@ -7383,7 +7400,7 @@ sub ProcessJPEG($$) # some software erroneously writes zeros for the chunk counts) my $chunkNum = Get8u($segDataPt, 6); my $chunksTot = Get8u($segDataPt, 7) + 1; # (note the "+ 1"!) - $verbose and printf $out "$$self{INDENT}FLIR chunk %d of %d\n", + $verbose and printf $out "${indent}FLIR chunk %d of %d\n", $chunkNum + 1, $chunksTot; if (defined $flirTotal) { # abort parsing FLIR if the total chunk count is inconsistent @@ -7448,7 +7465,7 @@ sub ProcessJPEG($$) # some software erroneously writes zeros for the chunk counts) my $chunkNum = Get8u($segDataPt, 12); my $chunksTot = Get8u($segDataPt, 13); - $verbose and print $out "$$self{INDENT}ICC_Profile chunk $chunkNum of $chunksTot\n"; + $verbose and print $out "${indent}ICC_Profile chunk $chunkNum of $chunksTot\n"; if (defined $iccChunksTotal) { # abort parsing ICC_Profile if the total chunk count is inconsistent undef $iccChunkCount if $chunksTot != $iccChunksTotal; @@ -8001,7 +8018,7 @@ sub ProcessJPEG($$) } } # print verbose hash message if necessary - print $out "$$self{INDENT}(ImageDataHash: $hashsize bytes of JPEG image data)\n" if $hashsize and $verbose; + print $out "${indent}(ImageDataHash: $hashsize bytes of JPEG image data)\n" if $hashsize and $verbose; # calculate JPEGDigest if requested if (@dqt) { require Image::ExifTool::JPEGDigest; diff --git a/bin/lib/Image/ExifTool.pod b/bin/lib/Image/ExifTool.pod index c0b6827..2fc75c7 100644 --- a/bin/lib/Image/ExifTool.pod +++ b/bin/lib/Image/ExifTool.pod @@ -2540,20 +2540,19 @@ RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR, Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh, SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado, Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent, -Track#, UserData, UserDefined, VCalendar, VCard, VNote, Version0, Vorbis, -WTV, XML, XMP, XMP-DICOM, XMP-Device, XMP-GAudio, XMP-GCamera, -XMP-GCreations, XMP-GDepth, XMP-GFocus, XMP-GImage, XMP-GPano, -XMP-GSpherical, XMP-LImage, XMP-MP, XMP-MP1, XMP-PixelLive, XMP-aas, -XMP-acdsee, XMP-album, XMP-apple-fi, XMP-ast, XMP-aux, XMP-cc, XMP-cell, -XMP-crd, XMP-creatorAtom, XMP-crs, XMP-dc, XMP-dex, XMP-digiKam, -XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif, XMP-exifEX, XMP-expressionmedia, -XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr, XMP-hdrgm, XMP-ics, XMP-iptcCore, -XMP-iptcExt, XMP-lr, XMP-mediapro, XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, -XMP-mwg-rs, XMP-nine, XMP-panorama, XMP-pdf, XMP-pdfx, XMP-photomech, -XMP-photoshop, XMP-plus, XMP-pmi, XMP-prism, XMP-prl, XMP-prm, XMP-pur, -XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff, XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, -XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote, XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, -ZIP, iTunes +Track#, UserData, VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP, +XMP-DICOM, XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth, +XMP-GFocus, XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP, +XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi, +XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs, +XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif, +XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr, +XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro, +XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama, +XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi, +XMP-prism, XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff, +XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote, +XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes =item Family 2 (Category): diff --git a/bin/lib/Image/ExifTool/BuildTagLookup.pm b/bin/lib/Image/ExifTool/BuildTagLookup.pm index e97226e..73be58e 100644 --- a/bin/lib/Image/ExifTool/BuildTagLookup.pm +++ b/bin/lib/Image/ExifTool/BuildTagLookup.pm @@ -35,7 +35,7 @@ use Image::ExifTool::Sony; use Image::ExifTool::Validate; use Image::ExifTool::MacOS; -$VERSION = '3.56'; +$VERSION = '3.57'; @ISA = qw(Exporter); sub NumbersFirst($$); @@ -600,7 +600,8 @@ running ExifTool the old information may be removed permanently using the DNG => q{ The main DNG tags are found in the EXIF table. The tables below define only information found within structures of these main DNG tag values. See -L for the official DNG specification. +L for the official +DNG specification. }, MPEG => q{ The MPEG format doesn't specify any file-level meta information. In lieu of diff --git a/bin/lib/Image/ExifTool/Canon.pm b/bin/lib/Image/ExifTool/Canon.pm index 2b6f6ee..d4f11cb 100644 --- a/bin/lib/Image/ExifTool/Canon.pm +++ b/bin/lib/Image/ExifTool/Canon.pm @@ -88,7 +88,7 @@ sub ProcessCTMD($$$); sub ProcessExifInfo($$$); sub SwapWords($); -$VERSION = '4.75'; +$VERSION = '4.76'; # Note: Removed 'USM' from 'L' lenses since it is redundant - PH # (or is it? Ref 32 shows 5 non-USM L-type lenses) @@ -9001,20 +9001,32 @@ my %filterConv = ( 4 => 'Focus High Priority', }, }, - 7 => { #52 + 7 => [{ #forum16068 Name => 'USMLensElectronicMF', + Condition => '$$self{Model} =~ /EOS R\d/', + Notes => 'EOS R models', + PrintConv => { + 0 => 'Disable After One-Shot', + 1 => 'One-Shot -> Enabled', + 2 => 'One-Shot -> Enabled (magnify)', + 3 => 'Disable in AF Mode', + }, + },{ #52 + Name => 'USMLensElectronicMF', + Notes => 'Other models', PrintConv => { 0 => 'Enable After AF', 1 => 'Disable After AF', 2 => 'Disable in AF Mode', }, - }, + }], 8 => { #52 Name => 'AFAssistBeam', PrintConv => { 0 => 'Enable', 1 => 'Disable', 2 => 'IR AF Assist Beam Only', + 3 => 'LED AF Assist Beam Only', #forum16068 }, }, 9 => { #52 @@ -9113,6 +9125,19 @@ my %filterConv = ( 2 => 'Auto', #PH (1DXmkII) }, }, + 20 => { #forum16068 + Name => 'SubjectToDetect', + PrintConv => { + 0 => 'None', + 1 => 'People', + 2 => 'Animals', + 3 => 'Vehicles', + }, + }, + 24 => { #forum16068 + Name => 'EyeDetection', + PrintConv => \%offOn, + }, ); # RAW burst mode info (MakerNotes tag 0x403f) (ref 25) diff --git a/bin/lib/Image/ExifTool/CanonVRD.pm b/bin/lib/Image/ExifTool/CanonVRD.pm index 76a155a..a6a015d 100644 --- a/bin/lib/Image/ExifTool/CanonVRD.pm +++ b/bin/lib/Image/ExifTool/CanonVRD.pm @@ -1212,9 +1212,9 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9"; 4 => 'Emphasize Center', }, }, + 0x2070b => { Name => 'DiffractionCorrectionOn', %noYes }, # 0x20800 - fmt=1: 0 # 0x20801 - fmt=1: 0 - 0x2070b => { Name => 'DiffractionCorrectionOn', %noYes }, 0x20900 => 'ColorHue', 0x20901 => 'SaturationAdj', 0x20910 => 'RedHSL', @@ -1282,6 +1282,9 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9"; # 0xf0521 - DLO data # 0xf0520 - DLO data # 0xf0530 - created when dust delete data applied (4 bytes, all zero) + # 0xf0561 - 1932 bytes, related to Partial Adjustment Tool Palette (ref forum15660) + # 0xf0562 - 1596 bytes, related to Partial Adjustment Tool Palette (ref forum15660) + # 0xf0566 - 1520 bytes, related to Partial Adjustment Tool Palette (ref forum15660) # 0xf0600 - fmt=253 (2308 bytes, JPG images) # 0xf0601 - fmt=253 (2308 bytes, JPG images) # 0x1ff52c - values: 129,130,132 (related to custom picture style somehow) diff --git a/bin/lib/Image/ExifTool/ID3.pm b/bin/lib/Image/ExifTool/ID3.pm index c71781d..f3cdf29 100644 --- a/bin/lib/Image/ExifTool/ID3.pm +++ b/bin/lib/Image/ExifTool/ID3.pm @@ -18,7 +18,7 @@ use strict; use vars qw($VERSION); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.61'; +$VERSION = '1.62'; sub ProcessID3v2($$$); sub ProcessPrivate($$$); @@ -68,6 +68,12 @@ my %dateTimeConv = ( PrintConv => '$self->ConvertDateTime($val)', ); +# patch for names of user-defined tags which don't automatically generate very well +my %userTagName = ( + ALBUMARTISTSORT => 'AlbumArtistSort', + ASIN => 'ASIN', +); + # This table is just for documentation purposes %Image::ExifTool::ID3::Main = ( VARS => { NO_ID => 1 }, @@ -103,14 +109,6 @@ my %dateTimeConv = ( }, ); -%Image::ExifTool::ID3::UserDefined = ( - GROUPS => { 1 => 'UserDefined', 2 => 'Other' }, - NOTES => q{ - ID3 user-defined text and URL tags will be dynamically added to this table - by name when found. - }, -); - # Lyrics3 tags (ref 4) %Image::ExifTool::ID3::Lyrics3 = ( GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' }, @@ -501,7 +499,7 @@ my %genre = ( TT2 => 'Title', TT3 => 'Subtitle', TXT => 'Lyricist', - TXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } }, + TXX => 'UserDefinedText', TYE => { Name => 'Year', Groups => { 2 => 'Time' } }, ULT => 'Lyrics', WAF => 'FileURL', @@ -510,7 +508,7 @@ my %genre = ( WCM => 'CommercialURL', WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } }, WPB => 'PublisherURL', - WXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } }, + WXX => 'UserDefinedURL', # the following written by iTunes 10.5 (ref PH) RVA => 'RelativeVolumeAdjustment', TST => 'TitleSortOrder', @@ -613,7 +611,7 @@ my %id3v2_common = ( TRSO => 'InternetRadioStationOwner', TSRC => 'ISRC', # (international standard recording code) TSSE => 'EncoderSettings', - TXXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } }, + TXXX => 'UserDefinedText', # UFID => 'UniqueFileID', (not extracted because it is long and nasty and not very useful) USER => 'TermsOfUse', USLT => 'Lyrics', @@ -625,7 +623,7 @@ my %id3v2_common = ( WORS => 'InternetRadioStationURL', WPAY => 'PaymentURL', WPUB => 'PublisherURL', - WXXX => { SubDirectory => { TagTable => 'Image::ExifTool::ID3::UserDefined' } }, + WXXX => 'UserDefinedURL', # # non-standard frames # @@ -879,6 +877,19 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3'); } } +#------------------------------------------------------------------------------ +# Make tag name for user-defined tag +# Inputs: 0) User defined tag description +# Returns: Tag name +sub MakeTagName($) +{ + my $name = shift; + return $userTagName{$name} if $userTagName{$name}; + $name = ucfirst(lc $name) unless $name =~ /[a-z]/; # convert all uppercase to mixed case + $name =~ s/([a-z])[_ ]([a-z])/$1\U$2/g; + return Image::ExifTool::MakeTagName($name); +} + #------------------------------------------------------------------------------ # Convert ID3v1 text to exiftool character set # Inputs: 0) ExifTool object ref, 1) text string @@ -1255,39 +1266,34 @@ sub ProcessID3v2($$$) # two encoded strings separated by a null my @vals = DecodeString($et, $val); foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; } - $vals[0] .= ' ' if $Image::ExifTool::specialTags{$vals[0]}; - my $tbl = GetTagTable('Image::ExifTool::ID3::UserDefined'); - unless (defined $$tbl{$vals[0]}) { - my $name = Image::ExifTool::MakeTagName($vals[0]); - AddTagToTable($tbl, $vals[0], $name, 1); + if (length $vals[0]) { + $id .= "_$vals[0]"; + $tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($vals[0])); } - $et->HandleTag($tbl, $vals[0], $vals[1]); - next; + $val = $vals[1]; } elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS|GP1|MVI|MVN)$/) { $val = DecodeString($et, $val); } elsif ($id =~ /^(WXX|WXXX)$/) { # one encoded string and one Latin string separated by a null my $enc = unpack('C', $val); - my $url; + my ($tag, $url); if ($enc == 1 or $enc == 2) { - ($val, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s); + ($tag, $url) = ($tag =~ /^(.(?:..)*?)\0\0(.*)/s); } else { - ($val, $url) = ($val =~ /^(..*?)\0(.*)/s); + ($tag, $url) = ($tag =~ /^(..*?)\0(.*)/s); } - unless (defined $val and defined $url) { + unless (defined $tag and defined $url) { $et->Warn("Invalid $id frame value"); next; } - $val = DecodeString($et, $val); - $url =~ s/\0.*//s; - $val .= '_URL'; - my $tbl = GetTagTable('Image::ExifTool::ID3::UserDefined'); - unless (defined $$tbl{$val}) { - my $name = Image::ExifTool::MakeTagName($val); - AddTagToTable($tbl, $val, $name, 1); + $tag = DecodeString($et, $tag); + if (length $tag) { + $id .= "_$tag"; + $tag .= '_URL' unless $tag =~ /url/i; + $tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($tag)); } - $et->HandleTag($tbl, $val, $url); - next; + $url =~ s/\0.*//s; + $val = $url; } elsif ($id =~ /^W/) { $val =~ s/\0.*//s; # truncate at null } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) { diff --git a/bin/lib/Image/ExifTool/Olympus.pm b/bin/lib/Image/ExifTool/Olympus.pm index 201188a..3a0795b 100644 --- a/bin/lib/Image/ExifTool/Olympus.pm +++ b/bin/lib/Image/ExifTool/Olympus.pm @@ -1935,6 +1935,7 @@ my %indexInfo = ( 3 => 'Trains', 4 => 'Birds', 5 => 'Dogs & Cats', + 6 => 'Human', #forum16072 },{ 0 => 'Object Not Found', 1 => 'Object Found', @@ -2842,24 +2843,32 @@ my %indexInfo = ( RawConv => '$val=~s/\0+$//; $val', # (may be null terminated) Count => 4, }, - 0x100 => { Name => 'WB_RBLevels', Writable => 'int16u', Count => 2 }, #6 + 0x100 => { #6 + Name => 'WB_RBLevels', + Writable => 'int16u', + Notes => q{ + These tags store 2 values, red and blue levels, for some models, but 4 + values, presumably RBGG levels, for other models + }, + Count => -1, + }, #6 # 0x101 - in-camera AutoWB unless it is all 0's or all 256's (ref IB) - 0x102 => { Name => 'WB_RBLevels3000K', Writable => 'int16u', Count => 2 }, #11 - 0x103 => { Name => 'WB_RBLevels3300K', Writable => 'int16u', Count => 2 }, #11 - 0x104 => { Name => 'WB_RBLevels3600K', Writable => 'int16u', Count => 2 }, #11 - 0x105 => { Name => 'WB_RBLevels3900K', Writable => 'int16u', Count => 2 }, #11 - 0x106 => { Name => 'WB_RBLevels4000K', Writable => 'int16u', Count => 2 }, #11 - 0x107 => { Name => 'WB_RBLevels4300K', Writable => 'int16u', Count => 2 }, #11 - 0x108 => { Name => 'WB_RBLevels4500K', Writable => 'int16u', Count => 2 }, #11 - 0x109 => { Name => 'WB_RBLevels4800K', Writable => 'int16u', Count => 2 }, #11 - 0x10a => { Name => 'WB_RBLevels5300K', Writable => 'int16u', Count => 2 }, #11 - 0x10b => { Name => 'WB_RBLevels6000K', Writable => 'int16u', Count => 2 }, #11 - 0x10c => { Name => 'WB_RBLevels6600K', Writable => 'int16u', Count => 2 }, #11 - 0x10d => { Name => 'WB_RBLevels7500K', Writable => 'int16u', Count => 2 }, #11 - 0x10e => { Name => 'WB_RBLevelsCWB1', Writable => 'int16u', Count => 2 }, #11 - 0x10f => { Name => 'WB_RBLevelsCWB2', Writable => 'int16u', Count => 2 }, #11 - 0x110 => { Name => 'WB_RBLevelsCWB3', Writable => 'int16u', Count => 2 }, #11 - 0x111 => { Name => 'WB_RBLevelsCWB4', Writable => 'int16u', Count => 2 }, #11 + 0x102 => { Name => 'WB_RBLevels3000K', Writable => 'int16u', Count => -1 }, #11 + 0x103 => { Name => 'WB_RBLevels3300K', Writable => 'int16u', Count => -1 }, #11 + 0x104 => { Name => 'WB_RBLevels3600K', Writable => 'int16u', Count => -1 }, #11 + 0x105 => { Name => 'WB_RBLevels3900K', Writable => 'int16u', Count => -1 }, #11 + 0x106 => { Name => 'WB_RBLevels4000K', Writable => 'int16u', Count => -1 }, #11 + 0x107 => { Name => 'WB_RBLevels4300K', Writable => 'int16u', Count => -1 }, #11 + 0x108 => { Name => 'WB_RBLevels4500K', Writable => 'int16u', Count => -1 }, #11 + 0x109 => { Name => 'WB_RBLevels4800K', Writable => 'int16u', Count => -1 }, #11 + 0x10a => { Name => 'WB_RBLevels5300K', Writable => 'int16u', Count => -1 }, #11 + 0x10b => { Name => 'WB_RBLevels6000K', Writable => 'int16u', Count => -1 }, #11 + 0x10c => { Name => 'WB_RBLevels6600K', Writable => 'int16u', Count => -1 }, #11 + 0x10d => { Name => 'WB_RBLevels7500K', Writable => 'int16u', Count => -1 }, #11 + 0x10e => { Name => 'WB_RBLevelsCWB1', Writable => 'int16u', Count => -1 }, #11 + 0x10f => { Name => 'WB_RBLevelsCWB2', Writable => 'int16u', Count => -1 }, #11 + 0x110 => { Name => 'WB_RBLevelsCWB3', Writable => 'int16u', Count => -1 }, #11 + 0x111 => { Name => 'WB_RBLevelsCWB4', Writable => 'int16u', Count => -1 }, #11 0x113 => { Name => 'WB_GLevel3000K', Writable => 'int16u' }, #11 0x114 => { Name => 'WB_GLevel3300K', Writable => 'int16u' }, #11 0x115 => { Name => 'WB_GLevel3600K', Writable => 'int16u' }, #11 @@ -3246,6 +3255,7 @@ my %indexInfo = ( 3 => 'Trains', 4 => 'Birds', 5 => 'Dogs & Cats', + 6 => 'Human', #forum16072 },{ 0 => 'Face Priority', 1 => 'Target Priority', diff --git a/bin/lib/Image/ExifTool/QuickTime.pm b/bin/lib/Image/ExifTool/QuickTime.pm index 5699aa7..a0a97a2 100644 --- a/bin/lib/Image/ExifTool/QuickTime.pm +++ b/bin/lib/Image/ExifTool/QuickTime.pm @@ -503,6 +503,11 @@ my %eeBox2 = ( # image types in AVIF and HEIC files my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 ); +my %userDefined = ( + ALBUMARTISTSORT => 'AlbumArtistSort', + ASIN => 'ASIN', +); + # QuickTime atoms %Image::ExifTool::QuickTime::Main = ( PROCESS_PROC => \&ProcessMOV, @@ -2336,10 +2341,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 ); Name => 'RicohInfo', Condition => '$$valPt =~ /^\xff\xe1..Exif\0\0/s', SubDirectory => { - TagTable => 'Image::ExifTool::Exif::Main', - ProcessProc => \&Image::ExifTool::ProcessTIFF, - Start => 10, - Base => '$start', + TagTable => 'Image::ExifTool::JPEG::Main', + ProcessProc => \&Image::ExifTool::ProcessJPEG, } }, RTHU => { #PH (GR) diff --git a/bin/lib/Image/ExifTool/Samsung.pm b/bin/lib/Image/ExifTool/Samsung.pm index b066b68..413adf2 100644 --- a/bin/lib/Image/ExifTool/Samsung.pm +++ b/bin/lib/Image/ExifTool/Samsung.pm @@ -979,6 +979,7 @@ my %formatMinMax = ( # 0x0800 - unknown (29 bytes) (contains already-extracted EmbeddedAudioFileName) # 0x0830-name - seen '1165724808.pre' # 0x0830 - unknown (164004 bytes) + # 0x08c0-name - seen 'Auto_Enhance_Info' #forum16086 # 0x08d0-name - seen 'Interactive_Panorama_Info' # 0x08d0 - unknown (7984 bytes) # 0x08e0-name - seen 'Panorama_Shot_Info' @@ -988,6 +989,8 @@ my %formatMinMax = ( # 0x0910 - string, seen 'Front_Cam_Selfie_Info' # 0x09e0-name - seen 'Burst_Shot_Info' # 0x09e0 - string, seen '489489125' + # 0x09e1-name - seen 'BurstShot_Best_Photo_Info' #forum16086 + # 0x09f0-name - seen 'Pro_Mode_Info' #forum16086 # 0x0a01-name - seen 'Image_UTC_Data' '0x0a01' => { #forum7161 Name => 'TimeStamp', @@ -999,6 +1002,7 @@ my %formatMinMax = ( '0x0a20' => { Name => 'DualCameraImage', Groups => { 2 => 'Preview' }, Binary => 1 }, '0x0a30-name' => 'EmbeddedVideoType', # ("MotionPhoto_Data") '0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161 + # 0x0a41-name - seen 'BackupRestore_Data' #forum16086 # 0x0aa1-name - seen 'MCC_Data' # 0x0aa1 - seen '204','222','234','302','429' '0x0aa1' => { @@ -1254,15 +1258,39 @@ my %formatMinMax = ( Name => 'DualShotExtra', SubDirectory => { TagTable => 'Image::ExifTool::Samsung::DualShotExtra' }, }, + # 0x0ab4-name - seen 'DualShot_Core_Info' #forum16086 # 0x0ac0-name - seen 'ZoomInOut_Info' (SM-N950U) # 0x0ac0 - 2048 bytes of interesting stuff including firmware version? (SM-N950U) + # 0x0b30-name - seen 'Camera_Sticker_Info' #forum16086 '0x0b40' => { # (SM-N975X front camera) Name => 'SingleShotMeta', SubDirectory => { TagTable => 'Image::ExifTool::Samsung::SingleShotMeta' }, }, # 0x0b41-name - seen 'SingeShot_DepthMap_1' (Yes, "Singe") (SM-N975X front camera) '0x0b41' => { Name => 'SingleShotDepthMap', Binary => 1 }, - # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data' + # 0x0b51-name - seen 'Intelligent_PhotoEditor_Data' #forum16086 + # 0x0b60-name - seen 'UltraWide_PhotoEditor_Data' #forum16086 + # 0x0b90-name - seen 'Document_Scan_Info' #forum16086 + # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap' + # 0x0ba2-name - seen 'Copy_Available_Edit_Info' #forum16086 + # 0x0bc0-name - seen 'Single_Relighting_Bokeh_Info' #forum16086 + # 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086 + # 0x0be0-name - seen 'Livefocus_JDM_Info' #forum16086 + # 0x0bf0-name - seen 'Remaster_Info' #forum16086 + # 0x0c21-name - seen 'Portrait_Effect_Info' #forum16086 + # 0x0c51-name - seen 'Samsung_Capture_Info' #forum16086 + # 0x0c61-name - seen 'Camera_Capture_Mode_Info' #forum16086 + # 0x0c71-name - seen 'Pro_White_Balance_Info' #forum16086 + # 0x0c81-name - seen 'Watermark_Info' #forum16086 + # 0x0cc1-name - seen 'Color_Display_P3' #forum16086 + # 0x0cd2-name - seen 'Photo_HDR_Info' #forum16086 + # 0x0ce1-name - seen 'Gallery_DC_Data' #forum16086 + # 0x0d01-name - seen 'Camera_Scene_Info', 'Camera_Scene_Info2', 'Camera_Scene_Info3' #forum16086 + # 0x0d11-name - seen 'Video_Snapshot_Info' #forum16086 + # 0x0d21-name - seen 'Camera_Scene_Info' #forum16086 + # 0x0d31-name - seen 'Food_Blur_Effect_Info' #forum16086 + # 0x0d91-name - seen 'PEg_Info' #forum16086 + # 0x0da1-name - seen 'Captured_App_Info' #forum16086 # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360) # 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360) # 0x0c81-name - seen 'Watermark_Info' diff --git a/bin/lib/Image/ExifTool/TagLookup.pm b/bin/lib/Image/ExifTool/TagLookup.pm index a98cd6c..e4fa1b0 100644 --- a/bin/lib/Image/ExifTool/TagLookup.pm +++ b/bin/lib/Image/ExifTool/TagLookup.pm @@ -2845,6 +2845,7 @@ my %tagLookup = ( 'externalmetadatalink' => { 526 => 'ExternalMetadataLink' }, 'externalsensorbrightnessvalue' => { 343 => 0x311, 346 => 0x311, 347 => 0x311, 350 => 0x3408 }, 'extrainfoversion' => { 440 => 0x1a }, + 'eyedetection' => { 2 => 0x18 }, 'eyestartaf' => { 187 => 0x40 }, 'fac100per' => { 141 => 0xe94 }, 'fac170per' => { 141 => 0xe93 }, @@ -6716,6 +6717,7 @@ my %tagLookup = ( 'subjectmotion' => { 307 => '78.2', 308 => '78.2', 318 => '78.2', 320 => 0x103, 321 => 0x103, 322 => 0x119 }, 'subjectprogram' => { 184 => 0x22 }, 'subjectreference' => { 134 => 0xc }, + 'subjecttodetect' => { 2 => 0x14 }, 'sublabels1' => { 524 => [\'TagStructure','TagStructureSubLabels'] }, 'sublabels2' => { 524 => [\'TagStructure','TagStructureSubLabelsSubLabels'] }, 'sublabels3' => { 524 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabels'] }, @@ -12694,8 +12696,6 @@ my %tagExists = ( 'tvdb' => 1, 'twelvebit' => 1, 'tx3g' => 1, - 'txx' => 1, - 'txxx' => 1, 'typeoforiginal' => 1, 'typist' => 1, 'uas_lsversionnumber' => 1, @@ -12764,6 +12764,8 @@ my %tagExists = ( 'usercustom2' => 1, 'userdata' => 1, 'userdefinedid' => 1, + 'userdefinedtext' => 1, + 'userdefinedurl' => 1, 'usereffectiverating' => 1, 'userid' => 1, 'userlastplayedtime' => 1, @@ -13060,8 +13062,6 @@ my %tagExists = ( 'writtenby' => 1, 'wwsfamilyname' => 1, 'wwssubfamilyname' => 1, - 'wxx' => 1, - 'wxxx' => 1, 'x' => 1, 'xattrapplemaildatereceived' => 1, 'xattrapplemaildatesent' => 1, diff --git a/bin/lib/Image/ExifTool/TagNames.pod b/bin/lib/Image/ExifTool/TagNames.pod index 5d9cf4e..b433cd6 100644 --- a/bin/lib/Image/ExifTool/TagNames.pod +++ b/bin/lib/Image/ExifTool/TagNames.pod @@ -12,7 +12,7 @@ meta information extracted from or written to a file. =head1 TAG TABLES The tables listed below give the names of all tags recognized by ExifTool. -They contain a total of 27859 tags, with 17442 unique tag names. +They contain a total of 27868 tags, with 17446 unique tag names. B, B or B is given in the first column of each table. A B is the computer-readable equivalent of a tag name, and @@ -11539,6 +11539,8 @@ Information about creative filter settings. 17 VFDisplayIllumination int32s 18 AFStatusViewfinder int32s 19 InitialAFPointInServo int32s + 20 SubjectToDetect int32s + 24 EyeDetection int32s =head3 Canon RawBurstInfo Tags @@ -19839,23 +19841,23 @@ any information found here will be extracted, even if the tag is not listed. Tag ID Tag Name Writable ------ -------- -------- 0x0000 ImageProcessingVersion undef[4] - 0x0100 WB_RBLevels int16u[2] - 0x0102 WB_RBLevels3000K int16u[2] - 0x0103 WB_RBLevels3300K int16u[2] - 0x0104 WB_RBLevels3600K int16u[2] - 0x0105 WB_RBLevels3900K int16u[2] - 0x0106 WB_RBLevels4000K int16u[2] - 0x0107 WB_RBLevels4300K int16u[2] - 0x0108 WB_RBLevels4500K int16u[2] - 0x0109 WB_RBLevels4800K int16u[2] - 0x010a WB_RBLevels5300K int16u[2] - 0x010b WB_RBLevels6000K int16u[2] - 0x010c WB_RBLevels6600K int16u[2] - 0x010d WB_RBLevels7500K int16u[2] - 0x010e WB_RBLevelsCWB1 int16u[2] - 0x010f WB_RBLevelsCWB2 int16u[2] - 0x0110 WB_RBLevelsCWB3 int16u[2] - 0x0111 WB_RBLevelsCWB4 int16u[2] + 0x0100 WB_RBLevels int16u[n] + 0x0102 WB_RBLevels3000K int16u[n] + 0x0103 WB_RBLevels3300K int16u[n] + 0x0104 WB_RBLevels3600K int16u[n] + 0x0105 WB_RBLevels3900K int16u[n] + 0x0106 WB_RBLevels4000K int16u[n] + 0x0107 WB_RBLevels4300K int16u[n] + 0x0108 WB_RBLevels4500K int16u[n] + 0x0109 WB_RBLevels4800K int16u[n] + 0x010a WB_RBLevels5300K int16u[n] + 0x010b WB_RBLevels6000K int16u[n] + 0x010c WB_RBLevels6600K int16u[n] + 0x010d WB_RBLevels7500K int16u[n] + 0x010e WB_RBLevelsCWB1 int16u[n] + 0x010f WB_RBLevelsCWB2 int16u[n] + 0x0110 WB_RBLevelsCWB3 int16u[n] + 0x0111 WB_RBLevelsCWB4 int16u[n] 0x0113 WB_GLevel3000K int16u 0x0114 WB_GLevel3300K int16u 0x0115 WB_GLevel3600K int16u @@ -23188,7 +23190,8 @@ The following tags are decoded in unsupported maker notes. Use the Unknown The main DNG tags are found in the EXIF table. The tables below define only information found within structures of these main DNG tag values. See -L for the official DNG specification. +L for the official +DNG specification. =head3 DNG AdobeData Tags @@ -29146,7 +29149,7 @@ ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.) 'TT2' Title no 'TT3' Subtitle no 'TXT' Lyricist no - 'TXX' TXX ID3 UserDefined + 'TXX' UserDefinedText no 'TYE' Year no 'ULT' Lyrics no 'WAF' FileURL no @@ -29155,7 +29158,7 @@ ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.) 'WCM' CommercialURL no 'WCP' CopyrightURL no 'WPB' PublisherURL no - 'WXX' WXX ID3 UserDefined + 'WXX' UserDefinedURL no =head3 ID3 SynLyrics Tags @@ -29167,15 +29170,6 @@ The following tags are extracted from synchronized lyrics/text frames. SynchronizedLyricsText no+ SynchronizedLyricsType no -=head3 ID3 UserDefined Tags - -ID3 user-defined text and URL tags will be dynamically added to this table -by name when found. - - Tag ID Tag Name Writable - ------ -------- -------- - [no tags known] - =head3 ID3 v2_3 Tags ID3 version 2.3 tags. Includes some non-standard tags written by other @@ -29245,7 +29239,7 @@ software. 'TSOC' ComposerSortOrder no 'TSRC' ISRC no 'TSSE' EncoderSettings no - 'TXXX' TXXX ID3 UserDefined + 'TXXX' UserDefinedText no 'TYER' Year no 'USER' TermsOfUse no 'USLT' Lyrics no @@ -29258,7 +29252,7 @@ software. 'WORS' InternetRadioStationURL no 'WPAY' PaymentURL no 'WPUB' PublisherURL no - 'WXXX' WXXX ID3 UserDefined + 'WXXX' UserDefinedURL no 'XDOR' OriginalReleaseTime no 'XOLY' OlympusDSS Olympus DSS 'XSOA' AlbumSortOrder no @@ -29369,7 +29363,7 @@ software. 'TSRC' ISRC no 'TSSE' EncoderSettings no 'TSST' SetSubtitle no - 'TXXX' TXXX ID3 UserDefined + 'TXXX' UserDefinedText no 'USER' TermsOfUse no 'USLT' Lyrics no 'WCOM' CommercialURL no @@ -29381,7 +29375,7 @@ software. 'WORS' InternetRadioStationURL no 'WPAY' PaymentURL no 'WPUB' PublisherURL no - 'WXXX' WXXX ID3 UserDefined + 'WXXX' UserDefinedURL no 'XDOR' OriginalReleaseTime no 'XOLY' OlympusDSS Olympus DSS 'XSOA' AlbumSortOrder no @@ -30765,7 +30759,7 @@ the config file. 'RDTC' RicohRDTC Ricoh RDTC 'RDTG' RicohRDTG Ricoh RDTG 'RDTL' RicohRDTL Ricoh RDTL - 'RICO' RicohInfo EXIF + 'RICO' RicohInfo JPEG 'RMKN' RicohRMKN EXIF 'RTHU' PreviewImage no 'SDLN' PlayMode string diff --git a/bin/lib/Image/ExifTool/WriteIPTC.pl b/bin/lib/Image/ExifTool/WriteIPTC.pl index aec0691..3fcfa02 100644 --- a/bin/lib/Image/ExifTool/WriteIPTC.pl +++ b/bin/lib/Image/ExifTool/WriteIPTC.pl @@ -215,7 +215,7 @@ ($$$$$;$) sub IptcDate($) { my $val = shift; - unless ($val =~ s{^.*(\d{4})[-:/.]?(\d{2})[-:/.]?(\d{2}).*}{$1$2$3}s) { + unless ($val =~ s{^.*?(\d{4})[-:/.]?(\d{2})[-:/.]?(\d{2}).*}{$1$2$3}s) { warn "Invalid date format (use YYYY:mm:dd)\n"; undef $val; } diff --git a/bin/perl-Image-ExifTool.spec b/bin/perl-Image-ExifTool.spec index 7a4f036..d6d2621 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.85 +Version: 12.86 Release: 1 License: Artistic/GPL Group: Development/Libraries/Perl diff --git a/lib/exiftool_vendored/version.rb b/lib/exiftool_vendored/version.rb index eb757f8..36a0aed 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.85.1') + VERSION = Gem::Version.new('12.86.0') end