diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -93,6 +93,7 @@ TEST_NAME "exiv2extractortest" LINK_LIBRARIES Qt5::Test KF5::FileMetaData LibExiv2::LibExiv2 ) + target_include_directories(exiv2extractortest PRIVATE ${CMAKE_BINARY_DIR}/src/extractors) endif() # diff --git a/autotests/extractorcollectiontest.cpp b/autotests/extractorcollectiontest.cpp --- a/autotests/extractorcollectiontest.cpp +++ b/autotests/extractorcollectiontest.cpp @@ -25,7 +25,7 @@ #include "extractorcollection.h" -using namespace KFileMetaData; +namespace KFileMetaData { class ExtractorCollectionTest : public QObject { @@ -86,8 +86,63 @@ QVERIFY(!xmlSubtypeExtractors.contains(extractor)); } } + + void testExtractorMetadata() + { + QCoreApplication::setLibraryPaths({QCoreApplication::applicationDirPath()}); + ExtractorCollection collection; + + auto allExtractors = collection.allExtractors(); + + for (auto extractor : allExtractors) { + auto exProperties = extractor->extractorProperties(); + if (exProperties.isEmpty()) { + qWarning() << "Extractor has no property data, please add it! - (Extractor mimetypes:" + << extractor->mimetypes().join(", ") + ")"; + continue; + } + + // Verify properties for every supported mimetype + auto propMimetypesJson = exProperties["MimeTypes"]; + QSet propMimetypes = propMimetypesJson.toMap().keys().toSet(); + QSet supportedMimetypes = extractor->mimetypes().toSet(); + + QVERIFY2(!exProperties["Name"].toString().isEmpty(), "Missing \"Name\" property"); + QVERIFY2(!exProperties["Id"].toString().isEmpty(), "Missing \"Id\" property"); + + if (propMimetypes == supportedMimetypes) { + continue; + } + + auto diff = propMimetypes - supportedMimetypes; + if (!diff.isEmpty()) { + for (auto mimetype : diff.toList()) { + auto mimetypeProp = propMimetypesJson.toMap()[mimetype]; + auto runtimedep = mimetypeProp.toMap()["HasRuntimeDependency"]; + if (runtimedep.isValid() && runtimedep.toInt()) { + diff.remove(mimetype); + } + } + + if (!diff.isEmpty()) { + qWarning() << exProperties["Name"].toString() + << exProperties["Id"].toString() + << "has extraneous properties for these mimetypes:" << diff.toList().join(", "); + } + } + + diff = supportedMimetypes - propMimetypes; + if (!diff.isEmpty()) { + qWarning() << exProperties["Name"].toString() + << exProperties["Id"].toString() + << "has no properties for these mimetypes:" + diff.toList().join(", "); + } + } + } }; -QTEST_GUILESS_MAIN(ExtractorCollectionTest) +} + +QTEST_GUILESS_MAIN(KFileMetaData::ExtractorCollectionTest) #include "extractorcollectiontest.moc" diff --git a/src/extractor.h b/src/extractor.h --- a/src/extractor.h +++ b/src/extractor.h @@ -23,6 +23,7 @@ #include "kfilemetadata_export.h" #include +#include namespace KFileMetaData { @@ -47,6 +48,7 @@ void extract(ExtractionResult* result); QStringList mimetypes() const; + QVariantMap extractorProperties() const; private: Extractor(); @@ -58,6 +60,8 @@ void setAutoDeletePlugin(ExtractorPluginOwnership autoDelete); + void setMetaData(const QVariantMap &metaData); + ExtractorPrivate *d; friend class ExtractorCollection; }; diff --git a/src/extractor.cpp b/src/extractor.cpp --- a/src/extractor.cpp +++ b/src/extractor.cpp @@ -48,6 +48,11 @@ return d->m_plugin->mimetypes(); } +QVariantMap Extractor::extractorProperties() const +{ + return d->m_metaData; +} + void Extractor::setExtractorPlugin(ExtractorPlugin *extractorPlugin) { d->m_plugin = extractorPlugin; @@ -57,3 +62,8 @@ { d->m_autoDeletePlugin = autoDelete; } + +void Extractor::setMetaData(const QVariantMap &metaData) +{ + d->m_metaData = metaData; +} diff --git a/src/extractor_p.h b/src/extractor_p.h --- a/src/extractor_p.h +++ b/src/extractor_p.h @@ -33,6 +33,7 @@ ExtractorPluginOwnership m_autoDeletePlugin = AutoDeletePlugin; + QVariantMap m_metaData; }; } diff --git a/src/extractorcollection.h b/src/extractorcollection.h --- a/src/extractorcollection.h +++ b/src/extractorcollection.h @@ -1,5 +1,4 @@ /* - * * Copyright (C) 2012 Vishesh Handa * * This library is free software; you can redistribute it and/or @@ -58,6 +57,9 @@ private: class Private; Private* d; + + friend class ExtractorCollectionTest; + QList allExtractors() const; }; } diff --git a/src/extractorcollection.cpp b/src/extractorcollection.cpp --- a/src/extractorcollection.cpp +++ b/src/extractorcollection.cpp @@ -1,5 +1,4 @@ /* - * * Copyright (C) 2012 Vishesh Handa * Copyright (C) 2016 Varun Joshi * @@ -63,6 +62,11 @@ } +QList ExtractorCollection::allExtractors() const +{ + return d->m_allExtractors; +} + QList ExtractorCollection::Private::allExtractors() const { QStringList plugins; @@ -121,6 +125,11 @@ Extractor* ex= new Extractor; ex->setExtractorPlugin(plugin); ex->setAutoDeletePlugin(Extractor::DoNotDeletePlugin); + auto metadata = loader.metaData().value(QLatin1String("MetaData")); + if (metadata.type() == QJsonValue::Object) { + qCDebug(KFILEMETADATA_LOG) << "Created Plugin with metadata:" << metadata; + ex->setMetaData(metadata.toObject().toVariantMap()); + } extractors << ex; } else { diff --git a/src/extractors/CMakeLists.txt b/src/extractors/CMakeLists.txt --- a/src/extractors/CMakeLists.txt +++ b/src/extractors/CMakeLists.txt @@ -38,7 +38,9 @@ ) if(NOT ${LibExiv2_VERSION} VERSION_LESS 0.26) target_compile_definitions(kfilemetadata_exiv2extractor PRIVATE "-DHAVE_WEBP_SUPPORT") + set(EXIV2_HAVE_WEBP_SUPPORT "1") endif() + configure_file(exiv2extractor.json.in exiv2extractor.json) set_target_properties(kfilemetadata_exiv2extractor PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/kf5/kfilemetadata") install( diff --git a/src/extractors/appimageextractor.h b/src/extractors/appimageextractor.h --- a/src/extractors/appimageextractor.h +++ b/src/extractors/appimageextractor.h @@ -27,7 +27,8 @@ class AppImageExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "appimageextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/appimageextractor.json b/src/extractors/appimageextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/appimageextractor.json @@ -0,0 +1,9 @@ +{ + "Name" : "AppImageExtractor", + "Id" : "org.kde.appimageextractor", + "MimeTypes" : { + "application/x-iso9660-appimage": { "Version" : "0.0" }, + "application/vnd.appimage" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/epubextractor.h b/src/extractors/epubextractor.h --- a/src/extractors/epubextractor.h +++ b/src/extractors/epubextractor.h @@ -28,7 +28,8 @@ class EPubExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "epubextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/epubextractor.json b/src/extractors/epubextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/epubextractor.json @@ -0,0 +1,8 @@ +{ + "Name" : "EpubExtractor", + "Id" : "org.kde.epubextractor", + "MimeTypes" : { + "application/epub+zip" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/exiv2extractor.h b/src/extractors/exiv2extractor.h --- a/src/extractors/exiv2extractor.h +++ b/src/extractors/exiv2extractor.h @@ -30,7 +30,8 @@ class Exiv2Extractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "exiv2extractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/exiv2extractor.json.in b/src/extractors/exiv2extractor.json.in new file mode 100644 --- /dev/null +++ b/src/extractors/exiv2extractor.json.in @@ -0,0 +1,29 @@ +{ + "Name" : "Exiv2Extractor", + "Id" : "org.kde.exiv2extractor", + "MimeTypes" : { + "image/bmp" : { "version" : "0.0" }, + "image/gif" : { "version" : "0.0" }, + "image/jp2" : { "version" : "0.0" }, + "image/jpeg" : { "version" : "0.0" }, + "image/pgf" : { "version" : "0.0" }, + "image/png" : { "version" : "0.0" }, + "image/tiff" : { "version" : "0.0" }, + "image/webp" : { + "version" : "0.0", + "enabled" : "@EXIV2_HAVE_WEBP_SUPPORT@" + }, + "image/x-exv" : { "version" : "0.0" }, + "image/x-canon-cr2" : { "version" : "0.0" }, + "image/x-canon-crw" : { "version" : "0.0" }, + "image/x-fuji-raf" : { "version" : "0.0" }, + "image/x-minolta-mrw" : { "version" : "0.0" }, + "image/x-nikon-nef" : { "version" : "0.0" }, + "image/x-olympus-orf" : { "version" : "0.0" }, + "image/x-panasonic-rw2" : { "version" : "0.0" }, + "image/x-pentax-pef" : { "version" : "0.0" }, + "image/x-photoshop" : { "version" : "0.0" }, + "image/x-samsung-srw" : { "version" : "0.0" }, + "image/x-tga" : { "version" : "0.0" } + } +} diff --git a/src/extractors/ffmpegextractor.h b/src/extractors/ffmpegextractor.h --- a/src/extractors/ffmpegextractor.h +++ b/src/extractors/ffmpegextractor.h @@ -28,7 +28,8 @@ class FFmpegExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "ffmpegextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/ffmpegextractor.json b/src/extractors/ffmpegextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/ffmpegextractor.json @@ -0,0 +1,16 @@ +{ + "Name" : "FFMpegExtractor", + "Id" : "org.kde.ffmpegextractor", + "MimeTypes" : { + "video/mp4" : { "Version" : "0.0" }, + "video/mpeg" : { "Version" : "0.0" }, + "video/quicktime" : { "Version" : "0.0" }, + "video/webm" : { "Version" : "0.0" }, + "video/x-flv" : { "Version" : "0.0" }, + "video/x-matroska" : { "Version" : "0.0" }, + "video/x-ms-wmv" : { "Version" : "0.0" }, + "video/x-ms-asf" : { "Version" : "0.0" }, + "video/x-msvideo" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/mobiextractor.h b/src/extractors/mobiextractor.h --- a/src/extractors/mobiextractor.h +++ b/src/extractors/mobiextractor.h @@ -29,7 +29,8 @@ class MobiExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "mobiextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/mobiextractor.json b/src/extractors/mobiextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/mobiextractor.json @@ -0,0 +1,8 @@ +{ + "Name" : "MobiPocketExtractor", + "Id" : "org.kde.mobiextractor", + "MimeTypes" : { + "application/x-mobipocket-ebook" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/odfextractor.h b/src/extractors/odfextractor.h --- a/src/extractors/odfextractor.h +++ b/src/extractors/odfextractor.h @@ -29,7 +29,8 @@ class OdfExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "odfextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/odfextractor.json b/src/extractors/odfextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/odfextractor.json @@ -0,0 +1,10 @@ +{ + "Name" : "OdfExtractor", + "Id" : "org.kde.odfextractor", + "MimeTypes" : { + "application/vnd.oasis.opendocument.text" : { "Version" : "0.0" }, + "application/vnd.oasis.opendocument.presentation" : { "Version" : "0.0" }, + "application/vnd.oasis.opendocument.spreadsheet" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/office2007extractor.h b/src/extractors/office2007extractor.h --- a/src/extractors/office2007extractor.h +++ b/src/extractors/office2007extractor.h @@ -33,7 +33,8 @@ class Office2007Extractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "office2007extractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/office2007extractor.json b/src/extractors/office2007extractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/office2007extractor.json @@ -0,0 +1,10 @@ +{ + "Name" : "Office2007Extractor", + "Id" : "org.kde.office2007extractor", + "MimeTypes" : { + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" : { "Version" : "0.0" }, + "application/vnd.openxmlformats-officedocument.presentationml.presentation" : { "Version" : "0.0" }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/officeextractor.h b/src/extractors/officeextractor.h --- a/src/extractors/officeextractor.h +++ b/src/extractors/officeextractor.h @@ -29,7 +29,8 @@ class OfficeExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "officeextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/officeextractor.json b/src/extractors/officeextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/officeextractor.json @@ -0,0 +1,19 @@ +{ + "Name" : "OfficeExtractor", + "Id" : "org.kde.officeextractor", + "MimeTypes" : { + "application/msword" : { + "Version" : "0.0", + "HasRuntimeDependency" : "1" + }, + "application/vnd.ms-excel" : { + "Version" : "0.0", + "HasRuntimeDependency" : "1" + }, + "application/vnd.ms-powerpoint" : { + "Version" : "0.0", + "HasRuntimeDependency" : "1" + } + } +} + diff --git a/src/extractors/plaintextextractor.h b/src/extractors/plaintextextractor.h --- a/src/extractors/plaintextextractor.h +++ b/src/extractors/plaintextextractor.h @@ -29,7 +29,8 @@ class PlainTextExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "plaintextextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/plaintextextractor.json b/src/extractors/plaintextextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/plaintextextractor.json @@ -0,0 +1,8 @@ +{ + "Name" : "PlaintextExtractor", + "Id" : "org.kde.plaintextextractor", + "MimeTypes" : { + "text/plain" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/poextractor.h b/src/extractors/poextractor.h --- a/src/extractors/poextractor.h +++ b/src/extractors/poextractor.h @@ -32,7 +32,8 @@ class POExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "poextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/poextractor.json b/src/extractors/poextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/poextractor.json @@ -0,0 +1,8 @@ +{ + "Name" : "PoExtractor", + "Id" : "org.kde.poextractor", + "MimeTypes" : { + "text/x-gettext-translation" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/popplerextractor.h b/src/extractors/popplerextractor.h --- a/src/extractors/popplerextractor.h +++ b/src/extractors/popplerextractor.h @@ -30,7 +30,8 @@ class PopplerExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "popplerextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/popplerextractor.json b/src/extractors/popplerextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/popplerextractor.json @@ -0,0 +1,8 @@ +{ + "Name" : "PopplerExtractor", + "Id" : "org.kde.popplerextractor", + "MimeTypes" : { + "application/pdf" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/postscriptdscextractor.h b/src/extractors/postscriptdscextractor.h --- a/src/extractors/postscriptdscextractor.h +++ b/src/extractors/postscriptdscextractor.h @@ -28,7 +28,8 @@ class DscExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "postscriptdscextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/postscriptdscextractor.json b/src/extractors/postscriptdscextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/postscriptdscextractor.json @@ -0,0 +1,9 @@ +{ + "Name" : "PostscriptDSCExtractor", + "Id" : "org.kde.postscriptdscextractor", + "MimeTypes" : { + "application/postscript" : { "Version" : "0.0" }, + "image/x-eps" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/taglibextractor.h b/src/extractors/taglibextractor.h --- a/src/extractors/taglibextractor.h +++ b/src/extractors/taglibextractor.h @@ -50,7 +50,8 @@ class TagLibExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "taglibextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/taglibextractor.json b/src/extractors/taglibextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/taglibextractor.json @@ -0,0 +1,25 @@ +{ + "Name" : "TaglibExtractor", + "Id" : "org.kde.taglibextractor", + "MimeTypes" : { + "audio/flac" : { "Version" : "0.0" }, + "audio/mp4" : { "Version" : "0.0" }, + "audio/mpeg" : { "Version" : "0.0" }, + "audio/mpeg3" : { "Version" : "0.0" }, + "audio/ogg" : { "Version" : "0.0" }, + "audio/opus" : { "Version" : "0.0" }, + "audio/speex" : { "Version" : "0.0" }, + "audio/wav" : { "Version" : "0.0" }, + "audio/x-aiff" : { "Version" : "0.0" }, + "audio/x-ape" : { "Version" : "0.0" }, + "audio/x-mpeg" : { "Version" : "0.0" }, + "audio/x-ms-wma" : { "Version" : "0.0" }, + "audio/x-musepack" : { "Version" : "0.0" }, + "audio/x-opus+ogg" : { "Version" : "0.0" }, + "audio/x-speex" : { "Version" : "0.0" }, + "audio/x-vorbis+ogg" : { "Version" : "0.0" }, + "audio/x-wav" : { "Version" : "0.0" }, + "audio/x-wavpack" : { "Version" : "0.0" } + } +} + diff --git a/src/extractors/xmlextractor.h b/src/extractors/xmlextractor.h --- a/src/extractors/xmlextractor.h +++ b/src/extractors/xmlextractor.h @@ -28,7 +28,8 @@ class XmlExtractor : public ExtractorPlugin { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin" + FILE "xmlextractor.json") Q_INTERFACES(KFileMetaData::ExtractorPlugin) public: diff --git a/src/extractors/xmlextractor.json b/src/extractors/xmlextractor.json new file mode 100644 --- /dev/null +++ b/src/extractors/xmlextractor.json @@ -0,0 +1,10 @@ +{ + "Name" : "XmlExtractor", + "Id" : "org.kde.xmlextractor", + "MimeTypes" : { + "image/svg" : { "Version" : "0.0" }, + "image/svg+xml" : { "Version" : "0.0" }, + "application/xml" : { "Version" : "0.0" } + } +} +