Fix : overlay showing some times
All checks were successful
release / build (push) Successful in 25s
release / verify-windows (push) Successful in 2m51s

This commit is contained in:
jeanotx32
2026-08-15 12:06:50 -04:00
parent 9a019447e7
commit cd3380d8d3
3 changed files with 233 additions and 53 deletions

View File

@@ -30,6 +30,8 @@ IP publique nécessaire, et obs-websocket reste sur `127.0.0.1`.
- Reconnexion automatique de bout en bout (agent → serveur, agent → OBS, dashboard → serveur).
- [Pause automatique pendant les shows privés](#pause-automatique-pendant-les-shows-privés)
(Stripchat), avec reprise et rappel du plein écran au retour du flux public.
- Le curseur est [écarté du lecteur](#écarter-le-curseur-du-lecteur) à la fin de chaque
interaction, pour que la barre de contrôles ne finisse pas dans le fichier enregistré.
- Le plein écran est [mesuré, pas supposé](#mesurer-plutôt-que-demander), relu pendant la
capture et rétabli s'il se perd ; un
[lecteur figé](#lecteur-figé--rechargement-automatique) est détecté et la page rechargée.
@@ -448,16 +450,53 @@ la fenêtre semblait rétrécir juste après le réglage de qualité, comme un s
plein écran qui aurait annulé le premier — alors qu'il ne s'agissait que d'un Échap qui
sortait du plein écran natif que la touche du lecteur venait d'activer.
**Le curseur est écarté du lecteur une fois la qualité réglée**, sans quoi la barre de
contrôles du lecteur — qui se garde affichée tant qu'une souris réelle la survole — resterait
visible en permanence, faute de mouvement ultérieur. Le point de sortie est **calculé, pas
deviné** : une marge est cherchée autour de la position réelle de l'élément vidéo (en
dessous en priorité, sinon au-dessus, à droite ou à gauche), confirmée par
`elementFromPoint` plutôt que supposée à un endroit fixe de la page. Si le lecteur couvre
tout le viewport sans la moindre marge, un évènement `mouseleave` non fiable est émis en
dernier recours sur l'élément vidéo et ses parents proches — sans garantie si le site vérifie
`isTrusted` dessus comme il le fait sur le clic du bouton de qualité, mais sans risque non
plus à tenter.
Voir aussi [Écarter le curseur du lecteur](#écarter-le-curseur-du-lecteur), qui referme la
séquence.
#### Écarter le curseur du lecteur
**Le curseur est écarté à la fin de chaque interaction avec la page** : rappel de plein écran,
réglage de qualité, et jusqu'aux abandons de ce réglage. Un lecteur vidéo garde sa barre de
contrôles affichée tant qu'une souris réelle la survole — comportement voulu pour un vrai
spectateur, mais qui la fige à l'écran ici, puisque plus rien ne bouge ensuite. Et cette barre
est enregistrée avec le flux : c'est l'incrustation que l'on voit en travers de certains
replays.
Le cas qui échappait : une capture qui **démarre** passe par le réglage de qualité, qui se
terminait déjà par cet écart — mais une **reprise** (retour du flux public après un show privé
ou un passage hors-ligne) ne fait qu'envoyer la touche du lecteur, sans repasser par la
qualité. Le curseur restait donc exactement là où la dernière interaction l'avait laissé,
c'est-à-dire sur un bouton du lecteur. D'où une incrustation présente sur certains replays et
pas sur d'autres, sans qu'aucun réglage ne les distingue.
Trois recours, du plus fiable au moins :
1. **Hors du lecteur.** Le point est **calculé, pas deviné** : une marge est cherchée autour de
la position réelle de l'élément vidéo (en dessous en priorité, sinon au-dessus, à droite ou
à gauche), confirmée par `elementFromPoint` plutôt que supposée à un endroit fixe de la
page. Une version antérieure visait un coin fixe, en pariant qu'une barre du site y restait
affichée — un coin qui s'avère faire *partie* du lecteur produit exactement l'inverse de
l'effet recherché.
2. **Dans le lecteur, à l'écart de ses commandes.** Le cas du plein écran, justement : le
lecteur couvre tout, il n'existe aucun « dehors ». Le balayage part du haut de l'image (la
barre de contrôles occupe le bas chez tous les lecteurs) et **préfère la surface vidéo nue**,
seul endroit dont on sache qu'il n'épingle rien ; un habillage sans nom parlant (voile
cliquable, dégradé) fait un repli acceptable, mais n'est jamais préféré à la vidéo quand
celle-ci est atteignable. Tout ce qui ressemble à une commande — `button`, `[role=button]`,
lien, champ, ou une classe contenant `control`/`menu`/`btn`/`bar` — est écarté. Un point
posé sur l'image relance la minuterie d'auto-masquage du lecteur, qui fait alors disparaître
la barre tout seul : ce qui n'arrive jamais tant que le curseur reste sur un bouton.
3. **Évènements de sortie simulés**, en dernier recours, sur l'élément vidéo et ses parents
proches — sans garantie si le site vérifie `isTrusted` dessus comme il le fait sur le clic du
bouton de qualité, mais sans risque non plus à tenter.
Le résultat part au journal (`curseur écarté hors du lecteur`, `lecteur plein cadre : curseur
posé à l'écart des commandes`…) : c'est ce qui permet, devant un replay incrusté, de savoir si
le curseur avait été déplacé et où il avait atterri.
L'écart a lieu **après** la mesure du plein écran, jamais avant : déplacer le curseur réaffiche
les contrôles le temps de la minuterie, et le relevé porterait alors sur une page en train de
changer.
#### Lancement simple