aboutsummaryrefslogtreecommitdiff
path: root/src/rss.c
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-07-15 16:49:36 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-15 17:02:25 +0200
commit9946c0363648b44d396b07d8a1a4557c568edc88 (patch)
treed5a2426e266c14f4e4773bacccff7cb8456466c5 /src/rss.c
parent73393bfab65515c68159a649c10856659b5ac016 (diff)
Implement html sync, fix rss sync
Diffstat (limited to 'src/rss.c')
-rw-r--r--src/rss.c198
1 files changed, 27 insertions, 171 deletions
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 <string.h>
#include <stdio.h>
#include <stdlib.h>
@@ -297,11 +298,6 @@ static int is_item_already_downloaded(const char *title, const char *link, Track
}
typedef struct {
- const char *title;
- const char *link;
-} DownloadItemsData;
-
-typedef struct {
TrackedRss *tracked_rss;
Buffer *download_items_buffer;
} RssParseSyncData;
@@ -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);