fix(rumble): un HTTP 404 net n'est pas un blocage Cloudflare
CI / build-and-test (push) Canceled after 0s

Probe live depuis le conteneur : rumble.com renvoie 404 (vraie page,
non-challenge) pour un id inexistant. fetchHtml les classait en échec
total, d'où deux régressions : 503 sur /video (les vidéos mortes ne
sont plus retirées des Shorts) et armement du cooldown 60 s pour toute
la maison au premier id bogus.

- fetchHtml retourne toute réponse nette non-challenge ; le statut est
  jugé par les appelants (tous dans le même fichier).
- rumbleFailureForStatus() exporté : 403 -> 503
  rumble_cloudflare_challenge (bandeau identique à la recherche),
  404/410 -> 404 rumble_not_found, 5xx -> 503 rumble_upstream_error.
  /video, /browse et /shorts passent par ce mapping.
- handler.search ne parse plus que du HTTP 200 : les pages 404 de
  Rumble embarquent des cartes de recommandation qui seraient
  autrement prises pour des résultats de recherche.
- Tests : 7 assertions sur le mapping (sans réseau), 64 au total.
This commit is contained in:
2026-10-02 08:49:44 -04:00
parent e48d76be57
commit 7fc1e1096d
3 changed files with 34 additions and 5 deletions
+11 -1
View File
@@ -1,4 +1,4 @@
import { parseJsonLd, parseRumbleViews, parseSearchHtml, resetRumbleNegativeCache, parseCardsHtml, scrapeRumbleList, scrapeRumbleVideo, armRumbleFetchCooldown, resetRumbleFetchCooldown } from '../providers/rumble.mjs';
import { parseJsonLd, parseRumbleViews, parseSearchHtml, resetRumbleNegativeCache, parseCardsHtml, scrapeRumbleList, scrapeRumbleVideo, armRumbleFetchCooldown, resetRumbleFetchCooldown, rumbleFailureForStatus } from '../providers/rumble.mjs';
import { parseRelativeDate } from '../providers/youtube-innertube.mjs';
import { itemDurationSec } from '../search-filters.mjs';
@@ -181,4 +181,14 @@ await expectFail(() => scrapeRumbleList({}), 503, 'rumble_cloudflare_challenge',
resetRumbleFetchCooldown();
pass++; console.log(' V cooldown CF: /video et /browse échouent en 503 sans réseau');
// --- Mapping statut HTTP -> erreur typée (rumble.com renvoie 404 NET pour un
// id inexistant : ce n'est PAS un blocage, ça ne doit pas armer le cooldown) ---
eq(rumbleFailureForStatus(404).status, 404, 'statut 404 rumble -> 404 (absente, pas un blocage)');
eq(rumbleFailureForStatus(404).code, 'rumble_not_found', 'statut 404 rumble -> code rumble_not_found');
eq(rumbleFailureForStatus(410).status, 404, 'statut 410 -> 404');
eq(rumbleFailureForStatus(403).status, 503, 'statut 403 -> 503 bloqué');
eq(rumbleFailureForStatus(403).code, 'rumble_cloudflare_challenge', '403 -> même code que le blocage de recherche (bandeau identique)');
eq(rumbleFailureForStatus(500).status, 503, 'statut 5xx -> 503 amont');
eq(rumbleFailureForStatus(500).code, 'rumble_upstream_error', '5xx -> code amont');
console.log(`\n rumble-ld: ${pass} assertions OK`);