2 from ziface import ZIface
4 import dbus.mainloop.glib
7 from brisa.core.reactors import GLib2Reactor
8 reactor = GLib2Reactor()
10 from brisa.core import log
11 from brisa.core import config
12 from brisa.upnp.device import Device
13 from brisa.upnp.services.cds import ContentDirectory
14 from brisa.upnp.services.connmgr import ConnectionManagerServer
16 from zukebox_server.services.playlist.zb_playlist import PlayList
17 from zukebox_server.services.search.zb_search import Search
19 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
21 class ZukeBoxServer(ZIface, dbus.service.Object):
25 ZukeBox is an abstraction for a JukeBox.
27 In a JukeBox somebody pay and choose a song for play, this way the
28 JukeBox should have default set of songs. ZukeBox has the same idea,
29 except for payment ;) , you can choose a song availble in the server
30 called ZukeBox Server or send a request for server to play your music,
32 Thus the clientes should be scan the network and get services availble
34 Services availble are:
35 1. Show the songs availble in the ZukeBox Server.
36 2. Play a song availble.
37 3. Play a song sent by a control point.
38 Some services will be availble too throught dbus.service a method for
39 rescan the default paths and save in the database.
42 DBUS_SERVICE_NAME = "br.org.zagaia"
43 DBUS_OBJ_PATH = "/br/org/zagaia/zukebox/ZukeBoxServer"
44 DBUS_IFACE = "br.org.zagaia.zukebox.ZukeBoxServer"
46 plugins_folder = config.get_parameter("zukebox_server", "plugins")
47 plugins_module_path = "zukebox_server.plugins"
49 def __init__(self, _server_name, _listen_url):
50 """ ZukeBox Server Construct
51 @param _server_name: Name of the ZukeBox Server
52 @param _listen_url: url to listen for requests
54 @type _server_name: string
55 @type _listen_url: string
58 bus = dbus.SessionBus()
59 busname = dbus.service.BusName(self.DBUS_SERVICE_NAME, bus=bus)
61 dbus.service.Object.__init__(self, busname, self.DBUS_OBJ_PATH)
62 self.server_name = _server_name
63 self.listen_url = _listen_url
67 def _create_device(self):
68 model_name = "ZukeBox Server version 0.1"
69 project_page = "http://portal.fucapi.edu.br/nepcomp/zagaia"
71 model_description = 'A UPnP Audio Server for ZukeBox'
73 self.device = Device('urn:schemas-upnp-org:device:ZukeBoxServer:1',
74 self.server_name, force_listen_url=self.listen_url,
75 manufacturer="Zagaia Laboratory",
76 manufacturer_url=project_page,
77 model_description=model_description,
78 model_name=model_name, model_number="1.0",
79 model_url=project_page, serial_number=serial_no)
81 def _create_services(self):
82 self.cds = ContentDirectory(self.plugins_folder,
83 self.plugins_module_path)
84 cm = ConnectionManagerServer()
85 x_path = config.get_parameter("zukebox_server", "xml_path")
86 playlist = PlayList(10, x_path)
87 search = Search(x_path)
89 self.device.add_service(self.cds)
90 self.device.add_service(cm)
91 self.device.add_service(playlist)
92 self.device.add_service(search)
95 """Start the ZukeBox Server"""
97 self._create_services()
99 reactor.add_after_stop_func(self.device.stop)
103 @dbus.service.method(DBUS_IFACE)
107 @dbus.service.method(DBUS_IFACE)
108 def rescan_audio_folder(self):
111 pm = self.cds.control_controller.plugin_manager
112 if not "audio_library" in pm.plugins_instances:
114 pm.plugins_instances["audio_library"].process_audio_folder()
116 @dbus.service.method(DBUS_IFACE)
117 def reload_config(self):
118 config.manager.update()