- server/providers/rumble.mjs devient l'unique implémentation : fetch
(cookie jar __cf_bm + curl_cffi + cooldown global 60 s après un échec
total), parsing liste/vidéo avec surcouche JSON-LD partagée, vues via
parseRumbleViews partout (« 1,2K » n'est plus lu en 12 sur /api/rumble).
- server/rumble.mjs = couche HTTP mince : limiter 20/min, cache 60 s,
5 routes qui délèguent au cœur ; /search passe par le registre de
providers (cache SQLite, negative cache et channelRef partagés avec
/api/search).
- Contrat d'erreur : un blocage Cloudflare est un 503
rumble_cloudflare_challenge, plus jamais un 404 (qui faisait retirer
les vidéos du flux Shorts lors d'un challenge) ; page reçue sans
identité = 404 rumble_video_not_found.
- Code mort supprimé : scrapeRumbleVideo d'index.mjs (191 l., 3e
implémentation jamais appelée), rumbleLimiter 10/min jamais monté,
import cheerio devenu inutile. Net -238 lignes.
- Tests : parseur générique (vues, durées, ids /shorts/), contrat 503
sans réseau via le cooldown, durées absentes -> undefined.
- Docs : API_MCP_GUIDE §5.5 (routes, rate-limit réel, erreurs) + note
README « Rumble peut être temporairement absent selon le réseau ».