Skip to content

Releases: dmitry-ra/stv-watch

stv-watch 0.7.1

Choose a tag to compare

@dmitry-ra dmitry-ra released this 28 Oct 21:06
4ae60ef

stv-watch joins a SourceTV relay of Half-Life 2: Deathmatch or Team Fortress 2 as a spectator and shows voice (with a transcript), chat and game events, live or from a recording.

Since 0.7.0:

  • On PyPI. uv tool install stv-watch (or pipx install stv-watch) installs the stv-watch command; a clone with uv run stays the way to run from source, with the tests, the tools and the sample recording.
  • README, AGENTS.md and the skill show the installed command; the demo is recorded with 0.7.1.

The program is the same as 0.7.0. Checks: the wheel installed with uv tool install on a clean Ubuntu 24.04 VM, its replay of tests/data/sample.tvd gives the same events as 0.7.0; 469 tests.

stv-watch 0.7.0

Choose a tag to compare

@dmitry-ra dmitry-ra released this 16 Oct 23:16
1f88f9b

stv-watch joins a SourceTV relay of Half-Life 2: Deathmatch or Team Fortress 2 as a spectator and shows voice (with a transcript), chat and game events, live or from a recording.

Since 0.6.1:

  • Team Fortress 2. --game tf2 watches a TF2 relay: chat channels including coach and location, the kill feed with the assister, headshots and backstabs, a Dead Ringer's faked death marked feigned, teams RED and BLU. Voice is the same steam codec and is recognized as before.
  • Game profiles. What differs between the games (SendTable CRC by build, user message ids, chat formats, teams, the userinfo sent at CONNECTED, kill details, who hears whom) lives in stvwatch/games/. --game defaults to hl2dm.
  • A relay of another game is refused before connecting, by the A2S folder (hl2mp / tf): exit code 2 naming the option to use, also under --keep-trying. A relay of a game stv-watch does not know is refused with exit code 3.
  • The game is recorded in capture.tvd and meta.json; --replay and --follow take it from the recording. A recording from before 0.7.0 has none and reads as hl2dm (or --game).
  • userinfo compressed with Snappy (SNAP), as TF2 relays send a full table; before, every player stayed #userid.
  • A session that leaves FULL within 10 s is not productive: the reconnect delay grows (4, 8, 16, 30 s) instead of staying at 2 s.
  • tools/read_crc.py and tools/read_usermessages.py take --game.

Checks: 469 tests; 53 HL2DM recordings replayed against 0.6.1 line for line, transcripts and WAV by sha256 with no difference; 14 sessions on 11 public TF2 relays (12.3 hours) replayed with recognition with no difference, every live session reached FULL and left cleanly.

stv-watch 0.6.1

Choose a tag to compare

@dmitry-ra dmitry-ra released this 12 Oct 15:27
97e6bd4

stv-watch joins a Half-Life 2: Deathmatch SourceTV relay as a spectator and shows voice (with a transcript), chat and game events, live or from a recording.

Since 0.6.0:

  • Voice from a bot's slot is named, not checked. When SourceTV talks (as a server plugin can make it), its voice is signed with the server's own SteamID, and 0.6.0 reported it as a forgery: empty nick, verified: false, slot_steamid64: 0. Now a slot the server marks as a fake client (guid BOT in userinfo) gives its talk and voice lines bot: true and the slot's nick; the voice line has no verified and no slot_steamid64. The screen shows the name and a dim [bot]. A player without an account yet (friendsID 0) is not a bot and is still checked.
  • Someone signing as the bot is still caught. If a message of such an utterance comes from a player's slot, the voice line has no bot and reads verified: false with that player's slot_steamid64.
  • Non-player SteamIDs read in Steam3, as the server's status prints them ([A:1:1234567:4321]), instead of a nonsense STEAM_0:x:n; players keep STEAM_0:x:n.
  • Schema: bot is allowed on talk and voice (always true); verified is required on voice only without bot, and forbidden with it.

stv-watch 0.6.0

Choose a tag to compare

@dmitry-ra dmitry-ra released this 11 Oct 20:07
2793594

stv-watch joins a Half-Life 2: Deathmatch SourceTV relay as a spectator and shows voice (with a transcript), chat and game events, live or from a recording.

