Используем Apple Script для управления плеером
У AppleScript есть возможность «общаться» с приложениями которые его поддерживают, для этого в нем предусмотрена конструкция tell. В числе таких приложений браузер Google Chrome. Ниже показан пример того, как попросить Google Chrome отрыть URL в новой вкладке:
tell application "Google Chrome"
open location "https://music.yandex.ru"
end tell
Теперь рассмотрим пример посложнее, попросим Google Chrome выполнить JavaScript в активной вкладке:
tell application "Google Chrome"
execute front window's active tab javascript "alert('example');"
end tell
В результате увидим следующую картину:
Теперь напишем JavaScript вызывающий событие click на необходимом элементе, к примеру, на кнопке next плеера Yanded.Music. Для этого используем querySelector:
document.querySelector('.player-controls__btn_next').click();
Осталось попросить Google Chrome выполнить этот скрипт на вкладке с открытым Yandex.Music. Для этого, сначала находим необходимую вкладку:
tell application "Google Chrome"
-- пробегаем по каждому открытому окну
repeat with _w in (every window)
-- по каждой вкладке название которой содержит music.yandex.ru
repeat with _t in (every tab whose URL contains "music.yandex.ru") of _w
-- здесь далее будет наш код нажатия на кнопку
end repeat
end repeat
end tell
Затем просим выполнить на найденной вкладке наш скрипт:
tell application "Google Chrome"
-- пробегаем по каждому открытому окну
repeat with _w in (every window)
-- по каждой вкладке название которой содержит music.yandex.ru
repeat with _t in (every tab whose URL contains "music.yandex.ru") of _w.
set s to "document.querySelector('.player-controls__btn_next').click();"
tell _t to execute javascript s
end repeat
end repeat
end tell
В этом примере мы ищем div, класс которого '.player-controls__btn_next'. Чтобы выполнить другие действия, например приостановить воспроизведение, необходимо создать такой же AppleScript, но с селектором '.player-controls__btn_pause'. Необходимо понимать, что если Yandex изменит название класса, то в applescript его тоже необходимо будет поменять.
Вот и все, для того чтобы выполнить AppleScript по нажатию горячих клавиш, создаем сервис в Automator. Про то, как это сделать существует множество статей в интернете.
Готовые workflow для Automator вы можете скачать здесь:
P. S. Для того, чтобы описанное выше заработало в Safari, необходимо в скрипте заменить слово “execute” на слово “do”.
P. P. S. В плеерах вроде iTunes все проще. Они понимают команды типа play/pause
tell application "iTunes" to playpause
Комментарии (23)
MRDjeko
30.10.2017 02:24Есть ли что-то подобное в Windows? Было бы мега полезно
DunkanVS
30.10.2017 09:59+1А зачем под Windows так извращаться? Там есть отличное UWP приложение + AutoHotkeys.
Ну и в хроме есть как минимум два экстенжна для Яндекс.Музыки с настраиваемыми хоткеями.guinmoon Автор
30.10.2017 10:59ссылки на экстенжи пожалуйста
Senpos
30.10.2017 12:33Раз, два. Мне понравилось первое, приятный дизайн и уведомления. Но как в первом, так и во втором есть настройка горячих клавиш (см. "Помощь" / "Настройки" соотв.).
guinmoon Автор
30.10.2017 12:37Все действительно так, но Chrome похоже имеет ограничение на назначение глобальных горячих клавиш. На работе я назначил для паузы комбинацию ? + PrtScn. В Chrome у меня не получилось подобное…
B_bird
31.10.2017 09:58Как автор расширения «раз» из комментария выше, могу сказать, что пользователи часто жалуются что то или иное сочетание клавиш хром не видит, на что я рекомендую любым удобным средством преобразовывать сложные по мнению хрома сочетания в что-то более удобоваримое и далее уже это сочетание назначать в хроме. Но это, конечно, не удобно…
IzeBerg
30.10.2017 02:24document.querySelector('.player-controls__btn_next').click();
Зачем так сложно? Там же есть externalAPI.
externalAPI.next();
В том же хроме откройте консоль, там даже externalAPI.help есть для этого.guinmoon Автор
30.10.2017 09:15Если через консоль вызывать то все ок. А если из AppleScript то
Uncaught ReferenceError: externalAPI is not defined
не знаю точно из за чего, но могу предположить, что при execute тот скрипт который мы вызываем не получает доступ к окружению скрипта от Yandex.MusicLertmind
30.10.2017 16:56Почитайте это https://bugs.chromium.org/p/chromium/issues/detail?id=543437. Выполнение кода намерено сделано изолированным. Так понимаю, одно из решений основанных на использовании Omnibox делает активным вкладку, что неприемлемо.
Yavanosta
30.10.2017 11:08А вот это расширение смотрели? Там есть инструкция как настроить горячие клавиши.
https://yandex.ru/support/music/extension.html
yuryvaskov
30.10.2017 12:38Велосипеды это хорошо, но можно же использовать готовые решения: chrome.google.com/webstore/detail/streamkeys/ekpipjofdicppbepocohdlgenahaneen?hl=en
Принцип работы точно такой же, но в основе хромовское расширение.
ПС: глобальные хоткеи работают, их можно переопределить в настройках расширения.
vanyas
30.10.2017 13:47Можно было просто поставить Karabiner Elements и замапить нужные хоткеи как медиа клавиши
atd
> Необходимо понимать, что если Yandex изменит название класса, то в applescript его тоже необходимо будет поменять
Для таких целей там есть Mu.ExternalAPI