exiftool_vendored 12.58.0 → 12.60.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +45 -3
  3. data/bin/MANIFEST +4 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +2 -2
  7. data/bin/config_files/example.config +1 -0
  8. data/bin/exiftool +81 -54
  9. data/bin/lib/Image/ExifTool/CanonRaw.pm +5 -1
  10. data/bin/lib/Image/ExifTool/DJI.pm +2 -2
  11. data/bin/lib/Image/ExifTool/Exif.pm +53 -14
  12. data/bin/lib/Image/ExifTool/FlashPix.pm +27 -9
  13. data/bin/lib/Image/ExifTool/FujiFilm.pm +6 -3
  14. data/bin/lib/Image/ExifTool/Geotag.pm +30 -7
  15. data/bin/lib/Image/ExifTool/LIF.pm +10 -2
  16. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -1
  17. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
  18. data/bin/lib/Image/ExifTool/Nikon.pm +6 -5
  19. data/bin/lib/Image/ExifTool/Olympus.pm +87 -7
  20. data/bin/lib/Image/ExifTool/PNG.pm +10 -2
  21. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
  22. data/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
  23. data/bin/lib/Image/ExifTool/QuickTime.pm +21 -6
  24. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +37 -5
  25. data/bin/lib/Image/ExifTool/RIFF.pm +32 -11
  26. data/bin/lib/Image/ExifTool/Ricoh.pm +2 -1
  27. data/bin/lib/Image/ExifTool/SigmaRaw.pm +9 -3
  28. data/bin/lib/Image/ExifTool/Sony.pm +2 -1
  29. data/bin/lib/Image/ExifTool/TagLookup.pm +2254 -2246
  30. data/bin/lib/Image/ExifTool/TagNames.pod +45 -25
  31. data/bin/lib/Image/ExifTool/WriteExif.pl +13 -13
  32. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  33. data/bin/lib/Image/ExifTool/Writer.pl +111 -19
  34. data/bin/lib/Image/ExifTool/XMP.pm +18 -3
  35. data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
  36. data/bin/lib/Image/ExifTool.pm +109 -17
  37. data/bin/lib/Image/ExifTool.pod +40 -5
  38. data/bin/perl-Image-ExifTool.spec +1 -1
  39. data/lib/exiftool_vendored/version.rb +1 -1
  40. metadata +2 -2
@@ -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.58';
32
+ $VERSION = '12.60';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -75,6 +75,7 @@ sub GetAllGroups($;$);
75
75
  sub GetNewGroups($);
76
76
  sub GetDeleteGroups();
77
77
  sub AddUserDefinedTags($%);
78
+ sub SetAlternateFile($$$);
78
79
  # non-public routines below
79
80
  sub InsertTagValues($$$;$$$);
80
81
  sub IsWritable($);
@@ -113,6 +114,7 @@ sub WriteTIFF($$$);
113
114
  sub PackUTF8(@);
114
115
  sub UnpackUTF8($);
115
116
  sub SetPreferredByteOrder($;$);
117
+ sub ImageDataMD5($$$;$$);
116
118
  sub CopyBlock($$$);
117
119
  sub CopyFileAttrs($$$);
118
120
  sub TimeNow(;$$);
@@ -1824,8 +1826,12 @@ my %systemTagsNotes = (
1824
1826
  ImageDataMD5 => {
1825
1827
  Notes => q{
1826
1828
  MD5 of image data. Generated only if specifically requested for JPEG and
1827
- TIFF-based images, except Panasonic raw for now. Includes image data,
1828
- OtherImage and JpgFromRaw in the MD5, but not ThumbnailImage or PreviewImage
1829
+ TIFF-based images, PNG, CRW, CR3, MRW, RAF, X3F and AVIF images, MOV/MP4
1830
+ videos, and some RIFF-based files. The MD5 includes the main image data,
1831
+ plus JpgFromRaw/OtherImage for some formats, but does not include
1832
+ ThumbnailImage or PreviewImage. Includes video and audio data for MOV/MP4.
1833
+ The L<XMP-et:OriginalImageMD5 tag|XMP.html#ExifTool> provides a place to
1834
+ store these values in the file.
1829
1835
  },
1830
1836
  },
1831
1837
  );
