53b8e33d13
PR #260 wired YouTube comment enrichment against `/v1/youtube/video/comments` with `id=<video_id>`, but the endpoint requires `url=https://www.youtube.com/watch?v=<video_id>`. Every enrich call was returning 400 "missing_parameter: you must provide a url", so no YouTube items ever carried `top_comments`. The SC transcript fallback (`_sc_fetch_transcript`) had the identical contract mistake. It was latent because `_fetch_transcript` prefers yt-dlp and the SC path only fires when yt-dlp is missing, but it would have failed the same way on hosts without yt-dlp installed. Switching both callers to `url=` surfaces a second issue in the response parser: SC returns `author` as `{"name": "@handle", ...}` and nests like counts under `engagement.likes`, not top-level. The parser was reading `author` as a string and missing the nested likes, so even after the param fix every comment would land with an object-shaped author and 0 likes. - `_fetch_video_comments`: send `url=` on both urllib and requests branches - `_sc_fetch_transcript`: same - Response parser: extract `author.name` when author is a dict, read `engagement.likes` when top-level `likes` is absent, prefer `publishedTime` / `publishedTimeText` for date. Legacy string-author and top-level-likes shapes still work, so existing mocks are unchanged. Verified live against api.scrapecreators.com: `_fetch_video_comments` now returns fully-populated comments with real @handles and like counts (e.g. "@JennyNicholson: ... (49000 likes, 2025-04-15)"). All tests in youtube_yt/normalize/signals/render pass. Plan: docs/plans/2026-04-15-002-fix-youtube-comments-scrapecreators-param-plan.md 🤖 Generated with Claude Opus 4.6 (1M context) via [Claude Code](https://claude.com/claude-code) + Compound Engineering v2.56.1 Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>