138 lines
5.6 KiB
Markdown
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.
|