From 21208ecc1c6223cdfd2dbfeaff3bcfad8d0b8937 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Wed, 15 Jul 2020 18:13:49 +0200 Subject: Add torrent complete notification --- src/main.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index e8ff068..10ba396 100644 --- a/src/main.c +++ b/src/main.c @@ -3,10 +3,12 @@ #include "transmission.h" #include "fileutils.h" #include "stringutils.h" +#include "program.h" #include "rss.h" #include "rss_html_common.h" #include "html.h" #include "json.h" +#include "alloc.h" #include #include @@ -383,6 +385,37 @@ static void sync_tracked_html(char *html_config_dir, char *program_dir, const ch iterate_tracked_items(html_config_dir, iterate_tracked_item_html_callback, &iterate_html_item_userdata); } +typedef struct { + char *items; + int size; +} UnfinishedTorrents; + +static void torrent_list_check_new_downloads_callback(int id, const char *name, double percentage_done, void *userdata) { + /* Sanity check, random high number */ + if(id <= 0 || id >= 650000) { + fprintf(stderr, "Invalid torrent id: %d\n", id); + return; + } + + id--; + UnfinishedTorrents *unfinished_torrents = userdata; + + int is_finished = (percentage_done >= 0.9999); + if(is_finished) { + if(id < unfinished_torrents->size && unfinished_torrents->items[id] == 1) { + unfinished_torrents->items[id] = 0; + const char *notify_args[] = { "notify-send", "-u", "normal", "--", "Download finished", name, NULL }; + program_exec(notify_args, NULL, NULL); + } + } else { + if(id >= unfinished_torrents->size) { + unfinished_torrents->size = id + 128; + unfinished_torrents->items = realloc_or_crash(unfinished_torrents->items, unfinished_torrents->size); + } + unfinished_torrents->items[id] = 1; + } +} + 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) { @@ -397,16 +430,28 @@ static void sync_rss_html(char *rss_config_dir, char *html_config_dir, char *pro exit(2); } + /* Check for torrent progress every 15 seconds */ + int check_torrent_status_rate_sec = 15; + + UnfinishedTorrents unfinished_torrents; + unfinished_torrents.items = alloc_or_crash(1024); + unfinished_torrents.size = 1024; + automedia_running = 1; /* running is set to 0 in SIGINT signal handler (ctrl+c) */ while(automedia_running) { sync_tracked_rss(&transmission_session, rss_config_dir); sync_tracked_html(html_config_dir, program_dir, download_dir); - /* TODO: Show finished html/rss items */ - if(automedia_running) - sleep(sync_rate_sec); + int check_count = 0; + while(automedia_running && check_count < sync_rate_sec/check_torrent_status_rate_sec) { + transmission_list_torrents(&transmission_session, torrent_list_check_new_downloads_callback, &unfinished_torrents); + sleep(check_torrent_status_rate_sec); + ++check_count; + } } + + free(unfinished_torrents.items); } static int cmdline_contains_str(const char *cmdline, const char *str) { -- cgit v1.2.3