exiftool_vendored 9.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (864) hide show
  1. checksums.yaml +15 -0
  2. data/bin/Image-ExifTool-9.33/Changes +6241 -0
  3. data/bin/Image-ExifTool-9.33/MANIFEST +859 -0
  4. data/bin/Image-ExifTool-9.33/META.yml +27 -0
  5. data/bin/Image-ExifTool-9.33/Makefile.PL +41 -0
  6. data/bin/Image-ExifTool-9.33/README +227 -0
  7. data/bin/Image-ExifTool-9.33/arg_files/exif2iptc.args +24 -0
  8. data/bin/Image-ExifTool-9.33/arg_files/exif2xmp.args +38 -0
  9. data/bin/Image-ExifTool-9.33/arg_files/gps2xmp.args +20 -0
  10. data/bin/Image-ExifTool-9.33/arg_files/iptc2exif.args +17 -0
  11. data/bin/Image-ExifTool-9.33/arg_files/iptc2xmp.args +53 -0
  12. data/bin/Image-ExifTool-9.33/arg_files/iptcCore.args +172 -0
  13. data/bin/Image-ExifTool-9.33/arg_files/pdf2xmp.args +23 -0
  14. data/bin/Image-ExifTool-9.33/arg_files/xmp2exif.args +39 -0
  15. data/bin/Image-ExifTool-9.33/arg_files/xmp2gps.args +24 -0
  16. data/bin/Image-ExifTool-9.33/arg_files/xmp2iptc.args +62 -0
  17. data/bin/Image-ExifTool-9.33/arg_files/xmp2pdf.args +23 -0
  18. data/bin/Image-ExifTool-9.33/config_files/ExifTool_config +299 -0
  19. data/bin/Image-ExifTool-9.33/config_files/convert_regions.config +81 -0
  20. data/bin/Image-ExifTool-9.33/exiftool +5715 -0
  21. data/bin/Image-ExifTool-9.33/fmt_files/gpx.fmt +29 -0
  22. data/bin/Image-ExifTool-9.33/fmt_files/gpx_wpt.fmt +33 -0
  23. data/bin/Image-ExifTool-9.33/fmt_files/kml.fmt +53 -0
  24. data/bin/Image-ExifTool-9.33/html/ExifTool.html +1959 -0
  25. data/bin/Image-ExifTool-9.33/html/MIE1.1-20070121.pdf +0 -0
  26. data/bin/Image-ExifTool-9.33/html/Shift.html +173 -0
  27. data/bin/Image-ExifTool-9.33/html/TagNames/AFCP.html +53 -0
  28. data/bin/Image-ExifTool-9.33/html/TagNames/AIFF.html +146 -0
  29. data/bin/Image-ExifTool-9.33/html/TagNames/APE.html +149 -0
  30. data/bin/Image-ExifTool-9.33/html/TagNames/APP12.html +188 -0
  31. data/bin/Image-ExifTool-9.33/html/TagNames/ASF.html +1066 -0
  32. data/bin/Image-ExifTool-9.33/html/TagNames/BMP.html +110 -0
  33. data/bin/Image-ExifTool-9.33/html/TagNames/Canon.html +8062 -0
  34. data/bin/Image-ExifTool-9.33/html/TagNames/CanonCustom.html +2044 -0
  35. data/bin/Image-ExifTool-9.33/html/TagNames/CanonRaw.html +561 -0
  36. data/bin/Image-ExifTool-9.33/html/TagNames/CanonVRD.html +1222 -0
  37. data/bin/Image-ExifTool-9.33/html/TagNames/Casio.html +1569 -0
  38. data/bin/Image-ExifTool-9.33/html/TagNames/Composite.html +665 -0
  39. data/bin/Image-ExifTool-9.33/html/TagNames/DICOM.html +15762 -0
  40. data/bin/Image-ExifTool-9.33/html/TagNames/DNG.html +273 -0
  41. data/bin/Image-ExifTool-9.33/html/TagNames/DV.html +75 -0
  42. data/bin/Image-ExifTool-9.33/html/TagNames/DarwinCore.html +1445 -0
  43. data/bin/Image-ExifTool-9.33/html/TagNames/DjVu.html +313 -0
  44. data/bin/Image-ExifTool-9.33/html/TagNames/EXE.html +697 -0
  45. data/bin/Image-ExifTool-9.33/html/TagNames/EXIF.html +3244 -0
  46. data/bin/Image-ExifTool-9.33/html/TagNames/Extra.html +301 -0
  47. data/bin/Image-ExifTool-9.33/html/TagNames/FLAC.html +183 -0
  48. data/bin/Image-ExifTool-9.33/html/TagNames/FLIR.html +931 -0
  49. data/bin/Image-ExifTool-9.33/html/TagNames/Flash.html +419 -0
  50. data/bin/Image-ExifTool-9.33/html/TagNames/FlashPix.html +1435 -0
  51. data/bin/Image-ExifTool-9.33/html/TagNames/Font.html +485 -0
  52. data/bin/Image-ExifTool-9.33/html/TagNames/FotoStation.html +103 -0
  53. data/bin/Image-ExifTool-9.33/html/TagNames/FujiFilm.html +637 -0
  54. data/bin/Image-ExifTool-9.33/html/TagNames/GE.html +40 -0
  55. data/bin/Image-ExifTool-9.33/html/TagNames/GIF.html +116 -0
  56. data/bin/Image-ExifTool-9.33/html/TagNames/GIMP.html +140 -0
  57. data/bin/Image-ExifTool-9.33/html/TagNames/GPS.html +222 -0
  58. data/bin/Image-ExifTool-9.33/html/TagNames/GeoTiff.html +2177 -0
  59. data/bin/Image-ExifTool-9.33/html/TagNames/H264.html +393 -0
  60. data/bin/Image-ExifTool-9.33/html/TagNames/HP.html +155 -0
  61. data/bin/Image-ExifTool-9.33/html/TagNames/HTML.html +666 -0
  62. data/bin/Image-ExifTool-9.33/html/TagNames/ICC_Profile.html +710 -0
  63. data/bin/Image-ExifTool-9.33/html/TagNames/ID3.html +1473 -0
  64. data/bin/Image-ExifTool-9.33/html/TagNames/IPTC.html +895 -0
  65. data/bin/Image-ExifTool-9.33/html/TagNames/ITC.html +90 -0
  66. data/bin/Image-ExifTool-9.33/html/TagNames/JFIF.html +61 -0
  67. data/bin/Image-ExifTool-9.33/html/TagNames/JPEG.html +523 -0
  68. data/bin/Image-ExifTool-9.33/html/TagNames/JVC.html +56 -0
  69. data/bin/Image-ExifTool-9.33/html/TagNames/Jpeg2000.html +464 -0
  70. data/bin/Image-ExifTool-9.33/html/TagNames/Kodak.html +1759 -0
  71. data/bin/Image-ExifTool-9.33/html/TagNames/KyoceraRaw.html +92 -0
  72. data/bin/Image-ExifTool-9.33/html/TagNames/LNK.html +478 -0
  73. data/bin/Image-ExifTool-9.33/html/TagNames/Leaf.html +870 -0
  74. data/bin/Image-ExifTool-9.33/html/TagNames/M2TS.html +133 -0
  75. data/bin/Image-ExifTool-9.33/html/TagNames/MIE.html +1026 -0
  76. data/bin/Image-ExifTool-9.33/html/TagNames/MIFF.html +196 -0
  77. data/bin/Image-ExifTool-9.33/html/TagNames/MNG.html +847 -0
  78. data/bin/Image-ExifTool-9.33/html/TagNames/MPC.html +97 -0
  79. data/bin/Image-ExifTool-9.33/html/TagNames/MPEG.html +249 -0
  80. data/bin/Image-ExifTool-9.33/html/TagNames/MPF.html +199 -0
  81. data/bin/Image-ExifTool-9.33/html/TagNames/MWG.html +563 -0
  82. data/bin/Image-ExifTool-9.33/html/TagNames/MXF.html +6673 -0
  83. data/bin/Image-ExifTool-9.33/html/TagNames/Matroska.html +1069 -0
  84. data/bin/Image-ExifTool-9.33/html/TagNames/Microsoft.html +2066 -0
  85. data/bin/Image-ExifTool-9.33/html/TagNames/Minolta.html +2555 -0
  86. data/bin/Image-ExifTool-9.33/html/TagNames/MinoltaRaw.html +326 -0
  87. data/bin/Image-ExifTool-9.33/html/TagNames/Nikon.html +4467 -0
  88. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCapture.html +776 -0
  89. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCustom.html +3835 -0
  90. data/bin/Image-ExifTool-9.33/html/TagNames/OOXML.html +280 -0
  91. data/bin/Image-ExifTool-9.33/html/TagNames/Ogg.html +44 -0
  92. data/bin/Image-ExifTool-9.33/html/TagNames/Olympus.html +3386 -0
  93. data/bin/Image-ExifTool-9.33/html/TagNames/OpenEXR.html +222 -0
  94. data/bin/Image-ExifTool-9.33/html/TagNames/PDF.html +745 -0
  95. data/bin/Image-ExifTool-9.33/html/TagNames/PGF.html +80 -0
  96. data/bin/Image-ExifTool-9.33/html/TagNames/PICT.html +753 -0
  97. data/bin/Image-ExifTool-9.33/html/TagNames/PLIST.html +86 -0
  98. data/bin/Image-ExifTool-9.33/html/TagNames/PNG.html +515 -0
  99. data/bin/Image-ExifTool-9.33/html/TagNames/PSP.html +160 -0
  100. data/bin/Image-ExifTool-9.33/html/TagNames/Panasonic.html +1452 -0
  101. data/bin/Image-ExifTool-9.33/html/TagNames/PanasonicRaw.html +214 -0
  102. data/bin/Image-ExifTool-9.33/html/TagNames/Pentax.html +4332 -0
  103. data/bin/Image-ExifTool-9.33/html/TagNames/PhaseOne.html +258 -0
  104. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoCD.html +402 -0
  105. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoMechanic.html +196 -0
  106. data/bin/Image-ExifTool-9.33/html/TagNames/Photoshop.html +555 -0
  107. data/bin/Image-ExifTool-9.33/html/TagNames/PostScript.html +125 -0
  108. data/bin/Image-ExifTool-9.33/html/TagNames/PrintIM.html +31 -0
  109. data/bin/Image-ExifTool-9.33/html/TagNames/Qualcomm.html +4778 -0
  110. data/bin/Image-ExifTool-9.33/html/TagNames/QuickTime.html +3104 -0
  111. data/bin/Image-ExifTool-9.33/html/TagNames/RIFF.html +1164 -0
  112. data/bin/Image-ExifTool-9.33/html/TagNames/RSRC.html +74 -0
  113. data/bin/Image-ExifTool-9.33/html/TagNames/RTF.html +150 -0
  114. data/bin/Image-ExifTool-9.33/html/TagNames/Radiance.html +87 -0
  115. data/bin/Image-ExifTool-9.33/html/TagNames/Rawzor.html +45 -0
  116. data/bin/Image-ExifTool-9.33/html/TagNames/Real.html +780 -0
  117. data/bin/Image-ExifTool-9.33/html/TagNames/Reconyx.html +132 -0
  118. data/bin/Image-ExifTool-9.33/html/TagNames/Ricoh.html +456 -0
  119. data/bin/Image-ExifTool-9.33/html/TagNames/Samsung.html +419 -0
  120. data/bin/Image-ExifTool-9.33/html/TagNames/Sanyo.html +366 -0
  121. data/bin/Image-ExifTool-9.33/html/TagNames/Shortcuts.html +237 -0
  122. data/bin/Image-ExifTool-9.33/html/TagNames/Sigma.html +372 -0
  123. data/bin/Image-ExifTool-9.33/html/TagNames/SigmaRaw.html +403 -0
  124. data/bin/Image-ExifTool-9.33/html/TagNames/Sony.html +4279 -0
  125. data/bin/Image-ExifTool-9.33/html/TagNames/SonyIDC.html +267 -0
  126. data/bin/Image-ExifTool-9.33/html/TagNames/Stim.html +200 -0
  127. data/bin/Image-ExifTool-9.33/html/TagNames/Theora.html +102 -0
  128. data/bin/Image-ExifTool-9.33/html/TagNames/Unknown.html +31 -0
  129. data/bin/Image-ExifTool-9.33/html/TagNames/Vorbis.html +228 -0
  130. data/bin/Image-ExifTool-9.33/html/TagNames/XMP.html +7234 -0
  131. data/bin/Image-ExifTool-9.33/html/TagNames/ZIP.html +204 -0
  132. data/bin/Image-ExifTool-9.33/html/TagNames/iWork.html +49 -0
  133. data/bin/Image-ExifTool-9.33/html/TagNames/index.html +192 -0
  134. data/bin/Image-ExifTool-9.33/html/TagNames/style.css +31 -0
  135. data/bin/Image-ExifTool-9.33/html/ancient_history.html +6727 -0
  136. data/bin/Image-ExifTool-9.33/html/canon_raw.html +366 -0
  137. data/bin/Image-ExifTool-9.33/html/commentary.html +319 -0
  138. data/bin/Image-ExifTool-9.33/html/config.html +312 -0
  139. data/bin/Image-ExifTool-9.33/html/data_members.html +265 -0
  140. data/bin/Image-ExifTool-9.33/html/exiftool_pod.html +2338 -0
  141. data/bin/Image-ExifTool-9.33/html/faq.html +1434 -0
  142. data/bin/Image-ExifTool-9.33/html/filename.html +281 -0
  143. data/bin/Image-ExifTool-9.33/html/geotag.html +642 -0
  144. data/bin/Image-ExifTool-9.33/html/history.html +358 -0
  145. data/bin/Image-ExifTool-9.33/html/htmldump.html +732 -0
  146. data/bin/Image-ExifTool-9.33/html/idiosyncracies.html +251 -0
  147. data/bin/Image-ExifTool-9.33/html/index.html +1271 -0
  148. data/bin/Image-ExifTool-9.33/html/install.html +239 -0
  149. data/bin/Image-ExifTool-9.33/html/metafiles.html +266 -0
  150. data/bin/Image-ExifTool-9.33/html/overview.png +0 -0
  151. data/bin/Image-ExifTool-9.33/html/standards.html +277 -0
  152. data/bin/Image-ExifTool-9.33/html/struct.html +342 -0
  153. data/bin/Image-ExifTool-9.33/html/style.css +31 -0
  154. data/bin/Image-ExifTool-9.33/html/under.html +124 -0
  155. data/bin/Image-ExifTool-9.33/html/verbose.html +195 -0
  156. data/bin/Image-ExifTool-9.33/html/writing.html +239 -0
  157. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pm +378 -0
  158. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pod +231 -0
  159. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pm +6815 -0
  160. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pod +2385 -0
  161. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AES.pm +501 -0
  162. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AFCP.pm +284 -0
  163. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AIFF.pm +271 -0
  164. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APE.pm +262 -0
  165. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APP12.pm +322 -0
  166. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ASF.pm +884 -0
  167. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BMP.pm +179 -0
  168. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BZZ.pm +472 -0
  169. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BigTIFF.pm +282 -0
  170. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BuildTagLookup.pm +2400 -0
  171. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Canon.pm +7794 -0
  172. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonCustom.pm +2523 -0
  173. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonRaw.pm +931 -0
  174. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonVRD.pm +1481 -0
  175. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CaptureOne.pm +235 -0
  176. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Casio.pm +2013 -0
  177. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset.pm +396 -0
  178. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Arabic.pm +39 -0
  179. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Baltic.pm +35 -0
  180. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Cyrillic.pm +45 -0
  181. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Greek.pm +40 -0
  182. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Hebrew.pm +36 -0
  183. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/JIS.pm +1735 -0
  184. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin.pm +24 -0
  185. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin2.pm +36 -0
  186. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacArabic.pm +47 -0
  187. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseCN.pm +2088 -0
  188. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseTW.pm +3623 -0
  189. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCroatian.pm +43 -0
  190. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCyrillic.pm +47 -0
  191. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacGreek.pm +45 -0
  192. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacHebrew.pm +47 -0
  193. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacIceland.pm +42 -0
  194. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacJapanese.pm +1933 -0
  195. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacKorean.pm +2720 -0
  196. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacLatin2.pm +44 -0
  197. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRSymbol.pm +2087 -0
  198. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRoman.pm +42 -0
  199. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRomanian.pm +42 -0
  200. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacThai.pm +49 -0
  201. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacTurkish.pm +42 -0
  202. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/PDFDoc.pm +28 -0
  203. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/ShiftJIS.pm +1835 -0
  204. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Symbol.pm +54 -0
  205. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Thai.pm +41 -0
  206. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Turkish.pm +25 -0
  207. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Vietnam.pm +27 -0
  208. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DICOM.pm +3835 -0
  209. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DNG.pm +835 -0
  210. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DV.pm +319 -0
  211. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DarwinCore.pm +317 -0
  212. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DjVu.pm +376 -0
  213. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/EXE.pm +1228 -0
  214. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Exif.pm +4542 -0
  215. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLAC.pm +296 -0
  216. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLIR.pm +972 -0
  217. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Fixup.pm +354 -0
  218. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Flash.pm +755 -0
  219. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FlashPix.pm +1882 -0
  220. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Font.pm +643 -0
  221. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FotoStation.pm +258 -0
  222. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FujiFilm.pm +1020 -0
  223. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GE.pm +80 -0
  224. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIF.pm +542 -0
  225. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIMP.pm +258 -0
  226. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GPS.pm +511 -0
  227. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GeoTiff.pm +2187 -0
  228. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Geotag.pm +1173 -0
  229. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/H264.pm +1102 -0
  230. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HP.pm +262 -0
  231. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HTML.pm +576 -0
  232. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HtmlDump.pm +895 -0
  233. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ICC_Profile.pm +999 -0
  234. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ID3.pm +1532 -0
  235. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/IPTC.pm +1244 -0
  236. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ITC.pm +215 -0
  237. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Import.pm +308 -0
  238. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/InDesign.pm +277 -0
  239. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEG.pm +588 -0
  240. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
  241. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JVC.pm +130 -0
  242. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Jpeg2000.pm +881 -0
  243. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Kodak.pm +2014 -0
  244. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  245. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/LNK.pm +723 -0
  246. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/cs.pm +1586 -0
  247. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/de.pm +7356 -0
  248. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
  249. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
  250. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/es.pm +4016 -0
  251. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fi.pm +2856 -0
  252. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fr.pm +4720 -0
  253. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/it.pm +7917 -0
  254. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ja.pm +5815 -0
  255. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ko.pm +2332 -0
  256. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/nl.pm +3220 -0
  257. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/pl.pm +1140 -0
  258. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ru.pm +769 -0
  259. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/sv.pm +639 -0
  260. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/tr.pm +544 -0
  261. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
  262. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
  263. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Leaf.pm +515 -0
  264. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/M2TS.pm +729 -0
  265. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIE.pm +2561 -0
  266. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIEUnits.pod +377 -0
  267. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIFF.pm +279 -0
  268. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MNG.pm +684 -0
  269. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPC.pm +156 -0
  270. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPEG.pm +736 -0
  271. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPF.pm +289 -0
  272. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MWG.pm +736 -0
  273. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MXF.pm +3032 -0
  274. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MakerNotes.pm +1573 -0
  275. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Matroska.pm +891 -0
  276. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Microsoft.pm +879 -0
  277. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Minolta.pm +2833 -0
  278. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  279. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Nikon.pm +6116 -0
  280. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCapture.pm +911 -0
  281. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCustom.pm +4405 -0
  282. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OOXML.pm +409 -0
  283. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ogg.pm +237 -0
  284. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Olympus.pm +3582 -0
  285. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OpenEXR.pm +324 -0
  286. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PDF.pm +2327 -0
  287. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PGF.pm +143 -0
  288. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PICT.pm +1260 -0
  289. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PLIST.pm +449 -0
  290. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PNG.pm +1100 -0
  291. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PPM.pm +169 -0
  292. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PSP.pm +305 -0
  293. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Panasonic.pm +1995 -0
  294. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
  295. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Pentax.pm +5489 -0
  296. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhaseOne.pm +557 -0
  297. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoCD.pm +507 -0
  298. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  299. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Photoshop.pm +629 -0
  300. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PostScript.pm +693 -0
  301. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PrintIM.pm +125 -0
  302. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  303. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/QuickTime.pm +3519 -0
  304. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/README +944 -0
  305. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RIFF.pm +1322 -0
  306. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RSRC.pm +241 -0
  307. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RTF.pm +383 -0
  308. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Radiance.pm +144 -0
  309. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Rawzor.pm +190 -0
  310. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Real.pm +736 -0
  311. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Reconyx.pm +190 -0
  312. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ricoh.pm +741 -0
  313. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Samsung.pm +820 -0
  314. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sanyo.pm +439 -0
  315. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shift.pl +594 -0
  316. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shortcuts.pm +291 -0
  317. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sigma.pm +574 -0
  318. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SigmaRaw.pm +649 -0
  319. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sony.pm +5722 -0
  320. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SonyIDC.pm +330 -0
  321. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Stim.pm +196 -0
  322. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagInfoXML.pm +792 -0
  323. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagLookup.pm +8005 -0
  324. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagNames.pod +25950 -0
  325. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Theora.pm +145 -0
  326. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Unknown.pm +66 -0
  327. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Vorbis.pm +237 -0
  328. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  329. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteExif.pl +3674 -0
  330. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteIPTC.pl +702 -0
  331. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePDF.pl +759 -0
  332. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePNG.pl +330 -0
  333. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  334. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePostScript.pl +777 -0
  335. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteXMP.pl +1318 -0
  336. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Writer.pl +5779 -0
  337. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP.pm +3634 -0
  338. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP2.pl +1298 -0
  339. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMPStruct.pl +813 -0
  340. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ZIP.pm +623 -0
  341. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/iWork.pm +223 -0
  342. data/bin/Image-ExifTool-9.33/perl-Image-ExifTool.spec +104 -0
  343. data/bin/Image-ExifTool-9.33/t/AFCP.t +44 -0
  344. data/bin/Image-ExifTool-9.33/t/AFCP_2.out +37 -0
  345. data/bin/Image-ExifTool-9.33/t/AFCP_3.out +20 -0
  346. data/bin/Image-ExifTool-9.33/t/AIFF.t +28 -0
  347. data/bin/Image-ExifTool-9.33/t/AIFF_2.out +31 -0
  348. data/bin/Image-ExifTool-9.33/t/APE.t +38 -0
  349. data/bin/Image-ExifTool-9.33/t/APE_2.out +28 -0
  350. data/bin/Image-ExifTool-9.33/t/APE_3.out +57 -0
  351. data/bin/Image-ExifTool-9.33/t/ASF.t +28 -0
  352. data/bin/Image-ExifTool-9.33/t/ASF_2.out +54 -0
  353. data/bin/Image-ExifTool-9.33/t/BMP.t +28 -0
  354. data/bin/Image-ExifTool-9.33/t/BMP_2.out +21 -0
  355. data/bin/Image-ExifTool-9.33/t/BigTIFF.t +28 -0
  356. data/bin/Image-ExifTool-9.33/t/BigTIFF_2.out +19 -0
  357. data/bin/Image-ExifTool-9.33/t/Canon.t +41 -0
  358. data/bin/Image-ExifTool-9.33/t/CanonRaw.t +126 -0
  359. data/bin/Image-ExifTool-9.33/t/CanonRaw_2.out +165 -0
  360. data/bin/Image-ExifTool-9.33/t/CanonRaw_4.out +217 -0
  361. data/bin/Image-ExifTool-9.33/t/CanonRaw_5.out +207 -0
  362. data/bin/Image-ExifTool-9.33/t/CanonRaw_6.out +231 -0
  363. data/bin/Image-ExifTool-9.33/t/CanonRaw_7.out +247 -0
  364. data/bin/Image-ExifTool-9.33/t/CanonVRD.t +129 -0
  365. data/bin/Image-ExifTool-9.33/t/CanonVRD_11.out +118 -0
  366. data/bin/Image-ExifTool-9.33/t/CanonVRD_12.out +12 -0
  367. data/bin/Image-ExifTool-9.33/t/CanonVRD_2.out +116 -0
  368. data/bin/Image-ExifTool-9.33/t/CanonVRD_3.out +116 -0
  369. data/bin/Image-ExifTool-9.33/t/CanonVRD_4.out +2 -0
  370. data/bin/Image-ExifTool-9.33/t/CanonVRD_5.out +3 -0
  371. data/bin/Image-ExifTool-9.33/t/CanonVRD_6.out +3 -0
  372. data/bin/Image-ExifTool-9.33/t/CanonVRD_7.out +2 -0
  373. data/bin/Image-ExifTool-9.33/t/CanonVRD_8.out +2 -0
  374. data/bin/Image-ExifTool-9.33/t/CanonVRD_9.out +1 -0
  375. data/bin/Image-ExifTool-9.33/t/Canon_2.out +350 -0
  376. data/bin/Image-ExifTool-9.33/t/Canon_3.out +3 -0
  377. data/bin/Image-ExifTool-9.33/t/Casio.t +54 -0
  378. data/bin/Image-ExifTool-9.33/t/Casio_2.out +70 -0
  379. data/bin/Image-ExifTool-9.33/t/Casio_3.out +100 -0
  380. data/bin/Image-ExifTool-9.33/t/Casio_4.out +26 -0
  381. data/bin/Image-ExifTool-9.33/t/Casio_5.out +78 -0
  382. data/bin/Image-ExifTool-9.33/t/Casio_6.out +115 -0
  383. data/bin/Image-ExifTool-9.33/t/DICOM.t +28 -0
  384. data/bin/Image-ExifTool-9.33/t/DICOM_2.out +108 -0
  385. data/bin/Image-ExifTool-9.33/t/DNG.t +39 -0
  386. data/bin/Image-ExifTool-9.33/t/DNG_2.out +326 -0
  387. data/bin/Image-ExifTool-9.33/t/DNG_3.out +4 -0
  388. data/bin/Image-ExifTool-9.33/t/DV.t +27 -0
  389. data/bin/Image-ExifTool-9.33/t/DV_2.out +24 -0
  390. data/bin/Image-ExifTool-9.33/t/DjVu.t +28 -0
  391. data/bin/Image-ExifTool-9.33/t/DjVu_2.out +44 -0
  392. data/bin/Image-ExifTool-9.33/t/EXE.t +31 -0
  393. data/bin/Image-ExifTool-9.33/t/EXE_2.out +40 -0
  394. data/bin/Image-ExifTool-9.33/t/EXE_3.out +15 -0
  395. data/bin/Image-ExifTool-9.33/t/EXE_4.out +14 -0
  396. data/bin/Image-ExifTool-9.33/t/ExifTool.t +284 -0
  397. data/bin/Image-ExifTool-9.33/t/ExifTool_16.out +180 -0
  398. data/bin/Image-ExifTool-9.33/t/ExifTool_17.out +594 -0
  399. data/bin/Image-ExifTool-9.33/t/ExifTool_2.out +399 -0
  400. data/bin/Image-ExifTool-9.33/t/ExifTool_20.out +1 -0
  401. data/bin/Image-ExifTool-9.33/t/ExifTool_21.out +1 -0
  402. data/bin/Image-ExifTool-9.33/t/ExifTool_22.out +1 -0
  403. data/bin/Image-ExifTool-9.33/t/ExifTool_23.out +6 -0
  404. data/bin/Image-ExifTool-9.33/t/ExifTool_24.out +3 -0
  405. data/bin/Image-ExifTool-9.33/t/ExifTool_25.out +13 -0
  406. data/bin/Image-ExifTool-9.33/t/ExifTool_26.out +12 -0
  407. data/bin/Image-ExifTool-9.33/t/ExifTool_3.out +87 -0
  408. data/bin/Image-ExifTool-9.33/t/ExifTool_4.out +41 -0
  409. data/bin/Image-ExifTool-9.33/t/ExifTool_5.out +6 -0
  410. data/bin/Image-ExifTool-9.33/t/ExifTool_6.out +68 -0
  411. data/bin/Image-ExifTool-9.33/t/ExifTool_7.out +125 -0
  412. data/bin/Image-ExifTool-9.33/t/ExifTool_8.out +125 -0
  413. data/bin/Image-ExifTool-9.33/t/ExifTool_9.out +33 -0
  414. data/bin/Image-ExifTool-9.33/t/FLAC.t +37 -0
  415. data/bin/Image-ExifTool-9.33/t/FLAC_2.out +25 -0
  416. data/bin/Image-ExifTool-9.33/t/FLAC_3.out +19 -0
  417. data/bin/Image-ExifTool-9.33/t/FLIR.t +30 -0
  418. data/bin/Image-ExifTool-9.33/t/FLIR_2.out +104 -0
  419. data/bin/Image-ExifTool-9.33/t/FLIR_3.out +47 -0
  420. data/bin/Image-ExifTool-9.33/t/Flash.t +37 -0
  421. data/bin/Image-ExifTool-9.33/t/FlashPix.t +30 -0
  422. data/bin/Image-ExifTool-9.33/t/FlashPix_2.out +48 -0
  423. data/bin/Image-ExifTool-9.33/t/Flash_2.out +20 -0
  424. data/bin/Image-ExifTool-9.33/t/Flash_3.out +53 -0
  425. data/bin/Image-ExifTool-9.33/t/Font.t +30 -0
  426. data/bin/Image-ExifTool-9.33/t/Font_2.out +23 -0
  427. data/bin/Image-ExifTool-9.33/t/Font_3.out +35 -0
  428. data/bin/Image-ExifTool-9.33/t/Font_4.out +26 -0
  429. data/bin/Image-ExifTool-9.33/t/Font_5.out +26 -0
  430. data/bin/Image-ExifTool-9.33/t/Font_6.out +36 -0
  431. data/bin/Image-ExifTool-9.33/t/Font_7.out +36 -0
  432. data/bin/Image-ExifTool-9.33/t/FotoStation.t +38 -0
  433. data/bin/Image-ExifTool-9.33/t/FotoStation_2.out +39 -0
  434. data/bin/Image-ExifTool-9.33/t/FotoStation_3.out +3 -0
  435. data/bin/Image-ExifTool-9.33/t/FujiFilm.t +78 -0
  436. data/bin/Image-ExifTool-9.33/t/FujiFilm_2.out +87 -0
  437. data/bin/Image-ExifTool-9.33/t/FujiFilm_3.out +88 -0
  438. data/bin/Image-ExifTool-9.33/t/FujiFilm_4.out +117 -0
  439. data/bin/Image-ExifTool-9.33/t/FujiFilm_5.out +1 -0
  440. data/bin/Image-ExifTool-9.33/t/GE.t +46 -0
  441. data/bin/Image-ExifTool-9.33/t/GE_2.out +84 -0
  442. data/bin/Image-ExifTool-9.33/t/GE_3.out +84 -0
  443. data/bin/Image-ExifTool-9.33/t/GIF.t +83 -0
  444. data/bin/Image-ExifTool-9.33/t/GIF_2.out +40 -0
  445. data/bin/Image-ExifTool-9.33/t/GIF_3.out +41 -0
  446. data/bin/Image-ExifTool-9.33/t/GIF_4.out +16 -0
  447. data/bin/Image-ExifTool-9.33/t/GIMP.t +27 -0
  448. data/bin/Image-ExifTool-9.33/t/GIMP_2.out +63 -0
  449. data/bin/Image-ExifTool-9.33/t/GPS.t +42 -0
  450. data/bin/Image-ExifTool-9.33/t/GPS_2.out +94 -0
  451. data/bin/Image-ExifTool-9.33/t/GPS_3.out +96 -0
  452. data/bin/Image-ExifTool-9.33/t/GeoTiff.t +36 -0
  453. data/bin/Image-ExifTool-9.33/t/GeoTiff_2.out +36 -0
  454. data/bin/Image-ExifTool-9.33/t/GeoTiff_3.out +36 -0
  455. data/bin/Image-ExifTool-9.33/t/Geotag.t +164 -0
  456. data/bin/Image-ExifTool-9.33/t/Geotag_2.out +9 -0
  457. data/bin/Image-ExifTool-9.33/t/Geotag_3.out +6 -0
  458. data/bin/Image-ExifTool-9.33/t/Geotag_5.out +1 -0
  459. data/bin/Image-ExifTool-9.33/t/Geotag_6.out +9 -0
  460. data/bin/Image-ExifTool-9.33/t/Geotag_7.out +53 -0
  461. data/bin/Image-ExifTool-9.33/t/Geotag_8.out +15 -0
  462. data/bin/Image-ExifTool-9.33/t/HTML.t +28 -0
  463. data/bin/Image-ExifTool-9.33/t/HTML_2.out +68 -0
  464. data/bin/Image-ExifTool-9.33/t/IPTC.t +157 -0
  465. data/bin/Image-ExifTool-9.33/t/IPTC_2.out +58 -0
  466. data/bin/Image-ExifTool-9.33/t/IPTC_4.out +56 -0
  467. data/bin/Image-ExifTool-9.33/t/IPTC_5.out +1 -0
  468. data/bin/Image-ExifTool-9.33/t/IPTC_6.out +2 -0
  469. data/bin/Image-ExifTool-9.33/t/IPTC_7.out +1 -0
  470. data/bin/Image-ExifTool-9.33/t/IPTC_8.out +20 -0
  471. data/bin/Image-ExifTool-9.33/t/ITC.t +28 -0
  472. data/bin/Image-ExifTool-9.33/t/ITC_2.out +19 -0
  473. data/bin/Image-ExifTool-9.33/t/InDesign.t +61 -0
  474. data/bin/Image-ExifTool-9.33/t/InDesign_2.out +19 -0
  475. data/bin/Image-ExifTool-9.33/t/InDesign_3.out +21 -0
  476. data/bin/Image-ExifTool-9.33/t/InDesign_4.out +11 -0
  477. data/bin/Image-ExifTool-9.33/t/JVC.t +36 -0
  478. data/bin/Image-ExifTool-9.33/t/JVC_2.out +3 -0
  479. data/bin/Image-ExifTool-9.33/t/JVC_3.out +3 -0
  480. data/bin/Image-ExifTool-9.33/t/Jpeg2000.t +49 -0
  481. data/bin/Image-ExifTool-9.33/t/Jpeg2000_2.out +63 -0
  482. data/bin/Image-ExifTool-9.33/t/Jpeg2000_3.out +51 -0
  483. data/bin/Image-ExifTool-9.33/t/Jpeg2000_4.out +15 -0
  484. data/bin/Image-ExifTool-9.33/t/Kodak.t +40 -0
  485. data/bin/Image-ExifTool-9.33/t/Kodak_2.out +109 -0
  486. data/bin/Image-ExifTool-9.33/t/Kodak_3.out +119 -0
  487. data/bin/Image-ExifTool-9.33/t/KyoceraRaw.t +28 -0
  488. data/bin/Image-ExifTool-9.33/t/KyoceraRaw_2.out +27 -0
  489. data/bin/Image-ExifTool-9.33/t/LNK.t +28 -0
  490. data/bin/Image-ExifTool-9.33/t/LNK_2.out +45 -0
  491. data/bin/Image-ExifTool-9.33/t/Lang.t +40 -0
  492. data/bin/Image-ExifTool-9.33/t/Lang_1.out +1 -0
  493. data/bin/Image-ExifTool-9.33/t/Lang_10.out +46 -0
  494. data/bin/Image-ExifTool-9.33/t/Lang_11.out +46 -0
  495. data/bin/Image-ExifTool-9.33/t/Lang_12.out +46 -0
  496. data/bin/Image-ExifTool-9.33/t/Lang_13.out +46 -0
  497. data/bin/Image-ExifTool-9.33/t/Lang_14.out +46 -0
  498. data/bin/Image-ExifTool-9.33/t/Lang_15.out +46 -0
  499. data/bin/Image-ExifTool-9.33/t/Lang_16.out +46 -0
  500. data/bin/Image-ExifTool-9.33/t/Lang_17.out +46 -0
  501. data/bin/Image-ExifTool-9.33/t/Lang_18.out +46 -0
  502. data/bin/Image-ExifTool-9.33/t/Lang_2.out +46 -0
  503. data/bin/Image-ExifTool-9.33/t/Lang_3.out +46 -0
  504. data/bin/Image-ExifTool-9.33/t/Lang_4.out +46 -0
  505. data/bin/Image-ExifTool-9.33/t/Lang_5.out +46 -0
  506. data/bin/Image-ExifTool-9.33/t/Lang_6.out +46 -0
  507. data/bin/Image-ExifTool-9.33/t/Lang_7.out +46 -0
  508. data/bin/Image-ExifTool-9.33/t/Lang_8.out +46 -0
  509. data/bin/Image-ExifTool-9.33/t/Lang_9.out +46 -0
  510. data/bin/Image-ExifTool-9.33/t/M2TS.t +29 -0
  511. data/bin/Image-ExifTool-9.33/t/M2TS_2.out +27 -0
  512. data/bin/Image-ExifTool-9.33/t/MIE.t +82 -0
  513. data/bin/Image-ExifTool-9.33/t/MIE_2.out +67 -0
  514. data/bin/Image-ExifTool-9.33/t/MIE_3.out +134 -0
  515. data/bin/Image-ExifTool-9.33/t/MIE_5.out +1 -0
  516. data/bin/Image-ExifTool-9.33/t/MIE_6.out +1 -0
  517. data/bin/Image-ExifTool-9.33/t/MIFF.t +28 -0
  518. data/bin/Image-ExifTool-9.33/t/MIFF_2.out +108 -0
  519. data/bin/Image-ExifTool-9.33/t/MP3.t +29 -0
  520. data/bin/Image-ExifTool-9.33/t/MP3_2.out +45 -0
  521. data/bin/Image-ExifTool-9.33/t/MWG.t +72 -0
  522. data/bin/Image-ExifTool-9.33/t/MWG_2.out +13 -0
  523. data/bin/Image-ExifTool-9.33/t/MWG_3.out +8 -0
  524. data/bin/Image-ExifTool-9.33/t/MWG_4.out +5 -0
  525. data/bin/Image-ExifTool-9.33/t/MWG_5.out +22 -0
  526. data/bin/Image-ExifTool-9.33/t/MXF.t +27 -0
  527. data/bin/Image-ExifTool-9.33/t/MXF_2.out +78 -0
  528. data/bin/Image-ExifTool-9.33/t/Matroska.t +29 -0
  529. data/bin/Image-ExifTool-9.33/t/Matroska_2.out +64 -0
  530. data/bin/Image-ExifTool-9.33/t/Minolta.t +50 -0
  531. data/bin/Image-ExifTool-9.33/t/Minolta_2.out +133 -0
  532. data/bin/Image-ExifTool-9.33/t/Minolta_3.out +146 -0
  533. data/bin/Image-ExifTool-9.33/t/Minolta_4.out +148 -0
  534. data/bin/Image-ExifTool-9.33/t/Nikon.t +114 -0
  535. data/bin/Image-ExifTool-9.33/t/Nikon_2.out +82 -0
  536. data/bin/Image-ExifTool-9.33/t/Nikon_3.out +98 -0
  537. data/bin/Image-ExifTool-9.33/t/Nikon_4.out +174 -0
  538. data/bin/Image-ExifTool-9.33/t/Nikon_5.out +167 -0
  539. data/bin/Image-ExifTool-9.33/t/Nikon_7.out +260 -0
  540. data/bin/Image-ExifTool-9.33/t/Nikon_8.out +4 -0
  541. data/bin/Image-ExifTool-9.33/t/Olympus.t +85 -0
  542. data/bin/Image-ExifTool-9.33/t/Olympus_2.out +79 -0
  543. data/bin/Image-ExifTool-9.33/t/Olympus_3.out +81 -0
  544. data/bin/Image-ExifTool-9.33/t/Olympus_4.out +192 -0
  545. data/bin/Image-ExifTool-9.33/t/Olympus_5.out +264 -0
  546. data/bin/Image-ExifTool-9.33/t/Olympus_6.out +151 -0
  547. data/bin/Image-ExifTool-9.33/t/Olympus_7.out +482 -0
  548. data/bin/Image-ExifTool-9.33/t/OpenEXR.t +28 -0
  549. data/bin/Image-ExifTool-9.33/t/OpenEXR_2.out +23 -0
  550. data/bin/Image-ExifTool-9.33/t/PDF.t +295 -0
  551. data/bin/Image-ExifTool-9.33/t/PDF_10.out +10 -0
  552. data/bin/Image-ExifTool-9.33/t/PDF_11.out +10 -0
  553. data/bin/Image-ExifTool-9.33/t/PDF_12.out +9 -0
  554. data/bin/Image-ExifTool-9.33/t/PDF_14.out +5 -0
  555. data/bin/Image-ExifTool-9.33/t/PDF_15.out +6 -0
  556. data/bin/Image-ExifTool-9.33/t/PDF_16.out +4 -0
  557. data/bin/Image-ExifTool-9.33/t/PDF_17.out +4 -0
  558. data/bin/Image-ExifTool-9.33/t/PDF_18.out +5 -0
  559. data/bin/Image-ExifTool-9.33/t/PDF_19.out +6 -0
  560. data/bin/Image-ExifTool-9.33/t/PDF_2.out +117 -0
  561. data/bin/Image-ExifTool-9.33/t/PDF_20.out +4 -0
  562. data/bin/Image-ExifTool-9.33/t/PDF_22.out +3 -0
  563. data/bin/Image-ExifTool-9.33/t/PDF_4.out +12 -0
  564. data/bin/Image-ExifTool-9.33/t/PDF_5.out +8 -0
  565. data/bin/Image-ExifTool-9.33/t/PDF_6.out +9 -0
  566. data/bin/Image-ExifTool-9.33/t/PDF_7.out +11 -0
  567. data/bin/Image-ExifTool-9.33/t/PDF_8.out +9 -0
  568. data/bin/Image-ExifTool-9.33/t/PDF_9.out +9 -0
  569. data/bin/Image-ExifTool-9.33/t/PGF.t +28 -0
  570. data/bin/Image-ExifTool-9.33/t/PGF_2.out +32 -0
  571. data/bin/Image-ExifTool-9.33/t/PICT.t +28 -0
  572. data/bin/Image-ExifTool-9.33/t/PICT_2.out +15 -0
  573. data/bin/Image-ExifTool-9.33/t/PLIST.t +31 -0
  574. data/bin/Image-ExifTool-9.33/t/PLIST_2.out +20 -0
  575. data/bin/Image-ExifTool-9.33/t/PLIST_3.out +20 -0
  576. data/bin/Image-ExifTool-9.33/t/PNG.t +75 -0
  577. data/bin/Image-ExifTool-9.33/t/PNG_2.out +22 -0
  578. data/bin/Image-ExifTool-9.33/t/PNG_3.out +118 -0
  579. data/bin/Image-ExifTool-9.33/t/PNG_4.out +12 -0
  580. data/bin/Image-ExifTool-9.33/t/PPM.t +40 -0
  581. data/bin/Image-ExifTool-9.33/t/PPM_2.out +15 -0
  582. data/bin/Image-ExifTool-9.33/t/PPM_3.out +9 -0
  583. data/bin/Image-ExifTool-9.33/t/PSP.t +28 -0
  584. data/bin/Image-ExifTool-9.33/t/PSP_2.out +32 -0
  585. data/bin/Image-ExifTool-9.33/t/Panasonic.t +60 -0
  586. data/bin/Image-ExifTool-9.33/t/Panasonic_2.out +99 -0
  587. data/bin/Image-ExifTool-9.33/t/Panasonic_3.out +119 -0
  588. data/bin/Image-ExifTool-9.33/t/Panasonic_4.out +177 -0
  589. data/bin/Image-ExifTool-9.33/t/Panasonic_5.out +228 -0
  590. data/bin/Image-ExifTool-9.33/t/Pentax.t +50 -0
  591. data/bin/Image-ExifTool-9.33/t/Pentax_2.out +219 -0
  592. data/bin/Image-ExifTool-9.33/t/Pentax_3.out +262 -0
  593. data/bin/Image-ExifTool-9.33/t/Pentax_4.out +123 -0
  594. data/bin/Image-ExifTool-9.33/t/PhotoCD.t +28 -0
  595. data/bin/Image-ExifTool-9.33/t/PhotoCD_2.out +35 -0
  596. data/bin/Image-ExifTool-9.33/t/PhotoMechanic.t +38 -0
  597. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_2.out +81 -0
  598. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_3.out +2 -0
  599. data/bin/Image-ExifTool-9.33/t/Photoshop.t +42 -0
  600. data/bin/Image-ExifTool-9.33/t/Photoshop_2.out +96 -0
  601. data/bin/Image-ExifTool-9.33/t/Photoshop_3.out +108 -0
  602. data/bin/Image-ExifTool-9.33/t/PostScript.t +49 -0
  603. data/bin/Image-ExifTool-9.33/t/PostScript_2.out +64 -0
  604. data/bin/Image-ExifTool-9.33/t/PostScript_3.out +132 -0
  605. data/bin/Image-ExifTool-9.33/t/QuickTime.t +31 -0
  606. data/bin/Image-ExifTool-9.33/t/QuickTime_2.out +128 -0
  607. data/bin/Image-ExifTool-9.33/t/QuickTime_3.out +69 -0
  608. data/bin/Image-ExifTool-9.33/t/RIFF.t +31 -0
  609. data/bin/Image-ExifTool-9.33/t/RIFF_2.out +24 -0
  610. data/bin/Image-ExifTool-9.33/t/RIFF_3.out +52 -0
  611. data/bin/Image-ExifTool-9.33/t/RIFF_4.out +16 -0
  612. data/bin/Image-ExifTool-9.33/t/RTF.t +27 -0
  613. data/bin/Image-ExifTool-9.33/t/RTF_2.out +20 -0
  614. data/bin/Image-ExifTool-9.33/t/Radiance.t +28 -0
  615. data/bin/Image-ExifTool-9.33/t/Radiance_2.out +22 -0
  616. data/bin/Image-ExifTool-9.33/t/Real.t +46 -0
  617. data/bin/Image-ExifTool-9.33/t/Real_2.out +68 -0
  618. data/bin/Image-ExifTool-9.33/t/Real_3.out +18 -0
  619. data/bin/Image-ExifTool-9.33/t/Real_4.out +11 -0
  620. data/bin/Image-ExifTool-9.33/t/Ricoh.t +47 -0
  621. data/bin/Image-ExifTool-9.33/t/Ricoh_2.out +70 -0
  622. data/bin/Image-ExifTool-9.33/t/Ricoh_3.out +98 -0
  623. data/bin/Image-ExifTool-9.33/t/Ricoh_4.out +112 -0
  624. data/bin/Image-ExifTool-9.33/t/Sanyo.t +39 -0
  625. data/bin/Image-ExifTool-9.33/t/Sanyo_2.out +101 -0
  626. data/bin/Image-ExifTool-9.33/t/Sanyo_3.out +111 -0
  627. data/bin/Image-ExifTool-9.33/t/Sigma.t +60 -0
  628. data/bin/Image-ExifTool-9.33/t/Sigma_2.out +91 -0
  629. data/bin/Image-ExifTool-9.33/t/Sigma_3.out +94 -0
  630. data/bin/Image-ExifTool-9.33/t/Sigma_4.out +63 -0
  631. data/bin/Image-ExifTool-9.33/t/Sigma_5.out +192 -0
  632. data/bin/Image-ExifTool-9.33/t/Sony.t +62 -0
  633. data/bin/Image-ExifTool-9.33/t/Sony_2.out +84 -0
  634. data/bin/Image-ExifTool-9.33/t/Sony_3.out +85 -0
  635. data/bin/Image-ExifTool-9.33/t/Sony_5.out +32 -0
  636. data/bin/Image-ExifTool-9.33/t/TestLib.pm +417 -0
  637. data/bin/Image-ExifTool-9.33/t/Unknown.t +36 -0
  638. data/bin/Image-ExifTool-9.33/t/Unknown_2.out +90 -0
  639. data/bin/Image-ExifTool-9.33/t/Unknown_3.out +90 -0
  640. data/bin/Image-ExifTool-9.33/t/Vorbis.t +28 -0
  641. data/bin/Image-ExifTool-9.33/t/Vorbis_2.out +28 -0
  642. data/bin/Image-ExifTool-9.33/t/Writer.t +913 -0
  643. data/bin/Image-ExifTool-9.33/t/Writer_10.out +240 -0
  644. data/bin/Image-ExifTool-9.33/t/Writer_11.out +37 -0
  645. data/bin/Image-ExifTool-9.33/t/Writer_13.out +160 -0
  646. data/bin/Image-ExifTool-9.33/t/Writer_14.out +67 -0
  647. data/bin/Image-ExifTool-9.33/t/Writer_15.out +171 -0
  648. data/bin/Image-ExifTool-9.33/t/Writer_16.out +1 -0
  649. data/bin/Image-ExifTool-9.33/t/Writer_17.out +1 -0
  650. data/bin/Image-ExifTool-9.33/t/Writer_18.out +3 -0
  651. data/bin/Image-ExifTool-9.33/t/Writer_19.out +34 -0
  652. data/bin/Image-ExifTool-9.33/t/Writer_2.out +168 -0
  653. data/bin/Image-ExifTool-9.33/t/Writer_22.out +4 -0
  654. data/bin/Image-ExifTool-9.33/t/Writer_24.out +1 -0
  655. data/bin/Image-ExifTool-9.33/t/Writer_25.out +38 -0
  656. data/bin/Image-ExifTool-9.33/t/Writer_26.out +32 -0
  657. data/bin/Image-ExifTool-9.33/t/Writer_27.out +14 -0
  658. data/bin/Image-ExifTool-9.33/t/Writer_28.out +1 -0
  659. data/bin/Image-ExifTool-9.33/t/Writer_29.out +2 -0
  660. data/bin/Image-ExifTool-9.33/t/Writer_30.out +2 -0
  661. data/bin/Image-ExifTool-9.33/t/Writer_31.out +97 -0
  662. data/bin/Image-ExifTool-9.33/t/Writer_32.out +3 -0
  663. data/bin/Image-ExifTool-9.33/t/Writer_33.out +3 -0
  664. data/bin/Image-ExifTool-9.33/t/Writer_34.out +3 -0
  665. data/bin/Image-ExifTool-9.33/t/Writer_35.out +187 -0
  666. data/bin/Image-ExifTool-9.33/t/Writer_36.out +2 -0
  667. data/bin/Image-ExifTool-9.33/t/Writer_37.out +2 -0
  668. data/bin/Image-ExifTool-9.33/t/Writer_38.out +62 -0
  669. data/bin/Image-ExifTool-9.33/t/Writer_39.out +4 -0
  670. data/bin/Image-ExifTool-9.33/t/Writer_4.out +85 -0
  671. data/bin/Image-ExifTool-9.33/t/Writer_40.out +4 -0
  672. data/bin/Image-ExifTool-9.33/t/Writer_41.out +3 -0
  673. data/bin/Image-ExifTool-9.33/t/Writer_42.out +5 -0
  674. data/bin/Image-ExifTool-9.33/t/Writer_43.out +5 -0
  675. data/bin/Image-ExifTool-9.33/t/Writer_44.out +2 -0
  676. data/bin/Image-ExifTool-9.33/t/Writer_45.out +1 -0
  677. data/bin/Image-ExifTool-9.33/t/Writer_46.out +77 -0
  678. data/bin/Image-ExifTool-9.33/t/Writer_47.out +56 -0
  679. data/bin/Image-ExifTool-9.33/t/Writer_48.out +29 -0
  680. data/bin/Image-ExifTool-9.33/t/Writer_50.out +3 -0
  681. data/bin/Image-ExifTool-9.33/t/Writer_51.out +386 -0
  682. data/bin/Image-ExifTool-9.33/t/Writer_6.out +182 -0
  683. data/bin/Image-ExifTool-9.33/t/Writer_7.out +149 -0
  684. data/bin/Image-ExifTool-9.33/t/Writer_9.out +237 -0
  685. data/bin/Image-ExifTool-9.33/t/XMP.t +521 -0
  686. data/bin/Image-ExifTool-9.33/t/XMP_10.out +33 -0
  687. data/bin/Image-ExifTool-9.33/t/XMP_11.out +59 -0
  688. data/bin/Image-ExifTool-9.33/t/XMP_12.out +4 -0
  689. data/bin/Image-ExifTool-9.33/t/XMP_13.out +5 -0
  690. data/bin/Image-ExifTool-9.33/t/XMP_14.out +3 -0
  691. data/bin/Image-ExifTool-9.33/t/XMP_15.out +3 -0
  692. data/bin/Image-ExifTool-9.33/t/XMP_16.out +5 -0
  693. data/bin/Image-ExifTool-9.33/t/XMP_17.out +6 -0
  694. data/bin/Image-ExifTool-9.33/t/XMP_18.out +10 -0
  695. data/bin/Image-ExifTool-9.33/t/XMP_19.out +35 -0
  696. data/bin/Image-ExifTool-9.33/t/XMP_2.out +138 -0
  697. data/bin/Image-ExifTool-9.33/t/XMP_20.out +35 -0
  698. data/bin/Image-ExifTool-9.33/t/XMP_21.out +38 -0
  699. data/bin/Image-ExifTool-9.33/t/XMP_22.out +38 -0
  700. data/bin/Image-ExifTool-9.33/t/XMP_23.out +9 -0
  701. data/bin/Image-ExifTool-9.33/t/XMP_24.out +31 -0
  702. data/bin/Image-ExifTool-9.33/t/XMP_25.out +28 -0
  703. data/bin/Image-ExifTool-9.33/t/XMP_26.out +52 -0
  704. data/bin/Image-ExifTool-9.33/t/XMP_27.out +93 -0
  705. data/bin/Image-ExifTool-9.33/t/XMP_28.out +44 -0
  706. data/bin/Image-ExifTool-9.33/t/XMP_29.out +24 -0
  707. data/bin/Image-ExifTool-9.33/t/XMP_3.out +136 -0
  708. data/bin/Image-ExifTool-9.33/t/XMP_30.out +90 -0
  709. data/bin/Image-ExifTool-9.33/t/XMP_31.out +19 -0
  710. data/bin/Image-ExifTool-9.33/t/XMP_32.out +2 -0
  711. data/bin/Image-ExifTool-9.33/t/XMP_34.out +2 -0
  712. data/bin/Image-ExifTool-9.33/t/XMP_36.out +18 -0
  713. data/bin/Image-ExifTool-9.33/t/XMP_37.out +35 -0
  714. data/bin/Image-ExifTool-9.33/t/XMP_39.out +44 -0
  715. data/bin/Image-ExifTool-9.33/t/XMP_40.out +3 -0
  716. data/bin/Image-ExifTool-9.33/t/XMP_41.out +175 -0
  717. data/bin/Image-ExifTool-9.33/t/XMP_5.out +29 -0
  718. data/bin/Image-ExifTool-9.33/t/XMP_6.out +87 -0
  719. data/bin/Image-ExifTool-9.33/t/XMP_7.out +118 -0
  720. data/bin/Image-ExifTool-9.33/t/XMP_8.out +17 -0
  721. data/bin/Image-ExifTool-9.33/t/XMP_9.out +36 -0
  722. data/bin/Image-ExifTool-9.33/t/ZIP.t +69 -0
  723. data/bin/Image-ExifTool-9.33/t/ZIP_2.out +18 -0
  724. data/bin/Image-ExifTool-9.33/t/ZIP_3.out +17 -0
  725. data/bin/Image-ExifTool-9.33/t/ZIP_4.out +213 -0
  726. data/bin/Image-ExifTool-9.33/t/ZIP_5.out +134 -0
  727. data/bin/Image-ExifTool-9.33/t/ZIP_6.out +49 -0
  728. data/bin/Image-ExifTool-9.33/t/ZIP_7.out +28 -0
  729. data/bin/Image-ExifTool-9.33/t/images/AFCP.jpg +0 -0
  730. data/bin/Image-ExifTool-9.33/t/images/AIFF.aif +0 -0
  731. data/bin/Image-ExifTool-9.33/t/images/APE.ape +0 -0
  732. data/bin/Image-ExifTool-9.33/t/images/APE.mpc +0 -0
  733. data/bin/Image-ExifTool-9.33/t/images/ASF.wmv +0 -0
  734. data/bin/Image-ExifTool-9.33/t/images/BMP.bmp +0 -0
  735. data/bin/Image-ExifTool-9.33/t/images/BigTIFF.btf +0 -0
  736. data/bin/Image-ExifTool-9.33/t/images/Canon.jpg +0 -0
  737. data/bin/Image-ExifTool-9.33/t/images/Canon1DmkIII.jpg +0 -0
  738. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.cr2 +0 -0
  739. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.crw +0 -0
  740. data/bin/Image-ExifTool-9.33/t/images/CanonVRD.vrd +0 -0
  741. data/bin/Image-ExifTool-9.33/t/images/CaptureOne.eip +0 -0
  742. data/bin/Image-ExifTool-9.33/t/images/Casio.jpg +0 -0
  743. data/bin/Image-ExifTool-9.33/t/images/Casio2.jpg +0 -0
  744. data/bin/Image-ExifTool-9.33/t/images/CasioQVCI.jpg +0 -0
  745. data/bin/Image-ExifTool-9.33/t/images/DICOM.dcm +0 -0
  746. data/bin/Image-ExifTool-9.33/t/images/DNG.dng +0 -0
  747. data/bin/Image-ExifTool-9.33/t/images/DV.dv +0 -0
  748. data/bin/Image-ExifTool-9.33/t/images/DjVu.djvu +0 -0
  749. data/bin/Image-ExifTool-9.33/t/images/EXE.elf +0 -0
  750. data/bin/Image-ExifTool-9.33/t/images/EXE.exe +0 -0
  751. data/bin/Image-ExifTool-9.33/t/images/EXE.macho +0 -0
  752. data/bin/Image-ExifTool-9.33/t/images/ExifTool.jpg +0 -0
  753. data/bin/Image-ExifTool-9.33/t/images/ExifTool.tif +0 -0
  754. data/bin/Image-ExifTool-9.33/t/images/ExtendedXMP.jpg +0 -0
  755. data/bin/Image-ExifTool-9.33/t/images/FLAC.flac +0 -0
  756. data/bin/Image-ExifTool-9.33/t/images/FLAC.ogg +0 -0
  757. data/bin/Image-ExifTool-9.33/t/images/FLIR.fpf +0 -0
  758. data/bin/Image-ExifTool-9.33/t/images/FLIR.jpg +0 -0
  759. data/bin/Image-ExifTool-9.33/t/images/Flash.flv +0 -0
  760. data/bin/Image-ExifTool-9.33/t/images/Flash.swf +0 -0
  761. data/bin/Image-ExifTool-9.33/t/images/FlashPix.ppt +0 -0
  762. data/bin/Image-ExifTool-9.33/t/images/Font.afm +28 -0
  763. data/bin/Image-ExifTool-9.33/t/images/Font.dfont +0 -0
  764. data/bin/Image-ExifTool-9.33/t/images/Font.pfa +38 -0
  765. data/bin/Image-ExifTool-9.33/t/images/Font.pfb +0 -0
  766. data/bin/Image-ExifTool-9.33/t/images/Font.pfm +0 -0
  767. data/bin/Image-ExifTool-9.33/t/images/Font.ttf +0 -0
  768. data/bin/Image-ExifTool-9.33/t/images/FotoStation.jpg +0 -0
  769. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.jpg +0 -0
  770. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.raf +0 -0
  771. data/bin/Image-ExifTool-9.33/t/images/GE.jpg +0 -0
  772. data/bin/Image-ExifTool-9.33/t/images/GIF.gif +0 -0
  773. data/bin/Image-ExifTool-9.33/t/images/GIMP.xcf +0 -0
  774. data/bin/Image-ExifTool-9.33/t/images/GPS.jpg +0 -0
  775. data/bin/Image-ExifTool-9.33/t/images/GeoTiff.tif +0 -0
  776. data/bin/Image-ExifTool-9.33/t/images/Geotag.gpx +23 -0
  777. data/bin/Image-ExifTool-9.33/t/images/Geotag.igc +24 -0
  778. data/bin/Image-ExifTool-9.33/t/images/Geotag.log +13 -0
  779. data/bin/Image-ExifTool-9.33/t/images/Geotag.xml +23 -0
  780. data/bin/Image-ExifTool-9.33/t/images/Geotag2.log +7 -0
  781. data/bin/Image-ExifTool-9.33/t/images/HTML.html +77 -0
  782. data/bin/Image-ExifTool-9.33/t/images/IPTC.jpg +0 -0
  783. data/bin/Image-ExifTool-9.33/t/images/ITC.itc +0 -0
  784. data/bin/Image-ExifTool-9.33/t/images/InDesign.indd +0 -0
  785. data/bin/Image-ExifTool-9.33/t/images/JVC.jpg +0 -0
  786. data/bin/Image-ExifTool-9.33/t/images/JVC2.jpg +0 -0
  787. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.j2c +0 -0
  788. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.jp2 +0 -0
  789. data/bin/Image-ExifTool-9.33/t/images/Kodak.jpg +0 -0
  790. data/bin/Image-ExifTool-9.33/t/images/KyoceraRaw.raw +0 -0
  791. data/bin/Image-ExifTool-9.33/t/images/LNK.lnk +0 -0
  792. data/bin/Image-ExifTool-9.33/t/images/M2TS.mts +0 -0
  793. data/bin/Image-ExifTool-9.33/t/images/MIE.mie +0 -0
  794. data/bin/Image-ExifTool-9.33/t/images/MIFF.miff +0 -0
  795. data/bin/Image-ExifTool-9.33/t/images/MP3.mp3 +0 -0
  796. data/bin/Image-ExifTool-9.33/t/images/MWG.jpg +0 -0
  797. data/bin/Image-ExifTool-9.33/t/images/MXF.mxf +0 -0
  798. data/bin/Image-ExifTool-9.33/t/images/Matroska.mkv +0 -0
  799. data/bin/Image-ExifTool-9.33/t/images/Minolta.jpg +0 -0
  800. data/bin/Image-ExifTool-9.33/t/images/Minolta.mrw +0 -0
  801. data/bin/Image-ExifTool-9.33/t/images/Nikon.jpg +0 -0
  802. data/bin/Image-ExifTool-9.33/t/images/Nikon.nef +0 -0
  803. data/bin/Image-ExifTool-9.33/t/images/NikonD2Hs.jpg +0 -0
  804. data/bin/Image-ExifTool-9.33/t/images/NikonD70.jpg +0 -0
  805. data/bin/Image-ExifTool-9.33/t/images/OOXML.docx +0 -0
  806. data/bin/Image-ExifTool-9.33/t/images/Olympus.jpg +0 -0
  807. data/bin/Image-ExifTool-9.33/t/images/Olympus2.jpg +0 -0
  808. data/bin/Image-ExifTool-9.33/t/images/OlympusE1.jpg +0 -0
  809. data/bin/Image-ExifTool-9.33/t/images/OpenDoc.ods +0 -0
  810. data/bin/Image-ExifTool-9.33/t/images/OpenEXR.exr +0 -0
  811. data/bin/Image-ExifTool-9.33/t/images/PDF.pdf +0 -0
  812. data/bin/Image-ExifTool-9.33/t/images/PDF2.pdf +0 -0
  813. data/bin/Image-ExifTool-9.33/t/images/PGF.pgf +0 -0
  814. data/bin/Image-ExifTool-9.33/t/images/PICT.pict +0 -0
  815. data/bin/Image-ExifTool-9.33/t/images/PLIST-bin.plist +0 -0
  816. data/bin/Image-ExifTool-9.33/t/images/PLIST-xml.plist +35 -0
  817. data/bin/Image-ExifTool-9.33/t/images/PNG.png +0 -0
  818. data/bin/Image-ExifTool-9.33/t/images/PPM.ppm +5 -0
  819. data/bin/Image-ExifTool-9.33/t/images/PSP.psp +0 -0
  820. data/bin/Image-ExifTool-9.33/t/images/Panasonic.jpg +0 -0
  821. data/bin/Image-ExifTool-9.33/t/images/Panasonic.rw2 +0 -0
  822. data/bin/Image-ExifTool-9.33/t/images/Pentax.avi +0 -0
  823. data/bin/Image-ExifTool-9.33/t/images/Pentax.jpg +0 -0
  824. data/bin/Image-ExifTool-9.33/t/images/PhotoCD.pcd +0 -0
  825. data/bin/Image-ExifTool-9.33/t/images/PhotoMechanic.jpg +0 -0
  826. data/bin/Image-ExifTool-9.33/t/images/Photoshop.psd +0 -0
  827. data/bin/Image-ExifTool-9.33/t/images/PostScript.eps +108 -0
  828. data/bin/Image-ExifTool-9.33/t/images/QuickTime.m4a +0 -0
  829. data/bin/Image-ExifTool-9.33/t/images/QuickTime.mov +0 -0
  830. data/bin/Image-ExifTool-9.33/t/images/RIFF.avi +0 -0
  831. data/bin/Image-ExifTool-9.33/t/images/RIFF.wav +0 -0
  832. data/bin/Image-ExifTool-9.33/t/images/RIFF.webp +0 -0
  833. data/bin/Image-ExifTool-9.33/t/images/RTF.rtf +25 -0
  834. data/bin/Image-ExifTool-9.33/t/images/Radiance.hdr +0 -0
  835. data/bin/Image-ExifTool-9.33/t/images/Real.ra +0 -0
  836. data/bin/Image-ExifTool-9.33/t/images/Real.ram +1 -0
  837. data/bin/Image-ExifTool-9.33/t/images/Real.rm +0 -0
  838. data/bin/Image-ExifTool-9.33/t/images/Ricoh.jpg +0 -0
  839. data/bin/Image-ExifTool-9.33/t/images/Ricoh2.jpg +0 -0
  840. data/bin/Image-ExifTool-9.33/t/images/Sanyo.jpg +0 -0
  841. data/bin/Image-ExifTool-9.33/t/images/Sigma.jpg +0 -0
  842. data/bin/Image-ExifTool-9.33/t/images/Sigma.x3f +0 -0
  843. data/bin/Image-ExifTool-9.33/t/images/SigmaDP2.x3f +0 -0
  844. data/bin/Image-ExifTool-9.33/t/images/Sony.jpg +0 -0
  845. data/bin/Image-ExifTool-9.33/t/images/Sony.pmp +0 -0
  846. data/bin/Image-ExifTool-9.33/t/images/Unknown.jpg +0 -0
  847. data/bin/Image-ExifTool-9.33/t/images/Vorbis.ogg +0 -0
  848. data/bin/Image-ExifTool-9.33/t/images/Writer.jpg +0 -0
  849. data/bin/Image-ExifTool-9.33/t/images/XMP.inx +108 -0
  850. data/bin/Image-ExifTool-9.33/t/images/XMP.jpg +0 -0
  851. data/bin/Image-ExifTool-9.33/t/images/XMP.svg +33 -0
  852. data/bin/Image-ExifTool-9.33/t/images/XMP.xml +98 -0
  853. data/bin/Image-ExifTool-9.33/t/images/XMP.xmp +99 -0
  854. data/bin/Image-ExifTool-9.33/t/images/XMP2.xmp +25 -0
  855. data/bin/Image-ExifTool-9.33/t/images/XMP3.xmp +43 -0
  856. data/bin/Image-ExifTool-9.33/t/images/XMP4.xmp +93 -0
  857. data/bin/Image-ExifTool-9.33/t/images/XMP5.xmp +158 -0
  858. data/bin/Image-ExifTool-9.33/t/images/ZIP.gz +0 -0
  859. data/bin/Image-ExifTool-9.33/t/images/ZIP.zip +0 -0
  860. data/bin/Image-ExifTool-9.33/t/images/iWork.numbers +0 -0
  861. data/lib/exiftool_vendored.rb +10 -0
  862. data/lib/exiftool_vendored/version.rb +3 -0
  863. data/lib/exiftool_vendored/version_extractor.rb +17 -0
  864. metadata +977 -0
@@ -0,0 +1,1532 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: ID3.pm
3
+ #
4
+ # Description: Read ID3 meta information
5
+ #
6
+ # Revisions: 09/12/2005 - P. Harvey Created
7
+ #
8
+ # References: 1) http://www.id3.org/
9
+ # 2) http://www.mp3-tech.org/
10
+ # 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
11
+ #------------------------------------------------------------------------------
12
+
13
+ package Image::ExifTool::ID3;
14
+
15
+ use strict;
16
+ use vars qw($VERSION);
17
+ use Image::ExifTool qw(:DataAccess :Utils);
18
+
19
+ $VERSION = '1.39';
20
+
21
+ sub ProcessID3v2($$$);
22
+ sub ProcessPrivate($$$);
23
+ sub ProcessSynText($$$);
24
+ sub ConvertID3v1Text($$);
25
+ sub ConvertTimeStamp($);
26
+
27
+ # audio formats that we process after an ID3v2 header (in order)
28
+ my @audioFormats = qw(APE MPC FLAC OGG MP3);
29
+
30
+ # audio formats where the processing proc is in a differently-named module
31
+ my %audioModule = (
32
+ MP3 => 'ID3',
33
+ OGG => 'Ogg',
34
+ );
35
+
36
+ # picture types for 'PIC' and 'APIC' tags
37
+ # (Note: Duplicated in ID3, ASF and FLAC modules!)
38
+ my %pictureType = (
39
+ 0 => 'Other',
40
+ 1 => '32x32 PNG Icon',
41
+ 2 => 'Other Icon',
42
+ 3 => 'Front Cover',
43
+ 4 => 'Back Cover',
44
+ 5 => 'Leaflet',
45
+ 6 => 'Media',
46
+ 7 => 'Lead Artist',
47
+ 8 => 'Artist',
48
+ 9 => 'Conductor',
49
+ 10 => 'Band',
50
+ 11 => 'Composer',
51
+ 12 => 'Lyricist',
52
+ 13 => 'Recording Studio or Location',
53
+ 14 => 'Recording Session',
54
+ 15 => 'Performance',
55
+ 16 => 'Capture from Movie or Video',
56
+ 17 => 'Bright(ly) Colored Fish',
57
+ 18 => 'Illustration',
58
+ 19 => 'Band Logo',
59
+ 20 => 'Publisher Logo',
60
+ );
61
+
62
+ my %dateTimeConv = (
63
+ ValueConv => 'require Image::ExifTool::XMP; Image::ExifTool::XMP::ConvertXMPDate($val)',
64
+ PrintConv => '$self->ConvertDateTime($val)',
65
+ );
66
+
67
+ # This table is just for documentation purposes
68
+ %Image::ExifTool::ID3::Main = (
69
+ VARS => { NO_ID => 1 },
70
+ NOTES => q{
71
+ ExifTool extracts ID3 information from MP3, MPEG, AIFF, OGG, FLAC, APE and
72
+ RealAudio files. ID3v2 tags which support multiple languages (ie. Comment
73
+ and Lyrics) are extracted by specifying the tag name, followed by a dash
74
+ ('-'), then a 3-character
75
+ ISO 639-2
76
+ language code (ie. "Comment-spa"). See L<http://www.id3.org/> for the
77
+ official ID3 specification and
78
+ L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of ISO
79
+ 639-2 language codes.
80
+ },
81
+ ID3v1 => {
82
+ Name => 'ID3v1',
83
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::v1' },
84
+ },
85
+ ID3v1Enh => {
86
+ Name => 'ID3v1_Enh',
87
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::v1_Enh' },
88
+ },
89
+ ID3v22 => {
90
+ Name => 'ID3v2_2',
91
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_2' },
92
+ },
93
+ ID3v23 => {
94
+ Name => 'ID3v2_3',
95
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_3' },
96
+ },
97
+ ID3v24 => {
98
+ Name => 'ID3v2_4',
99
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::v2_4' },
100
+ },
101
+ );
102
+
103
+ # Mapping for ID3v1 Genre numbers
104
+ my %genre = (
105
+ 0 => 'Blues',
106
+ 1 => 'Classic Rock',
107
+ 2 => 'Country',
108
+ 3 => 'Dance',
109
+ 4 => 'Disco',
110
+ 5 => 'Funk',
111
+ 6 => 'Grunge',
112
+ 7 => 'Hip-Hop',
113
+ 8 => 'Jazz',
114
+ 9 => 'Metal',
115
+ 10 => 'New Age',
116
+ 11 => 'Oldies',
117
+ 12 => 'Other',
118
+ 13 => 'Pop',
119
+ 14 => 'R&B',
120
+ 15 => 'Rap',
121
+ 16 => 'Reggae',
122
+ 17 => 'Rock',
123
+ 18 => 'Techno',
124
+ 19 => 'Industrial',
125
+ 20 => 'Alternative',
126
+ 21 => 'Ska',
127
+ 22 => 'Death Metal',
128
+ 23 => 'Pranks',
129
+ 24 => 'Soundtrack',
130
+ 25 => 'Euro-Techno',
131
+ 26 => 'Ambient',
132
+ 27 => 'Trip-Hop',
133
+ 28 => 'Vocal',
134
+ 29 => 'Jazz+Funk',
135
+ 30 => 'Fusion',
136
+ 31 => 'Trance',
137
+ 32 => 'Classical',
138
+ 33 => 'Instrumental',
139
+ 34 => 'Acid',
140
+ 35 => 'House',
141
+ 36 => 'Game',
142
+ 37 => 'Sound Clip',
143
+ 38 => 'Gospel',
144
+ 39 => 'Noise',
145
+ 40 => 'Alt. Rock', # (was AlternRock)
146
+ 41 => 'Bass',
147
+ 42 => 'Soul',
148
+ 43 => 'Punk',
149
+ 44 => 'Space',
150
+ 45 => 'Meditative',
151
+ 46 => 'Instrumental Pop',
152
+ 47 => 'Instrumental Rock',
153
+ 48 => 'Ethnic',
154
+ 49 => 'Gothic',
155
+ 50 => 'Darkwave',
156
+ 51 => 'Techno-Industrial',
157
+ 52 => 'Electronic',
158
+ 53 => 'Pop-Folk',
159
+ 54 => 'Eurodance',
160
+ 55 => 'Dream',
161
+ 56 => 'Southern Rock',
162
+ 57 => 'Comedy',
163
+ 58 => 'Cult',
164
+ 59 => 'Gangsta Rap', # (was Gansta)
165
+ 60 => 'Top 40',
166
+ 61 => 'Christian Rap',
167
+ 62 => 'Pop/Funk',
168
+ 63 => 'Jungle',
169
+ 64 => 'Native American',
170
+ 65 => 'Cabaret',
171
+ 66 => 'New Wave',
172
+ 67 => 'Psychedelic', # (was misspelt)
173
+ 68 => 'Rave',
174
+ 69 => 'Showtunes',
175
+ 70 => 'Trailer',
176
+ 71 => 'Lo-Fi',
177
+ 72 => 'Tribal',
178
+ 73 => 'Acid Punk',
179
+ 74 => 'Acid Jazz',
180
+ 75 => 'Polka',
181
+ 76 => 'Retro',
182
+ 77 => 'Musical',
183
+ 78 => 'Rock & Roll',
184
+ 79 => 'Hard Rock',
185
+ # The following genres are Winamp extensions
186
+ 80 => 'Folk',
187
+ 81 => 'Folk-Rock',
188
+ 82 => 'National Folk',
189
+ 83 => 'Swing',
190
+ 84 => 'Fast-Fusion', # (was Fast Fusion)
191
+ 85 => 'Bebop', # (was misspelt)
192
+ 86 => 'Latin',
193
+ 87 => 'Revival',
194
+ 88 => 'Celtic',
195
+ 89 => 'Bluegrass',
196
+ 90 => 'Avantgarde',
197
+ 91 => 'Gothic Rock',
198
+ 92 => 'Progressive Rock',
199
+ 93 => 'Psychedelic Rock',
200
+ 94 => 'Symphonic Rock',
201
+ 95 => 'Slow Rock',
202
+ 96 => 'Big Band',
203
+ 97 => 'Chorus',
204
+ 98 => 'Easy Listening',
205
+ 99 => 'Acoustic',
206
+ 100 => 'Humour',
207
+ 101 => 'Speech',
208
+ 102 => 'Chanson',
209
+ 103 => 'Opera',
210
+ 104 => 'Chamber Music',
211
+ 105 => 'Sonata',
212
+ 106 => 'Symphony',
213
+ 107 => 'Booty Bass',
214
+ 108 => 'Primus',
215
+ 109 => 'Porn Groove',
216
+ 110 => 'Satire',
217
+ 111 => 'Slow Jam',
218
+ 112 => 'Club',
219
+ 113 => 'Tango',
220
+ 114 => 'Samba',
221
+ 115 => 'Folklore',
222
+ 116 => 'Ballad',
223
+ 117 => 'Power Ballad',
224
+ 118 => 'Rhythmic Soul',
225
+ 119 => 'Freestyle',
226
+ 120 => 'Duet',
227
+ 121 => 'Punk Rock',
228
+ 122 => 'Drum Solo',
229
+ 123 => 'A Cappella', # (was Acapella)
230
+ 124 => 'Euro-House',
231
+ 125 => 'Dance Hall',
232
+ # ref http://yar.hole.ru/MP3Tech/lamedoc/id3.html
233
+ 126 => 'Goa',
234
+ 127 => 'Drum & Bass',
235
+ 128 => 'Club-House',
236
+ 129 => 'Hardcore',
237
+ 130 => 'Terror',
238
+ 131 => 'Indie',
239
+ 132 => 'BritPop',
240
+ 133 => 'Afro-Punk', # (was Negerpunk)
241
+ 134 => 'Polsk Punk',
242
+ 135 => 'Beat',
243
+ 136 => 'Christian Gangsta Rap', # (was Christian Gangsta)
244
+ 137 => 'Heavy Metal',
245
+ 138 => 'Black Metal',
246
+ 139 => 'Crossover',
247
+ 140 => 'Contemporary Christian', # (was Contemporary C)
248
+ 141 => 'Christian Rock',
249
+ 142 => 'Merengue',
250
+ 143 => 'Salsa',
251
+ 144 => 'Thrash Metal',
252
+ 145 => 'Anime',
253
+ 146 => 'JPop',
254
+ 147 => 'Synthpop', # (was SynthPop)
255
+ # ref http://alicja.homelinux.com/~mats/text/Music/MP3/ID3/Genres.txt
256
+ # (also used to update some Genres above)
257
+ 148 => 'Abstract',
258
+ 149 => 'Art Rock',
259
+ 150 => 'Baroque',
260
+ 151 => 'Bhangra',
261
+ 152 => 'Big Beat',
262
+ 153 => 'Breakbeat',
263
+ 154 => 'Chillout',
264
+ 155 => 'Downtempo',
265
+ 156 => 'Dub',
266
+ 157 => 'EBM',
267
+ 158 => 'Eclectic',
268
+ 159 => 'Electro',
269
+ 160 => 'Electroclash',
270
+ 161 => 'Emo',
271
+ 162 => 'Experimental',
272
+ 163 => 'Garage',
273
+ 164 => 'Global',
274
+ 165 => 'IDM',
275
+ 166 => 'Illbient',
276
+ 167 => 'Industro-Goth',
277
+ 168 => 'Jam Band',
278
+ 169 => 'Krautrock',
279
+ 170 => 'Leftfield',
280
+ 171 => 'Lounge',
281
+ 172 => 'Math Rock',
282
+ 173 => 'New Romantic',
283
+ 174 => 'Nu-Breakz',
284
+ 175 => 'Post-Punk',
285
+ 176 => 'Post-Rock',
286
+ 177 => 'Psytrance',
287
+ 178 => 'Shoegaze',
288
+ 179 => 'Space Rock',
289
+ 180 => 'Trop Rock',
290
+ 181 => 'World Music',
291
+ 182 => 'Neoclassical',
292
+ 183 => 'Audiobook',
293
+ 184 => 'Audio Theatre',
294
+ 185 => 'Neue Deutsche Welle',
295
+ 186 => 'Podcast',
296
+ 187 => 'Indie Rock',
297
+ 188 => 'G-Funk',
298
+ 189 => 'Dubstep',
299
+ 190 => 'Garage Rock',
300
+ 191 => 'Psybient',
301
+ 255 => 'None',
302
+ # ID3v2 adds some text short forms...
303
+ CR => 'Cover',
304
+ RX => 'Remix',
305
+ );
306
+
307
+ # Tags for ID3v1
308
+ %Image::ExifTool::ID3::v1 = (
309
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
310
+ GROUPS => { 1 => 'ID3v1', 2 => 'Audio' },
311
+ PRIORITY => 0, # let ID3v2 tags replace these if they come later
312
+ 3 => {
313
+ Name => 'Title',
314
+ Format => 'string[30]',
315
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
316
+ },
317
+ 33 => {
318
+ Name => 'Artist',
319
+ Groups => { 2 => 'Author' },
320
+ Format => 'string[30]',
321
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
322
+ },
323
+ 63 => {
324
+ Name => 'Album',
325
+ Format => 'string[30]',
326
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
327
+ },
328
+ 93 => {
329
+ Name => 'Year',
330
+ Groups => { 2 => 'Time' },
331
+ Format => 'string[4]',
332
+ },
333
+ 97 => {
334
+ Name => 'Comment',
335
+ Format => 'string[30]',
336
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
337
+ },
338
+ 125 => { # ID3v1.1 (ref http://en.wikipedia.org/wiki/ID3#Layout)
339
+ Name => 'Track',
340
+ Format => 'int8u[2]',
341
+ Notes => 'v1.1 addition -- last 2 bytes of v1.0 Comment field',
342
+ RawConv => '($val =~ s/^0 // and $val) ? $val : undef',
343
+ },
344
+ 127 => {
345
+ Name => 'Genre',
346
+ Notes => 'CR and RX are ID3v2 only',
347
+ Format => 'int8u',
348
+ PrintConv => \%genre,
349
+ PrintConvColumns => 3,
350
+ },
351
+ );
352
+
353
+ # ID3v1 "Enhanced TAG" information (ref 3)
354
+ %Image::ExifTool::ID3::v1_Enh = (
355
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
356
+ GROUPS => { 1 => 'ID3v1_Enh', 2 => 'Audio' },
357
+ NOTES => 'ID3 version 1 "Enhanced TAG" information (not part of the official spec).',
358
+ PRIORITY => 0, # let ID3v2 tags replace these if they come later
359
+ 4 => {
360
+ Name => 'Title2',
361
+ Format => 'string[60]',
362
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
363
+ },
364
+ 64 => {
365
+ Name => 'Artist2',
366
+ Groups => { 2 => 'Author' },
367
+ Format => 'string[60]',
368
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
369
+ },
370
+ 124 => {
371
+ Name => 'Album2',
372
+ Format => 'string[60]',
373
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
374
+ },
375
+ 184 => {
376
+ Name => 'Speed',
377
+ Format => 'int8u',
378
+ PrintConv => {
379
+ 1 => 'Slow',
380
+ 2 => 'Medium',
381
+ 3 => 'Fast',
382
+ 4 => 'Hardcore',
383
+ },
384
+ },
385
+ 185 => {
386
+ Name => 'Genre',
387
+ Format => 'string[30]',
388
+ ValueConv => 'Image::ExifTool::ID3::ConvertID3v1Text($self,$val)',
389
+ },
390
+ 215 => {
391
+ Name => 'StartTime',
392
+ Format => 'string[6]',
393
+ },
394
+ 221 => {
395
+ Name => 'EndTime',
396
+ Format => 'string[6]',
397
+ },
398
+ );
399
+
400
+ # Tags for ID2v2.2
401
+ %Image::ExifTool::ID3::v2_2 = (
402
+ PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2,
403
+ GROUPS => { 1 => 'ID3v2_2', 2 => 'Audio' },
404
+ NOTES => q{
405
+ ExifTool extracts mainly text-based tags from ID3v2 information. The tags
406
+ in the tables below are those extracted by ExifTool, and don't represent a
407
+ complete list of available ID3v2 tags.
408
+
409
+ ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.)
410
+ },
411
+ CNT => 'PlayCounter',
412
+ COM => 'Comment',
413
+ IPL => 'InvolvedPeople',
414
+ PIC => {
415
+ Name => 'Picture',
416
+ Groups => { 2 => 'Image' },
417
+ Binary => 1,
418
+ Notes => 'the 3 tags below are also extracted from this PIC frame',
419
+ },
420
+ 'PIC-1' => { Name => 'PictureFormat', Groups => { 2 => 'Image' } },
421
+ 'PIC-2' => {
422
+ Name => 'PictureType',
423
+ Groups => { 2 => 'Image' },
424
+ PrintConv => \%pictureType,
425
+ SeparateTable => 1,
426
+ },
427
+ 'PIC-3' => { Name => 'PictureDescription', Groups => { 2 => 'Image' } },
428
+ POP => {
429
+ Name => 'Popularimeter',
430
+ PrintConv => '$val=~s/^(.*?) (\d+) (\d+)$/$1 Rating=$2 Count=$3/s; $val',
431
+ },
432
+ SLT => {
433
+ Name => 'SynLyrics',
434
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::SynLyrics' },
435
+ },
436
+ TAL => 'Album',
437
+ TBP => 'BeatsPerMinute',
438
+ TCM => 'Composer',
439
+ TCO =>{
440
+ Name => 'Genre',
441
+ Notes => 'uses same lookup table as ID3v1 Genre',
442
+ PrintConv => 'Image::ExifTool::ID3::PrintGenre($val)',
443
+ },
444
+ TCP => { Name => 'Compilation', PrintConv => { 0 => 'No', 1 => 'Yes' } }, # iTunes
445
+ TCR => { Name => 'Copyright', Groups => { 2 => 'Author' } },
446
+ TDA => { Name => 'Date', Groups => { 2 => 'Time' } },
447
+ TDY => 'PlaylistDelay',
448
+ TEN => 'EncodedBy',
449
+ TFT => 'FileType',
450
+ TIM => { Name => 'Time', Groups => { 2 => 'Time' } },
451
+ TKE => 'InitialKey',
452
+ TLA => 'Language',
453
+ TLE => 'Length',
454
+ TMT => 'Media',
455
+ TOA => { Name => 'OriginalArtist', Groups => { 2 => 'Author' } },
456
+ TOF => 'OriginalFilename',
457
+ TOL => 'OriginalLyricist',
458
+ TOR => 'OriginalReleaseYear',
459
+ TOT => 'OriginalAlbum',
460
+ TP1 => { Name => 'Artist', Groups => { 2 => 'Author' } },
461
+ TP2 => 'Band',
462
+ TP3 => 'Conductor',
463
+ TP4 => 'InterpretedBy',
464
+ TPA => 'PartOfSet',
465
+ TPB => 'Publisher',
466
+ TRC => 'ISRC', # (international standard recording code)
467
+ TRD => 'RecordingDates',
468
+ TRK => 'Track',
469
+ TSI => 'Size',
470
+ TSS => 'EncoderSettings',
471
+ TT1 => 'Grouping',
472
+ TT2 => 'Title',
473
+ TT3 => 'Subtitle',
474
+ TXT => 'Lyricist',
475
+ TXX => 'UserDefinedText',
476
+ TYE => { Name => 'Year', Groups => { 2 => 'Time' } },
477
+ ULT => 'Lyrics',
478
+ WAF => 'FileURL',
479
+ WAR => { Name => 'ArtistURL', Groups => { 2 => 'Author' } },
480
+ WAS => 'SourceURL',
481
+ WCM => 'CommercialURL',
482
+ WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } },
483
+ WPB => 'PublisherURL',
484
+ WXX => 'UserDefinedURL',
485
+ # the following written by iTunes 10.5 (ref PH)
486
+ RVA => 'RelativeVolumeAdjustment',
487
+ TST => 'TitleSortOrder',
488
+ TSA => 'AlbumSortOrder',
489
+ TSP => 'PerformerSortOrder',
490
+ TS2 => 'AlbumArtistSortOrder',
491
+ TSC => 'ComposerSortOrder',
492
+ ITU => { Name => 'iTunesU', Description => 'iTunes U', Binary => 1, Unknown => 1 },
493
+ PCS => { Name => 'Podcast', Binary => 1, Unknown => 1 },
494
+ );
495
+
496
+ # tags common to ID3v2.3 and ID3v2.4
497
+ my %id3v2_common = (
498
+ # AENC => 'AudioEncryption', # Owner, preview start, preview length, encr data
499
+ APIC => {
500
+ Name => 'Picture',
501
+ Groups => { 2 => 'Image' },
502
+ Binary => 1,
503
+ Notes => 'the 3 tags below are also extracted from this APIC frame',
504
+ },
505
+ 'APIC-1' => { Name => 'PictureMimeType', Groups => { 2 => 'Image' } },
506
+ 'APIC-2' => {
507
+ Name => 'PictureType',
508
+ Groups => { 2 => 'Image' },
509
+ PrintConv => \%pictureType,
510
+ SeparateTable => 1,
511
+ },
512
+ 'APIC-3' => { Name => 'PictureDescription', Groups => { 2 => 'Image' } },
513
+ COMM => 'Comment',
514
+ # COMR => 'Commercial',
515
+ # ENCR => 'EncryptionMethod',
516
+ # ETCO => 'EventTimingCodes',
517
+ # GEOB => 'GeneralEncapsulatedObject',
518
+ # GRID => 'GroupIdentification',
519
+ # LINK => 'LinkedInformation',
520
+ MCDI => { Name => 'MusicCDIdentifier', Binary => 1 },
521
+ # MLLT => 'MPEGLocationLookupTable',
522
+ OWNE => 'Ownership',
523
+ PCNT => 'PlayCounter',
524
+ POPM => {
525
+ Name => 'Popularimeter',
526
+ PrintConv => '$val=~s/^(.*?) (\d+) (\d+)$/$1 Rating=$2 Count=$3/s; $val',
527
+ },
528
+ # POSS => 'PostSynchronization',
529
+ PRIV => {
530
+ Name => 'Private',
531
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::Private' },
532
+ },
533
+ # RBUF => 'RecommendedBufferSize',
534
+ # RVRB => 'Reverb',
535
+ SYLT => {
536
+ Name => 'SynLyrics',
537
+ SubDirectory => { TagTable => 'Image::ExifTool::ID3::SynLyrics' },
538
+ },
539
+ # SYTC => 'SynchronizedTempoCodes',
540
+ TALB => 'Album',
541
+ TBPM => 'BeatsPerMinute',
542
+ TCMP => { Name => 'Compilation', PrintConv => { 0 => 'No', 1 => 'Yes' } }, #PH (iTunes)
543
+ TCOM => 'Composer',
544
+ TCON =>{
545
+ Name => 'Genre',
546
+ Notes => 'uses same lookup table as ID3v1 Genre',
547
+ PrintConv => 'Image::ExifTool::ID3::PrintGenre($val)',
548
+ },
549
+ TCOP => { Name => 'Copyright', Groups => { 2 => 'Author' } },
550
+ TDLY => 'PlaylistDelay',
551
+ TENC => 'EncodedBy',
552
+ TEXT => 'Lyricist',
553
+ TFLT => 'FileType',
554
+ TIT1 => 'Grouping',
555
+ TIT2 => 'Title',
556
+ TIT3 => 'Subtitle',
557
+ TKEY => 'InitialKey',
558
+ TLAN => 'Language',
559
+ TLEN => {
560
+ Name => 'Length',
561
+ ValueConv => '$val / 1000',
562
+ PrintConv => '"$val s"',
563
+ },
564
+ TMED => 'Media',
565
+ TOAL => 'OriginalAlbum',
566
+ TOFN => 'OriginalFilename',
567
+ TOLY => 'OriginalLyricist',
568
+ TOPE => { Name => 'OriginalArtist', Groups => { 2 => 'Author' } },
569
+ TOWN => 'FileOwner',
570
+ TPE1 => { Name => 'Artist', Groups => { 2 => 'Author' } },
571
+ TPE2 => 'Band',
572
+ TPE3 => 'Conductor',
573
+ TPE4 => 'InterpretedBy',
574
+ TPOS => 'PartOfSet',
575
+ TPUB => 'Publisher',
576
+ TRCK => 'Track',
577
+ TRSN => 'InternetRadioStationName',
578
+ TRSO => 'InternetRadioStationOwner',
579
+ TSRC => 'ISRC', # (international standard recording code)
580
+ TSSE => 'EncoderSettings',
581
+ TXXX => 'UserDefinedText',
582
+ # UFID => 'UniqueFileID', (not extracted because it is long and nasty and not very useful)
583
+ USER => 'TermsOfUse',
584
+ USLT => 'Lyrics',
585
+ WCOM => 'CommercialURL',
586
+ WCOP => 'CopyrightURL',
587
+ WOAF => 'FileURL',
588
+ WOAR => { Name => 'ArtistURL', Groups => { 2 => 'Author' } },
589
+ WOAS => 'SourceURL',
590
+ WORS => 'InternetRadioStationURL',
591
+ WPAY => 'PaymentURL',
592
+ WPUB => 'PublisherURL',
593
+ WXXX => 'UserDefinedURL',
594
+ );
595
+
596
+ # Tags for ID3v2.3 (http://www.id3.org/id3v2.3.0)
597
+ %Image::ExifTool::ID3::v2_3 = (
598
+ PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2,
599
+ GROUPS => { 1 => 'ID3v2_3', 2 => 'Audio' },
600
+ NOTES => 'ID3 version 2.3 tags',
601
+ %id3v2_common, # include common tags
602
+ # EQUA => 'Equalization',
603
+ IPLS => 'InvolvedPeople',
604
+ # RVAD => 'RelativeVolumeAdjustment',
605
+ TDAT => { Name => 'Date', Groups => { 2 => 'Time' } },
606
+ TIME => { Name => 'Time', Groups => { 2 => 'Time' } },
607
+ TORY => 'OriginalReleaseYear',
608
+ TRDA => 'RecordingDates',
609
+ TSIZ => 'Size',
610
+ TYER => { Name => 'Year', Groups => { 2 => 'Time' } },
611
+ );
612
+
613
+ # Tags for ID3v2.4 (http://www.id3.org/id3v2.4.0-frames)
614
+ %Image::ExifTool::ID3::v2_4 = (
615
+ PROCESS_PROC => \&Image::ExifTool::ID3::ProcessID3v2,
616
+ GROUPS => { 1 => 'ID3v2_4', 2 => 'Audio' },
617
+ NOTES => 'ID3 version 2.4 tags',
618
+ %id3v2_common, # include common tags
619
+ # EQU2 => 'Equalization',
620
+ RVA2 => 'RelativeVolumeAdjustment',
621
+ # SEEK => 'Seek',
622
+ # SIGN => 'Signature',
623
+ TDEN => { Name => 'EncodingTime', Groups => { 2 => 'Time' }, %dateTimeConv },
624
+ TDOR => { Name => 'OriginalReleaseTime',Groups => { 2 => 'Time' }, %dateTimeConv },
625
+ TDRC => { Name => 'RecordingTime', Groups => { 2 => 'Time' }, %dateTimeConv },
626
+ TDRL => { Name => 'ReleaseTime', Groups => { 2 => 'Time' }, %dateTimeConv },
627
+ TDTG => { Name => 'TaggingTime', Groups => { 2 => 'Time' }, %dateTimeConv },
628
+ TIPL => 'InvolvedPeople',
629
+ TMCL => 'MusicianCredits',
630
+ TMOO => 'Mood',
631
+ TPRO => 'ProducedNotice',
632
+ TSOA => 'AlbumSortOrder',
633
+ TSOP => 'PerformerSortOrder',
634
+ TSOT => 'TitleSortOrder',
635
+ TSST => 'SetSubtitle',
636
+ # the following are written by iTunes 10.5 (ref PH)
637
+ TSO2 => 'AlbumArtistSortOrder',
638
+ TSOC => 'ComposerSortOrder',
639
+ ITNU => { Name => 'iTunesU', Description => 'iTunes U', Binary => 1, Unknown => 1 },
640
+ PCST => { Name => 'Podcast', Binary => 1, Unknown => 1 },
641
+ );
642
+
643
+ # Synchronized lyrics/text
644
+ %Image::ExifTool::ID3::SynLyrics = (
645
+ GROUPS => { 1 => 'ID3', 2 => 'Audio' },
646
+ VARS => { NO_ID => 1 },
647
+ PROCESS_PROC => \&ProcessSynText,
648
+ NOTES => 'The following tags are extracted from synchronized lyrics/text frames.',
649
+ desc => { Name => 'SynchronizedLyricsDescription' },
650
+ type => {
651
+ Name => 'SynchronizedLyricsType',
652
+ PrintConv => {
653
+ 0 => 'Other',
654
+ 1 => 'Lyrics',
655
+ 2 => 'Text Transcription',
656
+ 3 => 'Movement/part Name',
657
+ 4 => 'Events',
658
+ 5 => 'Chord',
659
+ 6 => 'Trivia/"pop-up" Information',
660
+ 7 => 'Web Page URL',
661
+ 8 => 'Image URL',
662
+ },
663
+ },
664
+ text => {
665
+ Name => 'SynchronizedLyricsText',
666
+ List => 1,
667
+ Notes => q{
668
+ each list item has a leading time stamp in square brackets. Time stamps may
669
+ be in seconds with format [MM:SS.ss], or MPEG frames with format [FFFF],
670
+ depending on how this information was stored
671
+ },
672
+ PrintConv => \&ConvertTimeStamp,
673
+ },
674
+ );
675
+
676
+ # ID3 PRIV tags (ref PH)
677
+ %Image::ExifTool::ID3::Private = (
678
+ PROCESS_PROC => \&Image::ExifTool::ID3::ProcessPrivate,
679
+ GROUPS => { 1 => 'ID3', 2 => 'Audio' },
680
+ VARS => { NO_ID => 1 },
681
+ NOTES => q{
682
+ ID3 private (PRIV) tags. ExifTool will decode any private tags found, even
683
+ if they do not appear in this table.
684
+ },
685
+ XMP => {
686
+ SubDirectory => {
687
+ DirName => 'XMP',
688
+ TagTable => 'Image::ExifTool::XMP::Main',
689
+ },
690
+ },
691
+ PeakValue => {
692
+ ValueConv => 'length($val)==4 ? unpack("V",$val) : \$val',
693
+ },
694
+ AverageLevel => {
695
+ ValueConv => 'length($val)==4 ? unpack("V",$val) : \$val',
696
+ },
697
+ # Windows Media attributes ("/" in tag ID is converted to "_" by ProcessPrivate)
698
+ WM_WMContentID => {
699
+ Name => 'WM_ContentID',
700
+ ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)',
701
+ },
702
+ WM_WMCollectionID => {
703
+ Name => 'WM_CollectionID',
704
+ ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)',
705
+ },
706
+ WM_WMCollectionGroupID => {
707
+ Name => 'WM_CollectionGroupID',
708
+ ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)',
709
+ },
710
+ WM_MediaClassPrimaryID => {
711
+ ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)',
712
+ },
713
+ WM_MediaClassSecondaryID => {
714
+ ValueConv => 'require Image::ExifTool::ASF; Image::ExifTool::ASF::GetGUID($val)',
715
+ },
716
+ WM_Provider => {
717
+ ValueConv => '$self->Decode($val,"UCS2","II")', #PH (NC)
718
+ },
719
+ # there are lots more WM tags that could be decoded if I had samples or documentation - PH
720
+ # WM/AlbumArtist
721
+ # WM/AlbumTitle
722
+ # WM/Category
723
+ # WM/Composer
724
+ # WM/Conductor
725
+ # WM/ContentDistributor
726
+ # WM/ContentGroupDescription
727
+ # WM/EncodingTime
728
+ # WM/Genre
729
+ # WM/GenreID
730
+ # WM/InitialKey
731
+ # WM/Language
732
+ # WM/Lyrics
733
+ # WM/MCDI
734
+ # WM/MediaClassPrimaryID
735
+ # WM/MediaClassSecondaryID
736
+ # WM/Mood
737
+ # WM/ParentalRating
738
+ # WM/Period
739
+ # WM/ProtectionType
740
+ # WM/Provider
741
+ # WM/ProviderRating
742
+ # WM/ProviderStyle
743
+ # WM/Publisher
744
+ # WM/SubscriptionContentID
745
+ # WM/SubTitle
746
+ # WM/TrackNumber
747
+ # WM/UniqueFileIdentifier
748
+ # WM/WMCollectionGroupID
749
+ # WM/WMCollectionID
750
+ # WM/WMContentID
751
+ # WM/Writer
752
+ # WM/Year
753
+ );
754
+
755
+ # ID3 Composite tags
756
+ %Image::ExifTool::ID3::Composite = (
757
+ GROUPS => { 2 => 'Image' },
758
+ DateTimeOriginal => {
759
+ Description => 'Date/Time Original',
760
+ Groups => { 2 => 'Time' },
761
+ Priority => 0,
762
+ Desire => {
763
+ 0 => 'ID3:RecordingTime',
764
+ 1 => 'ID3:Year',
765
+ 2 => 'ID3:Date',
766
+ 3 => 'ID3:Time',
767
+ },
768
+ ValueConv => q{
769
+ return $val[0] if $val[0];
770
+ return undef unless $val[1];
771
+ return $val[1] unless $val[2] and $val[2] =~ /^(\d{2})(\d{2})$/;
772
+ $val[1] .= ":$1:$2";
773
+ return $val[1] unless $val[3] and $val[3] =~ /^(\d{2})(\d{2})$/;
774
+ return "$val[1] $1:$2";
775
+ },
776
+ PrintConv => '$self->ConvertDateTime($val)',
777
+ },
778
+ );
779
+
780
+ # add our composite tags
781
+ Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3');
782
+
783
+ # can't share tagInfo hashes between two tables, so we must make
784
+ # copies of the necessary hashes
785
+ {
786
+ my $tag;
787
+ foreach $tag (keys %id3v2_common) {
788
+ next unless ref $id3v2_common{$tag} eq 'HASH';
789
+ my %tagInfo = %{$id3v2_common{$tag}};
790
+ # must also copy Groups hash if it exists
791
+ my $groups = $tagInfo{Groups};
792
+ $tagInfo{Groups} = { %$groups } if $groups;
793
+ $Image::ExifTool::ID3::v2_4{$tag} = \%tagInfo;
794
+ }
795
+ }
796
+
797
+ #------------------------------------------------------------------------------
798
+ # Convert ID3v1 text to exiftool character set
799
+ # Inputs: 0) ExifTool object ref, 1) text string
800
+ # Returns: converted text
801
+ sub ConvertID3v1Text($$)
802
+ {
803
+ my ($exifTool, $val) = @_;
804
+ return $exifTool->Decode($val, $exifTool->Options('CharsetID3'));
805
+ }
806
+
807
+ #------------------------------------------------------------------------------
808
+ # Re-format time stamp in synchronized lyrics
809
+ # Inputs: 0) synchronized lyrics entry (ie. "[84.030]Da do do do")
810
+ # Returns: entry with formatted timestamp (ie. "[01:24.03]Da do do do")
811
+ sub ConvertTimeStamp($)
812
+ {
813
+ my $val = shift;
814
+ # do nothing if this isn't a time stamp (frame count doesn't contain a decimal)
815
+ return $val unless $val =~ /^\[(\d+\.\d+)\]/g;
816
+ my $time = $1;
817
+ # print hours only if more than 60 minutes
818
+ my $h = int($time / 3600);
819
+ if ($h) {
820
+ $time -= $h * 3600;
821
+ $h = "$h:";
822
+ } else {
823
+ $h = '';
824
+ }
825
+ my $m = int($time / 60);
826
+ my $s = $time - $m * 60;
827
+ return sprintf('[%s%.2d:%05.2f]', $h, $m, $s) . substr($val, pos($val));
828
+ }
829
+
830
+ #------------------------------------------------------------------------------
831
+ # Process ID3 synchronized lyrics/text
832
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
833
+ sub ProcessSynText($$$)
834
+ {
835
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
836
+ my $dataPt = $$dirInfo{DataPt};
837
+
838
+ $exifTool->VerboseDir('SynLyrics', 0, length $$dataPt);
839
+ return unless length $$dataPt > 6;
840
+
841
+ my ($enc,$lang,$timeCode,$type) = unpack('Ca3CC', $$dataPt);
842
+ $lang = lc $lang;
843
+ undef $lang if $lang !~ /^[a-z]{3}$/ or $lang eq 'eng';
844
+ pos($$dataPt) = 6;
845
+ my ($termLen, $pat);
846
+ if ($enc == 1 or $enc == 2) {
847
+ $$dataPt =~ /\G(..)*?\0\0/sg or return;
848
+ $termLen = 2;
849
+ $pat = '\G(?:..)*?\0\0(....)';
850
+ } else {
851
+ $$dataPt =~ /\0/g or return;
852
+ $termLen = 1;
853
+ $pat = '\0(....)';
854
+ }
855
+ my $desc = substr($$dataPt, 6, pos($$dataPt) - 6 - $termLen);
856
+ $desc = DecodeString($exifTool, $desc, $enc);
857
+
858
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'desc');
859
+ $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
860
+ $exifTool->HandleTag($tagTablePtr, 'type', $type);
861
+ $exifTool->HandleTag($tagTablePtr, 'desc', $desc, TagInfo => $tagInfo);
862
+ $tagInfo = $exifTool->GetTagInfo($tagTablePtr, 'text');
863
+ $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, $lang) if $lang;
864
+
865
+ for (;;) {
866
+ my $pos = pos $$dataPt;
867
+ last unless $$dataPt =~ /$pat/sg;
868
+ my $time = unpack('N', $1);
869
+ my $text = substr($$dataPt, $pos, pos($$dataPt) - $pos - 4 - $termLen);
870
+ $text = DecodeString($exifTool, $text, $enc);
871
+ my $timeStr;
872
+ if ($timeCode == 2) { # time in ms
873
+ $timeStr = sprintf('%.3f', $time / 1000);
874
+ } else { # time in MPEG frames
875
+ $timeStr = sprintf('%.4d', $time);
876
+ $timeStr .= '?' if $timeCode != 1;
877
+ }
878
+ $exifTool->HandleTag($tagTablePtr, 'text', "[$timeStr]$text", TagInfo => $tagInfo);
879
+ }
880
+ }
881
+
882
+ #------------------------------------------------------------------------------
883
+ # Process ID3 PRIV data
884
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
885
+ sub ProcessPrivate($$$)
886
+ {
887
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
888
+ my $dataPt = $$dirInfo{DataPt};
889
+ my ($tag, $start);
890
+ $exifTool->VerboseDir('PRIV', 0, length $$dataPt);
891
+ if ($$dataPt =~ /^(.*?)\0/s) {
892
+ $tag = $1;
893
+ $start = length($tag) + 1;
894
+ } else {
895
+ $tag = '';
896
+ $start = 0;
897
+ }
898
+ unless ($$tagTablePtr{$tag}) {
899
+ $tag =~ tr{/ }{_}d; # translate '/' to '_' and remove spaces
900
+ $tag = 'private' unless $tag =~ /^[-\w]{1,24}$/;
901
+ unless ($$tagTablePtr{$tag}) {
902
+ AddTagToTable($tagTablePtr, $tag,
903
+ { Name => ucfirst($tag), Binary => 1 });
904
+ }
905
+ }
906
+ my $key = $exifTool->HandleTag($tagTablePtr, $tag, undef,
907
+ Size => length($$dataPt) - $start,
908
+ Start => $start,
909
+ DataPt => $dataPt,
910
+ );
911
+ # set group1 name
912
+ $exifTool->SetGroup($key, $$exifTool{ID3_Ver}) if $key;
913
+ }
914
+
915
+ #------------------------------------------------------------------------------
916
+ # Print ID3v2 Genre
917
+ # Inputs: TCON or TCO frame data
918
+ # Returns: Content type with decoded genre numbers
919
+ sub PrintGenre($)
920
+ {
921
+ my $val = shift;
922
+ # make sure that %genre has an entry for all numbers we are interested in
923
+ # (genre numbers are in brackets for ID3v2.2 and v2.3)
924
+ while ($val =~ /\((\d+)\)/g) {
925
+ $genre{$1} or $genre{$1} = "Unknown ($1)";
926
+ }
927
+ # (genre numbers are separated by nulls in ID3v2.4,
928
+ # but nulls are converted to '/' by DecodeString())
929
+ while ($val =~ /(?:^|\/)(\d+)(\/|$)/g) {
930
+ $genre{$1} or $genre{$1} = "Unknown ($1)";
931
+ }
932
+ $val =~ s/\((\d+)\)/\($genre{$1}\)/g;
933
+ $val =~ s/(^|\/)(\d+)(\/|$)/$1$genre{$2}$3/g;
934
+ $val =~ s/^\(([^)]+)\)\1?$/$1/; # clean up by removing brackets and duplicates
935
+ return $val;
936
+ }
937
+
938
+ #------------------------------------------------------------------------------
939
+ # Decode ID3 string
940
+ # Inputs: 0) ExifTool object reference
941
+ # 1) string beginning with encoding byte unless specified as argument
942
+ # 2) optional encoding (0=ISO-8859-1, 1=UTF-16 BOM, 2=UTF-16BE, 3=UTF-8)
943
+ # Returns: Decoded string in scalar context, or list of strings in list context
944
+ sub DecodeString($$;$)
945
+ {
946
+ my ($exifTool, $val, $enc) = @_;
947
+ return '' unless length $val;
948
+ unless (defined $enc) {
949
+ $enc = unpack('C', $val);
950
+ $val = substr($val, 1); # remove encoding byte
951
+ }
952
+ my @vals;
953
+ if ($enc == 0 or $enc == 3) { # ISO 8859-1 or UTF-8
954
+ $val =~ s/\0+$//; # remove any null padding
955
+ # (must split before converting because conversion routines truncate at null)
956
+ @vals = split "\0", $val;
957
+ foreach $val (@vals) {
958
+ $val = $exifTool->Decode($val, $enc ? 'UTF8' : 'Latin');
959
+ }
960
+ } elsif ($enc == 1 or $enc == 2) { # UTF-16 with BOM, or UTF-16BE
961
+ my $bom = "\xfe\xff";
962
+ my %order = ( "\xfe\xff" => 'MM', "\xff\xfe", => 'II' );
963
+ for (;;) {
964
+ my $v;
965
+ # split string at null terminators on word boundaries
966
+ if ($val =~ s/((..)*?)\0\0//s) {
967
+ $v = $1;
968
+ } else {
969
+ last unless length $val > 1;
970
+ $v = $val;
971
+ $val = '';
972
+ }
973
+ $bom = $1 if $v =~ s/^(\xfe\xff|\xff\xfe)//;
974
+ push @vals, $exifTool->Decode($v, 'UCS2', $order{$bom});
975
+ }
976
+ } else {
977
+ $val =~ s/\0+$//;
978
+ return "<Unknown encoding $enc> $val";
979
+ }
980
+ return @vals if wantarray;
981
+ return join('/',@vals);
982
+ }
983
+
984
+ #------------------------------------------------------------------------------
985
+ # Convert sync-safe integer to a number we can use
986
+ # Inputs: 0) int32u sync-safe value
987
+ # Returns: actual number or undef on invalid value
988
+ sub UnSyncSafe($)
989
+ {
990
+ my $val = shift;
991
+ return undef if $val & 0x80808080;
992
+ return ($val & 0x0000007f) |
993
+ (($val & 0x00007f00) >> 1) |
994
+ (($val & 0x007f0000) >> 2) |
995
+ (($val & 0x7f000000) >> 3);
996
+ }
997
+
998
+ #------------------------------------------------------------------------------
999
+ # Process ID3v2 information
1000
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
1001
+ sub ProcessID3v2($$$)
1002
+ {
1003
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
1004
+ my $dataPt = $$dirInfo{DataPt};
1005
+ my $offset = $$dirInfo{DirStart};
1006
+ my $size = $$dirInfo{DirLen};
1007
+ my $vers = $$dirInfo{Version};
1008
+ my $verbose = $exifTool->Options('Verbose');
1009
+ my $len; # frame data length
1010
+
1011
+ $verbose and $exifTool->VerboseDir($tagTablePtr->{GROUPS}->{1}, 0, $size);
1012
+
1013
+ for (;;$offset+=$len) {
1014
+ my ($id, $flags, $hi);
1015
+ if ($vers < 0x0300) {
1016
+ # version 2.2 frame header is 6 bytes
1017
+ last if $offset + 6 > $size;
1018
+ ($id, $hi, $len) = unpack("x${offset}a3Cn",$$dataPt);
1019
+ last if $id eq "\0\0\0";
1020
+ $len += $hi << 16;
1021
+ $offset += 6;
1022
+ } else {
1023
+ # version 2.3/2.4 frame header is 10 bytes
1024
+ last if $offset + 10 > $size;
1025
+ ($id, $len, $flags) = unpack("x${offset}a4Nn",$$dataPt);
1026
+ last if $id eq "\0\0\0\0";
1027
+ $offset += 10;
1028
+ # length is a "sync-safe" integer by the ID3v2.4 specification, but
1029
+ # reportedly some versions of iTunes write this as a normal integer
1030
+ # (ref http://www.id3.org/iTunes)
1031
+ while ($vers >= 0x0400 and $len > 0x7f and not $len & 0x80808080) {
1032
+ my $oldLen = $len;
1033
+ $len = UnSyncSafe($len);
1034
+ if (not defined $len or $offset + $len + 10 > $size) {
1035
+ $exifTool->Warn('Invalid ID3 frame size');
1036
+ last;
1037
+ }
1038
+ # check next ID to see if it makes sense
1039
+ my $nextID = substr($$dataPt, $offset + $len, 4);
1040
+ last if $$tagTablePtr{$nextID};
1041
+ # try again with the incorrect length word (patch for iTunes bug)
1042
+ last if $offset + $oldLen + 10 > $size;
1043
+ $nextID = substr($$dataPt, $offset + $len, 4);
1044
+ $len = $oldLen if $$tagTablePtr{$nextID};
1045
+ last; # yes, "while" was really a "goto" in disguise
1046
+ }
1047
+ }
1048
+ last if $offset + $len > $size;
1049
+ my $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $id);
1050
+ unless ($tagInfo) {
1051
+ next unless $verbose or $exifTool->Options('Unknown');
1052
+ $id =~ tr/-A-Za-z0-9_//dc;
1053
+ $id = 'unknown' unless length $id;
1054
+ unless ($$tagTablePtr{$id}) {
1055
+ $tagInfo = { Name => "ID3_$id", Binary => 1 };
1056
+ AddTagToTable($tagTablePtr, $id, $tagInfo);
1057
+ }
1058
+ }
1059
+ # decode v2.3 and v2.4 flags
1060
+ my %flags;
1061
+ if ($flags) {
1062
+ if ($vers < 0x0400) {
1063
+ # version 2.3 flags
1064
+ $flags & 0x80 and $flags{Compress} = 1;
1065
+ $flags & 0x40 and $flags{Encrypt} = 1;
1066
+ $flags & 0x20 and $flags{GroupID} = 1;
1067
+ } else {
1068
+ # version 2.4 flags
1069
+ $flags & 0x40 and $flags{GroupID} = 1;
1070
+ $flags & 0x08 and $flags{Compress} = 1;
1071
+ $flags & 0x04 and $flags{Encrypt} = 1;
1072
+ $flags & 0x02 and $flags{Unsync} = 1;
1073
+ $flags & 0x01 and $flags{DataLen} = 1;
1074
+ }
1075
+ }
1076
+ if ($flags{Encrypt}) {
1077
+ $exifTool->WarnOnce('Encrypted frames currently not supported');
1078
+ next;
1079
+ }
1080
+ # extract the value
1081
+ my $val = substr($$dataPt, $offset, $len);
1082
+
1083
+ # reverse the unsynchronization
1084
+ $val =~ s/\xff\x00/\xff/g if $flags{Unsync};
1085
+
1086
+ # read grouping identity
1087
+ if ($flags{GroupID}) {
1088
+ length($val) >= 1 or $exifTool->Warn("Short $id frame"), next;
1089
+ $val = substr($val, 1); # (ignore it)
1090
+ }
1091
+ # read data length
1092
+ my $dataLen;
1093
+ if ($flags{DataLen} or $flags{Compress}) {
1094
+ length($val) >= 4 or $exifTool->Warn("Short $id frame"), next;
1095
+ $dataLen = unpack('N', $val); # save the data length word
1096
+ $val = substr($val, 4);
1097
+ }
1098
+ # uncompress data
1099
+ if ($flags{Compress}) {
1100
+ if (eval 'require Compress::Zlib') {
1101
+ my $inflate = Compress::Zlib::inflateInit();
1102
+ my ($buff, $stat);
1103
+ $inflate and ($buff, $stat) = $inflate->inflate($val);
1104
+ if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
1105
+ $val = $buff;
1106
+ } else {
1107
+ $exifTool->Warn("Error inflating $id frame");
1108
+ next;
1109
+ }
1110
+ } else {
1111
+ $exifTool->WarnOnce('Install Compress::Zlib to decode compressed frames');
1112
+ next;
1113
+ }
1114
+ }
1115
+ # validate data length
1116
+ if (defined $dataLen) {
1117
+ $dataLen = UnSyncSafe($dataLen);
1118
+ defined $dataLen or $exifTool->Warn("Invalid length for $id frame"), next;
1119
+ $dataLen == length($val) or $exifTool->Warn("Wrong length for $id frame"), next;
1120
+ }
1121
+ unless ($tagInfo) {
1122
+ $verbose and $exifTool->VerboseInfo($id, $tagInfo,
1123
+ Table => $tagTablePtr,
1124
+ Value => $val,
1125
+ DataPt => $dataPt,
1126
+ DataPos => $$dirInfo{DataPos},
1127
+ Size => $len,
1128
+ Start => $offset,
1129
+ );
1130
+ next;
1131
+ }
1132
+ #
1133
+ # decode data in this frame (it is bad form to hard-code these, but the ID3 frame formats
1134
+ # are so variable that it would be more work to define format types for each of them)
1135
+ #
1136
+ my $lang;
1137
+ my $valLen = length($val); # actual value length (after decompression, etc)
1138
+ if ($id =~ /^(TXX|TXXX)$/) {
1139
+ # two encoded strings separated by a null
1140
+ my @vals = DecodeString($exifTool, $val);
1141
+ foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
1142
+ ($val = "($vals[0]) $vals[1]") =~ s/^\(\) //;
1143
+ } elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS)$/) {
1144
+ $val = DecodeString($exifTool, $val);
1145
+ } elsif ($id =~ /^(WXX|WXXX)$/) {
1146
+ # one encoded string and one Latin string separated by a null
1147
+ my $enc = unpack('C', $val);
1148
+ my $url;
1149
+ if ($enc == 1 or $enc == 2) {
1150
+ ($val, $url) = ($val =~ /^(.(?:..)*?)\0\0(.*)/s);
1151
+ } else {
1152
+ ($val, $url) = ($val =~ /^(..*?)\0(.*)/s);
1153
+ }
1154
+ unless (defined $val and defined $url) {
1155
+ $exifTool->Warn("Invalid $id frame value");
1156
+ next;
1157
+ }
1158
+ $val = DecodeString($exifTool, $val);
1159
+ $url =~ s/\0.*//s;
1160
+ $val = length($val) ? "($val) $url" : $url;
1161
+ } elsif ($id =~ /^W/) {
1162
+ $val =~ s/\0.*//s; # truncate at null
1163
+ } elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
1164
+ $valLen > 4 or $exifTool->Warn("Short $id frame"), next;
1165
+ $lang = substr($val,1,3);
1166
+ my @vals = DecodeString($exifTool, substr($val,4), Get8u(\$val,0));
1167
+ foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
1168
+ $val = length($vals[0]) ? "($vals[0]) $vals[1]" : $vals[1];
1169
+ } elsif ($id eq 'USER') {
1170
+ $valLen > 4 or $exifTool->Warn("Short $id frame"), next;
1171
+ $lang = substr($val,1,3);
1172
+ $val = DecodeString($exifTool, substr($val,4), Get8u(\$val,0));
1173
+ } elsif ($id =~ /^(CNT|PCNT)$/) {
1174
+ $valLen >= 4 or $exifTool->Warn("Short $id frame"), next;
1175
+ my ($cnt, @xtra) = unpack('NC*', $val);
1176
+ $cnt = ($cnt << 8) + $_ foreach @xtra;
1177
+ $val = $cnt;
1178
+ } elsif ($id =~ /^(PIC|APIC)$/) {
1179
+ $valLen >= 4 or $exifTool->Warn("Short $id frame"), next;
1180
+ my ($hdr, $attr);
1181
+ my $enc = unpack('C', $val);
1182
+ if ($enc == 1 or $enc == 2) {
1183
+ $hdr = ($id eq 'PIC') ? ".(...)(.)((?:..)*?)\0\0" : ".(.*?)\0(.)((?:..)*?)\0\0";
1184
+ } else {
1185
+ $hdr = ($id eq 'PIC') ? ".(...)(.)(.*?)\0" : ".(.*?)\0(.)(.*?)\0";
1186
+ }
1187
+ # remove header (encoding, image format or MIME type, picture type, description)
1188
+ $val =~ s/^$hdr//s or $exifTool->Warn("Invalid $id frame"), next;
1189
+ my @attrs = ($1, ord($2), DecodeString($exifTool, $3, $enc));
1190
+ my $i = 1;
1191
+ foreach $attr (@attrs) {
1192
+ # must store descriptions even if they are empty to maintain
1193
+ # sync between copy numbers when multiple images
1194
+ $exifTool->HandleTag($tagTablePtr, "$id-$i", $attr);
1195
+ ++$i;
1196
+ }
1197
+ } elsif ($id eq 'POP' or $id eq 'POPM') {
1198
+ # _email, 00, rating(1), counter(4-N)
1199
+ my ($email, $dat) = ($val =~ /^([^\0]*)\0(.*)$/s);
1200
+ unless (defined $dat and length($dat)) {
1201
+ $exifTool->Warn("Invalid $id frame");
1202
+ next;
1203
+ }
1204
+ my ($rating, @xtra) = unpack('C*', $dat);
1205
+ my $cnt = 0;
1206
+ $cnt = ($cnt << 8) + $_ foreach @xtra;
1207
+ $val = "$email $rating $cnt";
1208
+ } elsif ($id eq 'OWNE') {
1209
+ # enc(1), _price, 00, _date(8), Seller
1210
+ my @strs = DecodeString($exifTool, $val);
1211
+ $strs[1] =~ s/^(\d{4})(\d{2})(\d{2})/$1:$2:$3 /s if $strs[1]; # format date
1212
+ $val = "@strs";
1213
+ } elsif ($id eq 'RVA' or $id eq 'RVAD') {
1214
+ my @dat = unpack('C*', $val);
1215
+ my $flag = shift @dat;
1216
+ my $bits = shift @dat or $exifTool->Warn("Short $id frame"), next;
1217
+ my $bytes = int(($bits + 7) / 8);
1218
+ my @parse = (['Right',0,2,0x01],['Left',1,3,0x02],['Back-right',4,6,0x04],
1219
+ ['Back-left',5,7,0x08],['Center',8,9,0x10],['Bass',10,11,0x20]);
1220
+ $val = '';
1221
+ while (@parse) {
1222
+ my $elem = shift @parse;
1223
+ my $j = $$elem[2] * $bytes;
1224
+ last if scalar(@dat) < $j + $bytes;
1225
+ my $i = $$elem[1] * $bytes;
1226
+ $val .= ', ' if $val;
1227
+ my ($rel, $pk, $b);
1228
+ for ($rel=0, $pk=0, $b=0; $b<$bytes; ++$b) {
1229
+ $rel = $rel * 256 + $dat[$i + $b];
1230
+ $pk = $pk * 256 + $dat[$j + $b]; # (peak - not used in printout)
1231
+ }
1232
+ $rel =-$rel unless $flag & $$elem[3];
1233
+ $val .= sprintf("%+.1f%% %s", 100 * $rel / ((1<<$bits)-1), $$elem[0]);
1234
+ }
1235
+ } elsif ($id eq 'RVA2') {
1236
+ my ($pos, $id) = $val=~/^([^\0]*)\0/s ? (length($1)+1, $1) : (1, '');
1237
+ my @vals;
1238
+ while ($pos + 4 <= $valLen) {
1239
+ my $type = Get8u(\$val, $pos);
1240
+ my $str = ({
1241
+ 0 => 'Other',
1242
+ 1 => 'Master',
1243
+ 2 => 'Front-right',
1244
+ 3 => 'Front-left',
1245
+ 4 => 'Back-right',
1246
+ 5 => 'Back-left',
1247
+ 6 => 'Front-centre',
1248
+ 7 => 'Back-centre',
1249
+ 8 => 'Subwoofer',
1250
+ }->{$type} || "Unknown($type)");
1251
+ my $db = Get16s(\$val,$pos+1) / 512;
1252
+ # convert dB to percent as displayed by iTunes 10.5
1253
+ # (not sure why I need to divide by 20 instead of 10 as expected - PH)
1254
+ push @vals, sprintf('%+.1f%% %s', 10**($db/20+2)-100, $str);
1255
+ # step to next channel (ignoring peak volume)
1256
+ $pos += 4 + int((Get8u(\$val,$pos+3) + 7) / 8);
1257
+ }
1258
+ $val = join ', ', @vals;
1259
+ $val .= " ($id)" if $id;
1260
+ } elsif ($id eq 'PRIV') {
1261
+ # save version number to set group1 name for tag later
1262
+ $exifTool->{ID3_Ver} = $tagTablePtr->{GROUPS}->{1};
1263
+ $exifTool->HandleTag($tagTablePtr, $id, $val);
1264
+ next;
1265
+ } elsif ($$tagInfo{Format} or $$tagInfo{SubDirectory}) {
1266
+ $exifTool->HandleTag($tagTablePtr, $id, undef, DataPt => \$val);
1267
+ next;
1268
+ } elsif (not $$tagInfo{Binary}) {
1269
+ $exifTool->Warn("Don't know how to handle $id frame");
1270
+ next;
1271
+ }
1272
+ if ($lang and $lang =~ /^[a-z]{3}$/i and $lang ne 'eng') {
1273
+ $tagInfo = Image::ExifTool::GetLangInfo($tagInfo, lc $lang);
1274
+ }
1275
+ $exifTool->HandleTag($tagTablePtr, $id, $val,
1276
+ TagInfo => $tagInfo,
1277
+ DataPt => $dataPt,
1278
+ DataPos => $$dirInfo{DataPos},
1279
+ Size => $len,
1280
+ Start => $offset,
1281
+ );
1282
+ }
1283
+ }
1284
+
1285
+ #------------------------------------------------------------------------------
1286
+ # Extract ID3 information from an audio file
1287
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference
1288
+ # Returns: 1 on success, 0 if this file didn't contain ID3 information
1289
+ # - also processes audio data if any ID3 information was found
1290
+ # - sets ExifTool DoneID3 to 1 when called, or to 2 if an ID3v1 trailer exists
1291
+ sub ProcessID3($$)
1292
+ {
1293
+ my ($exifTool, $dirInfo) = @_;
1294
+
1295
+ return 0 if $exifTool->{DoneID3}; # avoid infinite recursion
1296
+ $exifTool->{DoneID3} = 1;
1297
+
1298
+ # allow this to be called with either RAF or DataPt
1299
+ my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
1300
+ my ($buff, %id3Header, %id3Trailer, $hBuff, $tBuff, $eBuff, $tagTablePtr);
1301
+ my $rtnVal = 0;
1302
+ my $hdrEnd = 0;
1303
+ my $id3Len = 0;
1304
+
1305
+ # read first 3 bytes of file
1306
+ $raf->Seek(0, 0);
1307
+ return 0 unless $raf->Read($buff, 3) == 3;
1308
+ #
1309
+ # identify ID3v2 header
1310
+ #
1311
+ while ($buff =~ /^ID3/) {
1312
+ $rtnVal = 1;
1313
+ $raf->Read($hBuff, 7) == 7 or $exifTool->Warn('Short ID3 header'), last;
1314
+ my ($vers, $flags, $size) = unpack('nCN', $hBuff);
1315
+ $size = UnSyncSafe($size);
1316
+ defined $size or $exifTool->Warn('Invalid ID3 header'), last;
1317
+ my $verStr = sprintf("2.%d.%d", $vers >> 8, $vers & 0xff);
1318
+ if ($vers >= 0x0500) {
1319
+ $exifTool->Warn("Unsupported ID3 version: $verStr");
1320
+ last;
1321
+ }
1322
+ unless ($raf->Read($hBuff, $size) == $size) {
1323
+ $exifTool->Warn('Truncated ID3 data');
1324
+ last;
1325
+ }
1326
+ # this flag only indicates use of unsynchronized frames in ID3v2.4
1327
+ if ($flags & 0x80 and $vers < 0x0400) {
1328
+ # reverse the unsynchronization
1329
+ $hBuff =~ s/\xff\x00/\xff/g;
1330
+ }
1331
+ my $pos = 10;
1332
+ if ($flags & 0x40) {
1333
+ # skip the extended header
1334
+ $size >= 4 or $exifTool->Warn('Bad ID3 extended header'), last;
1335
+ my $len = unpack('N', $hBuff);
1336
+ if ($len > length($hBuff) - 4) {
1337
+ $exifTool->Warn('Truncated ID3 extended header');
1338
+ last;
1339
+ }
1340
+ $hBuff = substr($hBuff, $len + 4);
1341
+ $pos += $len + 4;
1342
+ }
1343
+ if ($flags & 0x10) {
1344
+ # ignore v2.4 footer (10 bytes long)
1345
+ $raf->Seek(10, 1);
1346
+ }
1347
+ %id3Header = (
1348
+ DataPt => \$hBuff,
1349
+ DataPos => $pos,
1350
+ DirStart => 0,
1351
+ DirLen => length($hBuff),
1352
+ Version => $vers,
1353
+ DirName => "ID3v$verStr",
1354
+ );
1355
+ $id3Len += length($hBuff) + 10;
1356
+ if ($vers >= 0x0400) {
1357
+ $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_4');
1358
+ } elsif ($vers >= 0x0300) {
1359
+ $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_3');
1360
+ } else {
1361
+ $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v2_2');
1362
+ }
1363
+ $hdrEnd = $raf->Tell();
1364
+ last;
1365
+ }
1366
+ #
1367
+ # read ID3v1 trailer if it exists
1368
+ #
1369
+ if ($raf->Seek(-128, 2) and $raf->Read($tBuff, 128) == 128 and $tBuff =~ /^TAG/) {
1370
+ $exifTool->{DoneID3} = 2; # set to 2 as flag that trailer exists
1371
+ %id3Trailer = (
1372
+ DataPt => \$tBuff,
1373
+ DataPos => $raf->Tell() - 128,
1374
+ DirStart => 0,
1375
+ DirLen => length($tBuff),
1376
+ );
1377
+ $id3Len += length($tBuff);
1378
+ $rtnVal = 1;
1379
+ # load 'Enhanced TAG' information if available
1380
+ if ($raf->Seek(-355, 2) and $raf->Read($eBuff, 227) == 227 and $eBuff =~ /^TAG+/) {
1381
+ $id3Trailer{EnhancedTAG} = \$eBuff;
1382
+ }
1383
+ }
1384
+ #
1385
+ # process the the information
1386
+ #
1387
+ if ($rtnVal) {
1388
+ # first process audio data if it exists
1389
+ if ($$dirInfo{RAF}) {
1390
+ my $oldType = $exifTool->{FILE_TYPE}; # save file type
1391
+ # check current file type first
1392
+ my @types = grep /^$oldType$/, @audioFormats;
1393
+ push @types, grep(!/^$oldType$/, @audioFormats);
1394
+ my $type;
1395
+ foreach $type (@types) {
1396
+ # seek to end of ID3 header
1397
+ $raf->Seek($hdrEnd, 0);
1398
+ # set type for this file if we are successful
1399
+ $exifTool->{FILE_TYPE} = $type;
1400
+ my $module = $audioModule{$type} || $type;
1401
+ require "Image/ExifTool/$module.pm" or next;
1402
+ my $func = "Image::ExifTool::${module}::Process$type";
1403
+ # process the file
1404
+ no strict 'refs';
1405
+ &$func($exifTool, $dirInfo) and last;
1406
+ use strict 'refs';
1407
+ }
1408
+ $exifTool->{FILE_TYPE} = $oldType; # restore original file type
1409
+ }
1410
+ # set file type to MP3 if we didn't find audio data
1411
+ $exifTool->SetFileType('MP3');
1412
+ # record the size of the ID3 metadata
1413
+ $exifTool->FoundTag('ID3Size', $id3Len);
1414
+ # process ID3v2 header if it exists
1415
+ if (%id3Header) {
1416
+ $exifTool->VPrint(0, "$id3Header{DirName}:\n");
1417
+ $exifTool->ProcessDirectory(\%id3Header, $tagTablePtr);
1418
+ }
1419
+ # process ID3v1 trailer if it exists
1420
+ if (%id3Trailer) {
1421
+ $exifTool->VPrint(0, "ID3v1:\n");
1422
+ SetByteOrder('MM');
1423
+ $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1');
1424
+ $exifTool->ProcessDirectory(\%id3Trailer, $tagTablePtr);
1425
+ # process "Enhanced TAG" information if available
1426
+ if ($id3Trailer{EnhancedTAG}) {
1427
+ $exifTool->VPrint(0, "ID3v1 Enhanced TAG:\n");
1428
+ $tagTablePtr = GetTagTable('Image::ExifTool::ID3::v1_Enh');
1429
+ $id3Trailer{DataPt} = $id3Trailer{EnhancedTAG};
1430
+ $id3Trailer{DataPos} -= 227; # (227 = length of Enhanced TAG block)
1431
+ $id3Trailer{DirLen} = 227;
1432
+ $exifTool->ProcessDirectory(\%id3Trailer, $tagTablePtr);
1433
+ }
1434
+ }
1435
+ }
1436
+ # return file pointer to start of file to read audio data if necessary
1437
+ $raf->Seek(0, 0);
1438
+ return $rtnVal;
1439
+ }
1440
+
1441
+ #------------------------------------------------------------------------------
1442
+ # Extract ID3 information from an MP3 audio file
1443
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference
1444
+ # Returns: 1 on success, 0 if this wasn't a valid MP3 file
1445
+ sub ProcessMP3($$)
1446
+ {
1447
+ my ($exifTool, $dirInfo) = @_;
1448
+ my $rtnVal = 0;
1449
+
1450
+ # must first check for leading/trailing ID3 information
1451
+ # (and process the rest of the file if found)
1452
+ unless ($exifTool->{DoneID3}) {
1453
+ $rtnVal = ProcessID3($exifTool, $dirInfo);
1454
+ }
1455
+
1456
+ # check for MPEG A/V data if not already processed above
1457
+ unless ($rtnVal) {
1458
+ my $raf = $$dirInfo{RAF};
1459
+ my $buff;
1460
+ #
1461
+ # extract information from first audio/video frame headers
1462
+ # (if found in the first $scanLen bytes)
1463
+ #
1464
+ # scan further into a file that should be an MP3
1465
+ my $scanLen = ($$exifTool{FILE_EXT} and $$exifTool{FILE_EXT} eq 'MP3') ? 8192 : 256;
1466
+ if ($raf->Read($buff, $scanLen)) {
1467
+ require Image::ExifTool::MPEG;
1468
+ if ($buff =~ /\0\0\x01(\xb3|\xc0)/) {
1469
+ # look for A/V headers in first 64kB
1470
+ my $buf2;
1471
+ $raf->Read($buf2, 0x10000 - $scanLen) and $buff .= $buf2;
1472
+ $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudioVideo($exifTool, \$buff);
1473
+ } else {
1474
+ # look for audio frame sync in first $scanLen bytes
1475
+ # (set MP3 flag to 1 so this will fail unless layer 3 audio)
1476
+ $rtnVal = 1 if Image::ExifTool::MPEG::ParseMPEGAudio($exifTool, \$buff, 1);
1477
+ }
1478
+ }
1479
+ }
1480
+
1481
+ # check for an APE trailer if this was a valid A/V file and we haven't already done it
1482
+ if ($rtnVal and not $exifTool->{DoneAPE}) {
1483
+ require Image::ExifTool::APE;
1484
+ Image::ExifTool::APE::ProcessAPE($exifTool, $dirInfo);
1485
+ }
1486
+ return $rtnVal;
1487
+ }
1488
+
1489
+ 1; # end
1490
+
1491
+ __END__
1492
+
1493
+ =head1 NAME
1494
+
1495
+ Image::ExifTool::ID3 - Read ID3 meta information
1496
+
1497
+ =head1 SYNOPSIS
1498
+
1499
+ This module is used by Image::ExifTool
1500
+
1501
+ =head1 DESCRIPTION
1502
+
1503
+ This module contains definitions required by Image::ExifTool to extract ID3
1504
+ information from audio files. ID3 information is found in MP3 and various
1505
+ other types of audio files.
1506
+
1507
+ =head1 AUTHOR
1508
+
1509
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
1510
+
1511
+ This library is free software; you can redistribute it and/or modify it
1512
+ under the same terms as Perl itself.
1513
+
1514
+ =head1 REFERENCES
1515
+
1516
+ =over 4
1517
+
1518
+ =item L<http://www.id3.org/>
1519
+
1520
+ =item L<http://www.mp3-tech.org/>
1521
+
1522
+ =item L<http://www.fortunecity.com/underworld/sonic/3/id3tag.html>
1523
+
1524
+ =back
1525
+
1526
+ =head1 SEE ALSO
1527
+
1528
+ L<Image::ExifTool::TagNames/ID3 Tags>,
1529
+ L<Image::ExifTool(3pm)|Image::ExifTool>
1530
+
1531
+ =cut
1532
+