Merge pull request #85 from ivanvranjic/story-arcs-parsing

Fix for story arcs not being parsed from comicvine.
This commit is contained in:
Luis Ángel San Martín 2019-09-25 21:23:31 +02:00 committed by GitHub
commit f3937b6e20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 113 additions and 0 deletions

View File

@ -44,6 +44,9 @@ static const QString CV_COVER_URL = CV_WEB_ADDRESS + "/issue/4000-%1/?api_key="
//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)
{
@ -173,6 +176,24 @@ void ComicVineClient::getComicDetailAsync(const QString &id)
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);

View File

@ -29,6 +29,7 @@ public slots:
void getVolumeComicsInfo(const QString &idVolume, int page = 1);
void getAllVolumeComicsInfo(const QString &idVolume);
QByteArray getComicDetail(const QString &id, bool &outError, bool &outTimeout);
QByteArray getStoryArcDetail(const QString &id, bool &outError, bool &outTimeout);
void getComicCover(const QString &url);
void getComicId(const QString &id, int comicNumber);

View File

@ -554,6 +554,26 @@ ComicDB ComicVineDialog::parseComicInfo(ComicDB &comic, const QString &json, int
comic.info.characters = characters;
}
if (!result.property("story_arc_credits").isNull()) {
QPair<QString, QString> storyArcIdAndName = getFirstStoryArcIdAndName(result.property("story_arc_credits"));
QString storyArcId = storyArcIdAndName.first;
QString storyArcName = storyArcIdAndName.second;
if (!storyArcId.isNull()) {
QString comicId = result.property("id").toString();
QPair<QString, QString> arcNumberAndArcCount = getArcNumberAndArcCount(storyArcId, comicId);
if (!arcNumberAndArcCount.first.isNull()) {
QString arcNumber = arcNumberAndArcCount.first;
QString arcCount = arcNumberAndArcCount.second;
comic.info.storyArc = storyArcName;
comic.info.arcNumber = arcNumber;
comic.info.arcCount = arcCount;
}
}
}
comic.info.count = count;
comic.info.publisher = publisher;
@ -615,6 +635,75 @@ QMap<QString, QString> ComicVineDialog::getAuthors(const QScriptValue &json_auth
return authors;
}
QPair<QString, QString> ComicVineDialog::getFirstStoryArcIdAndName(const QScriptValue &json_story_arcs)
{
QString story_arc_id = QString();
QString story_arc_name = QString();
QScriptValueIterator it(json_story_arcs);
QScriptValue resultsValue;
while (it.hasNext()) {
it.next();
if (it.flags() & QScriptValue::SkipInEnumeration)
continue;
resultsValue = it.value();
story_arc_id = resultsValue.property("id").toString();
story_arc_name = resultsValue.property("name").toString();
break;
}
return qMakePair(story_arc_id, story_arc_name);
}
QPair<QString, QString> ComicVineDialog::getArcNumberAndArcCount(const QString &storyArcId, const QString &comicId)
{
auto comicVineClient = new ComicVineClient;
bool error;
bool timeout;
QByteArray result = comicVineClient->getStoryArcDetail(storyArcId, error, timeout);
if (error || timeout)
return qMakePair(QString(), QString());
QString json = result;
QScriptEngine engine;
QScriptValue sc;
sc = engine.evaluate("(" + json + ")");
if (!sc.property("error").isValid() && sc.property("error").toString() != "OK") {
qDebug("Error detected");
return qMakePair(QString(), QString());
} else {
int numResults = sc.property("number_of_total_results").toString().toInt(); //fix to weird behaviour using hasNext
if (numResults > 0) {
QScriptValue result = sc.property("results");
if (!result.property("issues").isNull()) {
QScriptValue issues = result.property("issues");
int arcNumber = 0;
int arcCount = 0;
QScriptValueIterator it(issues);
QScriptValue resultsValue;
while (it.hasNext()) {
it.next();
if (it.flags() & QScriptValue::SkipInEnumeration)
continue;
resultsValue = it.value();
if (comicId == resultsValue.property("id").toString()) {
arcNumber = arcCount + 1;
}
arcCount++;
}
return qMakePair(QString::number(arcNumber), QString::number(arcCount));
}
return qMakePair(QString(), QString());
}
return qMakePair(QString(), QString());
}
return qMakePair(QString(), QString());
}
void ComicVineDialog::toggleSkipButton()
{
if (mode == SingleComicInList)

View File

@ -66,6 +66,8 @@ protected slots:
private:
QString getCharacters(const QScriptValue &json_characters);
QMap<QString, QString> getAuthors(const QScriptValue &json_authors);
QPair<QString, QString> getFirstStoryArcIdAndName(const QScriptValue &json_story_arcs);
QPair<QString, QString> getArcNumberAndArcCount(const QString &storyArcId, const QString &comicId);
void toggleSkipButton();