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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: daebca4fbc1adcea00bcf7dc637e328f4534a115f69a17f10bca60f8a21dee01
4
- data.tar.gz: 512c1da726768d49d97b8262303f8c524b4ea23ccc8c25f1350f93a121813be4
3
+ metadata.gz: 348c2538720f815bacaf609de1dbb52e18f720663ea9e2194c92941b5f80d5ec
4
+ data.tar.gz: 124c2564aba8f2fa4af8b2bf16c654b46624031b38bb64e6ed4ed3d6cc2fb596
5
5
  SHA512:
6
- metadata.gz: 6d29ac70643b583a0d01c512e2054700e15cdf60091042ed4de7c3de85feca75fcd94b2201691a0360875c02b293cc00632c6dce29888e735a488dac50712c70
7
- data.tar.gz: cee8f9dcbe026dc2e5bb1de5db902904c460c6e71cf4ab9ac64b9f2a8357c3857be328912f1deedf3f51c00f99b50f07b463884e60f235f858ef33bf5cd417f7
6
+ metadata.gz: b32a41d3586f914940ddfc5f3f947c323006f627ce6c3a050f34111817776e26a4a5e535f56194998ec38aa5ea7f27e350388fbbd517dd366d826324c9dcd9e4
7
+ data.tar.gz: 9b3d5cb69b62ca6bc41293ec56110e0c28e7510561303bc8c3f3eb0ee01500f5c92dd8ff60ace8f53c54c64a28c92cfa84b0fbebe7238cb190872433c62f4103
data/bin/Changes CHANGED
@@ -4,9 +4,51 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 12.50. (Other versions are
7
+ Note: The most recent production release is Version 12.60. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Apr. 5, 2023 - Version 12.60 (production release)
11
+
12
+ - Added a new Sony FileFormat value
13
+ - Added Validate warning about duplicate EXIF
14
+ - Added ability to edit JPEG APP1 EXIF segment with incorrect header
15
+ - Decode a few new Sony ARW tags
16
+ - Improved -htmldump of non-EXIF-based maker notes
17
+ - Enhanced -geotag from CSV files support GPSSpeed (with variable units),
18
+ "bearing" for GPSTrack, and GPSDateTime in format "dd.mm.YYYY HH:MM:SS"
19
+ - Enhanced ImageDataMD5 to also support CRW, RAF, X3F and AVIF images
20
+ - Enhanced -efile option to also record updated and created file names
21
+ - Family 8 group names may now also be used in Composite Require/Desire tags
22
+ - Fixed handling of undefined tags in -if conditions to conform with
23
+ documentation and match -p and -tagsFromFile behaviour when -m or -f option
24
+ is used
25
+ - Fixed problem where setting the Geotime value didn't work when using an
26
+ advanced-formatting expression containing a greater-than symbol (>)
27
+
28
+ Mar. 28, 2023 - Version 12.59
29
+
30
+ - COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
31
+ to include all data from the SOS to the EOI (including the SOS marker but
32
+ not the EOI marker)
33
+ - Added new -fileNUM option to load tags from alternate files
34
+ - Added family 8 groups for accessing tags from alternate files
35
+ - Added new XMP-et:OriginalImageMD5 tag for storing ImageDataMD5 value
36
+ - Added verbose ImageDataMD5 message for JPEG files
37
+ - Added a new Nikon LensID (thanks Warren Hatch)
38
+ - Decode a new Olympus tag and improved decoding of another (thanks Herb)
39
+ - Decode a couple of new PanasonicRaw tags
40
+ - Decode image coordinates for a couple more VNT object types
41
+ - Enhanced ImageDataMD5 to also support MRW, CR3, IIQ, PNG, MOV/MP4 and some
42
+ RIFF-based files
43
+ - Improved verbose messages when deleting NikonApp trailer
44
+ - Patched to avoid structure warnings when copying tags from Nikon files
45
+ containing NKSC metadata
46
+ - Fixed %-C filename format code to work properly with the -fileOrder and
47
+ -progress options
48
+ - Fixed potential ValueConv warning when reading LIF files
49
+ - API Changes:
50
+ - Added SetAlternateFile method
51
+
10
52
  Mar. 15, 2023 - Version 12.58
11
53
 
12
54
  - Added Extra ImageDataMD5 tag to calculate MD5 of image data only
@@ -171,6 +213,8 @@ Nov. 8, 2022 - Version 12.50 (production release)
171
213
  - Fixed inconsistent year and time zone for Kenwood dashcam timed GPS in MP4
172
214
  videos
173
215
 
216
+ History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
217
+
174
218
  Oct. 19, 2022 - Version 12.49
175
219
 
176
220
  - Added read support for Windows ICO and CUR files
@@ -338,8 +382,6 @@ June 1, 2022 - Version 12.42 (production release)
338
382
  - Patched to allow PDF Encrypt object to be "null"
339
383
  - Fixed bug reading ICC_Profile 'meta' tags
340
384
 
341
- History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
342
-
343
385
  Apr. 7, 2022 - Version 12.41
344
386
 
345
387
  - Added support for "OM SYSTEM" maker notes
data/bin/MANIFEST CHANGED
@@ -530,6 +530,9 @@ t/ExifTool_3.out
530
530
  t/ExifTool_30.out
531
531
  t/ExifTool_31.out
532
532
  t/ExifTool_32.out
533
+ t/ExifTool_33.out
534
+ t/ExifTool_34.out
535
+ t/ExifTool_35.out
533
536
  t/ExifTool_4.out
534
537
  t/ExifTool_5.out
535
538
  t/ExifTool_6.out
@@ -903,6 +906,7 @@ t/Writer_56.out
903
906
  t/Writer_58.out
904
907
  t/Writer_59.out
905
908
  t/Writer_6.out
909
+ t/Writer_60.out
906
910
  t/Writer_7.out
907
911
  t/Writer_9.out
908
912
  t/XMP.t
data/bin/META.json CHANGED
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.58"
50
+ "version" : "12.60"
51
51
  }
