From a0be6bfcac07a256949082e935e1be06753ab872 Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Thu, 15 Oct 2026 10:17:29 +0200 Subject: feat(cli): stream — a film or a song played in a media player MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `meshbay-cli stream PATH` serves one video or sound file over HTTP on 127.0.0.1 for VLC, mpv or any player that reads HTTP; `--player PROGRAM` starts the player, and closing it stops the stream, as Ctrl+C does. The file goes as the node stores it: no remux, no transcode, no stream slot on the node. Byte ranges are answered from leaseless file_req chunks decrypted in memory, eight ahead and the last 24 kept. Loopback only, a random token in the address, a foreign Host refused (DNS rebinding), an audio or video type with nosniff. The connection is pinged and reopened when it dies; a refusal by the node stops the stream (exit 5). Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 1 + 1 file changed, 1 insertion(+) (limited to 'CLAUDE.md') diff --git a/CLAUDE.md b/CLAUDE.md index 57ebbd4..5048488 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1171,6 +1171,7 @@ which pytest also runs when `ANDROID_HOME` is set (`test_android_shell.py`). | Chat: read and post | `client/chat.py`, `commands/chat.py` | `chatbox` seal/verify; signature before decryption; unreadable shown, never dropped; `--follow` reconnects and prints each message once (`Follower`) | | Chat: whose device signed (Tier 2) | `client/roster.py` | port of `transport-roster.js`, held to it by `test_account_pinning.py`; account pins in `state.json` | | Interactive chat | `tui/chat.py` | `meshbay-cli chat` alone; pushed `chat_msg` live; Esc or /part back to the groups | +| Streaming to a media player | `client/relay.py`, `commands/stream.py` | §8.6: HTTP on 127.0.0.1, token in the address, foreign `Host` refused; leaseless `file_req` chunks, read ahead and kept; reconnects; a node refusal stops it | | Deleting files | `client/remove.py`, `commands/rm.py` | §5.4: the uploader's account or the node's operator; the whole run is checked before asking | | Interactive mode | `meshbay_cli/tui/` | Textual; names are drawn as text, never markup | | Man page | `meshbay_cli/manpage.py` | generated from the parser at build time; `test_manpage.py` | -- cgit v1.2.3