@@ -2052,6 +2058,7 @@ sub new
2052
2058
  $$self{FILE_SEQUENCE} = 0; # sequence number for files when reading
2053
2059
  $$self{FILES_WRITTEN} = 0; # count of files successfully written
2054
2060
  $$self{INDENT2} = ''; # indentation of verbose messages from SetNewValue
2061
+ $$self{ALT_EXIFTOOL} = { }; # alternate exiftool objects
2055
2062
 
2056
2063
  # initialize our new groups for writing
2057
2064
  $self->SetNewGroups(@defaultWriteGroups);
@@ -2496,6 +2503,23 @@ sub ExtractInfo($;@)
2496
2503
  }
2497
2504
  }
2498
2505
  ++$$self{FILE_SEQUENCE}; # count files read
2506
+ # extract information from alternate files if necessary
2507
+ my ($g8, $altExifTool);
2508
+ foreach $g8 (keys %{$$self{ALT_EXIFTOOL}}) {
2509
+ $altExifTool = $$self{ALT_EXIFTOOL}{$g8};
2510
+ next if $$altExifTool{DID_EXTRACT}; # avoid extracting twice
2511
+ $$altExifTool{OPTIONS} = $$self{OPTIONS};
2512
+ $$altExifTool{GLOBAL_TIME_OFFSET} = $$self{GLOBAL_TIME_OFFSET};
2513
+ $$altExifTool{REQ_TAG_LOOKUP} = $$self{REQ_TAG_LOOKUP};
2514
+ $altExifTool->ExtractInfo($$altExifTool{ALT_FILE});
2515
+ # set family 8 group name for all tags
2516
+ foreach (keys %{$$altExifTool{VALUE}}) {
2517
+ my $ex = $$altExifTool{TAG_EXTRA}{$_};
2518
+ $ex or $ex = $$altExifTool{TAG_EXTRA}{$_} = { };
2519
+ $$ex{G8} = $g8;
2520
+ }
2521
+ $$altExifTool{DID_EXTRACT} = 1;
2522
+ }
2499
2523
  }
2500
2524
 
2501
2525
  my $filename = $$self{FILENAME}; # image file name ('' if already open)
@@ -3520,6 +3544,10 @@ sub GetGroup($$;$)
3520
3544
  $groups[6] = $$ex{G6};
3521
3545
  }
3522
3546
  }
3547
+ if ($$ex{G8}) {
3548
+ $groups[7] = '';
3549
+ $groups[8] = $$ex{G8};
3550
+ }
3523
3551
  # generate tag ID group names unless obviously not needed
3524
3552
  unless ($noID) {
3525
3553
  my $id = $$tagInfo{KeysID} || $$tagInfo{TagID};
@@ -3705,13 +3733,21 @@ COMPOSITE_TAG:
3705
3733
  next COMPOSITE_TAG;
3706
3734
  }
3707
3735
  }
3736
+ my ($i, $key, @keys, $altFile);
3737
+ my $et = $self;
3738
+ # get tags from alternate file if a family 8 group was specified
3739
+ if ($reqTag =~ /\b(File\d+):/i and $$self{ALT_EXIFTOOL}{$1}) {
3740
+ $et = $$self{ALT_EXIFTOOL}{$1};
3741
+ $altFile = $1;
3742
+ }
3708
3743
  # (CAREFUL! keys may not be sequential if one was deleted)
