Beetstream is a Beets.io plugin that exposes SubSonic API endpoints, allowing you to stream your music everywhere.
I personally use Beets to manage my music library on a Raspberry Pi but when I was looking for a way to stream it to my phone I couldn't find any comfortable, suitable and free options.
I tried AirSonic and SubSonic, Plex and some other tools but a lot of these solutions want to manage the library as they need (but I prefer Beets) and AirSonic/SubSonic were quite slow and CPU intensive and seemed to have a lot of overhead just to browse albums and send music files. Thus said, SubSonic APIs are good and implemented by a lot of different clients, so I decided to re-implement the server side but based on Beets database (and some piece of code).
Requires Python 3.8 or newer.
-
First of all, you need to install Beets:
-
Install the dependancies with:
$ pip install beetstream
- Enable the plugin for Beets in your config file
~/.config/beets/config.yaml
:
plugins: beetstream
- Optional You can change the host and port in your config file
~/.config/beets/config.yaml
.
You can also chose to never re-encode files even if the clients asks for it with the optionnever_transcode: True
. This can be useful if you have a weak CPU or a lot of clients.
Here are the default values:
beetstream:
host: 0.0.0.0
port: 8080
never_transcode: False
- Run with:
$ beet beetstream
There is currently no security whatsoever. You can put whatever user and password you want in your favorite app.
Currently runs on port 8080
. i.e: https://192.168.1.10:8080
. You can configure it in ~/.config/beets/config.yaml
. Defaults are:
beetstream:
host: 0.0.0.0
port: 8080
All clients below are working with this server. By "working", it means one can use most of the features, browse library and most importantly play music!
- Subsonic (official app)
- DSub
- Audinaut
- Ultrasonic
- GoSONIC
- Subtracks
- Music Stash
- substreamer
Currently supports a subset of API v1.16.1, avaiable as Json, Jsonp and XML.
There is still some missing endpoints and TODO
in the code.
Feel free to create some PR!