From 22eeb0757d21aaf1b28eb4b01f9d1a0ce41d4279 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Sun, 23 Aug 2015 00:15:23 +0200 Subject: [PATCH] WIP: implementations of Konachan / yande.re posts --- src/libdanbooru/konachan.cpp | 136 ++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/src/libdanbooru/konachan.cpp b/src/libdanbooru/konachan.cpp index 812ef55..f916ab2 100644 --- a/src/libdanbooru/konachan.cpp +++ b/src/libdanbooru/konachan.cpp @@ -29,6 +29,8 @@ #include #include +using KIO::StoredTransferJob; + namespace Danbooru { /////// @@ -67,7 +69,7 @@ void KonachanDanbooruService::getPostList() { parameters.insert("limit", QString::number(m_maxPosts)); parameters.insert("page", QString::number(m_currentPage)); - QUrl danbooruUrl = requestUrl(m_url, POST_URL, m_username, + QUrl danbooruUrl = requestUrl(m_url, postUri(), m_username, m_password, parameters, m_tags); // qCDebug(LIBDANBOORU) << "Final constructed post URL" << danbooruUrl; @@ -82,6 +84,138 @@ void KonachanDanbooruService::getPostList() { } +void KonachanDanbooruService::processPostList(KJob *job) +{ + +// qCDebug(LIBDANBOORU) << "Got post data OK"; + + if (job->error()) { + Q_EMIT(downloadError(job->errorString())); + } + + StoredTransferJob *jobResult = qobject_cast(job); + + if (jobResult == 0) { + Q_EMIT(downloadError(QString("Internal error"))); + return; + + } + + QByteArray data = jobResult->data(); + + bool ok; + bool needsXML = job->property("needsXML").toBool(); + + QList postList; + + if (needsXML) { + // Special cases for pools + postList = parseDanbooruResult(data, QString("post"), &ok); + } else { + postList = parseDanbooruResult(data, &ok).toList(); + } + + if (!ok) { + Q_EMIT(downloadError(QString("Unable to decode data"))); + return; + } + + // How many posts do we have to fetch? + + if (postList.isEmpty()) { +// qCDebug(LIBDANBOORU) << "No posts found"; + Q_EMIT(postDownloadFinished()); + return; + } + + m_postsToFetch = postList.length(); + + for (auto element : postList) { + + QVariantMap map = element.toMap(); + DanbooruPost *post = new DanbooruPost(map); + + // Remove unwanted posts + + if (isPostBlacklisted(post, m_blacklist, m_maxRating)) { + m_postsToFetch--; + delete post; + continue; + } + + QPixmap pix; + +// qCDebug(LIBDANBOORU) << "About to donwload images"; + + if (m_cache && m_cache->findPixmap(post->thumbnailUrl().url(), &pix)) { + + post->setPixmap(pix); + Q_EMIT(postDownloaded(post)); + m_postsToFetch--; + + if (m_postsToFetch == 0) { + qCDebug(LIBDANBOORU) << "Post download finished"; + Q_EMIT(postDownloadFinished()); + } + + } else { + + StoredTransferJob *pixmapJob = KIO::storedGet(post->thumbnailUrl(), + KIO::NoReload, KIO::HideProgressInfo); + + // We don't want to overload the servers, so set some rational + // priority + + KIO::Scheduler::setJobPriority(static_cast(job), 1); + + QVariant variant; + variant.setValue(post); + +// pixmapJob->setProperty("danbooruPost", variant); + + connect(pixmapJob, &StoredTransferJob::result, [post, this, pix](KJob * job) mutable { + + if (job->error()) + { + Q_EMIT(downloadError(job->errorString())); + return; + } + + StoredTransferJob *jobResult = qobject_cast(job); + + if (!pix.loadFromData(jobResult->data())) + { + Q_EMIT(downloadError(QString("Pixmap data could not be loaded"))); + return; + } + + post->setPixmap(pix); + + if (m_cache) + { + //qCDebug(LIBDANBOORU) << "Inserting item in cache"; + m_cache->insertPixmap(post->thumbnailUrl().url(), pix); + } + + m_postsToFetch--; // One less post to do + + //qCDebug(LIBDANBOORU) << "Current posts remaining" << m_currentPosts; + Q_EMIT(postDownloaded(post)); + + if (m_postsToFetch == 0) + { +// qCDebug(LIBDANBOORU) << "Post download finished"; + Q_EMIT(postDownloadFinished()); + } + + }); + + } + + } + +} + } //namespace Danbooru