mirror of
https://github.com/YACReader/yacreader
synced 2025-05-28 03:10:27 -04:00
211 lines
9.3 KiB
C++
211 lines
9.3 KiB
C++
#include "comic_vine_client.h"
|
|
#include "yacreader_global_gui.h"
|
|
|
|
#include "comic_vine_all_volume_comics_retriever.h"
|
|
|
|
// this is the API key used by YACReader to access Comic Vine
|
|
// please, do not use it in your own software, get one for free at Comic Vine
|
|
static const QString CV_API_KEY = "%CV_API_KEY%"; // get from settings
|
|
static const QString CV_API_KEY_DEFAULT = "46680bebb358f1de690a5a365e15d325f9649f91";
|
|
|
|
static const QString CV_WEB_ADDRESS = "%CV_WEB_ADDRESS%"; // get from settings
|
|
|
|
// gets any volumen containing any comic matching 'query'
|
|
static const QString CV_SEARCH = CV_WEB_ADDRESS + "/search/?api_key=" + CV_API_KEY +
|
|
"&format=json&limit=100&resources=volume"
|
|
"&field_list=name,start_year,publisher,id,image,count_of_issues,deck"
|
|
"&sort=name:asc"
|
|
"&query=%1&page=%2";
|
|
// http://www.comicvine.com/api/search/?api_key=46680bebb358f1de690a5a365e15d325f9649f91&format=json&limit=100&resources=volume&field_list=name,start_year,publisher,id,image,count_of_issues,deck&query=superman
|
|
|
|
// gets the detail for a volume %1
|
|
static const QString CV_SERIES_DETAIL = CV_WEB_ADDRESS + "/volume/4050-%1/?api_key=" + CV_API_KEY +
|
|
"&format=json&field_list=name,start_year,publisher,image,count_of_issues,id,description";
|
|
|
|
// gets info for comics in a volume id %1
|
|
static const QString CV_COMICS_INFO = CV_WEB_ADDRESS + "/issues/?api_key=" + CV_API_KEY +
|
|
"&limit=1000&format=json&field_list=name,issue_number,id,image&filter=volume:%1"
|
|
"&sort=cover_date:asc" // sorting by cover_date, because comic vine doesn't use natural sorting (issue_number -> 1 10 11 ... 100 2 20 21....)
|
|
"&offset=%2";
|
|
|
|
//"http://www.comicvine.com/api/issues/?api_key=46680bebb358f1de690a5a365e15d325f9649f91&format=json&field_list=name,issue_number,id,image&filter=volume:%1&page=%2
|
|
|
|
// gets id for comic number %2 in a volume id %1
|
|
static const QString CV_COMIC_ID = CV_WEB_ADDRESS + "/issues/?api_key=" + CV_API_KEY +
|
|
"&format=json&field_list=name,issue_number,id,image"
|
|
"&filter=volume:%1,issue_number:%2";
|
|
// gets comic detail
|
|
static const QString CV_COMIC_DETAIL = CV_WEB_ADDRESS + "/issue/4000-%1/?api_key=" + CV_API_KEY + "&format=json";
|
|
// http://www.comicvine.com/api/issue/4000-%1/?api_key=46680bebb358f1de690a5a365e15d325f9649f91&format=json
|
|
|
|
// gets comic cover URL
|
|
static const QString CV_COVER_URL = CV_WEB_ADDRESS + "/issue/4000-%1/?api_key=" + CV_API_KEY + "&format=json&field_list=image";
|
|
|
|
// gets comics matching name %1 and number %2
|
|
// http://comicvine.com/api/issues/?api_key=46680bebb358f1de690a5a365e15d325f9649f91&limit=20&filter=name:super,issue_number:15
|
|
|
|
// gets story arc detail
|
|
static const QString CV_STORY_ARC_DETAIL = CV_WEB_ADDRESS + "/story_arc/4045-%1/?api_key=" + CV_API_KEY + "&format=json";
|
|
|
|
ComicVineClient::ComicVineClient(QObject *parent)
|
|
: 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();
|
|
}
|
|
|
|
ComicVineClient::~ComicVineClient()
|
|
{
|
|
delete settings;
|
|
}
|
|
|
|
// 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));
|
|
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessVolumesSearchData);
|
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
|
search->get();
|
|
}
|
|
// CV_SEARCH result
|
|
void ComicVineClient::proccessVolumesSearchData(const QByteArray &data)
|
|
{
|
|
QString json(data);
|
|
emit searchResult(json);
|
|
emit finished();
|
|
}
|
|
|
|
void ComicVineClient::proccessSeriesDetailData(const QByteArray &data)
|
|
{
|
|
QString json(data);
|
|
emit seriesDetail(json);
|
|
emit finished();
|
|
}
|
|
|
|
void ComicVineClient::processVolumeComicsInfo(const QByteArray &data)
|
|
{
|
|
QString json(data);
|
|
emit volumeComicsInfo(json);
|
|
emit finished();
|
|
}
|
|
|
|
void ComicVineClient::proccessComicDetailData(const QByteArray &data)
|
|
{
|
|
QString json(data);
|
|
emit comicDetail(json);
|
|
emit finished();
|
|
}
|
|
|
|
// 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));
|
|
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessSeriesDetailData);
|
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
|
search->get();
|
|
}
|
|
|
|
void ComicVineClient::getSeriesCover(const QString &url)
|
|
{
|
|
auto search = new HttpWorker(url);
|
|
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::seriesCover);
|
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
|
search->get();
|
|
}
|
|
|
|
// 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)); // page doesn't work for search, using offset instead
|
|
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::processVolumeComicsInfo);
|
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
|
search->get();
|
|
}
|
|
|
|
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);
|
|
|
|
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::allVolumeComicsInfo, this, &ComicVineClient::volumeComicsInfo);
|
|
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::finished, this, &ComicVineClient::finished);
|
|
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::finished, this, &ComicVineAllVolumeComicsRetriever::deleteLater);
|
|
connect(comicsRetriever, &ComicVineAllVolumeComicsRetriever::timeOut, this, &ComicVineClient::timeOut);
|
|
|
|
comicsRetriever->getAllVolumeComics();
|
|
}
|
|
|
|
// CV_COMIC_ID
|
|
void ComicVineClient::getComicId(const QString &id, int comicNumber)
|
|
{
|
|
Q_UNUSED(id);
|
|
Q_UNUSED(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));
|
|
|
|
// connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &)));
|
|
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
|
|
// connect(search,SIGNAL(finished()),search,SLOT(deleteLater()));
|
|
search->get();
|
|
search->wait();
|
|
outError = !(search->wasValid());
|
|
outTimeout = search->wasTimeout();
|
|
QByteArray result = search->getResult();
|
|
delete search;
|
|
|
|
return result;
|
|
}
|
|
|
|
// 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));
|
|
|
|
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::proccessComicDetailData);
|
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut);
|
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
|
search->get();
|
|
}
|
|
|
|
// 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));
|
|
|
|
// connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(proccessComicDetailData(const QByteArray &)));
|
|
// connect(search,SIGNAL(timeout()),this,SIGNAL(timeOut()));
|
|
// connect(search,SIGNAL(finished()),search,SLOT(deleteLater()));
|
|
search->get();
|
|
search->wait();
|
|
outError = !(search->wasValid());
|
|
outTimeout = search->wasTimeout();
|
|
QByteArray result = search->getResult();
|
|
delete search;
|
|
|
|
return result;
|
|
}
|
|
|
|
void ComicVineClient::getComicCover(const QString &url)
|
|
{
|
|
auto search = new HttpWorker(url);
|
|
connect(search, &HttpWorker::dataReady, this, &ComicVineClient::comicCover);
|
|
connect(search, &HttpWorker::timeout, this, &ComicVineClient::timeOut); // TODO
|
|
connect(search, &QThread::finished, search, &QObject::deleteLater);
|
|
search->get();
|
|
}
|
|
|
|
// CV_COVER_DETAIL
|
|
void ComicVineClient::getCoverURL(const QString &id)
|
|
{
|
|
Q_UNUSED(id);
|
|
}
|