mirror of
https://github.com/HamletDuFromage/aio-switch-updater.git
synced 2024-12-28 18:36:02 +00:00
changed links fetching method
This commit is contained in:
parent
2a7a182b55
commit
682e023d68
11 changed files with 10704 additions and 5682 deletions
2
Makefile
2
Makefile
|
@ -22,7 +22,7 @@ DATA := data
|
|||
INCLUDES := include lib/zipper/include
|
||||
APP_TITLE := All-in-One Switch Updater
|
||||
APP_AUTHOR := HamletDuFromage
|
||||
APP_VERSION := 2.0.1
|
||||
APP_VERSION := 2.1.0
|
||||
TARGET := $(notdir $(CURDIR))
|
||||
|
||||
ROMFS := resources
|
||||
|
|
|
@ -13,23 +13,24 @@
|
|||
#define TAGS_INFO "https://api.github.com/repos/HamletDuFromage/aio-switch-updater/tags"
|
||||
#define APP_FILENAME "/config/aio-switch-updater/app.zip"
|
||||
|
||||
#define SIGPATCHES_URL "https://hamletdufromage.github.io/sigpatches-updater/sigpatches.html"
|
||||
#define SIGPATCHES_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/sigpatches.json"
|
||||
#define SIGPATCHES_FILENAME "/config/aio-switch-updater/sigpatches.zip"
|
||||
#define HEKATE_IPL_PATH "/bootloader/hekate_ipl.ini"
|
||||
|
||||
#define FIRMWARE_URL "https://hamletdufromage.github.io/switch-fw/firmwares.html"
|
||||
#define FIRMWARE_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/firmwares.json"
|
||||
#define FIRMWARE_FILENAME "/config/aio-switch-updater/firmware.zip"
|
||||
#define FIRMWARE_PATH "/firmware/"
|
||||
|
||||
#define CFW_URL "https://hamletdufromage.github.io/switch-cfw/cfw.html"
|
||||
#define CFW_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/cfw.json"
|
||||
#define CFW_FILENAME "/config/aio-switch-updater/cfw.zip"
|
||||
|
||||
#define AMS_URL "https://hamletdufromage.github.io/switch-cfw/ams.html"
|
||||
#define AMS_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/ams.json"
|
||||
#define SXOS_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/sxos.json"
|
||||
#define AMS_FILENAME "/config/aio-switch-updater/ams.zip"
|
||||
|
||||
#define HEKATE_URL "https://hamletdufromage.github.io/switch-cfw/hekate.html"
|
||||
#define HEKATE_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/hekate.json"
|
||||
|
||||
#define PAYLOAD_URL "https://hamletdufromage.github.io/switch-payloads/payloads.html"
|
||||
#define PAYLOAD_URL "https://raw.githubusercontent.com/HamletDuFromage/nx-links/master/payloads.json"
|
||||
|
||||
#define CHEATS_RELEASE_URL "https://github.com/HamletDuFromage/switch-cheats-db/releases/tag/v1.0"
|
||||
#define CHEATS_URL_TITLES "https://github.com/HamletDuFromage/switch-cheats-db/releases/download/v1.0/titles.zip"
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "json.hpp"
|
||||
|
||||
void downloadFile(const char *url, const char *output, int api);
|
||||
std::tuple<std::vector<std::string>, std::vector<std::string>> fetchLinks(const char *url);
|
||||
std::vector<std::pair<std::string, std::string>> getLinks(const char *url);
|
||||
std::string fetchTitle(const char *url);
|
||||
std::string downloadPage(const char* url, std::vector<std::string> headers = {}, std::string body = "");
|
||||
nlohmann::json getRequest(std::string url, std::vector<std::string> headers = {}, std::string body = "");
|
|
@ -10,7 +10,7 @@ class DownloadPayloadPage : public brls::AppletFrame
|
|||
brls::Label* label;
|
||||
brls::Label* notFound;
|
||||
brls::List* list;
|
||||
std::vector<brls::ListItem*> items;
|
||||
brls::ListItem* listItem;
|
||||
|
||||
public:
|
||||
DownloadPayloadPage();
|
||||
|
|
16229
include/json.hpp
16229
include/json.hpp
File diff suppressed because it is too large
Load diff
|
@ -2,7 +2,7 @@
|
|||
"about_tab.cpp":"",
|
||||
"About_Title": "All-in-One Nintendo Switch Updater",
|
||||
"copyright": "AIO-switch-updater is licensed under GPL-3.0\n\u00A9 2020 HamletDuFromage",
|
||||
"Disclaimers": "\uE016 Aside from cheat codes that are mirrored from the main Gbatemp thread, HamletDuFromage isn't hosting anything. All credits go to respective owners.\n\uE016 Links are refreshed every three hours. If a link remains broken after 3 hours have passed, please open a Github issue.\n",
|
||||
"Disclaimers": "\uE016 Aside from cheat codes that are mirrored from the main Gbatemp thread, HamletDuFromage isn't hosting anything. All credits go to respective owners.\n\uE016 Links are refreshed every 30 minutes. If a link remains broken after 30 minutes have passed, please open a Github issue.\n",
|
||||
"donate": "\uE016 Like the app? Consider donating to support my efforts: 'https://git.io/donate_homlet'",
|
||||
|
||||
"app_page.cpp":"",
|
||||
|
@ -67,6 +67,8 @@
|
|||
"v2_0_0_text": "\uE016 Added ability to download cheatslips cheats.\n\uE016 Added way to toggle out tabs.\n\uE016 Various code improvements.",
|
||||
"v2_0_1": "v2.0.1",
|
||||
"v2_0_1_text": "\uE016 Fixed a bug not letting the user click no when asked if they want to install hekate.n\uE016 Correct a bunch of typos.",
|
||||
"v2_1_0": "v2.1.0",
|
||||
"v2_1_0_text": "\uE016 Switched to a better way to get links.",
|
||||
"Ok_button": "Ok",
|
||||
|
||||
"cheats_page.cpp":"",
|
||||
|
@ -208,10 +210,10 @@
|
|||
"utils_do": " Do you want to overwrite existing ",
|
||||
"utils_no": "No",
|
||||
"utils_yes": "Yes",
|
||||
"utils_the": "The downloaded file is not a sigpatches archive. This is most likely due to a broken link. If the problem persists after more than 3 hours, please open an issue on Github.",
|
||||
"utils_the_downloaded": "The downloaded file is not a firmware archive. This is most likely due to a broken link. If the problem persists after more than 3 hours, please open an issue on Github.",
|
||||
"utils_the": "The downloaded file is not a sigpatches archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github.",
|
||||
"utils_the_downloaded": "The downloaded file is not a firmware archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github.",
|
||||
"ultils_overwrite": "Do you want to overwrite existing .ini config files?",
|
||||
"ultis_file": "The downloaded file is not a CFW archive. This is most likely due to a broken link. If the problem persists after more than 3 hours, please open an issue on Github.",
|
||||
"ultis_file": "The downloaded file is not a CFW archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github.",
|
||||
|
||||
"reboot_rcm" : "The Switch will now reboot to a special payload in order to finalise the install.",
|
||||
"hekate_dialogue" : "Do you want to also download Hekate?\nIf not, the Switch will now launch reboot to a special payload in order to finalise the install.",
|
||||
|
|
|
@ -6,10 +6,10 @@ using namespace i18n::literals;
|
|||
AmsTab::AmsTab() :
|
||||
brls::List()
|
||||
{
|
||||
std::tuple<std::vector<std::string>, std::vector<std::string>> links;
|
||||
std::vector<std::pair<std::string, std::string>> links;
|
||||
std::string operation = "menus/Getting"_i18n ;
|
||||
this->description = new brls::Label(brls::LabelStyle::DESCRIPTION, "", true);
|
||||
links = fetchLinks(AMS_URL);
|
||||
links = getLinks(AMS_URL);
|
||||
operation += "menus/list_cfw"_i18n ;
|
||||
this->description->setText(
|
||||
"menus/list_ams"_i18n
|
||||
|
@ -19,16 +19,16 @@ AmsTab::AmsTab() :
|
|||
|
||||
|
||||
|
||||
int nbLinks = std::get<0>(links).size();
|
||||
int nbLinks = links.size();
|
||||
if(nbLinks){
|
||||
auto hekate_link = fetchLinks(HEKATE_URL);
|
||||
std::string hekate_url = std::get<1>(hekate_link)[0];
|
||||
std::string text_hekate = "menus/list_down"_i18n + std::get<0>(hekate_link)[0];
|
||||
auto hekate_link = getLinks(HEKATE_URL);
|
||||
std::string hekate_url = links[0].second;
|
||||
std::string text_hekate = "menus/list_down"_i18n + links[0].first;
|
||||
|
||||
for (int i = 0; i<nbLinks; i++){
|
||||
std::string url = std::get<1>(links)[i];
|
||||
std::string text("menus/list_down"_i18n + std::get<0>(links)[i] + "menus/list_from"_i18n + url);
|
||||
listItem = new brls::ListItem(std::get<0>(links)[i]);
|
||||
for (int i = 0; i < nbLinks; i++){
|
||||
std::string url = links[i].second;
|
||||
std::string text("menus/list_down"_i18n + links[i].first + "menus/list_from"_i18n + url);
|
||||
listItem = new brls::ListItem(links[i].first);
|
||||
listItem->setHeight(LISTITEM_HEIGHT);
|
||||
listItem->getClickEvent()->subscribe([&, text, text_hekate, url, hekate_url, operation](brls::View* view) {
|
||||
brls::StagedAppletFrame* stagedFrame = new brls::StagedAppletFrame();
|
||||
|
|
|
@ -85,6 +85,9 @@ ChangelogPage::ChangelogPage() : AppletFrame(true, true)
|
|||
verTitles.push_back("menus/v2_0_1"_i18n );
|
||||
changes.push_back("menus/v2_0_1_text"_i18n );
|
||||
|
||||
verTitles.push_back("2.1.0");
|
||||
changes.push_back("menus/v2_1_0_text"_i18n );
|
||||
|
||||
int nbVersions = verTitles.size();
|
||||
items.reserve(nbVersions);
|
||||
for(int i = nbVersions -1 ; i >= 0; i--){
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
#include "download.hpp"
|
||||
#include "utils.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
#define API_AGENT "HamletDuFromage"
|
||||
#define _1MiB 0x100000
|
||||
|
||||
|
@ -120,42 +118,6 @@ static size_t WriteMemoryCallback2(void *contents, size_t size, size_t nmemb, vo
|
|||
return realsize;
|
||||
}
|
||||
|
||||
|
||||
std::tuple<std::vector<std::string>, std::vector<std::string>> fetchLinks(const char *url){
|
||||
CURL *curl_handle;
|
||||
struct MemoryStruct chunk;
|
||||
|
||||
chunk.memory = static_cast<char *>(malloc(1)); /* will be grown as needed by the realloc above */
|
||||
chunk.size = 0; /* no data at this point */
|
||||
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl_handle = curl_easy_init();
|
||||
curl_easy_setopt(curl_handle, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback2);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, API_AGENT);
|
||||
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L);
|
||||
curl_easy_perform(curl_handle);
|
||||
|
||||
std::tuple <std::vector<std::string>, std::vector<std::string>> links;
|
||||
|
||||
std::string s = std::string(chunk.memory);
|
||||
//<a href=.*?> links
|
||||
//>(?:(?!>).)*?</a> titles
|
||||
auto titles = htmlProcess(s, std::regex(">(?:(?!>).)*?</a>"));
|
||||
std::transform(titles.begin(), titles.end(), titles.begin(),
|
||||
[](std::string s) -> std::string {return s.substr(1, s.size() - 1 - 4);});
|
||||
auto targets = htmlProcess(s, std::regex("<a href=.*?>"));
|
||||
std::transform(targets.begin(), targets.end(), targets.begin(),
|
||||
[](std::string s) -> std::string {return s.substr(8, s.size() - 8 - 1);});
|
||||
links = std::make_tuple(titles, targets);
|
||||
|
||||
curl_easy_cleanup(curl_handle);
|
||||
free(chunk.memory);
|
||||
curl_global_cleanup();
|
||||
return links;
|
||||
}
|
||||
|
||||
std::string fetchTitle(const char *url){
|
||||
CURL *curl_handle;
|
||||
struct MemoryStruct chunk;
|
||||
|
@ -231,8 +193,20 @@ json getRequest(std::string url, std::vector<std::string> headers, std::string b
|
|||
std::string request;
|
||||
request = downloadPage(url.c_str(), headers, body);
|
||||
|
||||
json res = {};
|
||||
bool valid = json::accept(request);
|
||||
if(valid) return json::parse(request);
|
||||
else return json::object();
|
||||
if(json::accept(request)) return json::parse(request);
|
||||
else return json::object();
|
||||
}
|
||||
|
||||
std::vector<std::pair<std::string, std::string>> getLinks(const char *url) {
|
||||
std::string request;
|
||||
request = downloadPage(url);
|
||||
|
||||
nlohmann::ordered_json jason = json::accept(request) ? nlohmann::ordered_json::parse(request) : nlohmann::ordered_json::object();
|
||||
|
||||
std::vector<std::pair<std::string, std::string>> res;
|
||||
for (auto it = jason.begin(); it != jason.end(); ++it) {
|
||||
res.push_back(std::make_pair(it.key(), it.value()));
|
||||
}
|
||||
return res;
|
||||
|
||||
}
|
|
@ -12,16 +12,16 @@ DownloadPayloadPage::DownloadPayloadPage() : AppletFrame(true, true)
|
|||
true
|
||||
);
|
||||
list->addView(label);
|
||||
std::tuple<std::vector<std::string>, std::vector<std::string>> links = fetchLinks(PAYLOAD_URL);
|
||||
int nbLinks = std::get<0>(links).size();
|
||||
|
||||
auto links = getLinks(PAYLOAD_URL);
|
||||
int nbLinks = links.size();
|
||||
if(nbLinks){
|
||||
items.reserve(nbLinks);
|
||||
for (int i = 0; i<nbLinks; i++){
|
||||
std::string url = std::get<1>(links)[i];
|
||||
std::string path = std::string(BOOTLOADER_PL_PATH) + std::get<0>(links)[i];
|
||||
std::string text("menus/Download"_i18n + std::get<0>(links)[i] + "menus/from"_i18n + url);
|
||||
items[i] = new brls::ListItem(std::get<0>(links)[i]);
|
||||
items[i]->getClickEvent()->subscribe([&, text, url, path](brls::View* view) {
|
||||
std::string url = links[i].second;
|
||||
std::string path = std::string(BOOTLOADER_PL_PATH) + links[i].first;
|
||||
std::string text("menus/Download"_i18n + links[i].first + "menus/from"_i18n + url);
|
||||
listItem = new brls::ListItem(links[i].first);
|
||||
listItem->getClickEvent()->subscribe([&, text, url, path](brls::View* view) {
|
||||
createTree(BOOTLOADER_PL_PATH);
|
||||
brls::StagedAppletFrame* stagedFrame = new brls::StagedAppletFrame();
|
||||
stagedFrame->setTitle("menus/getting_paylaod"_i18n );
|
||||
|
@ -36,7 +36,7 @@ DownloadPayloadPage::DownloadPayloadPage() : AppletFrame(true, true)
|
|||
);
|
||||
brls::Application::pushView(stagedFrame);
|
||||
});
|
||||
list->addView(items[i]);
|
||||
list->addView(listItem);
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
|
|
@ -6,7 +6,8 @@ using namespace i18n::literals;
|
|||
ListDownloadTab::ListDownloadTab(archiveType type) :
|
||||
brls::List()
|
||||
{
|
||||
std::tuple<std::vector<std::string>, std::vector<std::string>> links;
|
||||
std::vector<std::pair<std::string, std::string>> links;
|
||||
std::vector<std::pair<std::string, std::string>> sxoslinks;
|
||||
std::string operation = "menus/Getting"_i18n ;
|
||||
std::string firmwareText("menus/firmware_text"_i18n);
|
||||
|
||||
|
@ -16,14 +17,14 @@ ListDownloadTab::ListDownloadTab(archiveType type) :
|
|||
this->description = new brls::Label(brls::LabelStyle::DESCRIPTION, "", true);
|
||||
switch(type){
|
||||
case sigpatches:
|
||||
links = fetchLinks(SIGPATCHES_URL);
|
||||
links = getLinks(SIGPATCHES_URL);
|
||||
operation += "menus/operation_1"_i18n ;
|
||||
this->description->setText(
|
||||
"menus/list_sigpatches"_i18n
|
||||
);
|
||||
break;
|
||||
case fw:
|
||||
links = fetchLinks(FIRMWARE_URL);
|
||||
links = getLinks(FIRMWARE_URL);
|
||||
operation += "menus/operation_2"_i18n ;
|
||||
SetSysFirmwareVersion ver;
|
||||
if (R_SUCCEEDED(setsysGetFirmwareVersion(&ver))) firmwareText += ver.display_version;
|
||||
|
@ -31,12 +32,13 @@ ListDownloadTab::ListDownloadTab(archiveType type) :
|
|||
this->description->setText(firmwareText);
|
||||
break;
|
||||
case app:
|
||||
std::get<0>(links).push_back("menus/list_latest"_i18n );
|
||||
std::get<1>(links).push_back(APP_URL);
|
||||
links.push_back(std::make_pair("menus/list_latest"_i18n, APP_URL));
|
||||
operation += "menus/list_app"_i18n ;
|
||||
break;
|
||||
case cfw:
|
||||
links = fetchLinks(CFW_URL);
|
||||
links = getLinks(CFW_URL);
|
||||
sxoslinks = getLinks(SXOS_URL);
|
||||
links.insert(links.end(), sxoslinks.begin(), sxoslinks.end());
|
||||
operation += "menus/list_cfw"_i18n ;
|
||||
this->description->setText(
|
||||
"menus/list_main"_i18n
|
||||
|
@ -45,16 +47,15 @@ ListDownloadTab::ListDownloadTab(archiveType type) :
|
|||
case cheats:
|
||||
std::string cheatsVer = fetchTitle(CHEATS_RELEASE_URL);
|
||||
if(cheatsVer != "-1"){
|
||||
std::get<0>(links).push_back("menus/list_latest_ver"_i18n + cheatsVer + ")");
|
||||
switch(getCFW()){
|
||||
case sxos:
|
||||
std::get<1>(links).push_back(CHEATS_URL_TITLES);
|
||||
links.push_back(std::make_pair("menus/list_latest_ver"_i18n + cheatsVer + ")", CHEATS_URL_TITLES));
|
||||
break;
|
||||
case ams:
|
||||
std::get<1>(links).push_back(CHEATS_URL_CONTENTS);
|
||||
links.push_back(std::make_pair("menus/list_latest_ver"_i18n + cheatsVer + ")", CHEATS_URL_CONTENTS));
|
||||
break;
|
||||
case rnx:
|
||||
std::get<1>(links).push_back(CHEATS_URL_CONTENTS);
|
||||
links.push_back(std::make_pair("menus/list_latest_ver"_i18n + cheatsVer + ")", CHEATS_URL_CONTENTS));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -66,12 +67,12 @@ ListDownloadTab::ListDownloadTab(archiveType type) :
|
|||
|
||||
this->addView(description);
|
||||
|
||||
int nbLinks = std::get<0>(links).size();
|
||||
int nbLinks = links.size();
|
||||
if(nbLinks){
|
||||
for (int i = 0; i<nbLinks; i++){
|
||||
std::string url = std::get<1>(links)[i];
|
||||
std::string text("menus/list_down"_i18n + std::get<0>(links)[i] + "menus/list_from"_i18n + url);
|
||||
listItem = new brls::ListItem(std::get<0>(links)[i]);
|
||||
std::string url = links[i].second;
|
||||
std::string text("menus/list_down"_i18n + links[i].first + "menus/list_from"_i18n + url);
|
||||
listItem = new brls::ListItem(links[i].first);
|
||||
listItem->setHeight(LISTITEM_HEIGHT);
|
||||
listItem->getClickEvent()->subscribe([&, text, url, type, operation](brls::View* view) {
|
||||
brls::StagedAppletFrame* stagedFrame = new brls::StagedAppletFrame();
|
||||
|
|
Loading…
Reference in a new issue