mirror of
https://github.com/YACReader/yacreader
synced 2026-02-23 23:43:01 -05:00
Add COMIC_VINE_USER_AGENT to YACReaderLibrary.ini to be able to customize the user agent
This commit is contained in:
@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
Version counting is based on semantic versioning (Major.Feature.Patch)
|
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
|
## 9.16.1
|
||||||
|
|
||||||
### YACReaderLibrary
|
### YACReaderLibrary
|
||||||
|
|||||||
@ -7,8 +7,8 @@
|
|||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
|
|
||||||
ComicVineAllVolumeComicsRetriever::ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, QObject *parent)
|
ComicVineAllVolumeComicsRetriever::ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, const QString &userAgent, QObject *parent)
|
||||||
: QObject(parent), volumeURLString(volumeURLString)
|
: QObject(parent), volumeURLString(volumeURLString), userAgent(userAgent)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ void ComicVineAllVolumeComicsRetriever::getAllVolumeComics()
|
|||||||
|
|
||||||
void ComicVineAllVolumeComicsRetriever::getAllVolumeComics(int range)
|
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::dataReady, this, &ComicVineAllVolumeComicsRetriever::appendVolumeComicsInfo);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::timeOut);
|
connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::timeOut);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::finished);
|
connect(search, &HttpWorker::timeout, this, &ComicVineAllVolumeComicsRetriever::finished);
|
||||||
|
|||||||
@ -7,7 +7,7 @@ class ComicVineAllVolumeComicsRetriever : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, QObject *parent = nullptr);
|
explicit ComicVineAllVolumeComicsRetriever(const QString &volumeURLString, const QString &userAgent, QObject *parent = nullptr);
|
||||||
void getAllVolumeComics();
|
void getAllVolumeComics();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -21,6 +21,7 @@ protected slots:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString volumeURLString;
|
QString volumeURLString;
|
||||||
|
QString userAgent;
|
||||||
QList<QByteArray> jsonResponses;
|
QList<QByteArray> jsonResponses;
|
||||||
|
|
||||||
QString consolidateJSON();
|
QString consolidateJSON();
|
||||||
|
|||||||
@ -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 = new QSettings(YACReader::getSettingsPath() + "/YACReaderLibrary.ini", QSettings::IniFormat); // TODO unificar la creación del fichero de config con el servidor
|
||||||
settings->beginGroup("ComicVine");
|
settings->beginGroup("ComicVine");
|
||||||
baseURL = settings->value(COMIC_VINE_BASE_URL, "https://comicvine.gamespot.com/api").toString();
|
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()
|
ComicVineClient::~ComicVineClient()
|
||||||
@ -70,7 +71,9 @@ ComicVineClient::~ComicVineClient()
|
|||||||
// CV_SEARCH
|
// CV_SEARCH
|
||||||
void ComicVineClient::search(const QString &query, int page)
|
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::dataReady, this, &ComicVineClient::proccessVolumesSearchData);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
||||||
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
||||||
@ -80,7 +83,9 @@ void ComicVineClient::search(const QString &query, int page)
|
|||||||
// CV_EXACT_VOLUME_SEARCH
|
// CV_EXACT_VOLUME_SEARCH
|
||||||
void ComicVineClient::searchExactVolume(const QString &query, int page)
|
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::dataReady, this, &ComicVineClient::proccessVolumesSearchData);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
||||||
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
||||||
@ -119,7 +124,9 @@ void ComicVineClient::proccessComicDetailData(const QByteArray &data)
|
|||||||
// CV_SERIES_DETAIL
|
// CV_SERIES_DETAIL
|
||||||
void ComicVineClient::getSeriesDetail(const QString &id)
|
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::dataReady, this, &ComicVineClient::proccessSeriesDetailData);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
||||||
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
||||||
@ -128,7 +135,7 @@ void ComicVineClient::getSeriesDetail(const QString &id)
|
|||||||
|
|
||||||
void ComicVineClient::getSeriesCover(const QString &url)
|
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::dataReady, this, &ComicVineClient::seriesCover);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
||||||
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
||||||
@ -138,7 +145,9 @@ void ComicVineClient::getSeriesCover(const QString &url)
|
|||||||
// CV_COMIC_IDS
|
// CV_COMIC_IDS
|
||||||
void ComicVineClient::getVolumeComicsInfo(const QString &idVolume, int page)
|
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::dataReady, this, &ComicVineClient::processVolumeComicsInfo);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
||||||
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
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)
|
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);
|
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::allVolumeComicsInfo, this, &ComicVineClient::volumeComicsInfo);
|
||||||
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::finished, this, &ComicVineClient::finished);
|
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::finished, this, &ComicVineClient::finished);
|
||||||
@ -168,7 +177,9 @@ void ComicVineClient::getComicId(const QString &id, int comicNumber)
|
|||||||
// CV_COMIC_DETAIL
|
// CV_COMIC_DETAIL
|
||||||
QByteArray ComicVineClient::getComicDetail(const QString &id, bool &outError, bool &outTimeout)
|
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(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &)));
|
||||||
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
|
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
|
||||||
@ -186,7 +197,9 @@ QByteArray ComicVineClient::getComicDetail(const QString &id, bool &outError, bo
|
|||||||
// CV_COMIC_DETAIL
|
// CV_COMIC_DETAIL
|
||||||
void ComicVineClient::getComicDetailAsync(const QString &id)
|
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::dataReady, this, &ComicVineClient::proccessComicDetailData);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
||||||
@ -197,7 +210,9 @@ void ComicVineClient::getComicDetailAsync(const QString &id)
|
|||||||
// CV_STORY_ARC_DETAIL
|
// CV_STORY_ARC_DETAIL
|
||||||
QByteArray ComicVineClient::getStoryArcDetail(const QString &id, bool &outError, bool &outTimeout)
|
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(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &)));
|
||||||
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
|
// 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)
|
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::dataReady, this, &ComicVineClient::comicCover);
|
||||||
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
||||||
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
||||||
|
|||||||
@ -45,5 +45,6 @@ protected slots:
|
|||||||
protected:
|
protected:
|
||||||
QSettings *settings;
|
QSettings *settings;
|
||||||
QString baseURL;
|
QString baseURL;
|
||||||
|
QString userAgent;
|
||||||
};
|
};
|
||||||
#endif // COMIC_VINE_CLIENT_H
|
#endif // COMIC_VINE_CLIENT_H
|
||||||
|
|||||||
@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
#define PREVIOUS_VERSION "6.0.0"
|
#define PREVIOUS_VERSION "6.0.0"
|
||||||
|
|
||||||
HttpWorker::HttpWorker(const QString &urlString)
|
HttpWorker::HttpWorker(const QString &urlString, const QString &userAgent)
|
||||||
: QThread(), url(urlString), _error(false), _timeout(false)
|
: QThread(), url(urlString), userAgent(userAgent), _error(false), _timeout(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ void HttpWorker::run()
|
|||||||
auto request = QNetworkRequest(url);
|
auto request = QNetworkRequest(url);
|
||||||
|
|
||||||
request.setHeader(QNetworkRequest::UserAgentHeader,
|
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);
|
QNetworkReply *reply = manager.get(request);
|
||||||
|
|
||||||
|
|||||||
@ -4,13 +4,12 @@
|
|||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include "yacreader_global.h"
|
|
||||||
|
|
||||||
class HttpWorker : public QThread
|
class HttpWorker : public QThread
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
HttpWorker(const QString &urlString);
|
HttpWorker(const QString &urlString, const QString &userAgent);
|
||||||
public slots:
|
public slots:
|
||||||
void get();
|
void get();
|
||||||
QByteArray getResult();
|
QByteArray getResult();
|
||||||
@ -20,6 +19,7 @@ public slots:
|
|||||||
private:
|
private:
|
||||||
void run();
|
void run();
|
||||||
QUrl url;
|
QUrl url;
|
||||||
|
QString userAgent;
|
||||||
int httpGetId;
|
int httpGetId;
|
||||||
QByteArray result;
|
QByteArray result;
|
||||||
bool _error;
|
bool _error;
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
class QLibrary;
|
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.
|
// 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.
|
// This value is only incremented when the database structure changes.
|
||||||
|
|||||||
@ -68,6 +68,7 @@
|
|||||||
|
|
||||||
#define COMIC_VINE_API_KEY "COMIC_VINE_API_KEY"
|
#define COMIC_VINE_API_KEY "COMIC_VINE_API_KEY"
|
||||||
#define COMIC_VINE_BASE_URL "COMIC_VINE_BASE_URL"
|
#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 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"
|
#define OPACITY_BACKGROUND_IMAGE_IN_GRID_VIEW "OPACITY_BACKGROUND_IMAGE_IN_GRID_VIEW"
|
||||||
|
|||||||
@ -68,6 +68,7 @@ YACReader::WhatsNewDialog::WhatsNewDialog(QWidget *parent)
|
|||||||
" • New button to reset to the default cover of a comic<br/>"
|
" • New button to reset to the default cover of a comic<br/>"
|
||||||
" • Support for storing the new image filters from iOS and Android apps<br/>"
|
" • Support for storing the new image filters from iOS and Android apps<br/>"
|
||||||
" • Fixed cover loading in Comic Vine scraper (new in 9.16.1)<br/>"
|
" • Fixed cover loading in Comic Vine scraper (new in 9.16.1)<br/>"
|
||||||
|
" • 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/>"
|
"<br/>"
|
||||||
"<span style=\"font-weight:600\">YACReaderLibraryServer</span><br/>"
|
"<span style=\"font-weight:600\">YACReaderLibraryServer</span><br/>"
|
||||||
" • Log libraries validation when the app starts<br/>"
|
" • Log libraries validation when the app starts<br/>"
|
||||||
|
|||||||
Reference in New Issue
Block a user