From fee89c4afdde4dacee51a763bc4d931320a9d69d Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 15 Jun 2021 09:28:35 +0200 Subject: Add all items starting at start-after to the download list in the data json file. This makes downloading more robust if title/url is changes for any item --- src/rss.c | 72 ++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) (limited to 'src/rss.c') diff --git a/src/rss.c b/src/rss.c index 8e6cfe2..dadbacd 100644 --- a/src/rss.c +++ b/src/rss.c @@ -79,7 +79,7 @@ static char* string_substr_before_tag_end(char *str, const char *tag) { return tag_p; } -typedef int (*RssParseCallback)(char *title, char *link, void *userdata); +typedef int (*RssParseCallback)(const char *title, const char *link, void *userdata); static int parse_rss(char *str, char **rss_title_str, RssParseCallback parse_callback, void *userdata) { *rss_title_str = NULL; @@ -150,19 +150,12 @@ static int parse_rss(char *str, char **rss_title_str, RssParseCallback parse_cal } } -typedef struct { - const char *start_after; - int found_start_after; - const char *start_after_url; -} RssParseUserdata; - -static int rss_parse_add_callback(char *title, char *link, void *userdata) { - RssParseUserdata *rss_parse_userdata = userdata; - if(rss_parse_userdata->start_after && strcmp(rss_parse_userdata->start_after, title) == 0) { - rss_parse_userdata->found_start_after = 1; - rss_parse_userdata->start_after_url = link; - return 1; - } +static int rss_parse_add_callback(const char *title, const char *link, void *userdata) { + Buffer *download_items_buffer = userdata; + DownloadItemsData download_items_data; + download_items_data.title = title; + download_items_data.link = link; + buffer_append(download_items_buffer, &download_items_data, sizeof(download_items_data)); return 0; } @@ -303,8 +296,6 @@ static int get_rss_url_from_episode_info(const char *episode_name, EpisodeInfo * return 0; } -/* TODO: Fix the remove() calls. They wont work since they are not recursive and the directories has files in them */ -/* Same for add_html */ int add_rss(const char *name, char *url, char *rss_config_dir, const char *start_after) { int result = 0; char rss_url[4096]; @@ -341,22 +332,32 @@ int add_rss(const char *name, char *url, char *rss_config_dir, const char *start } } - RssParseUserdata rss_parse_userdata; - rss_parse_userdata.start_after = start_after; - rss_parse_userdata.found_start_after = 0; - rss_parse_userdata.start_after_url = NULL; + Buffer download_items_buffer; + buffer_init(&download_items_buffer); char *rss_title = NULL; - result = parse_rss(buffer.data, &rss_title, rss_parse_add_callback, &rss_parse_userdata); + result = parse_rss(buffer.data, &rss_title, rss_parse_add_callback, &download_items_buffer); if(result != 0) { fprintf(stderr, "Failed to parse rss for url: %s\n", url); goto cleanup; } - if(start_after && !rss_parse_userdata.found_start_after) { - fprintf(stderr, "Failed to find %s in rss %s", start_after, url); - result = -1; - goto cleanup; + DownloadItemsData *download_items_start = NULL; + if(start_after) { + DownloadItemsData *download_items_it = buffer_begin(&download_items_buffer); + DownloadItemsData *download_items_end = buffer_end(&download_items_buffer); + for(; download_items_it != download_items_end; ++download_items_it) { + if(strcmp(start_after, download_items_it->title) == 0) { + download_items_start = download_items_it; + break; + } + } + + if(!download_items_start) { + fprintf(stderr, "Failed to find %s in rss %s\n", start_after, url); + result = -1; + goto cleanup; + } } if(!name) { @@ -399,36 +400,37 @@ int add_rss(const char *name, char *url, char *rss_config_dir, const char *start result = create_lock_file(in_progress_filepath); if(result != 0) { fprintf(stderr, "Failed to create %s/.in_progress\n", rss_tracked_dir); - remove(rss_tracked_dir); + remove_recursive(rss_tracked_dir); goto cleanup; } result = file_overwrite_in_dir(rss_tracked_dir, "link", url, strlen(url)); if(result != 0) { fprintf(stderr, "Failed to create %s/link\n", rss_tracked_dir); - remove(rss_tracked_dir); + remove_recursive(rss_tracked_dir); goto cleanup; } char updated[32]; - sprintf(updated, "%ld", time(NULL)); + snprintf(updated, sizeof(updated), "%ld", time(NULL)); result = file_overwrite_in_dir(rss_tracked_dir, "updated", updated, strlen(updated)); if(result != 0) { fprintf(stderr, "Failed to create %s/updated\n", rss_tracked_dir); - remove(rss_tracked_dir); + remove_recursive(rss_tracked_dir); goto cleanup; } - result = write_plugin_json_to_file(rss_tracked_dir, "data", url, updated, start_after, rss_parse_userdata.start_after_url, NULL); + size_t num_download_items = download_items_start ? (((DownloadItemsData*)buffer_end(&download_items_buffer)) - download_items_start) : 0; + result = write_plugin_json_to_file(rss_tracked_dir, "data", url, updated, download_items_start, num_download_items, NULL); if(result != 0) { fprintf(stderr, "Failed to create %s/data\n", rss_tracked_dir); - remove(rss_tracked_dir); + remove_recursive(rss_tracked_dir); goto cleanup; } - remove(in_progress_filepath); - cleanup: + remove(in_progress_filepath); + buffer_deinit(&download_items_buffer); buffer_deinit(&buffer); return result; } @@ -460,7 +462,7 @@ typedef struct { Buffer *download_items_buffer; } RssParseSyncData; -static int rss_parse_sync_callback(char *title, char *link, void *userdata) { +static int rss_parse_sync_callback(const char *title, const char *link, void *userdata) { RssParseSyncData *rss_parse_sync_data = userdata; if(is_item_already_downloaded(title, link, rss_parse_sync_data->tracked_rss)) return 1; @@ -551,7 +553,7 @@ int sync_rss(TrackedRss *tracked_rss, TransmissionSession *transmission_session, } char updated[32]; - sprintf(updated, "%ld", time(NULL)); + snprintf(updated, sizeof(updated), "%ld", time(NULL)); strcat(rss_tracked_dir, tracked_rss->title); result = file_overwrite_in_dir(rss_tracked_dir, "synced", updated, strlen(updated)); if(result != 0) { -- cgit v1.2.3