Generify rate limit.

This commit is contained in:
Lukas Brübach 2025-01-25 21:50:40 +01:00
parent 1d4bdc202d
commit c59f8a40f0
2 changed files with 16 additions and 25 deletions

View file

@ -116,7 +116,7 @@ QNetworkReply *PictureLoaderWorker::makeRequest(const QUrl &url, PictureLoaderWo
if (reply->error() == QNetworkReply::NoError) { if (reply->error() == QNetworkReply::NoError) {
worker->picDownloadFinished(reply); worker->picDownloadFinished(reply);
} else if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 429) { } else if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 429) {
handleRateLimit(reply, url, worker); handleRateLimit(url, worker);
} else { } else {
worker->picDownloadFinished(reply); worker->picDownloadFinished(reply);
} }
@ -126,32 +126,23 @@ QNetworkReply *PictureLoaderWorker::makeRequest(const QUrl &url, PictureLoaderWo
return reply; return reply;
} }
void PictureLoaderWorker::handleRateLimit(QNetworkReply *reply, const QUrl &url, PictureLoaderWorkerWork *worker) void PictureLoaderWorker::handleRateLimit(const QUrl &url, PictureLoaderWorkerWork *worker)
{ {
QByteArray responseData = reply->readAll(); // Prevent multiple rate-limit handling
QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); if (!rateLimited) {
int retryAfter = 70;
rateLimited = true;
qWarning() << "Rate limit exceeded! Queuing requests for" << retryAfter << "seconds.";
if (jsonDoc.isObject()) { // Start a timer to reset the rate-limited state
QJsonObject jsonObj = jsonDoc.object(); rateLimitTimer.singleShot(retryAfter * 1000, this, [this]() {
if (jsonObj.value("object").toString() == "error" && jsonObj.value("code").toString() == "rate_limited") { qWarning() << "Rate limit expired. Resuming queued requests.";
int retryAfter = 70; // Default retry delay processQueuedRequests();
});
// Prevent multiple rate-limit handling
if (!rateLimited) {
rateLimited = true;
qWarning() << "Scryfall rate limit hit! Queuing requests for" << retryAfter << "seconds.";
// Start a timer to reset the rate-limited state
rateLimitTimer.singleShot(retryAfter * 1000, this, [this]() {
qWarning() << "Rate limit expired. Resuming queued requests.";
processQueuedRequests();
});
}
// Always queue the request even if already rate-limited
requestQueue.append(qMakePair(url, worker));
}
} }
// Always queue the request even if already rate-limited
requestQueue.append(qMakePair(url, worker));
} }
void PictureLoaderWorker::processQueuedRequests() void PictureLoaderWorker::processQueuedRequests()

View file

@ -32,7 +32,7 @@ public:
public slots: public slots:
QNetworkReply *makeRequest(const QUrl &url, PictureLoaderWorkerWork *workThread); QNetworkReply *makeRequest(const QUrl &url, PictureLoaderWorkerWork *workThread);
void handleRateLimit(QNetworkReply *reply, const QUrl &url, PictureLoaderWorkerWork *worker); void handleRateLimit(const QUrl &url, PictureLoaderWorkerWork *worker);
void processQueuedRequests(); void processQueuedRequests();
void imageLoadedSuccessfully(CardInfoPtr card, const QImage &image); void imageLoadedSuccessfully(CardInfoPtr card, const QImage &image);