Недавно я принял решение развернуть в офисе на рабочем компьютере Hackintosh. Все получилось. Единственное, что мне не нравилось это отсутствие медиа клавиш на офисной клавиатуре. Ими я привык управлять музыкой, в том числе на сервисе Yandex.Music. Данная статья посвящена тому, как я исправил ситуацию.

image

Используем 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

В результате увидим следующую картину:

image

Теперь напишем 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)


  1. atd
    30.10.2017 01:01

    > Необходимо понимать, что если Yandex изменит название класса, то в applescript его тоже необходимо будет поменять

    Для таких целей там есть Mu.ExternalAPI


  1. MRDjeko
    30.10.2017 02:24

    Есть ли что-то подобное в Windows? Было бы мега полезно


    1. guinmoon Автор
      30.10.2017 09:16

      Думаю надо гуглить в сторону Powershell


    1. DunkanVS
      30.10.2017 09:59
      +1

      А зачем под Windows так извращаться? Там есть отличное UWP приложение + AutoHotkeys.
      Ну и в хроме есть как минимум два экстенжна для Яндекс.Музыки с настраиваемыми хоткеями.


      1. guinmoon Автор
        30.10.2017 10:59

        ссылки на экстенжи пожалуйста



        1. Senpos
          30.10.2017 12:33

          Раз, два. Мне понравилось первое, приятный дизайн и уведомления. Но как в первом, так и во втором есть настройка горячих клавиш (см. "Помощь" / "Настройки" соотв.).


          1. guinmoon Автор
            30.10.2017 12:37

            Все действительно так, но Chrome похоже имеет ограничение на назначение глобальных горячих клавиш. На работе я назначил для паузы комбинацию ? + PrtScn. В Chrome у меня не получилось подобное…


            1. Senpos
              30.10.2017 12:43

              А вы точно сделали горячую клавишу глобальной?
              image

              Windows 10, Chrome 62, «Ctrl + >» работает как из браузера, так и с рабочего стола, например.

              Хотя, возможно это особенность OSX.


              1. guinmoon Автор
                30.10.2017 12:49

                Похоже на то.


            1. B_bird
              31.10.2017 09:58

              Как автор расширения «раз» из комментария выше, могу сказать, что пользователи часто жалуются что то или иное сочетание клавиш хром не видит, на что я рекомендую любым удобным средством преобразовывать сложные по мнению хрома сочетания в что-то более удобоваримое и далее уже это сочетание назначать в хроме. Но это, конечно, не удобно…


  1. IzeBerg
    30.10.2017 02:24

    document.querySelector('.player-controls__btn_next').click();

    Зачем так сложно? Там же есть externalAPI.
    externalAPI.next();


    В том же хроме откройте консоль, там даже externalAPI.help есть для этого.


    1. guinmoon Автор
      30.10.2017 08:54

      Спасибо, не знал.


    1. guinmoon Автор
      30.10.2017 09:15

      Если через консоль вызывать то все ок. А если из AppleScript то

      Uncaught ReferenceError: externalAPI is not defined

      не знаю точно из за чего, но могу предположить, что при execute тот скрипт который мы вызываем не получает доступ к окружению скрипта от Yandex.Music


      1. Lertmind
        30.10.2017 16:56

        Почитайте это https://bugs.chromium.org/p/chromium/issues/detail?id=543437. Выполнение кода намерено сделано изолированным. Так понимаю, одно из решений основанных на использовании Omnibox делает активным вкладку, что неприемлемо.


  1. Yavanosta
    30.10.2017 11:08

    А вот это расширение смотрели? Там есть инструкция как настроить горячие клавиши.
    https://yandex.ru/support/music/extension.html


  1. yuryvaskov
    30.10.2017 12:38

    Велосипеды это хорошо, но можно же использовать готовые решения: chrome.google.com/webstore/detail/streamkeys/ekpipjofdicppbepocohdlgenahaneen?hl=en

    Принцип работы точно такой же, но в основе хромовское расширение.

    ПС: глобальные хоткеи работают, их можно переопределить в настройках расширения.


    1. guinmoon Автор
      30.10.2017 12:39

      В статье я упоминаю как использовать подобное и в Safari.


    1. guinmoon Автор
      30.10.2017 12:42

      Плюс, скрипты автоматора можно использовать не только с хоткеями.


  1. vanyas
    30.10.2017 13:47

    Можно было просто поставить Karabiner Elements и замапить нужные хоткеи как медиа клавиши


  1. msa
    30.10.2017 21:53

    У вас ошибка в итоговом скрипте, лишняя точка в

    of _w.

    И да, с
    externalAPI.togglePause()
    в сафари работает.


    1. guinmoon Автор
      31.10.2017 09:31

      Спасибо точку не заметил. В Safari попробую.


  1. olegkrasnov
    01.11.2017 09:13

    Любителям автоматизации в макоси рекомендую не забывать о Hammerspoon.