Пишем простой event-handler для ncmpcpp на bash
от kalterfive
MPD (music player daemon) is an audio player that has a server-client architecture. It plays audio files, organizes playlists and maintains a music database all while using very few resources. In order to interface with it, a separate client is needed.(c) ArchWiki
В свою очередь, ncmpcpp — это удобный ncurses-клиент для mpd. Ко всему прочему, он же рализует некоторые другие возможности, не относящиеся к обязанностям mpd. Рассмотрим одну из них.
Запуск процесса по переключению трекаВ ncmpcpp(1) написано:
execute_on_song_change = COMMAND
Shell command to execute on song change.Предельно понятно. Следуя этой инструкции, редактируем конфиг и создаём собственный скрипт.
— Куда-нибудь в ~/.ncmpcpp/config
— Собственно, скрипт
Выбор языка для скриптинга — вопрос больше эстетический. Для себя я обычно выбираю bash.
Реализация song-change.shЯ привык к подобной структуре проекта:
Идея заключается в продолжении работы скрипта только в том случае, если инициализация (функция config) завершается с нулевым кодом возврата. Отдельно надо сказать о четвёртой строке — set -o nounset — это некоторая защита от использования неинициализированных переменных.
Хорошо. Теперь реализуем, например, логирование.
— Для функции config. mpc — ещё один mpd-клиент, но на этот раз c командным интерфейсом.
— Сохранение статистики.
Теперь добавляем вызов функции save_statistics в main и тестируем. Если всё получилось правильно (как-то так), то результат не заставит себя ждать:
Все хорошо работает. Убедившись в этом, перейдём к чему-нибудь более интересному.
aNMusicСовсем недавно (спустя часа два относительно написания статьи) @aNNiMON обновил API для него.
Использование API сводится к корректно отправленному POST-запросу.
- Целевой адрес: annimon.com/json/nowplay.php
- При ошибке отдаётся json с полем error и описанием ошибки
- Параметры запроса:
- act = set
- login = логин юзера
- token = токен (взять тут http://annimon.com/str/nowplay.php)
- artist = исполнитель
- title = название
- genre = жанр
Все параметры мы будем хранить прямо в скрипте, исключая токен. Здесь есть небольшая дилемма:
- Хранить токен прямо в скрипте значением. Даже если учесть, что токен напрямую зависит от пароля (так и есть на самом деле), так делать не очень правильно;
- Шифрование токена. Придётся иногда вводить пассофразу, но этим недостатком мы пренебрежём.
Теперь всё что остаётся сделать — это правильно дополнить наш скрипт. Приступим.
— в функцию config. Значение LOGIN меняем под себя, TOKEN расшифровываем из специального файла.
— собственно, реализация POST-запроса. Обратите внимание, параметр genre не задан.
— в функцию main. Нотификация, логирование и отправка трека.
Обработкой ошибок и анализом JSON-a мы пренебрегаем. Это можно реализовать отдельно, однако это уже другая история.
Результирующий скрипт: http://ix.io/n4Y
В свою очередь, ncmpcpp — это удобный ncurses-клиент для mpd. Ко всему прочему, он же рализует некоторые другие возможности, не относящиеся к обязанностям mpd. Рассмотрим одну из них.
Запуск процесса по переключению трекаВ ncmpcpp(1) написано:
execute_on_song_change = COMMAND
Shell command to execute on song change.Предельно понятно. Следуя этой инструкции, редактируем конфиг и создаём собственный скрипт.
- execute_on_song_change = "~/.ncmpcpp/song-change.sh"
- $ cd .ncmpcpp
- $ touch song-change.sh
- $ chmod +x song-change.sh
Выбор языка для скриптинга — вопрос больше эстетический. Для себя я обычно выбираю bash.
Реализация song-change.shЯ привык к подобной структуре проекта:
- #!/bin/bash
- function config() {
- set -o nounset
- return
- }
- funciton main() {
- if config "$@"; then
- fi
- }
- main "$@"
- exit "$?"
Идея заключается в продолжении работы скрипта только в том случае, если инициализация (функция config) завершается с нулевым кодом возврата. Отдельно надо сказать о четвёртой строке — set -o nounset — это некоторая защита от использования неинициализированных переменных.
Хорошо. Теперь реализуем, например, логирование.
- TRACK="$(mpc current)"
- STATISTICS="$HOME/.ncmpcpp/log.txt"
- readonly TRACK STATISTICS
- function save_statistics() {
- (
- echo $(date +%a\ %d.%m.%Y\ %H:%M:%S | tr a-z A-Z)
- echo "$TRACK"
- echo
- ) >> "$STATISTICS"
- }
Теперь добавляем вызов функции save_statistics в main и тестируем. Если всё получилось правильно (как-то так), то результат не заставит себя ждать:
- $ cat ~/.ncmpcpp/log.txt | tail -3
- THU 31.12.2015 19:57:41
- Behemoth - The Seed Ov I
Все хорошо работает. Убедившись в этом, перейдём к чему-нибудь более интересному.
aNMusicСовсем недавно (спустя часа два относительно написания статьи) @aNNiMON обновил API для него.
Использование API сводится к корректно отправленному POST-запросу.
- Целевой адрес: annimon.com/json/nowplay.php
- При ошибке отдаётся json с полем error и описанием ошибки
- Параметры запроса:
- act = set
- login = логин юзера
- token = токен (взять тут http://annimon.com/str/nowplay.php)
- artist = исполнитель
- title = название
- genre = жанр
Все параметры мы будем хранить прямо в скрипте, исключая токен. Здесь есть небольшая дилемма:
- Хранить токен прямо в скрипте значением. Даже если учесть, что токен напрямую зависит от пароля (так и есть на самом деле), так делать не очень правильно;
- Шифрование токена. Придётся иногда вводить пассофразу, но этим недостатком мы пренебрежём.
Теперь всё что остаётся сделать — это правильно дополнить наш скрипт. Приступим.
- # aNMusic specific
- ADDRESS="annimon.com/json/nowplay.php"
- LOGIN="kalter"
- TOKEN="$(gpg -qd "$HOME/.private/anmusic-token.gpg")"
- readonly ADDRESS LOGIN TOKEN
- function anmusic() {
- local POST
- POST="act=set&login=$LOGIN&token=$TOKEN&"
- POST+="artist=$(mpc -f "%artist%" | head -1)&"
- POST+="title=$(mpc -f "%title%" | head -1)"
- curl -d "$POST" "annimon.com/json/nowplay.php"
- }
- notify-send "$TRACK"
- save_statistics
- anmusic
Обработкой ошибок и анализом JSON-a мы пренебрегаем. Это можно реализовать отдельно, однако это уже другая история.
Результирующий скрипт: http://ix.io/n4Y