youtube/gopher: list channel videos, allow to search by ?search - frontends - front-ends for some sites (experiment)
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit f3adbb9aabfccab9ab538881887867e1ffca5863
 (DIR) parent fa40d5e0863446d6083d7290249b65f738474a76
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 18 Feb 2023 13:10:19 +0100
       
       youtube/gopher: list channel videos, allow to search by ?search
       
       Also allows linking to channel videos with ?c=channelid.
       
       Diffstat:
         M youtube/gopher.c                    |      44 ++++++++++++++++++++++++++-----
       
       1 file changed, 38 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/youtube/gopher.c b/youtube/gopher.c
       @@ -20,6 +20,10 @@
        
        static const char *host = "127.0.0.1", *port = "70";
        
       +static const char *querystring = "";
       +static const char *channelid = "";
       +static const char *requestpath = "/";
       +
        void
        line(int _type, const char *username, const char *selector)
        {
       @@ -94,6 +98,16 @@ render(struct search_response *r)
                        }
                        printf("\t%s\t%s\r\n", host, port);
        
       +                if (videos[i].channelid[0]) {
       +                        OUT("1");
       +                        OUT(videos[i].channeltitle);
       +                        printf("\t%s?c=%s\t%s\t%s\r\n", requestpath, videos[i].channelid, host, port);
       +                } else if (videos[i].channeltitle[0]) {
       +                        OUT("i");
       +                        OUT(videos[i].channeltitle);
       +                        printf("\t%s\t%s\t%s\r\n", "", host, port);
       +                }
       +
                        if (videos[i].channelid[0] || videos[i].userid[0]) {
                                OUT("hAtom feed of ");
                                OUTTEXT(videos[i].channeltitle);
       @@ -134,8 +148,9 @@ render(struct search_response *r)
        int
        main(void)
        {
       -        struct search_response *r;
       -        char *p, search[1024];
       +        struct search_response *r = NULL;
       +        const char *p;
       +        char search[1024];
        
                if (pledge("stdio dns inet rpath unveil", NULL) == -1)
                        exit(1);
       @@ -147,17 +162,34 @@ main(void)
                        host = p;
                if ((p = getenv("SERVER_PORT")))
                        port = p;
       -
       -        if (!(p = getenv("X_GOPHER_SEARCH"))) /* geomyidae */
       +        if ((p = getenv("PATH_TRANSLATED")))
       +                requestpath = p;
       +        if ((p = getenv("QUERY_STRING")))
       +                querystring = p;
       +
       +        p = NULL;
       +        if (querystring[0] == '?')
       +                querystring++;
       +        if (querystring[0] == 'c' && querystring[1] == '=') {
       +                channelid = 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 && !uriencode(p, search, sizeof(search))) {
                        error("Invalid search");
                        printf(".\r\n");
                        exit(1);
                }
        
       -        r = youtube_search(search, "", "relevance");
       +        if (search[0])
       +                r = youtube_search(search, "", "relevance");
       +        else if (channelid[0])
       +                r = youtube_channel_videos(channelid);
                if (!r || r->nitems == 0) {
                        error("No videos found");
                        printf(".\r\n");