Сначала это был просто скрипт для загрузки информации о треке из DeaDBeeF в Psi+, но потом я прикрутил Last.fm, и понеслось. Данный скрипт позволяет получить информацию о проигрываем треке из одного из доступных источников (Last.fm и DeaDBeeF), обработать как-нибудь (скачать картинку ролика на ютубе, например) и донести результат до мира любым из доступных способов (записать в файл или выполнить произвольную команду).
При запуске с опцией --gtk появляется иконка в трее, меняющая свой цвет
в зависимости от текущего состояния. Полноценного графического интерфейса нет;
писать файл конфигурации нужно вручную.
Конфигурация осуществляется через файл ~/.config/amtune. Это JSON-объект
(словарь), который может содержать следующее:
-
interval— интервал между запросами информации о треке в секундах. Время запроса выравнивается по указанным секундам независимо от времени запуска скрипта: например, при значении 15 (по умолчанию) запрос будет выполняться в 00, 15, 30 и 45 секунд каждой минуты (кроме первого раза, который выполняется в момент запуска). -
interval_offset— смещение вышеупомянутого интервала в секундах. Например, если для интервала 15 указать смещение 2, запрос будет выполняться в 02, 17, 32 и 47 секунд каждой минуты. -
user_agent— юзерагент, который будет указываться для HTTP-запросов к, например, Last.fm. -
download_timeout— таймаут ожидания ответа на HTTP-запросы в секундах (по умолчанию 15). -
inputs,processorsиoutputs— словари (outputsтакже может быть списком; см. пример ниже), подключающие источники, обработчики и выходы соответственно для работы с информацией о треке. В ключах указывается название, в значениях — словарь передаваемых параметров. Подробнее обо всём ниже.
Источники достают откуда-нибудь изначальную информацию о треке и дают словарь
с ключами artist и title, которые потом дополняются обработчиками
и читаются выходами.
Данный источник запускает консольную команду плеера с --nowplaying-tf
и парсит её вывод. Принимает следующий параметр:
deadbeef_cmd— собственно команда, по умолчаниюdeadbeef; разрешены дополнительные аргументы
Скачивает страницу пользователя с сайта last.fm и достаёт «scrobbling now».
Помимо стандартных artist и title также добавляет youtube — id ролика
на YouTube при его наличии на last.fm. Параметры:
-
username— какого пользователя парсим -
cache_timeout— иногда скробблинг слетает раньше чем хотелось бы, и для большего удобства последний полученный трек продолжает отдаваться в обработку некоторое количество секунд после его пропажи с ластфма, по умолчанию 120
Обработчики получают информацию о треке, которую вернул один из источников, и нагружают его дополнительной информацией на своё усмотрение. Обработчики не запускаются, если трека нет.
Скачивает картинку-превьюшку видеозаписи с ютуба, которая прикреплена к треку
на last.fm. Добавляет в информацию о треке image_path. Работает только если
информация о треке получена от источника lastfm (этот источник парсит id
ролика с ластфма). Параметры:
saving_image_path— куда скачать картинку
Берут всё, что напарсили источники и добавили обработчики, и делают с этой информацией что-нибудь. В отличие от источников или обработчиков, один и тот же выход вы можете добавить несколько раз, тем самым выполняя самые разные действия.
Пишет файл по заданному пути в заданном формате. Если есть какая-то картинка
(image_path или default_image_path), берёт шаблон imgdata при наличии,
если нет — то берёт просто data. При отсутствии трека всегда берётся шаблон
emptydata. Параметры:
-
path— путь к записываемому файлу (относительно текущего каталога) -
data— строка с синтаксисом строковых шаблонов Python, результат рендера которой будет записан в файл -
emptydata— шаблон, который используется вместоdata, если трека нет. Если прописать пустую строку, то при отсутствии трека будет записываться пустой файл. Если прописать null, то не будет сделано ничего, файл не будет тронут (по умолчанию пустая строка) -
imgdata— шаблон, который используется вместоdata, когда есть картинка к треку (по умолчанию null и используетсяdata) -
default_image_path— путь к картинке, который будет использоваться какimage_path, если самогоimage_pathнету (если указать, то всегда будет использоваться шаблонimgdataпри его наличии и при наличии трека) (по умолчанию отсутствует) -
encoding— кодировка записываемого файла (по умолчанию utf-8) -
ignoresrc— список названий игнорируемых источников, для которых ничего с файлом делаться не будет (по умолчанию пуст) -
ignored_as_empty— если false (по умолчанию), то при треке из игнорируемого источника (ignoresrc) не делает вообще ничего. Если true, то ведёт себя как при отсутствующем треке, используя шаблонemptydata
В строковый шаблон передаются следующие переменные:
artist— исполнительtitle— название трекаimage_path— путь к файлу с картинкой (только дляimgdata)
Также все они доступны с постфиксами:
_eschtml— экранирование HTML-сущностей_esccmd— экранирование для шелла (использовать внутри одинарных кавычек)_esccmdhtmlэкранирование для шелла строки с экранированными HTML-сущностями
В шаблон emptydata не передаётся ничего.
command очень похож на file, только вместо записи файла запускает команду.
Параметры:
-
cmd— строка с синтаксисом строковых шаблонов Python, результат рендера которой будет исполнен как команда в консоли (shell) -
emptycmd— шаблон, который используется вместоcmd, если трека нет (по умолчанию пустая строка, не запускающая никакие команды) -
imgcmd— шаблон, который используется вместоcmd, когда есть картинка к треку (по умолчанию null и используетсяcmd) -
default_image_path— путь к картинке, который будет использоваться какimage_path, если самогоimage_pathнету (если указать, то всегда будет использоваться шаблонimgcmdпри его наличии и при наличии трека) (по умолчанию отсутствует) -
ignoresrc— список названий игнорируемых источников, для которых ничего с файлом делаться не будет (по умолчанию пуст) -
ignored_as_empty— если false (по умолчанию), то при треке из игнорируемого источника (ignoresrc) никаких команд не запускает. Если true, то ведёт себя как при отсутствующем треке, используя шаблонemptycmd
В строковый шаблон передаются те же переменные, что и в выходе file.
Помните, что при использовании экранированных для шелла переменных вроде
{track_esccmd} их нужно обязательно использовать в одинарных кавычках!
Примерно так:
"cmd": "echo '{artist_esccmd} – {track_esccmd}'"
Примерно такую конфигурацию использую я:
{
"inputs": {
"deadbeef": {},
"lastfm": {"username": "andreymal31"}
},
"processors": {
"youtube": {"saving_image_path": "/tmp/andreymal_tune_current_img.jpg"}
},
"outputs": [
["file", {
"path": "/home/andreymal/.cache/psi+/tune",
"data": "{title}\n{artist}\n"
}],
["command", {
"cmd": "notify-send -u low -t 7000 '{title_esccmd}' '{artist_esccmdhtml}'",
"imgcmd": "notify-send -u low -t 7000 -i '{image_path_esccmd}' '{title_esccmd}' '{artist_esccmdhtml}'",
"default_image_path": "/home/andreymal/Изображения/lastfm-flat.png",
"ignoresrc": ["deadbeef"]
}]
]
}