- Implement related tags in the Danbooru interface;

- Fix return types due to utils change
This commit is contained in:
Luca Beltrame 2013-03-23 16:31:55 +01:00
parent a2c1f6d46f
commit aeba76cd06
2 changed files with 98 additions and 18 deletions

View file

@ -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<QString, QString> 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<QString> temp = m_blacklist;
QSet<QString> 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<StoredTransferJob*>(job);
@ -367,13 +406,10 @@ namespace Danbooru {
QList<QVariant> 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<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;
}
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<QVariant> poolList = parseDanbooruResult(data, &ok);
QList<QVariant> poolList = parseDanbooruResult(data, &ok).toList();
if (!ok) {
Q_EMIT(downloadError(QString("Unable to decode data")));

View file

@ -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.