Когда мне нечем заняться, я пишу для удовольствия маленькие shell-toys. Сегодня наконец-то довёл до более-менее вменяемого состояния простенький скрипт, который устанавливает имя текущего трека в MPD в качестве статус-сообщения в Gajim.
Аккаунты принимаются в качестве параметра, через запятую и без пробелов. Каталог ~/.mpd необходимо создать заранее (не хочу лишнего кода) - туда будет падать PID-файл скрипта (я пускаю его в отвязке от родительского терминала, поэтому мне это нужно). В первых строках можно изменить формат статусного сообщения и задержку выполнения основного цикла. В вашей системе должны присутствовать утилиты dbus-send и mpc.
Код:
#!/bin/sh
POLLING_INTERVAL='10s' # интервал выполнения основного цикла
MPC_FORMAT="♪%artist% - %title%♪" # формат статуса (см. man mpc)
NOW_PLAYING=`mpc --format "$MPC_FORMAT" | head -n1` # текущий трек
if [ ! "$1" = '' ]; then
ACCOUNTS="$1"; # аккаунты получаем через аргумент
else
ACCOUNTS='jabber.org'; # иначе мой стандартный
fi
# записываем наш pid в файл (должен существовать каталог ~/.mpd)
echo `pidof sh $0` > ~/.mpd/now_playing_pid
# функция для получения статуса MPD
# в данный момент, не предусмотрены все варианты
function mpd_state (){
STATE=`mpc | grep -m 2 -o '\[.*\]'`
case $STATE in
'[playing]' )
STATE='Playing:';
;;
'[paused]' )
STATE='Paused:';
;;
'' )
STATE='No Music Playing';
NOW_PLAYING='';
;;
esac
}
# тело цикла выполняем, пока существует процесс "gajim"
while [ `pidof gajim` ]; do
NOW_PLAYING=`mpc --format "$MPC_FORMAT" | head -n1`;
mpd_state;
echo $ACCOUNTS | tr ',' '\n' | while read ACCOUNT; do
# получаем статус
STATUS=`dbus-send --type=method_call --dest=org.gajim.dbus --print-reply\
/org/gajim/dbus/RemoteObject org.gajim.dbus.RemoteInterface.get_status\
string:"$ACCOUNT" | grep -o \".*\" | tr '"' '\0'`;
# старое статусное сообщение
OLD_MESSAGE=`dbus-send --type=method_call --dest=org.gajim.dbus\
--print-reply /org/gajim/dbus/RemoteObject\
org.gajim.dbus.RemoteInterface.get_status_message\
string:"$ACCOUNT" | grep -o \".*\" | tr '"' '\0';`
# если трек не сменился, не будем флудить дублями
if [ ! "$OLD_MESSAGE" == "$STATE"\ "$NOW_PLAYING" ]; then
# установка статуса
dbus-send --type=method_call --dest=org.gajim.dbus --print-reply\
/org/gajim/dbus/RemoteObject org.gajim.dbus.RemoteInterface.change_status\
string:"$STATUS" string:"$STATE"\ "$NOW_PLAYING" string:"$ACCOUNT" >\
/dev/null 2>&1;
fi
done
sleep $POLLING_INTERVAL; # ждём
done
# удаляем pid-файл
rm ~/.mpd/now_playing_pid;
exit 0
Собственно, мне интересны ваши замечания по коду, и возможно, кому-то эта поделка окажется полезной.
Спасибо за внимание.