Manga.hpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #pragma once
  2. #include "Page.hpp"
  3. #include <functional>
  4. namespace QuickMedia {
  5. // Return false to stop iteration
  6. using PageCallback = std::function<bool(const std::string &url)>;
  7. enum class CreatorType {
  8. AUTHOR,
  9. ARTIST
  10. };
  11. struct Creator {
  12. std::string name;
  13. std::string url;
  14. CreatorType creator_type;
  15. };
  16. class MangaImagesPage : public Page {
  17. public:
  18. MangaImagesPage(Program *program, std::string manga_name, std::string chapter_name, std::string url, std::string thumbnail_url) :
  19. Page(program), manga_name(std::move(manga_name)), thumbnail_url(std::move(thumbnail_url)), chapter_name(std::move(chapter_name)), url(std::move(url)), chapter_num_pages(-1) {}
  20. virtual ~MangaImagesPage() = default;
  21. const char* get_title() const override { return chapter_name.c_str(); }
  22. PageTypez get_type() const override { return PageTypez::MANGA_IMAGES; }
  23. virtual ImageResult update_image_urls(int &num_images) = 0;
  24. virtual ImageResult for_each_page_in_chapter(PageCallback callback) = 0;
  25. virtual void change_chapter(std::string new_chapter_name, std::string new_url) {
  26. chapter_name = std::move(new_chapter_name);
  27. if(url != new_url) {
  28. url = std::move(new_url);
  29. chapter_image_urls.clear();
  30. chapter_num_pages = -1;
  31. }
  32. }
  33. const std::string& get_chapter_name() const { return chapter_name; }
  34. const std::string& get_url() const { return url; }
  35. // TODO: Remove and use plugin name instead
  36. virtual const char* get_service_name() const = 0;
  37. virtual const char* get_website_url() const = 0;
  38. virtual bool is_local() { return false; }
  39. const std::string manga_name;
  40. const std::string thumbnail_url;
  41. protected:
  42. std::string chapter_name;
  43. std::string url;
  44. std::vector<std::string> chapter_image_urls;
  45. int chapter_num_pages;
  46. };
  47. class MangaChaptersPage : public Page, public TrackablePage {
  48. public:
  49. MangaChaptersPage(Program *program, std::string manga_name, std::string manga_url, const std::string &thumbnail_url) :
  50. Page(program), TrackablePage(std::move(manga_name), std::move(manga_url)), thumbnail_url(thumbnail_url) {}
  51. const char* get_title() const override { return content_title.c_str(); }
  52. TrackResult track(const std::string &str) override;
  53. void on_navigate_to_page(Body *body) override;
  54. bool is_trackable() const override { return true; }
  55. std::shared_ptr<BodyItem> get_bookmark_body_item(BodyItem *selected_item) override;
  56. protected:
  57. virtual bool extract_id_from_url(const std::string &url, std::string &manga_id) const = 0;
  58. virtual const char* get_service_name() const = 0;
  59. std::string thumbnail_url;
  60. };
  61. }