00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00032
00033 #ifdef HAVE_CONFIG_H
00034 #include "autoconfig.h"
00035 #endif
00036
00037 #ifdef HAVE_EXIV2
00038 #include <exiv2/image.hpp>
00039 #include <exiv2/exif.hpp>
00040
00041 #include "exiv2_handler.h"
00042 #include "string_converter.h"
00043 #include "tools.h"
00044
00045 using namespace zmm;
00046
00047 Exiv2Handler::Exiv2Handler() : MetadataHandler()
00048 {
00049 }
00050
00051 void Exiv2Handler::fillMetadata(Ref<CdsItem> item)
00052 {
00053 Ref<StringConverter> sc = StringConverter::m2i();
00054
00055 Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(std::string(item->getLocation().c_str()));
00056 image->readMetadata();
00057 Exiv2::ExifData &exifData = image->exifData();
00058
00059
00060 String comment = (char *)image->comment().c_str();
00061
00062 if (exifData.empty())
00063 {
00064
00065 return;
00066 }
00067
00068
00069 Exiv2::ExifData::const_iterator md = exifData.findKey(Exiv2::ExifKey("Exif.Photo.DateTimeOriginal"));
00070 if (md != exifData.end())
00071 {
00073 item->setMetadata(MT_KEYS[M_DATE].upnp, sc->convert((char *)md->toString().c_str()));
00074 }
00075
00076
00077
00078 if (!string_ok(comment))
00079 {
00080 md = exifData.findKey(Exiv2::ExifKey("Exif.Photo.UserComment"));
00081 if (md != exifData.end())
00082 comment = (char *)md->toString().c_str();
00083 }
00084
00085
00086 if (!string_ok(comment))
00087 {
00088 String cam_model;
00089 String flash;
00090 String focal_length;
00091
00092 md = exifData.findKey(Exiv2::ExifKey("Exif.Image.Model"));
00093 if (md != exifData.end())
00094 cam_model = (char *)md->toString().c_str();
00095
00096 md = exifData.findKey(Exiv2::ExifKey("Exif.Photo.Flash"));
00097 if (md != exifData.end())
00098 flash = (char *)md->toString().c_str();
00099
00100 md = exifData.findKey(Exiv2::ExifKey("Exif.Photo.FocalLength"));
00101 if (md != exifData.end())
00102 {
00103 focal_length = (char *)md->toString().c_str();
00104 md = exifData.findKey(Exiv2::ExifKey("Exif.Photo.FocalLengthIn35mmFilm"));
00105 if (md != exifData.end())
00106 {
00107 focal_length = focal_length + " (35 mm equivalent: " + (char *)md->toString().c_str() + ")";
00108 }
00109 }
00110
00111
00112 if (string_ok(cam_model))
00113 comment = _("Taken with ") + cam_model;
00114
00115 if (string_ok(flash))
00116 {
00117 if (string_ok(comment))
00118 comment = comment + ", Flash setting:" + flash;
00119 else
00120 comment = _("Flash setting: ") + flash;
00121 }
00122
00123 if (string_ok(focal_length))
00124 {
00125 if (string_ok(comment))
00126 comment = comment + ", Focal length: " + focal_length;
00127 else
00128 comment = _("Focal length: ") + focal_length;
00129 }
00130 }
00131
00132 if (string_ok(comment))
00133 item->setMetadata(MT_KEYS[M_DESCRIPTION].upnp, sc->convert(comment));
00134
00135 }
00136
00137 Ref<IOHandler> Exiv2Handler::serveContent(Ref<CdsItem> item, int resNum)
00138 {
00139 return nil;
00140 }
00141
00142 #endif // HAVE_EXIV2