@@ -29,9 +29,42 @@ from DIDLLite import DIDLElement, Container, Movie, Resource, MusicTrack
import traceback
from urllib import quote
class ContentDirectoryControl(UPnPPublisher):
class ContentDirectoryControl(UPnPPublisher, dict ):
"""This class implements the CDS actions over SOAP."""
def getnextID(self):
ret = str(self.nextID)
self.nextID += 1
return ret
def addContainer(self, parent, title, **kwargs):
ret = self.addItem(parent, Container, title, **kwargs)
self.children[ret] = []
return ret
def addItem(self, parent, klass, *args, **kwargs):
assert isinstance(self[parent], Container)
nid = self.getnextID()
i = klass(nid, parent, *args, **kwargs)
self.children[parent].append(i)
self[i.id] = i
return i.id
def getchildren(self, item):
assert isinstance(self[item], Container)
return self.children[item][:]
def __init__(self, title, *args):
super(ContentDirectoryControl, self).__init__(*args)
fakeparent = '-1'
self.nextID = 0
self.children = { fakeparent: []}
self[fakeparent] = Container(None, '-1', 'fake')
root = self.addContainer(fakeparent, title)
assert root == '0'
del self[fakeparent]
del self.children[fakeparent]
# Required actions
def soap_GetSearchCapabilities(self, *args, **kwargs):
@@ -61,6 +94,8 @@ class ContentDirectoryControl(UPnPPublisher):
(ObjectID, BrowseFlag, Filter, StartingIndex, RequestedCount,
SortCriteria) = args
StartingIndex = int(StartingIndex)
RequestedCount = int(RequestedCount)
log.msg('Browse(ObjectID=%s, BrowseFlags=%s, Filter=%s, '
'StartingIndex=%s RequestedCount=%s SortCriteria=%s)' %
@@ -68,40 +103,16 @@ class ContentDirectoryControl(UPnPPublisher):
`RequestedCount`, `SortCriteria`))
didl = DIDLElement()
result = {}
try:
if ObjectID == '0':
c = Container('media', '0', 'All media')
c.childCount = 5
c.searchable = 0
didl.addItem(c)
elif ObjectID == '0\\Music\\':
c = Container('0\\Music\\Spotty\\', '0\\Music\\', 'Spotty')
c.childCount = 6
c.searchable = 0
didl.addItem(c)
c = Container('0\\Music\\Foot\\', '0\\Music\\', 'Foot')
c.childCount = 1
c.searchable = 0
didl.addItem(c)
elif ObjectID == '0\\Music\\Spotty\\':
m = MusicTrack('0\\Music\\media\\foo.mp3', '0\\Music\\', 'foo.mp3')
m.res = Resource('http://192.168.1.105:8080/media/foo.mp3', 'http-get:*:audio/mpeg:*')
m.res.size = 1234
m.res.bitrate = 256
m.genre = 'Others'
m.artist = 'Others'
m.album = 'Others'
didl.addItem(m)
if BrowseFlag == 'BrowseDirectChildren':
ch = self.getchildren(ObjectID)[StartingIndex: StartingIndex + RequestedCount]
log.msg(ch)
log.msg(dict.__repr__(self))
filter(lambda x, s = self, d = didl: d.addItem(s[x.id]) and None, ch)
else:
didl.addItem(self[ObjectID])
result = {'BrowseResponse': {'Result': didl.toString() ,
'NumberReturned': didl.numItems(),
@@ -205,7 +216,8 @@ class ContentDirectoryControl(UPnPPublisher):
(`ContainerID`, `ObjectID`))
class ContentDirectoryServer(resource.Resource):
def __init__(self):
def __init__(self, title ):
resource.Resource.__init__(self)
self.putChild('scpd.xml', static.File('content-directory-scpd.xml'))
self.putChild('control', ContentDirectoryControl())
self.control = ContentDirectoryControl(title)
self.putChild('control', self.control)