From 9946c0363648b44d396b07d8a1a4557c568edc88 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 15 Jul 2020 16:49:36 +0200 Subject: Implement html sync, fix rss sync --- src/rss.c | 198 +++++++++----------------------------------------------------- 1 file changed, 27 insertions(+), 171 deletions(-) (limited to 'src/rss.c') diff --git a/src/rss.c b/src/rss.c index 005bd03..90b3ed6 100644 --- a/src/rss.c +++ b/src/rss.c @@ -6,6 +6,7 @@ #include "buffer.h" #include "rss_html_common.h" #include "json.h" +#include "alloc.h" #include #include #include @@ -296,11 +297,6 @@ static int is_item_already_downloaded(const char *title, const char *link, Track return 0; } -typedef struct { - const char *title; - const char *link; -} DownloadItemsData; - typedef struct { TrackedRss *tracked_rss; Buffer *download_items_buffer; @@ -318,186 +314,46 @@ static int rss_parse_sync_callback(char *title, char *link, void *userdata) { return 0; } -static struct json_array_element_s* get_last_element_in_json_array(struct json_array_s *json_array) { - struct json_array_element_s *json_element = json_array->start; - while(json_element) { - struct json_array_element_s *next_json_element = json_element->next; - if(next_json_element) - json_element = next_json_element; - else - return json_element; - } - return NULL; -} - -/* TODO: If this fails in the middle, recover and update this next time somehow */ -static int rss_update_latest(char *rss_tracked_dir, TrackedRss *tracked_rss, const char *latest_title, const char *url, const char *filename) { - int rss_tracked_dir_len = strlen(rss_tracked_dir); +static int add_torrents_in_reverse(TransmissionSession *transmission_session, Buffer *download_items_buffer, TrackedRss *tracked_rss, char *rss_tracked_dir) { int result = 0; + char *torrent_names[MAX_UPDATE_ITEMS]; + DownloadItemsData *added_download_items[MAX_UPDATE_ITEMS]; - char *item_filepath = rss_tracked_dir; - strcat(item_filepath, tracked_rss->title); - - char updated[32]; - assert(sizeof(time_t) == sizeof(long)); - sprintf(updated, "%ld", time(NULL)); - int updated_len = strlen(updated); - result = file_overwrite_in_dir(item_filepath, "updated", updated, updated_len); - if(result != 0) { - fprintf(stderr, "Failed to update %s/updated\n", item_filepath); - goto cleanup; - } - - struct json_string_s *updated_json = json_value_as_string(json_object_get_field_by_name(tracked_rss->json_data, "updated")); - updated_json->string = updated; - updated_json->string_size = updated_len; - - struct json_value_s *downloaded_json = json_object_get_field_by_name(tracked_rss->json_data, "downloaded"); - /* TODO:; WHAT IF DJSONWLOADING JSON DOENS*T SHIT */ - - struct json_string_s title_json_key; - create_json_string(&title_json_key, "title", 5); - - struct json_string_s title_json_value_str; - create_json_string(&title_json_value_str, latest_title, strlen(latest_title)); - struct json_value_s title_json_value; - init_json_value_str(&title_json_value, &title_json_value_str); - - struct json_string_s filename_json_key; - create_json_string(&filename_json_key, "filename", 8); - - struct json_string_s filename_json_value_str; - create_json_string(&filename_json_value_str, filename, strlen(filename)); - struct json_value_s filename_json_value; - init_json_value_str(&filename_json_value, &filename_json_value_str); - - struct json_string_s time_json_key; - create_json_string(&time_json_key, "time", 4); - - struct json_string_s time_value_str; - create_json_string(&time_value_str, updated, updated_len); - struct json_value_s time_json_value; - init_json_value_str(&time_json_value, &time_value_str); - - struct json_string_s url_json_key; - create_json_string(&url_json_key, "url", 3); - - struct json_string_s url_value_str; - create_json_string(&url_value_str, url, strlen(url)); - struct json_value_s url_json_value; - init_json_value_str(&url_json_value, &url_value_str); - - struct json_object_element_s downloaded_title_element; - downloaded_title_element.name = &title_json_key; - downloaded_title_element.value = &title_json_value; - - struct json_object_element_s downloaded_filename_element; - downloaded_filename_element.name = &filename_json_key; - downloaded_filename_element.value = &filename_json_value; - - struct json_object_element_s downloaded_time_element; - downloaded_time_element.name = &time_json_key; - downloaded_time_element.value = &time_json_value; - - struct json_object_element_s downloaded_url_element; - downloaded_url_element.name = &url_json_key; - downloaded_url_element.value = &url_json_value; - - downloaded_title_element.next = &downloaded_filename_element; - downloaded_filename_element.next = &downloaded_time_element; - downloaded_time_element.next = &downloaded_url_element; - downloaded_url_element.next = NULL; - - struct json_object_s new_downloaded_json_obj; - new_downloaded_json_obj.length = 4; - new_downloaded_json_obj.start = &downloaded_title_element; - - struct json_value_s new_downloaded_json_val; - new_downloaded_json_val.payload = &new_downloaded_json_obj; - new_downloaded_json_val.type = json_type_object; - - struct json_array_element_s new_downloaded_item_element; - new_downloaded_item_element.value = &new_downloaded_json_val; - new_downloaded_item_element.next = NULL; + Buffer json_element_buffer; + buffer_init(&json_element_buffer); - struct json_array_s new_downloaded_array; - struct json_value_s new_downloaded_array_val; - new_downloaded_array_val.payload = &new_downloaded_array; - new_downloaded_array_val.type = json_type_array; - - struct json_string_s downloaded_json_key; - create_json_string(&downloaded_json_key, "downloaded", 10); - - struct json_object_element_s new_downloaded_array_obj_el; - new_downloaded_array_obj_el.name = &downloaded_json_key; - new_downloaded_array_obj_el.value = &new_downloaded_array_val; - - if(downloaded_json && downloaded_json->type == json_type_array) { - struct json_array_s *downloaded_json_array = json_value_as_array(downloaded_json); - struct json_array_element_s *last_downloaded_element = get_last_element_in_json_array(downloaded_json_array); - if(last_downloaded_element) - last_downloaded_element->next = &new_downloaded_item_element; - else - downloaded_json_array->start = &new_downloaded_item_element; - downloaded_json_array->length++; - } else { - new_downloaded_array.start = &new_downloaded_item_element; - new_downloaded_array.length = 1; - - struct json_object_element_s *prev_start = tracked_rss->json_data->start; - tracked_rss->json_data->start = &new_downloaded_array_obj_el; - new_downloaded_array_obj_el.next = prev_start; - tracked_rss->json_data->length++; - } - - struct json_value_s json_root_value; - json_root_value.payload = tracked_rss->json_data; - json_root_value.type = json_type_object; - - size_t json_body_size = 0; - char *json_body_str = json_write_pretty(&json_root_value, " ", "\n", &json_body_size); - if(!json_body_str) { - fprintf(stderr, "Failed to write json data to file %s/data\n", item_filepath); - result = -1; - goto cleanup; - } - - /* Workaround json bug (?) */ - json_body_size = strlen(json_body_str); - - result = file_overwrite_in_dir(item_filepath, "data", json_body_str, json_body_size); - free(json_body_str); - - cleanup: - rss_tracked_dir[rss_tracked_dir_len] = '\0'; - return result; -} - -static int add_torrents_in_reverse(TransmissionSession *transmission_session, Buffer *download_items_buffer, TrackedRss *tracked_rss, char *rss_tracked_dir) { DownloadItemsData *download_items_it = buffer_end(download_items_buffer); DownloadItemsData *download_items_end = buffer_begin(download_items_buffer); download_items_it--; download_items_end--; - for(; download_items_it != download_items_end; --download_items_it) { - char *torrent_name; - if(transmission_add_torrent(transmission_session, download_items_it->link, &torrent_name) != 0) { + int torrent_name_index = 0; + for(; download_items_it != download_items_end && torrent_name_index < MAX_UPDATE_ITEMS; --download_items_it) { + if(transmission_add_torrent(transmission_session, download_items_it->link, &torrent_names[torrent_name_index]) != 0) { fprintf(stderr, "Failed to add torrent: %s\n", download_items_it->link); - return 1; + result = -1; + break; } + added_download_items[torrent_name_index] = download_items_it; + ++torrent_name_index; + fprintf(stderr, "Starting download of torrent: %s (title: %s)\n", download_items_it->link, download_items_it->title); + /* Show notification that download has started? */ + } - if(rss_update_latest(rss_tracked_dir, tracked_rss, download_items_it->title, download_items_it->link, torrent_name) != 0) { - free(torrent_name); - fprintf(stderr, "Failed to update rss tracked data for %s\n", download_items_it->title); - return 1; - } + TrackedItem tracked_item; + tracked_item.title = tracked_rss->title; + tracked_item.link = tracked_rss->link; + tracked_item.json_data = tracked_rss->json_data; + result = tracked_item_update_latest(&tracked_item, rss_tracked_dir, added_download_items, torrent_names, torrent_name_index); - free(torrent_name); - /* Show notification that download has started? */ + for(int i = 0; i < torrent_name_index; ++i) { + free(torrent_names[torrent_name_index]); } - return 0; + + buffer_deinit(&json_element_buffer); + return result; } -int sync_rss(TransmissionSession *transmission_session, TrackedRss *tracked_rss, char *rss_config_dir) { +int sync_rss(TrackedRss *tracked_rss, TransmissionSession *transmission_session, char *rss_config_dir) { /* TODO: This can be cached */ int rss_config_dir_len = strlen(rss_config_dir); -- cgit v1.2.3