Ein kleiner Tip von mir: MPD + Sonata = Sehr schöne Musik!

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
mots
User
Beiträge: 9
Registriert: Dienstag 10. Juli 2007, 09:44

Um den toten Topic mal wiederzubeleben: habe vor einiger Zeit probiert, ein MPD/Sonata-Plugin fürs NowPlaying Screenlet zu schreiben, scheint aber nicht zu funzen... Irgendwelche ideen?:

Code: Alles auswählen

#!/usr/bin/env python

# MPD API

import os
import dbus
import string
import gobject
import mpdclient
from GenericPlayer import GenericAPI

class MPDAPI(GenericAPI):
   __name__ = 'MPD API'
   __version__ = '0.1'
   __author__ = 'mots'
   __desc__ = 'API to the Music Player Daemon'
   
   host='localhost'
   port=6600

   playerAPI = None

   __timeout = None
   __interval = 2

   callbackFn = None
   __curplaying = None

   # Extended Functions from the GenericAPI

   def __init__(self, session_bus):
      GenericAPI.__init__(self, session_bus)

   def is_active(self, dbus_iface):
      try:
         self.mpd = mpdclient.MpdController(host,port)
         return True
      except:
         return False


   def connect(self):
      self.playerAPI = self.mpd

   def get_title(self):
      return self.playerAPI.getCurrentSong().title

   def get_album(self):
      return self.playerAPI.getCurrentSong().album

   def get_artist(self):
      return self.playerAPI.getCurrentSong().artist

   def get_cover_path(self):
      #return self.playerAPI.GetPlayingCoverUri()

   def is_playing(self):
      if self.playerAPI.status().stateStr() == 'play': return True
      else: return False

   def play_pause(self):
      if self.playerAPI.status().stateStr() == 'play':
         self.playerAPI.pause()
      else:
         self.playerAPI.play()

   def next(self):
      self.playerAPI.next()

   def previous(self):
      self.playerAPI.prev()

   def register_change_callback(self, fn):
      self.callback_fn = fn
      # Could not find a callback signal for MPD, so just calling after some time interval
      if self.__timeout:
         gobject.source_remove(self.__timeout)
      self.__timeout = gobject.timeout_add(self.__interval * 1000, self.info_changed)

   def info_changed(self, signal=None):
      # Only call the callback function if Data has changed
      if self.__timeout:
         gobject.source_remove(self.__timeout)
      try:
         if self.__curplaying != None and not self.is_playing():
            self.__curplaying = None
            self.callback_fn()

         playinguri = self.playerAPI.GetPlayingUri()
         if self.is_playing() and self.__curplaying != playinguri:
            self.__curplaying = playinguri
            self.callback_fn()
         self.__timeout = gobject.timeout_add(self.__interval * 1000, self.info_changed)
      except:
         # The player exited ? call callback function
         self.callback_fn()
Antworten