Files
stream-control/tools/stream-capture/README.md
jeanotx32 4f7b8f56ae
Some checks failed
release / build (push) Successful in 27s
release / verify-windows (push) Failing after 1m3s
Feat : page streamer
2026-08-11 20:04:08 +02:00

138 lines
5.6 KiB
Markdown

# 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 `<all_urls>`, 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.