This code is based upon code by Tim Potter. It is licensed under the MIT license at: http://opensource.org/licenses/mit-license.php I got a D-Link DSM-520 but I needed a UPnP Media Server to stream data with. I tried one, but it had issues running under FreeBSD's Linux emulation. Since I know Python, I went looking for a python server and found this code. The code was a good framework, so I expanded upon it. Tested devices and/or programs: Intel's Media Control Point and Media Renderer D-Link DSM-520 The Intel tools are good for testing and are available at: http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/upnp/index.htm Either make a directory media and put the files there, or make a symlink named media to your media files. Either will work. Run it as: ./pymediaserv [ ] Good Luck! John-Mark Gurney Ideas for future improvements: Understand ZIP files, so you can view images and listen to mp3s in the zip file. (ZipFile is there.) Possibly switch how the HTTP media server behaves, and instead of using static.File, have each object present a Contents function or something similar, to make understanding ZIP files easier. Autodetect IP address. Support sorting by other attributes. v0.2: No longer require restarting to see new files/dirs in hierarchy. Add FSStorage which is a set of classes for handling filesystem objects, also handles updateID's. Make the root container customizable, so you don't end up with a single entry (like media) at the root. This lets us use a FSDirectory as the root and get auto-enumeration Support returning custom error codes, so that we can return 701 No such object among others. Support deleting items, so we can remove them when no longer on the file system. Make Containers a subclass of list. This lets use populate childCount properly. Add required attributes to Storage* classes. Support custom container classes to addContainer. Add a few more custom mime-types. Sort listings by name for now. v0.1: Don't bind the UDP socket to the multicast address, so replies go out on our local IP. Send out notify requests when we register the services with SSDP. Send out byebye notifications when we are shutting down. Randomize the UUID for the server (this should be part of the saved state). Randomize the port, or optionally set it on the command line. Teach ContentDirectory.py the basics on handling Containers and generic browse support. You can addItem and addContainer, which each return either respective ObjectID. We already support partial chunking of responses, but we don't yet support filtering or sorting.