add gopher mode and twtxt output format - frontends - front-ends for some sites (experiment) (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit ee630780f97caacdc83bbbf29c60be757394f017 (DIR) parent 5e29f7c0a3a955816bdc5e3b418726ec68d5e0b4 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org> Date: Sun, 14 May 2023 00:06:50 +0200 add gopher mode and twtxt output format Diffstat: M youtube/feed.c | 73 ++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 11 deletions(-) --- (DIR) diff --git a/youtube/feed.c b/youtube/feed.c @@ -90,6 +90,7 @@ static void json_header(void); static void json_item(void); static void json_footer(void); static void sfeed_item(void); /* TSV / sfeed */ +static void twtxt_item(void); static void string_append(String *, const char *, size_t); static void string_buffer_realloc(String *, size_t); @@ -151,7 +152,8 @@ static String attrrel, tmpstr; static struct search_response *search_res = NULL; static void (*printfields)(void) = sfeed_item; -static int cgimode = 0; +static int cgimode = 0, godmode = 0; +static const char *server_name = "127.0.0.1", *server_port = "70"; static int tagcmp(const void *v1, const void *v2) @@ -631,6 +633,39 @@ sfeed_item(void) putchar('\n'); } +static void +twtxt_item(void) +{ + struct item *v, *found = NULL; + size_t i; + + /* must have a video id */ + if (!ctx.fields[FeedFieldYoutubeId].str.len) + return; + + for (i = 0; i < search_res->nitems; i++) { + v = &(search_res->items[i]); + if (!strcmp(ctx.fields[FeedFieldYoutubeId].str.data, v->id)) + found = v; + } + /* Only print the video if it was found in the feed aswell. + This way it filters away shorts too. */ + if (!found) + return; + + string_print(&ctx.fields[FeedFieldTime].str); + putchar(FieldSeparator); + string_print(&ctx.fields[FeedFieldTitle].str); + if (found->duration[0]) { + fputs(" [", stdout); + fputs(found->duration, stdout); + fputs("]", stdout); + } + fputs(": ", stdout); + string_print(&ctx.fields[FeedFieldLink].str); + putchar('\n'); +} + static int istag(const char *name, size_t len, const char *name2, size_t len2) { @@ -888,9 +923,13 @@ void usage(void) { if (cgimode) { - fputs("Status: 400 Bad Request\r\n", stdout); - fputs("Content-Type: text/plain; charset=utf-8\r\n\r\n", stdout); - fputs("400 Bad Request\n", stdout); + if (godmode) { + printf("3Bad Request\tErr\t%s\t%s\r\n", server_name, server_port); + } else { + fputs("Status: 400 Bad Request\r\n", stdout); + fputs("Content-Type: text/plain; charset=utf-8\r\n\r\n", stdout); + fputs("400 Bad Request\n", stdout); + } exit(0); } else { fputs("usage: feed <channelid> [atom|json|tsv]\n", stderr); @@ -903,19 +942,23 @@ main(int argc, char *argv[]) { char buf[256]; const char *channelid = NULL; - char *data, *format = "tsv", *p, *requesturi, *tmp; + char *data, *format = "tsv", *p, *path = NULL, *tmp; size_t i; if (pledge("stdio dns inet rpath unveil", NULL) == -1) err(1, "pledge"); - if ((tmp = getenv("REQUEST_URI"))) { - cgimode = 1; + if ((tmp = getenv("REQUEST_URI"))) + path = tmp; + else if ((tmp = getenv("REQUEST"))) + path = tmp; - strlcpy(buf, tmp, sizeof(buf)); - requesturi = buf; + if (path) { + cgimode = 1; + strlcpy(buf, path, sizeof(buf)); + path = buf; - if (!(p = strrchr(requesturi, '/'))) + if (!(p = strrchr(path, '/'))) usage(); channelid = p + 1; @@ -923,6 +966,12 @@ main(int argc, char *argv[]) *p = '\0'; /* NULL terminate */ format = p + 1; } + if ((tmp = getenv("SERVER_NAME"))) + server_name = tmp; + if ((tmp = getenv("SERVER_PORT"))) + server_port = tmp; + if ((tmp = getenv("SERVER_PROTOCOL")) && strstr(tmp, "gopher")) + godmode = 1; } else { if (argc <= 1) usage(); @@ -940,6 +989,8 @@ main(int argc, char *argv[]) printfields = json_item; else if (!strcmp(format, "tsv") || !strcmp(format, "sfeed")) printfields = sfeed_item; + else if (!strcmp(format, "txt") || !strcmp(format, "twtxt")) + printfields = twtxt_item; else usage(); @@ -975,7 +1026,7 @@ main(int argc, char *argv[]) string_clear(&(ctx.fields[i].str)); } - if (cgimode) { + if (cgimode && !godmode) { fputs("Status: 200 OK\r\n", stdout); if (!strcmp(format, "atom") || !strcmp(format, "xml")) fputs("Content-Type: text/xml; charset=utf-8\r\n\r\n", stdout);