Use lambdas for most of the jobs

This commit is contained in:
Luca Beltrame 2014-10-05 09:51:26 +02:00
parent 3f760a7690
commit 4b85d63d68

View file

@ -97,6 +97,7 @@ void DanbooruService::getPostList(int page, QStringList tags, int limit)
connect(job, &KIO::StoredTransferJob::result, this, &DanbooruService::processPostList); connect(job, &KIO::StoredTransferJob::result, this, &DanbooruService::processPostList);
} }
void DanbooruService::getTagList(int limit, QString name) void DanbooruService::getTagList(int limit, QString name)
@ -116,7 +117,35 @@ void DanbooruService::getTagList(int limit, QString name)
KIO::StoredTransferJob* job = KIO::storedGet(danbooruUrl, KIO::NoReload, KIO::StoredTransferJob* job = KIO::storedGet(danbooruUrl, KIO::NoReload,
KIO::HideProgressInfo); KIO::HideProgressInfo);
connect(job, &KIO::StoredTransferJob::result, this, &DanbooruService::processTagList); connect(job, &KIO::StoredTransferJob::result, [this](KJob* job) {
if (job->error()) {
Q_EMIT(downloadError(job->errorString()));
return;
}
StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
QByteArray data = jobResult->data();
bool ok;
// Most Danbooru implementations return tags in wrong order when
// using JSON, so we have to fall back to XML
QList<QVariant> tagList = parseDanbooruResult(data, "tag", &ok);
if (!ok) {
Q_EMIT(downloadError(QString("Unable to decode data")));
return;
}
for (auto element : tagList) {
QVariantMap map = element.toMap();
DanbooruTag* tag = new DanbooruTag(map);
Q_EMIT(tagDownloaded(tag));
}
}
);
} }
void DanbooruService::getPool(int poolId, int page) void DanbooruService::getPool(int poolId, int page)
@ -170,7 +199,38 @@ void DanbooruService::getPoolList(int page)
// This job can use JSON data // This job can use JSON data
job->setProperty("needsXML", false); job->setProperty("needsXML", false);
connect(job, &KIO::StoredTransferJob::result, this, &DanbooruService::processPoolList); // connect(job, &KIO::StoredTransferJob::result, this, &DanbooruService::processPoolList);
connect(job, &KIO::StoredTransferJob::result, [this] (KJob* job) {
if (job->error()) {
Q_EMIT(downloadError(job->errorString()));
return;
}
StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
QByteArray data = jobResult->data();
bool ok;
QList<QVariant> poolList = parseDanbooruResult(data, &ok).toList();
if (!ok) {
Q_EMIT(downloadError(QString("Unable to decode data")));
return;
}
for (auto element : poolList) {
QVariantMap map = element.toMap();
DanbooruPool* pool = new DanbooruPool(map);
Q_EMIT(poolDownloaded(pool));
}
//qDebug() << "Pool download finished!";
Q_EMIT(poolDownloadFinished());
}
);
} }
@ -210,7 +270,51 @@ void DanbooruService::getRelatedTags(const QStringList& tags,
KIO::HideProgressInfo KIO::HideProgressInfo
); );
connect(job, &StoredTransferJob::result, this, &DanbooruService::processRelatedTagList); connect(job, &StoredTransferJob::result, [this](KJob* job) {
if (job->error()) {
Q_EMIT(downloadError(job->errorString()));
return;
}
StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
QByteArray data = jobResult->data();
bool ok;
QVariantMap tagList = parseDanbooruResult(data, &ok).toMap();
if (!ok) {
Q_EMIT(downloadError(QString("Unable to decode data")));
return;
}
QVariantMap::const_iterator iter;
// The service returns a list of key-related tag list pair,
// we iterate through them and remove the empty (not found) ones, then
// we call getTagList. Unfortunately Danbooru doesn't have a method to
// fetch all tags in batch, so this is done one by one.
for (iter = tagList.constBegin(); iter != tagList.constEnd(); ++iter) {
QList<QVariant> tags = iter.value().toList();
if (tags.isEmpty()) {
continue;
}
for (auto tag : tags) {
// We get the first element in the list, the second is
// the ID which is useless (no API methods in Danbooru)
QString tagName = tag.toList()[0].toString();
getTagList(1, tagName);
}
}
}
);
} }
@ -325,7 +429,7 @@ void DanbooruService::processPostList(KJob* job)
QVariantMap map = element.toMap(); QVariantMap map = element.toMap();
DanbooruPost* post = new DanbooruPost(map); DanbooruPost* post = new DanbooruPost(map);
// First check, for rating // Remove unwanted posts
if (isPostBlacklisted(post, m_blacklist, m_maxRating)) { if (isPostBlacklisted(post, m_blacklist, m_maxRating)) {
m_postsToFetch--; m_postsToFetch--;
@ -337,6 +441,7 @@ void DanbooruService::processPostList(KJob* job)
if (m_cache->findPixmap(post->thumbnailUrl().url(), &pix)) { if (m_cache->findPixmap(post->thumbnailUrl().url(), &pix)) {
qDebug() << "in cache";
post->setPixmap(pix); post->setPixmap(pix);
Q_EMIT(postDownloaded(post)); Q_EMIT(postDownloaded(post));
m_postsToFetch--; m_postsToFetch--;
@ -362,14 +467,13 @@ void DanbooruService::processPostList(KJob* job)
pixmapJob->setProperty("danbooruPost", variant); pixmapJob->setProperty("danbooruPost", variant);
connect(pixmapJob, &StoredTransferJob::result, [post, this] (KJob* job) { connect(pixmapJob, &StoredTransferJob::result, [post, this, pix] (KJob* job) mutable {
if (job->error()) { if (job->error()) {
Q_EMIT(downloadError(job->errorString())); Q_EMIT(downloadError(job->errorString()));
return; return;
} }
QPixmap pix;
StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job); StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
if (!pix.loadFromData(jobResult->data())) { if (!pix.loadFromData(jobResult->data())) {
@ -407,87 +511,12 @@ void DanbooruService::processPostList(KJob* job)
void DanbooruService::processTagList(KJob* job) void DanbooruService::processTagList(KJob* job)
{ {
if (job->error()) {
Q_EMIT(downloadError(job->errorString()));
return;
}
StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
if (jobResult == 0) {
Q_EMIT(downloadError(QString("Internal error")));
return;
}
QByteArray data = jobResult->data();
bool ok;
// Most Danbooru implementations return tags in wrong order when
// using JSON, so we have to fall back to XML
QList<QVariant> tagList = parseDanbooruResult(data, "tag", &ok);
if (!ok) {
Q_EMIT(downloadError(QString("Unable to decode data")));
return;
}
for (auto element : tagList) {
QVariantMap map = element.toMap();
DanbooruTag* tag = new DanbooruTag(map);
Q_EMIT(tagDownloaded(tag));
}
} }
void DanbooruService::processRelatedTagList(KJob* job) void DanbooruService::processRelatedTagList(KJob* job)
{ {
if (job->error()) {
Q_EMIT(downloadError(job->errorString()));
return;
}
StoredTransferJob* jobResult = qobject_cast<StoredTransferJob*>(job);
if (jobResult == 0) {
Q_EMIT(downloadError(QString("Internal error")));
return;
}
QByteArray data = jobResult->data();
bool ok;
QVariantMap tagList = parseDanbooruResult(data, &ok).toMap();
if (!ok) {
Q_EMIT(downloadError(QString("Unable to decode data")));
return;
}
QVariantMap::const_iterator iter;
// The service returns a list of key-related tag list pair,
// we iterate through them and remove the empty (not found) ones, then
// we call getTagList. Unfortunately Danbooru doesn't have a method to
// fetch all tags in batch, so this is done one by one.
for (iter = tagList.constBegin(); iter != tagList.constEnd(); ++iter) {
QList<QVariant> tags = iter.value().toList();
if (tags.isEmpty()) {
continue;
}
for (auto tag : tags) {
// We get the first element in the list, the second is
// the ID which is useless (no API methods in Danbooru)
QString tagName = tag.toList()[0].toString();
getTagList(1, tagName);
}
}
} }
void DanbooruService::processPoolList(KJob* job) void DanbooruService::processPoolList(KJob* job)