data/bin/META.yml CHANGED
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.58
31
+ version: 12.60
data/bin/README CHANGED
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.58.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.58
110
+ gzip -dc Image-ExifTool-12.60.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.60
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
@@ -210,6 +210,7 @@
210
210
  3 => 'PreviewImage (1)',
211
211
  # (if the MPF has 2 previews, MPImage3 could be the larger one)
212
212
  4 => 'MPImage3',
213
+ 5 => 'JpgFromRaw2', # in RW2 from newer Panasonic models
213
214
  },
214
215
  # ValueConv may also be a code reference
215
216
  # Inputs: 0) reference to list of values, 1) ExifTool object
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.58';
14
+ my $version = '12.60';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -103,6 +103,7 @@ my @newValues; # list of new tag values to set
103
103
  my @requestTags; # tags to request (for -p or -if option arguments)
104
104
  my @srcFmt; # source file name format strings
105
105
  my @tags; # list of tags to extract
106
+ my %altFile; # alternate files to extract information (keyed by lower-case family 8 group)
106
107
  my %appended; # list of files appended to
107
108
  my %countLink; # count hard and symbolic links made
108
109
  my %created; # list of files we created
@@ -115,6 +116,7 @@ my %outComma; # flag that output text file needs a comma
115
116
  my %outTrailer; # trailer for output text file
116
117
  my %preserveTime; # preserved timestamps for files
117
118
  my %printFmt; # the contents of the print format file
119
+ my %seqFileDir; # file sequence number in each directory
118
120
  my %setTags; # hash of list references for tags to set from files
119
121
  my %setTagsList; # list of other tag lists for multiple -tagsFromFile from the same file
120
122
  my %usedFileName; # lookup for file names we already used in TestName feature
@@ -196,7 +198,7 @@ my $saveCount; # count the number of times we will/did call SaveNewValues()
196
198
  my $scanWritable; # flag to process only writable file types
197
199
  my $sectHeader; # current section header for -p option
198
200
  my $sectTrailer; # section trailer for -p option
199
- my $seqFileBase; # sequential file number at start of directory
201
+ my $seqFileDir; # sequential file number used for %-C
200
202
  my $seqFileNum; # sequential file number used for %C
201
203
  my $setCharset; # character set setting ('default' if not set and -csv -b used)
202
204
  my $showGroup; # number of group to show (may be zero or '')
@@ -450,6 +452,7 @@ undef %outComma;
450
452
  undef %outTrailer;
451
453
  undef %printFmt;
452
454
  undef %preserveTime;
455
+ undef %seqFileDir;
453
456
  undef %setTags;
