datadragon with images

This commit is contained in:
mrbesen 2022-04-22 00:26:10 +02:00
parent 02c5b5353c
commit a806c60a40
Signed by: MrBesen
GPG Key ID: 596B2350DCD67504
2 changed files with 68 additions and 18 deletions

View File

@ -4,6 +4,7 @@
#include <vector>
#include <curl/curl.h>
#include <QJsonDocument>
#include <opencv2/opencv.hpp>
class DataDragon {
public:
@ -22,10 +23,19 @@ public:
std::string title;
};
enum class ImageType {
SQUARE,
LOADING,
SPLASH
};
const std::string& getVersion();
const std::vector<ChampData>& 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;

View File

@ -1,7 +1,6 @@
#include "datadragon.h"
#include <ostream>
#include <sstream>
#include <stdexcept>
#include <curl/easy.h>
@ -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<std::ostream*>(userdata);
std::streamsize len = size * nmemb;
if (os.write(static_cast<char*>(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::ChampData>& 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::ChampData>& 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 {};