aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c138
1 files changed, 130 insertions, 8 deletions
diff --git a/main.c b/main.c
index 36c2b5f..74ac1c0 100644
--- a/main.c
+++ b/main.c
@@ -1,6 +1,8 @@
#include "buffer.h"
#include "fileutils.h"
#include "transmission.h"
+#include "fileutils.h"
+#include "rss.h"
#include "json.h"
#include <stdio.h>
@@ -10,6 +12,8 @@
#include <dirent.h>
+#define NAME_MAX_LEN 250
+
static void usage(void) {
fprintf(stderr, "usage: automedia COMMAND\n");
fprintf(stderr, "\n");
@@ -26,7 +30,7 @@ static void usage_add(void) {
fprintf(stderr, " type The type should be either rss or html\n");
fprintf(stderr, " url The url to the rss or html\n");
fprintf(stderr, " filename The filename of an episode of an existing serie to start track. Currently only works with rss on https://nyaa.si\n");
- fprintf(stderr, " --name The display name to be used for the media. Optional for rss, in which case the name will be retries from rss TITLE, required for html\n");
+ fprintf(stderr, " --name The display name to be used for the media. Optional for rss, in which case the name will be the rss TITLE, required for html. The name can't be longer than 250 characters\n");
fprintf(stderr, " --start-after The sync should start downloading media after this item. This --start-after value should be the title of the episode/chapter (Optional, default is to start from the first item)\n");
fprintf(stderr, "EXAMPLES\n");
fprintf(stderr, " automedia add rss 'https://nyaa.si/?page=rss&q=Tejina-senpai+1080p&c=0_0&f=0&u=HorribleSubs'\n");
@@ -180,6 +184,124 @@ static int compare_downloaded_item(const void *a, const void *b) {
return list_data_a->timestamp - list_data_b->timestamp;
}
+static void string_replace(char *str, char old, char new) {
+ for(;;) {
+ char c = *str;
+ if(c == old)
+ *str = new;
+ else if(c == '\0')
+ break;
+ ++str;
+ }
+}
+
+static char* lstrip(char *str) {
+ for(;;) {
+ char c = *str;
+ if(c != ' ' && c != '\t' && c != '\n')
+ break;
+ else if(c == '\0')
+ break;
+ ++str;
+ }
+ return str;
+}
+
+static void rstrip(char *str) {
+ int len = strlen(str);
+ if(len == 0)
+ return;
+
+ char *p = str + len - 1;
+ while(p != str) {
+ char c = *p;
+ if(c != ' ' && c != '\t' && c != '\n')
+ break;
+ --p;
+ }
+
+ p[1] = '\0';
+}
+
+static char* strip(char *str) {
+ str = lstrip(str);
+ rstrip(str);
+ return str;
+}
+
+static void command_add(int argc, char **argv, char *rss_config_dir, char *html_config_dir) {
+ if(argc < 2)
+ usage_add();
+
+ char *media_type = argv[0];
+ char *media_url = argv[1];
+ char *media_name = NULL;
+ char *start_after = NULL;
+
+ const char *option = NULL;
+ for(int i = 2; i < argc; ++i) {
+ char *arg = argv[i];
+ if(strcmp(arg, "--name") == 0 || strcmp(arg, "--start-after") == 0) {
+ if(option)
+ usage_add();
+ option = arg;
+ } else {
+ if(!option)
+ usage_add();
+
+ if(strcmp(option, "--name") == 0)
+ media_name = arg;
+ else if(strcmp(option, "--start-after") == 0)
+ start_after = arg;
+ else {
+ fprintf(stderr, "Invalid option %s\n", option);
+ usage_add();
+ }
+
+ option = NULL;
+ }
+ }
+
+ if(media_name) {
+ string_replace(media_name, '/', '_');
+ media_name = strip(media_name);
+
+ int media_name_len = strlen(media_name);
+ if(media_name_len > NAME_MAX_LEN) {
+ fprintf(stderr, "--name value can't be longer than %d characters\n", NAME_MAX_LEN);
+ exit(1);
+ }
+ }
+
+ if(start_after) {
+ string_replace(start_after, '/', '_');
+ start_after = strip(start_after);
+ }
+
+ media_url = strip(media_url);
+
+ if(strcmp(media_type, "rss") == 0) {
+ int res = create_directory_recursive(rss_config_dir);
+ if(res != 0) {
+ fprintf(stderr, "Failed to create %s, error: %s\n", rss_config_dir, strerror(res));
+ exit(1);
+ }
+ add_rss(media_name, media_url, rss_config_dir, start_after);
+ } else if(strcmp(media_type, "html") == 0) {
+ (void)html_config_dir;
+ } else {
+ fprintf(stderr, "type should be either rss or html\n");
+ usage_add();
+ }
+}
+
+static void command_sync(int argc, char **argv) {
+ if(argc < 2)
+ usage_sync();
+
+ (void)argv;
+}
+
static void command_downloaded(const char *rss_config_dir, const char *html_config_dir) {
char rss_tracked_dir[PATH_MAX];
strcpy(rss_tracked_dir, rss_config_dir);
@@ -205,19 +327,19 @@ static void command_downloaded(const char *rss_config_dir, const char *html_conf
buffer_deinit(&downloaded_items);
}
-
+/*
static void torrent_list_callback(int id, float percentage_finished, const char *name, void *userdata) {
(void)userdata;
fprintf(stderr, "id: |%d|, done: |%g|, name: |%s|\n", id, percentage_finished, name);
}
-
+*/
int main(int argc, char **argv) {
if(argc < 2)
usage();
const char *home_dir = get_home_dir();
- char rss_config_dir[PATH_MAX];;
+ char rss_config_dir[PATH_MAX];
strcpy(rss_config_dir, home_dir);
strcat(rss_config_dir, "/.config/automedia/rss");
@@ -227,9 +349,9 @@ int main(int argc, char **argv) {
const char *command = argv[1];
if(strcmp(command, "add") == 0) {
- usage_add();
+ command_add(argc - 2, argv + 2, rss_config_dir, html_config_dir);
} else if(strcmp(command, "sync") == 0) {
- usage_sync();
+ command_sync(argc - 2, argv + 2);
} else if(strcmp(command, "downloaded") == 0) {
command_downloaded(rss_config_dir, html_config_dir);
} else {
@@ -237,8 +359,8 @@ int main(int argc, char **argv) {
usage();
}
- transmission_get_all_torrents(torrent_list_callback, NULL);
- printf("is transmission daemon running? %s\n", transmission_is_daemon_running() == 0 ? "yes" : "no");
+ /*transmission_get_all_torrents(torrent_list_callback, NULL);
+ printf("is transmission daemon running? %s\n", transmission_is_daemon_running() == 0 ? "yes" : "no");*/
return 0;
}