454
457
  undef %setTagsList;
455
458
  undef %usedFileName;
@@ -536,7 +539,7 @@ $quiet = 0;
536
539
  $rtnVal = 0;
537
540
  $saveCount = 0;
538
541
  $sectTrailer = '';
539
- $seqFileBase = 0;
542
+ $seqFileDir = 0;
540
543
  $seqFileNum = 0;
541
544
  $tabFormat = 0;
542
545
  $vout = \*STDOUT;
@@ -919,12 +922,14 @@ for (;;) {
919
922
  $mt->Options(Duplicates => 1);
920
923
  next;
921
924
  }
922
- if (/^efile(\d)?(!)?$/i) {
925
+ if (/^efile(\d+)?(!)?$/i) {
923
926
  my $arg = shift;
924
927
  defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
925
- $efile[0] = $arg if not $1 or $1 & 0x01;
926
- $efile[1] = $arg if $1 and $1 & 0x02;
927
- $efile[2] = $arg if $1 and $1 & 0x04;
928
+ $efile[0] = $arg if not $1 or $1 & 0x01;# error
929
+ $efile[1] = $arg if $1 and $1 & 0x02; # unchanged
930
+ $efile[2] = $arg if $1 and $1 & 0x04; # failed -if condition
931
+ $efile[3] = $arg if $1 and $1 & 0x08; # updated
932
+ $efile[4] = $arg if $1 and $1 & 0x016; # created
928
933
  unlink $arg if $2;
929
934
  next;
930
935
  }
@@ -950,6 +955,10 @@ for (;;) {
950
955
  $mt->Options(FastScan => (length $1 ? $1 : 1));
951
956
  next;
952
957
  }
958
+ if (/^(file\d+)$/i) {
959
+ $altFile{lc $1} = shift or Error("Expecting file name for -file option\n"), $badCmd=1, next;
960
+ next;
961
+ }
953
962
  if (/^fileorder(\d*)$/i) {
954
963
  push @fileOrder, shift if @ARGV;
955
964
  my $num = $1 || 0;
@@ -1330,7 +1339,7 @@ for (;;) {
1330
1339
  AddSetTagsFile($setTagsFile = '@') if not $setTagsFile and /(<|>)/;
1331
1340
  if ($setTagsFile) {
1332
1341
  push @{$setTags{$setTagsFile}}, $_;
1333
- if (/>/) {
1342
+ if ($1 eq '>') {
1334
1343
  $useMWG = 1 if /^(.*>\s*)?mwg:/si;
1335
1344
  if (/\b(filename|directory|testname)#?$/i) {
1336
1345
  $doSetFileName = 1;
@@ -1939,7 +1948,7 @@ Exit $rtnValApp; # all done
1939
1948
  sub GetImageInfo($$)
1940
1949
  {
1941
1950
  my ($et, $orig) = @_;
1942
- my (@foundTags, $info, $file, $ind);
1951
+ my (@foundTags, $info, $file, $ind, $g8);
1943
1952
 
1944
1953
  # set window title for this file if necessary
1945
1954
  if (defined $windowTitle and $progressCount >= $progressNext) {
@@ -1982,6 +1991,11 @@ sub GetImageInfo($$)
1982
1991
  } else {
1983
1992
  $file = $orig;
1984
1993
  }
1994
+ # set alternate file names
1995
+ foreach $g8 (sort keys %altFile) {
1996
+ my $altName = FilenameSPrintf($altFile{$g8}, $orig);
1997
+ $et->SetAlternateFile($g8, $altName);
1998
+ }
1985
1999
 
1986
2000
  my $pipe = $file;
1987
2001
  if ($doUnzip) {
@@ -2071,6 +2085,7 @@ sub GetImageInfo($$)
2071
2085
  push @delFiles, $original;
2072
2086
  } elsif ($et->Rename($original, $file)) {
2073
2087
  $verbose and print $vout "Restored from $original\n";
2088
+ EFile($file, 3);
2074
2089
  ++$countGoodWr;
2075
2090
  } else {
2076
2091
  Warn "Error renaming $original\n";
@@ -2080,6 +2095,8 @@ sub GetImageInfo($$)
2080
2095
  return;
2081
2096
  }
2082
2097
  ++$seqFileNum; # increment our file counter
2098
+ my ($dir) = Image::ExifTool::SplitFileName($orig);
2099
+ $seqFileDir = $seqFileDir{$dir} = ($seqFileDir{$dir} || 0) + 1;
2083
2100
 
2084
2101
  my $lineCount = 0;
2085
2102
  my ($fp, $outfile, $append);
@@ -3028,6 +3045,7 @@ sub SetImageInfo($$$)
3028
3045
  $r3 = $et->SetSystemTags($file);
3029
3046
  }
3030
3047
  if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
3048
+ EFile($infile, 3);
3031
3049
  ++$countGoodWr;
3032
3050
  } elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
3033
3051
  EFile($infile);
@@ -3142,6 +3160,7 @@ sub SetImageInfo($$$)
3142
3160
  $preserveTime{$file} = [ $aTime, $mTime, $cTime ];
3143
3161
  }
3144
3162
  }
3163
+ EFile($infile, 3);
3145
3164
  ++$countGoodWr;
3146
3165
  } else {
3147
3166
  close(NEW_FILE);
@@ -3157,6 +3176,7 @@ sub SetImageInfo($$$)
3157
3176
  # simply rename temporary file to replace original
3158
3177
  # (if we didn't already rename it to add "_original")
3159
3178
  } elsif ($et->Rename($tmpFile, $dstFile)) {
3179
+ EFile($infile, 3);
3160
3180
  ++$countGoodWr;
3161
3181
  } else {
3162
3182
  my $newFile = $tmpFile;
@@ -3174,21 +3194,26 @@ sub SetImageInfo($$$)
3174
3194
  # (don't delete tmp file now because it is all we have left)
3175
3195
  ++$countBadWr;
3176
3196
  } else {
3197
+ EFile($infile, 3);
3177
3198
  ++$countGoodWr;
3178
3199
  }
3179
3200
  }
3180
3201
  } elsif ($overwriteOrig) {
3181
3202
  # erase original file
3203
+ EFile($infile, 3);
3182
3204
  $et->Unlink($file) or Warn "Error erasing original $file\n";
3183
3205
  ++$countGoodWr;
3184
3206
  } else {
3207
+ EFile($infile, 4);
3185
3208
  ++$countGoodCr;
3186
3209
  }
3187
3210
  } else {
3188
3211
  # this file was created from scratch, not edited
3212
+ EFile($infile, 4);
3189
3213
  ++$countGoodCr;
3190
3214
  }
