LINUX.ORG.RU
ФорумTalks

[быдлокодерство][MPD][Gajim]Поругайте :-)

 ,


0

0

Когда мне нечем заняться, я пишу для удовольствия маленькие 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

Собственно, мне интересны ваши замечания по коду, и возможно, кому-то эта поделка окажется полезной.

Спасибо за внимание.

★★★★★

Почему-то не сработала раскраска %)

GotF ★★★★★
() автор топика
Ответ на: комментарий от ZZaiatSS

ZZaiatSS wrote:

Разве mpd не умеет дергать скрипты при переключении трека?

Хм, мой, вроде, нет. Было бы неплохо.

GotF ★★★★★
() автор топика
Ответ на: комментарий от ZZaiatSS

ZZaiatSS wrote:

не лучше ли дергать зажим через gajim-remote ?

Это было первоначально. Просто эта утилита сама на питоне, а даже небольшой лишний оверхед на ЦП меня не радует. Посему разобрался с этим зубодробильным синтаксисом dbus-send и получил прекрасную скорость (как для шелл-скрипта, конечно).

GotF ★★★★★
() автор топика
Ответ на: комментарий от GotF

Спасибо, буду знать.

//Пойду переведу и свои скрипты на дбас :)

ZZaiatSS ★★
()

> имя текущего трека

в статус-сообщения


Гордый кипоюзер, до сих пор не знающий про ХЕР-0118?

kapsh
()
Ответ на: комментарий от kapsh

Я знаю о нём. Только как мне это поможет?

GotF ★★★★★
() автор топика

Зачётненько, но меня всегда удивляли лиди, пишушие хоть како-никакой, но код на шеле. Для таких вещей намного удобнее python или perl по вкусу.

ixrws ★★★
()
Ответ на: комментарий от GotF

Не о процедуре отбивания рук, а о косяках скрипта.

GotF ★★★★★
() автор топика

Велосипед.
Для MPD есть модуль, который добавляет поддержку MPRIS. Gajim отлично работает с MPRIS. Плюс MPRIS - это стандарт, который поддерживает куча плееров и клиентов, поэтому если что не надо будет всё перепиливать.

h31 ★★★★
()
Ответ на: комментарий от ixrws

ixrws wrote:

Зачётненько, но меня всегда удивляли лиди, пишушие хоть како-никакой, но код на шеле. Для таких вещей намного удобнее python или perl по вкусу.

Естественно, удобнее. У меня был переделанный скрипт на питоне для этой же цели. В данном случае, мне интересен более процесс написания, интерес спортивный.

GotF ★★★★★
() автор топика
Ответ на: комментарий от GotF

Отбил бы не за косяки, а за концепцию. Меня накрывает волна ненависти, когда некоторые врубают подобную шайтан-машину и начинают щёлкать трэки в плеере. Отключать уведомление о смене статуса не собираюсь.

Lighting ★★★★★
()

Хочу, чтобы название песни, которую я сейчас слушаю, попадало в статус?

Убил бы, тратят свой и чужой трафик. И мне тем более не интересно что за песню Private — kamasutra.avi вы слушаете.

http://wiki.qutim.org/%D1%87%D0%B0%D0%B2%D0%BE

хоть кутимом и не пользуюсь, но с автором согласен.

Bach
()

Скрипт - неплох, но идея - хуже не придумаешь.

unikoid ★★★
()
Ответ на: комментарий от Lighting

Отбил бы не за косяки, а за концепцию.


А я бы лично на месте топикстартера отбивал руки тем, кто указывает ему, что делать и чего не делать.

Меня накрывает волна ненависти, когда некоторые врубают подобную шайтан-машину и начинают щёлкать трэки в плеере


Не надо своих тараканов сажать в чужие головы.

Alsvartr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.