Skip to content

Liquidsoap 2.2.0

Compare
Choose a tag to compare
@github-actions github-actions released this 22 Jul 12:44
· 454 commits to main since this release

We are delighted to announce the release of Liquidsoap 2.2.0!

This release comes almost 4 months after the last stable release from the 2.1.x release cycle and 14 months (!) after forking the 2.2.x release branch! It includes some exciting changes in track muxing/demuxing, HLS, sound processing and more.

See our blog post for a detailed list of features!

🕵️ Versioning and release assets

For a little over a year now, we have switched to rolling release cycles with maintenance and bugfixes applying only to the current release cycle. Regular releases are tagged vX.Y.Z (for instance v2.2.0) on github and docker while on-going releases are tagged rolling-release-vX.Y.Z.

When an initial release, for instance 2.2.0, is being worked on, bugfixes and user issues are addressed for users using the 2.1.x releases. While we would like to extend support, this is the best that we can do with our limited resources!

rolling-release-vX.Y.Z tags denote the releases being worked on. For stable release branches, this would be for instance, rolling-release-v2.2.1 after release v2.2.0. For a yet-to-be released initial version, this would be for instance rolling-release-v2.3.x. We try our best to make those releases as bug-free as possible. Using one of them to test your production script also guarantees the fastest response to bugs and issues!

For release assets, we try to maintain two packages for debian and ubuntu distributions, one with the latest LTS or stable and one with a recent release. The new minimal assets are, as the name suggests, minimal builds. They contain a limited set of features and standard library operators. Minimal builds are intended for most production run and should limit the risk of issues such as segfault and etc. If your script can run with it, we recommend it over the fully featured builds.

For each release asset, you can consult the associated .config file to see which features are enabled.

Docker release images are located at: savonet/liquidsoap:v2.2.0. The release tag may be updated if needed. You can use git sha-based images to pick a fixed build, e.g. savonet/liquidsoap:<sha>

Lastly, we may update the list of release assets on the github release page. If you are looking for permanent release asset links make sure to checkout savonet/liquidsoap-release-assets.

🧮 Migration guide

We listed most of the migration issues you might run into on this page. The detailed changelog below may also help.

As a reminder, we strongly recommend to test your script in a stagging environment, even between minor releases, to make sure that everything is working correctly before pushing a new liquidsoap version to production!

Full changelog

2.2.0 (2023-07-21)