3191
3215
  } else {
3216
+ EFile($infile, 3);
3192
3217
  ++$countGoodWr;
3193
3218
  }
3194
3219
  } elsif ($success) {
@@ -3741,8 +3766,6 @@ sub ScanDir($$;$)
3741
3766
  $utf8Name = 1;
3742
3767
  }
3743
3768
  return if $ignore{$dir};
3744
- my $oldBase = $seqFileBase;
3745
- $seqFileBase = $seqFileNum;
3746
3769
  # use Win32::FindFile on Windows if available
3747
3770
  # (ReadDir will croak if there is a wildcard, so check for this)
3748
3771
  if ($^O eq 'MSWin32' and $dir !~ /[*?]/) {
@@ -3774,7 +3797,6 @@ sub ScanDir($$;$)
3774
3797
  # use standard perl library routines to read directory
3775
3798
  unless (opendir(DIR_HANDLE, $dir)) {
3776
3799
  Warn("Error opening directory $dir\n");
3777
- $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
3778
3800
  return;
3779
3801
  }
3780
3802
  @fileList = readdir(DIR_HANDLE);
@@ -3854,8 +3876,6 @@ sub ScanDir($$;$)
3854
3876
  }
3855
3877
  ++$countDir;
3856
3878
  $et->Options(CharsetFileName => $enc); # restore original setting
3857
- # update sequential file base for parent directory
3858
- $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
3859
3879
  }
3860
3880
 
3861
3881
  #------------------------------------------------------------------------------
@@ -4151,16 +4171,15 @@ sub NextUnusedFilename($;$)
4151
4171
  return $fmt unless $fmt =~ /%[-+]?\d*\.?\d*[lun]?[cC]/;
4152
4172
  my %sep = ( '-' => '-', '+' => '_' );
4153
4173
  my ($copy, $alpha) = (0, 'a');
