From a806c60a40ca592ba0474ffa61b1cd9537776725 Mon Sep 17 00:00:00 2001 From: mrbesen Date: Fri, 22 Apr 2022 00:26:10 +0200 Subject: [PATCH] datadragon with images --- include/datadragon.h | 10 ++++++ src/datadragon.cpp | 76 +++++++++++++++++++++++++++++++++----------- 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/include/datadragon.h b/include/datadragon.h index a1ef353..bb82a36 100644 --- a/include/datadragon.h +++ b/include/datadragon.h @@ -4,6 +4,7 @@ #include #include #include +#include class DataDragon { public: @@ -22,10 +23,19 @@ public: std::string title; }; + enum class ImageType { + SQUARE, + LOADING, + SPLASH + }; + const std::string& getVersion(); const std::vector& getChamps(); + cv::Mat getImage(const std::string& champid, ImageType imgtype = ImageType::SQUARE); protected: + std::string getCDNString() const; + QByteArray requestRaw(const std::string& url); QJsonDocument request(const std::string& url); std::string version; diff --git a/src/datadragon.cpp b/src/datadragon.cpp index 587fc15..c4c816d 100644 --- a/src/datadragon.cpp +++ b/src/datadragon.cpp @@ -1,7 +1,6 @@ #include "datadragon.h" #include -#include #include #include @@ -13,14 +12,12 @@ static const std::string BASEURL = "https://ddragon.leagueoflegends.com/"; -static size_t write_callback(char* contents, size_t size, size_t nmemb, void* userdata) { - if (userdata) { - std::ostream& os = *static_cast(userdata); - std::streamsize len = size * nmemb; - if (os.write(static_cast(contents), len)) - return len; +static size_t arrayWriteCallback(char* contents, size_t size, size_t nmemb, void* userdata) { + if(userdata) { + QByteArray* arr = (QByteArray*) userdata; + arr->append(contents, size * nmemb); + return size * nmemb; } - return 0; } @@ -52,7 +49,7 @@ static T getValue(const QJsonObject& obj, const char* key, const T& def) { DataDragon::DataDragon() { curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, arrayWriteCallback); } DataDragon::ChampData::ChampData(const QJsonObject& source) { @@ -91,7 +88,7 @@ const std::vector& DataDragon::getChamps() { return champs; } - QJsonDocument jchamps = request("cdn/" + version + "/data/en_US/champion.json"); + QJsonDocument jchamps = request(getCDNString() + "data/en_US/champion.json"); if(jchamps.isObject()) { QJsonObject obj = jchamps.object(); auto it = obj.constFind("data"); @@ -100,28 +97,66 @@ const std::vector& DataDragon::getChamps() { for(auto champit = jchampsdata.constBegin(); champit != jchampsdata.constEnd(); champit++) { if(champit.value().isObject()) { champs.emplace_back(champit.value().toObject()); - Log::info << "loaded champ: " << champs.back(); } } - - Log::info << "loaded " << champs.size() << " champs"; } } + Log::info << "loaded " << champs.size() << " champs"; return champs; } -QJsonDocument DataDragon::request(const std::string& url) { +cv::Mat DataDragon::getImage(const std::string& champid, ImageType imgtype) { + std::string url; + if(imgtype == ImageType::SQUARE) { + if(getVersion().empty()) { + return {}; + } + + // with version + url = getCDNString() + "img/champion/" + champid + ".png"; + } else if(imgtype == ImageType::LOADING) { + // no version + url = "cdn/img/champion/loading/" + champid + "_0.jpg"; + } else if(imgtype == ImageType::SPLASH) { + // no version! + url = "cdn/img/champion/splash/" + champid + "_0.jpg"; + } + + QByteArray arr = requestRaw(url); + if(arr.isEmpty()) { + Log::error << "image could not be loaded"; + return {}; + } + + cv::Mat rawData(1, arr.size(), CV_8UC1, (void*) arr.data()); + + // propably an error + if(arr.size() < 1000) { + Log::info << "small icon url: " << getCDNString() << "img/champion/" << champid << ".png"; + Log::info << "content: " << std::string(arr.data(), arr.size()); + return {}; + } + + cv::Mat decodedImage = cv::imdecode(rawData, cv::IMREAD_COLOR); + return decodedImage; +} + +std::string DataDragon::getCDNString() const { + return "cdn/" + version + "/"; +} + +QByteArray DataDragon::requestRaw(const std::string& url) { if(!curl) return {}; std::string requrl = BASEURL + url; - std::stringstream ss; //buffer + QByteArray ba; //buffer // std::cout << "[DEBUG] requrl is: " << requrl << std::endl; curl_easy_setopt(curl, CURLOPT_URL, requrl.c_str()); // curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //Prevent "longjmp causes uninitialized stack frame" bug // set callback data - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ss); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ba); // Check for errors CURLcode res = curl_easy_perform(curl); @@ -135,10 +170,15 @@ QJsonDocument DataDragon::request(const std::string& url) { } return {}; } + return ba; +} + +QJsonDocument DataDragon::request(const std::string& url) { + QByteArray arr = requestRaw(url); + if(arr.isEmpty()) return {}; - // json parsed = json::parse(ss.str()); QJsonParseError err; - QJsonDocument parsed = QJsonDocument::fromJson(QByteArray::fromStdString(ss.str()), &err); + QJsonDocument parsed = QJsonDocument::fromJson(arr, &err); if(parsed.isNull() || err.error != QJsonParseError::NoError) { Log::error << "DataDragon Jsonparse error " << err.errorString().toStdString() << " offset: " << err.offset; return {};