aboutsummaryrefslogtreecommitdiff
path: root/src/DownloadUtils.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-06-25 12:44:53 +0200
committerdec05eba <dec05eba@protonmail.com>2021-06-25 12:44:53 +0200
commit38202de4f953fca28aa884246ced0aadf0d25a4d (patch)
tree7a0a35a32404f1929238444d13a6c626856cc791 /src/DownloadUtils.cpp
parent738f2b1a89a5445a1f0f94229f2fc0637b7c4e71 (diff)
Add a http server proxy for better youtube downloading (bypassing rate limit cased by http range header). Fix youtube live streams
Diffstat (limited to 'src/DownloadUtils.cpp')
-rw-r--r--src/DownloadUtils.cpp22
1 files changed, 8 insertions, 14 deletions
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)