4154
- my $seq = $seqFileNum - 1;
4155
4174
  for (;;) {
4156
4175
  my ($filename, $pos) = ('', 0);
4157
4176
  while ($fmt =~ /(%([-+]?)(\d*)(\.?)(\d*)([lun]?)([cC]))/g) {
4158
4177
  $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
4159
4178
  $pos = pos($fmt);
4160
4179
  my ($sign, $wid, $dec, $wid2, $mod, $tok) = ($2, $3 || 0, $4, $5 || 0, $6, $7);
4161
- my $diff;
4180
+ my $seq;
4162
4181
  if ($tok eq 'C') {
4163
- $diff = $wid - ($sign eq '-' ? $seqFileBase : 0);
4182
+ $seq = $wid + ($sign eq '-' ? $seqFileDir : $seqFileNum) - 1;
4164
4183
  $wid = $wid2;
4165
4184
  } else {
4166
4185
  next unless $dec or $copy;
@@ -4169,13 +4188,13 @@ sub NextUnusedFilename($;$)
4169
4188
  $filename .= $sep{$sign} if $sign;
4170
4189
  }
4171
4190
  if ($mod and $mod ne 'n') {
4172
- my $a = $tok eq 'C' ? Num2Alpha($diff + $seq) : $alpha;
4191
+ my $a = $tok eq 'C' ? Num2Alpha($seq) : $alpha;
4173
4192
  my $str = ($wid and $wid > length $a) ? 'a' x ($wid - length($a)) : '';
4174
4193
  $str .= $a;
4175
4194
  $str = uc $str if $mod eq 'u';
4176
4195
  $filename .= $str;
4177
4196
  } else {
4178
- my $c = $tok eq 'C' ? ($diff + $seq) : $copy;
4197
+ my $c = $tok eq 'C' ? $seq : $copy;
4179
4198
  my $num = $c + ($mod ? 1 : 0);
4180
4199
  $filename .= $wid ? sprintf("%.${wid}d",$num) : $num;
4181
4200
  }
@@ -4431,7 +4450,7 @@ sub ReadStayOpen($)
4431
4450
 
4432
4451
  #------------------------------------------------------------------------------
4433
4452
  # Add new entry to -efile output file
4434
- # Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed)
4453
+ # Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed, 3=updated, 4=created)
4435
4454
  sub EFile($$)
4436
4455
  {
4437
4456
  my $entry = shift;
@@ -4746,6 +4765,7 @@ L<Advanced options|/Advanced options>
4746
4765
  -echo[NUM] TEXT Echo text to stdout or stderr
4747
4766
  -efile[NUM][!] ERRFILE Save names of files with errors
4748
4767
  -execute[NUM] Execute multiple commands on one line
4768
+ -fileNUM ALTFILE Load tags from alternate file
4749
4769
  -list_dir List directories, not their contents
4750
4770
  -srcfile FMT Process a different source file
4751
4771
  -stay_open FLAG Keep reading -@ argfile even after EOF
@@ -5018,16 +5038,14 @@ for list-type tags and conditional replacements because each copy operation
5018
5038
  on a tag overrides any previous operations. While this avoids duplicate
5019
5039
  list items when copying groups of tags from a file containing redundant
5020
5040
  information, it also prevents values of different tags from being copied
5021
- into the same list when this is the intent. So a B<-addTagsFromFile> option
5022
- is provided which allows copying of multiple tags into the same list. eg)
5041
+ into the same list when this is the intent. To accumulate values
5042
+ from different operations into the same list, add a C<+> after the initial
5043
+ C<-> of the argument. For example:
5023
5044
 
5024
- exiftool -addtagsfromfile @ '-subject<make' '-subject<model' ...
5045
+ exiftool -tagsfromfile @ '-subject<make' '-+subject<model' ...
5025
5046
 
5026
- Similarly, B<-addTagsFromFile> must be used when conditionally replacing a
5027
- tag to prevent overriding earlier conditions.
5028
-
5029
- Other than these differences, the B<-tagsFromFile> and B<-addTagsFromFile>
5030
- options are equivalent.
5047
+ Similarly, C<-+DSTTAG> must be used when conditionally replacing a tag to
5048
+ prevent overriding earlier conditions.
5031
5049
 
5032
5050
  6) The B<-a> option (allow duplicate tags) is always in effect when copying
5033
5051
  tags from I<SRCFILE>, but the highest priority tag is always copied last so
@@ -5294,12 +5312,12 @@ escaped. The inverse conversion is applied when writing tags.
5294
5312
 
5295
5313
  =item B<-f> (B<-forcePrint>)
5296
5314
 
5297
- Force printing of tags even if their values are not found. This option only
5298
- applies when specific tags are requested on the command line (ie. not with
5299
- wildcards or by C<-all>). With this option, a dash (C<->) is printed for
5300
- the value of any missing tag, but the dash may be changed via the API
5301
- MissingTagValue option. May also be used to add a 'flags' attribute to the
5302
- B<-listx> output, or to allow tags to be deleted when writing with the
5315
+ Force printing of tags even if they don't exist. This option applies to
5316
+ tags specified on the command line, or with the B<-p>, B<-if> or
5317
+ B<-tagsFromFile> options. When B<-f> is used, the value of any missing tag
5318
+ is set to a dash (C<->) by default, but this may be configured via the API
5319
+ MissingTagValue option. B<-f> is also used to add a 'flags' attribute to
5320
+ the B<-listx> output, or to allow tags to be deleted when writing with the
5303
5321
  B<-csv>=I<CSVFILE> feature.
5304
5322
 
5305
5323
  =item B<-g>[I<NUM>][:I<NUM>...] (B<-groupHeadings>)
@@ -5307,15 +5325,15 @@ B<-csv>=I<CSVFILE> feature.
5307
5325
  Organize output by tag group. I<NUM> specifies a group family number, and
5308
5326
  may be 0 (general location), 1 (specific location), 2 (category), 3
5309
5327
  (document number), 4 (instance number), 5 (metadata path), 6 (EXIF/TIFF
5310
- format) or 7 (tag ID). B<-g0> is assumed if a family number is not
5311
- specified. May be combined with other options to add group names to the
5312
- output. Multiple families may be specified by separating them with colons.
5313
- By default the resulting group name is simplified by removing any leading
5314
- C<Main:> and collapsing adjacent identical group names, but this can be
5315
- avoided by placing a colon before the first family number (eg. B<-g:3:1>).
5316
- Use the B<-listg> option to list group names for a specified family. The
5317
- API SavePath and SaveFormat options are automatically enabled if the
5318
- respective family 5 or 6 group names are requested. See the
5328
+ format), 7 (tag ID) or 8 (file number). B<-g0> is assumed if a family
5329
+ number is not specified. May be combined with other options to add group
5330
+ names to the output. Multiple families may be specified by separating them
5331
+ with colons. By default the resulting group name is simplified by removing
5332
+ any leading C<Main:> and collapsing adjacent identical group names, but this
5333
+ can be avoided by placing a colon before the first family number (eg.
5334
+ B<-g:3:1>). Use the B<-listg> option to list group names for a specified
5335
+ family. The API SavePath and SaveFormat options are automatically enabled
5336
+ if the respective family 5 or 6 group names are requested. See the
5319
5337
  L<API GetGroup documentation|Image::ExifTool/GetGroup> for more information.
