Стриминг музыки с Яндекс Станции на DLNA-совместимые устройства. Станция превращается в пульт: всё, что играет на ней, зеркалируется на Hi-Fi систему, а сама станция замолкает и слушает команды.
В текущей версии поддерживается Ruark R5, но возможно добавление новых устройств при интересе сообщества. Предлагайте устройства для интеграции в этой ветке обсуждения.
Если тебе нравится идея — поддержи проект звёздочкой на GitHub ⭐️
- Треки и FM-радио Яндекс.Музыки на DLNA-устройстве в выбранном качестве
- Полная синхронизация со станцией: смена трека, перемотка, пауза/продолжение и повтор трека подхватываются автоматически — поток перезапускается с нужной позиции (
-ssу FFmpeg) - Включение стрима посреди трека — воспроизведение продолжается с текущей позиции станции, а не с начала
- Дакинг: когда Алиса говорит или слушает, громкость устройства приглушается и плавно возвращается после
- Метаданные на дисплее: исполнитель и название трека (или имя радиостанции) вместо «Internet Radio»
- Память громкости между сеансами стриминга: устройство включается с той громкостью, на которой его выключили
- Событийная реакция: изменения на станции прилетают push-сообщениями по WebSocket, а не опросом
- Интеграция с умным домом: эндпоинты дёргаются сценариями Алисы — «Алиса, включи стрим» запускает всю цепочку
Яндекс Станция ◀──WebSocket──▶ API-сервис :8001 (MainStreamManager)
│ │ POST /set_stream
│ mDNS-поиск ▼
│ DLNA-сервер :8080 (FFmpeg → pipe)
│ │ GET /live_stream.mp3
▼ ▼
Протокол glagol Ruark R5 (UPnP AVTransport + fsapi)
| Компонент | Путь | Назначение |
|---|---|---|
| API-сервис (:8001) | src/api |
REST для умного дома, цикл управления стримингом |
| DLNA-сервер (:8080) | src/dlna_stream_server |
FFmpeg-поток и раздача /live_stream.mp3 |
| Координатор | src/main_stream_service |
Слежение за станцией, ресинк, дакинг, громкость |
| Модуль станции | src/yandex_station |
WebSocket-клиент, mDNS-поиск, protobuf-состояние |
| Модуль Ruark | src/ruark_audio_system |
UPnP-транспорт, fsapi (питание), память громкости |
| Ядро | src/core |
Конфигурация, DI, логирование, токены |
API-сервис (:8001) — интерфейс для умного дома:
| Метод | Эндпоинт | Описание |
|---|---|---|
POST |
/stream_on |
Запуск стриминга со станции |
POST |
/shutdown |
Остановка стриминга и выключение устройства |
DLNA-сервер (:8080) — внутренний API потока:
| Метод | Эндпоинт | Описание |
|---|---|---|
POST |
/set_stream |
Запуск потока: yandex_url, radio, start_position, title, artist |
GET/HEAD |
/live_stream.mp3 |
Аудиопоток для DLNA-устройства |
POST |
/stop_stream |
Остановка потока |
- Docker и Docker Compose
git clone https://github.com/0xcodepunk/ya2dlna_streaming.git
cd ya2dlna_streamingСоздайте .env файл и настройте параметры:
# Путь к исходному коду
PYTHONPATH=src
# Режим отладки для логирования
APP_DEBUG=False
# API токен для Яндекс.Музыки
APP_YA_MUSIC_TOKEN=your_token_here
# PIN-код Ruark (по умолчанию 1234)
APP_RUARK_PIN=1234
# Необязательно: известный IP Ruark — быстрый старт без SSDP-скана сети
# APP_RUARK_HOST=192.168.1.20
# Адрес и порты сервисов (адрес — IP машины в локальной сети)
APP_LOCAL_SERVER_HOST=192.168.1.10
APP_LOCAL_SERVER_PORT_DLNA=8080
APP_LOCAL_SERVER_PORT_API=8001
# Качество потока, kbps (64/128/192/320)
APP_STREAM_QUALITY=320
# Необязательно: постоянная папка для логов и кеша вне рабочей директории
# YA2DLNA_DATA_DIR=/opt/ya2dlna-dataЗапустите сервисы:
docker compose up -dСервисы работают с
network_mode: host— DLNA-устройство должно быть в той же локальной сети, аAPP_LOCAL_SERVER_HOSTуказывать на адрес хоста, доступный устройству.
Каждый pull request проходит проверки на GitHub-hosted раннере (uv sync --frozen): black, isort, flake8, mypy (strict-уровень) и pytest. Пуш в main дополнительно запускает деплой на self-hosted раннере: сборка образов, перезапуск docker compose и healthcheck обоих сервисов. Конфигурация — в .github/workflows/ci-cd.yml.
Проект использует uv:
uv syncКоманда создаст .venv и установит все зависимости, включая инструменты разработки, строго по uv.lock.
# API сервис
python -m src.api.main
# DLNA сервер
python -m src.dlna_stream_server.mainuv run black src tests
uv run isort src tests
uv run flake8 .
uv run mypy
uv run pytest- Python 3.11+
- FFmpeg
- DLNA-устройство в локальной сети
🎵 YA2DLNA Streaming – удобный способ слушать музыку с Яндекс Станции на DLNA-совместимых устройствах!
📫 Есть предложения или баги? Открывай issue — фидбек приветствуется!
💬 Есть идеи, вопросы или просто хочешь пообщаться? Заглядывай в обсуждение проекта!
