From aeba76cd0661b05d5e19db64e056224d9fcaaee7 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Sat, 23 Mar 2013 16:31:55 +0100 Subject: [PATCH] - Implement related tags in the Danbooru interface; - Fix return types due to utils change --- src/libdanbooru/danbooruservice.cpp | 113 ++++++++++++++++++++++++---- src/libdanbooru/danbooruservice.h | 3 +- 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/src/libdanbooru/danbooruservice.cpp b/src/libdanbooru/danbooruservice.cpp index d5bec99..3b444af 100644 --- a/src/libdanbooru/danbooruservice.cpp +++ b/src/libdanbooru/danbooruservice.cpp @@ -103,6 +103,7 @@ namespace Danbooru { if (!name.isEmpty()) { parameters.insert("name", name); } + parameters.insert("order", "date"); KUrl danbooruUrl = requestUrl(m_url, TAG_URL, m_username, m_password, parameters); @@ -171,9 +172,47 @@ namespace Danbooru { } - void DanbooruService::getRelatedTags(QStringList tags, Danbooru::TagType tagType) + void DanbooruService::getRelatedTags(const QStringList& tags, + Danbooru::TagType tagType) { + qDebug() << "We start with these" << tags; + + QString type; + switch(tagType) { + case Danbooru::General: + type = "general"; + break; + case Danbooru::Artist: + type = "artist"; + break; + case Danbooru::Copyright: + type = "copyright"; + break; + case Danbooru::Character: + type = "character"; + break; + case Danbooru::Unknown: + type = "unknown"; + break; + } + + QMap parameters; + parameters.insert("type", type); + + KUrl danbooruUrl = requestUrl(m_url, RELATED_TAG_URL, m_username, + m_password, parameters, tags ); + + qDebug() << "Final constructed URL" << danbooruUrl.url(); + + StoredTransferJob* job = KIO::storedGet( + danbooruUrl, KIO::NoReload, + KIO::HideProgressInfo + ); + + connect(job, SIGNAL(result(KJob*)), this, + SLOT(processRelatedTagList(KJob*))); + } // Getters / setters @@ -271,9 +310,9 @@ namespace Danbooru { if (needsXML) { // Special cases for pools - postList = parseDanbooruResult(data, QString("pool"), &ok); + postList = parseDanbooruResult(data, QString("post"), &ok); } else { - postList = parseDanbooruResult(data, &ok); + postList = parseDanbooruResult(data, &ok).toList(); } if (!ok) { @@ -291,13 +330,13 @@ namespace Danbooru { DanbooruPost* post = new DanbooruPost(map); -// qDebug() << "Got rating" << post->rating(); + // qDebug() << "Got rating" << post->rating(); // First check, for rating if (post->rating() > m_maxRating) { - qDebug() << "Skipping " << post->fileUrl(); - qDebug() << "Rating was " << post->rating(); + // qDebug() << "Skipping " << post->fileUrl(); + // qDebug() << "Rating was " << post->rating(); m_currentPosts--; delete post; continue; @@ -309,13 +348,13 @@ namespace Danbooru { QSet temp = m_blacklist; - QSet overlap = temp.intersect(post->tags()); + temp = temp.intersect(post->tags()); - if (!overlap.isEmpty()) { + if (!temp.isEmpty()) { // Blacklisted tags are present, do not use this post - qDebug() << "Skipping " << post->fileUrl(); - qDebug() << "Blacklisted tags " << overlap; + // qDebug() << "Skipping " << post->fileUrl(); + // qDebug() << "Blacklisted tags " << overlap; m_currentPosts--; delete post; continue; @@ -347,8 +386,8 @@ namespace Danbooru { qDebug() << "Got tag data OK"; if (job->error()) { - qDebug() << "Something went wrong"; Q_EMIT(downloadError(job->errorString())); + return; } StoredTransferJob* jobResult = qobject_cast(job); @@ -367,13 +406,10 @@ namespace Danbooru { QList tagList = parseDanbooruResult(data, "tag", &ok); if (!ok) { - qDebug() << "Something went wrong"; Q_EMIT(downloadError(QString("Unable to decode data"))); return; } - qDebug() << "Populating tag list, length" << tagList.length(); - Q_FOREACH(const QVariant& element, tagList) { QVariantMap map = element.toMap(); DanbooruTag* tag = new DanbooruTag(map); @@ -384,7 +420,52 @@ namespace Danbooru { void DanbooruService::processRelatedTagList(KJob* job) { - Q_UNUSED(job) + qDebug() << "Got related tag data OK"; + + if (job->error()) { + Q_EMIT(downloadError(job->errorString())); + return; + } + + StoredTransferJob* jobResult = qobject_cast(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 tags = iter.value().toList(); + + if (tags.isEmpty()) { + continue; + } + + Q_FOREACH(const QVariant& tag, tags) { + QString interest = tag.toList()[0].toString(); + getTagList(1, interest); + } + + } } void DanbooruService::processPoolList(KJob* job) @@ -408,7 +489,7 @@ namespace Danbooru { bool ok; - QList poolList = parseDanbooruResult(data, &ok); + QList poolList = parseDanbooruResult(data, &ok).toList(); if (!ok) { Q_EMIT(downloadError(QString("Unable to decode data"))); diff --git a/src/libdanbooru/danbooruservice.h b/src/libdanbooru/danbooruservice.h index 4de0a0e..ac82201 100644 --- a/src/libdanbooru/danbooruservice.h +++ b/src/libdanbooru/danbooruservice.h @@ -165,8 +165,7 @@ namespace Danbooru { * @param tags The tags to query for related terms * @param tagType The type of tag to query for **/ - void getRelatedTags(QStringList tags=QStringList(), - Danbooru::TagType tagType=General); + void getRelatedTags(const QStringList& tags, Danbooru::TagType tagType = General); /** * @return The currently allowed ratings when downloading posts.