Так как в последнее время я слишком много задавал вопросов и создавал тем с различными проблемами, на которые добрые люди отвечали советами, за что им спасибо еще раз, делюсь кое-какими наработками, дабы не только брать, но давать Может кому-то пригодится.
Так как я уже около 7 лет пользуюсь медиаплеером AIMP, очень не хотелось бы отказываться от него в рамках автоматизации, поэтому начал искать решение. И нашел его, которым собственно и поделюсь с Вами.
1. AIMP
Скачиваем непосредственно AIMP (подойдет версия от 2.60 до последней) и плагин к нему. Плагин имеет формат .exe, поэтому просто устанавливаем его поверх плеера в дочернюю папку Plugins плеера и запускаем AIMP.
Если плеер установлен не на сервере с Алисой, нужно в настройках плагина разрешить подключение по Вашему сетевому адаптеру. Для этого открываем настройки плеера (Ctrl+P) и переходим в "Плагины", там в списке ищем "Control Plugin", нажимаем шестеренку напротив него и выбираем Ваш сетевой адаптер:
СпойлерПоказать
Веб-интерфейс по-умолчанию доступен по адресу http://localhost:3333/
Тем, кто не знаком с этим плеером могу посоветовать пройтись по настройкам, там есть много интересных и просто полезных функций. Для себя я настроил автозагрузку, минимизацию при загрузке, отключил информационную ленту и отключил автопроигрывание при включении. Тут уж на вкус и цвет.
2. Система
Дело в том, что, когда AIMP свернут, при его повторном открытии он максимизируется, что лично меня не устраивало, поэтому я использовал PowerShell для проверки статуса. Сам скрипт выглядит до ужаса просто:
Код: Выделить всё
$ActiveAimp = Get-Process | where {$_.name -match "AIMP3"}
if($ActiveAimp -eq $null)
{
Write-Host "Процесс не запущен"
&"C:\Program Files\AIMP3\AIMP3.exe"
}
else
{
Write-Host "Процесс запущен"
}
Весь этот мини-скрипт я сохранил, как proc.ps1 и сохранил в папке с MD. В дальнейшем он нам понадобится.
Важно! Если Вы будете использовать этот скрипт, нужно в PowerShell разрешить выполнение пользовательских сценариев. Для этого запускаем PS с правами администратора и вводим Set-ExecutionPolicy RemoteSigned, далее подтверждаем нажатием Y.
3. Алиса
Мне нужно было, чтобы Алиса управляла статусом (играть/пауза) и громкостью, реализовал я это используя шаблоны поведения.
Создаем шаблон, в названии пишем что-то вроде "(включи|останови) музыку", в сценарий вставляем код:
Код: Выделить всё
//запускаем скрипт, который проверит, запущен ли AIMP и запустит его, если нет
safe_exec("powershell -Command C:\_majordomo\htdocs\progs\proc.ps1< NUL");
$request_data = array('method' => 'Pause'); //нужный нам метод
$json = json_encode($request_data);
//Настраиваем cURL
$ch = curl_init('http://localhost:3333/RPC_JSON'); //адрес веб-интерфейса
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); //метод запроса
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); //тип запроса - json
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Выполняем запрос
$response = curl_exec($ch);
У меня почему-то не получилось передать запрос Play, хотя передается он так же, по идее. Поэтому я пока решил использовать Pause, тем более, что ведет себя эта команда лучше, чем в VLC. Она запускает воспроизведение в любом случае, вне зависимости от текущего статуса воспроизведения. Таким образом, если AIMP стоит на паузе (Paused) или остановлен (Stopped), воспроизведение начнется. В VLC же при статусе Stopped команда Pause не сработает.
Далее разбираемся с громкостью. Создаем еще один шаблон с именем что-то вроде "установить громкость на (.+)". В код пишем:
Код: Выделить всё
$volume = $matches[1];
$request_data = array('method' => 'VolumeLevel', 'params' => array('level' => $volume)); //нужный нам метод
$json = json_encode($request_data);
//Настраиваем cURL
$ch = curl_init('http://localhost:3333/RPC_JSON'); //адрес веб-интерфейса
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); //метод запроса
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); //тип запроса - json
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Выполняем запрос
$response = curl_exec($ch);
Можно сделать Алису еще интеллектуальней и добавить проверку условия, наподобие:
Код: Выделить всё
if ($volume == 'минимум') {
$volume = 0;
} elseif ($volume == 'максиммум') {
$volume = 100;
}
На этом с настройкой системы все. Теперь Алиса может управлять AIMP'ом. Лично мне этого функционала пока хватит, но, если вдруг кому-то нужно, вот список доступных параметров:
Код: Выделить всё
array('method' => 'Mute', 'params' => array('mute_on' => true)); //выключить звук
array('method' => 'Mute', 'params' => array('mute_on' => false)); //включить звук
array('method' => 'Stop'); //остановить воспроизведение
array('method' => 'PlayPrevious'); //предыдущий трек
array('method' => 'PlayNext'); //следующий трек
array('method' => 'ShufflePlaybackMode', 'params' => array('shuffle_on' => true)); //включить случайное воспроизведение
array('method' => 'ShufflePlaybackMode', 'params' => array('shuffle_on' => false)); //отключить случайное воспроизведение
array('method' => 'RepeatPlaybackMode', 'params' => array('repeat_on' => true)); //включить повтор трека
array('method' => 'RepeatPlaybackMode', 'params' => array('repeat_on' => false)); //отключить повтор трека
Из минусов для себя пока выделил:
- невозможность выбора плейлиста средствами самого плеера (возможно просто еще не нашел эту функцию, особо не копался, в выходные буду разбираться). В следствие этого играет дефолтный плейлист, в который предварительно нужно закинуть песни. Конечно можно и не самим, а средствами php.
- не смог заставить работать веб-интерфейс при запуске аимпа как службы, но для меня это не критично, поставить в автозагрузку не проблема
P.S. за код и вариант исполнения прошу сильно не пинать, если что не так, php только начал изучать, а скрипт на PowerShell имеет место быть в моей конфигурации просто потому что я не нашел более простого (для себя) способа. Те варианты реализации проверки процесса на php, что я нашел в интернете были либо слишком сложными для меня в плане понимания, либо слишком "топорными". В любом случае, это лишь обмен опытом, буду рад дополнениям и поправкам, если что-то вдруг не так.
Благодарю за внимание.