datadragon with images
This commit is contained in:
parent
02c5b5353c
commit
a806c60a40
|
@ -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;
|
||||
|
|
|
@ -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 {};
|
||||
|
|
Loading…
Reference in New Issue