Liquidsoap dev : Seeking and cue points

Seeking in liquidsoap

Starting with Liquidsoap 1.0.0-beta2, it is now possible to seek within sources! Not all sources support seeking though: currently, they are mostly file-based sources such as request.queue, playlist, request.dynamic etc..

The basic function to seek within a source is It has the following type:


The parameters are:

The function returns the duration actually seeked.

Please note that seeking is done to a position relative to the current position. For instance,,3.) will seek 3 seconds forward in source s and,(-4.)) will seek 4 seconds backward.

Since seeking is currently only supported by request-based sources, it is recommended to hook the function as close as possible to the original source. Here is an example that implements a server/telnet seek function:

# A playlist source
s = playlist("/path/to/music")

# The server seeking function
def seek(t) =
  t = float_of_string(default=0.,t)
  log("Seeking #{t} sec")
  ret =,t)
  "Seeked #{ret} seconds."

# Register the function
                description="Seek to a relative position \
                             in source #{}",
                usage="seek <duration>",
Grab the code!

Cue points.

Sources that support seeking can also be used to implement cue points. The basic operator for this is cue_cut. Its has type:


Its parameters are:

The values of cue-in and cue-out points are given in absolute position through the source's metadata. For instance, the following source will cue-in at 10 seconds and cue-out at 45 seconds on all its tracks:

s = playlist(prefix="annotate:liq_cue_in=\"10.\",liq_cue_out=\"45\":",

s = cue_cut(s)
Grab the code!

As in the above example, you may use the annotate protocol to pass custom cue points along with the files passed to Liquidsoap. This is particularly useful in combination with request.dymanic as an external script can build-up the appropriate URI, including cue-points, based on information from your own scheduling back-end.

Alternatively, you may use map_metadata to add those metadata. The operator map_metadata supports seeking and passes it to its underlying source.