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..40a02582 100644 --- a/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp +++ b/YACReaderLibrary/comic_vine/comic_vine_dialog.cpp @@ -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 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; comic.info.publisher = publisher; @@ -615,6 +635,75 @@ 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();