Since 0.5.0:

  • An ordered event stream. events.jsonl, --json and feed.log are written in non-decreasing t_utc, and t_utc of every line is the moment of its event on the recording clock. A replay gives the same lines at any --speed, and the same as live. The stream holds lines back only from the moment an utterance closes until its text is ready; without --asr nothing is held.
  • Voice as talk and voice. talk comes at the first packet of an utterance; voice when it closed and its text is ready, with start_utc and end_utc of the speech (t_end_utc is gone). The two share utt. This changes the format: a reader that took t_utc of a voice line as the start of speech should read start_utc.
  • Rotation is a cut of the stream. rotate is the last line of the old events.jsonl and nothing follows it; concatenated sessions are the whole run. An utterance across a cut has its talk line in the old session and its voice line, WAV and transcript row in the session where it closes. WAV files no longer move between directories.
  • Relays with tv_password. The password comes from --password-file, STV_WATCH_PASSWORD or a per-relay store $XDG_CONFIG_HOME/stv-watch/passwords, and is sent only to a relay that announces one. It never reaches argv, session files, the screen or logs.
  • --keep-trying for a window that should stay up: refusals and network client deaths wait (300 s doubling to 30 min after a refusal, 10 s to 300 s after a client death) instead of exiting, re-reading the password before every attempt; each wait is a wait line.
  • Exit codes by class: 0 done as asked, 1 bug, 2 usage or configuration, 3 the relay does not accept us, 4 the network client died, 5 the session cannot be written. Every events.jsonl ends with done (or rotate), whose fields say how the run ended; meta.json is written atomically and before done. New quit labels: client left: time limit, client died (rc N), time limit.

stv-watch 0.5.0

Choose a tag to compare

@dmitry-ra dmitry-ra released this 11 Oct 01:50
0537005

stv-watch joins a Half-Life 2: Deathmatch SourceTV relay as a spectator and shows voice (with a transcript), chat and game events, live or from a recording.

stv-watch 0.5.0 replaying a synthetic recording

Since 0.4.0:

  • Session rotation. --rotate "0 6 * * *" starts a new session directory on a cron schedule (five fields, in the --tz zone, UTC without it), by recording time, in every source mode. The relay connection stays up. The new directory and all its files are created and opened first; then the old events.jsonl ends with a rotate line that names the new events.jsonl and directory; then the old files are closed. A phrase still being spoken or recognized at the boundary goes whole into the new session. Live, the network client rotates capture.tvd itself, and the old capture ends with a record pointing to the new one. Off by default. A schedule with other than five fields, or one that never fires, is refused at start.
  • An attached screen keeps its own time zone. --attach --tz ZONE shows times in that zone; without --tz the screen uses the engine's. The engine now sends times as UTC data rather than drawn text. The serve protocol is 3; a screen and an engine of different protocols refuse each other.
  • onnxruntime telemetry is off. onnxruntime 1.29 and later on Linux uploads usage events to Microsoft and keeps a device id in ~/.cache/Microsoft. stv-watch sets ORT_DISABLE_TELEMETRY=1 before onnxruntime is loaded, unless you set the variable yourself.
  • The kills line is kills N N/min. The top NICK N suffix is gone: it was keyed by nick and never reset, so it said little.
  • Docs: the README was checked step by step on a clean Ubuntu 24.04 VM and fixed where it fell short. It now covers rotation, the SourceTV port, --follow and the session files. A skill for coding agents is in skills/stv-watch/.

stv-watch 0.4.0

Choose a tag to compare

@dmitry-ra dmitry-ra released this 10 Oct 22:38
da2a546

First tagged release.

stv-watch joins a Half-Life 2: Deathmatch SourceTV relay as a spectator and shows voice (with a transcript), chat and game events, live or from a recording.

Since 0.3.0:

  • Attached screens are marked. A screen run with --attach labels the rule over its block attached in its own colour, and the q hint says what q does: q quit - stops the engine on the engine's own screen, q close screen - engine keeps running on an attached one. The serve protocol is now 2; a screen and an engine of different protocols refuse each other with both versions named.
  • The version at a release tag is bare. Run from a checkout at tag v0.4.0 with no changes, stv-watch reports 0.4.0; elsewhere the commit is still added (+g..., .dirty).
  • Nemotron weights come from the k2-fsa asr-models release, as the Silero VAD weights do; the archive and every file in it are checked by sha256. A killed download no longer leaves partial files in the model cache.
  • Python 3.12 to 3.14, each tested in CI; the local test server no longer needs os.pidfd_open, which some Python builds lack.
  • Docs: protocol background, the sources of the protocol notes, prior art.