From cfb4e31af931fca6513fc8574e71717ff731a0fc Mon Sep 17 00:00:00 2001 From: Ivan Vranjic Date: Tue, 24 Sep 2019 02:02:25 +0200 Subject: [PATCH 1/2] Fix for story arcs not being parsed from comicvine. --- .../comic_vine/comic_vine_client.cpp | 21 +++++ .../comic_vine/comic_vine_client.h | 1 + .../comic_vine/comic_vine_dialog.cpp | 88 +++++++++++++++++++ .../comic_vine/comic_vine_dialog.h | 2 + 4 files changed, 112 insertions(+) diff --git a/YACReaderLibrary/comic_vine/comic_vine_client.cpp b/YACReaderLibrary/comic_vine/comic_vine_client.cpp index 5da3621e..1b65b426 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_client.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_client.cpp @@ -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); diff --git a/YACReaderLibrary/comic_vine/comic_vine_client.h b/YACReaderLibrary/comic_vine/comic_vine_client.h index 5cb858af..8b7f1152 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_client.h +++ b/YACReaderLibrary/comic_vine/comic_vine_client.h @@ -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); diff --git a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp index 911e2306..b189c6ec 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp @@ -553,6 +553,26 @@ ComicDB ComicVineDialog::parseComicInfo(ComicDB &comic, const QString &json, int comic.info.characters = characters; } + + if (!result.property("story_arc_credits").isNull()) { + QPair 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 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; @@ -615,6 +635,74 @@ QMap ComicVineDialog::getAuthors(const QScriptValue &json_auth return authors; } +QPair 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 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) diff --git a/YACReaderLibrary/comic_vine/comic_vine_dialog.h b/YACReaderLibrary/comic_vine/comic_vine_dialog.h index 3a0fd4c6..77b8427b 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.h +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.h @@ -66,6 +66,8 @@ protected slots: private: QString getCharacters(const QScriptValue &json_characters); QMap getAuthors(const QScriptValue &json_authors); + QPair getFirstStoryArcIdAndName(const QScriptValue &json_story_arcs); + QPair getArcNumberAndArcCount(const QString &storyArcId, const QString &comicId); void toggleSkipButton(); From 346bcdaf75a1ee36d049014bf932ebc4755169e3 Mon Sep 17 00:00:00 2001 From: ivanvranjic Date: Tue, 24 Sep 2019 19:36:12 +0200 Subject: [PATCH 2/2] Clang format fix. --- YACReaderLibrary/comic_vine/comic_vine_dialog.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp index b189c6ec..40a02582 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp @@ -553,20 +553,20 @@ ComicDB ComicVineDialog::parseComicInfo(ComicDB &comic, const QString &json, int comic.info.characters = characters; } - + if (!result.property("story_arc_credits").isNull()) { QPair 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 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; @@ -639,7 +639,7 @@ QPair ComicVineDialog::getFirstStoryArcIdAndName(const QScript { QString story_arc_id = QString(); QString story_arc_name = QString(); - + QScriptValueIterator it(json_story_arcs); QScriptValue resultsValue; while (it.hasNext()) { @@ -654,7 +654,8 @@ QPair ComicVineDialog::getFirstStoryArcIdAndName(const QScript return qMakePair(story_arc_id, story_arc_name); } -QPair ComicVineDialog::getArcNumberAndArcCount(const QString &storyArcId, const QString &comicId) { +QPair ComicVineDialog::getArcNumberAndArcCount(const QString &storyArcId, const QString &comicId) +{ auto comicVineClient = new ComicVineClient; bool error; bool timeout; @@ -678,10 +679,10 @@ QPair ComicVineDialog::getArcNumberAndArcCount(const QString & if (!result.property("issues").isNull()) { QScriptValue issues = result.property("issues"); - + int arcNumber = 0; int arcCount = 0; - + QScriptValueIterator it(issues); QScriptValue resultsValue; while (it.hasNext()) {