view vixm/rb_dbus.py @ 46:2d570448aba5 pure

Abstract out the stats code a little bit more This is in preparation for moving the stats code completely out of player code
author Josef "Jeff" Sipek <jeffpc@josefsipek.net>
date Mon, 06 Nov 2006 05:19:23 -0500
parents d3ac3a46a294
children 8396cc3816ee
line wrap: on
line source

import time
from threading import Thread

import gobject
import dbus
import dbus.service
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
	import dbus.glib

class PlayerObject(dbus.service.Object):
	def __init__(self, bus_name,
			object_path='/org/gnome/Rhythmbox/Player'):
		dbus.service.Object.__init__(self, bus_name, object_path)

	@dbus.service.signal('org.gnome.Rhythmbox.Player')
	def playingChanged(self, yesno):
		pass

	@dbus.service.signal('org.gnome.Rhythmbox.Player')
	def playingUriChanged(self, uri):
		pass
	
class RhythmboxObject(dbus.service.Object):
	def __init__(self, bus_name,
			object_path='/org/gnome/Rhythmbox'):
		dbus.service.Object.__init__(self, bus_name, object_path)

class ShellObject(dbus.service.Object):
	def __init__(self, bus_name,
			object_path='/org/gnome/Rhythmbox/Shell'):
		dbus.service.Object.__init__(self, bus_name, object_path)

		self.title	= ""
		self.artist	= ""

	@dbus.service.method('org.gnome.Rhythmbox.Shell')
	def getSongProperties(self, uri):
		return dbus.Dictionary({"title": dbus.Variant(self.title), \
			"artist": dbus.Variant(self.artist)},\
			    key_type=dbus.String, value_type=dbus.Variant)

	@dbus.service.signal('org.gnome.Rhythmbox.Shell')
	def visibilityChanged(self, yesno):
		pass

class RhythmboxDbusThread(Thread):
	def __init__(self, play):
		Thread.__init__(self)

		NAMESPACE = 'org.gnome.Rhythmbox'
		PLAYER_NS = NAMESPACE + ".Player"
		SHELL_NS  = NAMESPACE + ".Shell"

		session_bus = dbus.SessionBus()

		rb_bus = dbus.service.BusName(NAMESPACE, bus=session_bus)
		rb_object = RhythmboxObject(rb_bus)
		
		player_bus = dbus.service.BusName(PLAYER_NS, bus=session_bus)
		player_object = PlayerObject(player_bus)
		
		shell_bus = dbus.service.BusName(SHELL_NS, bus=session_bus)
		shell_object = ShellObject(shell_bus)
		
		self.__rb_obj = rb_object
		self.__player_obj = player_object
		self.__shell_obj = shell_object

		shell_object.visibilityChanged(True)
		player_object.playingChanged(False)

		self.__title  = ""
		self.__artist = ""
		self.__uri    = ""

		self.__main   = gobject.MainLoop()

		self.__play = play

	def notify(self, uri, title, artist):
		self.__uri    = uri
		self.__title  = title
		self.__artist = artist

	def run(self):
		while not self.__play.shutdown:
			if self.__title != self.__shell_obj.title:
				self.__shell_obj.title = self.__title
				self.__shell_obj.artist = self.__artist

				self.__player_obj.playingUriChanged(self.__uri)
				self.__player_obj.playingChanged(True)

			# if there is something to process, do so
			c = self.__main.get_context()
			if c.pending():
				c.iteration()

			time.sleep(0.2)