commit 011916ab287f5a9d908db01d236855fd5df5ea6a
parent de00b4517ad4bc7740cfe6a89369f5be197e1973
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Thu, 24 Sep 2026 19:40:47 -0400
plans: Rumble's embed endpoint 403s every download — upstream #17496, impersonation as step 0 of the Rumble slice
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
1 file changed, 25 insertions(+), 0 deletions(-)
diff --git a/plans/rumble-sweep-pacing.md b/plans/rumble-sweep-pacing.md
@@ -50,5 +50,30 @@ file set, so it lands after W merges):
the override) and watch one paced sweep complete; the first complete listing after 44 days may
legitimately shrink — the two-observation guard handles that as designed.
+## Found next, 2026-09-24 19:36 — Rumble's embed endpoint answers 403 to every download
+
+Step 1 worked: job `01M3AWDQ4RZD6CV93BJPREQVPX` ran the paged walk (`--lazy-playlist -I 1:50`),
+listed the newest page and found new videos. The first download died on
+`[RumbleEmbed] … Unable to download JSON metadata: HTTP Error 403: Forbidden`
+(`https://rumble.com/embedJS/u3/`, `rumble.py:168`), the managed download aborted as "network",
+and the sync failed on that one video. **It is not that video and not the patch:** the
+`leaflit-rumble` and `rekietalaw-rumble` syncs at 16:05 UTC hit the same 403, and no retained
+job log holds a successful Rumble archive line. Upstream: yt-dlp issue #17496 (opened 2026-08-20,
+same error, same `2026.08.19`, labelled *impersonation* + *site-bug*, no fix), after #15089 /
+#15148 / #15129 (Rumble behind Cloudflare, browser-only fingerprints); a June report says
+`--impersonate chrome` worked for a while. The editor never passes `--impersonate`
+(`grep -rn impersonate common editor` is empty) although the pipx venv has `curl_cffi` targets
+(Chrome-133/136, Safari-18).
+
+**Step 0 for the slice, ahead of pacing:** a per-platform yt-dlp args table (Rumble →
+`--impersonate chrome`, and the pacing from step 2) applied in `configArgs`
+(`common/ytdlp/runYtdlp.ts:221`) so every Rumble spawn — enumeration, metadata probe, download —
+carries it; `downloadQueueKey` (`common/lib/queueKeys.ts:69`) already resolves the platform.
+Verify first by hand, ONCE, metadata only (operator's rule: fetches go through Archilyzer;
+this is the ask-first exception):
+`yt-dlp --impersonate chrome --skip-download --print title https://rumble.com/v7fxzsc-lindsay-clancy-insane-twist-on-the-view-these-people-are-nuts.html`.
+If that also 403s, Rumble is closed to this client until upstream moves and the slice waits;
+the channels then need a "source unreachable" outcome rather than a failed sync per cadence.
+
Out of scope: tolerating exit 1 generally; changing the shrink guard; anything in the patched
extractor (the pagination fix is in and working; the 429 is Rumble's rate limit, not a bug).