|  | #!/usr/bin/env python
# Licensed under the MIT license
# http://opensource.org/licenses/mit-license.php
# (c) 2005, Tim Potter <tpot@samba.org>
import random
import socket
import string
import sys
from twisted.python import log
from twisted.internet import reactor
def generateuuid():
	if False:
		return 'asdflkjewoifjslkdfj'
	return ''.join(map(lambda x: random.choice(string.letters), xrange(20)))
listenAddr = sys.argv[1]
if len(sys.argv) > 2:
	listenPort = int(sys.argv[2])
	if listenPort < 1024 or listenPort > 65535:
		raise ValueError, 'port out of range'
else:
	listenPort = 8080
log.startLogging(sys.stdout)
# Create SSDP server
from SSDP import SSDPServer, SSDP_PORT, SSDP_ADDR
s = SSDPServer()
port = reactor.listenMulticast(SSDP_PORT, s)
port.joinGroup(SSDP_ADDR)
port.setLoopbackMode(0)		# don't get our own sends
uuid = 'uuid:' + generateuuid()
urlbase = 'http://%s:%d/' % (listenAddr, listenPort)
# Create SOAP server
from twisted.web import server, resource, static
from ContentDirectory import ContentDirectoryServer
from ConnectionManager import ConnectionManagerServer
class WebServer(resource.Resource):
    def __init__(self):
        resource.Resource.__init__(self)
class RootDevice(static.Data):
    def __init__(self):
	r = {
		'hostname': socket.gethostname(),
		'uuid': uuid,
		'urlbase': urlbase,
	}
	d = file('root-device.xml').read() % r
        static.Data.__init__(self, d, 'text/xml')
root = WebServer()
root.putChild('ContentDirectory', ContentDirectoryServer())
root.putChild('ConnectionManager', ConnectionManagerServer())
root.putChild('root-device.xml', RootDevice())
# Area of server to serve media files from
from MediaServer import MediaServer
root.putChild('media', static.File('media'))
site = server.Site(root)
reactor.listenTCP(listenPort, site)
# we need to do this after the children are there, since we send notifies
s.register('%s::upnp:rootdevice' % uuid,
           'upnp:rootdevice',
           urlbase + 'root-device.xml')
s.register(uuid,
           uuid,
           urlbase + 'root-device.xml')
s.register('%s::urn:schemas-upnp-org:device:MediaServer:1' % uuid,
           'urn:schemas-upnp-org:device:MediaServer:1',
           urlbase + 'root-device.xml')
s.register('%s::urn:schemas-upnp-org:service:ConnectionManager:1' % uuid,
           'urn:schemas-upnp-org:device:ConnectionManager:1',
           urlbase + 'root-device.xml')
s.register('%s::urn:schemas-upnp-org:service:ContentDirectory:1' % uuid,
           'urn:schemas-upnp-org:device:ContentDirectory:1',
           urlbase + 'root-device.xml')
# Main loop
reactor.run()
 |