Liquidsoap 1.2.0 : Flows


We maintain a webpage of streams generated by Liquidsoap. In order to register your radio on this page, a simple operator called register_flow is provided. If your stream is called stream, just wrap it as follows before outputting it:

stream = register_flow(
  radio="My radio",
  description="The sound of my computer",

Most parameters are pretty explicit: radio is the name of the radio, website is the url of the website of the radio, etc.

The parameter streams is a list of pairs of strings describing the format of the stream and the url of the stream. We use a list here because one radio can be broadcasted under multiple stream formats. The format should always be of the form codec/bitrate (e.g. mp3/128k) or codec if it is encoded in variable bitrate.

You can register a stream with any user and password parameters. Those parameters are only useful if you use additional services such as the command-line client, or if you want to claim that you “own” a registered radio. All this is relatively informal for now, but may be tightened in future developments of Flows.

Getting information from flows

If you develop a website and registered your radio as explained above, flows can be used as a convenient way to retrieve metadata in javascript, get a list of friendly radios, etc. The flows service currently consists of a list of radios broadcasting using Liquidsoap, with their corresponding streams and metadata.

List of radios

Note: When the list gets big enough, this API should be changed to return paginated results.

A list of radios, encoded in JSON format, can be obtained by querying the following url:

Output is a JSON string like this:

[{ "token"       : "a60f5cadf2645321d4d061896318a2d99f2ff6a6",
   "name"        : "RadioPi - Canal Jazz",
   "website"     : "",
   "description" : "Cool vibes from Chatenay!",
   "genre"       : "jazz",
   "longitude"   : 2.26670002937317,
   "latitude"    : 48.7667007446289,
   "title"       : "Bud Powell - Un Poco Loco",
   "artist"      : "Va-1939-1999 - 60 Ans De Jazz",
   "streams"     : [{ "format" : "mp3/128k",
                      "url"    : "" }]}

Single radio

A single radio, encoded in JSON format, can be obtained by querying the following url:

All argument are optional and should be in UTF8 and properly encoded for a HTTP GET request.

A direct request using a radio's token can also be performed at this URL:

Output is a JSON string like this:

{ "token"       : "a60f5cadf2645321d4d061896318a2d99f2ff6a6",
  "name"        : "RadioPi - Canal Jazz",
  "website"     : "",
  "description" : "Cool vibes from Chatenay!",
  "genre"       : "jazz",
  "longitude"   : 2.26670002937317,
  "latitude"    : 48.7667007446289,
  "title"       : "Bud Powell - Un Poco Loco",
  "artist"      : "Va-1939-1999 - 60 Ans De Jazz",
  "streams"     : [{ "format" : "mp3/128k",
                     "url"    : "" }]}

Stream redirection

Flows can also be used to provide a single url for all your listeners, allowing you to change the actual listening url of your radio while preserving your playlists.

If you radio's token is :token and has a stream of format :format, then the following url will redirect any request to your stream's URL.


As for streams, if you radio's token is :token then the following link will return a PLS) playlist:

Real-time notifications

It is oftentimes difficult to properly implement a regular update of your radio's currently playing information on a website or an online player. Using Flows, you can very easily implement real-time notifications of the song currently being played by your radio.

First, you need to know your radio's token. You can do so by querying a single radio, as described above, or querying all radios and finding yours in the list.

Then, in your webpage's head, you need to add javascript code adapted from this example:

<script src=""></script>
<script type="text/javascript">
  var socket = io.connect("");

  socket.emit('join', radio_token);

  socket.on('joined', function (radio) {
    console.log("Successfully joined " + + " notification channel. Current title is: " + radio.title + ".");

  socket.on('error', function (data) {
    console.log("Error: " + data + ".");

  socket.on(radio_token, function (data) {
    console.log("Got new notification " + data.cmd + " for radio " + + ": " + JSON.stringify(data));

Received messages are objects of the form:

{ cmd   : "metadata",
  radio : { token       : "a60f5cadf2645321d4d061896318a2d99f2ff6a6",
            name        : "RadioPi - Canal Jazz",
            website     : "",
            description : "Cool vibes from Chatenay!",
            genre       : "jazz",
            longitude   : 2.26670002937317,
            latitude    : 48.7667007446289,
            title       : "Bud Powell - Un Poco Loco",
            artist      : "Va-1939-1999 - 60 Ans De Jazz",
            streams     : [{ format : "mp3/128k",
                             url    : "" }]}}

Messages with command "metadata" are the one you want to use to update information displayed about your radio.

Twitter notifications

Note: The twitter API is deprecated for now.

You can register twitter notifications on any twitter account with radio that you own. The API is designed to allow implementing this feature on your website. It works as follows:

First you issue a HTTP GET request, authenticated with your radio credentials at this address:

Then you should receive a response of the form:


You should then visit the returned url with a browser or redirect your website visitor to this address. There, twitter should ask you to authorize the Savonet Flows application for the twitter user that you or your visitor are using.

Once done, you should be automatically redirected to :link where :link is the parameter passed in the initial HTTP GET request. From this point, all metadata updates for the that radio should be forwarded to the twitter account that was just authorized.

Command-line client

A command-line client is also available. It can be used to:

The code is still being developped. It can be accessed at this url: