29 #include <QtCore/QByteArray>
30 #include <QtCore/QCoreApplication>
31 #include <QtCore/QDataStream>
32 #include <QtCore/QHash>
33 #include <QtCore/QString>
34 #include <QtCore/QTimer>
36 #define DISABLE_NEPOMUK_LEGACY
37 #include "config-nepomuk.h"
39 #include <nepomuk/query/filequery.h>
40 #include <nepomuk/query/comparisonterm.h>
41 #include <nepomuk/query/andterm.h>
42 #include <nepomuk/query/resourceterm.h>
43 #include <nepomuk/query/resourcetypeterm.h>
44 #include <nepomuk/query/optionalterm.h>
45 #include <nepomuk/utils/utils.h>
46 #include <nepomuk/types/property.h>
47 #include <nepomuk/core/tag.h>
48 #include <nepomuk/core/variant.h>
49 #include <nepomuk/core/resourcemanager.h>
53 class KFileMetaDataReaderApplication :
public QCoreApplication
58 KFileMetaDataReaderApplication(
int& argc,
char** argv);
61 void readAndSendMetaData();
64 void sendMetaData(
const QHash<KUrl, Nepomuk::Variant>& data);
65 QHash<KUrl, Nepomuk::Variant> readFileMetaData(
const QList<KUrl>& urls)
const;
66 QHash<KUrl, Nepomuk::Variant> readFileAndContextMetaData(
const QList<KUrl>& urls)
const;
71 KFileMetaDataReaderApplication::KFileMetaDataReaderApplication(
int& argc,
char** argv) :
72 QCoreApplication(argc, argv)
74 QTimer::singleShot(0,
this, SLOT(readAndSendMetaData()));
77 void KFileMetaDataReaderApplication::readAndSendMetaData()
82 for (
int i = 0; i < args->
count(); ++i) {
83 urls.append(
KUrl(args->
arg(i)));
86 QHash<KUrl, Nepomuk::Variant> metaData;
87 if (args->
isSet(
"file")) {
88 metaData = readFileMetaData(urls);
90 metaData = readFileAndContextMetaData(urls);
93 sendMetaData(metaData);
98 void KFileMetaDataReaderApplication::sendMetaData(
const QHash<KUrl, Nepomuk::Variant>& data)
100 QByteArray byteArray;
101 QDataStream out(&byteArray, QIODevice::WriteOnly);
103 QHashIterator<KUrl, Nepomuk::Variant> it(data);
104 while (it.hasNext()) {
112 const Nepomuk::Variant& variant = it.value();
113 if (variant.isList()) {
114 out << 0 << variant.toStringList();
115 }
else if (variant.isResource()) {
116 out << 1 << variant.toString();
118 out << 2 << variant.variant();
122 cout << byteArray.toBase64().constData();
125 QHash<KUrl, Nepomuk::Variant> KFileMetaDataReaderApplication::readFileMetaData(
const QList<KUrl>& urls)
const
127 QHash<KUrl, Nepomuk::Variant> data;
132 if (urls.count() == 1) {
133 const QString path = urls.first().toLocalFile();
135 const QHash<QString, KFileMetaInfoItem> metaInfoItems = metaInfo.items();
138 const Nepomuk::Variant value(metaInfoItem.
value());
139 data.insert(uriString,
140 Nepomuk::Utils::formatPropertyValue(Nepomuk::Types::Property(), value));
147 QHash<KUrl, Nepomuk::Variant> KFileMetaDataReaderApplication::readFileAndContextMetaData(
const QList<KUrl>& urls)
const
149 QHash<KUrl, Nepomuk::Variant> metaData;
151 bool isNepomukIndexerActive =
false;
152 if (Nepomuk::ResourceManager::instance()->initialized()) {
154 isNepomukIndexerActive =
config.group(
"Service-nepomukfileindexer").readEntry(
"autostart",
false);
157 return readFileMetaData(urls);
160 unsigned int rating = 0;
162 QList<Nepomuk::Tag> tags;
164 if (urls.count() == 1) {
167 bool useReadFromFileFallback =
true;
169 Nepomuk::Resource file(urls.first());
170 if (file.isValid() && !file.resourceUri().isEmpty()) {
171 QHash<QUrl, Nepomuk::Variant> variants = file.properties();
172 QHash<QUrl, Nepomuk::Variant>::const_iterator it = variants.constBegin();
173 while (it != variants.constEnd()) {
174 Nepomuk::Types::Property prop(it.key());
175 metaData.insert(prop.uri(), Nepomuk::Utils::formatPropertyValue(prop, it.value(),
176 QList<Nepomuk::Resource>() << file,
177 Nepomuk::Utils::WithKioLinks));
180 useReadFromFileFallback = !isNepomukIndexerActive || variants.isEmpty();
182 rating = file.rating();
183 comment = file.description();
187 if (useReadFromFileFallback) {
190 metaData = readFileMetaData(QList<KUrl>() << urls.first());
195 foreach (
const KUrl& url, urls) {
196 Nepomuk::Resource file(url);
197 if (!file.isValid()) {
201 if (!first && rating != file.rating()) {
204 rating = file.rating();
207 if (!first && comment != file.description()) {
210 comment = file.description();
213 if (!first && tags != file.tags()) {
223 metaData.insert(
KUrl(
"kfileitem#rating"), rating);
224 metaData.insert(
KUrl(
"kfileitem#comment"), comment);
226 QList<Nepomuk::Variant> tagVariants;
227 foreach (
const Nepomuk::Tag& tag, tags) {
228 tagVariants.append(Nepomuk::Variant(tag));
230 metaData.insert(
KUrl(
"kfileitem#tags"), tagVariants);
235 int main(
int argc,
char *argv[])
237 KAboutData aboutData(
"kfilemetadatareader",
"kio4",
ki18n(
"KFileMetaDataReader"),
239 ki18n(
"KFileMetaDataReader can be used to read metadata from a file"),
241 ki18n(
"(C) 2011, Peter Penz"));
242 aboutData.
addAuthor(
ki18n(
"Peter Penz"),
ki18n(
"Current maintainer"),
"peter.penz19@gmail.com");
248 options.
add(
"file",
ki18n(
"Only the meta data that is part of the file is read"));
249 options.
add(
"+[arg]",
ki18n(
"List of URLs where the meta-data should be read from"));
253 KFileMetaDataReaderApplication app(argc, argv);
257 #include "kfilemetadatareaderprocess.moc"