# VK Player Controller VK Player Controller - приложение для OS X, позволяющее контролировать аудиоплеер vk.com медиа-клавишами (F7-F9) и иметь доступ к плейлисту из статусбара. #### Поддерживаемые браузеры: * Chrome, Яндекс.Браузер - *без расширения или с ним* * Safari - *только без расширения* * Firefox, Opera - *с расширением* #### Поддерживаемые системы Должно работать без проблем на OS X 10.8 и выше. # Скриншоты ![](https://ch1p.com/vkpc/screenshots/dark_p.png) ![](https://ch1p.com/vkpc/screenshots/light_p.png) # Некоторые технические подробности #### Внедрение JavaScript Для того, чтобы получить доступ к плееру в браузере, нужно внедрить свой JavaScript-код во вкладку. Существует два способа сделать это: * через AppleScript *(работает в Chrome, Яндекс.Браузере и Safari)* * через расширение *(работает в Firefox, Opera + опционально в Chrome и Яндекс.Браузере)* Поскольку у Firefox и Opera нет AppleScript API для выполнения JavaScript-кода в контексте вкладки, им нужно расширение. Судя по тому, что сообщали некоторые пользователи, метод AppleScript иногда не работает. Не очень понятно, от чего это зависит и как это воспроизвести, но на этот случай есть возможность включить режим расширения - для Chrome и Яндекс.Браузера. Теоретически такой workaround возможен и в Safari, но под него расширение еще не портировано (предлагаю желающим заняться этим :), поэтому там альтернативы нет. #### Как приложение общается с браузером Для того, чтобы внедренный во вкладку скрипт имел возможность отправлять данные приложению и принимать их от него, приложение поднимает локальный WebSocket-сервер (с поддержкой SSL) на 127.0.0.1:56130 (в данный момент для SSL используется сертификат, выданный для домена vkpc-local.ch1p.com и истекающий 16 августа 2017 года. О том, зачем это нужно – ниже). Когда в плеере на сайте происходит какое-то событие (например, вы переключаете трек), скрипт через WS отправляет его приложению. Когда происходит событие в самом приложении (например, вы нажали F7 или кликнули на трек в плейлисте из статусбара), сообщение отправляется скрипту, который уже переключает трек на сайте. Если vk.com открыт по https, браузер запрещает открывать WebSocket-соединение по http. Поэтому в качестве хака скрипт подключается не к 127.0.0.1, а к vkpc-local.ch1p.com, который указывает на 127.0.0.1. #### libwebsockets Для реализации WebSocket используется библиотека libwebsockets (https://github.com/warmcat/libwebsockets), версии 1.3. Нужно собрать ее с поддержкой SSL, установить заголовочные файлы и подключить libwebsockets.dylib к проекту. # По вопросам ... можно писать сюда: https://vk.com/ez P.S. Исторически сложилось, что однажды написанный говнокод в vkpc.js больше не менялся (нет желания туда лезть), его бы переписать... P.P.S. HostsHack - более не используемая часть приложения. До того, как я додумался прописать в A-запись домена адрес 127.0.0.1, локальное подключение через этот домен требовало модификации /etc/hosts с запросом от пользователя root-прав на такое действие. К счастью, нашлось лучшее решение, так что эти файлы более не используются в проекте и остались для истории.