From 79eb19a19270ce7ad9e0348c4405dfaf41c146c8 Mon Sep 17 00:00:00 2001 From: luisangelsm Date: Wed, 10 Dec 2025 10:42:45 +0100 Subject: [PATCH] Add COMIC_VINE_USER_AGENT to YACReaderLibrary.ini to be able to customize the user agent --- CHANGELOG.md | 5 +++ ...comic_vine_all_volume_comics_retriever.cpp | 6 ++-- .../comic_vine_all_volume_comics_retriever.h | 3 +- .../comic_vine/comic_vine_client.cpp | 35 +++++++++++++------ .../comic_vine/comic_vine_client.h | 1 + common/http_worker.cpp | 6 ++-- common/http_worker.h | 4 +-- common/yacreader_global.h | 2 +- common/yacreader_global_gui.h | 1 + custom_widgets/whats_new_dialog.cpp | 1 + 10 files changed, 44 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e011aafa..c6b63132 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ Version counting is based on semantic versioning (Major.Feature.Patch) +## 9.16.2 (WIP) + +### YACReaderLibrary +* New customizable User Agent string to use it with Comic Vine. It can be set in YACReaderLibrary.ini in the [ComicVine] section using the `COMIC_VINE_USER_AGENT` key. + ## 9.16.1 ### YACReaderLibrary diff --git a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp index e03c7bb1..58afc5a4 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.cpp @@ -7,8 +7,8 @@ #include #include -ComicVineAllVolumeComicsRetriever::ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, QObject *parent) - : QObject(parent), volumeURLString(volumeURLString) +ComicVineAllVolumeComicsRetriever::ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, const QString &userAgent, QObject *parent) + : QObject(parent), volumeURLString(volumeURLString), userAgent(userAgent) { } @@ -19,7 +19,7 @@ void ComicVineAllVolumeComicsRetriever::getAllVolumeComics() void ComicVineAllVolumeComicsRetriever::getAllVolumeComics(int range) { - HttpWorker *search = new HttpWorker(volumeURLString.arg(range)); + HttpWorker *search = new HttpWorker(volumeURLString.arg(range), userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineAllVolumeComicsRetriever::appendVolumeComicsInfo); connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::timeOut); connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::finished); diff --git a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.h b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.h index 24e5f6fd..5f4467c7 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.h +++ b/YACReaderLibrary/comic_vine/comic_vine_all_volume_comics_retriever.h @@ -7,7 +7,7 @@ class ComicVineAllVolumeComicsRetriever : public QObject { Q_OBJECT public: - explicit ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, QObject *parent = nullptr); + explicit ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, const QString &userAgent, QObject *parent = nullptr); void getAllVolumeComics(); protected: @@ -21,6 +21,7 @@ protected slots: protected: QString volumeURLString; + QString userAgent; QList jsonResponses; QString consolidateJSON(); diff --git a/YACReaderLibrary/comic_vine/comic_vine_client.cpp b/YACReaderLibrary/comic_vine/comic_vine_client.cpp index 75e2dde9..9ed084d1 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_client.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_client.cpp @@ -60,6 +60,7 @@ ComicVineClient::ComicVineClient(QObject *parent) settings = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); // TODO unificar la creación del fichero de config con el servidor settings->beginGroup("ComicVine"); baseURL = settings->value(COMIC_VINE_BASE_URL, "https://comicvine.gamespot.com/api").toString(); + userAgent = settings->value(COMIC_VINE_USER_AGENT, QStringLiteral("YACReader - Yet Another Comic Reader/") + VERSION).toString(); } ComicVineClient::~ComicVineClient() @@ -70,7 +71,9 @@ ComicVineClient::~ComicVineClient() // CV_SEARCH void ComicVineClient::search(const QString &query, int page) { - HttpWorker *search = new HttpWorker(QString(CV_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg(page)); + HttpWorker *search = new HttpWorker( + QString(CV_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg(page), + userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessVolumesSearchData); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); connect(search, &QThread::finished, search, &QObject::deleteLater); @@ -80,7 +83,9 @@ void ComicVineClient::search(const QString &query, int page) // CV_EXACT_VOLUME_SEARCH void ComicVineClient::searchExactVolume(const QString &query, int page) { - HttpWorker *search = new HttpWorker(QString(CV_EXACT_VOLUME_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg((page - 1) * 100)); + HttpWorker *search = new HttpWorker( + QString(CV_EXACT_VOLUME_SEARCH).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(query).arg((page - 1) * 100), + userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessVolumesSearchData); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); connect(search, &QThread::finished, search, &QObject::deleteLater); @@ -119,7 +124,9 @@ void ComicVineClient::proccessComicDetailData(const QByteArray &data) // CV_SERIES_DETAIL void ComicVineClient::getSeriesDetail(const QString &id) { - HttpWorker *search = new HttpWorker(QString(CV_SERIES_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id)); + HttpWorker *search = new HttpWorker( + QString(CV_SERIES_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id), + userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessSeriesDetailData); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); connect(search, &QThread::finished, search, &QObject::deleteLater); @@ -128,7 +135,7 @@ void ComicVineClient::getSeriesDetail(const QString &id) void ComicVineClient::getSeriesCover(const QString &url) { - auto search = new HttpWorker(url); + auto search = new HttpWorker(url, userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::seriesCover); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO connect(search, &QThread::finished, search, &QObject::deleteLater); @@ -138,7 +145,9 @@ void ComicVineClient::getSeriesCover(const QString &url) // CV_COMIC_IDS void ComicVineClient::getVolumeComicsInfo(const QString &idVolume, int page) { - HttpWorker *search = new HttpWorker(QString(CV_COMICS_INFO).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(idVolume).arg((page - 1) * 100)); + HttpWorker *search = new HttpWorker( + QString(CV_COMICS_INFO).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(idVolume).arg((page - 1) * 100), + userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::processVolumeComicsInfo); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO connect(search, &QThread::finished, search, &QObject::deleteLater); @@ -148,7 +157,7 @@ void ComicVineClient::getVolumeComicsInfo(const QString &idVolume, int page) void ComicVineClient::getAllVolumeComicsInfo(const QString &idVolume) { QString url = QString(CV_COMICS_INFO).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(idVolume); - auto comicsRetriever = new ComicVineAllVolumeComicsRetriever(url); + auto comicsRetriever = new ComicVineAllVolumeComicsRetriever(url, userAgent); connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::allVolumeComicsInfo, this, &ComicVineClient::volumeComicsInfo); connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::finished, this, &ComicVineClient::finished); @@ -168,7 +177,9 @@ void ComicVineClient::getComicId(const QString &id, int comicNumber) // CV_COMIC_DETAIL QByteArray ComicVineClient::getComicDetail(const QString &id, bool &outError, bool &outTimeout) { - HttpWorker *search = new HttpWorker(QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id)); + HttpWorker *search = new HttpWorker( + QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id), + userAgent); // connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &))); // connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut())); @@ -186,7 +197,9 @@ QByteArray ComicVineClient::getComicDetail(const QString &id, bool &outError, bo // CV_COMIC_DETAIL void ComicVineClient::getComicDetailAsync(const QString &id) { - HttpWorker *search = new HttpWorker(QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id)); + HttpWorker *search = new HttpWorker( + QString(CV_COMIC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id), + userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessComicDetailData); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); @@ -197,7 +210,9 @@ void ComicVineClient::getComicDetailAsync(const QString &id) // CV_STORY_ARC_DETAIL QByteArray ComicVineClient::getStoryArcDetail(const QString &id, bool &outError, bool &outTimeout) { - HttpWorker *search = new HttpWorker(QString(CV_STORY_ARC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id)); + HttpWorker *search = new HttpWorker( + QString(CV_STORY_ARC_DETAIL).replace(CV_WEB_ADDRESS, baseURL).replace(CV_API_KEY, settings->value(COMIC_VINE_API_KEY, CV_API_KEY_DEFAULT).toString()).arg(id), + userAgent); // connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &))); // connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut())); @@ -214,7 +229,7 @@ QByteArray ComicVineClient::getStoryArcDetail(const QString &id, bool &outError, void ComicVineClient::getComicCover(const QString &url) { - auto search = new HttpWorker(url); + auto search = new HttpWorker(url, userAgent); connect(search, &HttpWorker::dataReady, this, &ComicVineClient::comicCover); connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO connect(search, &QThread::finished, search, &QObject::deleteLater); diff --git a/YACReaderLibrary/comic_vine/comic_vine_client.h b/YACReaderLibrary/comic_vine/comic_vine_client.h index 43c4ba5b..b47955d8 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_client.h +++ b/YACReaderLibrary/comic_vine/comic_vine_client.h @@ -45,5 +45,6 @@ protected slots: protected: QSettings *settings; QString baseURL; + QString userAgent; }; #endif // COMIC_VINE_CLIENT_H diff --git a/common/http_worker.cpp b/common/http_worker.cpp index 5e525503..3ab184be 100644 --- a/common/http_worker.cpp +++ b/common/http_worker.cpp @@ -12,8 +12,8 @@ #define PREVIOUS_VERSION "6.0.0" -HttpWorker::HttpWorker(const QString &urlString) - : QThread(), url(urlString), _error(false), _timeout(false) +HttpWorker::HttpWorker(const QString &urlString, const QString &userAgent) + : QThread(), url(urlString), userAgent(userAgent), _error(false), _timeout(false) { } @@ -50,7 +50,7 @@ void HttpWorker::run() auto request = QNetworkRequest(url); request.setHeader(QNetworkRequest::UserAgentHeader, - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0 Safari/537.36"); + userAgent); QNetworkReply *reply = manager.get(request); diff --git a/common/http_worker.h b/common/http_worker.h index b0af07c4..102bc565 100644 --- a/common/http_worker.h +++ b/common/http_worker.h @@ -4,13 +4,12 @@ #include #include #include -#include "yacreader_global.h" class HttpWorker : public QThread { Q_OBJECT public: - HttpWorker(const QString &urlString); + HttpWorker(const QString &urlString, const QString &userAgent); public slots: void get(); QByteArray getResult(); @@ -20,6 +19,7 @@ public slots: private: void run(); QUrl url; + QString userAgent; int httpGetId; QByteArray result; bool _error; diff --git a/common/yacreader_global.h b/common/yacreader_global.h index 392948ca..c4773984 100644 --- a/common/yacreader_global.h +++ b/common/yacreader_global.h @@ -9,7 +9,7 @@ class QLibrary; -#define VERSION "9.16.1" +#define VERSION "9.16.2" // Used to check if the database needs to be updated, the version is stored in the database. // This value is only incremented when the database structure changes. diff --git a/common/yacreader_global_gui.h b/common/yacreader_global_gui.h index 8d3639e0..cb7397fa 100644 --- a/common/yacreader_global_gui.h +++ b/common/yacreader_global_gui.h @@ -68,6 +68,7 @@ #define COMIC_VINE_API_KEY "COMIC_VINE_API_KEY" #define COMIC_VINE_BASE_URL "COMIC_VINE_BASE_URL" +#define COMIC_VINE_USER_AGENT "COMIC_VINE_USER_AGENT" #define USE_BACKGROUND_IMAGE_IN_GRID_VIEW "USE_BACKGROUND_IMAGE_IN_GRID_VIEW" #define OPACITY_BACKGROUND_IMAGE_IN_GRID_VIEW "OPACITY_BACKGROUND_IMAGE_IN_GRID_VIEW" diff --git a/custom_widgets/whats_new_dialog.cpp b/custom_widgets/whats_new_dialog.cpp index f90c50e5..629fb8f7 100644 --- a/custom_widgets/whats_new_dialog.cpp +++ b/custom_widgets/whats_new_dialog.cpp @@ -68,6 +68,7 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent) " • New button to reset to the default cover of a comic
" " • Support for storing the new image filters from iOS and Android apps
" " • Fixed cover loading in Comic Vine scraper (new in 9.16.1)
" + " • Added a customizable User Agent string to use it with Comic Vine. It can be set in YACReaderLibrary.ini in the [ComicVine] section using the COMIC_VINE_USER_AGENT key (new in 9.16.2)
" "
" "YACReaderLibraryServer
" " • Log libraries validation when the app starts
"