diff --git a/scripts/lib/youtube_yt.py b/scripts/lib/youtube_yt.py index 0356c6c..7d71f72 100644 --- a/scripts/lib/youtube_yt.py +++ b/scripts/lib/youtube_yt.py @@ -732,10 +732,11 @@ def _fetch_video_comments( Returns: List of comment dicts with author, text, likes, date. """ + video_url = f"https://www.youtube.com/watch?v={video_id}" if not _requests: try: from urllib.parse import urlencode - params = urlencode({"id": video_id}) + params = urlencode({"url": video_url}) url = f"{SCRAPECREATORS_YT_BASE}/video/comments?{params}" headers = http.scrapecreators_headers(token) headers["User-Agent"] = http.USER_AGENT @@ -747,7 +748,7 @@ def _fetch_video_comments( try: resp = _requests.get( f"{SCRAPECREATORS_YT_BASE}/video/comments", - params={"id": video_id}, + params={"url": video_url}, headers=http.scrapecreators_headers(token), timeout=30, ) @@ -763,11 +764,32 @@ def _fetch_video_comments( text = c.get("text") or c.get("body") or c.get("content", "") if not text: continue + + # SC returns author as {"name": "@handle", ...}; legacy mocks may pass a string. + author = c.get("author") or c.get("author_name", "") + if isinstance(author, dict): + author = author.get("name") or author.get("handle") or "" + + # SC nests likes under engagement.likes; legacy shapes used top-level keys. + engagement = c.get("engagement") or {} + likes = c.get("likes") + if likes is None: + likes = engagement.get("likes", 0) if isinstance(engagement, dict) else 0 + if not likes: + likes = c.get("vote_count", 0) + + date = ( + c.get("date") + or c.get("published_at") + or c.get("publishedTime") + or c.get("publishedTimeText", "") + ) + comments.append({ - "author": c.get("author") or c.get("author_name", ""), + "author": author, "text": text[:400], - "likes": c.get("likes") or c.get("vote_count", 0), - "date": c.get("date") or c.get("published_at", ""), + "likes": likes, + "date": date, }) return comments @@ -931,10 +953,11 @@ def _sc_fetch_transcript(video_id: str, token: str) -> Optional[str]: Returns: Plaintext transcript string, or None if unavailable. """ + video_url = f"https://www.youtube.com/watch?v={video_id}" if not _requests: try: from urllib.parse import urlencode - params = urlencode({"id": video_id}) + params = urlencode({"url": video_url}) url = f"{SCRAPECREATORS_YT_BASE}/video/transcript?{params}" headers = http.scrapecreators_headers(token) headers["User-Agent"] = http.USER_AGENT @@ -946,7 +969,7 @@ def _sc_fetch_transcript(video_id: str, token: str) -> Optional[str]: try: resp = _requests.get( f"{SCRAPECREATORS_YT_BASE}/video/transcript", - params={"id": video_id}, + params={"url": video_url}, headers=http.scrapecreators_headers(token), timeout=30, )