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