Перейти к содержанию

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 строки «нет ссылки» на каждом треке. Лечится так:

/data/local/opt/ap2/ytm.sh update

Ограничения

  • Без аккаунта: нет библиотеки, лайков и личных миксов, ролики с возрастным ограничением не играют. Каталог зависит от страны вашего 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-install.sh <IP колонки> --remove

Скрипт убирает ytm/, ytm.sh, ytm-sink.sh и bin/ytm-dec. Правки в ap2.sh, audio-owner.sh и asound.conf остаются: без ytm/ они ничего не делают. Python из Entware тоже остаётся, удалить его можно отдельно:

opkg remove --autoremove python3-light

Как это работает

  • Поиск и очередь — внутренний 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.