5320
5338
 
5321
5339
  =item B<-G>[I<NUM>][:I<NUM>...] (B<-groupNames>)
@@ -5523,7 +5541,7 @@ with this command:
5523
5541
 
5524
5542
  produces output like this:
5525
5543
 
5526
- -- Generated by ExifTool 12.58 --
5544
+ -- Generated by ExifTool 12.60 --
5527
5545
  File: a.jpg - 2003:10:31 15:44:19
5528
5546
  (f/5.6, 1/60s, ISO 100)
5529
5547
  File: b.jpg - 2006:05:23 11:57:38
@@ -6414,12 +6432,12 @@ I<SHIFT> string. For example:
6414
6432
 
6415
6433
  Add features from specified plug-in I<MODULE>. Currently, the MWG module is
6416
6434
  the only plug-in module distributed with exiftool. This module adds
6417
- read/write support for tags as recommended by the Metadata Working Group.
6418
- As a convenience, C<-use MWG> is assumed if the C<MWG> group is specified
6419
- for any tag on the command line. See the L<MWG Tags
6420
- documentation|Image::ExifTool::TagNames/MWG Tags> for more details. Note
6421
- that this option is not reversible, and remains in effect until the
6422
- application terminates, even across the B<-execute> option.
6435
+ read/write support for tags as recommended by the Metadata Working Group. As
6436
+ a convenience, C<-use MWG> is assumed if the group name prefix starts with
6437
+ C<MWG:> exactly for any requested tag. See the
6438
+ L<MWG Tags documentation|Image::ExifTool::TagNames/MWG Tags> for more
6439
+ details. Note that this option is not reversible, and remains in effect
6440
+ until the application terminates, even across the B<-execute> option.
6423
6441
 