3709
- my ($i, $key, @keys);
3710
- for ($key=$name, $i=$$self{DUPL_TAG}{$name} || 0; ; --$i) {
3711
- push @keys, $key if defined $$rawValue{$key};
3744
+ for ($key=$name, $i=$$et{DUPL_TAG}{$name} || 0; ; --$i) {
3745
+ push @keys, $key if defined $$et{VALUE}{$key};
3712
3746
  last if $i <= 0;
3713
3747
  $key = "$name ($i)";
3714
3748
  }
3749
+ # make sure the necessary information is available from the alternate file
3750
+ $self->CopyAltInfo($altFile, \@keys) if $altFile;
3715
3751
  # find first matching tag
3716
3752
  $key = $self->GroupMatches($reqGroup, \@keys);
3717
3753
  $reqTag = $key || "$name (0)";
@@ -4153,7 +4189,11 @@ sub SplitFileName($)
4153
4189
  } else {
4154
4190
  ($name = $file) =~ tr/\\/\//;
4155
4191
  # remove path
4156
- $dir = length($1) ? $1 : '/' if $name =~ s/(.*)\///;
4192
+ if ($name =~ s/(.*)\///) {
4193
+ $dir = length($1) ? $1 : '/';
4194
+ } else {
4195
+ $dir = '.';
4196
+ }
4157
4197
  }
4158
4198
  return ($dir, $name);
4159
4199
  }
@@ -4568,6 +4608,29 @@ sub RemoveTagsFromList($$$$;$)
4568
4608
  $_[0] = \@filteredTags; # update tag list
4569
4609
  }
4570
4610
 
4611
+ #------------------------------------------------------------------------------
4612
+ # Copy tags from alternate input file
4613
+ # Inputs: 0) ExifTool ref, 1) family 8 group, 2) list ref for tag keys to copy
4614
+ # - updates tag key list to match keys newly added to $self
4615
+ sub CopyAltInfo($$$)
4616
+ {
4617
+ my ($self, $g8, $tags) = @_;
4618
+ my ($tag, $vtag);
4619
+ return unless $g8 =~ /(\d+)/;
4620
+ my $et = $$self{ALT_EXIFTOOL}{$g8} or return;
4621
+ my $altOrder = ($1 + 1) * 100000; # increment file order
4622
+ foreach $tag (@$tags) {
4623
+ ($vtag = $tag) =~ s/( |$)/ #[$g8]/;
4624
+ unless (defined $$self{VALUE}{$vtag}) {
4625
+ $$self{VALUE}{$vtag} = $$et{VALUE}{$tag};
4626
+ $$self{TAG_INFO}{$vtag} = $$et{TAG_INFO}{$tag};
4627
+ $$self{TAG_EXTRA}{$vtag} = $$et{TAG_EXTRA}{$tag} || { };
4628
+ $$self{FILE_ORDER}{$vtag} = ($$et{FILE_ORDER}{$tag} || 0) + $altOrder;
4629
+ }
4630
+ $tag = $vtag;
4631
+ }
4632
+ }
4633
+
4571
4634
  #------------------------------------------------------------------------------
4572
4635
  # Set list of found tags from previously requested tags
4573
4636
  # Inputs: 0) ExifTool object reference
@@ -4594,11 +4657,17 @@ sub SetFoundTags($)
4594
4657
  my $tagHash = $$self{VALUE};
4595
4658
  my $reqTag;
