- Implement related tags in the Danbooru interface;
- Fix return types due to utils change
This commit is contained in:
parent
a2c1f6d46f
commit
aeba76cd06
2 changed files with 98 additions and 18 deletions
|
@ -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")));
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue