aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-07-16 07:31:02 +0200
committerdec05eba <dec05eba@protonmail.com>2021-07-16 07:31:02 +0200
commitb09d1e70661226697e2441c18ea6ff59c387fb93 (patch)
tree66f75dbc0237407912c522a54c7a46f9987f4642 /src/plugins
parent2167a32f3730e569a636d9b041122558aceb89f1 (diff)
Add sorting options to nyaa.si
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Matrix.cpp18
-rw-r--r--src/plugins/NyaaSi.cpp82
2 files changed, 88 insertions, 12 deletions
diff --git a/src/plugins/Matrix.cpp b/src/plugins/Matrix.cpp
index 17bc17b..7439bf6 100644
--- a/src/plugins/Matrix.cpp
+++ b/src/plugins/Matrix.cpp
@@ -81,13 +81,14 @@ namespace QuickMedia {
}
}
- static void remove_body_item_by_url(BodyItems &body_items, const std::string &url) {
- for(auto it = body_items.begin(); it != body_items.end();) {
- if((*it)->url == url)
- it = body_items.erase(it);
- else
- ++it;
+ static bool remove_body_item_by_url(BodyItems &body_items, const std::string &url) {
+ for(auto it = body_items.begin(); it != body_items.end(); ++it) {
+ if((*it)->url == url) {
+ body_items.erase(it);
+ return true;
+ }
}
+ return false;
}
static int color_hash_code(const std::string &str) {
@@ -873,7 +874,10 @@ namespace QuickMedia {
}
void MatrixInvitesPage::remove_body_item_by_room_id(const std::string &room_id) {
- remove_body_item_by_url(body->items, room_id);
+ if(remove_body_item_by_url(body->items, room_id)) {
+ prev_invite_count = body->items.size();
+ title = "Invites (" + std::to_string(body->items.size()) + ")";
+ }
}
void MatrixInvitesPage::clear_data() {
diff --git a/src/plugins/NyaaSi.cpp b/src/plugins/NyaaSi.cpp
index d4667af..0202322 100644
--- a/src/plugins/NyaaSi.cpp
+++ b/src/plugins/NyaaSi.cpp
@@ -107,11 +107,55 @@ namespace QuickMedia {
return time_str;
}
+ static const std::array<const char*, 10> sort_type_names = {
+ "Size desc 🡇",
+ "Uploaded date desc 🡇",
+ "Seeders desc 🡇",
+ "Leechers desc 🡇",
+ "Downloads desc 🡇",
+
+ "Size asc 🡅",
+ "Uploaded date asc 🡅",
+ "Seeders asc 🡅",
+ "Leechers asc 🡅",
+ "Downloads asc 🡅"
+ };
+
+ static const std::array<const char*, 10> sort_params = {
+ "s=size&o=desc",
+ "s=id&o=desc",
+ "s=seeders&o=desc",
+ "s=leechers&o=desc",
+ "s=downloads&o=desc",
+
+ "s=size&o=asc",
+ "s=id&o=asc",
+ "s=seeders&o=asc",
+ "s=leechers&o=asc",
+ "s=downloads&o=asc",
+ };
+
+ static std::shared_ptr<BodyItem> create_sort_body_item(const std::string &title, NyaaSiSortType sort_type) {
+ auto body_item = BodyItem::create(title);
+ body_item->userdata = (void*)sort_type;
+ return body_item;
+ }
+
+ static void sort_page_create_body_items(BodyItems &body_items, NyaaSiSortType sort_type) {
+ for(size_t i = 0; i < sort_type_names.size(); ++i) {
+ std::string prefix = " ";
+ if((NyaaSiSortType)i == sort_type)
+ prefix = "* ";
+ body_items.push_back(create_sort_body_item(prefix + sort_type_names[i], (NyaaSiSortType)i));
+ }
+ }
+
// TODO: Also show the number of comments for each torrent. TODO: Optimize?
// TODO: Show each field as seperate columns instead of seperating by |
- static SearchResult search_page(const std::string &domain, const std::string &list_url, const std::string &text, int page, BodyItems &result_items) {
+ static SearchResult search_page(const std::string &domain, const std::string &list_url, const std::string &text, int page, NyaaSiSortType sort_type, BodyItems &result_items) {
std::string full_url = "https://" + domain + "/?c=" + list_url + "&f=0&p=" + std::to_string(page) + "&q=";
full_url += url_param_encode(text);
+ full_url += std::string("&") + sort_params[(size_t)sort_type];
std::string website_data;
if(download_to_string(full_url, website_data, {}, true) != DownloadResult::OK)
@@ -251,21 +295,34 @@ namespace QuickMedia {
std::string domain = is_sukebei ? "sukebei.nyaa.si" : "nyaa.si";
BodyItems result_items;
- SearchResult search_result = search_page(domain, url, "", 1, result_items);
+ SearchResult search_result = search_page(domain, url, "", 1, NyaaSiSortType::UPLOAD_DATE_DESC, result_items);
if(search_result != SearchResult::OK) return search_result_to_plugin_result(search_result);
+ auto search_page = std::make_unique<NyaaSiSearchPage>(program, strip(title), url, std::move(domain));
+ NyaaSiSearchPage *search_page_p = search_page.get();
auto body = create_body();
body->items = std::move(result_items);
- result_tabs.push_back(Tab{std::move(body), std::make_unique<NyaaSiSearchPage>(program, strip(title), url, std::move(domain)), create_search_bar("Search...", 500)});
+ result_tabs.push_back(Tab{std::move(body), std::move(search_page), create_search_bar("Search...", 500)});
+
+ auto sort_order_page_body = create_body();
+ Body *sort_order_page_body_p = sort_order_page_body.get();
+ sort_page_create_body_items(sort_order_page_body->items, NyaaSiSortType::UPLOAD_DATE_DESC);
+ result_tabs.push_back(Tab{std::move(sort_order_page_body), std::make_unique<NyaaSiSortOrderPage>(program, sort_order_page_body_p, search_page_p), nullptr});
return PluginResult::OK;
}
+ NyaaSiSearchPage::NyaaSiSearchPage(Program *program, std::string category_name, std::string category_id, std::string domain) :
+ Page(program), category_name(std::move(category_name)), category_id(std::move(category_id)), domain(std::move(domain))
+ {
+ set_sort_type(NyaaSiSortType::UPLOAD_DATE_DESC);
+ }
+
SearchResult NyaaSiSearchPage::search(const std::string &str, BodyItems &result_items) {
- return search_page(domain, category_id, str, 1, result_items);
+ return search_page(domain, category_id, str, 1, sort_type, result_items);
}
PluginResult NyaaSiSearchPage::get_page(const std::string &str, int page, BodyItems &result_items) {
- return search_result_to_plugin_result(search_page(domain, category_id, str, 1 + page, result_items));
+ return search_result_to_plugin_result(search_page(domain, category_id, str, 1 + page, sort_type, result_items));
}
struct ResultItemExtra {
@@ -441,6 +498,21 @@ namespace QuickMedia {
return PluginResult::OK;
}
+ void NyaaSiSearchPage::set_sort_type(NyaaSiSortType sort_type) {
+ this->sort_type = sort_type;
+ title = category_name + " | " + sort_type_names[(size_t)sort_type];
+ title.erase(title.end() - 5, title.end()); // Erase emoji character and space at the end. TODO: Remove this when tabs support emojis.
+ }
+
+ PluginResult NyaaSiSortOrderPage::submit(const std::string&, const std::string&, std::vector<Tab>&) {
+ const NyaaSiSortType sort_type = (NyaaSiSortType)(size_t)submit_body_item->userdata;
+ body->items.clear();
+ sort_page_create_body_items(body->items, sort_type);
+ search_page->set_sort_type(sort_type);
+ search_page->needs_refresh = true;
+ return PluginResult::OK;
+ }
+
PluginResult NyaaSiTorrentPage::submit(const std::string &title, const std::string &url, std::vector<Tab> &result_tabs) {
(void)title;
(void)result_tabs;