aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c119
1 files changed, 85 insertions, 34 deletions
diff --git a/src/main.c b/src/main.c
index bb8114a..e8ff068 100644
--- a/src/main.c
+++ b/src/main.c
@@ -258,29 +258,35 @@ static void command_add(int argc, char **argv, char *rss_config_dir, char *html_
}
}
-sig_atomic_t running = 0;
+sig_atomic_t automedia_running = 0;
static void automedia_pid_signal_handler(int signum) {
(void)signum;
- running = 0;
+ automedia_running = 0;
}
-static void sync_tracked_rss(TransmissionSession *transmission_session, char *rss_config_dir) {
- char rss_tracked_dir[PATH_MAX];
- strcpy(rss_tracked_dir, rss_config_dir);
- strcat(rss_tracked_dir, "/tracked");
+int is_program_running() {
+ return automedia_running;
+}
+
+/* plugin is NULL for rss */
+typedef int (*IterateTrackedItemCallback)(char *title, char *link, char *plugin, char *config_dir, struct json_object_s *json_data, void *userdata);
+static void iterate_tracked_items(char *config_dir, IterateTrackedItemCallback iterate_callback, void *userdata) {
+ char tracked_dir[PATH_MAX];
+ strcpy(tracked_dir, config_dir);
+ strcat(tracked_dir, "/tracked");
struct dirent *dir;
- DIR *d = opendir(rss_tracked_dir);
+ DIR *d = opendir(tracked_dir);
if(!d) {
- fprintf(stderr, "Failed to open directory: %s\n", rss_tracked_dir);
+ fprintf(stderr, "Failed to open directory: %s\n", tracked_dir);
return;
}
- char *item_filepath = rss_tracked_dir;
+ char *item_filepath = tracked_dir;
strcat(item_filepath, "/");
int item_filepath_len = strlen(item_filepath);
- while((dir = readdir(d)) != NULL && running) {
+ while((dir = readdir(d)) != NULL && automedia_running) {
int title_len = strlen(dir->d_name);
if((title_len == 1 && dir->d_name[0] == '.') || (title_len == 2 && dir->d_name[0] == '.' && dir->d_name[1] == '.'))
continue;
@@ -293,49 +299,91 @@ static void sync_tracked_rss(TransmissionSession *transmission_session, char *rs
continue;
}
- strcpy(item_filepath + item_filepath_len + title_len, "/link");
char *link_file_content = NULL;
+ char *data_file_content = NULL;
+ char *plugin_file_content = NULL;
+ struct json_value_s *json_data = NULL;
+
+ strcpy(item_filepath + item_filepath_len + title_len, "/link");
long link_file_size = 0;
int has_link = file_get_content(item_filepath, &link_file_content, &link_file_size);
strcpy(item_filepath + item_filepath_len + title_len, "/data");
- char *data_file_content = NULL;
long data_file_size = 0;
int has_data = file_get_content(item_filepath, &data_file_content, &data_file_size);
+ strcpy(item_filepath + item_filepath_len + title_len, "/plugin");
+ long plugin_file_size = 0;
+ file_get_content(item_filepath, &plugin_file_content, &plugin_file_size);
+
if(has_link != 0 || has_data != 0) {
- free(link_file_content);
- free(data_file_content);
fprintf(stderr, "Rss corrupt, link or data missing for rss %s\n", dir->d_name);
- continue;
+ goto cleanup_item;
}
- struct json_value_s *json_data = json_parse(data_file_content, data_file_size);
- free(data_file_content);
+ json_data = json_parse(data_file_content, data_file_size);
if(!json_data || json_data->type != json_type_object) {
- free(link_file_content);
- free(json_data);
fprintf(stderr, "Rss corrupt for %s\n", dir->d_name);
- continue;
+ goto cleanup_item;
}
+ free(data_file_content);
+ data_file_content = NULL;
- TrackedRss tracked_rss;
- tracked_rss.title = dir->d_name;
- tracked_rss.link = link_file_content;
- tracked_rss.json_data = json_value_as_object(json_data);
- if(sync_rss(transmission_session, &tracked_rss, rss_config_dir) != 0)
+ if(iterate_callback(dir->d_name, link_file_content, plugin_file_content, config_dir, json_value_as_object(json_data), userdata) != 0)
fprintf(stderr, "Failed to sync %s\n", dir->d_name);
- free(link_file_content);
+ cleanup_item:
free(json_data);
+ free(plugin_file_content);
+ free(data_file_content);
+ free(link_file_content);
}
closedir(d);
}
-static void sync_rss_html(char *rss_config_dir, char *html_config_dir, const char *download_dir, int sync_rate_sec) {
- (void)html_config_dir;
+static int iterate_tracked_item_rss_callback(char *title, char *link, char *plugin, char *config_dir, struct json_object_s *json_data, void *userdata) {
+ (void)plugin;
+ TransmissionSession *transmission_session = userdata;
+ TrackedRss tracked_rss;
+ tracked_rss.title = title;
+ tracked_rss.link = link;
+ tracked_rss.json_data = json_data;
+ return sync_rss(&tracked_rss, transmission_session, config_dir);
+}
+
+typedef struct {
+ char *program_dir;
+ const char *download_dir;
+} IterateHtmlItemUserdata;
+
+static int iterate_tracked_item_html_callback(char *title, char *link, char *plugin, char *config_dir, struct json_object_s *json_data, void *userdata) {
+ if(!plugin) {
+ fprintf(stderr, "Missing plugin name for html item: %s\n", title);
+ return -1;
+ }
+
+ IterateHtmlItemUserdata *iterate_html_item_userdata = userdata;
+ TrackedHtml tracked_html;
+ tracked_html.plugin = plugin;
+ tracked_html.title = title;
+ tracked_html.link = link;
+ tracked_html.json_data = json_data;
+ return sync_html(&tracked_html, iterate_html_item_userdata->program_dir, iterate_html_item_userdata->download_dir, config_dir);
+}
+
+static void sync_tracked_rss(TransmissionSession *transmission_session, char *rss_config_dir) {
+ iterate_tracked_items(rss_config_dir, iterate_tracked_item_rss_callback, transmission_session);
+}
+
+static void sync_tracked_html(char *html_config_dir, char *program_dir, const char *download_dir) {
+ IterateHtmlItemUserdata iterate_html_item_userdata;
+ iterate_html_item_userdata.program_dir = program_dir;
+ iterate_html_item_userdata.download_dir = download_dir;
+ iterate_tracked_items(html_config_dir, iterate_tracked_item_html_callback, &iterate_html_item_userdata);
+}
+static void sync_rss_html(char *rss_config_dir, char *html_config_dir, char *program_dir, const char *download_dir, int sync_rate_sec) {
if(transmission_is_daemon_running() != 0) {
if(transmission_start_daemon(download_dir) != 0) {
fprintf(stderr, "Failed to start torrent daemon\n");
@@ -349,11 +397,14 @@ static void sync_rss_html(char *rss_config_dir, char *html_config_dir, const cha
exit(2);
}
- running = 1;
+ automedia_running = 1;
/* running is set to 0 in SIGINT signal handler (ctrl+c) */
- while(running) {
+ while(automedia_running) {
sync_tracked_rss(&transmission_session, rss_config_dir);
- if(running)
+ sync_tracked_html(html_config_dir, program_dir, download_dir);
+
+ /* TODO: Show finished html/rss items */
+ if(automedia_running)
sleep(sync_rate_sec);
}
}
@@ -371,7 +422,7 @@ static int cmdline_contains_str(const char *cmdline, const char *str) {
}
}
-static void command_sync(int argc, char **argv, char *rss_config_dir, char *html_config_dir) {
+static void command_sync(int argc, char **argv, char *rss_config_dir, char *html_config_dir, char *program_dir) {
if(argc < 1)
usage_sync();
@@ -435,7 +486,7 @@ static void command_sync(int argc, char **argv, char *rss_config_dir, char *html
close(pid_file);
const int sync_rate_sec = 15 * 60; /* every 15 min */
- sync_rss_html(rss_config_dir, html_config_dir, download_dir, sync_rate_sec);
+ sync_rss_html(rss_config_dir, html_config_dir, program_dir, download_dir, sync_rate_sec);
remove(automedia_pid_path);
}
@@ -483,7 +534,7 @@ int main(int argc, char **argv) {
if(strcmp(command, "add") == 0) {
command_add(argc - 2, argv + 2, rss_config_dir, html_config_dir, dirname(argv[0]));
} else if(strcmp(command, "sync") == 0) {
- command_sync(argc - 2, argv + 2, rss_config_dir, html_config_dir);
+ command_sync(argc - 2, argv + 2, rss_config_dir, html_config_dir, dirname(argv[0]));
} else if(strcmp(command, "downloaded") == 0) {
command_downloaded(rss_config_dir, html_config_dir);
} else {