Supersonic: lightweight Subsonic music server


Published: May 2018

Some time ago I wrote a subsonic server, cause I wanted to stream my own music database. Since I own a small ARM-based NAS that has relatively small memory I did not want to run java, which is the official server implementation.

The protocol is relatively simple so I went ahead and wrote a small naive implementation that can be found at https://github.com/davidgfnet/supersonic. It uses python and it's relatively simple, although a bit slow and uses webpy which is not great also.

Not satisfied with it I reimplemented it again in C++ which is more efficient and also not too complicated. The implementation is a bit dodgy in the sense that it's poorly documented, uses some custom libraries (from github) and it's a bit adhoc in general. That said it works wonderfully, very stable it can run for weeks without problems. It features:

  • HTTP/HTTPS interface: Cause using some HTTP frontend like nginx might not be an option or just inconvenient.
  • Very lightweight: uses around 7MB on my machine when a couple users stream from it.
  • Fast and simple: Scanning is reasonably fast and it generates a sqlite3 database. It also has user/pass security to access the server, stored in the database. Adding more users or music is as simple as running a scan, which might be performed on an already existing database.
  • Cover art support: It will extract covers from MP3 and Ogg Vorbis files and generate thumbnails for them. Clients supporting cover art might query for covers specifying a desired resolution.
  • Support for XML and JSON: newer clients might want to query using JSON instead of XML, that is supported.

I tipically use Clementine (which has native Subsonic support) on PCs and Ultrasonic on Android. I sent some patches and fixes to both clients, since they had minor issues or lacking some features.

You can find the repo here: https://github.com/davidgfnet/supersonic-cpp