youtube/gopher: improve directory - frontends - front-ends for some sites (experiment)
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fbbbe9242322569b01c1311a0fa634cd801521bb
 (DIR) parent 8e7076cc4d88d621e1cab5d35c57a2a2d6e24b51
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Wed, 22 Feb 2023 18:42:51 +0100
       
       youtube/gopher: improve directory
       
       - Add directory link of its own page, useful for when theres type 7 search.
       - Show the current search term and add a type 7 search field.
       - Fix listing the user videos by calling the proper function.
       - Don't exit(1) even on a Gopher error response.
       
       Diffstat:
         M youtube/gopher.c                    |      36 ++++++++++++++++++++++++-------
       
       1 file changed, 28 insertions(+), 8 deletions(-)
       ---
 (DIR) diff --git a/youtube/gopher.c b/youtube/gopher.c
       @@ -63,6 +63,7 @@ render(struct search_response *r)
                        exit(1);
        
                header();
       +
                for (i = 0; i < r->nitems; i++) {
                        if (videos[i].id[0])
                                putchar('h');
       @@ -150,6 +151,7 @@ main(void)
        {
                struct search_response *r = NULL;
                const char *channelid = "", *userid = "", *querystring = "", *p;
       +        const char *rawsearch = "";
                char search[1024] = "";
        
                if (pledge("stdio dns inet rpath unveil", NULL) == -1)
       @@ -184,22 +186,40 @@ main(void)
                        p = getenv("X_GOPHER_SEARCH"); /* geomyidae */
                if (!p)
                        p = getenv("SEARCHREQUEST"); /* gophernicus */
       +        if (p)
       +                rawsearch = p;
                if (p && !uriencode(p, search, sizeof(search))) {
                        error("Invalid search");
       -                printf(".\r\n");
       -                exit(1);
       +                footer();
       +                return 0;
       +        }
       +
       +        line('1', "Idiotbox", requestpath);
       +        info("");
       +
       +        OUT("7Search");
       +        if (rawsearch[0]) {
       +                OUT(": ");
       +                OUT(rawsearch);
                }
       +        printf("\t%s\t%s\t%s\r\n", requestpath, host, port);
        
       -        if (search[0])
       +        if (search[0]) {
                        r = youtube_search(search, "", "relevance");
       -        else if (channelid[0])
       +        } else if (channelid[0]) {
                        r = youtube_channel_videos(channelid);
       -        else if (userid[0])
       -                r = youtube_channel_videos(userid);
       +        } else if (userid[0]) {
       +                r = youtube_user_videos(userid);
       +        } else {
       +                footer();
       +                return 0;
       +        }
       +        info("");
       +
                if (!r || r->nitems == 0) {
                        error("No videos found");
       -                printf(".\r\n");
       -                exit(1);
       +                footer();
       +                return 0;
                }
        
                render(r);