#include #include #include #include #include #include "invapi.hpp" #include "video.hpp" #include "sqliteinterface.hpp" using namespace std; using json = nlohmann::json; vector InvidiousApi::getInstancesUrls() { vector result; cpr::Response r = cpr::Get(cpr::Url{"https://api.invidious.io/instances.json"}, cpr::Parameters{{"sort_by", "health"}}, cpr::Timeout{5000}); if (r.status_code > 299) { cerr << "invidious.io returned error code " << r.status_code << "!!" << endl; throw runtime_error("bad response"); } json j = json::parse(r.text); for ( json i: j ) { if ( i.at(1).at("api") != json::value_t::null && i.at(1).at("api")) { result.push_back( i[1]["uri"] ); } } return result; } vector InvidiousApi::getInstances() { vector result; cpr::Response r = cpr::Get(cpr::Url{"https://api.invidious.io/instances.json"}, cpr::Parameters{{"sort_by", "health"}}, cpr::Timeout{5000}); if (r.status_code > 299) { cerr << "invidious.io returned error code " << r.status_code << "!!" << endl; throw runtime_error("bad response"); } json j = json::parse(r.text); for ( json i: j ) { if ( i.at(1).at("api") != json::value_t::null && i.at(1).at("api") && i.at(1).at("monitor") != json::value_t::null && i.at(1).at("monitor").at("30dRatio") != json::value_t::null && i.at(1).at("monitor").at("30dRatio").at("ratio") != json::value_t::null && i.at(1).at("uri") != json::value_t::null && i.at(1).at("region") != json::value_t::null) { string health = i[1]["monitor"]["30dRatio"]["ratio"]; result.push_back( {i[1]["uri"], stof(health), i[1]["region"]} ); } } return result; } void InvidiousApi::saveInstancesToDb(SqliteInterface& sqldb) { cpr::Response r = cpr::Get(cpr::Url{"https://api.invidious.io/instances.json"}, cpr::Parameters{{"sort_by", "health"}}, cpr::Timeout{5000}); if (r.status_code > 299) { cerr << "invidious.io returned error code " << r.status_code << "!!" << endl; throw runtime_error("bad response"); } json j = json::parse(r.text); for ( json i: j ) { if ( i.at(1).at("api") != json::value_t::null && i.at(1).at("api") && i.at(1).at("monitor") != json::value_t::null && i.at(1).at("monitor").at("30dRatio") != json::value_t::null && i.at(1).at("monitor").at("30dRatio").at("ratio") != json::value_t::null && i.at(1).at("uri") != json::value_t::null && i.at(1).at("region") != json::value_t::null) { string uri = i[1]["uri"]; string health = i[1]["monitor"]["30dRatio"]["ratio"]; string region = i[1]["region"]; sqldb.saveInstance(uri.c_str(), stof(health), region.c_str()); } } } void InvidiousApi::test() { session.SetUrl(cpr::Url{instanceUrl}); session.SetParameters(cpr::Parameters{{"hello", "world"}}); cpr::Response new_r = session.Get(); cout << new_r.url << endl; cout << new_r.text << endl; } std::string InvidiousApi::getInstance() { return instanceUrl; } void InvidiousApi::setInstance(const std::string& newUrl) { instanceUrl = newUrl; }