diff options
author | dec05eba <dec05eba@protonmail.com> | 2021-05-11 14:57:45 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-05-11 14:57:45 +0200 |
commit | 8d08b8f3d4a627c3190c485bf43690e414862d83 (patch) | |
tree | 0cc2ec792fe5fcf80051f7cd6f9dffc868e0eb0c /src/DownloadUtils.cpp | |
parent | 93484ecf081fcb57313fa5d161cd90dccee0dc9e (diff) |
Youtube-dl cant properly extract remote file name, use our own extraction code when not using mpv. Fix close button not working for download menu
Diffstat (limited to 'src/DownloadUtils.cpp')
-rw-r--r-- | src/DownloadUtils.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/DownloadUtils.cpp b/src/DownloadUtils.cpp index 248fda0..a054454 100644 --- a/src/DownloadUtils.cpp +++ b/src/DownloadUtils.cpp @@ -49,6 +49,79 @@ namespace QuickMedia { return DownloadResult::OK; } + DownloadResult url_get_remote_name(const std::string &url, std::string &result, bool use_browser_useragent) { + sf::Clock timer; + std::vector<const char*> args; + args.insert(args.end(), { "curl", "-I", "-g", "-H", "Accept-Language: en-US,en;q=0.5", "-H", "Connection: keep-alive", "--compressed", "-s" }); + if(use_browser_useragent) { + args.push_back("-H"); + args.push_back(useragent_str); + } + args.push_back("--"); + args.push_back(url.c_str()); + args.push_back(nullptr); + if(debug_download) { + for(const char *arg : args) { + if(arg) + fprintf(stderr, "'%s' ", arg); + } + fprintf(stderr, "\n"); + } + std::string header; + if(exec_program(args.data(), accumulate_string, &header) != 0) + return DownloadResult::NET_ERR; + fprintf(stderr, "Download duration for %s: %d ms\n", url.c_str(), timer.getElapsedTime().asMilliseconds()); + + std::string content_disposition = header_extract_value(header, "content-disposition"); + if(content_disposition.empty()) { + size_t filename_start = url.rfind('/'); + if(filename_start == std::string::npos) { + result = ""; + return DownloadResult::OK; + } + + ++filename_start; + size_t filename_end = url.size(); + for(size_t i = filename_start; i < url.size(); ++i) { + char c = url[i]; + if(c == '/' || c == '&' || c == '?') { + filename_end = i; + break; + } + } + + result = url.substr(filename_start, filename_end - filename_start); + return DownloadResult::OK; + } else { + size_t filename_start = content_disposition.find("filename="); + if(filename_start == std::string::npos) { + result = ""; + return DownloadResult::OK; + } + + filename_start += 9; + for(size_t i = filename_start; i < content_disposition.size(); ++i) { + char c = content_disposition[i]; + if(c != '"' && c != ' ') { + filename_start = i; + break; + } + } + + size_t filename_end = content_disposition.size(); + for(int i = filename_end - 1; i >= (int)filename_start; --i) { + char c = content_disposition[i]; + if(c != '"' && c != ' ' && c != '\n' && c != '\r') { + filename_end = i + 1; + break; + } + } + + result = content_disposition.substr(filename_start, filename_end - filename_start); + return DownloadResult::OK; + } + } + // TODO: Add timeout DownloadResult download_to_string(const std::string &url, std::string &result, const std::vector<CommandArg> &additional_args, bool use_browser_useragent, bool fail_on_error) { sf::Clock timer; |