rox

Un reproductor sobre el que construir

rox tiene lo que otros reproductores empaquetan un servidor web para conseguir: un socket JSON-RPC local, eventos empujados cuando algo cambia, un proxy MCP y una emisión a Icecast.

El servidor que rox se niega a ser

La forma habitual de que un reproductor de escritorio se abra al exterior es incrustar un servidor web. Eso compra el control remoto y cuesta todo lo demás: un puerto en tu máquina, una historia de autenticación, una interfaz web que abandona el aspecto del propio reproductor, y una superficie de ataque que un reproductor de música no tiene por qué tener. Lo pagan todos los usuarios para que puedan los pocos que programan sobre su reproductor.

rox se queda con la capacidad y rechaza el envoltorio. Su interfaz de máquina es un socket local, un socket de dominio Unix en Linux y macOS y una tubería con nombre en Windows, atado a la carpeta de datos para que dos instancias portátiles nunca se crucen. La autenticación son los permisos del sistema de archivos: cualquier cosa que pudiera leer tu música ya puede hacer lo que el socket permite. Nada escucha en un puerto, y en el binario no viaja ningún servidor HTTP.

Un socket, el reproductor entero

El protocolo es JSON-RPC 2.0, un objeto por línea, abierto con un saludo de versión. transport.* maneja el transporte: alternar, saltar, volumen, la sección A-B. queue.* edita el orden de reproducción por id estable de entrada, así que la fila que moviste sigue siendo la fila que querías decir. library.* busca, devuelve las etiquetas completas de la pista que suena y entrega la carátula. library.rescan y tasks.* inician, siguen y detienen los reescaneos y las pasadas de análisis, y la respuesta al inicio lleva el número de pistas y la estimación de tiempo que te habría mostrado la ventana. Cada método lee y maneja el mismo reproductor y la misma biblioteca que los paneles, así que el socket nunca puede decir algo que la interfaz no diría.

El precedente son el IPC JSON de mpv y el protocolo de mpd, y el coste también es el suyo: un consumidor necesita un cliente de socket donde un servidor habría ofrecido curl. roxctl, el cliente de referencia en el árbol del código, cubre el caso de la shell, una llamada por invocación, --json cuando lee un script, así que roxctl next y roxctl search miles davis funcionan antes de que hayas escrito una línea de nada.

Empuje, para no sondear nunca

Un front end que no puede suscribirse acabará sondeando, así que los eventos están en el contrato desde la versión uno. Llama a subscribe y el socket empuja tramas según se mueven las cosas: event.track al cambiar de pista, event.playback cuando cambian el estado de reproducción, el volumen o el silencio, event.queue cuando cambia el orden.

A un consumidor que se queda atrás se le corta en vez de esperarlo, así que un lector atascado nunca puede atragantar la reproducción. roxctl watch imprime el flujo según llega, que es un "sonando ahora" para una barra de estado resuelto en un bucle de shell.

MCP, que ningún otro reproductor tiene

Junto a la aplicación va rox-mcp, un binario fino que habla MCP sobre stdio por un lado y con el socket por el otro. Apúntale Claude o cualquier cliente MCP y el reproductor se convierte en herramientas: qué suena, buscar en la biblioteca, leer la cola, manejar el transporte, iniciar un reescaneo o una pasada de análisis. "Pon en cola algo tranquilo de los 70" deja de ser una función que rox tendría que criar y pasa a ser una frase sobre la que tu asistente puede actuar.

Cada herramienta pasa por un método del socket, así que la superficie MCP es por construcción un subconjunto de lo que sirve el socket y no puede adelantársele. Y se activa dos veces: un interruptor de funciones de IA, apagado por defecto, revela una página de ajustes de MCP con su propio interruptor, y cada llamada de herramienta vuelve a comprobar los interruptores en la aplicación en marcha antes de responder. Apagado significa un rechazo claro, no un cuelgue.

La mitad del audio

El control es la mitad de un front end; la otra mitad es oír algo. rox conecta hacia fuera con un servidor Icecast como cliente de origen y empuja el flujo procesado, codificado a MP3, al punto de montaje que le indiques. La toma viene después de la cadena de procesado, así que la emisión es exactamente lo que reciben los altavoces, ecualizador incluido.

La dirección es la gracia. rox conecta hacia fuera, nunca sirve: el punto de montaje, los oyentes y la cara de red son todos de Icecast. Un servidor inalcanzable tira los trozos al suelo antes que tocar la reproducción local, y el emisor se reconecta a su propio ritmo mientras la configuración siga ahí.

Lo que eso abre

Cada pieza es útil por sí sola. Un demonio de teclas multimedia o un widget de barra de estado son el socket y unas pocas líneas. Un controlador físico, un stream deck o una rueda en un microcontrolador, es transport.* desde cualquier cosa que alcance un socket. El modo quiosco para una sala de escucha son los métodos de cola y event.track moviendo una pantalla.

Júntalas y rox es el backend de un montaje de streaming personal: transporte y cola por el socket, el audio incrustado desde el punto de montaje de Icecast, y un front end que escribes en lo que quieras, con tu biblioteca sonando en la máquina que la guarda.

Trae un cliente de socket

El socket está encendido allá donde corra rox, rox-mcp viaja junto a la aplicación, y la página de MCP en los ajustes tiene la línea de configuración para tu cliente. roxctl se compila desde el código con un comando de cargo.

Descargar rox

¿En Arch o NixOS? Instálalo desde el AUR o el flake de Nix en su lugar.

v1.26.4 · Linux, macOS, Windows · todas las descargas