youtube: add shortdescription from search or channel/user listings - frontends - front-ends for some sites (experiment)
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit e0461c105d8e02725c05d0cafd896fc54fb8be30
(DIR) parent d278df39b1e6a28ada817813ecb6a2ed96817b90
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Sat, 25 Feb 2023 19:40:40 +0100
youtube: add shortdescription from search or channel/user listings
Diffstat:
M youtube/cli.c | 7 +++++--
M youtube/youtube.c | 28 ++++++++++++++++++++++------
M youtube/youtube.h | 3 ---
3 files changed, 27 insertions(+), 11 deletions(-)
---
(DIR) diff --git a/youtube/cli.c b/youtube/cli.c
@@ -79,7 +79,8 @@ render_search_tsv(struct search_response *r)
OUTESCAPE(videos[i].channeltitle);
OUT("\t");
OUTESCAPE(videos[i].userid);
- OUT("\t");
+/* OUT("\t");
+ OUTESCAPE(videos[i].shortdescription); */ /* TODO: escape newlines etc */
OUT("\n");
}
@@ -89,10 +90,12 @@ render_search_tsv(struct search_response *r)
int
render_search(struct search_response *r)
{
- struct item *videos = r->items;
+ struct item *videos = r->items, *v;
size_t i;
for (i = 0; i < r->nitems; i++) {
+ v = &(r->items[i]);
+
switch (videos[i].linktype) {
case Channel:
OUT("Channel: ");
(DIR) diff --git a/youtube/youtube.c b/youtube/youtube.c
@@ -191,8 +191,24 @@ processnode_search(struct json_node *nodes, size_t depth, const char *value,
strlcpy(item->title, value, sizeof(item->title));
}
- /* in channel/user videos listing there is a short description */
-#ifdef neinneinnein
+ /* in search listing there is a short description, string items are appended */
+ if (depth >= 8 &&
+ nodes[depth - 7].type == JSON_TYPE_OBJECT &&
+ nodes[depth - 6].type == JSON_TYPE_ARRAY &&
+ nodes[depth - 5].type == JSON_TYPE_OBJECT &&
+ nodes[depth - 4].type == JSON_TYPE_OBJECT &&
+ nodes[depth - 3].type == JSON_TYPE_ARRAY &&
+ nodes[depth - 2].type == JSON_TYPE_OBJECT &&
+ nodes[depth - 1].type == JSON_TYPE_STRING &&
+ !strcmp(nodes[depth - 7].name, "videoRenderer") &&
+ !strcmp(nodes[depth - 6].name, "detailedMetadataSnippets") &&
+ !strcmp(nodes[depth - 4].name, "snippetText") &&
+ !strcmp(nodes[depth - 3].name, "runs") &&
+ !strcmp(nodes[depth - 1].name, "text")) {
+ strlcat(item->shortdescription, value, sizeof(item->shortdescription));
+ }
+
+ /* in channel/user videos listing there is a short description, string items are appended */
if (depth >= 7 &&
nodes[depth - 5].type == JSON_TYPE_OBJECT &&
nodes[depth - 4].type == JSON_TYPE_OBJECT &&
@@ -202,11 +218,9 @@ processnode_search(struct json_node *nodes, size_t depth, const char *value,
!strcmp(nodes[depth - 5].name, "videoRenderer") &&
!strcmp(nodes[depth - 4].name, "descriptionSnippet") &&
!strcmp(nodes[depth - 3].name, "runs") &&
- !strcmp(nodes[depth - 1].name, "text") &&
- !item->shortdescription[0]) {
- strlcpy(item->shortdescription, value, sizeof(item->shortdescription));
+ !strcmp(nodes[depth - 1].name, "text")) {
+ strlcat(item->shortdescription, value, sizeof(item->shortdescription));
}
-#endif
if (depth >= 5 &&
nodes[depth - 4].type == JSON_TYPE_OBJECT &&
@@ -275,6 +289,8 @@ parse_search_response(const char *data)
/* skip header */
s += strlen("\r\n\r\n");
+// s = data; // DEBUG
+
if (!(r = calloc(1, sizeof(*r))))
return NULL;
(DIR) diff --git a/youtube/youtube.h b/youtube/youtube.h
@@ -8,10 +8,7 @@ struct item {
char publishedat[32]; /* "human-friendly" string */
char viewcount[32]; /* view count string, formatted */
char duration[32]; /* duration string */
-
-#ifdef neinneinnein
char shortdescription[4096];
-#endif
};
#define MAX_VIDEOS 50