Skip to content

fix: радио не воспроизводилось — mime в DIDL и шторм перепривязок - #35

Merged
0xcodepunk merged 2 commits into
mainfrom
fix/radio-resend-storm
Jul 5, 2026
Merged

fix: радио не воспроизводилось — mime в DIDL и шторм перепривязок#35
0xcodepunk merged 2 commits into
mainfrom
fix/radio-resend-storm

Conversation

@0xcodepunk

@0xcodepunk 0xcodepunk commented Jul 5, 2026

Copy link
Copy Markdown
Owner

Проблема

«Алиса, включи Рок FM» — радио не начинало играть вообще: станция играет, Ruark молчит, лог забит «🔁 Возобновляем воспроизведение радио».

Диагноз — две независимые поломки

1. Корень: регрессия mime в DIDL (с PR #28). До кодек-рефакторинга protocolInfo в DIDL-метаданных был жёстко http-get:*:audio/mpeg:* — радио (ADTS-поток) играло под этой вывеской. PR #28 стал подставлять mime по кодеку, и радио начало объявляться как audio/aac. Ruark такой ресурс качает, но не воспроизводит: в dlna.log видно привязку, подключение (UA NSPlayer) и 272 КБ переданных данных — без перехода в PLAYING. FLAC не задет (audio/flac Ruark принимает).

2. Добивало: шторм перепривязок. У радио-страховки _resume_radio_if_silent, в отличие от трековой, не было грейс-периода. После перехода на событийный цикл (PR #20) сообщения станции будят цикл ежесекундно — страховка перепривязывала поток каждую секунду, не оставляя Ruark ни одного окна на буферизацию HLS.

Что сделано

  • DIDL_MIME_TYPES: в protocolInfo привязки для aac-потока уходит audio/mpeg (как до PR feat: lossless FLAC с фолбэком на MP3 #28), Content-Type ответа не меняется. Новое свойство didl_media_type, _reattach_ruark использует его.
  • Грейс для радио-страховки: пересылка не раньше SILENCE_RESEND_GRACE (15с) после любой отправки потока; запрещено «возобновление» до первой привязки; убран sleep(1).
  • Терпение после речи Алисы: _restore_ruark_after_speech ждёт старта радио до 80 попыток вместо 30 (HLS буферизуется дольше прямой ссылки трека); для треков поведение не изменилось. Пересылка из этого пути взводит грейс.

Тесты

102 теста (+3): радио привязывается с mime_type audio/mpeg при Content-Type audio/aac; молчащий Ruark на радио не бомбардируется перепривязками; пересылка после грейса работает. mypy и flake8 чистые.

Проверка локально

«Алиса, включи Рок FM» → радио играет через несколько секунд; в логе dlna одна привязка radio=true, в логе api — без ежесекундных «Возобновляем воспроизведение радио».

🤖 Generated with Claude Code

- добавлен грейс-период SILENCE_RESEND_GRACE в _resume_radio_if_silent: пересылка радио не чаще 15с после последней отправки, HLS успевает буферизоваться
- запрещено «возобновление» радио до первой привязки потока (last_stream_sent_at == 0)
- убран sleep(1) как единственный ограничитель частоты пересылок
- пересылка из _restore_ruark_after_speech теперь взводит last_stream_sent_at
- добавлены тесты: молчащий Ruark на радио не бомбардируется перепривязками, пересылка после грейса работает

Примечание: регрессия проявилась после перехода на событийный цикл (PR #20) — сообщения станции будят цикл ежесекундно, и страховка перепривязывала поток быстрее, чем Ruark успевал стартовать.
- увеличено ожидание PLAYING в _restore_ruark_after_speech для радио: 80 попыток вместо 30, HLS буферизуется дольше прямой ссылки трека
- для треков поведение не изменилось: цикл выходит раньше по факту воспроизведения
@0xcodepunk
0xcodepunk merged commit 447f58f into main Jul 5, 2026
2 checks passed
@0xcodepunk 0xcodepunk changed the title fix: радио не стартовало из-за шторма перепривязок потока fix: радио не воспроизводилось — mime в DIDL и шторм перепривязок Jul 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant