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.
- checksums.yaml +15 -0
- data/bin/Image-ExifTool-9.33/Changes +6241 -0
- data/bin/Image-ExifTool-9.33/MANIFEST +859 -0
- data/bin/Image-ExifTool-9.33/META.yml +27 -0
- data/bin/Image-ExifTool-9.33/Makefile.PL +41 -0
- data/bin/Image-ExifTool-9.33/README +227 -0
- data/bin/Image-ExifTool-9.33/arg_files/exif2iptc.args +24 -0
- data/bin/Image-ExifTool-9.33/arg_files/exif2xmp.args +38 -0
- data/bin/Image-ExifTool-9.33/arg_files/gps2xmp.args +20 -0
- data/bin/Image-ExifTool-9.33/arg_files/iptc2exif.args +17 -0
- data/bin/Image-ExifTool-9.33/arg_files/iptc2xmp.args +53 -0
- data/bin/Image-ExifTool-9.33/arg_files/iptcCore.args +172 -0
- data/bin/Image-ExifTool-9.33/arg_files/pdf2xmp.args +23 -0
- data/bin/Image-ExifTool-9.33/arg_files/xmp2exif.args +39 -0
- data/bin/Image-ExifTool-9.33/arg_files/xmp2gps.args +24 -0
- data/bin/Image-ExifTool-9.33/arg_files/xmp2iptc.args +62 -0
- data/bin/Image-ExifTool-9.33/arg_files/xmp2pdf.args +23 -0
- data/bin/Image-ExifTool-9.33/config_files/ExifTool_config +299 -0
- data/bin/Image-ExifTool-9.33/config_files/convert_regions.config +81 -0
- data/bin/Image-ExifTool-9.33/exiftool +5715 -0
- data/bin/Image-ExifTool-9.33/fmt_files/gpx.fmt +29 -0
- data/bin/Image-ExifTool-9.33/fmt_files/gpx_wpt.fmt +33 -0
- data/bin/Image-ExifTool-9.33/fmt_files/kml.fmt +53 -0
- data/bin/Image-ExifTool-9.33/html/ExifTool.html +1959 -0
- data/bin/Image-ExifTool-9.33/html/MIE1.1-20070121.pdf +0 -0
- data/bin/Image-ExifTool-9.33/html/Shift.html +173 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/AFCP.html +53 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/AIFF.html +146 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/APE.html +149 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/APP12.html +188 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/ASF.html +1066 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/BMP.html +110 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Canon.html +8062 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/CanonCustom.html +2044 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/CanonRaw.html +561 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/CanonVRD.html +1222 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Casio.html +1569 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Composite.html +665 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/DICOM.html +15762 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/DNG.html +273 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/DV.html +75 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/DarwinCore.html +1445 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/DjVu.html +313 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/EXE.html +697 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/EXIF.html +3244 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Extra.html +301 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/FLAC.html +183 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/FLIR.html +931 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Flash.html +419 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/FlashPix.html +1435 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Font.html +485 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/FotoStation.html +103 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/FujiFilm.html +637 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/GE.html +40 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/GIF.html +116 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/GIMP.html +140 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/GPS.html +222 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/GeoTiff.html +2177 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/H264.html +393 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/HP.html +155 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/HTML.html +666 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/ICC_Profile.html +710 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/ID3.html +1473 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/IPTC.html +895 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/ITC.html +90 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/JFIF.html +61 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/JPEG.html +523 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/JVC.html +56 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Jpeg2000.html +464 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Kodak.html +1759 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/KyoceraRaw.html +92 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/LNK.html +478 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Leaf.html +870 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/M2TS.html +133 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MIE.html +1026 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MIFF.html +196 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MNG.html +847 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MPC.html +97 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MPEG.html +249 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MPF.html +199 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MWG.html +563 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MXF.html +6673 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Matroska.html +1069 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Microsoft.html +2066 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Minolta.html +2555 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/MinoltaRaw.html +326 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Nikon.html +4467 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/NikonCapture.html +776 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/NikonCustom.html +3835 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/OOXML.html +280 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Ogg.html +44 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Olympus.html +3386 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/OpenEXR.html +222 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PDF.html +745 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PGF.html +80 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PICT.html +753 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PLIST.html +86 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PNG.html +515 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PSP.html +160 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Panasonic.html +1452 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PanasonicRaw.html +214 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Pentax.html +4332 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PhaseOne.html +258 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PhotoCD.html +402 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PhotoMechanic.html +196 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Photoshop.html +555 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PostScript.html +125 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/PrintIM.html +31 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Qualcomm.html +4778 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/QuickTime.html +3104 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/RIFF.html +1164 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/RSRC.html +74 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/RTF.html +150 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Radiance.html +87 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Rawzor.html +45 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Real.html +780 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Reconyx.html +132 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Ricoh.html +456 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Samsung.html +419 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Sanyo.html +366 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Shortcuts.html +237 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Sigma.html +372 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/SigmaRaw.html +403 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Sony.html +4279 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/SonyIDC.html +267 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Stim.html +200 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Theora.html +102 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Unknown.html +31 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/Vorbis.html +228 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/XMP.html +7234 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/ZIP.html +204 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/iWork.html +49 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/index.html +192 -0
- data/bin/Image-ExifTool-9.33/html/TagNames/style.css +31 -0
- data/bin/Image-ExifTool-9.33/html/ancient_history.html +6727 -0
- data/bin/Image-ExifTool-9.33/html/canon_raw.html +366 -0
- data/bin/Image-ExifTool-9.33/html/commentary.html +319 -0
- data/bin/Image-ExifTool-9.33/html/config.html +312 -0
- data/bin/Image-ExifTool-9.33/html/data_members.html +265 -0
- data/bin/Image-ExifTool-9.33/html/exiftool_pod.html +2338 -0
- data/bin/Image-ExifTool-9.33/html/faq.html +1434 -0
- data/bin/Image-ExifTool-9.33/html/filename.html +281 -0
- data/bin/Image-ExifTool-9.33/html/geotag.html +642 -0
- data/bin/Image-ExifTool-9.33/html/history.html +358 -0
- data/bin/Image-ExifTool-9.33/html/htmldump.html +732 -0
- data/bin/Image-ExifTool-9.33/html/idiosyncracies.html +251 -0
- data/bin/Image-ExifTool-9.33/html/index.html +1271 -0
- data/bin/Image-ExifTool-9.33/html/install.html +239 -0
- data/bin/Image-ExifTool-9.33/html/metafiles.html +266 -0
- data/bin/Image-ExifTool-9.33/html/overview.png +0 -0
- data/bin/Image-ExifTool-9.33/html/standards.html +277 -0
- data/bin/Image-ExifTool-9.33/html/struct.html +342 -0
- data/bin/Image-ExifTool-9.33/html/style.css +31 -0
- data/bin/Image-ExifTool-9.33/html/under.html +124 -0
- data/bin/Image-ExifTool-9.33/html/verbose.html +195 -0
- data/bin/Image-ExifTool-9.33/html/writing.html +239 -0
- data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pm +378 -0
- data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pod +231 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pm +6815 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pod +2385 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AES.pm +501 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AFCP.pm +284 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AIFF.pm +271 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APE.pm +262 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APP12.pm +322 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ASF.pm +884 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BMP.pm +179 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BZZ.pm +472 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BigTIFF.pm +282 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BuildTagLookup.pm +2400 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Canon.pm +7794 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonCustom.pm +2523 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonRaw.pm +931 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonVRD.pm +1481 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CaptureOne.pm +235 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Casio.pm +2013 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset.pm +396 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Arabic.pm +39 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Baltic.pm +35 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Cyrillic.pm +45 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Greek.pm +40 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Hebrew.pm +36 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/JIS.pm +1735 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin.pm +24 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin2.pm +36 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacArabic.pm +47 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseCN.pm +2088 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseTW.pm +3623 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCroatian.pm +43 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCyrillic.pm +47 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacGreek.pm +45 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacHebrew.pm +47 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacIceland.pm +42 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacJapanese.pm +1933 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacKorean.pm +2720 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacLatin2.pm +44 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRSymbol.pm +2087 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRoman.pm +42 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRomanian.pm +42 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacThai.pm +49 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacTurkish.pm +42 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/PDFDoc.pm +28 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/ShiftJIS.pm +1835 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Symbol.pm +54 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Thai.pm +41 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Turkish.pm +25 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Vietnam.pm +27 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DICOM.pm +3835 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DNG.pm +835 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DV.pm +319 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DarwinCore.pm +317 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DjVu.pm +376 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/EXE.pm +1228 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Exif.pm +4542 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLAC.pm +296 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLIR.pm +972 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Fixup.pm +354 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Flash.pm +755 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FlashPix.pm +1882 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Font.pm +643 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FotoStation.pm +258 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FujiFilm.pm +1020 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GE.pm +80 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIF.pm +542 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIMP.pm +258 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GPS.pm +511 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GeoTiff.pm +2187 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Geotag.pm +1173 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/H264.pm +1102 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HP.pm +262 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HTML.pm +576 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HtmlDump.pm +895 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ICC_Profile.pm +999 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ID3.pm +1532 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/IPTC.pm +1244 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ITC.pm +215 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Import.pm +308 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/InDesign.pm +277 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEG.pm +588 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JVC.pm +130 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Jpeg2000.pm +881 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Kodak.pm +2014 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/LNK.pm +723 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/cs.pm +1586 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/de.pm +7356 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/es.pm +4016 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fi.pm +2856 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fr.pm +4720 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/it.pm +7917 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ja.pm +5815 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ko.pm +2332 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/nl.pm +3220 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/pl.pm +1140 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ru.pm +769 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/sv.pm +639 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/tr.pm +544 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Leaf.pm +515 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/M2TS.pm +729 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIE.pm +2561 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIEUnits.pod +377 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIFF.pm +279 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MNG.pm +684 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPC.pm +156 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPEG.pm +736 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPF.pm +289 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MWG.pm +736 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MXF.pm +3032 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MakerNotes.pm +1573 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Matroska.pm +891 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Microsoft.pm +879 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Minolta.pm +2833 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Nikon.pm +6116 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCapture.pm +911 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCustom.pm +4405 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OOXML.pm +409 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ogg.pm +237 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Olympus.pm +3582 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OpenEXR.pm +324 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PDF.pm +2327 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PGF.pm +143 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PICT.pm +1260 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PLIST.pm +449 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PNG.pm +1100 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PPM.pm +169 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PSP.pm +305 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Panasonic.pm +1995 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Pentax.pm +5489 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhaseOne.pm +557 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoCD.pm +507 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Photoshop.pm +629 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PostScript.pm +693 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PrintIM.pm +125 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Qualcomm.pm +1344 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/QuickTime.pm +3519 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/README +944 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RIFF.pm +1322 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RSRC.pm +241 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RTF.pm +383 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Radiance.pm +144 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Rawzor.pm +190 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Real.pm +736 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Reconyx.pm +190 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ricoh.pm +741 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Samsung.pm +820 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sanyo.pm +439 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shift.pl +594 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shortcuts.pm +291 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sigma.pm +574 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SigmaRaw.pm +649 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sony.pm +5722 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SonyIDC.pm +330 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Stim.pm +196 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagInfoXML.pm +792 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagLookup.pm +8005 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagNames.pod +25950 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Theora.pm +145 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Unknown.pm +66 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Vorbis.pm +237 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteExif.pl +3674 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteIPTC.pl +702 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePDF.pl +759 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePNG.pl +330 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePostScript.pl +777 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteXMP.pl +1318 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Writer.pl +5779 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP.pm +3634 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP2.pl +1298 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMPStruct.pl +813 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ZIP.pm +623 -0
- data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/iWork.pm +223 -0
- data/bin/Image-ExifTool-9.33/perl-Image-ExifTool.spec +104 -0
- data/bin/Image-ExifTool-9.33/t/AFCP.t +44 -0
- data/bin/Image-ExifTool-9.33/t/AFCP_2.out +37 -0
- data/bin/Image-ExifTool-9.33/t/AFCP_3.out +20 -0
- data/bin/Image-ExifTool-9.33/t/AIFF.t +28 -0
- data/bin/Image-ExifTool-9.33/t/AIFF_2.out +31 -0
- data/bin/Image-ExifTool-9.33/t/APE.t +38 -0
- data/bin/Image-ExifTool-9.33/t/APE_2.out +28 -0
- data/bin/Image-ExifTool-9.33/t/APE_3.out +57 -0
- data/bin/Image-ExifTool-9.33/t/ASF.t +28 -0
- data/bin/Image-ExifTool-9.33/t/ASF_2.out +54 -0
- data/bin/Image-ExifTool-9.33/t/BMP.t +28 -0
- data/bin/Image-ExifTool-9.33/t/BMP_2.out +21 -0
- data/bin/Image-ExifTool-9.33/t/BigTIFF.t +28 -0
- data/bin/Image-ExifTool-9.33/t/BigTIFF_2.out +19 -0
- data/bin/Image-ExifTool-9.33/t/Canon.t +41 -0
- data/bin/Image-ExifTool-9.33/t/CanonRaw.t +126 -0
- data/bin/Image-ExifTool-9.33/t/CanonRaw_2.out +165 -0
- data/bin/Image-ExifTool-9.33/t/CanonRaw_4.out +217 -0
- data/bin/Image-ExifTool-9.33/t/CanonRaw_5.out +207 -0
- data/bin/Image-ExifTool-9.33/t/CanonRaw_6.out +231 -0
- data/bin/Image-ExifTool-9.33/t/CanonRaw_7.out +247 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD.t +129 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_11.out +118 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_12.out +12 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_2.out +116 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_3.out +116 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_4.out +2 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_5.out +3 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_6.out +3 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_7.out +2 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_8.out +2 -0
- data/bin/Image-ExifTool-9.33/t/CanonVRD_9.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Canon_2.out +350 -0
- data/bin/Image-ExifTool-9.33/t/Canon_3.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Casio.t +54 -0
- data/bin/Image-ExifTool-9.33/t/Casio_2.out +70 -0
- data/bin/Image-ExifTool-9.33/t/Casio_3.out +100 -0
- data/bin/Image-ExifTool-9.33/t/Casio_4.out +26 -0
- data/bin/Image-ExifTool-9.33/t/Casio_5.out +78 -0
- data/bin/Image-ExifTool-9.33/t/Casio_6.out +115 -0
- data/bin/Image-ExifTool-9.33/t/DICOM.t +28 -0
- data/bin/Image-ExifTool-9.33/t/DICOM_2.out +108 -0
- data/bin/Image-ExifTool-9.33/t/DNG.t +39 -0
- data/bin/Image-ExifTool-9.33/t/DNG_2.out +326 -0
- data/bin/Image-ExifTool-9.33/t/DNG_3.out +4 -0
- data/bin/Image-ExifTool-9.33/t/DV.t +27 -0
- data/bin/Image-ExifTool-9.33/t/DV_2.out +24 -0
- data/bin/Image-ExifTool-9.33/t/DjVu.t +28 -0
- data/bin/Image-ExifTool-9.33/t/DjVu_2.out +44 -0
- data/bin/Image-ExifTool-9.33/t/EXE.t +31 -0
- data/bin/Image-ExifTool-9.33/t/EXE_2.out +40 -0
- data/bin/Image-ExifTool-9.33/t/EXE_3.out +15 -0
- data/bin/Image-ExifTool-9.33/t/EXE_4.out +14 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool.t +284 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_16.out +180 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_17.out +594 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_2.out +399 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_20.out +1 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_21.out +1 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_22.out +1 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_23.out +6 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_24.out +3 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_25.out +13 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_26.out +12 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_3.out +87 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_4.out +41 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_5.out +6 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_6.out +68 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_7.out +125 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_8.out +125 -0
- data/bin/Image-ExifTool-9.33/t/ExifTool_9.out +33 -0
- data/bin/Image-ExifTool-9.33/t/FLAC.t +37 -0
- data/bin/Image-ExifTool-9.33/t/FLAC_2.out +25 -0
- data/bin/Image-ExifTool-9.33/t/FLAC_3.out +19 -0
- data/bin/Image-ExifTool-9.33/t/FLIR.t +30 -0
- data/bin/Image-ExifTool-9.33/t/FLIR_2.out +104 -0
- data/bin/Image-ExifTool-9.33/t/FLIR_3.out +47 -0
- data/bin/Image-ExifTool-9.33/t/Flash.t +37 -0
- data/bin/Image-ExifTool-9.33/t/FlashPix.t +30 -0
- data/bin/Image-ExifTool-9.33/t/FlashPix_2.out +48 -0
- data/bin/Image-ExifTool-9.33/t/Flash_2.out +20 -0
- data/bin/Image-ExifTool-9.33/t/Flash_3.out +53 -0
- data/bin/Image-ExifTool-9.33/t/Font.t +30 -0
- data/bin/Image-ExifTool-9.33/t/Font_2.out +23 -0
- data/bin/Image-ExifTool-9.33/t/Font_3.out +35 -0
- data/bin/Image-ExifTool-9.33/t/Font_4.out +26 -0
- data/bin/Image-ExifTool-9.33/t/Font_5.out +26 -0
- data/bin/Image-ExifTool-9.33/t/Font_6.out +36 -0
- data/bin/Image-ExifTool-9.33/t/Font_7.out +36 -0
- data/bin/Image-ExifTool-9.33/t/FotoStation.t +38 -0
- data/bin/Image-ExifTool-9.33/t/FotoStation_2.out +39 -0
- data/bin/Image-ExifTool-9.33/t/FotoStation_3.out +3 -0
- data/bin/Image-ExifTool-9.33/t/FujiFilm.t +78 -0
- data/bin/Image-ExifTool-9.33/t/FujiFilm_2.out +87 -0
- data/bin/Image-ExifTool-9.33/t/FujiFilm_3.out +88 -0
- data/bin/Image-ExifTool-9.33/t/FujiFilm_4.out +117 -0
- data/bin/Image-ExifTool-9.33/t/FujiFilm_5.out +1 -0
- data/bin/Image-ExifTool-9.33/t/GE.t +46 -0
- data/bin/Image-ExifTool-9.33/t/GE_2.out +84 -0
- data/bin/Image-ExifTool-9.33/t/GE_3.out +84 -0
- data/bin/Image-ExifTool-9.33/t/GIF.t +83 -0
- data/bin/Image-ExifTool-9.33/t/GIF_2.out +40 -0
- data/bin/Image-ExifTool-9.33/t/GIF_3.out +41 -0
- data/bin/Image-ExifTool-9.33/t/GIF_4.out +16 -0
- data/bin/Image-ExifTool-9.33/t/GIMP.t +27 -0
- data/bin/Image-ExifTool-9.33/t/GIMP_2.out +63 -0
- data/bin/Image-ExifTool-9.33/t/GPS.t +42 -0
- data/bin/Image-ExifTool-9.33/t/GPS_2.out +94 -0
- data/bin/Image-ExifTool-9.33/t/GPS_3.out +96 -0
- data/bin/Image-ExifTool-9.33/t/GeoTiff.t +36 -0
- data/bin/Image-ExifTool-9.33/t/GeoTiff_2.out +36 -0
- data/bin/Image-ExifTool-9.33/t/GeoTiff_3.out +36 -0
- data/bin/Image-ExifTool-9.33/t/Geotag.t +164 -0
- data/bin/Image-ExifTool-9.33/t/Geotag_2.out +9 -0
- data/bin/Image-ExifTool-9.33/t/Geotag_3.out +6 -0
- data/bin/Image-ExifTool-9.33/t/Geotag_5.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Geotag_6.out +9 -0
- data/bin/Image-ExifTool-9.33/t/Geotag_7.out +53 -0
- data/bin/Image-ExifTool-9.33/t/Geotag_8.out +15 -0
- data/bin/Image-ExifTool-9.33/t/HTML.t +28 -0
- data/bin/Image-ExifTool-9.33/t/HTML_2.out +68 -0
- data/bin/Image-ExifTool-9.33/t/IPTC.t +157 -0
- data/bin/Image-ExifTool-9.33/t/IPTC_2.out +58 -0
- data/bin/Image-ExifTool-9.33/t/IPTC_4.out +56 -0
- data/bin/Image-ExifTool-9.33/t/IPTC_5.out +1 -0
- data/bin/Image-ExifTool-9.33/t/IPTC_6.out +2 -0
- data/bin/Image-ExifTool-9.33/t/IPTC_7.out +1 -0
- data/bin/Image-ExifTool-9.33/t/IPTC_8.out +20 -0
- data/bin/Image-ExifTool-9.33/t/ITC.t +28 -0
- data/bin/Image-ExifTool-9.33/t/ITC_2.out +19 -0
- data/bin/Image-ExifTool-9.33/t/InDesign.t +61 -0
- data/bin/Image-ExifTool-9.33/t/InDesign_2.out +19 -0
- data/bin/Image-ExifTool-9.33/t/InDesign_3.out +21 -0
- data/bin/Image-ExifTool-9.33/t/InDesign_4.out +11 -0
- data/bin/Image-ExifTool-9.33/t/JVC.t +36 -0
- data/bin/Image-ExifTool-9.33/t/JVC_2.out +3 -0
- data/bin/Image-ExifTool-9.33/t/JVC_3.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Jpeg2000.t +49 -0
- data/bin/Image-ExifTool-9.33/t/Jpeg2000_2.out +63 -0
- data/bin/Image-ExifTool-9.33/t/Jpeg2000_3.out +51 -0
- data/bin/Image-ExifTool-9.33/t/Jpeg2000_4.out +15 -0
- data/bin/Image-ExifTool-9.33/t/Kodak.t +40 -0
- data/bin/Image-ExifTool-9.33/t/Kodak_2.out +109 -0
- data/bin/Image-ExifTool-9.33/t/Kodak_3.out +119 -0
- data/bin/Image-ExifTool-9.33/t/KyoceraRaw.t +28 -0
- data/bin/Image-ExifTool-9.33/t/KyoceraRaw_2.out +27 -0
- data/bin/Image-ExifTool-9.33/t/LNK.t +28 -0
- data/bin/Image-ExifTool-9.33/t/LNK_2.out +45 -0
- data/bin/Image-ExifTool-9.33/t/Lang.t +40 -0
- data/bin/Image-ExifTool-9.33/t/Lang_1.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Lang_10.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_11.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_12.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_13.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_14.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_15.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_16.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_17.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_18.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_2.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_3.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_4.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_5.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_6.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_7.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_8.out +46 -0
- data/bin/Image-ExifTool-9.33/t/Lang_9.out +46 -0
- data/bin/Image-ExifTool-9.33/t/M2TS.t +29 -0
- data/bin/Image-ExifTool-9.33/t/M2TS_2.out +27 -0
- data/bin/Image-ExifTool-9.33/t/MIE.t +82 -0
- data/bin/Image-ExifTool-9.33/t/MIE_2.out +67 -0
- data/bin/Image-ExifTool-9.33/t/MIE_3.out +134 -0
- data/bin/Image-ExifTool-9.33/t/MIE_5.out +1 -0
- data/bin/Image-ExifTool-9.33/t/MIE_6.out +1 -0
- data/bin/Image-ExifTool-9.33/t/MIFF.t +28 -0
- data/bin/Image-ExifTool-9.33/t/MIFF_2.out +108 -0
- data/bin/Image-ExifTool-9.33/t/MP3.t +29 -0
- data/bin/Image-ExifTool-9.33/t/MP3_2.out +45 -0
- data/bin/Image-ExifTool-9.33/t/MWG.t +72 -0
- data/bin/Image-ExifTool-9.33/t/MWG_2.out +13 -0
- data/bin/Image-ExifTool-9.33/t/MWG_3.out +8 -0
- data/bin/Image-ExifTool-9.33/t/MWG_4.out +5 -0
- data/bin/Image-ExifTool-9.33/t/MWG_5.out +22 -0
- data/bin/Image-ExifTool-9.33/t/MXF.t +27 -0
- data/bin/Image-ExifTool-9.33/t/MXF_2.out +78 -0
- data/bin/Image-ExifTool-9.33/t/Matroska.t +29 -0
- data/bin/Image-ExifTool-9.33/t/Matroska_2.out +64 -0
- data/bin/Image-ExifTool-9.33/t/Minolta.t +50 -0
- data/bin/Image-ExifTool-9.33/t/Minolta_2.out +133 -0
- data/bin/Image-ExifTool-9.33/t/Minolta_3.out +146 -0
- data/bin/Image-ExifTool-9.33/t/Minolta_4.out +148 -0
- data/bin/Image-ExifTool-9.33/t/Nikon.t +114 -0
- data/bin/Image-ExifTool-9.33/t/Nikon_2.out +82 -0
- data/bin/Image-ExifTool-9.33/t/Nikon_3.out +98 -0
- data/bin/Image-ExifTool-9.33/t/Nikon_4.out +174 -0
- data/bin/Image-ExifTool-9.33/t/Nikon_5.out +167 -0
- data/bin/Image-ExifTool-9.33/t/Nikon_7.out +260 -0
- data/bin/Image-ExifTool-9.33/t/Nikon_8.out +4 -0
- data/bin/Image-ExifTool-9.33/t/Olympus.t +85 -0
- data/bin/Image-ExifTool-9.33/t/Olympus_2.out +79 -0
- data/bin/Image-ExifTool-9.33/t/Olympus_3.out +81 -0
- data/bin/Image-ExifTool-9.33/t/Olympus_4.out +192 -0
- data/bin/Image-ExifTool-9.33/t/Olympus_5.out +264 -0
- data/bin/Image-ExifTool-9.33/t/Olympus_6.out +151 -0
- data/bin/Image-ExifTool-9.33/t/Olympus_7.out +482 -0
- data/bin/Image-ExifTool-9.33/t/OpenEXR.t +28 -0
- data/bin/Image-ExifTool-9.33/t/OpenEXR_2.out +23 -0
- data/bin/Image-ExifTool-9.33/t/PDF.t +295 -0
- data/bin/Image-ExifTool-9.33/t/PDF_10.out +10 -0
- data/bin/Image-ExifTool-9.33/t/PDF_11.out +10 -0
- data/bin/Image-ExifTool-9.33/t/PDF_12.out +9 -0
- data/bin/Image-ExifTool-9.33/t/PDF_14.out +5 -0
- data/bin/Image-ExifTool-9.33/t/PDF_15.out +6 -0
- data/bin/Image-ExifTool-9.33/t/PDF_16.out +4 -0
- data/bin/Image-ExifTool-9.33/t/PDF_17.out +4 -0
- data/bin/Image-ExifTool-9.33/t/PDF_18.out +5 -0
- data/bin/Image-ExifTool-9.33/t/PDF_19.out +6 -0
- data/bin/Image-ExifTool-9.33/t/PDF_2.out +117 -0
- data/bin/Image-ExifTool-9.33/t/PDF_20.out +4 -0
- data/bin/Image-ExifTool-9.33/t/PDF_22.out +3 -0
- data/bin/Image-ExifTool-9.33/t/PDF_4.out +12 -0
- data/bin/Image-ExifTool-9.33/t/PDF_5.out +8 -0
- data/bin/Image-ExifTool-9.33/t/PDF_6.out +9 -0
- data/bin/Image-ExifTool-9.33/t/PDF_7.out +11 -0
- data/bin/Image-ExifTool-9.33/t/PDF_8.out +9 -0
- data/bin/Image-ExifTool-9.33/t/PDF_9.out +9 -0
- data/bin/Image-ExifTool-9.33/t/PGF.t +28 -0
- data/bin/Image-ExifTool-9.33/t/PGF_2.out +32 -0
- data/bin/Image-ExifTool-9.33/t/PICT.t +28 -0
- data/bin/Image-ExifTool-9.33/t/PICT_2.out +15 -0
- data/bin/Image-ExifTool-9.33/t/PLIST.t +31 -0
- data/bin/Image-ExifTool-9.33/t/PLIST_2.out +20 -0
- data/bin/Image-ExifTool-9.33/t/PLIST_3.out +20 -0
- data/bin/Image-ExifTool-9.33/t/PNG.t +75 -0
- data/bin/Image-ExifTool-9.33/t/PNG_2.out +22 -0
- data/bin/Image-ExifTool-9.33/t/PNG_3.out +118 -0
- data/bin/Image-ExifTool-9.33/t/PNG_4.out +12 -0
- data/bin/Image-ExifTool-9.33/t/PPM.t +40 -0
- data/bin/Image-ExifTool-9.33/t/PPM_2.out +15 -0
- data/bin/Image-ExifTool-9.33/t/PPM_3.out +9 -0
- data/bin/Image-ExifTool-9.33/t/PSP.t +28 -0
- data/bin/Image-ExifTool-9.33/t/PSP_2.out +32 -0
- data/bin/Image-ExifTool-9.33/t/Panasonic.t +60 -0
- data/bin/Image-ExifTool-9.33/t/Panasonic_2.out +99 -0
- data/bin/Image-ExifTool-9.33/t/Panasonic_3.out +119 -0
- data/bin/Image-ExifTool-9.33/t/Panasonic_4.out +177 -0
- data/bin/Image-ExifTool-9.33/t/Panasonic_5.out +228 -0
- data/bin/Image-ExifTool-9.33/t/Pentax.t +50 -0
- data/bin/Image-ExifTool-9.33/t/Pentax_2.out +219 -0
- data/bin/Image-ExifTool-9.33/t/Pentax_3.out +262 -0
- data/bin/Image-ExifTool-9.33/t/Pentax_4.out +123 -0
- data/bin/Image-ExifTool-9.33/t/PhotoCD.t +28 -0
- data/bin/Image-ExifTool-9.33/t/PhotoCD_2.out +35 -0
- data/bin/Image-ExifTool-9.33/t/PhotoMechanic.t +38 -0
- data/bin/Image-ExifTool-9.33/t/PhotoMechanic_2.out +81 -0
- data/bin/Image-ExifTool-9.33/t/PhotoMechanic_3.out +2 -0
- data/bin/Image-ExifTool-9.33/t/Photoshop.t +42 -0
- data/bin/Image-ExifTool-9.33/t/Photoshop_2.out +96 -0
- data/bin/Image-ExifTool-9.33/t/Photoshop_3.out +108 -0
- data/bin/Image-ExifTool-9.33/t/PostScript.t +49 -0
- data/bin/Image-ExifTool-9.33/t/PostScript_2.out +64 -0
- data/bin/Image-ExifTool-9.33/t/PostScript_3.out +132 -0
- data/bin/Image-ExifTool-9.33/t/QuickTime.t +31 -0
- data/bin/Image-ExifTool-9.33/t/QuickTime_2.out +128 -0
- data/bin/Image-ExifTool-9.33/t/QuickTime_3.out +69 -0
- data/bin/Image-ExifTool-9.33/t/RIFF.t +31 -0
- data/bin/Image-ExifTool-9.33/t/RIFF_2.out +24 -0
- data/bin/Image-ExifTool-9.33/t/RIFF_3.out +52 -0
- data/bin/Image-ExifTool-9.33/t/RIFF_4.out +16 -0
- data/bin/Image-ExifTool-9.33/t/RTF.t +27 -0
- data/bin/Image-ExifTool-9.33/t/RTF_2.out +20 -0
- data/bin/Image-ExifTool-9.33/t/Radiance.t +28 -0
- data/bin/Image-ExifTool-9.33/t/Radiance_2.out +22 -0
- data/bin/Image-ExifTool-9.33/t/Real.t +46 -0
- data/bin/Image-ExifTool-9.33/t/Real_2.out +68 -0
- data/bin/Image-ExifTool-9.33/t/Real_3.out +18 -0
- data/bin/Image-ExifTool-9.33/t/Real_4.out +11 -0
- data/bin/Image-ExifTool-9.33/t/Ricoh.t +47 -0
- data/bin/Image-ExifTool-9.33/t/Ricoh_2.out +70 -0
- data/bin/Image-ExifTool-9.33/t/Ricoh_3.out +98 -0
- data/bin/Image-ExifTool-9.33/t/Ricoh_4.out +112 -0
- data/bin/Image-ExifTool-9.33/t/Sanyo.t +39 -0
- data/bin/Image-ExifTool-9.33/t/Sanyo_2.out +101 -0
- data/bin/Image-ExifTool-9.33/t/Sanyo_3.out +111 -0
- data/bin/Image-ExifTool-9.33/t/Sigma.t +60 -0
- data/bin/Image-ExifTool-9.33/t/Sigma_2.out +91 -0
- data/bin/Image-ExifTool-9.33/t/Sigma_3.out +94 -0
- data/bin/Image-ExifTool-9.33/t/Sigma_4.out +63 -0
- data/bin/Image-ExifTool-9.33/t/Sigma_5.out +192 -0
- data/bin/Image-ExifTool-9.33/t/Sony.t +62 -0
- data/bin/Image-ExifTool-9.33/t/Sony_2.out +84 -0
- data/bin/Image-ExifTool-9.33/t/Sony_3.out +85 -0
- data/bin/Image-ExifTool-9.33/t/Sony_5.out +32 -0
- data/bin/Image-ExifTool-9.33/t/TestLib.pm +417 -0
- data/bin/Image-ExifTool-9.33/t/Unknown.t +36 -0
- data/bin/Image-ExifTool-9.33/t/Unknown_2.out +90 -0
- data/bin/Image-ExifTool-9.33/t/Unknown_3.out +90 -0
- data/bin/Image-ExifTool-9.33/t/Vorbis.t +28 -0
- data/bin/Image-ExifTool-9.33/t/Vorbis_2.out +28 -0
- data/bin/Image-ExifTool-9.33/t/Writer.t +913 -0
- data/bin/Image-ExifTool-9.33/t/Writer_10.out +240 -0
- data/bin/Image-ExifTool-9.33/t/Writer_11.out +37 -0
- data/bin/Image-ExifTool-9.33/t/Writer_13.out +160 -0
- data/bin/Image-ExifTool-9.33/t/Writer_14.out +67 -0
- data/bin/Image-ExifTool-9.33/t/Writer_15.out +171 -0
- data/bin/Image-ExifTool-9.33/t/Writer_16.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Writer_17.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Writer_18.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Writer_19.out +34 -0
- data/bin/Image-ExifTool-9.33/t/Writer_2.out +168 -0
- data/bin/Image-ExifTool-9.33/t/Writer_22.out +4 -0
- data/bin/Image-ExifTool-9.33/t/Writer_24.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Writer_25.out +38 -0
- data/bin/Image-ExifTool-9.33/t/Writer_26.out +32 -0
- data/bin/Image-ExifTool-9.33/t/Writer_27.out +14 -0
- data/bin/Image-ExifTool-9.33/t/Writer_28.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Writer_29.out +2 -0
- data/bin/Image-ExifTool-9.33/t/Writer_30.out +2 -0
- data/bin/Image-ExifTool-9.33/t/Writer_31.out +97 -0
- data/bin/Image-ExifTool-9.33/t/Writer_32.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Writer_33.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Writer_34.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Writer_35.out +187 -0
- data/bin/Image-ExifTool-9.33/t/Writer_36.out +2 -0
- data/bin/Image-ExifTool-9.33/t/Writer_37.out +2 -0
- data/bin/Image-ExifTool-9.33/t/Writer_38.out +62 -0
- data/bin/Image-ExifTool-9.33/t/Writer_39.out +4 -0
- data/bin/Image-ExifTool-9.33/t/Writer_4.out +85 -0
- data/bin/Image-ExifTool-9.33/t/Writer_40.out +4 -0
- data/bin/Image-ExifTool-9.33/t/Writer_41.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Writer_42.out +5 -0
- data/bin/Image-ExifTool-9.33/t/Writer_43.out +5 -0
- data/bin/Image-ExifTool-9.33/t/Writer_44.out +2 -0
- data/bin/Image-ExifTool-9.33/t/Writer_45.out +1 -0
- data/bin/Image-ExifTool-9.33/t/Writer_46.out +77 -0
- data/bin/Image-ExifTool-9.33/t/Writer_47.out +56 -0
- data/bin/Image-ExifTool-9.33/t/Writer_48.out +29 -0
- data/bin/Image-ExifTool-9.33/t/Writer_50.out +3 -0
- data/bin/Image-ExifTool-9.33/t/Writer_51.out +386 -0
- data/bin/Image-ExifTool-9.33/t/Writer_6.out +182 -0
- data/bin/Image-ExifTool-9.33/t/Writer_7.out +149 -0
- data/bin/Image-ExifTool-9.33/t/Writer_9.out +237 -0
- data/bin/Image-ExifTool-9.33/t/XMP.t +521 -0
- data/bin/Image-ExifTool-9.33/t/XMP_10.out +33 -0
- data/bin/Image-ExifTool-9.33/t/XMP_11.out +59 -0
- data/bin/Image-ExifTool-9.33/t/XMP_12.out +4 -0
- data/bin/Image-ExifTool-9.33/t/XMP_13.out +5 -0
- data/bin/Image-ExifTool-9.33/t/XMP_14.out +3 -0
- data/bin/Image-ExifTool-9.33/t/XMP_15.out +3 -0
- data/bin/Image-ExifTool-9.33/t/XMP_16.out +5 -0
- data/bin/Image-ExifTool-9.33/t/XMP_17.out +6 -0
- data/bin/Image-ExifTool-9.33/t/XMP_18.out +10 -0
- data/bin/Image-ExifTool-9.33/t/XMP_19.out +35 -0
- data/bin/Image-ExifTool-9.33/t/XMP_2.out +138 -0
- data/bin/Image-ExifTool-9.33/t/XMP_20.out +35 -0
- data/bin/Image-ExifTool-9.33/t/XMP_21.out +38 -0
- data/bin/Image-ExifTool-9.33/t/XMP_22.out +38 -0
- data/bin/Image-ExifTool-9.33/t/XMP_23.out +9 -0
- data/bin/Image-ExifTool-9.33/t/XMP_24.out +31 -0
- data/bin/Image-ExifTool-9.33/t/XMP_25.out +28 -0
- data/bin/Image-ExifTool-9.33/t/XMP_26.out +52 -0
- data/bin/Image-ExifTool-9.33/t/XMP_27.out +93 -0
- data/bin/Image-ExifTool-9.33/t/XMP_28.out +44 -0
- data/bin/Image-ExifTool-9.33/t/XMP_29.out +24 -0
- data/bin/Image-ExifTool-9.33/t/XMP_3.out +136 -0
- data/bin/Image-ExifTool-9.33/t/XMP_30.out +90 -0
- data/bin/Image-ExifTool-9.33/t/XMP_31.out +19 -0
- data/bin/Image-ExifTool-9.33/t/XMP_32.out +2 -0
- data/bin/Image-ExifTool-9.33/t/XMP_34.out +2 -0
- data/bin/Image-ExifTool-9.33/t/XMP_36.out +18 -0
- data/bin/Image-ExifTool-9.33/t/XMP_37.out +35 -0
- data/bin/Image-ExifTool-9.33/t/XMP_39.out +44 -0
- data/bin/Image-ExifTool-9.33/t/XMP_40.out +3 -0
- data/bin/Image-ExifTool-9.33/t/XMP_41.out +175 -0
- data/bin/Image-ExifTool-9.33/t/XMP_5.out +29 -0
- data/bin/Image-ExifTool-9.33/t/XMP_6.out +87 -0
- data/bin/Image-ExifTool-9.33/t/XMP_7.out +118 -0
- data/bin/Image-ExifTool-9.33/t/XMP_8.out +17 -0
- data/bin/Image-ExifTool-9.33/t/XMP_9.out +36 -0
- data/bin/Image-ExifTool-9.33/t/ZIP.t +69 -0
- data/bin/Image-ExifTool-9.33/t/ZIP_2.out +18 -0
- data/bin/Image-ExifTool-9.33/t/ZIP_3.out +17 -0
- data/bin/Image-ExifTool-9.33/t/ZIP_4.out +213 -0
- data/bin/Image-ExifTool-9.33/t/ZIP_5.out +134 -0
- data/bin/Image-ExifTool-9.33/t/ZIP_6.out +49 -0
- data/bin/Image-ExifTool-9.33/t/ZIP_7.out +28 -0
- data/bin/Image-ExifTool-9.33/t/images/AFCP.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/AIFF.aif +0 -0
- data/bin/Image-ExifTool-9.33/t/images/APE.ape +0 -0
- data/bin/Image-ExifTool-9.33/t/images/APE.mpc +0 -0
- data/bin/Image-ExifTool-9.33/t/images/ASF.wmv +0 -0
- data/bin/Image-ExifTool-9.33/t/images/BMP.bmp +0 -0
- data/bin/Image-ExifTool-9.33/t/images/BigTIFF.btf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Canon.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Canon1DmkIII.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/CanonRaw.cr2 +0 -0
- data/bin/Image-ExifTool-9.33/t/images/CanonRaw.crw +0 -0
- data/bin/Image-ExifTool-9.33/t/images/CanonVRD.vrd +0 -0
- data/bin/Image-ExifTool-9.33/t/images/CaptureOne.eip +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Casio.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Casio2.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/CasioQVCI.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/DICOM.dcm +0 -0
- data/bin/Image-ExifTool-9.33/t/images/DNG.dng +0 -0
- data/bin/Image-ExifTool-9.33/t/images/DV.dv +0 -0
- data/bin/Image-ExifTool-9.33/t/images/DjVu.djvu +0 -0
- data/bin/Image-ExifTool-9.33/t/images/EXE.elf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/EXE.exe +0 -0
- data/bin/Image-ExifTool-9.33/t/images/EXE.macho +0 -0
- data/bin/Image-ExifTool-9.33/t/images/ExifTool.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/ExifTool.tif +0 -0
- data/bin/Image-ExifTool-9.33/t/images/ExtendedXMP.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FLAC.flac +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FLAC.ogg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FLIR.fpf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FLIR.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Flash.flv +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Flash.swf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FlashPix.ppt +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Font.afm +28 -0
- data/bin/Image-ExifTool-9.33/t/images/Font.dfont +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Font.pfa +38 -0
- data/bin/Image-ExifTool-9.33/t/images/Font.pfb +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Font.pfm +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Font.ttf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FotoStation.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FujiFilm.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/FujiFilm.raf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/GE.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/GIF.gif +0 -0
- data/bin/Image-ExifTool-9.33/t/images/GIMP.xcf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/GPS.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/GeoTiff.tif +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Geotag.gpx +23 -0
- data/bin/Image-ExifTool-9.33/t/images/Geotag.igc +24 -0
- data/bin/Image-ExifTool-9.33/t/images/Geotag.log +13 -0
- data/bin/Image-ExifTool-9.33/t/images/Geotag.xml +23 -0
- data/bin/Image-ExifTool-9.33/t/images/Geotag2.log +7 -0
- data/bin/Image-ExifTool-9.33/t/images/HTML.html +77 -0
- data/bin/Image-ExifTool-9.33/t/images/IPTC.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/ITC.itc +0 -0
- data/bin/Image-ExifTool-9.33/t/images/InDesign.indd +0 -0
- data/bin/Image-ExifTool-9.33/t/images/JVC.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/JVC2.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.j2c +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.jp2 +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Kodak.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/KyoceraRaw.raw +0 -0
- data/bin/Image-ExifTool-9.33/t/images/LNK.lnk +0 -0
- data/bin/Image-ExifTool-9.33/t/images/M2TS.mts +0 -0
- data/bin/Image-ExifTool-9.33/t/images/MIE.mie +0 -0
- data/bin/Image-ExifTool-9.33/t/images/MIFF.miff +0 -0
- data/bin/Image-ExifTool-9.33/t/images/MP3.mp3 +0 -0
- data/bin/Image-ExifTool-9.33/t/images/MWG.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/MXF.mxf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Matroska.mkv +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Minolta.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Minolta.mrw +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Nikon.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Nikon.nef +0 -0
- data/bin/Image-ExifTool-9.33/t/images/NikonD2Hs.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/NikonD70.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/OOXML.docx +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Olympus.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Olympus2.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/OlympusE1.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/OpenDoc.ods +0 -0
- data/bin/Image-ExifTool-9.33/t/images/OpenEXR.exr +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PDF.pdf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PDF2.pdf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PGF.pgf +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PICT.pict +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PLIST-bin.plist +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PLIST-xml.plist +35 -0
- data/bin/Image-ExifTool-9.33/t/images/PNG.png +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PPM.ppm +5 -0
- data/bin/Image-ExifTool-9.33/t/images/PSP.psp +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Panasonic.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Panasonic.rw2 +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Pentax.avi +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Pentax.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PhotoCD.pcd +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PhotoMechanic.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Photoshop.psd +0 -0
- data/bin/Image-ExifTool-9.33/t/images/PostScript.eps +108 -0
- data/bin/Image-ExifTool-9.33/t/images/QuickTime.m4a +0 -0
- data/bin/Image-ExifTool-9.33/t/images/QuickTime.mov +0 -0
- data/bin/Image-ExifTool-9.33/t/images/RIFF.avi +0 -0
- data/bin/Image-ExifTool-9.33/t/images/RIFF.wav +0 -0
- data/bin/Image-ExifTool-9.33/t/images/RIFF.webp +0 -0
- data/bin/Image-ExifTool-9.33/t/images/RTF.rtf +25 -0
- data/bin/Image-ExifTool-9.33/t/images/Radiance.hdr +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Real.ra +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Real.ram +1 -0
- data/bin/Image-ExifTool-9.33/t/images/Real.rm +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Ricoh.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Ricoh2.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Sanyo.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Sigma.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Sigma.x3f +0 -0
- data/bin/Image-ExifTool-9.33/t/images/SigmaDP2.x3f +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Sony.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Sony.pmp +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Unknown.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Vorbis.ogg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/Writer.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP.inx +108 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP.jpg +0 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP.svg +33 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP.xml +98 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP.xmp +99 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP2.xmp +25 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP3.xmp +43 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP4.xmp +93 -0
- data/bin/Image-ExifTool-9.33/t/images/XMP5.xmp +158 -0
- data/bin/Image-ExifTool-9.33/t/images/ZIP.gz +0 -0
- data/bin/Image-ExifTool-9.33/t/images/ZIP.zip +0 -0
- data/bin/Image-ExifTool-9.33/t/images/iWork.numbers +0 -0
- data/lib/exiftool_vendored.rb +10 -0
- data/lib/exiftool_vendored/version.rb +3 -0
- data/lib/exiftool_vendored/version_extractor.rb +17 -0
- metadata +977 -0
|
@@ -0,0 +1,1318 @@
|
|
|
1
|
+
#------------------------------------------------------------------------------
|
|
2
|
+
# File: WriteXMP.pl
|
|
3
|
+
#
|
|
4
|
+
# Description: Write XMP meta information
|
|
5
|
+
#
|
|
6
|
+
# Revisions: 12/19/2004 - P. Harvey Created
|
|
7
|
+
#------------------------------------------------------------------------------
|
|
8
|
+
package Image::ExifTool::XMP;
|
|
9
|
+
|
|
10
|
+
use strict;
|
|
11
|
+
use vars qw(%specialStruct %dateTimeInfo $xlatNamespace);
|
|
12
|
+
|
|
13
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
|
+
|
|
15
|
+
sub CheckXMP($$$);
|
|
16
|
+
sub CaptureXMP($$$;$);
|
|
17
|
+
sub SetPropertyPath($$;$$$$);
|
|
18
|
+
|
|
19
|
+
my $debug = 0;
|
|
20
|
+
my $numPadLines = 24; # number of blank padding lines
|
|
21
|
+
|
|
22
|
+
# when writing extended XMP, resources bigger than this get placed in their own
|
|
23
|
+
# rdf:Description so they can be moved to the extended segments if necessary
|
|
24
|
+
my $newDescThresh = 10240; # 10 kB
|
|
25
|
+
|
|
26
|
+
# individual resources and namespaces to place last in separate rdf:Description's
|
|
27
|
+
# so they can be moved to extended XMP segments if required (see Oct. 2008 XMP spec)
|
|
28
|
+
my %extendedRes = (
|
|
29
|
+
'photoshop:History' => 1,
|
|
30
|
+
'xap:Thumbnails' => 1,
|
|
31
|
+
'xmp:Thumbnails' => 1,
|
|
32
|
+
'crs' => 1,
|
|
33
|
+
'crss' => 1,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
my $rdfDesc = 'rdf:Description';
|
|
37
|
+
#
|
|
38
|
+
# packet/xmp/rdf headers and trailers
|
|
39
|
+
#
|
|
40
|
+
my $pktOpen = "<?xpacket begin='\xef\xbb\xbf' id='W5M0MpCehiHzreSzNTczkc9d'?>\n";
|
|
41
|
+
my $xmlOpen = "<?xml version='1.0' encoding='UTF-8'?>\n";
|
|
42
|
+
my $xmpOpenPrefix = "<x:xmpmeta xmlns:x='$nsURI{x}'";
|
|
43
|
+
my $rdfOpen = "<rdf:RDF xmlns:rdf='$nsURI{rdf}'>\n";
|
|
44
|
+
my $rdfClose = "</rdf:RDF>\n";
|
|
45
|
+
my $xmpClose = "</x:xmpmeta>\n";
|
|
46
|
+
my $pktCloseW = "<?xpacket end='w'?>"; # writable by default
|
|
47
|
+
my $pktCloseR = "<?xpacket end='r'?>";
|
|
48
|
+
|
|
49
|
+
#------------------------------------------------------------------------------
|
|
50
|
+
# Get XMP opening tag (and set x:xmptk appropriately)
|
|
51
|
+
# Inputs: 0) ExifTool object ref
|
|
52
|
+
# Returns: x:xmpmeta opening tag
|
|
53
|
+
sub XMPOpen($)
|
|
54
|
+
{
|
|
55
|
+
my $exifTool = shift;
|
|
56
|
+
my $nv = $exifTool->{NEW_VALUE}->{$Image::ExifTool::XMP::x{xmptk}};
|
|
57
|
+
my $tk;
|
|
58
|
+
if (defined $nv) {
|
|
59
|
+
$tk = $exifTool->GetNewValues($nv);
|
|
60
|
+
$exifTool->VerboseValue(($tk ? '+' : '-') . ' XMP-x:XMPToolkit', $tk);
|
|
61
|
+
++$exifTool->{CHANGED};
|
|
62
|
+
} else {
|
|
63
|
+
$tk = "Image::ExifTool $Image::ExifTool::VERSION";
|
|
64
|
+
}
|
|
65
|
+
my $str = $tk ? (" x:xmptk='" . EscapeXML($tk) . "'") : '';
|
|
66
|
+
return "$xmpOpenPrefix$str>\n";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
#------------------------------------------------------------------------------
|
|
70
|
+
# Validate XMP packet and set read or read/write mode
|
|
71
|
+
# Inputs: 0) XMP data reference, 1) 'r' = read only, 'w' or undef = read/write
|
|
72
|
+
# Returns: true if XMP is good (and adds packet header/trailer if necessary)
|
|
73
|
+
sub ValidateXMP($;$)
|
|
74
|
+
{
|
|
75
|
+
my ($xmpPt, $mode) = @_;
|
|
76
|
+
unless ($$xmpPt =~ /^\0*<\0*\?\0*x\0*p\0*a\0*c\0*k\0*e\0*t/) {
|
|
77
|
+
return '' unless $$xmpPt =~ /^<x(mp)?:x[ma]pmeta/;
|
|
78
|
+
# add required xpacket header/trailer
|
|
79
|
+
$$xmpPt = $pktOpen . $$xmpPt . $pktCloseW;
|
|
80
|
+
}
|
|
81
|
+
$mode = 'w' unless $mode;
|
|
82
|
+
my $end = substr($$xmpPt, -32, 32);
|
|
83
|
+
# check for proper xpacket trailer and set r/w mode if necessary
|
|
84
|
+
return '' unless $end =~ s/(e\0*n\0*d\0*=\0*['"]\0*)([rw])(\0*['"]\0*\?\0*>)/$1$mode$3/;
|
|
85
|
+
substr($$xmpPt, -32, 32) = $end if $2 ne $mode;
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#------------------------------------------------------------------------------
|
|
90
|
+
# Check XMP date values for validity and format accordingly
|
|
91
|
+
# Inputs: 1) date string
|
|
92
|
+
# Returns: XMP date/time string (or undef on error)
|
|
93
|
+
sub FormatXMPDate($)
|
|
94
|
+
{
|
|
95
|
+
my $val = shift;
|
|
96
|
+
my ($y, $m, $d, $t, $tz);
|
|
97
|
+
if ($val =~ /(\d{4}):(\d{2}):(\d{2}) (\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)/) {
|
|
98
|
+
($y, $m, $d, $t, $tz) = ($1, $2, $3, $4, $5);
|
|
99
|
+
$val = "$y-$m-${d}T$t";
|
|
100
|
+
} elsif ($val =~ /^\s*\d{4}(:\d{2}){0,2}\s*$/) {
|
|
101
|
+
# this is just a date (YYYY, YYYY-mm or YYYY-mm-dd)
|
|
102
|
+
$val =~ tr/:/-/;
|
|
103
|
+
} elsif ($val =~ /^\s*(\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)\s*$/) {
|
|
104
|
+
# this is just a time
|
|
105
|
+
($t, $tz) = ($1, $2);
|
|
106
|
+
$val = $t;
|
|
107
|
+
} else {
|
|
108
|
+
return undef;
|
|
109
|
+
}
|
|
110
|
+
if ($tz) {
|
|
111
|
+
$tz =~ /^(Z|[+-]\d{2}:\d{2})$/ or return undef;
|
|
112
|
+
$val .= $tz;
|
|
113
|
+
}
|
|
114
|
+
return $val;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
#------------------------------------------------------------------------------
|
|
118
|
+
# Check XMP values for validity and format accordingly
|
|
119
|
+
# Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
|
|
120
|
+
# Returns: error string or undef (and may change value) on success
|
|
121
|
+
# Note: copies structured information to avoid conflicts with calling code
|
|
122
|
+
sub CheckXMP($$$)
|
|
123
|
+
{
|
|
124
|
+
my ($exifTool, $tagInfo, $valPtr) = @_;
|
|
125
|
+
|
|
126
|
+
if ($$tagInfo{Struct}) {
|
|
127
|
+
require 'Image/ExifTool/XMPStruct.pl';
|
|
128
|
+
my ($item, $err, $w, $warn);
|
|
129
|
+
unless (ref $$valPtr) {
|
|
130
|
+
($$valPtr, $warn) = InflateStruct($valPtr);
|
|
131
|
+
# expect a structure HASH ref or ARRAY of structures
|
|
132
|
+
ref $$valPtr or return 'Improperly formed structure';
|
|
133
|
+
}
|
|
134
|
+
if (ref $$valPtr eq 'ARRAY') {
|
|
135
|
+
return 'Not a list tag' unless $$tagInfo{List};
|
|
136
|
+
my @copy = ( @{$$valPtr} ); # copy the list for ExifTool to use
|
|
137
|
+
$$valPtr = \@copy; # return the copy
|
|
138
|
+
foreach $item (@copy) {
|
|
139
|
+
unless (ref $item eq 'HASH') {
|
|
140
|
+
($item, $w) = InflateStruct(\$item); # deserialize structure
|
|
141
|
+
$w and $warn = $w;
|
|
142
|
+
next if ref $item eq 'HASH';
|
|
143
|
+
$err = 'Improperly formed structure';
|
|
144
|
+
last;
|
|
145
|
+
}
|
|
146
|
+
($item, $err) = CheckStruct($exifTool, $item, $$tagInfo{Struct});
|
|
147
|
+
last if $err;
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
($$valPtr, $err) = CheckStruct($exifTool, $$valPtr, $$tagInfo{Struct});
|
|
151
|
+
}
|
|
152
|
+
$warn and $$exifTool{CHECK_WARN} = $warn;
|
|
153
|
+
return $err;
|
|
154
|
+
}
|
|
155
|
+
my $format = $tagInfo->{Writable};
|
|
156
|
+
# (if no format specified, value is a simple string)
|
|
157
|
+
if (not $format or $format eq 'string' or $format eq 'lang-alt') {
|
|
158
|
+
# convert value to UTF8 if necessary
|
|
159
|
+
if ($exifTool->{OPTIONS}->{Charset} ne 'UTF8') {
|
|
160
|
+
if ($$valPtr =~ /[\x80-\xff]/) {
|
|
161
|
+
# convert from Charset to UTF-8
|
|
162
|
+
$$valPtr = $exifTool->Encode($$valPtr,'UTF8');
|
|
163
|
+
}
|
|
164
|
+
} else {
|
|
165
|
+
# translate invalid XML characters to "."
|
|
166
|
+
$$valPtr =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./;
|
|
167
|
+
# fix any malformed UTF-8 characters
|
|
168
|
+
if (FixUTF8($valPtr) and not $$exifTool{WarnBadUTF8}) {
|
|
169
|
+
$exifTool->Warn('Malformed UTF-8 character(s)');
|
|
170
|
+
$$exifTool{WarnBadUTF8} = 1;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return undef; # success
|
|
174
|
+
}
|
|
175
|
+
if ($format eq 'rational' or $format eq 'real') {
|
|
176
|
+
# make sure the value is a valid floating point number
|
|
177
|
+
unless (Image::ExifTool::IsFloat($$valPtr) or
|
|
178
|
+
# allow 'inf' and 'undef' rational values
|
|
179
|
+
($format eq 'rational' and ($$valPtr eq 'inf' or
|
|
180
|
+
$$valPtr eq 'undef' or Image::ExifTool::IsRational($$valPtr))))
|
|
181
|
+
{
|
|
182
|
+
return 'Not a floating point number'
|
|
183
|
+
}
|
|
184
|
+
if ($format eq 'rational') {
|
|
185
|
+
$$valPtr = join('/', Image::ExifTool::Rationalize($$valPtr));
|
|
186
|
+
}
|
|
187
|
+
} elsif ($format eq 'integer') {
|
|
188
|
+
# make sure the value is integer
|
|
189
|
+
if (Image::ExifTool::IsInt($$valPtr)) {
|
|
190
|
+
# no conversion required (converting to 'int' would remove leading '+')
|
|
191
|
+
} elsif (Image::ExifTool::IsHex($$valPtr)) {
|
|
192
|
+
$$valPtr = hex($$valPtr);
|
|
193
|
+
} else {
|
|
194
|
+
return 'Not an integer';
|
|
195
|
+
}
|
|
196
|
+
} elsif ($format eq 'date') {
|
|
197
|
+
my $newDate = FormatXMPDate($$valPtr);
|
|
198
|
+
return "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])" unless $newDate;
|
|
199
|
+
$$valPtr = $newDate;
|
|
200
|
+
} elsif ($format eq 'boolean') {
|
|
201
|
+
if (not $$valPtr or $$valPtr =~ /false/i or $$valPtr =~ /^no$/i) {
|
|
202
|
+
$$valPtr = 'False';
|
|
203
|
+
} else {
|
|
204
|
+
$$valPtr = 'True';
|
|
205
|
+
}
|
|
206
|
+
} elsif ($format eq '1') {
|
|
207
|
+
# this is the entire XMP data block
|
|
208
|
+
return 'Invalid XMP data' unless ValidateXMP($valPtr);
|
|
209
|
+
} else {
|
|
210
|
+
return "Unknown XMP format: $format";
|
|
211
|
+
}
|
|
212
|
+
return undef; # success!
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
#------------------------------------------------------------------------------
|
|
216
|
+
# Get PropertyPath for specified tagInfo
|
|
217
|
+
# Inputs: 0) tagInfo reference
|
|
218
|
+
# Returns: PropertyPath string
|
|
219
|
+
sub GetPropertyPath($)
|
|
220
|
+
{
|
|
221
|
+
my $tagInfo = shift;
|
|
222
|
+
SetPropertyPath($$tagInfo{Table}, $$tagInfo{TagID}) unless $$tagInfo{PropertyPath};
|
|
223
|
+
return $$tagInfo{PropertyPath};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
#------------------------------------------------------------------------------
|
|
227
|
+
# Set PropertyPath for specified tag (also for associated flattened tags and structure elements)
|
|
228
|
+
# Inputs: 0) tagTable reference, 1) tagID, 2) tagID of parent structure,
|
|
229
|
+
# 3) structure definition ref (or undef), 4) property list up to this point (or undef),
|
|
230
|
+
# 5) flag set if any containing structure has a TYPE
|
|
231
|
+
# Notes: also generates flattened tags if they don't already exist
|
|
232
|
+
sub SetPropertyPath($$;$$$$)
|
|
233
|
+
{
|
|
234
|
+
my ($tagTablePtr, $tagID, $parentID, $structPtr, $propList, $isType) = @_;
|
|
235
|
+
my $table = $structPtr || $tagTablePtr;
|
|
236
|
+
my $tagInfo = $$table{$tagID};
|
|
237
|
+
|
|
238
|
+
return if ref($tagInfo) ne 'HASH' or $$tagInfo{PropertyPath};
|
|
239
|
+
|
|
240
|
+
# don't override existing main table entry if already set by a Struct
|
|
241
|
+
if ($structPtr) {
|
|
242
|
+
$isType = 1 if $$structPtr{TYPE};
|
|
243
|
+
} else {
|
|
244
|
+
# use property path from original tagInfo if this is an alternate-language tag
|
|
245
|
+
my $srcInfo = $$tagInfo{SrcTagInfo};
|
|
246
|
+
$$tagInfo{PropertyPath} = GetPropertyPath($srcInfo) if $srcInfo;
|
|
247
|
+
return if $$tagInfo{PropertyPath};
|
|
248
|
+
# set property path for all flattened tags in structure if necessary
|
|
249
|
+
if ($$tagInfo{RootTagInfo}) {
|
|
250
|
+
SetPropertyPath($tagTablePtr, $$tagInfo{RootTagInfo}{TagID});
|
|
251
|
+
return if $$tagInfo{PropertyPath};
|
|
252
|
+
warn "Internal Error: Didn't set path from root for $tagID\n";
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
my $ns = $$tagInfo{Namespace} || $$table{NAMESPACE};
|
|
256
|
+
$ns or warn("No namespace for $tagID\n"), return;
|
|
257
|
+
my (@propList, $listType);
|
|
258
|
+
$propList and @propList = @$propList;
|
|
259
|
+
push @propList, "$ns:$tagID";
|
|
260
|
+
# lang-alt lists are handled specially, signified by Writable='lang-alt'
|
|
261
|
+
if ($$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt') {
|
|
262
|
+
$listType = 'Alt';
|
|
263
|
+
# remove language code from property path if it exists
|
|
264
|
+
$propList[-1] =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
|
|
265
|
+
# handle lists of lang-alt lists (ie. XMP-plus:Custom tags)
|
|
266
|
+
if ($$tagInfo{List} and $$tagInfo{List} ne '1') {
|
|
267
|
+
push @propList, "rdf:$$tagInfo{List}", 'rdf:li 10';
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
$listType = $$tagInfo{List};
|
|
271
|
+
}
|
|
272
|
+
# add required properties if this is a list
|
|
273
|
+
push @propList, "rdf:$listType", 'rdf:li 10' if $listType and $listType ne '1';
|
|
274
|
+
# set PropertyPath for all flattened tags of this structure if necessary
|
|
275
|
+
# (note: don't do this for variable-namespace structures (undef NAMESPACE))
|
|
276
|
+
my $strTable = $$tagInfo{Struct};
|
|
277
|
+
if ($strTable and $$strTable{NAMESPACE} and not ($parentID and
|
|
278
|
+
# must test NoSubStruct flag to avoid infinite recursion
|
|
279
|
+
(($$tagTablePtr{$parentID} and $$tagTablePtr{$parentID}{NoSubStruct}) or
|
|
280
|
+
length $parentID > 500))) # avoid deep recursion
|
|
281
|
+
{
|
|
282
|
+
# make sure the structure namespace has been registered
|
|
283
|
+
# (user-defined namespaces may not have been)
|
|
284
|
+
RegisterNamespace($strTable) if ref $$strTable{NAMESPACE};
|
|
285
|
+
my $tag;
|
|
286
|
+
foreach $tag (keys %$strTable) {
|
|
287
|
+
# ignore special fields and any lang-alt fields we may have added
|
|
288
|
+
next if $specialStruct{$tag} or $$strTable{$tag}{LangCode};
|
|
289
|
+
my $fullID = $parentID ? $parentID . ucfirst($tagID) : $tagID;
|
|
290
|
+
SetPropertyPath($tagTablePtr, $tag, $fullID, $strTable, \@propList, $isType);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
# if this was a structure field and not a normal tag,
|
|
294
|
+
# we set PropertyPath in the corresponding flattened tag
|
|
295
|
+
if ($structPtr) {
|
|
296
|
+
my $flatID = $parentID . ucfirst($tagID);
|
|
297
|
+
$tagInfo = $$tagTablePtr{$flatID};
|
|
298
|
+
# create flattened tag now if necessary
|
|
299
|
+
# (could happen if we were just writing a structure)
|
|
300
|
+
unless ($tagInfo) {
|
|
301
|
+
$tagInfo = { Name => ucfirst($flatID), Flat => 1 };
|
|
302
|
+
AddTagToTable($tagTablePtr, $flatID, $tagInfo);
|
|
303
|
+
}
|
|
304
|
+
# set StructType flag if any containing structure has a TYPE
|
|
305
|
+
$$tagInfo{StructType} = 1 if $isType;
|
|
306
|
+
}
|
|
307
|
+
# set property path for tagInfo in main table
|
|
308
|
+
$$tagInfo{PropertyPath} = join '/', @propList;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
#------------------------------------------------------------------------------
|
|
312
|
+
# Save XMP property name/value for rewriting
|
|
313
|
+
# Inputs: 0) ExifTool object reference
|
|
314
|
+
# 1) reference to array of XMP property path (last is current property)
|
|
315
|
+
# 2) property value, 3) optional reference to hash of property attributes
|
|
316
|
+
sub CaptureXMP($$$;$)
|
|
317
|
+
{
|
|
318
|
+
my ($exifTool, $propList, $val, $attrs) = @_;
|
|
319
|
+
return unless defined $val and @$propList > 2;
|
|
320
|
+
if ($$propList[0] =~ /^x:x[ma]pmeta$/ and
|
|
321
|
+
$$propList[1] eq 'rdf:RDF' and
|
|
322
|
+
$$propList[2] =~ /$rdfDesc( |$)/)
|
|
323
|
+
{
|
|
324
|
+
# no properties to save yet if this is just the description
|
|
325
|
+
return unless @$propList > 3;
|
|
326
|
+
# ignore empty list properties
|
|
327
|
+
if ($$propList[-1] =~ /^rdf:(Bag|Seq|Alt)$/) {
|
|
328
|
+
$exifTool->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
# save information about this property
|
|
332
|
+
my $capture = $exifTool->{XMP_CAPTURE};
|
|
333
|
+
my $path = join('/', @$propList[3..$#$propList]);
|
|
334
|
+
if (defined $$capture{$path}) {
|
|
335
|
+
$exifTool->{XMP_ERROR} = "Duplicate XMP property: $path";
|
|
336
|
+
} else {
|
|
337
|
+
$$capture{$path} = [$val, $attrs || { }];
|
|
338
|
+
}
|
|
339
|
+
} elsif ($$propList[0] eq 'rdf:RDF' and
|
|
340
|
+
$$propList[1] =~ /$rdfDesc( |$)/)
|
|
341
|
+
{
|
|
342
|
+
# set flag so we don't write x:xmpmeta element
|
|
343
|
+
$exifTool->{XMP_NO_XMPMETA} = 1;
|
|
344
|
+
# add missing x:xmpmeta element and try again
|
|
345
|
+
unshift @$propList, 'x:xmpmeta';
|
|
346
|
+
CaptureXMP($exifTool, $propList, $val, $attrs);
|
|
347
|
+
} else {
|
|
348
|
+
$exifTool->{XMP_ERROR} = 'Improperly enclosed XMP property: ' . join('/',@$propList);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
#------------------------------------------------------------------------------
|
|
353
|
+
# Save information about resource containing blank node with nodeID
|
|
354
|
+
# Inputs: 0) reference to blank node information hash
|
|
355
|
+
# 1) reference to property list
|
|
356
|
+
# 2) property value
|
|
357
|
+
# 3) [optional] reference to attribute hash
|
|
358
|
+
# Notes: This routine and ProcessBlankInfo() are also used for reading information, but
|
|
359
|
+
# are uncommon so are put in this file to reduce compile time for the common case
|
|
360
|
+
sub SaveBlankInfo($$$;$)
|
|
361
|
+
{
|
|
362
|
+
my ($blankInfo, $propListPt, $val, $attrs) = @_;
|
|
363
|
+
|
|
364
|
+
my $propPath = join '/', @$propListPt;
|
|
365
|
+
my @ids = ($propPath =~ m{ #([^ /]*)}g);
|
|
366
|
+
my $id;
|
|
367
|
+
# split the property path at each nodeID
|
|
368
|
+
foreach $id (@ids) {
|
|
369
|
+
my ($pre, $prop, $post) = ($propPath =~ m{^(.*?)/([^/]*) #$id((/.*)?)$});
|
|
370
|
+
defined $pre or warn("internal error parsing nodeID's"), next;
|
|
371
|
+
# the element with the nodeID should be in the path prefix for subject
|
|
372
|
+
# nodes and the path suffix for object nodes
|
|
373
|
+
unless ($prop eq $rdfDesc) {
|
|
374
|
+
if ($post) {
|
|
375
|
+
$post = "/$prop$post";
|
|
376
|
+
} else {
|
|
377
|
+
$pre = "$pre/$prop";
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
$blankInfo->{Prop}->{$id}->{Pre}->{$pre} = 1;
|
|
381
|
+
if ((defined $post and length $post) or (defined $val and length $val)) {
|
|
382
|
+
# save the property value and attributes for each unique path suffix
|
|
383
|
+
$blankInfo->{Prop}->{$id}->{Post}->{$post} = [ $val, $attrs, $propPath ];
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
#------------------------------------------------------------------------------
|
|
389
|
+
# Process blank-node information
|
|
390
|
+
# Inputs: 0) ExifTool object ref, 1) tag table ref,
|
|
391
|
+
# 2) blank node information hash ref, 3) flag set for writing
|
|
392
|
+
sub ProcessBlankInfo($$$;$)
|
|
393
|
+
{
|
|
394
|
+
my ($exifTool, $tagTablePtr, $blankInfo, $isWriting) = @_;
|
|
395
|
+
$exifTool->VPrint(1, " [Elements with nodeID set:]\n") unless $isWriting;
|
|
396
|
+
my ($id, $pre, $post);
|
|
397
|
+
# handle each nodeID separately
|
|
398
|
+
foreach $id (sort keys %{$$blankInfo{Prop}}) {
|
|
399
|
+
my $path = $blankInfo->{Prop}->{$id};
|
|
400
|
+
# flag all resource names so we can warn later if some are unused
|
|
401
|
+
my %unused;
|
|
402
|
+
foreach $post (keys %{$path->{Post}}) {
|
|
403
|
+
$unused{$post} = 1;
|
|
404
|
+
}
|
|
405
|
+
# combine property paths for all possible paths through this node
|
|
406
|
+
foreach $pre (sort keys %{$path->{Pre}}) {
|
|
407
|
+
# there will be no description for the object of a blank node
|
|
408
|
+
next unless $pre =~ m{/$rdfDesc/};
|
|
409
|
+
foreach $post (sort keys %{$path->{Post}}) {
|
|
410
|
+
my @propList = split m{/}, "$pre$post";
|
|
411
|
+
my ($val, $attrs) = @{$path->{Post}->{$post}};
|
|
412
|
+
if ($isWriting) {
|
|
413
|
+
CaptureXMP($exifTool, \@propList, $val, $attrs);
|
|
414
|
+
} else {
|
|
415
|
+
FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
|
|
416
|
+
}
|
|
417
|
+
delete $unused{$post};
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
# save information from unused properties (if RDF is malformed like f-spot output)
|
|
421
|
+
if (%unused) {
|
|
422
|
+
$exifTool->Options('Verbose') and $exifTool->Warn('An XMP resource is about nothing');
|
|
423
|
+
foreach $post (sort keys %unused) {
|
|
424
|
+
my ($val, $attrs, $propPath) = @{$path->{Post}->{$post}};
|
|
425
|
+
my @propList = split m{/}, $propPath;
|
|
426
|
+
if ($isWriting) {
|
|
427
|
+
CaptureXMP($exifTool, \@propList, $val, $attrs);
|
|
428
|
+
} else {
|
|
429
|
+
FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
#------------------------------------------------------------------------------
|
|
437
|
+
# Convert path to namespace used in file (this is a pain, but the XMP
|
|
438
|
+
# spec only suggests 'preferred' namespace prefixes...)
|
|
439
|
+
# Inputs: 0) ExifTool object reference, 1) property path
|
|
440
|
+
# Returns: conforming property path
|
|
441
|
+
sub ConformPathToNamespace($$)
|
|
442
|
+
{
|
|
443
|
+
my ($exifTool, $path) = @_;
|
|
444
|
+
my @propList = split('/',$path);
|
|
445
|
+
my $nsUsed = $exifTool->{XMP_NS};
|
|
446
|
+
my $prop;
|
|
447
|
+
foreach $prop (@propList) {
|
|
448
|
+
my ($ns, $tag) = $prop =~ /(.+?):(.*)/;
|
|
449
|
+
next if $$nsUsed{$ns};
|
|
450
|
+
my $uri = $nsURI{$ns};
|
|
451
|
+
unless ($uri) {
|
|
452
|
+
warn "No URI for namepace prefix $ns!\n";
|
|
453
|
+
next;
|
|
454
|
+
}
|
|
455
|
+
my $ns2;
|
|
456
|
+
foreach $ns2 (keys %$nsUsed) {
|
|
457
|
+
next unless $$nsUsed{$ns2} eq $uri;
|
|
458
|
+
# use the existing namespace prefix instead of ours
|
|
459
|
+
$prop = "$ns2:$tag";
|
|
460
|
+
last;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return join('/',@propList);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
#------------------------------------------------------------------------------
|
|
467
|
+
# Add necessary rdf:type element when writing structure
|
|
468
|
+
# Inputs: 0) ExifTool ref, 1) tag table ref, 2) capture hash ref, 3) path string
|
|
469
|
+
# 4) optional base path (already conformed to namespace) for elements in
|
|
470
|
+
# variable-namespace structures
|
|
471
|
+
sub AddStructType($$$$;$)
|
|
472
|
+
{
|
|
473
|
+
my ($exifTool, $tagTablePtr, $capture, $path, $basePath) = @_;
|
|
474
|
+
my @props = split '/', $path;
|
|
475
|
+
my %doneID;
|
|
476
|
+
for (;;) {
|
|
477
|
+
pop @props;
|
|
478
|
+
last unless @props;
|
|
479
|
+
my $tagID = GetXMPTagID(\@props);
|
|
480
|
+
next if $doneID{$tagID};
|
|
481
|
+
$doneID{$tagID} = 1;
|
|
482
|
+
my $tagInfo = $$tagTablePtr{$tagID};
|
|
483
|
+
last unless ref $tagInfo eq 'HASH';
|
|
484
|
+
if ($$tagInfo{Struct}) {
|
|
485
|
+
my $type = $$tagInfo{Struct}{TYPE};
|
|
486
|
+
if ($type) {
|
|
487
|
+
my $pat = $$tagInfo{PropertyPath};
|
|
488
|
+
$pat or warn("Missing PropertyPath in AddStructType\n"), last;
|
|
489
|
+
$pat = ConformPathToNamespace($exifTool, $pat);
|
|
490
|
+
$pat =~ s/ \d+/ \\d\+/g;
|
|
491
|
+
$path =~ /^($pat)/ or warn("Wrong path in AddStructType\n"), last;
|
|
492
|
+
my $p = $1 . '/rdf:type';
|
|
493
|
+
$p = "$basePath/$p" if $basePath;
|
|
494
|
+
$$capture{$p} = [ '', { 'rdf:resource' => $type } ] unless $$capture{$p};
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
last unless $$tagInfo{StructType};
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
#------------------------------------------------------------------------------
|
|
502
|
+
# Utility routine to encode data in base64
|
|
503
|
+
# Inputs: 0) binary data string
|
|
504
|
+
# Returns: base64-encoded string
|
|
505
|
+
sub EncodeBase64($)
|
|
506
|
+
{
|
|
507
|
+
# encode the data in 45-byte chunks
|
|
508
|
+
my $chunkSize = 45;
|
|
509
|
+
my $len = length $_[0];
|
|
510
|
+
my $str = '';
|
|
511
|
+
my $i;
|
|
512
|
+
for ($i=0; $i<$len; $i+=$chunkSize) {
|
|
513
|
+
my $n = $len - $i;
|
|
514
|
+
$n = $chunkSize if $n > $chunkSize;
|
|
515
|
+
# add uuencoded data to output (minus size byte, but including trailing newline)
|
|
516
|
+
$str .= substr(pack('u', substr($_[0], $i, $n)), 1);
|
|
517
|
+
}
|
|
518
|
+
# convert to base64 (remember that "\0" may be encoded as ' ' or '`')
|
|
519
|
+
$str =~ tr/` -_/AA-Za-z0-9+\//;
|
|
520
|
+
# convert pad characters at the end (remember to account for trailing newline)
|
|
521
|
+
my $pad = 3 - ($len % 3);
|
|
522
|
+
substr($str, -$pad-1, $pad) = ('=' x $pad) if $pad < 3;
|
|
523
|
+
return $str;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
#------------------------------------------------------------------------------
|
|
527
|
+
# sort tagInfo hash references by tag name
|
|
528
|
+
sub ByTagName
|
|
529
|
+
{
|
|
530
|
+
return $$a{Name} cmp $$b{Name};
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
#------------------------------------------------------------------------------
|
|
534
|
+
# sort alphabetically, but with rdf:type first in the structure
|
|
535
|
+
sub TypeFirst
|
|
536
|
+
{
|
|
537
|
+
if ($a =~ /rdf:type$/) {
|
|
538
|
+
return substr($a, 0, -8) cmp $b unless $b =~ /rdf:type$/;
|
|
539
|
+
} elsif ($b =~ /rdf:type$/) {
|
|
540
|
+
return $a cmp substr($b, 0, -8);
|
|
541
|
+
}
|
|
542
|
+
return $a cmp $b;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
#------------------------------------------------------------------------------
|
|
546
|
+
# Limit size of XMP
|
|
547
|
+
# Inputs: 0) ExifTool object ref, 1) XMP data ref (written up to start of $rdfClose),
|
|
548
|
+
# 2) max XMP len, 3) rdf:about string, 4) list ref for description start offsets
|
|
549
|
+
# 5) start offset of first description recommended for extended XMP
|
|
550
|
+
# Returns: 0) extended XMP ref, 1) GUID and updates $$dataPt (or undef if no extended XMP)
|
|
551
|
+
sub LimitXMPSize($$$$$$)
|
|
552
|
+
{
|
|
553
|
+
my ($exifTool, $dataPt, $maxLen, $about, $startPt, $extStart) = @_;
|
|
554
|
+
|
|
555
|
+
# return straight away if it isn't too big
|
|
556
|
+
return undef if length($$dataPt) < $maxLen;
|
|
557
|
+
|
|
558
|
+
push @$startPt, length($$dataPt); # add end offset to list
|
|
559
|
+
my $newData = substr($$dataPt, 0, $$startPt[0]);
|
|
560
|
+
my $guid = '0' x 32;
|
|
561
|
+
# write the required xmpNote:HasExtendedXMP property
|
|
562
|
+
$newData .= "\n <$rdfDesc rdf:about='$about'\n xmlns:xmpNote='$nsURI{xmpNote}'>\n" .
|
|
563
|
+
" <xmpNote:HasExtendedXMP>$guid</xmpNote:HasExtendedXMP>\n" .
|
|
564
|
+
" </$rdfDesc>\n";
|
|
565
|
+
|
|
566
|
+
my ($i, %descSize, $start);
|
|
567
|
+
# calculate all description block sizes
|
|
568
|
+
for ($i=1; $i<@$startPt; ++$i) {
|
|
569
|
+
$descSize{$$startPt[$i-1]} = $$startPt[$i] - $$startPt[$i-1];
|
|
570
|
+
}
|
|
571
|
+
pop @$startPt; # remove end offset
|
|
572
|
+
# write the descriptions from smallest to largest, as many in main XMP as possible
|
|
573
|
+
my @descStart = sort { $descSize{$a} <=> $descSize{$b} } @$startPt;
|
|
574
|
+
my $extData = XMPOpen($exifTool) . $rdfOpen;
|
|
575
|
+
for ($i=0; $i<2; ++$i) {
|
|
576
|
+
foreach $start (@descStart) {
|
|
577
|
+
# write main XMP first (in order of size), then extended XMP afterwards (in order)
|
|
578
|
+
next if $i xor $start >= $extStart;
|
|
579
|
+
my $pt = (length($newData) + $descSize{$start} > $maxLen) ? \$extData : \$newData;
|
|
580
|
+
$$pt .= substr($$dataPt, $start, $descSize{$start});
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
$extData .= $rdfClose . $xmpClose; # close rdf:RDF and x:xmpmeta
|
|
584
|
+
# calculate GUID from MD5 of extended XMP data
|
|
585
|
+
if (eval 'require Digest::MD5') {
|
|
586
|
+
$guid = uc unpack('H*', Digest::MD5::md5($extData));
|
|
587
|
+
$newData =~ s/0{32}/$guid/; # update GUID in main XMP segment
|
|
588
|
+
}
|
|
589
|
+
$exifTool->VerboseValue('+ XMP-xmpNote:HasExtendedXMP', $guid);
|
|
590
|
+
$$dataPt = $newData; # return main XMP block
|
|
591
|
+
return (\$extData, $guid); # return extended XMP and its GUID
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
#------------------------------------------------------------------------------
|
|
595
|
+
# Write XMP information
|
|
596
|
+
# Inputs: 0) ExifTool object reference, 1) source dirInfo reference,
|
|
597
|
+
# 2) [optional] tag table reference
|
|
598
|
+
# Returns: with tag table: new XMP data (may be empty if no XMP data) or undef on error
|
|
599
|
+
# without tag table: 1 on success, 0 if not valid XMP file, -1 on write error
|
|
600
|
+
# Notes: May set dirInfo InPlace flag to rewrite with specified DirLen
|
|
601
|
+
# May set dirInfo ReadOnly flag to write as read-only XMP ('r' mode and no padding)
|
|
602
|
+
# May set dirInfo Compact flag to force compact (drops 2kB of padding)
|
|
603
|
+
# May set dirInfo MaxDataLen to limit output data length -- this causes ExtendedXMP
|
|
604
|
+
# and ExtendedGUID to be returned in dirInfo if extended XMP was required
|
|
605
|
+
sub WriteXMP($$;$)
|
|
606
|
+
{
|
|
607
|
+
my ($exifTool, $dirInfo, $tagTablePtr) = @_;
|
|
608
|
+
$exifTool or return 1; # allow dummy access to autoload this package
|
|
609
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
610
|
+
my (%capture, %nsUsed, $xmpErr, $tagInfo, $about);
|
|
611
|
+
my $changed = 0;
|
|
612
|
+
my $xmpFile = (not $tagTablePtr); # this is an XMP data file if no $tagTablePtr
|
|
613
|
+
# prefer XMP over other metadata formats in some types of files
|
|
614
|
+
my $preferred = $xmpFile || ($$exifTool{PreferredGroup} and $$exifTool{PreferredGroup} eq 'XMP');
|
|
615
|
+
my $verbose = $exifTool->Options('Verbose');
|
|
616
|
+
my $dirLen = $$dirInfo{DirLen};
|
|
617
|
+
$dirLen = length($$dataPt) if not defined $dirLen and $dataPt;
|
|
618
|
+
#
|
|
619
|
+
# extract existing XMP information into %capture hash
|
|
620
|
+
#
|
|
621
|
+
# define hash in ExifTool object to capture XMP information (also causes
|
|
622
|
+
# CaptureXMP() instead of FoundXMP() to be called from ParseXMPElement())
|
|
623
|
+
#
|
|
624
|
+
# The %capture hash is keyed on the complete property path beginning after
|
|
625
|
+
# rdf:RDF/rdf:Description/. The values are array references with the
|
|
626
|
+
# following entries: 0) value, 1) attribute hash reference.
|
|
627
|
+
$exifTool->{XMP_CAPTURE} = \%capture;
|
|
628
|
+
$exifTool->{XMP_NS} = \%nsUsed;
|
|
629
|
+
delete $exifTool->{XMP_NO_XMPMETA};
|
|
630
|
+
delete $exifTool->{XMP_NO_XPACKET};
|
|
631
|
+
delete $exifTool->{XMP_IS_XML};
|
|
632
|
+
delete $exifTool->{XMP_IS_SVG};
|
|
633
|
+
|
|
634
|
+
if ($xmpFile or $dirLen) {
|
|
635
|
+
delete $exifTool->{XMP_ERROR};
|
|
636
|
+
delete $exifTool->{XMP_ABOUT};
|
|
637
|
+
# extract all existing XMP information (to the XMP_CAPTURE hash)
|
|
638
|
+
my $success = ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
|
|
639
|
+
# don't continue if there is nothing to parse or if we had a parsing error
|
|
640
|
+
unless ($success and not $exifTool->{XMP_ERROR}) {
|
|
641
|
+
my $err = $exifTool->{XMP_ERROR} || 'Error parsing XMP';
|
|
642
|
+
# may ignore this error only if we were successful
|
|
643
|
+
if ($xmpFile) {
|
|
644
|
+
my $raf = $$dirInfo{RAF};
|
|
645
|
+
# allow empty XMP data so we can create something from nothing
|
|
646
|
+
if ($success or not $raf->Seek(0,2) or $raf->Tell()) {
|
|
647
|
+
# no error message if not an XMP file
|
|
648
|
+
return 0 unless $exifTool->{XMP_ERROR};
|
|
649
|
+
if ($exifTool->Error($err, $success)) {
|
|
650
|
+
delete $exifTool->{XMP_CAPTURE};
|
|
651
|
+
return 0;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
} else {
|
|
655
|
+
if ($exifTool->Warn($err, $success)) {
|
|
656
|
+
delete $exifTool->{XMP_CAPTURE};
|
|
657
|
+
return undef;
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
$tagInfo = $Image::ExifTool::XMP::rdf{about};
|
|
662
|
+
if (defined $exifTool->{NEW_VALUE}->{$tagInfo}) {
|
|
663
|
+
$about = $exifTool->GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo}) || '';
|
|
664
|
+
if ($verbose > 1) {
|
|
665
|
+
my $wasAbout = $exifTool->{XMP_ABOUT};
|
|
666
|
+
$exifTool->VerboseValue('- XMP-rdf:About', UnescapeXML($wasAbout)) if defined $wasAbout;
|
|
667
|
+
$exifTool->VerboseValue('+ XMP-rdf:About', $about);
|
|
668
|
+
}
|
|
669
|
+
$about = EscapeXML($about); # must escape for XML
|
|
670
|
+
++$changed;
|
|
671
|
+
} else {
|
|
672
|
+
$about = $exifTool->{XMP_ABOUT} || '';
|
|
673
|
+
}
|
|
674
|
+
delete $exifTool->{XMP_ERROR};
|
|
675
|
+
delete $exifTool->{XMP_ABOUT};
|
|
676
|
+
} else {
|
|
677
|
+
$about = '';
|
|
678
|
+
}
|
|
679
|
+
#
|
|
680
|
+
# handle writing XMP as a block to XMP file
|
|
681
|
+
#
|
|
682
|
+
if ($xmpFile) {
|
|
683
|
+
$tagInfo = $Image::ExifTool::Extra{XMP};
|
|
684
|
+
if ($tagInfo and $exifTool->{NEW_VALUE}->{$tagInfo}) {
|
|
685
|
+
my $rtnVal = 1;
|
|
686
|
+
my $newVal = $exifTool->GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo});
|
|
687
|
+
if (defined $newVal and length $newVal) {
|
|
688
|
+
$exifTool->VPrint(0, " Writing XMP as a block\n");
|
|
689
|
+
++$exifTool->{CHANGED};
|
|
690
|
+
Write($$dirInfo{OutFile}, $newVal) or $rtnVal = -1;
|
|
691
|
+
}
|
|
692
|
+
delete $exifTool->{XMP_CAPTURE};
|
|
693
|
+
return $rtnVal;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
#
|
|
697
|
+
# delete groups in family 1 if requested
|
|
698
|
+
#
|
|
699
|
+
if (%{$exifTool->{DEL_GROUP}} and (grep /^XMP-.+$/, keys %{$exifTool->{DEL_GROUP}} or
|
|
700
|
+
# (logic is a bit more complex for group names in exiftool XML files)
|
|
701
|
+
grep m{^http://ns.exiftool.ca/}, values %nsUsed))
|
|
702
|
+
{
|
|
703
|
+
my $del = $exifTool->{DEL_GROUP};
|
|
704
|
+
my $path;
|
|
705
|
+
foreach $path (keys %capture) {
|
|
706
|
+
my @propList = split('/',$path); # get property list
|
|
707
|
+
my ($tag, $ns) = GetXMPTagID(\@propList);
|
|
708
|
+
# translate namespace if necessary
|
|
709
|
+
$ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
|
|
710
|
+
my ($grp, @g);
|
|
711
|
+
# no "XMP-" added to most groups in exiftool RDF/XML output file
|
|
712
|
+
if ($nsUsed{$ns} and (@g = ($nsUsed{$ns} =~ m{^http://ns.exiftool.ca/(.*?)/(.*?)/}))) {
|
|
713
|
+
if ($g[1] =~ /^\d/) {
|
|
714
|
+
$grp = "XML-$g[0]";
|
|
715
|
+
#(all XML-* groups stored as uppercase DEL_GROUP key)
|
|
716
|
+
my $ucg = uc $grp;
|
|
717
|
+
next unless $$del{$ucg} or ($$del{'XML-*'} and not $$del{"-$ucg"});
|
|
718
|
+
} else {
|
|
719
|
+
$grp = $g[1];
|
|
720
|
+
next unless $$del{$grp} or ($$del{$g[0]} and not $$del{"-$grp"});
|
|
721
|
+
}
|
|
722
|
+
} else {
|
|
723
|
+
$grp = "XMP-$ns";
|
|
724
|
+
my $ucg = uc $grp;
|
|
725
|
+
next unless $$del{$ucg} or ($$del{'XMP-*'} and not $$del{"-$ucg"});
|
|
726
|
+
}
|
|
727
|
+
$exifTool->VerboseValue("- $grp:$tag", $capture{$path}->[0]);
|
|
728
|
+
delete $capture{$path};
|
|
729
|
+
++$changed;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
# delete HasExtendedXMP tag (we create it as needed)
|
|
733
|
+
my $hasExtTag = 'xmpNote:HasExtendedXMP';
|
|
734
|
+
if ($capture{$hasExtTag}) {
|
|
735
|
+
$exifTool->VerboseValue("- XMP-$hasExtTag", $capture{$hasExtTag}->[0]);
|
|
736
|
+
delete $capture{$hasExtTag};
|
|
737
|
+
}
|
|
738
|
+
# set $xmpOpen now to to handle xmptk tag first
|
|
739
|
+
my $xmpOpen = $exifTool->{XMP_NO_XMPMETA} ? '' : XMPOpen($exifTool);
|
|
740
|
+
#
|
|
741
|
+
# add, delete or change information as specified
|
|
742
|
+
#
|
|
743
|
+
# get hash of all information we want to change
|
|
744
|
+
# (sorted by tag name so alternate languages come last)
|
|
745
|
+
my @tagInfoList = sort ByTagName $exifTool->GetNewTagInfoList();
|
|
746
|
+
foreach $tagInfo (@tagInfoList) {
|
|
747
|
+
next unless $exifTool->GetGroup($tagInfo, 0) eq 'XMP';
|
|
748
|
+
next if $$tagInfo{Name} eq 'XMP'; # (ignore full XMP block if we didn't write it already)
|
|
749
|
+
my $tag = $$tagInfo{TagID};
|
|
750
|
+
my $path = GetPropertyPath($tagInfo);
|
|
751
|
+
unless ($path) {
|
|
752
|
+
$exifTool->Warn("Can't write XMP:$tag (namespace unknown)");
|
|
753
|
+
next;
|
|
754
|
+
}
|
|
755
|
+
# skip tags that were handled specially
|
|
756
|
+
if ($path eq 'rdf:about' or $path eq 'x:xmptk') {
|
|
757
|
+
++$changed;
|
|
758
|
+
next;
|
|
759
|
+
}
|
|
760
|
+
my $isStruct = $$tagInfo{Struct};
|
|
761
|
+
# change our property path namespace prefixes to conform
|
|
762
|
+
# to the ones used in this file
|
|
763
|
+
$path = ConformPathToNamespace($exifTool, $path);
|
|
764
|
+
# find existing property
|
|
765
|
+
my $cap = $capture{$path};
|
|
766
|
+
# MicrosoftPhoto screws up the case of some tags, and some other software,
|
|
767
|
+
# including Adobe software, has been known to write the wrong list type or
|
|
768
|
+
# not properly enclose properties in a list, so we check for this
|
|
769
|
+
# (NOTE: we don't currently do these tests when writing structures!
|
|
770
|
+
# --> add this to DeleteStruct() below if it turns out to be a problem)
|
|
771
|
+
unless ($cap or $isStruct) {
|
|
772
|
+
my $regex = quotemeta $path;
|
|
773
|
+
# also allow for missing structure fields in lists of structures
|
|
774
|
+
$regex =~ s/ \d+/ \\d\+/g;
|
|
775
|
+
my $ok = $regex; # regular expression to match standard property names
|
|
776
|
+
my $ok2;
|
|
777
|
+
# also check for incorrect list types which can cause problems
|
|
778
|
+
if ($regex =~ s{\\/rdf\\:(Bag|Seq|Alt)\\/}{/rdf:(Bag|Seq|Alt)/}g) {
|
|
779
|
+
# also look for missing bottom-level list
|
|
780
|
+
$regex =~ s{/rdf:\(Bag\|Seq\|Alt\)\/rdf\\:li\\ \\d\+$}{(/.*)?};
|
|
781
|
+
} else {
|
|
782
|
+
$ok2 = $regex;
|
|
783
|
+
# check for properties in lists that shouldn't be
|
|
784
|
+
# (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4325.0.html)
|
|
785
|
+
$regex .= '(/rdf:(Bag|Seq|Alt)/rdf:li \d+)?';
|
|
786
|
+
}
|
|
787
|
+
my @matches = sort grep m{^$regex$}i, keys %capture;
|
|
788
|
+
if (@matches) {
|
|
789
|
+
if ($matches[0] =~ /^$ok$/) {
|
|
790
|
+
$path = $matches[0]; # use existing property path
|
|
791
|
+
$cap = $capture{$path};
|
|
792
|
+
} else {
|
|
793
|
+
# property list was wrong, so issue a warning and fix it
|
|
794
|
+
my ($match, @fixed, %fixed, $err);
|
|
795
|
+
foreach $match (@matches) {
|
|
796
|
+
my $fixed = $path;
|
|
797
|
+
# set list indices
|
|
798
|
+
while ($match =~ / (\d+)/g) {
|
|
799
|
+
my $idx = $1;
|
|
800
|
+
# insert leading "X" so we don't replace this one again
|
|
801
|
+
$fixed =~ s/ \d+/ X$idx/;
|
|
802
|
+
}
|
|
803
|
+
$fixed =~ s/ X/ /g if $fixed ne $path; # remove "X"s
|
|
804
|
+
$err = 1 if $capture{$fixed} or $fixed{$fixed};
|
|
805
|
+
push @fixed, $fixed;
|
|
806
|
+
$fixed{$fixed} = 1;
|
|
807
|
+
}
|
|
808
|
+
my $tg = $exifTool->GetGroup($tagInfo, 1) . ':' . $$tagInfo{Name};
|
|
809
|
+
my $wrn = lc($path) eq lc($matches[0]) ? 'tag ID case' : 'list type';
|
|
810
|
+
if ($err) {
|
|
811
|
+
$exifTool->Warn("Incorrect $wrn for existing $tg (not changed)");
|
|
812
|
+
} else {
|
|
813
|
+
# fix the incorrect property paths for all values of this tag
|
|
814
|
+
foreach $match (@matches) {
|
|
815
|
+
my $fixed = shift @fixed;
|
|
816
|
+
$capture{$fixed} = $capture{$match};
|
|
817
|
+
delete $capture{$match};
|
|
818
|
+
# remove xml:lang attribute from incorrect lang-alt list if necessary
|
|
819
|
+
delete $capture{$fixed}[1]{'xml:lang'} if $ok2 and $match !~ /^$ok2$/;
|
|
820
|
+
}
|
|
821
|
+
$cap = $capture{$path} || $capture{$fixed[0]};
|
|
822
|
+
$exifTool->Warn("Fixed incorrect $wrn for $tg", 1);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
my $nvHash = $exifTool->GetNewValueHash($tagInfo);
|
|
828
|
+
my $overwrite = $exifTool->IsOverwriting($nvHash);
|
|
829
|
+
my $writable = $$tagInfo{Writable} || '';
|
|
830
|
+
my (%attrs, $deleted, $added, $existed);
|
|
831
|
+
# delete existing entry if necessary
|
|
832
|
+
if ($isStruct) {
|
|
833
|
+
require 'Image/ExifTool/XMPStruct.pl';
|
|
834
|
+
($deleted, $added, $existed) = DeleteStruct($exifTool, \%capture, \$path, $nvHash, \$changed);
|
|
835
|
+
next unless $deleted or $added or $exifTool->IsOverwriting($nvHash);
|
|
836
|
+
next if $existed and $$nvHash{CreateOnly};
|
|
837
|
+
} elsif ($cap) {
|
|
838
|
+
next if $$nvHash{CreateOnly}; # (necessary for List-type tags)
|
|
839
|
+
# take attributes from old values if they exist
|
|
840
|
+
%attrs = %{$$cap[1]};
|
|
841
|
+
if ($overwrite) {
|
|
842
|
+
my ($delPath, $oldLang, $delLang, $addLang, @matchingPaths);
|
|
843
|
+
# check to see if this is an indexed list item
|
|
844
|
+
if ($path =~ / /) {
|
|
845
|
+
my $pp;
|
|
846
|
+
($pp = $path) =~ s/ \d+/ \\d\+/g;
|
|
847
|
+
@matchingPaths = sort grep(/^$pp$/, keys %capture);
|
|
848
|
+
} else {
|
|
849
|
+
push @matchingPaths, $path;
|
|
850
|
+
}
|
|
851
|
+
foreach $path (@matchingPaths) {
|
|
852
|
+
my ($val, $attrs) = @{$capture{$path}};
|
|
853
|
+
if ($writable eq 'lang-alt') {
|
|
854
|
+
unless (defined $addLang) {
|
|
855
|
+
# add to lang-alt list by default if creating this tag from scratch
|
|
856
|
+
$addLang = $$nvHash{IsCreating} ? 1 : 0;
|
|
857
|
+
}
|
|
858
|
+
# get original language code (lc for comparisons)
|
|
859
|
+
$oldLang = lc($$attrs{'xml:lang'} || 'x-default');
|
|
860
|
+
if ($overwrite < 0) {
|
|
861
|
+
my $newLang = lc($$tagInfo{LangCode} || 'x-default');
|
|
862
|
+
next unless $oldLang eq $newLang;
|
|
863
|
+
# only add new tag if we are overwriting this one
|
|
864
|
+
# (note: this won't match if original XML contains CDATA!)
|
|
865
|
+
$addLang = $exifTool->IsOverwriting($nvHash, UnescapeXML($val));
|
|
866
|
+
next unless $addLang;
|
|
867
|
+
}
|
|
868
|
+
# delete all if deleting "x-default" and writing with no LangCode
|
|
869
|
+
# (XMP spec requires x-default language exist and be first in list)
|
|
870
|
+
if ($oldLang eq 'x-default' and not $$tagInfo{LangCode}) {
|
|
871
|
+
$delLang = 1; # delete all languages
|
|
872
|
+
$overwrite = 1; # force overwrite
|
|
873
|
+
} elsif ($$tagInfo{LangCode} and not $delLang) {
|
|
874
|
+
# only overwrite specified language
|
|
875
|
+
next unless lc($$tagInfo{LangCode}) eq $oldLang;
|
|
876
|
+
}
|
|
877
|
+
} elsif ($overwrite < 0) {
|
|
878
|
+
# only overwrite specific values
|
|
879
|
+
if ($$nvHash{Shift}) {
|
|
880
|
+
# values to be shifted are checked (hence re-formatted) late,
|
|
881
|
+
# so we must un-format the to-be-shifted value for IsOverwriting()
|
|
882
|
+
my $fmt = $$tagInfo{Writable} || '';
|
|
883
|
+
if ($fmt eq 'rational') {
|
|
884
|
+
ConvertRational($val);
|
|
885
|
+
} elsif ($fmt eq 'date') {
|
|
886
|
+
$val = ConvertXMPDate($val);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
# (note: this won't match if original XML contains CDATA!)
|
|
890
|
+
next unless $exifTool->IsOverwriting($nvHash, UnescapeXML($val));
|
|
891
|
+
}
|
|
892
|
+
if ($verbose > 1) {
|
|
893
|
+
my $grp = $exifTool->GetGroup($tagInfo, 1);
|
|
894
|
+
my $tagName = $$tagInfo{Name};
|
|
895
|
+
$tagName =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
|
|
896
|
+
$tagName .= '-' . $$attrs{'xml:lang'} if $$attrs{'xml:lang'};
|
|
897
|
+
$exifTool->VerboseValue("- $grp:$tagName", $val);
|
|
898
|
+
}
|
|
899
|
+
# save attributes and path from first deleted property
|
|
900
|
+
# so we can replace it exactly
|
|
901
|
+
unless ($delPath) {
|
|
902
|
+
%attrs = %$attrs;
|
|
903
|
+
$delPath = $path;
|
|
904
|
+
}
|
|
905
|
+
# delete this tag
|
|
906
|
+
delete $capture{$path};
|
|
907
|
+
++$changed;
|
|
908
|
+
# delete rdf:type tag if it is the only thing left in this structure
|
|
909
|
+
if ($path =~ /^(.*)\// and $capture{"$1/rdf:type"}) {
|
|
910
|
+
my $pp = $1;
|
|
911
|
+
my @a = grep /^\Q$pp\E\/[^\/]+/, keys %capture;
|
|
912
|
+
delete $capture{"$pp/rdf:type"} if @a == 1;
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
next unless $delPath or $$tagInfo{List} or $addLang;
|
|
916
|
+
if ($delPath) {
|
|
917
|
+
$path = $delPath;
|
|
918
|
+
$deleted = 1;
|
|
919
|
+
} else {
|
|
920
|
+
# don't change tag if we couldn't delete old copy
|
|
921
|
+
# unless this is a list or an lang-alt tag
|
|
922
|
+
next unless $$tagInfo{List} or $oldLang;
|
|
923
|
+
# (match last index to put in same lang-alt list for Bag of lang-alt items)
|
|
924
|
+
$path =~ m/.* (\d+)/g or warn "Internal error: no list index!\n", next;
|
|
925
|
+
$added = $1;
|
|
926
|
+
}
|
|
927
|
+
} else {
|
|
928
|
+
# we are never overwriting, so we must be adding to a list
|
|
929
|
+
# match the last index unless this is a list of lang-alt lists
|
|
930
|
+
my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)';
|
|
931
|
+
if ($path =~ m/$pat/g) {
|
|
932
|
+
$added = $1;
|
|
933
|
+
# set position to end of matching index number
|
|
934
|
+
pos($path) = pos($path) - length($2) if $2;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
if (defined $added) {
|
|
938
|
+
my $len = length $added;
|
|
939
|
+
my $pos = pos($path) - $len;
|
|
940
|
+
my $nxt = substr($added, 1) + 1;
|
|
941
|
+
# always insert x-default lang-alt entry first (as per XMP spec)
|
|
942
|
+
# (need to test $overwrite because this will be a new lang-alt entry otherwise)
|
|
943
|
+
if ($overwrite and $writable eq 'lang-alt' and (not $$tagInfo{LangCode} or
|
|
944
|
+
$$tagInfo{LangCode} eq 'x-default'))
|
|
945
|
+
{
|
|
946
|
+
my $saveCap = $capture{$path};
|
|
947
|
+
for (;;) {
|
|
948
|
+
my $p = $path;
|
|
949
|
+
substr($p, $pos, $len) = length($nxt) . $nxt;
|
|
950
|
+
# increment index in the path of the existing item
|
|
951
|
+
my $nextCap = $capture{$p};
|
|
952
|
+
$capture{$p} = $saveCap;
|
|
953
|
+
last unless $nextCap;
|
|
954
|
+
$saveCap = $nextCap;
|
|
955
|
+
++$nxt;
|
|
956
|
+
}
|
|
957
|
+
} else {
|
|
958
|
+
# add to end of list
|
|
959
|
+
for (;;) {
|
|
960
|
+
my $try = length($nxt) . $nxt;
|
|
961
|
+
substr($path, $pos, $len) = $try;
|
|
962
|
+
last unless $capture{$path};
|
|
963
|
+
$len = length $try;
|
|
964
|
+
++$nxt;
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
# check to see if we want to create this tag
|
|
970
|
+
# (create non-avoided tags in XMP data files by default)
|
|
971
|
+
my $isCreating = ($$nvHash{IsCreating} or (($isStruct or
|
|
972
|
+
($preferred and not $$tagInfo{Avoid} and
|
|
973
|
+
not defined $$nvHash{Shift})) and not $$nvHash{EditOnly}));
|
|
974
|
+
|
|
975
|
+
# don't add new values unless...
|
|
976
|
+
# ...tag existed before and was deleted, or we added it to a list
|
|
977
|
+
next unless $deleted or defined $added or
|
|
978
|
+
# ...tag didn't exist before and we are creating it
|
|
979
|
+
(not $cap and $isCreating);
|
|
980
|
+
|
|
981
|
+
# get list of new values (all done if no new values specified)
|
|
982
|
+
my @newValues = $exifTool->GetNewValues($nvHash) or next;
|
|
983
|
+
|
|
984
|
+
# set language attribute for lang-alt lists
|
|
985
|
+
$attrs{'xml:lang'} = $$tagInfo{LangCode} || 'x-default' if $writable eq 'lang-alt';
|
|
986
|
+
|
|
987
|
+
# add new value(s) to %capture hash
|
|
988
|
+
my $subIdx;
|
|
989
|
+
for (;;) {
|
|
990
|
+
my $newValue = shift @newValues;
|
|
991
|
+
if ($isStruct) {
|
|
992
|
+
++$changed if AddNewStruct($exifTool, $tagInfo, \%capture,
|
|
993
|
+
$path, $newValue, $$tagInfo{Struct});
|
|
994
|
+
} else {
|
|
995
|
+
$newValue = EscapeXML($newValue);
|
|
996
|
+
for (;;) { # (a cheap 'goto')
|
|
997
|
+
if ($$tagInfo{Resource}) {
|
|
998
|
+
# only store as a resource if it doesn't contain any illegal characters
|
|
999
|
+
if ($newValue !~ /[^a-z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\.\-\_\~]/i) {
|
|
1000
|
+
$capture{$path} = [ '', { %attrs, 'rdf:resource' => $newValue } ];
|
|
1001
|
+
last;
|
|
1002
|
+
}
|
|
1003
|
+
my $grp = $exifTool->GetGroup($tagInfo, 1);
|
|
1004
|
+
$exifTool->Warn("$grp:$$tagInfo{Name} written as a literal because value is not a valid URI", 1);
|
|
1005
|
+
# fall through to write as a string literal
|
|
1006
|
+
}
|
|
1007
|
+
delete $attrs{'rdf:resource'}; # (remove existing resource if necessary)
|
|
1008
|
+
$capture{$path} = [ $newValue, \%attrs ];
|
|
1009
|
+
last;
|
|
1010
|
+
}
|
|
1011
|
+
if ($verbose > 1) {
|
|
1012
|
+
my $grp = $exifTool->GetGroup($tagInfo, 1);
|
|
1013
|
+
$exifTool->VerboseValue("+ $grp:$$tagInfo{Name}", $newValue);
|
|
1014
|
+
}
|
|
1015
|
+
++$changed;
|
|
1016
|
+
# add rdf:type if necessary
|
|
1017
|
+
if ($$tagInfo{StructType}) {
|
|
1018
|
+
AddStructType($exifTool, $$tagInfo{Table}, \%capture, $path);
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
last unless @newValues;
|
|
1022
|
+
# match last index except for lang-alt items where we want to put each
|
|
1023
|
+
# item in a different lang-alt list (so match the 2nd-last for these)
|
|
1024
|
+
my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)';
|
|
1025
|
+
$path =~ m/$pat/g or warn("Internal error: no list index for $tag!\n"), next;
|
|
1026
|
+
my $idx = $1;
|
|
1027
|
+
my $len = length $1;
|
|
1028
|
+
my $pos = pos($path) - $len - ($2 ? length $2 : 0);
|
|
1029
|
+
# generate unique list sub-indices to store additional values in sequence
|
|
1030
|
+
if ($subIdx) {
|
|
1031
|
+
$idx = substr($idx, 0, -length($subIdx)); # remove old sub-index
|
|
1032
|
+
$subIdx = substr($subIdx, 1) + 1;
|
|
1033
|
+
$subIdx = length($subIdx) . $subIdx;
|
|
1034
|
+
} else {
|
|
1035
|
+
$subIdx = '10';
|
|
1036
|
+
}
|
|
1037
|
+
substr($path, $pos, $len) = $idx . $subIdx;
|
|
1038
|
+
}
|
|
1039
|
+
# make sure any empty structures are deleted
|
|
1040
|
+
# (ExifTool shouldn't write these, but other software may)
|
|
1041
|
+
if (defined $$tagInfo{Flat}) {
|
|
1042
|
+
my $p = $path;
|
|
1043
|
+
while ($p =~ s/\/[^\/]+$//) {
|
|
1044
|
+
next unless $capture{$p};
|
|
1045
|
+
# it is an error if this property has a value
|
|
1046
|
+
$exifTool->Error("Improperly structured XMP ($p)",1) if $capture{$p}[0] =~ /\S/;
|
|
1047
|
+
delete $capture{$p}; # delete the (hopefully) empty structure
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
# remove the ExifTool members we created
|
|
1052
|
+
delete $exifTool->{XMP_CAPTURE};
|
|
1053
|
+
delete $exifTool->{XMP_NS};
|
|
1054
|
+
|
|
1055
|
+
my $maxDataLen = $$dirInfo{MaxDataLen};
|
|
1056
|
+
# get DataPt again because it may have been set by ProcessXMP
|
|
1057
|
+
$dataPt = $$dirInfo{DataPt};
|
|
1058
|
+
# return now if we didn't change anything
|
|
1059
|
+
unless ($changed or ($maxDataLen and $dataPt and defined $$dataPt and
|
|
1060
|
+
length($$dataPt) > $maxDataLen))
|
|
1061
|
+
{
|
|
1062
|
+
return undef unless $xmpFile; # just rewrite original XMP
|
|
1063
|
+
Write($$dirInfo{OutFile}, $$dataPt) or return -1 if $dataPt and defined $$dataPt;
|
|
1064
|
+
return 1;
|
|
1065
|
+
}
|
|
1066
|
+
#
|
|
1067
|
+
# write out the new XMP information (serialize it)
|
|
1068
|
+
#
|
|
1069
|
+
# start writing the XMP data
|
|
1070
|
+
my $newData = '';
|
|
1071
|
+
if ($$exifTool{XMP_NO_XPACKET}) {
|
|
1072
|
+
# write BOM if flag is set
|
|
1073
|
+
$newData .= "\xef\xbb\xbf" if $$exifTool{XMP_NO_XPACKET} == 2;
|
|
1074
|
+
} else {
|
|
1075
|
+
$newData .= $pktOpen;
|
|
1076
|
+
}
|
|
1077
|
+
$newData .= $xmlOpen if $$exifTool{XMP_IS_XML};
|
|
1078
|
+
$newData .= $xmpOpen . $rdfOpen;
|
|
1079
|
+
|
|
1080
|
+
# initialize current property path list
|
|
1081
|
+
my (@curPropList, @writeLast, @descStart, $extStart);
|
|
1082
|
+
my (%nsCur, $prop, $n, $path);
|
|
1083
|
+
my @pathList = sort TypeFirst keys %capture;
|
|
1084
|
+
# order properties to write large values last if we have a MaxDataLen limit
|
|
1085
|
+
if ($maxDataLen and @pathList) {
|
|
1086
|
+
my @pathTmp;
|
|
1087
|
+
my ($lastProp, $lastNS, $propSize) = ('', '', 0);
|
|
1088
|
+
my @pathLoop = (@pathList, ''); # add empty path to end of list for loop
|
|
1089
|
+
undef @pathList;
|
|
1090
|
+
foreach $path (@pathLoop) {
|
|
1091
|
+
$path =~ /^((\w*)[^\/]*)/; # get path element ($1) and ns ($2)
|
|
1092
|
+
if ($1 eq $lastProp) {
|
|
1093
|
+
push @pathTmp, $path; # accumulate all paths with same root
|
|
1094
|
+
} else {
|
|
1095
|
+
# put in list to write last if recommended or values are too large
|
|
1096
|
+
if ($extendedRes{$lastProp} or $extendedRes{$lastNS} or
|
|
1097
|
+
$propSize > $newDescThresh)
|
|
1098
|
+
{
|
|
1099
|
+
push @writeLast, @pathTmp;
|
|
1100
|
+
} else {
|
|
1101
|
+
push @pathList, @pathTmp;
|
|
1102
|
+
}
|
|
1103
|
+
last unless $path; # all done if we hit empty path
|
|
1104
|
+
@pathTmp = ( $path );
|
|
1105
|
+
($lastProp, $lastNS, $propSize) = ($1, $2, 0);
|
|
1106
|
+
}
|
|
1107
|
+
$propSize += length $capture{$path}->[0];
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
# write out all properties
|
|
1112
|
+
for (;;) {
|
|
1113
|
+
my (%nsNew, $newDesc);
|
|
1114
|
+
unless (@pathList) {
|
|
1115
|
+
last unless @writeLast;
|
|
1116
|
+
@pathList = @writeLast;
|
|
1117
|
+
undef @writeLast;
|
|
1118
|
+
$extStart = length $newData;
|
|
1119
|
+
$newDesc = 1; # start with a new description
|
|
1120
|
+
}
|
|
1121
|
+
$path = shift @pathList;
|
|
1122
|
+
my @propList = split('/',$path); # get property list
|
|
1123
|
+
# must open/close rdf:Description too
|
|
1124
|
+
unshift @propList, $rdfDesc;
|
|
1125
|
+
# make sure we have defined all necessary namespaces
|
|
1126
|
+
foreach $prop (@propList) {
|
|
1127
|
+
$prop =~ /(.*):/ or next;
|
|
1128
|
+
$1 eq 'rdf' and next; # rdf namespace already defined
|
|
1129
|
+
my $uri = $nsUsed{$1};
|
|
1130
|
+
unless ($uri) {
|
|
1131
|
+
$uri = $nsURI{$1}; # we must have added a namespace
|
|
1132
|
+
$uri or $xmpErr = "Undefined XMP namespace: $1", next;
|
|
1133
|
+
}
|
|
1134
|
+
$nsNew{$1} = $uri;
|
|
1135
|
+
# need a new description if any new namespaces
|
|
1136
|
+
$newDesc = 1 unless $nsCur{$1};
|
|
1137
|
+
}
|
|
1138
|
+
my $closeTo = 0;
|
|
1139
|
+
if ($newDesc) {
|
|
1140
|
+
# look forward to see if we will want to also open other namespaces
|
|
1141
|
+
# at this level (this is necessary to keep lists and structures from
|
|
1142
|
+
# being broken if a property introduces a new namespace; plus it
|
|
1143
|
+
# improves formatting)
|
|
1144
|
+
my ($path2, $ns2);
|
|
1145
|
+
foreach $path2 (@pathList) {
|
|
1146
|
+
my @ns2s = ($path2 =~ m{(?:^|/)([^/]+?):}g);
|
|
1147
|
+
my $opening = 0;
|
|
1148
|
+
foreach $ns2 (@ns2s) {
|
|
1149
|
+
next if $ns2 eq 'rdf';
|
|
1150
|
+
$nsNew{$ns2} and ++$opening, next;
|
|
1151
|
+
last unless $opening;
|
|
1152
|
+
# get URI for this existing or new namespace
|
|
1153
|
+
my $uri = $nsUsed{$ns2} || $nsURI{$ns2} or last;
|
|
1154
|
+
$nsNew{$ns2} = $uri; # also open this namespace
|
|
1155
|
+
}
|
|
1156
|
+
last unless $opening;
|
|
1157
|
+
}
|
|
1158
|
+
} else {
|
|
1159
|
+
# find first property where the current path differs from the new path
|
|
1160
|
+
for ($closeTo=0; $closeTo<@curPropList; ++$closeTo) {
|
|
1161
|
+
last unless $closeTo < @propList;
|
|
1162
|
+
last unless $propList[$closeTo] eq $curPropList[$closeTo];
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
# close out properties down to the common base path
|
|
1166
|
+
while (@curPropList > $closeTo) {
|
|
1167
|
+
($prop = pop @curPropList) =~ s/ .*//;
|
|
1168
|
+
$newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
|
|
1169
|
+
}
|
|
1170
|
+
if ($newDesc) {
|
|
1171
|
+
# save rdf:Description start positions so we can reorder them if necessary
|
|
1172
|
+
push @descStart, length($newData) if $maxDataLen;
|
|
1173
|
+
# open the new description
|
|
1174
|
+
$prop = $rdfDesc;
|
|
1175
|
+
%nsCur = %nsNew; # save current namespaces
|
|
1176
|
+
$newData .= "\n <$prop rdf:about='$about'";
|
|
1177
|
+
my @ns = sort keys %nsCur;
|
|
1178
|
+
# generate et:toolkit attribute if this is an exiftool RDF/XML output file
|
|
1179
|
+
if (@ns and $nsCur{$ns[0]} =~ m{^http://ns.exiftool.ca/}) {
|
|
1180
|
+
$newData .= "\n xmlns:et='http://ns.exiftool.ca/1.0/'" .
|
|
1181
|
+
" et:toolkit='Image::ExifTool $Image::ExifTool::VERSION'";
|
|
1182
|
+
}
|
|
1183
|
+
foreach (@ns) {
|
|
1184
|
+
$newData .= "\n xmlns:$_='$nsCur{$_}'";
|
|
1185
|
+
}
|
|
1186
|
+
$newData .= ">\n";
|
|
1187
|
+
push @curPropList, $prop;
|
|
1188
|
+
}
|
|
1189
|
+
# loop over all values for this new property
|
|
1190
|
+
my ($val, $attrs) = @{$capture{$path}};
|
|
1191
|
+
$debug and print "$path = $val\n";
|
|
1192
|
+
# open new properties
|
|
1193
|
+
my $attr;
|
|
1194
|
+
for ($n=@curPropList; $n<$#propList; ++$n) {
|
|
1195
|
+
$prop = $propList[$n];
|
|
1196
|
+
push @curPropList, $prop;
|
|
1197
|
+
# remove list index if it exists
|
|
1198
|
+
$prop =~ s/ .*//;
|
|
1199
|
+
$attr = '';
|
|
1200
|
+
if ($prop ne $rdfDesc and ($propList[$n+1] !~ /^rdf:/ or
|
|
1201
|
+
($propList[$n+1] eq 'rdf:type' and $n+1 == $#propList)))
|
|
1202
|
+
{
|
|
1203
|
+
# need parseType='Resource' to avoid new 'rdf:Description'
|
|
1204
|
+
$attr = " rdf:parseType='Resource'";
|
|
1205
|
+
}
|
|
1206
|
+
$newData .= (' ' x scalar(@curPropList)) . "<$prop$attr>\n";
|
|
1207
|
+
}
|
|
1208
|
+
my $prop2 = pop @propList; # get new property name
|
|
1209
|
+
$prop2 =~ s/ .*//; # remove list index if it exists
|
|
1210
|
+
$newData .= (' ' x scalar(@curPropList)) . " <$prop2";
|
|
1211
|
+
# write out attributes
|
|
1212
|
+
foreach $attr (sort keys %$attrs) {
|
|
1213
|
+
my $attrVal = $$attrs{$attr};
|
|
1214
|
+
my $quot = ($attrVal =~ /'/) ? '"' : "'";
|
|
1215
|
+
$newData .= " $attr=$quot$attrVal$quot";
|
|
1216
|
+
}
|
|
1217
|
+
$newData .= length $val ? ">$val</$prop2>\n" : "/>\n";
|
|
1218
|
+
}
|
|
1219
|
+
# close off any open elements
|
|
1220
|
+
while ($prop = pop @curPropList) {
|
|
1221
|
+
$prop =~ s/ .*//; # remove list index if it exists
|
|
1222
|
+
$newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
|
|
1223
|
+
}
|
|
1224
|
+
# limit XMP length and re-arrange if necessary to fit inside specified size
|
|
1225
|
+
my $compact = $$dirInfo{Compact} || $exifTool->Options('Compact');
|
|
1226
|
+
if ($maxDataLen) {
|
|
1227
|
+
# adjust maxDataLen to allow room for closing elements
|
|
1228
|
+
$maxDataLen -= length($rdfClose) + length($xmpClose) + length($pktCloseW);
|
|
1229
|
+
$extStart or $extStart = length $newData;
|
|
1230
|
+
my @rtn = LimitXMPSize($exifTool, \$newData, $maxDataLen, $about, \@descStart, $extStart);
|
|
1231
|
+
# return extended XMP information in $dirInfo
|
|
1232
|
+
$$dirInfo{ExtendedXMP} = $rtn[0];
|
|
1233
|
+
$$dirInfo{ExtendedGUID} = $rtn[1];
|
|
1234
|
+
# compact if necessary to fit
|
|
1235
|
+
$compact = 1 if length($newData) + 101 * $numPadLines > $maxDataLen;
|
|
1236
|
+
}
|
|
1237
|
+
#
|
|
1238
|
+
# close out the XMP, clean up, and return our data
|
|
1239
|
+
#
|
|
1240
|
+
$newData .= $rdfClose;
|
|
1241
|
+
$newData .= $xmpClose unless $exifTool->{XMP_NO_XMPMETA};
|
|
1242
|
+
|
|
1243
|
+
# remove the ExifTool members we created
|
|
1244
|
+
delete $exifTool->{XMP_CAPTURE};
|
|
1245
|
+
delete $exifTool->{XMP_NS};
|
|
1246
|
+
delete $exifTool->{XMP_NO_XMPMETA};
|
|
1247
|
+
|
|
1248
|
+
# (the XMP standard recommends writing 2k-4k of white space before the
|
|
1249
|
+
# packet trailer, with a newline every 100 characters)
|
|
1250
|
+
unless ($$exifTool{XMP_NO_XPACKET}) {
|
|
1251
|
+
my $pad = (' ' x 100) . "\n";
|
|
1252
|
+
if ($$dirInfo{InPlace}) {
|
|
1253
|
+
# pad to specified DirLen
|
|
1254
|
+
my $len = length($newData) + length($pktCloseW);
|
|
1255
|
+
if ($len > $dirLen) {
|
|
1256
|
+
$exifTool->Warn('Not enough room to edit XMP in place');
|
|
1257
|
+
return undef;
|
|
1258
|
+
}
|
|
1259
|
+
my $num = int(($dirLen - $len) / length($pad));
|
|
1260
|
+
if ($num) {
|
|
1261
|
+
$newData .= $pad x $num;
|
|
1262
|
+
$len += length($pad) * $num;
|
|
1263
|
+
}
|
|
1264
|
+
$len < $dirLen and $newData .= (' ' x ($dirLen - $len - 1)) . "\n";
|
|
1265
|
+
} elsif (not $compact and not $xmpFile and not $$dirInfo{ReadOnly}) {
|
|
1266
|
+
$newData .= $pad x $numPadLines;
|
|
1267
|
+
}
|
|
1268
|
+
$newData .= ($$dirInfo{ReadOnly} ? $pktCloseR : $pktCloseW);
|
|
1269
|
+
}
|
|
1270
|
+
# return empty data if no properties exist and this is allowed
|
|
1271
|
+
unless (%capture or $xmpFile or $$dirInfo{InPlace} or $$dirInfo{NoDelete}) {
|
|
1272
|
+
$newData = '';
|
|
1273
|
+
}
|
|
1274
|
+
if ($xmpErr) {
|
|
1275
|
+
if ($xmpFile) {
|
|
1276
|
+
$exifTool->Error($xmpErr);
|
|
1277
|
+
return -1;
|
|
1278
|
+
}
|
|
1279
|
+
$exifTool->Warn($xmpErr);
|
|
1280
|
+
return undef;
|
|
1281
|
+
}
|
|
1282
|
+
$exifTool->{CHANGED} += $changed;
|
|
1283
|
+
$debug > 1 and $newData and print $newData,"\n";
|
|
1284
|
+
return $newData unless $xmpFile;
|
|
1285
|
+
Write($$dirInfo{OutFile}, $newData) or return -1;
|
|
1286
|
+
return 1;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
1; # end
|
|
1291
|
+
|
|
1292
|
+
__END__
|
|
1293
|
+
|
|
1294
|
+
=head1 NAME
|
|
1295
|
+
|
|
1296
|
+
Image::ExifTool::WriteXMP.pl - Write XMP meta information
|
|
1297
|
+
|
|
1298
|
+
=head1 SYNOPSIS
|
|
1299
|
+
|
|
1300
|
+
These routines are autoloaded by Image::ExifTool::XMP.
|
|
1301
|
+
|
|
1302
|
+
=head1 DESCRIPTION
|
|
1303
|
+
|
|
1304
|
+
This file contains routines to write XMP metadata.
|
|
1305
|
+
|
|
1306
|
+
=head1 AUTHOR
|
|
1307
|
+
|
|
1308
|
+
Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
|
|
1309
|
+
|
|
1310
|
+
This library is free software; you can redistribute it and/or modify it
|
|
1311
|
+
under the same terms as Perl itself.
|
|
1312
|
+
|
|
1313
|
+
=head1 SEE ALSO
|
|
1314
|
+
|
|
1315
|
+
L<Image::ExifTool::XMP(3pm)|Image::ExifTool::XMP>,
|
|
1316
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
|
1317
|
+
|
|
1318
|
+
=cut
|