diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 119 |
1 files changed, 85 insertions, 34 deletions
@@ -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 { |