aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Mangatown.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Mangatown.cpp')
-rw-r--r--src/plugins/Mangatown.cpp104
1 files changed, 41 insertions, 63 deletions
diff --git a/src/plugins/Mangatown.cpp b/src/plugins/Mangatown.cpp
index 04a1049..4db1ebc 100644
--- a/src/plugins/Mangatown.cpp
+++ b/src/plugins/Mangatown.cpp
@@ -139,65 +139,30 @@ namespace QuickMedia {
return true;
}
- ImageResult MangatownImagesPage::get_number_of_images(int &num_images) {
- num_images = 0;
- ImageResult image_result = get_image_urls_for_chapter(url);
- if(image_result != ImageResult::OK)
- return image_result;
-
- num_images = chapter_image_urls.size();
- return ImageResult::OK;
- }
-
- ImageResult MangatownImagesPage::for_each_page_in_chapter(PageCallback callback) {
- int num_pages;
- ImageResult image_result = get_number_of_images(num_pages);
- if(image_result != ImageResult::OK)
- return image_result;
-
- for(const std::string &full_url : chapter_image_urls) {
- std::string image_src;
- std::string website_data;
- if(download_to_string_cache(full_url, website_data, {}, true) != DownloadResult::OK)
- break;
-
- QuickMediaHtmlSearch html_search;
- int result = quickmedia_html_search_init(&html_search, website_data.c_str());
- if(result != 0)
- goto cleanup;
-
- result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='viewer']//img",
- [](QuickMediaHtmlNode *node, void *userdata) {
- std::string *image_src = (std::string*)userdata;
- const char *src = quickmedia_html_node_get_attribute_value(node, "src");
- if(src && strstr(src, "/store/manga/")) {
- if(strncmp(src, "//", 2) == 0)
- *image_src = strip(src + 2);
- else
- *image_src = strip(src);
- }
- }, &image_src);
-
- cleanup:
- quickmedia_html_search_deinit(&html_search);
-
- if(result != 0)
- return ImageResult::ERR;
-
- if(image_src.empty())
- break;
-
- if(!callback(image_src))
- break;
- }
-
- return ImageResult::OK;
+ // First page = 0
+ static std::string first_image_url_to_page_image_url(const std::string &image_url, int page) {
+ size_t slash_index = image_url.rfind('/');
+ if(slash_index == std::string::npos)
+ return "";
+
+ size_t dot_index = image_url.rfind('.');
+ if(dot_index == std::string::npos || dot_index <= slash_index)
+ return "";
+
+ std::string filename_without_ext = image_url.substr(slash_index + 1, dot_index - (slash_index + 1));
+ if(!filename_without_ext.empty() && filename_without_ext.back() == '1')
+ ++page;
+
+ std::string page_str = std::to_string(page);
+ if(page_str.size() > filename_without_ext.size())
+ return "";
+
+ filename_without_ext.replace(filename_without_ext.size() - page_str.size(), page_str.size(), page_str);
+ return image_url.substr(0, slash_index) + '/' + filename_without_ext + image_url.substr(dot_index);
}
- ImageResult MangatownImagesPage::get_image_urls_for_chapter(const std::string &url) {
- if(!chapter_image_urls.empty())
- return ImageResult::OK;
-
+ ImageResult MangatownImagesPage::get_page_image_urls(std::vector<std::string> &urls) {
+ std::string image_src;
int num_pages = 0;
std::string website_data;
@@ -209,6 +174,21 @@ namespace QuickMedia {
if(result != 0)
goto cleanup;
+ result = quickmedia_html_find_nodes_xpath(&html_search, "//div[id='viewer']//img",
+ [](QuickMediaHtmlNode *node, void *userdata) {
+ std::string *image_src = (std::string*)userdata;
+ const char *src = quickmedia_html_node_get_attribute_value(node, "src");
+ if(src && strstr(src, "/store/manga/")) {
+ if(strncmp(src, "//", 2) == 0)
+ *image_src = strip(src + 2);
+ else
+ *image_src = strip(src);
+ }
+ }, &image_src);
+
+ if(result != 0 || image_src.empty())
+ goto cleanup;
+
result = quickmedia_html_find_nodes_xpath(&html_search, "//div[class='page_select']//option",
[](QuickMediaHtmlNode *node, void *userdata) {
int *last_num_pages = (int*)userdata;
@@ -225,15 +205,13 @@ namespace QuickMedia {
cleanup:
quickmedia_html_search_deinit(&html_search);
- if(result != 0) {
- chapter_image_urls.clear();
- return ImageResult::ERR;
- }
- if(num_pages == 0)
+ if(result != 0 || image_src.empty() || num_pages == 0)
return ImageResult::ERR;
+
for(int i = 0; i < num_pages; ++i) {
- chapter_image_urls.push_back(url + std::to_string(1 + i) + ".html");
+ urls.push_back(first_image_url_to_page_image_url(image_src, i));
}
+
return ImageResult::OK;
}
} \ No newline at end of file