16 марта: паритет воспроизведения с MA и runtime hardening
16 марта 2026 — Backend-авторитетная синхронизация управления MA и hardening armv7 CI-релизов (v2.32.7)
Заголовок раздела «16 марта 2026 — Backend-авторитетная синхронизация управления MA и hardening armv7 CI-релизов (v2.32.7)»Релиз 2.32.7 превращает недавнюю работу над управлением Music Assistant из «UI ощущается быстрее» в «состояние backend действительно стало надёжнее». Главная тема — авторитетность: shuffle/repeat/queue-действия не должны зависеть от ad-hoc мутаций фронтенда или от свежего per-request WebSocket, который гоняется с долгоживущим монитором. Вместо этого bridge теперь рассматривает backend-кэш и persistent MA monitor как источник истины и пушит predicted-but-typed модель состояния наружу к дашборду.
Четыре направления определяют этот релиз:
- Pending-состояние, принадлежащее backend —
/api/ma/queue/cmdтеперь возвращает структурированные результаты команды сop_id,syncgroup_id, pending-метаданными и backend-generated predicted snapshot. Это значит, что UI может реагировать мгновенно, не изобретая свою приватную версиюma_now_playing. - Monitor-first command flow — MA queue-команды теперь идут через persistent monitor connection как авторитетный hot path. Перемешанные
player_queue_updated/player_updatedсобытия больше не проглатываются молча при ожидании command acknowledgement — они откладываются и reconcile’ятся сразу после получения ack. - Сохранение состояния при переподключении — короткие отключения MA monitor больше не стирают видимое состояние воспроизведения. Bridge сохраняет последний подтверждённый snapshot, помечает его stale/disconnected и сохраняет command/error-метаданные, чтобы дашборд оставался понятным, пока идёт переподключение.
- Честность release pipeline для armv7 — выделенный armv7 Docker workflow больше не фейлит весь релиз, если экспорт кэша GitHub Actions ломается после того, как образ уже собран и запушен. Экспорт кэша теперь best-effort, а не false-red release gate.
Это тот тип релиза, где самый важный эффект — снижение неоднозначности: меньше split-brain состояний управления между фронтендом и backend, меньше гонок между command ack и MA-событиями, меньше потерь видимого состояния при переподключениях, и меньше шума от CI-провалов, которые на самом деле не являются провалами сборки образа.
16 марта 2026 — Polish воспроизведения в карточках, списках и массовых действиях (v2.32.6)
Заголовок раздела «16 марта 2026 — Polish воспроизведения в карточках, списках и массовых действиях (v2.32.6)»Релиз 2.32.6 — небольшой dashboard-фоллоуап, но он завершает несколько деталей взаимодействия, которые остались неровными после более крупных редизайнов воспроизведения. Тема здесь — согласованность: card mini-player, раскрытая строка списка и action bar всего дашборда должны читаться как части одной поверхности в стиле Music Assistant, а не как отдельные итерации, которые просто сосуществуют на одной странице.
Четыре направления определяют этот релиз:
- Более чистый поток воспроизведения в карточке — индикатор прогресса в карточке теперь расположен под метаданными трека, а не борется за горизонтальное пространство рядом с ними. Это даёт длинным строкам трека/исполнителя больше места и делает стек времени воспроизведения читаемым в том же порядке сверху вниз, что и остальная часть мини-плеера.
- Более богатый контекст раскрытой строки списка — раскрытые строки списка теперь добавляют текстовый бейдж
Now playingнад активным названием, увеличивают artwork для лучшего использования доступного пространства и замедляют анимацию эквалайзера до более характерного для Music Assistant ритма. Вместе эти изменения делают живое состояние более понятным без добавления лишнего chrome. - Визуальный паритет массовых действий —
Reconnect allиRelease allв тулбаре дашборда теперь используют тот же язык action-кнопок, что и per-device контролыReconnect/Release. Это убирает ещё одну небольшую, но заметную несогласованность в том, как представлены безопасные/обратимые Bluetooth-действия. - Hardening на живом развёртывании — UI polish был проверен на самом Proxmox-таргете, включая cache-busting фоллоуап, подтвердивший, что обновлённый runtime корректен после очистки устаревшего HTML.
Это не headline-архитектурный релиз, но это тот тип polish, который поддерживает ощущение надёжности дашборда. Иерархия воспроизведения легче читается, affordances статуса более явные, и одни и те же паттерны действий теперь повторяются более последовательно по всему UI.
16 марта 2026 — Правдивые контролы воспроизведения и более компактный list mini-player (v2.32.5)
Заголовок раздела «16 марта 2026 — Правдивые контролы воспроизведения и более компактный list mini-player (v2.32.5)»Релиз 2.32.5 — UI-фоллоуап к 2.32.2, но настоящая тема — не только косметика. Она о том, чтобы контролы воспроизведения дашборда говорили правду о текущем runtime-состоянии, продолжая при этом движение list view к более компактному мини-плееру в стиле Music Assistant. На практике это значит: меньше мёртвого горизонтального пространства, более ясный контекст очереди и меньше случаев, когда UI выглядит активным, хотя нижележащий путь Sendspin / MA / sink на самом деле не может выполнить запрошенное действие.
Три направления определяют этот релиз:
- Stateful transport controls — shuffle/repeat теперь обновляются оптимистично в UI, repeat показывает раздельные состояния
off/all/one, а transport/queue/mute/volume-действия отключаются, если соответствующая зависимость Sendspin, Music Assistant или sink реально недоступна. Соответствующие handler guards закрывают окно гонки с устаревшими кликами, не полагаясь только на стилизацию кнопок. - Более компактная геометрия воспроизведения в раскрытом списке — artwork и метаданные текущего трека теперь находятся в одном компактном левом блоке, а previous/current/next контекст воспроизведения и прогресс — во втором left-aligned блоке. Таким образом, раскрытая строка читается скорее как намеренный мини-плеер, а не как два несвязанных куска с лишним зарезервированным пустым пространством между ними.
- Более богатый контекст очереди с первого взгляда — previous и next элементы очереди теперь рендерят трек, исполнителя и альбом на отдельных строках, а не сжимают вторичные метаданные в одну объединённую строку. Это небольшое изменение представления делает длинных соседей по очереди гораздо проще для разбора во время живого воспроизведения.
Это небольшой релиз, но он улучшает уверенность оператора именно в тех местах, которые важны для дашборда: контролы выглядят доступными только когда они действительно доступны, repeat сообщает свой реальный режим, а раскрытый list player показывает больше контекста с меньшими визуальными потерями.
16 марта 2026 — Fail-safe обновления LXC и рельсы восстановления (v2.32.2)
Заголовок раздела «16 марта 2026 — Fail-safe обновления LXC и рельсы восстановления (v2.32.2)»Релиз 2.32.2 — это прежде всего релиз операционного hardening. Он был спровоцирован реальным failure mode на native LXC: auto-update подтянул Python-код, который ссылался на новые модули, но локальный updater всё ещё скачивал устаревший вручную поддерживаемый список файлов и оставлял сервис в restart loop. Этот релиз закрывает этот пробел на уровне архитектуры updater, а не трактует инцидент с пропущенным файлом как разовый случай.
Пять тем определяют этот релиз:
- Публичная видимость состояния репозитория — GitHub traffic archiver теперь записывает более подробную статистику репозитория и релизов, а docs site публикует этот архив как простой stats dashboard. Это превращает внутреннюю бухгалтерию release/traffic в то, что операторы и контрибьюторы могут инспектировать без копания в workflow artifacts.
- Снапшоты релизов вместо дрифта файлов — native
lxc/install.shиlxc/upgrade.shтеперь скачивают снапшот GitHub-архива и синхронизируют runtime-дерево рекурсивно. Это убирает хрупкий паттерн «не забудь добавить каждый новый файл в два shell-цикла», который стал причиной инцидента на Turris. - Detached-обновления, переживающие рестарт — one-click обновления и фоновые auto-update теперь запускаются через
systemd-run --no-block, вне cgroup сервисаsendspin-client. Это важно, потому что логика рестарта, smoke-check и rollback теперь может завершиться, даже пока основной сервис перезапускается. - Транзакционное поведение обновления — LXC updater теперь стейджит новое дерево, валидирует импорты перед swap, перезапускает сервис, выполняет локальные health check и автоматически откатывается, если обновлённый runtime не возвращается чисто. Другими словами, путь обновления теперь имеет историю восстановления, а не только историю замены.
- Небольшие, но практичные фоллоуапы на границе релиза — armv7 Docker build path теперь снова соответствует текущему контракту зависимостей
aiosendspin/av, а увеличенный превью album-art больше не исчезает под тулбаром/group-action chrome ни в одном из view дашборда.
Это тот тип релиза, который операторы в основном замечают тем, что не замечают его позже: меньше предположений updater, меньше дрифта скриптов и гораздо более безопасный путь для unattended обновлений на native LXC.
16 марта 2026 — Паритет воспроизведения в стиле MA и стабильность прогресса (v2.32.0)
Заголовок раздела «16 марта 2026 — Паритет воспроизведения в стиле MA и стабильность прогресса (v2.32.0)»Релиз 2.32.0 превращает работу по редизайну из «визуально ближе к Music Assistant» в «поведенчески тоже ближе». Главная тема — паритет: card и list view теперь разделяют больше одинаковой семантики воспроизведения, а не ведут себя как два независимых дашборда, которые просто выглядят похоже. Это проявляется в очевидном UI polish — более плотная группировка трека/эквалайзера, более чистые card headers, secondary card actions по hover, более тонкие слайдеры, числовые метки громкости — но более важная часть в том, что поведение очереди и прогресса теперь нормализуется между обоими view.
Четыре направления определяют этот релиз:
- Конвергенция воспроизведения card/list — раскрытая строка списка теперь ведёт себя гораздо больше как MA мини-плеер, с метаданными текущего трека рядом с artwork, превью queue-neighbor’ов, и transport/shuffle/repeat контролами, расположенными вокруг контекста активного трека. Card view полировался параллельно: чекбокс выделения перемещён к левому краю, secondary actions теперь появляются по hover вместо постоянного занятия пространства, а компактный эквалайзер стабильно переиспользуется между view.
- Корректность queue-контекста — метаданные MA очереди больше не принимаются на веру, когда
player_queues/allпропускает соседние элементы. Bridge теперь гидратирует отсутствующие previous/next записи черезplayer_queues/items, что убирает ложные placeholder’ыQueue start/Queue end, которые раньше появлялись даже при наличии реальных соседних треков. - Стабильность прогресса вместо театральности прогресса — прогресс воспроизведения теперь инициализируется детерминированно и мержит устаревшие MA elapsed-снапшоты, а не откатывается к ним. На практике это убирает оба класса UI-багов, замеченных за этот цикл: полоска, мигающая на всю ширину при первом рендере, и elapsed-time/progress display, прыгающий назад, когда более медленный MA payload приходит после того, как локальная интерполяция уже продвинулась вперёд.
- Более богатая runtime-инспекция — диагностика теперь показывает, активно ли устройство воспроизводит, и парсит дополнительные метаданные PulseAudio sink-input (
application_*,media_*). Это не headline-фича, но делает live routing/debugging гораздо более действенным, когда операторам нужно понять, что на самом деле подаётся в sink.
Это также релиз о переиспользовании как стратегии обслуживания. Общие хелперы теперь управляют большей частью поведения эквалайзера/прогресса/очереди между card и list поверхностями, и это важно, потому что выигрыш — не только меньше дублирования кода, но и меньше UI-дрифта и меньше регрессий «исправили здесь, всё ещё сломано там» в последующих polish-проходах.
16 марта 2026 — Безопасное восстановление album-art из Music Assistant (v2.31.11)
Заголовок раздела «16 марта 2026 — Безопасное восстановление album-art из Music Assistant (v2.31.11)»Релиз 2.31.11 — узкий, но ценный фоллоуап к 2.31.10. Он исправляет видимую регрессию в редизайнированном дашборде: Music Assistant уже предоставлял метаданные artwork, но веб UI правильно отказывался рендерить большинство cover URL, потому что они указывали на другой origin или приходили как сырые относительные MA-пути. Другими словами, баг сидел именно на границе между «безопасностью фронтенда» и «качеством контракта backend».
Этот релиз исправляет эту границу, не ослабляя её:
- Same-origin delivery artwork — обложки альбомов теперь проходят через принадлежащий bridge эндпоинт
/api/ma/artwork, так что браузер получает URL с того же origin, что и сам дашборд, и существующий frontend safety guard может оставаться нетронутым. - Корректное разрешение MA URL — сырые artwork-пути из Music Assistant оборачиваются до того, как попадают в UI. Относительные пути разрешаются против настроенного MA base URL, а абсолютные пути допускаются только если они всё ещё указывают на тот же MA origin.
- Token-aware проксирование без превращения в open proxy — когда Music Assistant требует аутентификации, bridge пробрасывает сохранённый MA bearer token для получения artwork. При этом foreign hosts явно отклоняются, так что новый маршрут не может быть использован как generic fetch tunnel.
Это также намеренно test-backed хотфикс. Регрессионное покрытие было добавлено для оборачивания artwork URL в now-playing метаданных и для successful/rejected request paths нового proxy-маршрута. 2.31.11 таким образом лучше всего понимается как небольшой релиз, который восстанавливает user-facing функцию, сохраняя при этом более строгую security posture, введённую редизайном.
16 марта 2026 — Fail-safe runtime recovery и гигиена конфигурации (v2.31.10)
Заголовок раздела «16 марта 2026 — Fail-safe runtime recovery и гигиена конфигурации (v2.31.10)»Релиз 2.31.10 — следующий шаг стабилизации после 2.31.9: та же широкая тема «сделать bridge безопаснее на краях», но на этот раз с более прямым фокусом на корректности lifecycle для реальных парков — таргетирование адаптеров, дубликаты устройств в конфигурации, восстановление zombie-воспроизведения и долгосрочная гигиена персистентного состояния конфигурации.
Четыре практические темы определяют этот релиз:
- Fail-safe обработка адаптеров — bridge больше не угадывает
hci0, когда разрешение адаптера не удаётся. Это звучит мелко, но на мульти-адаптерных системах это разница между «деградировано, но понятно» и «молча общаемся с неправильным контроллером». Новое поведение отключает мониторинг D-Bus для этого устройства и полагается на существующий fallback через опрос bluetoothctl вместо фабрикации неправильного пути. - Более безопасная startup identity — дублирующиеся записи Bluetooth MAC теперь фильтруются до создания runtime-объектов. Это защищает bridge от легко допустимой ошибки конфигурации, которая иначе запустила бы два конкурирующих клиента против одной колонки, со всеми обычными побочными эффектами: конфликтующие переподключения, неоднозначное владение sink и запутанное состояние UI.
- Watchdog’и, осведомлённые о сессии воспроизведения — восстановление zombie-воспроизведения теперь отслеживает текущую play-сессию, а не навсегда считает subprocess «безопасным» после первого успешного stream. На практике колонка, которая однажды успешно играла, всё ещё может быть авто-восстановлена позже, если она снова попадёт в состояние «playing, но тишина».
- Гигиена конфигурации со временем — повреждённые файлы
config.jsonтеперь оставляют за собой recovery-копию (config.json.corrupt-*) перед использованием дефолтов, а устаревшее состояниеLAST_VOLUMESочищается, чтобы удалённые устройства не тащили за собой устаревшую persistence.
Это также strengthening-релиз для корректности, а не для охвата. Регрессионные тесты были добавлены для fallback неразрешённого адаптера, фильтрации дублирующихся MAC, сброса сессий zombie watchdog, обработки backup повреждённой конфигурации и путей нормализации config/volume. 2.31.10 поэтому лучше всего читается как релиз о том, чтобы bridge ломался более честно, восстанавливался более предсказуемо и старел более чисто под реальными операторскими workflow.
16 марта 2026 — Runtime hardening и проверка безопасности релизов (v2.31.9)
Заголовок раздела «16 марта 2026 — Runtime hardening и проверка безопасности релизов (v2.31.9)»Релиз 2.31.9 — классический стабилизационный фоллоуап: никакой новой флагманской функции, но сконцентрированный проход по местам, где зрелый bridge чаще всего ломается на практике — диагностика против грязного вывода хоста, безопасность экспорта конфигурации, гонки при shutdown и бухгалтерия Bluetooth-переподключений. Это релиз, который делает уже расширенную UI/configuration поверхность безопаснее в эксплуатации и проще для доверия.
Четыре направления определяют этот релиз:
- Оборонительная диагностика — парсеры, которые читают
pactl,bluetoothctlи/proc/meminfo, больше не предполагают идеально сформированный вывод. Вместо того чтобы одна обрезанная строка крашила diagnostics/preflight path, bridge теперь деградирует gracefully и сохраняет эндпоинт работоспособным. - Более безопасная обработка конфигурации — скачивание
config.jsonчерез веб UI теперь выдаёт share-safe экспорт с удалёнными хешами паролей, secret key и MA-токенами. Одновременно путь сохранения конфигурации нормализует известные числовые поля перед записью, уменьшая долгосрочный дрифт между типами UI-ввода и типами на диске. - Более чистые runtime-границы — доставка команд subprocess теперь снапшотит daemon handle перед использованием, а graceful shutdown работает из стабильного snapshot клиентов вместо итерации по live shared list. Это небольшие изменения кода с непропорционально большим влиянием на «трудновоспроизводимые» баги рестарта/shutdown.
- Надёжность reconnect-churn — timestamp’ы Bluetooth-переподключений теперь синхронизированы за lock, так что churn pruning и threshold check работают на одном согласованном окне, а не гоняются друг с другом.
Это также test-strengthening релиз. Сфокусированные регрессионные тесты были добавлены для defensive-парсинга диагностики, редактирования config export, числовой нормализации, обработки TOCTOU subprocess и Bluetooth churn isolation. Другими словами, 2.31.9 — это меньше о расширении охвата и больше о том, чтобы операционные границы bridge стали дружелюбнее к production.