# Stream Capture — banc d'essai Copie les segments média que **ton** Firefox, connecté à **ton** compte, télécharge déjà. L'extension ne redemande rien à la plateforme : elle lit le flux de réponse au passage et le réécrit aussitôt vers la page. Objectif : répondre à une question factuelle avant d'investir dans l'intégration — **les octets reçus sont-ils du média directement exploitable ?** ## Marche à suivre ### 1. Lancer le récepteur Sur la VM, depuis ce dossier : ```bash node receiver.mjs ``` Il écoute sur `127.0.0.1:8099` et crée un dossier de session sous `./captures/`. ### 2. Charger l'extension dans Firefox 1. `about:debugging#/runtime/this-firefox` 2. **Charger un module temporaire…** 3. Sélectionner le fichier `manifest.json` de ce dossier L'extension reste active jusqu'à la fermeture de Firefox. Un compteur apparaît sur son icône à mesure que les segments sont copiés (en rouge si le récepteur ne répond pas). ### 3. Lancer la lecture Ouvre le profil du streamer dans un onglet, connecté à ton compte, et laisse jouer 30 secondes. Le récepteur affiche les segments au fil de l'eau. ### 4. Obtenir le verdict `Ctrl-C` dans le terminal du récepteur. Il assemble ce qu'il a reçu et analyse : ``` Manifeste réel : oui ← le direct, pas la boucle publicitaire Leurre publicitaire détecté : non Tags MOUFLON : présents ✓ ffprobe lit le fichier — les segments sont du média exploitable : format_name=mov,mp4,m4a codec_type=video / codec_name=h264 / 1920x1080 ``` `ffprobe` est requis pour le verdict : `sudo apt install ffmpeg`. ## Interpréter le résultat | Sortie | Signification | | --- | --- | | ✓ ffprobe lit le fichier | Les segments sont du fMP4 standard. **La capture directe est viable**, l'intégration à l'application a du sens | | ✗ ffprobe ne reconnaît pas | Soit l'assemblage est incomplet (init manquant), soit les segments subissent une transformation côté lecteur | | Leurre publicitaire : oui | La session n'a pas servi le direct — vérifie que tu es bien connecté dans cet onglet | | Rien n'a été capturé | Extension non chargée, ou lecture jamais démarrée | Dans le second cas, **envoie-moi la sortie complète**. Si les segments sont transformés par le lecteur, écrire l'inverse de cette transformation reviendrait à contourner une mesure de protection, et je m'arrêterai là — mais la distinction se fait sur ce verdict, pas sur une supposition. ## Ce que fait exactement l'extension ``` requête initiée par la page │ ├──► filterResponseData : on lit les octets qui arrivent │ │ │ ├──► filter.write(...) → la page reçoit son flux, inchangé │ └──► POST 127.0.0.1:8099 → copie locale │ └──► lecture normale, aucune requête supplémentaire vers la plateforme ``` ### Sur la portée des permissions Le manifeste demande ``, et c'est délibéré : **une requête vers un domaine non déclaré est purement invisible** pour une extension. Or les noms d'hôte du CDN n'ont été observés que sur le leurre anonyme — rien ne garantit qu'une session authentifiée soit servie par les mêmes. Restreindre la permission aux hôtes connus risquait de ne rien capturer du tout, sans le moindre indice. Le filtrage réel est dans le code, pas dans la permission : - seules les URL finissant par `.m3u8`, `.m4s`, `.mp4` ou `.ts` sont lues ; - tout le reste retourne immédiatement, sans être ouvert ; - la seule destination sortante est `127.0.0.1:8099` ; - aucune permission `tabs`, `cookies`, `storage` ni `scripting`. L'extension journalise les hôtes qui servent du média. Une fois le bon CDN connu, la permission peut être resserrée sur lui. ## Dépannage ### « Ne peut pas lire les données de ce site » C'est l'indicateur de permissions de Firefox, et il parle du **site affiché dans l'onglet**. La version 0.1.0 ne déclarait que le CDN, pas `stripchat.com` : sur cet onglet, Firefox annonçait donc à juste titre n'avoir aucun droit de lecture. Corrigé en 0.2.0 — recharge le module temporaire. ### Vérifier que la capture fonctionne vraiment L'indicateur de permissions ne dit rien de l'activité réelle. Deux signaux fiables : 1. **Le compteur sur l'icône** de l'extension s'incrémente. En rouge, le récepteur ne répond pas (`node receiver.mjs` non lancé). 2. **La console de l'extension** : `about:debugging#/runtime/this-firefox` → *Inspecter* en face de Stream Capture. Elle liste les hôtes qui servent du média, et résume toutes les 30 s : ``` stream-capture : média servi par media-hls.doppiocdn.com stream-capture : 47 copiés, 0 en échec — hôtes : media-hls.doppiocdn.com (47) ``` ### Aucun hôte média détecté Si la console ne mentionne aucun hôte alors que la vidéo joue, le lecteur ne passe pas par des requêtes HTTP filtrables — par exemple du WebRTC, qui ne transite pas par `webRequest`. Recopie-moi la sortie de la console : c'est l'information qui manque pour trancher. ## Limites de ce banc d'essai - Aucune intégration à l'application : ni bouton, ni dossier de destination configurable, ni découpage par session d'enregistrement. C'est délibéré — on valide la faisabilité avant de construire la plomberie. - L'assemblage concatène `init` puis les segments dans l'ordre d'arrivée. Si plusieurs qualités sont téléchargées en parallèle, le fichier mélangera les pistes : force une seule qualité dans le lecteur pour le test. - L'extension étant chargée en temporaire, elle disparaît au redémarrage de Firefox.