MediaGeneric.hpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #pragma once
  2. #include "Page.hpp"
  3. #include <functional>
  4. namespace QuickMedia {
  5. struct MediaSearchQuery {
  6. const char *search_template = nullptr;
  7. int page_start = 0;
  8. };
  9. // If |url_contains| is null, then any matching query is added. If |title_field| is "text", then the inner text is used.
  10. // If |url_field| is null, then the current page is used instead.
  11. struct MediaTextQuery {
  12. const char *html_query = nullptr;
  13. const char *title_field = nullptr;
  14. const char *url_field = nullptr;
  15. const char *url_contains = nullptr;
  16. };
  17. struct MediaThumbnailQuery {
  18. const char *html_query = nullptr;
  19. const char *field_name = nullptr;
  20. const char *field_contains = nullptr;
  21. };
  22. struct MediaRelatedItem {
  23. std::string title;
  24. std::string url;
  25. std::string thumbnail_url;
  26. };
  27. using MediaVideoUrlCustomHandler = std::function<std::string(const std::string &html_source)>;
  28. using MediaRelatedCustomHandler = std::function<std::vector<MediaRelatedItem>(const std::string &html_source)>;
  29. class MediaGenericSearchPage : public Page {
  30. friend class MediaGenericVideoPage;
  31. public:
  32. MediaGenericSearchPage(Program *program, const char *website_url, mgl::vec2i thumbnail_max_size, bool cloudflare_bypass, std::vector<CommandArg> extra_commands = {});
  33. const char* get_title() const override { return "Search"; }
  34. bool search_is_filter() override { return false; }
  35. SearchResult search(const std::string &str, BodyItems &result_items) override;
  36. PluginResult get_page(const std::string &str, int page, BodyItems &result_items) override;
  37. PluginResult submit(const SubmitArgs &args, std::vector<Tab> &result_tabs) override;
  38. PluginResult get_related_media(const std::string &url, BodyItems &result_items);
  39. // Add a %s where the search query should be inserted into |search_template| and add a %p where the page number should be inserted, for example:
  40. // example.com/search?q=%s&page=%p
  41. // This is required.
  42. MediaGenericSearchPage& search_handler(const char *search_template, int page_start);
  43. // This is required.
  44. MediaGenericSearchPage& text_handler(std::vector<MediaTextQuery> queries);
  45. // This is optional.
  46. MediaGenericSearchPage& thumbnail_handler(std::vector<MediaThumbnailQuery> queries);
  47. // This is optional. Youtube-dl (or yt-dlp) is used instead if this is not used.
  48. MediaGenericSearchPage& video_url_custom_handler(MediaVideoUrlCustomHandler handler);
  49. // This is optional.
  50. MediaGenericSearchPage& related_media_text_handler(std::vector<MediaTextQuery> queries);
  51. // This is optional.
  52. MediaGenericSearchPage& related_media_thumbnail_handler(std::vector<MediaThumbnailQuery> queries);
  53. // This is optional.
  54. MediaGenericSearchPage& related_media_custom_handler(MediaRelatedCustomHandler handler);
  55. private:
  56. std::string website_url;
  57. mgl::vec2i thumbnail_max_size;
  58. MediaSearchQuery search_query;
  59. std::vector<MediaTextQuery> text_queries;
  60. std::vector<MediaThumbnailQuery> thumbnail_queries;
  61. MediaVideoUrlCustomHandler video_custom_handler = nullptr;
  62. std::vector<MediaTextQuery> related_media_text_queries;
  63. std::vector<MediaThumbnailQuery> related_media_thumbnail_queries;
  64. MediaRelatedCustomHandler related_custom_handler = nullptr;
  65. bool cloudflare_bypass = false;
  66. std::vector<CommandArg> extra_commands;
  67. };
  68. class MediaGenericRelatedPage : public RelatedVideosPage {
  69. public:
  70. MediaGenericRelatedPage(Program *program, MediaGenericSearchPage *search_page) : RelatedVideosPage(program), search_page(search_page) {}
  71. PluginResult submit(const SubmitArgs &args, std::vector<Tab> &result_tabs) override;
  72. private:
  73. MediaGenericSearchPage *search_page;
  74. };
  75. class MediaGenericVideoPage : public VideoPage {
  76. public:
  77. MediaGenericVideoPage(Program *program, MediaGenericSearchPage *search_page, const std::string &url) :
  78. VideoPage(program, url), search_page(search_page) {}
  79. const char* get_title() const override { return ""; }
  80. BodyItems get_related_media(const std::string &url) override;
  81. PluginResult get_related_pages(const BodyItems &related_videos, const std::string &channel_url, std::vector<Tab> &result_tabs) override;
  82. std::string get_download_url(int max_height) override;
  83. std::string get_video_url(int max_height, bool &has_embedded_audio, std::string &ext) override;
  84. PluginResult load(const SubmitArgs &args, VideoInfo &video_info, std::string &err_str) override;
  85. private:
  86. MediaGenericSearchPage *search_page;
  87. std::string video_url;
  88. };
  89. }