aboutsummaryrefslogtreecommitdiff
path: root/src/rss_html_common.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_html_common.c
parent73393bfab65515c68159a649c10856659b5ac016 (diff)
Implement html sync, fix rss sync
Diffstat (limited to 'src/rss_html_common.c')
-rw-r--r--src/rss_html_common.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/rss_html_common.c b/src/rss_html_common.c
index f1aa7ad..ba4682b 100644
--- a/src/rss_html_common.c
+++ b/src/rss_html_common.c
@@ -3,6 +3,8 @@
#include "fileutils.h"
#include <string.h>
#include <stdio.h>
+#include <time.h>
+#include <assert.h>
int write_plugin_json_to_file(const char *dir, const char *filename, const char *url, const char *updated, const char *start_after, const char *start_after_url, const char *plugin_name) {
struct json_string_s title_json_key;
@@ -147,6 +149,200 @@ int write_plugin_json_to_file(const char *dir, const char *filename, const char
return result;
}
+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 the next time somehow */
+int tracked_item_update_latest(TrackedItem *tracked_item, char *tracked_dir, DownloadItemsData **download_items, char **filenames, int num_download_items) {
+ assert(num_download_items <= MAX_UPDATE_ITEMS);
+ int tracked_dir_len = strlen(tracked_dir);
+ int result = 0;
+
+ char *item_filepath = tracked_dir;
+ strcat(item_filepath, tracked_item->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_value_s *updated_field = json_object_get_field_by_name(tracked_item->json_data, "updated");
+ if(updated_field) {
+ struct json_string_s *updated_json = json_value_as_string(updated_field);
+ updated_json->string = updated;
+ updated_json->string_size = updated_len;
+ } else {
+ fprintf(stderr, "Corrupt json for rss item: %s\n", item_filepath);
+ }
+
+ struct json_value_s *downloaded_json = json_object_get_field_by_name(tracked_item->json_data, "downloaded");
+ struct json_array_s *downloaded_json_array = NULL;
+
+ struct json_array_s new_downloaded_array;
+ new_downloaded_array.length = 1;
+ new_downloaded_array.start = NULL;
+
+ 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_array = json_value_as_array(downloaded_json);
+ if(!downloaded_json_array) {
+ fprintf(stderr, "Corrupt json for rss item: %s\n", item_filepath);
+ result = -1;
+ goto cleanup;
+ }
+ } else {
+ downloaded_json_array = &new_downloaded_array;
+ }
+
+ struct json_string_s title_json_key;
+ create_json_string(&title_json_key, "title", 5);
+
+ struct json_string_s filename_json_key;
+ create_json_string(&filename_json_key, "filename", 8);
+
+ struct json_string_s time_json_key;
+ create_json_string(&time_json_key, "time", 4);
+
+ struct json_string_s url_json_key;
+ create_json_string(&url_json_key, "url", 3);
+
+ struct json_string_s title_json_value_str[MAX_UPDATE_ITEMS];
+ struct json_value_s title_json_value[MAX_UPDATE_ITEMS];
+ struct json_string_s filename_json_value_str[MAX_UPDATE_ITEMS];
+ struct json_value_s filename_json_value[MAX_UPDATE_ITEMS];
+ struct json_string_s time_value_str[MAX_UPDATE_ITEMS];
+ struct json_value_s time_json_value[MAX_UPDATE_ITEMS];
+ struct json_string_s url_value_str[MAX_UPDATE_ITEMS];
+ struct json_value_s url_json_value[MAX_UPDATE_ITEMS];
+
+ struct json_object_element_s downloaded_title_element[MAX_UPDATE_ITEMS];
+ struct json_object_element_s downloaded_filename_element[MAX_UPDATE_ITEMS];
+ struct json_object_element_s downloaded_time_element[MAX_UPDATE_ITEMS];
+ struct json_object_element_s downloaded_url_element[MAX_UPDATE_ITEMS];
+
+ struct json_object_s new_downloaded_json_obj[MAX_UPDATE_ITEMS];
+ struct json_value_s new_downloaded_json_val[MAX_UPDATE_ITEMS];
+ struct json_array_element_s new_downloaded_item_element[MAX_UPDATE_ITEMS];
+
+ struct json_array_element_s *last_downloaded_element = NULL;
+ for(int i = 0; i < num_download_items; ++i) {
+ create_json_string(&title_json_value_str[i], download_items[i]->title, strlen(download_items[i]->title));
+ init_json_value_str(&title_json_value[i], &title_json_value_str[i]);
+
+ if(filenames) {
+ create_json_string(&filename_json_value_str[i], filenames[i], strlen(filenames[i]));
+ init_json_value_str(&filename_json_value[i], &filename_json_value_str[i]);
+ }
+
+ create_json_string(&time_value_str[i], updated, updated_len);
+ init_json_value_str(&time_json_value[i], &time_value_str[i]);
+
+ create_json_string(&url_value_str[i], download_items[i]->link, strlen(download_items[i]->link));
+ init_json_value_str(&url_json_value[i], &url_value_str[i]);
+
+ downloaded_title_element[i].name = &title_json_key;
+ downloaded_title_element[i].value = &title_json_value[i];
+
+ if(filenames) {
+ downloaded_filename_element[i].name = &filename_json_key;
+ downloaded_filename_element[i].value = &filename_json_value[i];
+ }
+
+ downloaded_time_element[i].name = &time_json_key;
+ downloaded_time_element[i].value = &time_json_value[i];
+
+ downloaded_url_element[i].name = &url_json_key;
+ downloaded_url_element[i].value = &url_json_value[i];
+
+ downloaded_title_element[i].next = &downloaded_time_element[i];
+ downloaded_time_element[i].next = &downloaded_url_element[i];
+ downloaded_url_element[i].next = NULL;
+ if(filenames) {
+ downloaded_url_element[i].next = &downloaded_filename_element[i];
+ downloaded_filename_element[i].next = NULL;
+ new_downloaded_json_obj[i].length = 4;
+ } else {
+ new_downloaded_json_obj[i].length = 3;
+ }
+
+ new_downloaded_json_obj[i].start = &downloaded_title_element[i];
+
+ new_downloaded_json_val[i].payload = &new_downloaded_json_obj[i];
+ new_downloaded_json_val[i].type = json_type_object;
+
+ new_downloaded_item_element[i].value = &new_downloaded_json_val[i];
+ new_downloaded_item_element[i].next = NULL;
+
+ if(downloaded_json_array->length > 0) {
+ if(!last_downloaded_element)
+ last_downloaded_element = get_last_element_in_json_array(downloaded_json_array);
+
+ if(last_downloaded_element)
+ last_downloaded_element->next = &new_downloaded_item_element[i];
+ else
+ downloaded_json_array->start = &new_downloaded_item_element[i];
+
+ last_downloaded_element = &new_downloaded_item_element[i];
+ downloaded_json_array->length++;
+ } else {
+ downloaded_json_array->start = &new_downloaded_item_element[i];
+ downloaded_json_array->length = 1;
+ last_downloaded_element = &new_downloaded_item_element[i];
+
+ struct json_object_element_s *prev_start = tracked_item->json_data->start;
+ tracked_item->json_data->start = &new_downloaded_array_obj_el;
+ new_downloaded_array_obj_el.next = prev_start;
+ tracked_item->json_data->length++;
+ }
+ }
+
+ struct json_value_s json_root_value;
+ json_root_value.payload = tracked_item->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:
+ tracked_dir[tracked_dir_len] = '\0';
+ return result;
+}
+
struct json_value_s* json_object_get_field_by_name(struct json_object_s *json_obj, const char *name) {
struct json_object_element_s *obj_element = json_obj->start;
while(obj_element) {