Yandex-Music
Yandex-Music copied to clipboard
Поддержка виджета в Центре управления
Приветствую! Благодарю за чудесное приложение, использую вместо браузерного дополнения к хрому, нравится.
Проблема
С некоторых пор в macOS появился Control Centre, а в нём — виджет «Now Playing».
И с музыкой из приложения он выглядит так:
При этом работает только кнопка паузы и прокрутка (не каждый раз).
Решение Не знаю точный алгоритм, по которому Now Playing определяет что собственно сейчас играет, но он явно дружит с MediaSession браузера. По крайней мере на Monterey 12.2.1 + Safari 15.3. А значит, достаточно в скриптах изнутри страницы Яндекс.Музыки настроить этот самый MediaSession. Странно, что Яндекс ещё не сделал этого сам.
Я дописал небольшой JS при загрузке страницы, который ловит события от яндексового externalAPI и заполняет соответствующими значениями MediaSession. И выдаёт наружу ручки, которые дёргаются из виджета — вперёд, назад, прокрутка.
По итогам выглядит так:
Известные баги При переключении трека из виджета кнопка «Далее» в виджете иногда перестаёт быть доступной, хотя updateControls отрабатывает. Кнопки в виджете обновляются сами собой если подождать, или если чуть промотать трек. При выставлении трека на паузу из виджета прогресс в виджете выставляется в 0:00/0:00, не каждый раз, но часто. В MediaSession при этом нулей не отправляется.
Буду рад замечаниям и дополнениям, swift — не мой родной язык. Что скажете?
Привет! Я как раз наоборот не шарю в веб-разработке, поэтому не сумел сам ничего подобного реализовать. Кажется, скоро будет обновление приложения… 💪
Жаль только, что не получается победить известные баги. Выходит, что мы можем проставлять правильные обложку и название/исполнителя, но сами системные элементы управления воспроизведением по-прежнему толком не работают.
Обновил. JS кода много, хранить и редактировать его просто в строке не очень комфортно. Вынес в отдельный файл.
К проблеме с кнопками поменял подход. Теперь кнопки «Вперёл» и «Назад» в виджете доступны вообще всегда. Описание доступных контролов от API яндекса не учитывается. Если яндексовый «Назад» запрещён — например, пользователь слушает радио, то кнопка просто мотает текущий трек на его начало. Это закрывает проблему 1, работает надёжно, и вроде как даже не костыль. Кнопки из меню приложения работают аналогичным образом.
Второй вопрос — по нажатию на паузу индикатор прогресса в виджете иногда отображает 0:00/0:00 вместо прогресса-на-момент-нажатия-паузы. По нажатию на play всё восстанавливается, играет с нужного места, прогресс оживает. Кажется, что пользователям это сильно мешать не будет, мне не мешает, но конечно немного неприятно.
По этой теме — в момент сброса прогресса в логе приложения пишется такое:
2022-02-28 00:22:43.507735+0300 Я.Музыка[24412:2202478] [] [0x600001203e20] CVXTime::reset
Может, можно раскопать где оно возникает и как-нибудь заглушить?
Подскажите, пожалуйста, как с вами можно связаться? Telegram, например.
https://t.me/BATC0H
Привет. Работая над выпущенным сегодня обновлением, заметил, что Яндекс, похоже, поддержал всё эту историю самостоятельно на своей стороне. У вас тоже заработало?
Да, работает, похоже Яндекс сделал поддержку MediaSession на своей стороне)