upnp-av is a server implementing a minimal UPnP MediaServer device. It presents the contents of a local directory as a UPnP ContentDirectory, enabling other devices on the network (such as smart TVs) to browse the media files it contains. The files themselves are then streamed by some other HTTP server which is configured separately.
upnp-av is written in POSIX C99, and also requires
memmem. It can
be built using
upnp-mediaserver implements directory navigation through the UPnP
ContentDirectory service. The transfer of the files is handled
through a standard HTTP server, serving that same directory at some
One TV I tested with required a special DLNA header in order to
support pause and seeking:
This allows the player to use the HTTP/1.1
Range header to fetch
certain fragments of the file. On nginx, this header can be added with
add_header contentFeatures.dlna.org DLNA.ORG_OP=01;
upnp-mediaserver, you must choose a UUID to identify the
server. This can be generated with
uuidgen from util-linux.
Currently, you also need to explicitly specify the address to bind
UUID=$(uuidgen) upnp-mediaserver -l bind-address -C /path/to/media "$UUID" http://mediaserver/
Resource URLs are contructed by prepending the given URL prefix (in
http://mediaserver/) with the URL-encoded filename
in the local directory. The expectation is that these map 1-1 with
the files served by the HTTP server.
It works, but some of the code is a little rough and needs some clean-up.