From 38202de4f953fca28aa884246ced0aadf0d25a4d Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 25 Jun 2021 12:44:53 +0200 Subject: Add a http server proxy for better youtube downloading (bypassing rate limit cased by http range header). Fix youtube live streams --- src/DownloadUtils.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'src/DownloadUtils.cpp') diff --git a/src/DownloadUtils.cpp b/src/DownloadUtils.cpp index 5ab79bb..5be1990 100644 --- a/src/DownloadUtils.cpp +++ b/src/DownloadUtils.cpp @@ -29,19 +29,13 @@ namespace QuickMedia { return 0; } - // Returns 0 if content length is not found - static long get_content_length(const std::string &header) { - std::string content_length_str = header_extract_value(header, "content-length"); - if(content_length_str.empty()) - return 0; - - errno = 0; - char *endptr; - const long content_length_num = strtol(content_length_str.c_str(), &endptr, 10); - if(endptr != content_length_str.c_str() && errno == 0) - return content_length_num; + static bool http_is_redirect(const std::string &header, size_t size) { + size_t end_of_first_line = header.find("\r\n"); + if(end_of_first_line == std::string::npos) + return false; - return 0; + size_t find_index = header.find(" 30"); + return find_index != std::string::npos && find_index < size; } static int accumulate_string_with_header(char *data, int size, void *userdata) { @@ -55,9 +49,9 @@ namespace QuickMedia { size_t end_of_headers_index = download_userdata->header->find("\r\n\r\n"); if(end_of_headers_index != std::string::npos) { while(true) { - const long content_length = get_content_length(download_userdata->header->substr(0, end_of_headers_index)); // TODO: Do not create a copy of the header string + const bool is_redirect = http_is_redirect(*download_userdata->header, end_of_headers_index); end_of_headers_index += 4; - if(content_length == 0 && download_userdata->header->size() - end_of_headers_index > 0) { + if(is_redirect && download_userdata->header->size() - end_of_headers_index > 0) { download_userdata->header->erase(download_userdata->header->begin(), download_userdata->header->begin() + end_of_headers_index); end_of_headers_index = download_userdata->header->find("\r\n\r\n"); if(end_of_headers_index == std::string::npos) -- cgit v1.2.3