aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/tests/test_video_subtitles.py
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-09-18 09:47:01 +0200
committerChristophe Besson <cbesson@gmail.com>2026-09-18 09:49:27 +0200
commitc03512aeab576a06f8d5026e5eb484897ec45f99 (patch)
tree81a2f319273d01610b1851da6e3ba20b5d2c0886 /packages/meshbay-hub/tests/test_video_subtitles.py
parent4742aa685129cf790d3f7510238919ffde15a949 (diff)
downloadmeshbay-c03512aeab576a06f8d5026e5eb484897ec45f99.tar.gz
feat(cast): carry subtitles to a Chromecast, on the relay's clock
The relay forwards the node's fragments untouched, and those begin at zero at the seek point. The player never notices because its SourceBuffer is given `timestampOffset = start`; a receiver has no equivalent, so the cues are shifted by `-start` before they leave, recomputed at every restart of the relay. Sent as they are, a subtitle would be out by the whole seek. The document is served from the relay's own port at /subs.vtt, behind the same token as the stream and with CORS: a receiver fetches a side-loaded track with XHR from its own origin, and without the headers it fails as a network error with nothing on screen to say so. The URL carries a version because a track is cached by address — changing the cues behind a fixed URL leaves the previous language showing. Cues that end before the stream begins are dropped rather than clamped, so a line from before the seek cannot appear over the first frames after it. The relay is plain Node, so the tests start it and fetch from it rather than reading its source. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UGY17EPph5LsLzePPXhUVc
Diffstat (limited to 'packages/meshbay-hub/tests/test_video_subtitles.py')
-rw-r--r--packages/meshbay-hub/tests/test_video_subtitles.py13
1 files changed, 8 insertions, 5 deletions
diff --git a/packages/meshbay-hub/tests/test_video_subtitles.py b/packages/meshbay-hub/tests/test_video_subtitles.py
index 6867076..7fdc9cd 100644
--- a/packages/meshbay-hub/tests/test_video_subtitles.py
+++ b/packages/meshbay-hub/tests/test_video_subtitles.py
@@ -259,9 +259,12 @@ def test_a_failed_extraction_does_not_take_the_film_down(app):
`setError` is the player's fatal path — it replaces the picture. A text
track that could not be read must not reach it.
"""
- body = _player(app)
- start = body.index("const selectSubtitle = useCallback(")
- end = body.index("}, [entry, transportRef, gekRef]);", start)
- assert "setError(" not in body[start:end], (
+ # Matched on braces rather than on the dependency list. The deps are the
+ # part of a callback most likely to change for reasons unrelated to what is
+ # asserted here, and a slice keyed to them stops at `.index()` raising
+ # rather than at the property being broken — a guard that reports the wrong
+ # thing is barely better than one that reports nothing.
+ body = _block(_player(app), "const selectSubtitle = useCallback(")
+ assert "setError(" not in body, (
"a subtitle failure takes the whole player down")
- assert "setSubtitleError(true)" in body[start:end]
+ assert "setSubtitleError(true)" in body