youtube: change searching in channel/user - frontends - front-ends for some sites (experiment)
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7d908e50fd0ce5df924886d613721495bf835eb6
 (DIR) parent 596b6dd0de7c2971acf63b959441ad53af008d85
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Fri, 14 Aug 2020 20:56:03 +0200
       
       youtube: change searching in channel/user
       
       Remove searching in channel/user, the layout was changed and this was broken.
       Instead now when clicking on the channel title search on the channel title.
       
       Diffstat:
         M youtube/cgi.c                       |     118 ++++++++-----------------------
         M youtube/cli.c                       |       2 +-
         M youtube/gopher.c                    |       2 +-
         M youtube/youtube.c                   |      21 ++++-----------------
         M youtube/youtube.h                   |       3 +--
       
       5 files changed, 38 insertions(+), 108 deletions(-)
       ---
 (DIR) diff --git a/youtube/cgi.c b/youtube/cgi.c
       @@ -22,7 +22,6 @@ static int curpage = 1;
        
        /* CGI parameters */
        static char rawsearch[4096], search[4096], order[16], page[64];
       -static char chan[1024], user[1024];
        
        void
        parsecgi(void)
       @@ -33,25 +32,6 @@ parsecgi(void)
                if (!(query = getenv("QUERY_STRING")))
                        query = "";
        
       -        /* channel: search in channel */
       -        if ((p = getparam(query, "chan"))) {
       -                if (decodeparam(chan, sizeof(chan), p) == -1)
       -                        chan[0] = '\0';
       -        }
       -        /* user: search in user */
       -        if ((p = getparam(query, "user"))) {
       -                if (decodeparam(user, sizeof(user), p) == -1)
       -                        user[0] = '\0';
       -        }
       -        if (!strcmp(chan, "Search all") || !strcmp(user, "Search all")) {
       -                chan[0] = '\0';
       -                user[0] = '\0';
       -        }
       -
       -        /* prefer channel over user when both are set */
       -        if (chan[0] && user[0])
       -                user[0] = '\0';
       -
                /* order */
                if ((p = getparam(query, "o"))) {
                        if (decodeparam(order, sizeof(order), p) == -1 ||
       @@ -61,7 +41,7 @@ parsecgi(void)
                                order[0] = '\0';
                }
                if (!order[0])
       -                snprintf(order, sizeof(order), chan[0] || user[0] ? "date" : "relevance");
       +                snprintf(order, sizeof(order), "relevance");
        
                /* page */
                if ((p = getparam(query, "page"))) {
       @@ -109,14 +89,7 @@ render(struct search_response *r)
                        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n"
                        "<title>Search: \"");
                        xmlencode(search);
       -                OUT("\"");
       -                if (r && r->nitems && (chan[0] || user[0])) {
       -                        if (videos[0].channelid[0])
       -                                printf(" in %s", videos[0].channeltitle);
       -                        else if (videos[0].userid[0])
       -                                printf(" in %s", videos[0].userid);
       -                }
       -                printf(" sorted by %s</title>\n", order);
       +                printf("\" sorted by %s</title>\n", order);
                OUT(
                        "<link rel=\"stylesheet\" href=\"css/style.css\" type=\"text/css\" media=\"screen\" />\n"
                        "<link rel=\"icon\" type=\"image/png\" href=\"/favicon.png\" />\n"
       @@ -125,17 +98,6 @@ render(struct search_response *r)
                        "<body class=\"search\">\n"
                        "<form method=\"get\" action=\"\">\n");
        
       -        if (chan[0]) {
       -                OUT("<input type=\"hidden\" name=\"chan\" value=\"");
       -                xmlencode(chan);
       -                OUT("\" />\n");
       -        }
       -        if (user[0]) {
       -                OUT("<input type=\"hidden\" name=\"user\" value=\"");
       -                xmlencode(user);
       -                OUT("\" />\n");
       -        }
       -
                OUT(
                        "<table class=\"search\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n"
                        "<tr>\n"
       @@ -146,14 +108,7 @@ render(struct search_response *r)
                        "\" placeholder=\"Search...\" size=\"72\" autofocus=\"autofocus\" class=\"search\" accesskey=\"f\" />\n"
                        "        </td>\n"
                        "        <td nowrap class=\"nowrap\">\n"
       -                "                <input type=\"submit\" value=\"Search\" class=\"button\"/>\n");
       -
       -        if (chan[0])
       -                OUT("                <input type=\"submit\" name=\"chan\" value=\"Search all\" title=\"Search globally and not in the selected channel\" accesskey=\"c\" />\n");
       -        if (user[0])
       -                OUT("                <input type=\"submit\" name=\"user\" value=\"Search all\" title=\"Search globally and not in the selected user\" accesskey=\"c\" />\n");
       -
       -        OUT(
       +                "                <input type=\"submit\" value=\"Search\" class=\"button\"/>\n"
                        "                <select name=\"o\" title=\"Order by\" accesskey=\"o\">\n");
                printf("                        <option value=\"date\"%s>Creation date</option>\n", !strcmp(order, "date") ? " selected=\"selected\"" : "");
                printf("                        <option value=\"relevance\"%s>Relevance</option>\n", !strcmp(order, "relevance") ? " selected=\"selected\"" : "");
       @@ -220,16 +175,10 @@ render(struct search_response *r)
                                        "</span><br/>\n"
                                        "\t\t<span class=\"channel\">");
        
       -                        OUT("<a title=\"Search in ");
       +                        OUT("<a href=\"?q=");
                                xmlencode(videos[i].channeltitle);
       -                        OUT("\" href=\"?");
       -                        if (videos[i].channelid[0]) {
       -                                OUT("chan=");
       -                                xmlencode(videos[i].channelid);
       -                        } else if (videos[i].userid[0]) {
       -                                OUT("user=");
       -                                xmlencode(videos[i].userid);
       -                        }
       +                        OUT("&amp;o=");
       +                        xmlencode(order);
                                OUT("\">");
                                xmlencode(videos[i].channeltitle);
                                OUT("</a>");
       @@ -270,41 +219,36 @@ render(struct search_response *r)
                        }
                        OUT("</tbody>\n");
        
       -                /* pagination does not work for user/channel search */
       -                if (!user[0] && !chan[0]) {
       -                        OUT(
       -                                "<tfoot>\n"
       -                                "<tr>\n"
       -                                "\t<td align=\"left\" class=\"nowrap\" nowrap>\n");
       -                        if (curpage > 1) {
       -                                OUT("\t\t<a href=\"?q=");
       -                                xmlencode(search);
       -                                OUT("&amp;page=");
       -                                snprintf(tmp, sizeof(tmp), "%d", curpage - 1);
       -                                xmlencode(tmp);
       -                                OUT("&amp;o=");
       -                                xmlencode(order);
       -                                OUT("\" rel=\"prev\" accesskey=\"p\">&larr; prev</a>\n");
       -                        }
       -                        OUT(
       -                                "\t</td>\n\t<td></td>\n"
       -                                "\t<td align=\"right\" class=\"a-r nowrap\" nowrap>\n");
       -
       +                OUT(
       +                        "<tfoot>\n"
       +                        "<tr>\n"
       +                        "\t<td align=\"left\" class=\"nowrap\" nowrap>\n");
       +                if (curpage > 1) {
                                OUT("\t\t<a href=\"?q=");
                                xmlencode(search);
                                OUT("&amp;page=");
       -                        snprintf(tmp, sizeof(tmp), "%d", curpage + 1);
       +                        snprintf(tmp, sizeof(tmp), "%d", curpage - 1);
                                xmlencode(tmp);
                                OUT("&amp;o=");
                                xmlencode(order);
       -                        OUT("\" rel=\"next\" accesskey=\"n\">next &rarr;</a>\n");
       -
       -                        OUT(
       -                                "\t</td>\n"
       -                                "</tr>\n"
       -                                "</tfoot>\n");
       +                        OUT("\" rel=\"prev\" accesskey=\"p\">&larr; prev</a>\n");
                        }
       -                OUT("</table>\n");
       +                OUT(
       +                        "\t</td>\n\t<td></td>\n"
       +                        "\t<td align=\"right\" class=\"a-r nowrap\" nowrap>\n");
       +
       +                OUT("\t\t<a href=\"?q=");
       +                xmlencode(search);
       +                OUT("&amp;page=");
       +                snprintf(tmp, sizeof(tmp), "%d", curpage + 1);
       +                xmlencode(tmp);
       +                OUT("&amp;o=");
       +                xmlencode(order);
       +                OUT("\" rel=\"next\" accesskey=\"n\">next &rarr;</a>\n"
       +                    "\t</td>\n"
       +                    "</tr>\n"
       +                    "</tfoot>\n"
       +                    "</table>\n");
                }
        
                OUT("</body>\n</html>\n");
       @@ -326,10 +270,10 @@ main(void)
        
                parsecgi();
        
       -        if (!rawsearch[0] && !chan[0] && !user[0])
       +        if (!rawsearch[0])
                        goto show;
        
       -        r = youtube_search(rawsearch, chan, user, page, order);
       +        r = youtube_search(rawsearch, page, order);
                if (!r || r->nitems == 0) {
                        OUT("Status: 500 Internal Server Error\r\n\r\n");
                        exit(1);
 (DIR) diff --git a/youtube/cli.c b/youtube/cli.c
       @@ -142,7 +142,7 @@ main(int argc, char *argv[])
                if (!uriencode(argv[1], search, sizeof(search)))
                        usage(argv[0]);
        
       -        r = youtube_search(search, "", "", "", "relevance");
       +        r = youtube_search(search, "", "relevance");
                if (!r || r->nitems == 0) {
                        OUT("No videos found\n");
                        exit(1);
 (DIR) diff --git a/youtube/gopher.c b/youtube/gopher.c
       @@ -157,7 +157,7 @@ main(void)
                        exit(1);
                }
        
       -        r = youtube_search(search, "", "", "", "relevance");
       +        r = youtube_search(search, "", "relevance");
                if (!r || r->nitems == 0) {
                        error("No videos found");
                        printf(".\r\n");
 (DIR) diff --git a/youtube/youtube.c b/youtube/youtube.c
       @@ -254,23 +254,11 @@ xmltagstart(XMLParser *x, const char *t, size_t tl)
        }
        
        static char *
       -request_search(const char *s, const char *chan, const char *user,
       -               const char *page, const char *order)
       +request_search(const char *s, const char *page, const char *order)
        {
                char path[4096];
        
       -        /* when searching in channel or user but the search string is empty:
       -           fake a search with a single space. */
       -        if ((chan[0] || user[0]) && !s[0])
       -                s = "+";
       -
       -        if (user[0])
       -                snprintf(path, sizeof(path), "/user/%s/search?query=%s", user, s);
       -        else if (chan[0])
       -                snprintf(path, sizeof(path), "/channel/%s/search?query=%s", chan, s);
       -        else
       -                snprintf(path, sizeof(path), "/results?search_query=%s", s);
       -
       +        snprintf(path, sizeof(path), "/results?search_query=%s", s);
                if (page[0]) {
                        strlcat(path, "&page=", sizeof(path));
                        strlcat(path, page, sizeof(path));
       @@ -298,14 +286,13 @@ request_search(const char *s, const char *chan, const char *user,
        }
        
        struct search_response *
       -youtube_search(const char *rawsearch, const char *chan, const char *user,
       -               const char *page, const char *order)
       +youtube_search(const char *rawsearch, const char *page, const char *order)
        {
                struct search_response *r;
                XMLParser x = { 0 };
                char *data, *s;
        
       -        if (!(data = request_search(rawsearch, chan, user, page, order)))
       +        if (!(data = request_search(rawsearch, page, order)))
                        return NULL;
                if (!(s = strstr(data, "\r\n\r\n")))
                        return NULL; /* invalid response */
 (DIR) diff --git a/youtube/youtube.h b/youtube/youtube.h
       @@ -18,5 +18,4 @@ struct search_response {
        };
        
        struct search_response *
       -youtube_search(const char *rawsearch, const char *chan, const char *user,
       -               const char *page, const char *order);
       +youtube_search(const char *rawsearch, const char *page, const char *order);