#!/usr/bin/env python3
"""
Транслирует stdin (сырой PCM s16le stereo 44100) во все подключённые WebSocket-клиенты.
Слушает только 127.0.0.1 — наружу отдаёт nginx (proxy_pass).

  ffmpeg ... | python3 rd-audio-ws-server.py

Зависимость: pip install websockets
"""
from __future__ import annotations

import asyncio
import os
import sys

try:
    import websockets
except ImportError:
    print("Install: pip install websockets", file=sys.stderr)
    sys.exit(1)

HOST = os.environ.get("RD_AUDIO_BIND", "127.0.0.1")
PORT = int(os.environ.get("RD_AUDIO_PORT", "8765"))
CHUNK = 8192  # кратно 4 байтам (stereo s16)


def main() -> None:
    asyncio.run(_run())


async def _run() -> None:
    clients: set = set()

    async def register(ws) -> None:
        clients.add(ws)
        try:
            await ws.wait_closed()
        finally:
            clients.discard(ws)

    async def stdin_pump() -> None:
        loop = asyncio.get_running_loop()
        while True:
            data = await loop.run_in_executor(None, lambda: sys.stdin.buffer.read(CHUNK))
            if not data:
                break
            if not clients:
                continue
            dead = []
            for ws in list(clients):
                try:
                    await ws.send(data)
                except Exception:
                    dead.append(ws)
            for ws in dead:
                clients.discard(ws)

    async with websockets.serve(register, HOST, PORT, ping_interval=20, ping_timeout=60):
        await stdin_pump()


if __name__ == "__main__":
    main()
