YouTube Music на Станции 2¶
«Алиса, поставь Маркула» включает музыку из YouTube Music вместо Яндекс Музыки. То же самое работает с консоли колонки. Вход в Google не нужен, домашний сервер тоже: всё работает на самой колонке. Подходит, если телефон на Android и AirPlay недоступен, или Яндекс Музыка не работает в вашей стране.
Проверено на: Станция 2 (yandexmidi), прошивка 0.369.1.50.* от 21.10.2026,
yt-dlp 2026.10.26, Python 3.13 из Entware, октябрь 2026. С консоли проверены поиск, исполнитель,
альбом, плейлист, пауза, продолжение, «дальше» и переход между треками. Голосовые команды
проверены только разбором фраз, вслух — нет.
Что понадобится¶
- набор из рецепта AirPlay и SSH по ключу;
- Entware на колонке:
yse bootstrap; - около 40 МБ на
/data: Python ~20 МБ, yt-dlp ~25 МБ в распакованном виде, декодер 2 МБ; - Docker на компьютере для сборки декодера, как и для остального набора.
Установка¶
cd contrib/station2-media/build
docker run --rm --platform linux/arm64 -v "$PWD:/work" -v "$PWD/out:/out" \
alpine:3.24 sh /work/ytm-build.sh
cd .. && ./ytm-install.sh <IP колонки>
ytm-build.sh собирает декодер ytm-dec на тех же статических библиотеках ffmpeg, что и
AirPlay, поэтому сначала нужен ap2-build.sh. ytm-install.sh делает остальное:
- ставит Python из Entware;
- скачивает свежий yt-dlp с GitHub;
- копирует плеер в
/data/local/opt/ap2/ytm; - перезапускает распорядитель звука.
Повторный запуск обновляет всё это.
Использование¶
Голосом¶
| Фраза | Что играет |
|---|---|
| «Алиса, поставь / включи X» | исполнитель — его песни вперемешку; иначе песня и радио от неё |
| «Алиса, поставь песню X» | песня, затем радио от неё |
| «Алиса, поставь альбом X» / «плейлист X» | альбом или плейлист |
| «Алиса, пауза / продолжи / дальше / назад» | управляет плеером, если он играл в последний час |
- Когда очередь кончается, к ней дописывается радио от последнего трека, и музыка не останавливается.
- Умный дом, таймеры, будильники и громкость остаются Алисе. «Поставь музыку» без названия — тоже: без входа в Google своей музыки у плеера нет.
- Алиса отвечает как обычно и успевает на секунду-две включить своё, потом её перебивает YouTube. От фразы до звука около 6 с.
- Пока Алиса слушает команду, музыка приглушается, как у Spotify.
Если на колонке настроен и голос Spotify, фраза без уточнения уходит Spotify, а
в YouTube — только «… в ютубе»: «Алиса, поставь Маркула в ютубе». Поменять это можно в
/data/local/opt/ap2/etc/ytm.conf:
voice=all # все «поставь …» — в YouTube
voice=youtube # только «… в ютубе»
voice=off # без голоса, только консоль
После правки перезапустите плеер: ytm.sh update или ap2.sh restart.
С консоли¶
/data/local/opt/ap2/ytm.sh play маркул
/data/local/opt/ap2/ytm.sh play album great depression
/data/local/opt/ap2/ytm.sh pause # resume, next, prev, stop
/data/local/opt/ap2/ytm.sh status # что играет и с какой секунды
/data/local/opt/ap2/ytm.sh queue
Обновление yt-dlp¶
YouTube регулярно меняет выдачу ссылок, и старый yt-dlp перестаёт их доставать. Признак — в
/data/local/tmp/ap2/ytm.log строки «нет ссылки» на каждом треке. Лечится так:
Ограничения¶
- Без аккаунта: нет библиотеки, лайков и личных миксов, ролики с возрастным ограничением не играют. Каталог зависит от страны вашего IP.
- Качество — AAC 128 кбит/с (формат 140).
- Пауза отдаёт звук Алисе. Продолжение заново качает трек и пропускает сыгранное, поэтому звук возвращается через 3–5 с.
- Работает за счёт клиента
visionosв yt-dlp: он отдаёт ссылки без JS-проверок YouTube. Если YouTube его закроет, понадобится JS-рантайм. QuickJS из Entware решает проверку около 100 с на трек, а Node 20 из yapkg yt-dlp не принимает: нужна более новая версия. - Пакет
yt-dlpиз Entware не годится: он отстаёт от YouTube, и решателя для quickjs в нём нет. - Демон держит в памяти около 90 МБ: yt-dlp загружен постоянно, иначе каждый трек ждал бы лишние 3 с запуска Python.
Откат¶
Скрипт убирает ytm/, ytm.sh, ytm-sink.sh и bin/ytm-dec. Правки в ap2.sh,
audio-owner.sh и asound.conf остаются: без ytm/ они ничего не делают. Python из Entware
тоже остаётся, удалить его можно отдельно:
Как это работает¶
- Поиск и очередь — внутренний API music.youtube.com (InnerTube, клиент
WEB_REMIX), без ключа и входа, около 1 с. Для исполнителя берётся его плейлист «Перемешать» (RDAO…) из верхней карточки поиска, для песни — радиоRDAMVM<id>. - Ссылка на звук — yt-dlp в постоянном процессе
ytmd.py: импорт занимает около 3 с один раз, затем ссылка готовится за 2–5 с. Ссылку на следующий трек плеер берёт заранее, пока играет текущий. Переведённые субтитры, HLS и DASH отключены, их разбор стоил секунды. - Звук. m4a качается кусками по 2 МБ с заголовком
Range: целиком YouTube отдаёт его почти в реальном времени. Дальшеytm-dec(AAC → S16LE 44,1 кГц) иytm-sink.sh. Тот, как иspotify-sink.sh, освобождает устройство от медиа-демона Алисы и запускаетaplay -D youtube. - Распорядитель звука считает YouTube играющим, пока жив
ytm-sink.shили свежа метка/tmp/ytm.playing. Метка закрывает паузу между треками, иначе Алиса успевала бы вклиниться. - Голос — тот же локальный канал Алисы
127.0.0.1:9875, что у Spotify.ytmd.pyчитает его сам, отдельныйalice-textне нужен. - Логи:
/data/local/tmp/ap2/ytm.log— треки и музыкальные команды, остальная речь никуда не пишется;ytm-err.log— ошибки Python.