diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/Youtube.cpp | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/src/plugins/Youtube.cpp b/src/plugins/Youtube.cpp index c82fdbe..3fd2a0f 100644 --- a/src/plugins/Youtube.cpp +++ b/src/plugins/Youtube.cpp @@ -4,27 +4,6 @@ #include <string.h> namespace QuickMedia { - static bool begins_with(const char *str, const char *begin_with) { - return strncmp(str, begin_with, strlen(begin_with)) == 0; - } - - static bool contains(const char *str, const char *substr) { - return strstr(str, substr); - } - - static void iterate_suggestion_result(const Json::Value &value, BodyItems &result_items, int &iterate_count) { - ++iterate_count; - if(value.isArray()) { - for(const Json::Value &child : value) { - iterate_suggestion_result(child, result_items, iterate_count); - } - } else if(value.isString() && iterate_count > 2) { - std::string title = value.asString(); - auto item = std::make_unique<BodyItem>(title); - result_items.push_back(std::move(item)); - } - } - static size_t find_end_of_json(const std::string &website_data, size_t data_start) { int brace_count = 0; char string_char = '\0'; @@ -58,105 +37,6 @@ namespace QuickMedia { // TODO: Speed this up by using string.find instead of parsing html SuggestionResult Youtube::update_search_suggestions(const std::string &text, BodyItems &result_items) { - // Keep this for backup. This is using search suggestion the same way youtube does it, but the results - // are not as good as doing an actual search. - #if 0 - std::string url = "https://clients1.google.com/complete/search?client=youtube&hl=en&gs_rn=64&gs_ri=youtube&ds=yt&cp=7&gs_id=x&q="; - url += url_param_encode(text); - - std::string server_response; - if(download_to_string(url, server_response, {}, use_tor, true) != DownloadResult::OK) - return SuggestionResult::NET_ERR; - - size_t json_start = server_response.find_first_of('('); - if(json_start == std::string::npos) - return SuggestionResult::ERR; - ++json_start; - - size_t json_end = server_response.find_last_of(')'); - if(json_end == std::string::npos) - return SuggestionResult::ERR; - - if(json_end == 0 || json_start >= json_end) - return SuggestionResult::ERR; - - Json::Value json_root; - Json::CharReaderBuilder json_builder; - std::unique_ptr<Json::CharReader> json_reader(json_builder.newCharReader()); - std::string json_errors; - if(!json_reader->parse(&server_response[json_start], &server_response[json_end], &json_root, &json_errors)) { - fprintf(stderr, "Youtube suggestions json error: %s\n", json_errors.c_str()); - return SuggestionResult::ERR; - } - - int iterate_count = 0; - iterate_suggestion_result(json_root, result_items, iterate_count); - bool found_search_text = false; - for(auto &item : result_items) { - if(item->title == text) { - found_search_text = true; - break; - } - } - if(!found_search_text) - result_items.insert(result_items.begin(), std::make_unique<BodyItem>(text)); - return SuggestionResult::OK; - #elif 0 - std::string url = "https://youtube.com/results?search_query="; - url += url_param_encode(text); - - std::string website_data; - if(download_to_string(url, website_data, {}, use_tor, true) != DownloadResult::OK) - return SuggestionResult::NET_ERR; - - struct ItemData { - BodyItems *result_items; - size_t index; - }; - ItemData item_data = { &result_items, 0 }; - - 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, "//h3[class=\"yt-lockup-title\"]/a", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *result_items = (BodyItems*)userdata; - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - const char *title = quickmedia_html_node_get_attribute_value(node, "title"); - // Checking for watch?v helps skipping ads - if(href && title && begins_with(href, "/watch?v=")) { - auto item = std::make_unique<BodyItem>(strip(title)); - item->url = std::string("https://www.youtube.com") + href; - result_items->push_back(std::move(item)); - } - }, &result_items); - if(result != 0) - goto cleanup; - - result = quickmedia_html_find_nodes_xpath(&html_search, "//span[class=\"yt-thumb-simple\"]//img", - [](QuickMediaHtmlNode *node, void *userdata) { - ItemData *item_data = (ItemData*)userdata; - if(item_data->index >= item_data->result_items->size()) - return; - - const char *src = quickmedia_html_node_get_attribute_value(node, "src"); - const char *data_thumb = quickmedia_html_node_get_attribute_value(node, "data-thumb"); - - if(src && contains(src, "i.ytimg.com/")) { - (*item_data->result_items)[item_data->index]->thumbnail_url = src; - ++item_data->index; - } else if(data_thumb && contains(data_thumb, "i.ytimg.com/")) { - (*item_data->result_items)[item_data->index]->thumbnail_url = data_thumb; - ++item_data->index; - } - }, &item_data); - - cleanup: - quickmedia_html_search_deinit(&html_search); - return result == 0 ? SuggestionResult::OK : SuggestionResult::ERR; - #else std::string url = "https://youtube.com/results?search_query="; url += url_param_encode(text); @@ -255,7 +135,6 @@ namespace QuickMedia { } return SuggestionResult::OK; - #endif } static std::string get_playlist_id_from_url(const std::string &url) { @@ -307,85 +186,6 @@ namespace QuickMedia { // TODO: Make this faster by using string search instead of parsing html. // TODO: If the result is a play BodyItems Youtube::get_related_media(const std::string &url) { - #if 0 - BodyItems result_items; - struct ItemData { - BodyItems &result_items; - size_t index = 0; - }; - ItemData item_data { result_items, 0 }; - - std::string modified_url = remove_index_from_playlist_url(url); - std::string playlist_id = get_playlist_id_from_url(modified_url); - if(playlist_id == last_related_media_playlist_id) { - result_items.reserve(last_playlist_data.size()); - for(auto &data : last_playlist_data) { - result_items.push_back(std::make_unique<BodyItem>(*data)); - } - return result_items; - } - - std::string website_data; - if(download_to_string(modified_url, website_data, {}, use_tor, false) != DownloadResult::OK) - return result_items; - - QuickMediaHtmlSearch html_search; - int result = quickmedia_html_search_init(&html_search, website_data.c_str()); - if(result != 0) - goto cleanup; - - if(!playlist_id.empty()) { - result = quickmedia_html_find_nodes_xpath(&html_search, "//a", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (ItemData*)userdata; - const char *node_class = quickmedia_html_node_get_attribute_value(node, "class"); - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - if(node_class && href && contains(node_class, "playlist-video")) { - auto item = std::make_unique<BodyItem>(""); - item->url = std::string("https://www.youtube.com") + remove_index_from_playlist_url(href); - item_data->result_items.push_back(std::move(item)); - } - }, &item_data); - - result = quickmedia_html_find_nodes_xpath(&html_search, "//li", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (ItemData*)userdata; - if(item_data->index >= item_data->result_items.size()) - return; - - // TODO: Also add title for related media. This data is in @data-title - const char *data_thumbnail_url = quickmedia_html_node_get_attribute_value(node, "data-thumbnail-url"); - if(data_thumbnail_url && contains(data_thumbnail_url, "ytimg.com")) { - item_data->result_items[item_data->index]->thumbnail_url = data_thumbnail_url; - ++item_data->index; - } - }, &item_data); - } - - // We want non-playlist videos every when there is a playlist, since we want to play non-playlist videos after - // playing all playlist videos - result = quickmedia_html_find_nodes_xpath(&html_search, "//ul[class=\"video-list\"]//div[class=\"content-wrapper\"]/a", - [](QuickMediaHtmlNode *node, void *userdata) { - auto *item_data = (ItemData*)userdata; - const char *href = quickmedia_html_node_get_attribute_value(node, "href"); - // TODO: Also add title for related media and thumbnail - if(href && begins_with(href, "/watch?v=")) { - auto item = std::make_unique<BodyItem>(""); - item->url = std::string("https://www.youtube.com") + href; - item_data->result_items.push_back(std::move(item)); - } - }, &item_data); - - cleanup: - last_playlist_data.clear(); - last_playlist_data.reserve(result_items.size()); - for(auto &data : result_items) { - last_playlist_data.push_back(std::make_unique<BodyItem>(*data)); - } - last_related_media_playlist_id = playlist_id; - quickmedia_html_search_deinit(&html_search); - return result_items; - #elif 1 BodyItems result_items; std::string modified_url = remove_index_from_playlist_url(url); @@ -471,6 +271,5 @@ namespace QuickMedia { } return result_items; - #endif } }
\ No newline at end of file |