4596
4659
  foreach $reqTag (@$reqTags) {
4597
- my (@matches, $group, $allGrp, $allTag, $byValue);
4660
+ my (@matches, $group, $allGrp, $allTag, $byValue, $g8);
4661
+ my $et = $self;
4598
4662
  if ($reqTag =~ /^(.*):(.+)/) {
4599
4663
  ($group, $tag) = ($1, $2);
4600
4664
  if ($group =~ /^(\*|all)$/i) {
4601
4665
  $allGrp = 1;
4666
+ } elsif ($reqTag =~ /\bfile(\d+):/i) {
4667
+ $g8 = "File$1";
4668
+ $et = $$self{ALT_EXIFTOOL}{$g8} || $self;
4669
+ $fileOrder = $$et{FILE_ORDER};
4670
+ $tagHash = $$et{VALUE};
4602
4671
  } elsif ($group !~ /^[-\w:]*$/) {
4603
4672
  $self->Warn("Invalid group name '${group}'");
4604
4673
  $group = 'invalid';
@@ -4640,7 +4709,7 @@ sub SetFoundTags($)
4640
4709
  }
4641
4710
  if (defined $group and not $allGrp) {
4642
4711
  # keep only specified group
4643
- @matches = $self->GroupMatches($group, \@matches);
4712
+ @matches = $et->GroupMatches($group, \@matches);
4644
4713
  next unless @matches or not $allTag;
4645
4714
  }
4646
4715
  if (@matches > 1) {
@@ -4649,9 +4718,9 @@ sub SetFoundTags($)
4649
4718
  # return only the highest priority tag unless duplicates wanted
4650
4719
  unless ($doDups or $allTag or $allGrp) {
4651
4720
  $tag = shift @matches;
4652
- my $oldPriority = $$self{PRIORITY}{$tag} || 1;
4721
+ my $oldPriority = $$et{PRIORITY}{$tag} || 1;
4653
4722
  foreach (@matches) {
4654
- my $priority = $$self{PRIORITY}{$_};
4723
+ my $priority = $$et{PRIORITY}{$_};
4655
4724
  $priority = 1 unless defined $priority;
4656
4725
  next unless $priority >= $oldPriority;
4657
4726
  $tag = $_;
@@ -4665,6 +4734,13 @@ sub SetFoundTags($)
4665
4734
  # bogus file order entry to avoid warning if sorting in file order
4666
4735
  $$self{FILE_ORDER}{$matches[0]} = 9999;
4667
4736
  }
4737
+ # copy over necessary information for tags from alternate files
4738
+ if ($g8) {
4739
+ $self->CopyAltInfo($g8, \@matches);
4740
+ # restore variables to original values for main file
4741
+ $fileOrder = $$self{FILE_ORDER};
4742
+ $tagHash = $$self{VALUE};
4743
+ }
4668
4744
  # save indices of tags extracted by value
4669
4745
  push @byValue, scalar(@$rtnTags) .. (scalar(@$rtnTags)+scalar(@matches)-1) if $byValue;
4670
4746
  # save indices of wildcard tags
@@ -6347,7 +6423,6 @@ sub ProcessJPEG($$)
6347
6423
  {
6348
6424
  local $_;
6349
6425
  my ($self, $dirInfo) = @_;
6350
- my ($ch, $s, $length);
6351
6426
  my $options = $$self{OPTIONS};
6352
6427
  my $verbose = $$options{Verbose};
6353
6428
  my $out = $$options{TextOut};
@@ -6356,12 +6431,16 @@ sub ProcessJPEG($$)
6356
6431
  my $req = $$self{REQ_TAG_LOOKUP};
6357
6432
  my $htmlDump = $$self{HTML_DUMP};
6358
6433
  my %dumpParms = ( Out => $out );
6434
+ my ($ch, $s, $length, $md5, $md5size);
6359
6435
  my ($success, $wantTrailer, $trailInfo, $foundSOS, %jumbfChunk);
6360
6436
  my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
6361
- my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP, $md5);
6437
+ my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
6362
6438
 
6363
6439
  # get pointer to MD5 object if it exists and we are the top-level JPEG
6364
- $md5 = $$self{ImageDataMD5} if $$self{FILE_TYPE} eq 'JPEG' and not $$self{DOC_NUM};
6440
+ if ($$self{FILE_TYPE} eq 'JPEG' and not $$self{DOC_NUM}) {
6441
+ $md5 = $$self{ImageDataMD5};
6442
+ $md5size = 0;
6443
+ }
6365
6444
 
6366
6445
  # check to be sure this is a valid JPG (or J2C, or EXV) file
6367
6446
  return 0 unless $raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/;
@@ -6441,8 +6520,19 @@ sub ProcessJPEG($$)
6441
6520
  $nextSegPos = $raf->Tell();
6442
6521
  $len -= 4; # subtract size of length word
6443
6522
  last unless $raf->Seek($len, 1);
6444
- } elsif ($md5 and defined $marker and ($marker == 0x00 or $marker == 0xda)) {
6445
- $md5->add($buff); # (note: this includes the terminating 0xff's)
6523
+ } elsif ($md5 and defined $marker and ($marker == 0x00 or $marker == 0xda or
6524
+ ($marker >= 0xd0 and $marker <= 0xd7)))
6525
+ {
6526
+ # calculate MD5 for image data (includes leading ff d9 but not trailing ff da)
6527
+ $md5->add("\xff" . chr($marker));
6528
+ my $n = $skipped - (length($buff) - 1); # number of extra 0xff's
6529
+ if (not $n) {
6530
+ $buff = substr($buff, 0, -1); # remove trailing 0xff
6531
+ } elsif ($n > 1) {
6532
+ $buff .= "\xff" x ($n - 1); # add back extra 0xff's
6533
+ }
6534
+ $md5->add($buff);
6535
+ $md5size += $skipped + 2;
6446
6536
  }
6447
6537
  # read second segment too if this was the first
6448
6538
  next unless defined $marker;
@@ -6735,7 +6825,7 @@ sub ProcessJPEG($$)
6735
6825
  } elsif ($marker == 0xe1) { # APP1 (EXIF, XMP, QVCI, PARROT)
6736
6826
  # (some Kodak cameras don't put a second "\0", and I have seen an
6737
6827
  # example where there was a second 4-byte APP1 segment header)
6738
- if ($$segDataPt =~ /^(.{0,4})Exif\0/is) {
6828
+ if ($$segDataPt =~ /^(.{0,4})Exif\0./is) {
6739
6829
  undef $dumpType; # (will be dumped here)
6740
6830
  # this is EXIF data --
6741
6831
  # get the data block (into a common variable)
@@ -7457,6 +7547,8 @@ sub ProcessJPEG($$)
7457
7547
  delete $extendedXMP{$guid};
7458
7548
  }
7459
7549
  }
7550
+ # print verbose MD5 message if necessary
7551
+ print $out "$$self{INDENT}(ImageDataMD5: $md5size bytes of JPEG image data)\n" if $md5size and $verbose;
7460
7552
  # calculate JPEGDigest if requested
7461
7553
  if (@dqt) {
7462
7554
  require Image::ExifTool::JPEGDigest;
@@ -1727,10 +1727,11 @@ sensitive, and may be prefixed by one or more family 0, 1, 2 or 7 group
1727
1727
  names with optional leading family numbers, separated by colons (eg.
1728
1728
  'exif:iso'). A leading '-' indicates tags to be excluded (eg. '-comment'),
1729
1729
  or a trailing '#' causes the ValueConv value to be copied (same as setting
1730
- the Type option to 'ValueConv' for this tag only). Wildcards ('*' and '?')
1731
- may be used in the tag name. A tag name of '*' is commonly used when a
1732
- group is specified to copy all tags in the group (eg. 'XMP:*'). A special
1733
- feature allows tag names of the form 'DSTTAGE<lt>SRCTAG' (or
1730
+ the Type option to 'ValueConv' for this tag only). A leading '+' sets the
1731
+ Replace option to 0 on a per-tag basis (see Options below). Wildcards ('*'
1732
+ and '?') may be used in the tag name. A tag name of '*' is commonly used
1733
+ when a group is specified to copy all tags in the group (eg. 'XMP:*'). A
1734
+ special feature allows tag names of the form 'DSTTAGE<lt>SRCTAG' (or
1734
1735
  'SRCTAGE<gt>DSTTAG') to be specified to copy information to a tag with a
1735
1736
  different name or a specified group. Both 'SRCTAG' and 'DSTTAG' may contain
1736
1737
  wildcards and/or be prefixed by a group name (eg.
@@ -1769,7 +1770,9 @@ copies all information while preserving the original family 1 groups, while
1769
1770
  The options are the same was for L</SetNewValue>, and are passed directly
1770
1771
  to L</SetNewValue> internally, with a few exceptions:
1771
1772
 
1772
- - The Replace option defaults to 1 instead of 0 as with L</SetNewValue>.
1773
+ - The Replace option defaults to 1 instead of 0 as with L</SetNewValue>,
1774
+ however the tag name argument may be prefixed with '+' to set the Replace
1775
+ option to 0 for this argument only.
1773
1776
 
1774
1777
  - The AddValue or DelValue option is set for individual tags if '+>' or '->'
1775
1778
  (or '+E<lt>' or '-E<lt>') are used.
@@ -1870,6 +1873,31 @@ None.
1870
1873
 
1871
1874
  =back
1872
1875
 
1876
+ =head2 SetAlternateFile
1877
+
1878
+ Specify alternate file from which to read metadata. Tags from the alternate
1879
+ file are available after L</ExtractInfo> is called or during a call to
1880
+ L</SetNewValuesFromFile> by using a family 8 group name (eg. 'File1' in the
1881
+ example below).
1882
+
1883
+ $exifTool->SetAlternateFile(File1 => 'images/test1.jpg');
1884
+
1885
+ =over 4
1886
+
1887
+ =item Inputs:
1888
+
1889
+ 0) ExifTool object reference
1890
+
1891
+ 1) Family 8 group name, case insensitive (eg. 'File1', 'File2'...)
1892
+
1893
+ 2) Name of alternate input file, or undef to reset
1894
+
1895
+ =item Return Values:
1896
+
1897
+ 1 on success, or 0 if the group name is invalid.
1898
+
1899
+ =back
1900
+
1873
1901
  =head2 SetFileModifyDate
1874
1902
 
1875
1903
  Write the filesystem modification or creation time from the new value of the
@@ -2088,6 +2116,7 @@ The group family numbers are currently available:
2088
2116
  5) Metadata Path (eg. JPEG-APP1-IFD0-ExifIFD)
2089
2117
  6) EXIF/TIFF Format (eg. int8u, int32u, undef, string)
