File indexing completed on 2024-04-28 03:54:14

0001 /*
0002     SPDX-FileCopyrightText: 2014 Vishesh Handa <me@vhanda.in>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include <QCoreApplication>
0008 #include <QCommandLineParser>
0009 #include <QDebug>
0010 #include <QFileInfo>
0011 #include <QMimeDatabase>
0012 #include <QTextStream>
0013 
0014 #include "extractor.h"
0015 #include "extractorcollection.h"
0016 #include "propertyinfo.h"
0017 #include "simpleextractionresult.h"
0018 #include "typeinfo.h"
0019 
0020 #include <iostream>
0021 
0022 int main(int argc, char** argv)
0023 {
0024     QCoreApplication app(argc, argv);
0025 
0026     QCommandLineParser parser;
0027     parser.addOption({{"f", "fulltext"}, "Extract full text"});
0028     parser.addPositionalArgument(QStringLiteral("filename"), QStringLiteral("File to process"));
0029     parser.process(app);
0030 
0031     if (parser.positionalArguments().size() != 1) {
0032         qDebug() << "Exactly one argument is accepted";
0033         parser.showHelp(1);
0034     }
0035     bool extractFulltext = parser.isSet("fulltext");
0036 
0037     using KFileMetaData::ExtractionResult;
0038     const ExtractionResult::Flags extractionLevel = (extractFulltext
0039         ? ExtractionResult::ExtractMetaData | ExtractionResult::ExtractPlainText
0040         : ExtractionResult::ExtractMetaData);
0041 
0042     auto fi = QFileInfo(parser.positionalArguments().at(0));
0043     QString url = fi.absoluteFilePath();
0044 
0045     if (!fi.exists()) {
0046         qDebug() << "File" << url << "not found";
0047         return 1;
0048     }
0049 
0050     if (!fi.isFile() || !fi.isReadable()) {
0051         qDebug() << "File" << url << "is not a readable file";
0052         return 1;
0053     }
0054 
0055     QMimeDatabase mimeDb;
0056     QString mimetype = mimeDb.mimeTypeForFile(url).name();
0057 
0058     KFileMetaData::ExtractorCollection extractors;
0059     QList<KFileMetaData::Extractor*> exList = extractors.fetchExtractors(mimetype);
0060 
0061     QTextStream out(stdout);
0062     out << url << " " << mimetype << "\n";
0063 
0064     for (KFileMetaData::Extractor* ex : std::as_const(exList)) {
0065         const QString extractorName = ex->extractorProperties().value(QStringLiteral("Name")).toString();
0066         out << "\t";
0067         if (!extractorName.isEmpty()) {
0068             out << extractorName;
0069         } else {
0070             out << "Extractor";
0071         }
0072         out << " For " << ex->mimetypes().join(QLatin1String("\n\t\t\t")) << "\n";
0073 
0074         KFileMetaData::SimpleExtractionResult result(url, mimetype, extractionLevel);
0075         ex->extract(&result);
0076 
0077         out << "\t\tTypes:";
0078         for (const auto t : result.types()) {
0079             out << " " << KFileMetaData::TypeInfo(t).name();
0080         }
0081         out << "\n";
0082 
0083         const KFileMetaData::PropertyMultiMap multiMap= result.properties();
0084         KFileMetaData::PropertyMultiMap::const_iterator it = multiMap.constBegin();
0085         for (; it != multiMap.constEnd(); it++) {
0086             out << "\t\t" << KFileMetaData::PropertyInfo(it.key()).displayName() << ": "
0087                 << it.value().toString() << " (" << it.value().typeName() << ")\n";
0088         }
0089         if (extractFulltext) {
0090             out << "\t\tText: " << result.text() << "\n";
0091         }
0092         out << "\t-------------\n";
0093     }
0094 
0095     return 0;
0096 }