aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-07-15 18:13:49 +0200
committerdec05eba <dec05eba@protonmail.com>2020-07-15 18:13:49 +0200
commit21208ecc1c6223cdfd2dbfeaff3bcfad8d0b8937 (patch)
tree67f151d022fdcd71bf2ddc5fff8046a4d3a8bfa1 /src/main.c
parent9946c0363648b44d396b07d8a1a4557c568edc88 (diff)
Add torrent complete notification
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c51
1 files changed, 48 insertions, 3 deletions
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 <stdio.h>
#include <stdlib.h>
@@ -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) {