6424
6442
  =back
6425
6443
 
@@ -6505,10 +6523,11 @@ exit status of the command (see L</EXIT STATUS>).
6505
6523
 
6506
6524
  Save the names of files giving errors (I<NUM> missing or 1), files that were
6507
6525
  unchanged (I<NUM> is 2), files that fail the B<-if> condition (I<NUM> is 4),
6508
- or any combination thereof by summing I<NUM> (eg. B<-efile3> is the same
6509
- has having both B<-efile> and B<-efile2> options with the same I<ERRFILE>).
6510
- By default, file names are appended to any existing I<ERRFILE>, but
6511
- I<ERRFILE> is overwritten if an exclamation point is added to the option
6526
+ files that were updated (I<NUM> is 8), files that were created (I<NUM> is
6527
+ 16), or any combination thereof by summing I<NUM> (eg. B<-efile3> is the
6528
+ same has having both B<-efile> and B<-efile2> options with the same
6529
+ I<ERRFILE>). By default, file names are appended to any existing I<ERRFILE>,
6530
+ but I<ERRFILE> is overwritten if an exclamation point is added to the option
6512
6531
  (eg. B<-efile!>). Saves the name of the file specified by the B<-srcfile>
6513
6532
  option if applicable.
6514
6533
 
@@ -6523,6 +6542,14 @@ line. I<NUM> is an optional number that is echoed in the "{ready}" message
6523
6542
  when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
6524
6543
  option no longer suppresses the output "{readyNUM}" message.
6525
6544
 
6545
+ =item B<-file>I<NUM> I<ALTFILE>
6546
+
6547
+ Read tags from an alternate source file. These tags are accessed via the
6548
+ family 8 group name (eg. C<File1:TAG> for the B<-file1> option, C<File2:TAG>
6549
+ for B<-file2>, etc). I<ALTFILE> may contain filename formatting codes %d,
6550
+ %f and %e. Among other things, this allows tags from different files to be
6551
+ compared and combined using the B<-if> and B<-p> options.
6552
+
6526
6553
  =item B<-list_dir>
6527
6554
 
6528
6555
  List directories themselves instead of their contents. This option
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::Exif;
22
22
  use Image::ExifTool::Canon;
23
23
 
24
- $VERSION = '1.59';
24
+ $VERSION = '1.60';
25
25
 
26
26
  sub WriteCRW($$);
27
27
  sub ProcessCanonRaw($$$);
@@ -698,6 +698,10 @@ sub ProcessCanonRaw($$$)
698
698
  $format ne 'string' and not $subdir;
699
699
  } else {
700
700
  $valueDataPos = $ptr;
701
+ # do MD5 of image data if requested
702
+ if ($$et{ImageDataMD5} and $tagID == 0x2005) {
703
+ $raf->Seek($ptr, 0) and $et->ImageDataMD5($raf, $size, 'raw');
704
+ }
701
705
  if ($size <= 512 or ($verbose > 2 and $size <= 65536)
702
706
  or ($tagInfo and ($$tagInfo{SubDirectory}
703
707
  or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) )))
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
16
16
  use Image::ExifTool::XMP;
17
17
  use Image::ExifTool::GPS;
18
18
 
19
- $VERSION = '1.07';
19
+ $VERSION = '1.08';
20
20
 
21
21
  sub ProcessDJIInfo($$$);
22
22
 
@@ -104,7 +104,7 @@ my %convFloat2 = (
104
104
  0x00 => { Name => 'AmbientTemperature', Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' }, # (NC)
105
105
  0x04 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
106
106
  0x08 => { Name => 'Emissivity', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
107
- 0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %",$val*100)' },
107
+ 0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %%",$val*100)' },
108
108
  0x10 => { Name => 'ReflectedTemperature',Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' },
109
109
  0x65 => { Name => 'IDString', Format => 'string[16]' }, # (NC)
110
110
  );