New:

  • Added support for less memory hungry audio formats, namely
    pcm_s16 and pcm_f32 (#3008)
  • Added support for native osc library (#2426, #2480).
  • SRT: added support for passphrase, pbkeylen, streamid,
    added native type for srt sockets with methods, moved stats
    to socket methods, added socket() method on srt input/outputs
    (#2556)
  • HLS: Added support for ID3 in-stream metadat (#3154) and
    custom tags (#2898).
  • Added support for FLAC metadata (#2952)
  • Added support for YAML parsing and rendering (#2855)
  • Added support for the proprietary shared stereotool library (#2953)
  • Added TLS support via ocaml-tls (#3074)
  • Added video.align.
  • Added string.index.
  • Added support for ffmpeg decoder parameters to allow decoding of
    raw PCM stream and file (#3066)
  • Added support for unit interactive variables: those call a handler when their
    value is set.
  • Added support for id3v2 v2.2.0 frames and pictures.
  • Added track.audio.defer to be used to buffer large amount of audio data (#3136)
  • Added runtime.locale.force to force the system's locale (#3231)
  • Added support for customizable, optimized jemalloc memory allocator (#3170)
  • Added source.drop to animate a source as fast as possible..
  • Added in house replaygain computation:
    • source.replaygain.compute to compute replaygain of a source
    • file.replaygain to compute the replaygain of a file
  • Added support for ImageLib to decode images.
  • Added support for completion in emacs based on company (#2652).
  • Added syntactic sugar for record spread: let {foo, gni, ..y} = x
    and y = { foo = 123, gni = "aabb", ...x} (#2737)
  • Added file.{copy, move} (#2771)
  • Detect functions defining multiple arguments with the same label (#2823).
  • Added null.map.
  • References of type 'a are now objects of type (()->'a).{set : ('a) -> unit}. This means that you should use x() instead of !x in order to get
    the value of a reference. Setting a reference can be done both by x.set(v)
    and x := v, which is still supported as a notation (#2881).
  • Added ref.make and ref.map.
  • Added video.board, video.graph, video.info (#2886).
  • Added the pico2wave protocol in order to perform speech synthesis using
    Pico TTS (#2934).
  • Added settings.protocol.gtts.lang to be able to select gtts' language,
    added settings.protocol.gtts.options to be able to add any other option (#3182)
  • Added settings.protocol.pico2wave.lang to be able to select pico2wav language (#3182)
  • Added "metadata_url" to the default list of exported metadata (#2946)
  • Added log colors!
  • Added list.filter_map and list.flatten.
  • Added medialib in order to store metadata of files in a folder and query
    them (#3115).
  • Added --unsafe option (#3113). This makes the startup much faster but
    disables some guarantees (and might even make the script crash...).
  • Added string.split.first (#3146).
  • Added string.getter.single (#3125).

Changed:

  • Switched to dune for building the binary and libraries.
  • Changed cry to be a required dependency.
  • Changed default character encoding in output.harbor, output.icecast
    output.shoutcast to UTF-8 (#2704)
  • BREAKING: all timeout settings and parameters are now float values
    and in seconds (#2809)
  • BREAKING: in output.{shoutcast,icecast}:
    • Old icy_metadata renamed to send_icy_metadata and changed to a nullable bool. null means guess.
    • New icy_metadata now returns a list of metadata to send with ICY updates.
    • Added icy_song argument to generate default "song" metadata for ICY updates. Defaults
      to <artist> - <title> when available, otherwise artist or title if available, otherwise
      null, meaning don't add the metadata.
    • Cleanup, removed parameters that were irrelevant to each operator, i.e. icy_id in output.icecast and etc.
    • Make mount mandatory and name nullable. Use mount as name when name is null.
  • reopen_on_error and reopen_on_metadata in output.file and related operators are now callbacks to
    allow dynamic handling.
  • Added reopen method to output.file.
  • Added support for a Javascript build an interpreter.
  • Removed support for %define variables, superseded by support for actual
    variables in encoders.
  • Cancel pending append when skipping current track on append source.
  • Errors now report proper stack trace via their trace method, making it
    possible to programmatically point to file, line and character offsets
    of each step in the error call trace (#2712)
  • Reimplemented harbor http handler API to be more flexible. Added a new
    node/express-like registration and middleware API (#2599).
  • Switched default persistence for cross and fade-related overrides
    to follow documented behavior. By default, "liq_fade_out", "liq_fade_skip",
    "liq_fade_in", "liq_cross_duration" and "liq_fade_type" now all reset on
    new tracks. Use persist_overrides to revert to previous behavior
    (persist_override for cross/crossfade) (#2488).
  • Allow running as root by default when docker container can be detected using
    the presence of a /.dockerenv file.
  • id3v2 argument of %mp3 encoder changed to "none" or version number to allow
    to choose the metadata version. true is still accepted and defaults to version
    3. Switched to our internal implementation so that it does not require taglib
    anymore.
  • Moved HLS outputs stream info as optional methods on their respective encoder.
  • Changed self_sync in input.ffmpeg to be a boolean getter, changed self_sync
    in input.http to be a nullable boolean getter. Set self_sync to true in
    input.http when an icecast or shoutcast server can be detected.
  • Add sorted option to file.ls.
  • Add buffer_length method to input.external.rawaudio and
    input.external.wav (#2612).
  • Added full OCaml backtrace as trace to runtime errors returned from OCaml code.
  • Removed confusing let json.stringify in favor of json.stringify().
  • Font, font size and colors are now getters for text operators (video.text,
    video.add_text, etc.) (#2623).
  • Add on_cycle option to video.add_text to register a handler when cycling
    (#2621).
  • Renamed {get,set}env into environment.{get,set}
  • Renamed add_decoder, add_oblivious_decoder and add_metadata_resolver
    into, respectively, decoder.add, decoder.oblivious.add, decoder.metadata.add
  • Deprecated get_mime, added file.mime.libmagic and file.mime.cli, made
    file.mime try file.mime.libmagic if present and file.mime.cli otherwise,
    changed eturned value when no mime was found to null().
  • Return a nullable float in request.duration.
  • Removed --list-plugins-json and --list-plugins-xml options.
  • Added --list-functions-json option.
  • Removed built-in use of strftime conversions in output filenames, replaced
    by an explicit call to time.string (#2593)
  • Added nullable default to {int,float,bool}_of_string conversion functions, raise
    an exception if conversion fails and no default is given.
  • The camomile library for charset conversion is now optional (#2696).
  • Deprecated string_of in favor of string (#2700).
  • Deprecated string_of_float in favor of string.float (#2700).
  • Added settings.protocol.youtube_dl.timeout to specify timeout when using
    youtube-dl protocol (#2827). Use yt-dlp as default binary for the
    protocol.
  • The sleeper operator is now scripted (#2899).
  • Reworked remote request file extension resolution (#2947)
  • REMOVED osx-secure-transport. Doubt it was ever used, API deprecated
    upstream (#3067)
  • Renamed rectangle to add_rectangle, and similarly for line.

Fixed:

  • The randomization function list.shuffle used in playlist was incorrect and
    could lead to incorrectly randomized playlists (#2507, #2500).
  • Fixed srt output in listener mode to allow more than one listener at a time and
    prevent listening socket from being re-created on listener disconnection (#2556)
  • Fixed race condition when switching input.ffmpeg-based urls (#2956)
  • Fixed deadlock in %external encoder (#3029)
  • Fixed crash in encoders due to concurrent access (#3064)
  • Fixed long-term connection issues with SSL (#3067)