From ff62f167656f035868ae87f6596b45a557e3ebfe Mon Sep 17 00:00:00 2001 From: samsamsam Date: Fri, 15 Mar 2019 21:03:18 +0100 Subject: [PATCH] Allow to use Netscape cookie file with option -C --- src/curl.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- src/curl.h | 1 + src/hls.c | 11 +++++++++++ src/misc.c | 10 +++++++--- src/misc.h | 2 ++ 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/curl.c b/src/curl.c index 5334f03..5aac15a 100755 --- a/src/curl.c +++ b/src/curl.c @@ -3,6 +3,7 @@ #include #include +#include #include #include #include "msg.h" @@ -14,6 +15,8 @@ struct http_session { void *headers; char *user_agent; char *proxy_uri; + char *cookie_file; + void *cookie_file_mutex; long speed_limit; long speed_time; }; @@ -116,6 +119,22 @@ void * set_proxy_uri_http_session(void *ptr_session, const char *proxy_uri) return session; } +void * set_cookie_file_session(void *ptr_session, const char *cookie_file, void *cookie_file_mutex) +{ + struct http_session *session = ptr_session; + assert(session); + + if (cookie_file) { + if (session->cookie_file) { + free(session->cookie_file); + } + session->cookie_file = strdup(cookie_file); + session->cookie_file_mutex = cookie_file_mutex; + } + + return session; +} + void add_custom_header_http_session(void *ptr_session, const char *header) { struct http_session *session = ptr_session; @@ -163,7 +182,8 @@ long get_data_from_url_with_session(void **ptr_session, char *url, char **out, s curl_easy_setopt(c, CURLOPT_RANGE, range); curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(c, CURLOPT_WRITEDATA, (void *)&chunk); - + curl_easy_setopt(c, CURLOPT_VERBOSE, 1L); + if (session->speed_limit) { curl_easy_setopt(c, CURLOPT_LOW_SPEED_LIMIT, session->speed_limit); } @@ -189,6 +209,17 @@ long get_data_from_url_with_session(void **ptr_session, char *url, char **out, s if (session->proxy_uri) { curl_easy_setopt(c, CURLOPT_PROXY, session->proxy_uri); } + + if (session->cookie_file) { + curl_easy_setopt(c, CURLOPT_COOKIEJAR, session->cookie_file); + curl_easy_setopt(c, CURLOPT_COOKIEFILE, session->cookie_file); + + if (session->cookie_file_mutex) { + pthread_mutex_lock(session->cookie_file_mutex); + curl_easy_setopt(c, CURLOPT_COOKIELIST, "RELOAD"); + pthread_mutex_unlock(session->cookie_file_mutex); + } + } curl_easy_setopt(c, CURLOPT_FOLLOWLOCATION, 1L); @@ -224,6 +255,12 @@ long get_data_from_url_with_session(void **ptr_session, char *url, char **out, s free(chunk.memory); } + if (session->cookie_file && session->cookie_file_mutex) { + pthread_mutex_lock(session->cookie_file_mutex); + curl_easy_setopt(c, CURLOPT_COOKIELIST, "FLUSH"); + pthread_mutex_unlock(session->cookie_file_mutex); + } + return http_code; } @@ -232,15 +269,17 @@ void clean_http_session(void *ptr_session) struct http_session *session = ptr_session; curl_easy_cleanup(session->handle); - /* free user agent if set */ if (session->user_agent) { free(session->user_agent); } - /* free user agent if set */ if (session->proxy_uri) { free(session->proxy_uri); } + + if (session->cookie_file) { + free(session->cookie_file); + } /* free the custom headers if set */ if (session->headers) { diff --git a/src/curl.h b/src/curl.h index b48246c..d5a1b62 100755 --- a/src/curl.h +++ b/src/curl.h @@ -18,6 +18,7 @@ extern "C" { void * init_http_session(void); void * set_user_agent_http_session(void *ptr_session, const char *user_agent); void * set_proxy_uri_http_session(void *ptr_session, const char *proxy_uri); +void * set_cookie_file_session(void *ptr_session, const char *cookie_file, void *cookie_file_mutex); void * set_timeout_session(void *ptr_session, const long speed_limit, const long speed_time); void add_custom_header_http_session(void *ptr_session, const char *header); long get_data_from_url_with_session(void **session, char *url, char **out, size_t *size, int type, char **new_url, const char *range); diff --git a/src/hls.c b/src/hls.c index 96bf11e..1c979b1 100755 --- a/src/hls.c +++ b/src/hls.c @@ -73,6 +73,10 @@ static void set_hls_http_header(void *session) set_proxy_uri_http_session(session, hls_args.proxy_uri); } + if (hls_args.cookie_file) { + set_cookie_file_session(session, hls_args.cookie_file, hls_args.cookie_file_mutex); + } + for (int i=0; ifirst_media_segment != me->last_media_segment) { struct hls_media_segment *ms = me->last_media_segment; @@ -1330,6 +1338,9 @@ int download_live_hls(write_ctx_t *out_ctx, hls_media_playlist_t *me) pthread_cond_destroy(&media_playlist_refresh_cond); pthread_cond_destroy(&media_playlist_empty_cond); + pthread_mutex_destroy(&cookie_file_mtx); + hls_args.cookie_file_mutex = NULL; + MSG_API("{\"t_d\":%u,\"d_d\":%u,\"d_s\":%"PRId64"}\n", (uint32_t)(me->total_duration_ms / 1000), (uint32_t)(downloaded_duration_ms / 1000), download_size); if (session) { diff --git a/src/misc.c b/src/misc.c index 967af53..12b0093 100755 --- a/src/misc.c +++ b/src/misc.c @@ -16,7 +16,7 @@ static void print_help(const char *filename) { - printf("hlsdl v0.24\n"); + printf("hlsdl v0.25\n"); printf("(c) 2017-2019 @selsta, samsamsam@o2.pl\n"); printf("Usage: %s url [options]\n\n" "-b ... Automaticly choose the best quality.\n" @@ -36,7 +36,8 @@ static void print_help(const char *filename) "-r ... Set max retries at open.\n" "-w ... Set max download segment retries.\n" "-a ... Set additional url to the audio media playlist.\n" - "-c ... Treat HTTP code 206 as 200 even if request was made without range header.\n", filename); + "-c ... Treat HTTP code 206 as 200 even if request was made without range header.\n" + "-C ... the file name of file holding cookie data in the old Netscape / Mozilla cookie data format.\n", filename); exit(0); } @@ -45,7 +46,7 @@ int parse_argv(int argc, char * const argv[]) int ret = 0; int c = 0; int custom_header_idx = 0; - while ( (c = getopt(argc, argv, "bvqbfctdo:u:h:s:r:w:e:p:k:n:a:")) != -1) + while ( (c = getopt(argc, argv, "bvqbfctdo:u:h:s:r:w:e:p:k:n:a:C:")) != -1) { switch (c) { @@ -91,6 +92,9 @@ int parse_argv(int argc, char * const argv[]) case 'u': hls_args.user_agent = optarg; break; + case 'C': + hls_args.cookie_file = optarg; + break; case 'p': hls_args.proxy_uri = optarg; break; diff --git a/src/misc.h b/src/misc.h index 017f956..8584ec5 100755 --- a/src/misc.h +++ b/src/misc.h @@ -44,6 +44,8 @@ struct hls_args { char *(custom_headers[HLSDL_MAX_NUM_OF_CUSTOM_HEADERS]); char *key_uri_replace_old; char *key_uri_replace_new; + char *cookie_file; + void *cookie_file_mutex; bool accept_partial_content; };