Tempo #

Tempo is a HTTP API which aims to replace the dated Subsonic API. It borrows from previous experiments such as Aura (created by the mighty folks from the Beets tagger) and adheres completely to the JSON:API specification. The naming for all resources is inspired by MusicBrainz.

Improvements over Subsonic #

The aim is to provide a simple yet extensible API which overcomes all of Subsonic’s many issues:

  • Lack of multi valued tags: multi valued tags are forced everywhere in the API where an resource may have more than one value for a given key. The most common examples are track and release genres and/or artists.
  • Proper support for compilation albums: Various artists and multiple artists albums can be properly displayed with the support for multi valued keys and distinction between track artist and release artist.
  • Extensibility: each server can expose the list of supported features, and clients should handle the availability or lack thereof. A set of minimum features must be implemented by all servers, in order to lower the burden on the client side checking logic.

While some features are not yet documented, the plan is to optionally support as many features as possible, even if they go beyond a REST API. For example, jukebox remote control is planned to be added to the specification.

Improvements over Aura #

Aura has been of great inspiration for Tempo, but in my mind it can be improved:

  • Too many basic optional features make client side development too complex. Support for releases shouldn’t be optional, I can’t imagine myself listening to some music without the concept of a release.
  • No support for multiple artists, stemming from the lack of support in the Beets music tagger.
  • Aura often does try to achieve document inclusion of certain fields via repetitive resource attributes (for example, the album field in a track). The JSON:API specification explicitly suggests using the inlcude header to bring in other resources, and it shall be used.