aboutsummaryrefslogtreecommitdiffstats
path: root/live
Commit message (Collapse)AuthorAgeFilesLines
* live: a streamer can delete their own recording (POST /live/<id>/delete, ↵Adam Soltys7 days1-8/+34
| | | | | | | NIP-98), ending the stream if it's on. Its files go, and stream.json stays as 'deleted' so the address answers 410 until the trim takes it. A stream someone reported is taken aside instead (.removed/, kept for reporting), so deleting can't destroy what was reported. Removed and deleted streams no longer count as live (toward MAX_STREAMS, or as exempt from the trim). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: WebRTC through Cloudflare's SFU (Realtime) for the app's viewers, a ↵Adam Soltys7 days1-2/+100
| | | | | | | | | | | fraction of a second behind the broadcaster where HLS is 3.5 s. The server only brokers it, and the app's secret stays here ($LIVE_CONFIG sfuAppId/sfuSecret): - POST /live/<id>/rtc/publish (the sender, NIP-98) pushes its tracks. - POST /live/<id>/rtc/watch hands a viewer an offer of them, and /rtc/answer takes its answer. /stats says which publish is current (rtc), and ?watching=1 counts a WebRTC viewer, who never fetches the playlist. HLS carries on as before, for the recording and the other nostr apps. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: 1 s HLS segments (keyframes every second), 10 in the live window — a ↵Adam Soltys7 days1-2/+4
| | | | | | | player starts about three segments behind the edge, so most of a viewer's delay was the 2 s segments (8.6 s behind the broadcaster, measured; 4.5 s with these). Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: a name streams a day after it's claimed (the registrar now records ↵Adam Soltys7 days1-13/+116
| | | | | | | when; older records count from their last update), never if banned; GET /live/allowed says which and until when. Viewers can report a stream (POST /live/<id>/report, NIP-98): kept in .reports.jsonl and DM'd to the admins from the welcome key. An admin takes a stream down (POST /live/<id>/remove {ban}): it ends, its playlists and segments answer 410, its files move to .removed/ (kept for reporting, never trimmed), and a ban stops its sender streaming. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: recordings are kept 90 days, not 7 (the app lists past streams).Adam Soltys7 days1-1/+1
| | | | | Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: /live/turn — ICE servers for the app's calls (Cloudflare TURN ↵Adam Soltys8 days1-4/+39
| | | | | | | credentials good for 4 h, to a NIP-98-signed ask; 30 an hour per key, 60 per IP; STUN alone if TURN can't be had). The key comes from $STATE/live/config.json. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: /live/ping, a WebSocket that says pong — whether sockets get through ↵Adam Soltys8 days1-0/+4
| | | | | | | to the service. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
* live: live streams sent from the app — the browser's recording over a ↵Adam Soltys8 days1-0/+290
WebSocket (on 443, through Cloudflare: no ports to open), ffmpeg to 2 s HLS (H.264 720p, AAC), a live window and the whole stream (its recording), viewers counted, a dropped sender resuming the same stream, NIP-98 + coinos-name owners only, 3 at once, 4 h each, recordings kept a week. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg