From c3fae689e187e1ad3e2599ed70708086ab6f3f42 Mon Sep 17 00:00:00 2001 From: sherl Date: Wed, 17 Sep 2025 01:55:35 +0200 Subject: [PATCH] feat: show current viewer count for live streams in search results and related videos feed previously it would fall back to 0 --- ythdd_struct_parser.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ythdd_struct_parser.py b/ythdd_struct_parser.py index 45b3f50..2915361 100644 --- a/ythdd_struct_parser.py +++ b/ythdd_struct_parser.py @@ -98,6 +98,20 @@ def parseRenderers(entry: dict, context: dict = {}) -> dict: else: avatar_url = safeTraverse(entry, ["videoRenderer", "avatar", "decoratedAvatarViewModel", "avatar", "avatarViewModel", "image", "sources", 0, "url"], default="unknown") + views_or_viewers_model = safeTraverse(entry, ["videoRenderer", "viewCountText"]) + if "simpleText" in views_or_viewers_model: + # means this is a video with X views + view_count = parseViewsFromViewText(entry["videoRenderer"]["viewCountText"]["simpleText"]) + view_count_text = entry["videoRenderer"]["viewCountText"]["simpleText"] + elif "runs" in views_or_viewers_model: + # means this is a livestream with X concurrent viewers + view_count = parseViewsFromViewText(entry["videoRenderer"]["viewCountText"]["runs"][0]["text"] + " watching") + view_count_text = entry["videoRenderer"]["viewCountText"]["runs"][0]["text"] + " watching" + else: + # unknown model, assume no views + view_count = 0 + view_count_text = "Unknown amount of views" + return { "type": "video", "title": safeTraverse(entry, ["videoRenderer", "title", "runs", 0, "text"]), @@ -110,8 +124,8 @@ def parseRenderers(entry: dict, context: dict = {}) -> dict: "videoThumbnails": genThumbs(safeTraverse(entry, ["videoRenderer", "videoId"], default="unknown")), "description": description, "descriptionHtml": description_html, - "viewCount": parseViewsFromViewText(safeTraverse(entry, ["videoRenderer", "viewCountText", "simpleText"], default="No views")), - "viewCountText": safeTraverse(entry, ["videoRenderer", "viewCountText", "simpleText"], default="Unknown amount of views"), + "viewCount": view_count, + "viewCountText": view_count_text, "published": int(dateparser.parse(published_date).timestamp()), # sadly best we can do, invidious does this too "publishedText": published_date, "lengthSeconds": parseLengthFromTimeBadge(safeTraverse(entry, ["videoRenderer", "lengthText", "simpleText"], default="0:0")),