diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-10-15 10:17:29 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-10-15 10:17:29 +0200 |
| commit | a0be6bfcac07a256949082e935e1be06753ab872 (patch) | |
| tree | c6f531254e0abf8303080ba6287cf1fc405a72c1 /packages/meshbay-cli/src/meshbay_cli/__main__.py | |
| parent | 2f90f4b60cd50f7e9649daaf8e76a120e608cff6 (diff) | |
| download | meshbay-a0be6bfcac07a256949082e935e1be06753ab872.tar.gz | |
feat(cli): stream — a film or a song played in a media player
`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 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-cli/src/meshbay_cli/__main__.py')
| -rw-r--r-- | packages/meshbay-cli/src/meshbay_cli/__main__.py | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/packages/meshbay-cli/src/meshbay_cli/__main__.py b/packages/meshbay-cli/src/meshbay_cli/__main__.py index 2a71c17..f5b002a 100644 --- a/packages/meshbay-cli/src/meshbay_cli/__main__.py +++ b/packages/meshbay-cli/src/meshbay_cli/__main__.py @@ -28,6 +28,7 @@ from .commands import ( put, rm, search, + stream, trust, ) from .commands.context import Context @@ -35,8 +36,8 @@ from .errors import INTERRUPTED, USAGE, CliError ACTIONS = {"login": login, "logout": logout, "groups": groups, "invitations": invitations, "join": join, "decline": decline, "leave": leave, "ls": ls, "search": search, "get": get, - "put": put, "rm": rm, "chat": chat, "devices": devices, "trust": trust, - "browser-access": browser_access, "help": help} + "stream": stream, "put": put, "rm": rm, "chat": chat, "devices": devices, + "trust": trust, "browser-access": browser_access, "help": help} class _Parser(argparse.ArgumentParser): @@ -142,8 +143,8 @@ def main(argv: list[str] | None = None) -> int: def _utf8_output() -> None: """Names are printed as they are; a Windows console's code page cannot hold most.""" - for stream in (sys.stdout, sys.stderr): - reconfigure = getattr(stream, "reconfigure", None) + for out in (sys.stdout, sys.stderr): + reconfigure = getattr(out, "reconfigure", None) if reconfigure is not None: try: reconfigure(encoding="utf-8", errors="replace") |