youtube/gopher: add video information details - frontends - front-ends for some sites (experiment) (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit f36e23aa3122441b905b465d3567af4a5788acfa (DIR) parent f7f7290735a250cf03e1a9aa49c0d25b6b326756 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org> Date: Sun, 26 Feb 2023 15:52:07 +0100 youtube/gopher: add video information details Diffstat: M youtube/gopher.c | 124 ++++++++++++++++++++++++++++--- 1 file changed, 113 insertions(+), 11 deletions(-) --- (DIR) diff --git a/youtube/gopher.c b/youtube/gopher.c @@ -54,7 +54,7 @@ footer(void) } int -render(struct search_response *r) +render_search(struct search_response *r) { struct item *v; size_t i; @@ -101,17 +101,20 @@ render(struct search_response *r) } printf("\t%s\t%s\r\n", host, port); + if (v->id[0]) + printf("1Details\t%s?v=%s\t%s\t%s\r\n", requestpath, v->id, host, port); + if (v->channelid[0]) { OUT("1"); - OUT(v->channeltitle); + OUTTEXT(v->channeltitle); printf("\t%s?c=%s\t%s\t%s\r\n", requestpath, v->channelid, host, port); } else if (v->userid[0]) { OUT("1"); - OUT(v->channeltitle); + OUTTEXT(v->channeltitle); printf("\t%s?u=%s\t%s\t%s\r\n", requestpath, v->userid, host, port); } else if (v->channeltitle[0]) { OUT("i"); - OUT(v->channeltitle); + OUTTEXT(v->channeltitle); printf("\t%s\t%s\t%s\r\n", "", host, port); } @@ -149,13 +152,100 @@ render(struct search_response *r) return 0; } +int +render_video(struct video_response *r) +{ + char buf[256]; + const char *s, *e; + int i; + + if (pledge("stdio", NULL) == -1) + exit(1); + + header(); + + info(""); + + OUT("hTitle: "); + OUTTEXT(r->title); + OUT("\tURL:https://www.youtube.com/embed/"); + OUTTEXT(r->id); + printf("\t%s\t%s\r\n", host, port); + + OUT("iURL: "); + OUT("https://www.youtube.com/embed/"); + OUTTEXT(r->id); + printf("\t%s\t%s\t%s\r\n", "", host, port); + + if (r->lengthseconds > 0) { + OUT("iLength: "); + if (durationstr(r->lengthseconds, buf, sizeof(buf)) < sizeof(buf)) + OUTTEXT(buf); + printf("\t%s\t%s\t%s\r\n", "", host, port); + } + + if (r->author[0]) { + OUT("1Channel: "); + OUTTEXT(r->author); + printf("\t%s?c=%s\t%s\t%s\r\n", requestpath, r->channelid, host, port); + + if (r->channelid[0]) { + OUT("hAtom feed\tURL:https://www.youtube.com/feeds/videos.xml?channel_id="); + OUTTEXT(r->channelid); + printf("\t%s\t%s\t%s\r\n", "", host, port); + } + } + + OUT("iViews: "); + printf("%ld", r->viewcount); + printf("\t%s\t%s\t%s\r\n", "", host, port); + + if (r->publishdate[0]) { + OUT("iPublished: "); + OUTTEXT(r->publishdate); + printf("\t%s\t%s\t%s\r\n", "", host, port); + } + + if (r->uploaddate[0]) { + OUT("iUploaded: "); + OUTTEXT(r->uploaddate); + printf("\t%s\t%s\t%s\r\n", "", host, port); + } + + if (r->shortdescription[0]) { + info(""); + info(""); + + /* multi-line text */ + i = 0; + for (s = e = r->shortdescription; ; e++) { + if (!i) + putchar('i'); + if (*e == '\n' || *e == '\0') { + i = 0; + gophertext(stdout, s, e - s); + printf("\t%s\t%s\t%s\r\n", "", host, port); + if (*e == '\0') + break; + s = e + 1; + } else { + i = 1; + } + } + } + + footer(); + + return 0; +} int main(void) { struct search_response *r = NULL; - const char *channelid = "", *userid = "", *querystring = "", *p; - const char *rawsearch = ""; + struct video_response *vr = NULL; + const char *channelid = "", *userid = "", *videoid = ""; + const char *querystring = "", *rawsearch = "", *p; char search[1024] = ""; if (pledge("stdio dns inet rpath unveil", NULL) == -1) @@ -172,6 +262,10 @@ main(void) requestpath = p; if ((p = getenv("QUERY_STRING"))) querystring = p; + if (!p) + p = getenv("X_GOPHER_SEARCH"); /* geomyidae */ + if (!p) + p = getenv("SEARCHREQUEST"); /* gophernicus */ p = NULL; if (querystring[0] == '?') @@ -182,14 +276,13 @@ main(void) } else if (querystring[0] == 'u' && querystring[1] == '=') { userid = querystring + 2; p = querystring = ""; + } else if (querystring[0] == 'v' && querystring[1] == '=') { + videoid = querystring + 2; + p = querystring = ""; } if (querystring[0]) p = querystring; - if (!p) - p = getenv("X_GOPHER_SEARCH"); /* geomyidae */ - if (!p) - p = getenv("SEARCHREQUEST"); /* gophernicus */ if (p) rawsearch = p; if (p && !uriencode(p, search, sizeof(search))) { @@ -214,6 +307,15 @@ main(void) r = youtube_channel_videos(channelid); } else if (userid[0]) { r = youtube_user_videos(userid); + } else if (videoid[0]) { + vr = youtube_video(videoid); + if (!vr || vr->isfound == 0) { + error("No video found"); + footer(); + return 0; + } + render_video(vr); + return 0; } else { footer(); return 0; @@ -226,7 +328,7 @@ main(void) return 0; } - render(r); + render_search(r); return 0; }