Add COMIC_VINE_USER_AGENT to YACReaderLibrary.ini to be able to customize the user agent

This commit is contained in:
luisangelsm
2025-12-10 10:42:45 +01:00
parent 620140cf12
commit 79eb19a192
10 changed files with 44 additions and 20 deletions

View File

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

View File

@ -7,8 +7,8 @@
#include <QJsonDocument>
#include <QJsonObject>
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);

View File

@ -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<QByteArray> jsonResponses;
QString consolidateJSON();

View File

@ -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);

View File

@ -45,5 +45,6 @@ protected slots:
protected:
QSettings *settings;
QString baseURL;
QString userAgent;
};
#endif // COMIC_VINE_CLIENT_H

View File

@ -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);

View File

@ -4,13 +4,12 @@
#include <QByteArray>
#include <QThread>
#include <QUrl>
#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;

View File

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

View File

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

View File

@ -68,6 +68,7 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent)
" &#8226; New button to reset to the default cover of a comic<br/>"
" &#8226; Support for storing the new image filters from iOS and Android apps<br/>"
" &#8226; Fixed cover loading in Comic Vine scraper (new in 9.16.1)<br/>"
" &#8226; 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)<br/>"
"<br/>"
"<span style=\"font-weight:600\">YACReaderLibraryServer</span><br/>"
" &#8226; Log libraries validation when the app starts<br/>"