MPD и глобальные сочетания клавиш (хоткеи) KDE
Перепробовал некоторое количество различных клиентов MPD и, не найдя в них одной простой вещи: управления воспроизведением с помощью глобальных сочетаний клавиш, решил изобрести свой собственный велосипед.
Итак, требования:
- Должно работать везде, то бишь, глобально.
- Должно как-то уведомлять о своей работе.
В результате получилась вот такая связка: MPD + Python + D-Bus + KNotify.
Note:
>>> Для работы скрипта понадобится библиотека dev-python/python-mpd. Не забудьте ее поставить.
Код самого скрипта (быть может, pastebin лучше?):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import dbus, time
import getopt, sys
import mpd
def main():
imgpath='/usr/share/icons/oxygen/64x64/actions/';
img = ''
notify = Notifier()
cmd = CmdLine(sys.argv[1:])
action = cmd.GetCmd()
player = mpd.MPDClient()
player.connect ('localhost', 6600)
if action != '':
if action == 'play':
player.play()
ttl = 'Начинаю воспроизведение'
img = 'voicecall.png'
elif action == 'stop':
player.stop()
ttl = 'Завершаю воспроизведение'
elif action == 'pause':
player.pause()
ttl = 'Пауза'
elif action == 'next':
player.next()
ttl = 'Следующий трек'
elif action == 'prev':
player.previous()
ttl = 'Предыдущий трек'
elif action == 'file':
ttl = 'Имя файла'
else:
print 'Неизвестное действие'
usage()
sys.exit()
player.iterate = True
song = player.currentsong()
msg = ''
try:
msg += '[Альбом: '+song['album']+'] '
except KeyError:
pass
try:
msg += song['artist'] + ' - '
except KeyError:
pass
try:
msg += song['title']
except KeyError:
pass
if msg == '' or action == 'file':
try:
msg = '<strong>Файл</strong>: '+song['file']
except KeyError:
msg = 'No Title'
print song
notify.notify (app='mpd', event='default', message=msg, title=ttl)
player.disconnect()
class CmdLine():
def __init__(self, argv):
self.__cmd = ''
try:
opts, args = getopt.getopt (argv, 'h:', ['help'])
except getopt.GetoptError:
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ('-h', '--help'):
usage()
sys.exit()
for arg in args:
if arg in ('next', 'prev', 'play', 'stop', 'pause', 'file'):
self.__cmd = arg
def GetCmd(self):
return self.__cmd
def usage():
print 'Usage: pympc [play|stop|pause|prev|next|file] | [-h|--help]'
class Notifier():
def __init__(self):
self.__notify = dbus.SessionBus().get_object("org.kde.knotify", "/Notify")
self.__event_id = -1
def notify (self, app, event="default",title="Yuego Event",message="No message", timeout=10000):
self.__event_id = self.__notify.event (event, app, [], title, message, [0,0,0,0], [], timeout, 0, dbus_interface="org.kde.KNotify")
main()
Его я поместил в /usr/bin под именем pympc (если у кого-то установлен одноименный клиент, дайте скрипту другое имя).
Теперь наш мини-клиент умеет выполнять необходимый минимум действий: начинать/(при)останавливать воспроизведение, перемещаться по списку воспроизведения вперед и назад и показывать путь к воспроизводимому в данный момент файлу.
ego@ego ~ $ pympc -h Usage: pympc [play|stop|pause|prev|next|file] | [-h|--help]
Теперь надо настроить уведомления KDE.
Для этого создаем в ~/.kde4/share/config файл mpd.notifyrc следующего содержания:
ego@ego ~/.kde4/share/config $ cat mpd.notifyrc [Event/default] Action=Sound|Popup|Taskbar Execute= KTTS= Logfile= Icon=
Теперь наш скрипт может отображать информацию о выполняемом действии в панели уведомлений KDE.
Уведомление автоматически закрывается через 10 секунд.
Note:
>>> Запускать скрипт необходимо в пользовательском окружении, т. к. для работы ему требуется существующая сессия D-Bus.
Далее надо настроить то, ради чего все и замышлялось - сочетания клавиш.
Запускаем "Параметры системы" и следуем в раздел Управление компьютером -> Действия.
Там я создал следующую структуру:

Тут тоже все просто. Создаем действие:
Добавить -> Глобальная комбинация клавиш -> Команда или адрес
На вкладке Активация назначаем действию сочетание, а на вкладке Действие вводим соответствующую команду.
E. q.
>>> Для действия Воспроизведение у меня указано сочетание Meta + X и команда pympc play
Для особо ленивых я выгрузил всю ветку настроек для MPD в файл и на pastebin.
И если Вы сделаете все верно, у Вас должно получиться что-то похожее на это:

PS
Я не гуру python и впервые столкнулся с ним в процессе создания сей маленькой поделки, поэтому критика/поправки/советы в комментариях приветствуются.
Возможно, вы подскажете мне, где что можно исправить или изменить, чтобы оно было лучше :)
UPD:0
Скрипт был обновлен в связи с некоторыми изменениями в интерфейсе D-Bus org.kde.KNotify
- Блог пользователя - Youshi
- Для комментирования войдите или зарегистрируйтесь

Как всё хитро. А я просто на
Как всё хитро. А я просто на кнопки команды mpc повесил (-:Е
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.
krigstask написал(а): Как всё
Я по началу тоже так сделал. Но хотелось именно, чтоб показывало, что и где. Да и просто интересно было...
Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!
неплохо, по сути, свой
неплохо, по сути, свой "клиент" смастерили
:)
интересно
наконец - то хоть что - то интересное в блоге!
интересная статься.
Кстати у gmpc есть поддержка хоткеев. Я в гноме им пользуюсь, весьма удобно.(оно на gtk)
Да вроде и у QmpdClient тоже
Да вроде и у QmpdClient тоже (-:Е
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.
У меня установлен
У меня установлен QMPDClient.
Там тоже есть хоткеи, но они работают только в окне клиента....
А программы из gnome я по понятным причинам не использую.
Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!
/me для управления
/me для управления плеером(qmmp) юзает dbus и xbindkeys. Уведомления можно оттуда же делать там же через тот же dbus