2090
2118
  7) Tag ID (eg. ID-271, ID-rights, ID-a9aut)
2119
+ 8) Alternate File Number (eg. File1, File2, File3...)
2091
2120
 
2092
2121
  Families 0 and 1 are based on the file structure, and are similar except
2093
2122
  that family 1 is more specific and sub-divides some groups to give more
@@ -2140,6 +2169,8 @@ non-numerical ID's may or may not have characters other than [-_A-Za-z0-9]
2140
2169
  converted to hex. Note that unlike other group names, the tag ID's of
2141
2170
  family 7 group names are case sensitive (but the leading "ID-" is not).
2142
2171
 
2172
+ Family 8 specifies the alternate file set from a call to L</SetAlternateFile>.
2173
+
2143
2174
  See L</GetAllGroups [static]> for complete lists of group names.
2144
2175
 
2145
2176
  =back
@@ -2392,6 +2423,10 @@ leading "0x" if the HexTagIDs option is set, or decimal otherwise.
2392
2423
  Characters in non-numerical ID's which are not valid in a group name are
2393
2424
  returned as 2 hex digits.)
2394
2425
 
2426
+ =item Family 8 (Alternate File):
2427
+
2428
+ File#
2429
+
2395
2430
  =back
2396
2431
 
2397
2432
  Note: This function may also be called as an ExifTool member function to
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.58
3
+ Version: 12.60
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.58.0')
4
+ VERSION = Gem::Version.new('12.60.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.58.0
4
+ version: 12.60.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: 2023-03-15 00:00:00.000000000 Z
12
+ date: 2023-04-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool