rox

Програвач, на якому можна будувати

У rox є те, заради чого інші програвачі вбудовують вебсервер: локальний сокет JSON-RPC, події, надіслані щойно щось міняється, проксі MCP і потік назовні на Icecast.

Сервер, яким rox відмовляється бути

Звичний спосіб для десктопного програвача відкритися - вбудувати вебсервер. Це купує віддалене керування й коштує всього іншого: порт на вашій машині, історія з автентифікацією, веб-інтерфейс, який кидає власний вигляд програвача, і поверхня атаки, яка музичному програвачу ні до чого. Платять за це всі, щоб могли ті кілька, хто скриптує свій програвач.

rox лишає можливість і відмовляється від доставки. Його машинний інтерфейс - локальний сокет, Unix domain socket на Linux і macOS та іменований канал на Windows, прив'язаний до теки даних, тож дві портативні копії ніколи не перетнуться. Автентифікація - права файлової системи: все, що могло прочитати вашу музику, вже може те, що дозволяє сокет. Ніщо не слухає порт, і жоден HTTP-сервер не їде в бінарнику.

Один сокет, увесь програвач

Протокол - JSON-RPC 2.0, один об'єкт на рядок, відкривається рукостисканням версій. transport.* крутить деку: перемикання, перемотування, гучність, відрізок A-B. queue.* править порядок відтворення за стабільним id запису, тож рядок, який ви пересунули, досі той рядок, який ви мали на увазі. library.* шукає, повертає повні теги треку, що грає, і віддає обкладинку. library.rescan і tasks.* запускають, відстежують і зупиняють пересканування та проходи аналізу, а відповідь на запуск несе кількість треків і оцінку часу, які показало б вікно. Кожен метод читає й крутить того самого програвача й ту саму медіатеку, що й панелі, тож сокет ніколи не скаже того, чого не сказав би інтерфейс.

Прообраз - JSON IPC у mpv і протокол mpd, і ціна теж їхня: споживачу потрібен сокет-клієнт там, де сервер запропонував би curl. roxctl, еталонний клієнт у дереві джерел, закриває випадок оболонки: один виклик на запуск, --json, коли читає скрипт, тож roxctl next і roxctl search miles davis працюють ще до того, як ви написали хоч рядок чогось.

Пуш, щоб ніколи не опитувати

Фронтенд, який не може підписатися, опитуватиме, тож події в контракті з першої версії. Викличте subscribe, і сокет шле кадри, щойно щось рухається: event.track на зміні треку, event.playback, коли міняється стан відтворення, гучність чи вимкнення звуку, event.queue, коли міняється порядок.

Споживача, який відстав, відрізають, а не чекають, тож завислий читач ніколи не підіпре відтворення. roxctl watch друкує потік, як той приходить, а це дисплей «зараз грає» для смуги стану, розв'язаний одним циклом оболонки.

MCP, якого немає ні в кого іншого

Поруч із застосунком лежить rox-mcp, тонкий бінарник, що говорить MCP через stdio з одного боку і з сокетом з іншого. Спрямуйте на нього Claude чи будь-який клієнт MCP, і програвач стає інструментами: що грає, пошук медіатекою, читання черги, керування відтворенням, запуск пересканування чи проходу аналізу. «Постав у чергу щось тихе із сімдесятих» перестає бути функцією, яку rox мусив би відростити, і стає реченням, за яким ваш асистент може діяти.

Кожен інструмент проксує метод сокета, тож поверхня MCP за побудовою - підмножина того, що обслуговує сокет, і втекти вперед не може. І згода тут подвійна: перемикач функцій ШІ, вимкнений за замовчуванням, відкриває сторінку налаштувань MCP з власним перемикачем, а кожен виклик інструмента заново перевіряє обидва в запущеному застосунку, перш ніж відповісти. Вимкнено означає чітку відмову, а не зависання.

Звукова половина

Керування - половина фронтенда; друга половина - щось почути. rox під'єднується назовні до сервера Icecast як клієнт-джерело і шле оброблений потік, закодований у MP3, на точку монтування, яку ви назвали. Відвід іде після ланцюжка обробки, тож трансляція - це рівно те, що дістають колонки, з еквалайзером включно.

Суть у напрямку. rox під'єднується назовні й ніколи не обслуговує: точка монтування, слухачі й мережевий бік належать Icecast. Недоступний сервер губить шматки на підлогу, а не чіпає локальне відтворення, і клієнт під'єднується заново за власним годинником, поки конфіг на місці.

Що це відкриває

Кожна частина корисна сама по собі. Демон медіаклавіш чи віджет для смуги стану - це сокет і кілька рядків. Апаратний контролер, stream deck чи регулятор на мікроконтролері - це transport.* з будь-чого, що дістає до сокета. Кіоск для кімнати прослуховування - це методи черги і event.track, які крутять дисплей.

Складіть їх разом, і rox - бекенд персонального стримінгу: транспорт і черга через сокет, звук, вбудований із точки монтування Icecast, і фронтенд, який ви пишете чим завгодно, а ваша медіатека грає на машині, яка її зберігає.

Візьміть із собою сокет-клієнт

Сокет увімкнений всюди, де працює rox, rox-mcp їде поруч із застосунком, а на сторінці MCP у налаштуваннях є рядок конфігу для вашого клієнта. roxctl збирається з джерел однією командою cargo.

Завантажити rox

На Arch чи NixOS? Тоді краще поставте з AUR або з Nix flake.

v1.26.4 · Linux, macOS, Windows · усі завантаження