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

Как всё хитро. А я просто на

Как всё хитро. А я просто на кнопки команды mpc повесил (-:Е

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

krigstask написал(а): Как всё

krigstask написал(а):
Как всё хитро. А я просто на кнопки команды mpc повесил (-:Е

Я по началу тоже так сделал. Но хотелось именно, чтоб показывало, что и где. Да и просто интересно было...

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

неплохо, по сути, свой

неплохо, по сути, свой "клиент" смастерили

:)

интересно

наконец - то хоть что - то интересное в блоге!
интересная статься.
Кстати у gmpc есть поддержка хоткеев. Я в гноме им пользуюсь, весьма удобно.(оно на gtk)

Да вроде и у QmpdClient тоже

Да вроде и у QmpdClient тоже (-:Е

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

У меня установлен

У меня установлен QMPDClient.
Там тоже есть хоткеи, но они работают только в окне клиента....
А программы из gnome я по понятным причинам не использую.

Я не смог понять твой комментарий...
И по этому поводу решил подарить тебе запятую: ",". Используй её с умом!

/me для управления

/me для управления плеером(qmmp) юзает dbus и xbindkeys. Уведомления можно оттуда же делать там же через тот же dbus

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".