diff --git a/app/exiv2wrapper.cpp b/app/exiv2wrapper.cpp index c0bc16d..a46d390 100644 --- a/app/exiv2wrapper.cpp +++ b/app/exiv2wrapper.cpp @@ -99,3 +99,24 @@ QString Exiv2Wrapper::value(const QString &key) const return m_metadataValue.value(key); } +QString Exiv2Wrapper::XmpValue(const QString &rawValue) +{ + QString ignored; + return Exiv2Wrapper::XmpValue(rawValue, ignored); +} + +QString Exiv2Wrapper::XmpValue(const QString &rawValue, QString &language) +{ + if (rawValue.size() > 6 && rawValue.startsWith(QLatin1String("lang=\""))) { + int pos = rawValue.indexOf('"', 6); + + if (pos != -1) { + language = rawValue.mid(6, pos - 6); + return (rawValue.mid(pos + 2)); + } + } + + language.clear(); + return rawValue; +} + diff --git a/app/exiv2wrapper.h b/app/exiv2wrapper.h index e2d050b..8c11938 100644 --- a/app/exiv2wrapper.h +++ b/app/exiv2wrapper.h @@ -23,6 +23,9 @@ public: QString label(const QString & key) const; QString value(const QString & key) const; + static QString XmpValue(const QString &rawValue); + static QString XmpValue(const QString &rawValue, QString & language); + private: std::unique_ptr m_exivImage; QMap m_metadataValue; diff --git a/app/metadatamodel.cpp b/app/metadatamodel.cpp index 6878518..2c7b22d 100644 --- a/app/metadatamodel.cpp +++ b/app/metadatamodel.cpp @@ -66,8 +66,14 @@ void MetadataModel::setFile(const QString &imageFilePath) if (wrapper.load(imageFilePath)) { wrapper.cacheSections(); + appendExivPropertyIfExist(wrapper, QStringLiteral("Description"), + QStringLiteral("Xmp.dc.title"), tr("Title"), true); + appendExivPropertyIfExist(wrapper, QStringLiteral("Description"), + QStringLiteral("Exif.Image.ImageDescription"), tr("Subject"), true); appendExivPropertyIfExist(wrapper, QStringLiteral("Description"), QStringLiteral("Exif.Image.Rating"), tr("Rating")); + appendExivPropertyIfExist(wrapper, QStringLiteral("Description"), + QStringLiteral("Xmp.dc.subject"), tr("Tags")); appendPropertyIfNotEmpty(QStringLiteral("Description"), QStringLiteral("Description.Comments"), tr("Comments"), wrapper.comment()); @@ -75,6 +81,10 @@ void MetadataModel::setFile(const QString &imageFilePath) QStringLiteral("Exif.Image.Artist"), tr("Authors")); appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"), QStringLiteral("Exif.Photo.DateTimeOriginal"), tr("Date taken")); + // FIXME: We may fetch the same type of metadata from different metadata collection. + // Current implementation is not pretty and may need to do a rework... + // appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"), + // QStringLiteral("Xmp.xmp.CreatorTool"), tr("Program name")); appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"), QStringLiteral("Exif.Image.Software"), tr("Program name")); appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"), @@ -206,23 +216,13 @@ bool MetadataModel::appendProperty(const QString §ionKey, const QString &pro return true; } -bool MetadataModel::updateProperty(const QString &propertyKey, const QString &propertyValue) -{ - if (m_properties.contains(propertyKey)) { - m_properties[propertyKey].second = propertyValue; - return true; - } - - return false; -} - -bool MetadataModel::appendExivPropertyIfExist(const Exiv2Wrapper &wrapper, const QString §ionKey, const QString &exiv2propertyKey, const QString &propertyDisplayName) +bool MetadataModel::appendExivPropertyIfExist(const Exiv2Wrapper &wrapper, const QString §ionKey, const QString &exiv2propertyKey, const QString &propertyDisplayName, bool isXmpString) { const QString & value = wrapper.value(exiv2propertyKey); if (!value.isEmpty()) { appendProperty(sectionKey, exiv2propertyKey, propertyDisplayName.isEmpty() ? wrapper.label(exiv2propertyKey) : propertyDisplayName, - value); + isXmpString ? Exiv2Wrapper::XmpValue(value) : value); return true; } return false; diff --git a/app/metadatamodel.h b/app/metadatamodel.h index 2255b34..4535aed 100644 --- a/app/metadatamodel.h +++ b/app/metadatamodel.h @@ -20,9 +20,9 @@ public: const QString & propertyDisplayName, const QString & propertyValue = QString()); bool appendProperty(const QString & sectionKey, const QString & propertyKey, const QString & propertyDisplayName, const QString & propertyValue = QString()); - bool updateProperty(const QString & propertyKey, const QString & propertyValue); bool appendExivPropertyIfExist(const Exiv2Wrapper & wrapper, const QString & sectionKey, - const QString & exiv2propertyKey, const QString & propertyDisplayName = QString()); + const QString & exiv2propertyKey, const QString & propertyDisplayName = QString(), + bool isXmpString = false); private: enum RowType : quintptr {