diff options
author | dec05eba <dec05eba@protonmail.com> | 2021-06-15 09:28:35 +0200 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-06-15 09:28:46 +0200 |
commit | fee89c4afdde4dacee51a763bc4d931320a9d69d (patch) | |
tree | 66a0accb86934e76ad245d6e57dc4a3fb6cfd63f /src/html.c | |
parent | 3757fe80b30801119bda41ab0445e915271129fc (diff) |
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
Diffstat (limited to 'src/html.c')
-rw-r--r-- | src/html.c | 94 |
1 files changed, 46 insertions, 48 deletions
@@ -166,19 +166,12 @@ static cJSON* plugin_list(char *plugin_filepath, const char *url, cJSON *downloa return NULL; } -typedef struct { - const char *start_after; - int found_start_after; - const char *start_after_url; -} PluginListUserdata; - -static int plugin_list_callback(const char *name, const char *url, void *userdata) { - PluginListUserdata *plugin_list_userdata = userdata; - if(plugin_list_userdata->start_after && strcmp(plugin_list_userdata->start_after, name) == 0) { - plugin_list_userdata->found_start_after = 1; - plugin_list_userdata->start_after_url = url; - return 1; - } +static int plugin_list_append_item_callback(const char *name, const char *url, void *userdata) { + Buffer *download_items_buffer = userdata; + DownloadItemsData download_items_data; + download_items_data.title = name; + download_items_data.link = url; + buffer_append(download_items_buffer, &download_items_data, sizeof(download_items_data)); return 0; } @@ -230,21 +223,6 @@ int add_html(const char *name, const char *url, char *html_config_dir, char *pro if(get_plugin_filepath(program_dir, domain, domain_plugin_path) != 0) return -1; - PluginListUserdata plugin_list_userdata; - plugin_list_userdata.start_after = start_after; - plugin_list_userdata.found_start_after = 0; - plugin_list_userdata.start_after_url = NULL; - - cJSON *json_root = plugin_list(domain_plugin_path, url, NULL, plugin_list_callback, &plugin_list_userdata); - if(!json_root) - return -1; - - if(start_after && !plugin_list_userdata.found_start_after) { - fprintf(stderr, "Failed to find %s in html %s\n", start_after, url); - result = -1; - goto cleanup; - } - char *html_tracked_dir = html_config_dir; strcat(html_tracked_dir, "/tracked/"); strcat(html_tracked_dir, name); @@ -253,12 +231,40 @@ int add_html(const char *name, const char *url, char *html_config_dir, char *pro strcpy(in_progress_filepath, html_tracked_dir); strcat(in_progress_filepath, "/.in_progress"); + Buffer download_items_buffer; + buffer_init(&download_items_buffer); + cJSON *json_root = NULL; + if(file_exists(html_tracked_dir) == 0 && file_exists(in_progress_filepath) != 0) { fprintf(stderr, "You are already tracking %s\n", url); result = -1; goto cleanup; } + json_root = plugin_list(domain_plugin_path, url, NULL, plugin_list_append_item_callback, &download_items_buffer); + if(!json_root) { + 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 html %s\n", start_after, url); + result = -1; + goto cleanup; + } + } + result = create_directory_recursive(html_tracked_dir); if(result != 0) { fprintf(stderr, "Failed to create %s, error: %s\n", html_tracked_dir, strerror(result)); @@ -273,14 +279,14 @@ int add_html(const char *name, const char *url, char *html_config_dir, char *pro result = create_lock_file(in_progress_filepath); if(result != 0) { fprintf(stderr, "Failed to create %s/.in_progress\n", html_tracked_dir); - remove(html_tracked_dir); + remove_recursive(html_tracked_dir); goto cleanup; } result = file_overwrite_in_dir(html_tracked_dir, "link", url, strlen(url)); if(result != 0) { fprintf(stderr, "Failed to create %s/link\n", html_tracked_dir); - remove(html_tracked_dir); + remove_recursive(html_tracked_dir); goto cleanup; } @@ -288,43 +294,35 @@ int add_html(const char *name, const char *url, char *html_config_dir, char *pro result = file_overwrite_in_dir(html_tracked_dir, "plugin", plugin_name, strlen(plugin_name)); if(result != 0) { fprintf(stderr, "Failed to create %s/link\n", html_tracked_dir); - remove(html_tracked_dir); + remove_recursive(html_tracked_dir); goto cleanup; } char updated[32]; assert(sizeof(time_t) == sizeof(long)); - sprintf(updated, "%ld", time(NULL)); + snprintf(updated, sizeof(updated), "%ld", time(NULL)); result = file_overwrite_in_dir(html_tracked_dir, "updated", updated, strlen(updated)); if(result != 0) { fprintf(stderr, "Failed to create %s/updated\n", html_tracked_dir); - remove(html_tracked_dir); + remove_recursive(html_tracked_dir); goto cleanup; } - result = write_plugin_json_to_file(html_tracked_dir, "data", url, updated, start_after, plugin_list_userdata.start_after_url, plugin_name); + size_t num_download_items = download_items_start ? (((DownloadItemsData*)buffer_end(&download_items_buffer)) - download_items_start) : 0; + result = write_plugin_json_to_file(html_tracked_dir, "data", url, updated, download_items_start, num_download_items, plugin_name); if(result != 0) { fprintf(stderr, "Failed to create %s/data\n", html_tracked_dir); - remove(html_tracked_dir); + remove_recursive(html_tracked_dir); goto cleanup; } - remove(in_progress_filepath); - cleanup: + remove(in_progress_filepath); + buffer_deinit(&download_items_buffer); cJSON_Delete(json_root); return result; } -static int plugin_list_sync_callback(const char *name, const char *url, void *userdata) { - Buffer *download_items_buffer = userdata; - DownloadItemsData download_items_data; - download_items_data.title = name; - download_items_data.link = url; - buffer_append(download_items_buffer, &download_items_data, sizeof(download_items_data)); - return 0; -} - static int download_html_items_in_reverse(const char *plugin_filepath, Buffer *download_items_buffer, TrackedHtml *tracked_html, char *html_tracked_dir, const char *download_dir) { int result = 0; DownloadItemsData *added_download_items[MAX_UPDATE_ITEMS]; @@ -410,7 +408,7 @@ int sync_html(TrackedHtml *tracked_html, char *program_dir, const char *download int result = 0; - cJSON *json_root = plugin_list(plugin_filepath, tracked_html->link, downloaded_items, plugin_list_sync_callback, &download_items_buffer); + cJSON *json_root = plugin_list(plugin_filepath, tracked_html->link, downloaded_items, plugin_list_append_item_callback, &download_items_buffer); if(!json_root) { result = -1; goto cleanup; @@ -426,7 +424,7 @@ int sync_html(TrackedHtml *tracked_html, char *program_dir, const char *download } char updated[32]; - sprintf(updated, "%ld", time(NULL)); + snprintf(updated, sizeof(updated), "%ld", time(NULL)); strcat(html_tracked_dir, tracked_html->title); result = file_overwrite_in_dir(html_tracked_dir, "synced", updated, strlen(updated)); if(result != 0) { |