zb_database_path = pjoin(zb_base_path, "audio_library.db")
zb_module_path = zukebox_server.__path__[0]
zb_plugins_path = pjoin(zb_module_path, "plugins")
+zb_services_path = pjoin(zb_module_path, "services")
+zb_xml_path = pjoin(zb_module_path, "xml_descriptions")
plugin_section = "zukebox_server_plugin-audio-library"
# ZBox Server
config.manager.set_parameter("zukebox_server", "name", "ZukeBox Server")
config.manager.set_parameter("zukebox_server", "owner", "zukebox-server")
- config.manager.set_parameter("zukebox_server", "home", zb_module_path)
+ config.manager.set_parameter("zukebox_server", "module_path", zb_module_path)
config.manager.set_parameter("zukebox_server", "plugins", zb_plugins_path)
+ config.manager.set_parameter("zukebox_server", "services", zb_services_path)
+ config.manager.set_parameter("zukebox_server", "xml_path", zb_xml_path)
# ZBox Plugins
config.manager.set_parameter(plugin_section, "owner",
def init_server():
log.info("ZukeBox Server starting....")
listen_url, daemon = options.parse_args("ZukeBox Server")
+ print listen_url, deamon
if daemon:
daemonize()
server_name = config.get_parameter("zukebox_server", "name")
if self.lms is not None:
self.lms.process(self.audio_folder)
else:
- raise Exception("Could not process audio folder lightmediascanner is
- None")
+ raise Exception("Could not process audio folder lms is None")
def check_audio_folder(self):
if self.lms is not None:
self.lms.check(self.audio_folder)
else:
- raise Exception("Could not check audio folder lightmediascanner is
- None")
+ raise Exception("Could not check audio folder lms is None")
def browse(self,id, browse_flag, filter, starting_index, requested_count, sort_criteria):
if id in self.containers:
manufacturer="Zagaia Laboratory",
manufacturer_url=project_page,
model_description=model_description,
- model_name=model_name, model_number=serial_no,
+ model_name=model_name, model_number="1.0",
model_url=project_page, serial_number=serial_no)
def _create_services(self):
- self.cds = ContentDirectory(self.plugins_folder,
- self.plugins_module_path)
+ self.cds = ContentDirectory(self.plugins_folder, self.plugins_module_path)
cm = ConnectionManagerServer()
- mod_path = config.get_parameter("zukebox_server", "home")
- x_path = os.path.join(mod_path, "xml_descriptions")
+ x_path = config.get_parameter("zukebox_server", "xml_path")
playlist = PlayList(positions=10, xml_path=x_path)
self.device.add_service(self.cds)
"""Start the ZukeBox Server"""
self._create_device()
self._create_services()
- #pm = self.cds.control_controller.plugin_manager
- #pm.plugins_instances["audio_library"].do_scan()
self.device.start()
reactor.add_after_stop_func(self.device.stop)
reactor.main()
pjoin = os.path.join
class PlayListOutBoundExcept(Exception):
- def __rep__(self):
- return "Play List Out of Bounds!"
+ def __init__(self, *args, **kwargs):
+ Exception.__init__(self, args, kwargs)
"""Class PlayList
Introduction
============
- Implements a playlist for ZukeBox server.
+ Implements a playlist for ZukeBox server as a service.
+ For now the playlist works with a range of 10 positions, but in the
+ future that should change to range of undefined positions, thus
+ the playlist will be "sizeable".
"""
- service_type = "urn:schemas-upnp-org:service:PlayList:1"
- service_name = "PlayList"
+ srvc_type = "urn:schemas-upnp-org:service:PlayList:1"
+ srvc_name = "PlayList"
def __init__(self, positions=10, xml_path=''):
scpd_path = pjoin(xml_path, "zukebox-playlist-scpd.xml")
- Service.__init__(self, self.service_name, self.service_type, '', scpd_path,
- PlayListControl(positions, self.service_type))
-
- def get_playlist(self):
- return self.control_controller.get_playlist()
-
-class PlayListControl(ServiceController):
-
- def __init__(self, positions, serv_type):
- ServiceController.__init__(self, serv_type)
+ log.info("PlayList service scpd_path = %s" % scpd_path)
+ Service.__init__(self, self.srvc_name, self.srvc_type, '', scpd_path)
self.positions = positions
self.list = []
self.current = 0
self.to_name = None
self.current_uri = None
self.current_uri_metadata = None
+ self.locked = 0
+ self.available = 1
def soap_IsLocked(self, *args, **kwargs):
- locked = True
- if not len(self.list) == self.positions:
- locked = False
- rt = {"Locked": locked}
- return {"IsLockedResponse": rt}
-
- def soap_IsAvailble(self, *args, **kwargs):
- availble = False
- if not len(self.list) == 0:
- availble = True
- rt = {"Availble": availble}
- return {"IsAvailbleResponse": rt}
-
- def soap_IsAvailble(self, *args, **kwargs):
- availble = False
- if not len(self.list) == 0:
- availble = True
- rt = {"Availble": availble}
- return {"IsAvailbleResponse": rt}
+ if len(self.list) == self.positions:
+ self.locked = 1
+ return {"Locked": self.locked}
+
+ def soap_IsAvailable(self, *args, **kwargs):
+ if not len(self.list) < 10:
+ self.available = 0
+ return {"Available": self.available}
def soap_Append(self, *args, **kwargs):
"""Put a object in the playlist
"""
- if not self.is_locked():
+ if not self.locked:
self.current_uri = kwargs["CurrentURI"]
self.current_uri_metadata = kwargs["CurrentURIMetaData"]
self.from_name = kwargs["FromName"]
self.to_name = kwargs["ToName"]
- self.list.append(self.current_uri)
+ req = {"cur_uri": self.current_uri,
+ "cur_uri_data": self.current_uri_metadata,
+ "from_name": self.from_name,
+ "to_name": self.to_name}
+ self.list.append(req)
- return {"Append": {}}
+ return {}
else:
- raise PlayListOutBoundExcept()
+ raise PlayListOutBoundExcept("Playlist is full")
def soap_Drop(self, *args, **kwargs):
"""Pop the object at position passed by index
"""
- if self.is_availble():
+ if self.available:
index = kwargs["Index"]
self.list.pop(index)
- return {"Drop": {}}
+ return {}
else:
- raise PlayListOutBoundExcept()
+ raise PlayListOutBoundExcept("Playlist unavailable")
def soap_GetSizeOfPlayList(self, *args, **kwargs):
"""Return the size of playlist"""
lenght = len(self.list)
- rt = {"PlayListSize": lenght}
- return {"GetSizeOfPlayListResponse": rt}
+ return {"PlayListSize": lenght}
+
+ def soap_GetCurrentItem(self, *args, **kwargs):
+ """Get the current position from playlist"""
+ if self.available:
+ curr = self.list[self.current]
+ #for now get only uri
+ curr_uri = curr["cur_uri"]
+ return {"CurrentItem": curr_uri}
+
+ def soap_GetNextItem(self, *args, **kwargs):
+ """Get the next item position from playlist"""
+ if self.current == len(self.list) - 1:
+ self.next = self.current
+ else:
+ self.next = self.current + 1
+ self.current = self.next
+ next = self.list[self.next]
+ #for now get only next uri
+ next_uri = next["cur_uri"]
+ return {"NextItem": next_uri}
+
+ def soap_GetPreviousItem(self, *args, **kwargs):
+ """Get the previous item position from playlist"""
+ if self.current != 0:
+ self.prev = self.current - 1
+ self.current = self.prev
+ prev = self.list[self.prev]
+ #for now get only previous uri
+ prev_uri = prev["cur_uri"]
+ return {"PreviousItem": prev_uri}
- def soap_GetCurrent(self, *args, **kwargs):
- if self.is_availble():
- rt = {"CurrentPosition": self.list[self.current]}
- return {"GetCurrentResponse": rt}
def clean_playlist(self):
- if self.is_availble():
+ if self.available:
self.list = []
def get_playlist(self):
<?xml version="1.0" encoding="utf-8"?>
-<scpd xmls="urn:schemas-upnp-org:service-1-0">
+<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</argumentList>
</action>
<action>
- <name>IsAvailble</name>
+ <name>IsAvailable</name>
<argumentList>
<argument>
- <name>Availble</name>
+ <name>Available</name>
<direction>out</direction>
- <relatedStateVariable>ListIsAvailble</relatedStateVariable>
+ <relatedStateVariable>ListIsAvailable</relatedStateVariable>
</argument>
</argumentList>
</action>
<argument>
<name>PlayListSize</name>
<direction>out</direction>
- <relatedStateVariable>SizeOfPlayList</relatedStateVariable>
+ <relatedStateVariable>A_ARG_TYPE_SizeOfPlayList</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
- <name>GetCurrent</name>
+ <name>GetCurrentItem</name>
<argumentList>
<argument>
- <name>CurrentPosition</name>
+ <name>CurrentItem</name>
<direction>out</direction>
- <relatedStateVariable>CurrPosition</relatedStateVariable>
+ <relatedStateVariable>A_ARG_TYPE_Item</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetNextItem</name>
+ <argumentList>
+ <argument>
+ <name>NextItem</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Item</relatedStateVariable>
+ </argument>
+ </argumentList>
+ </action>
+ <action>
+ <name>GetPreviousItem</name>
+ <argumentList>
+ <argument>
+ <name>PreviousItem</name>
+ <direction>out</direction>
+ <relatedStateVariable>A_ARG_TYPE_Item</relatedStateVariable>
</argument>
</argumentList>
</action>
</actionList>
<serviceStateTable>
- <stateVariable>
+ <stateVariable sendEvents="no">
<name>ListIsLocked</name>
<dataType>boolean</dataType>
+ <defaultValue>0</defaultValue>
</stateVariable>
- <stateVariable>
- <name>ListIsAvailble</name>
+ <stateVariable sendEvents="no">
+ <name>ListIsAvailable</name>
<dataType>boolean</dataType>
+ <defaultValue>1</defaultValue>
</stateVariable>
- <stateVariable>
+ <stateVariable sendEvents="yes">
<name>AVTransportURI</name>
<dataType>string</dataType>
</stateVariable>
- <stateVariable>
+ <stateVariable sendEvents="yes">
<name>AVTransportURIMetaData</name>
<dataType>string</dataType>
</stateVariable>
- <stateVariable>
+ <stateVariable sendEvents="no">
<name>SenderName</name>
<dataType>string</dataType>
</stateVariable>
- <stateVariable>
+ <stateVariable sendEvents="no">
<name>DestinyName</name>
<dataType>string</dataType>
</stateVariable>
- <stateVariable>
+ <stateVariable sendEvents="no">
<name>PositionOfList</name>
<dataType>ui4</dataType>
<allowedValueRange>
</allowedValueRange>
</stateVariable>
<stateVariable>
- <name>SizeOfPlayList</name>
+ <name>A_ARG_TYPE_SizeOfPlayList</name>
<dataType>ui4</dataType>
<allowedValueRange>
<minimum>0</minimum>
</allowedValueRange>
</stateVariable>
<stateVariable>
- <name>CurrPosition</name>
- <dataType>ui4</dataType>
- <allowedValueRange>
- <minimum>0</minimum>
- <maximum>9</maximum>
- <step>1</step>
- </allowedValueRange>
+ <name>A_ARG_TYPE_Item</name>
+ <dataType>string</dataType>
</stateVariable>
</serviceStateTable>
</scpd>