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!
New:
Changed:
Fixed:
Full changelog
2.2.0 (2023-07-21)
pcm_s16
and pcm_f32
(#3008)
added native type for srt sockets with methods, moved stats
to socket methods, added socket()
method on srt input/outputs
(#2556)
custom tags (#2898).
ocaml-tls
(#3074)
video.align
.
string.index
.
raw PCM stream and file (#3066)
value is set.
v2.2.0
frames and pictures.
track.audio.defer
to be used to buffer large amount of audio data (#3136)
runtime.locale.force
to force the system's locale (#3231)
jemalloc
memory allocator (#3170)
source.drop
to animate a source as fast as possible..
source.replaygain.compute
to compute replaygain of a source
file.replaygain
to compute the replaygain of a file
let {foo, gni, ..y} = x
and y = { foo = 123, gni = "aabb", ...x}
(#2737)
file.{copy, move}
(#2771)
null.map
.
'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).
ref.make
and ref.map
.
video.board
, video.graph
, video.info
(#2886).
pico2wave
protocol in order to perform speech synthesis using
Pico TTS (#2934).
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)
settings.protocol.pico2wave.lang
to be able to select pico2wav
language (#3182)
"metadata_url"
to the default list of exported metadata (#2946)
list.filter_map
and list.flatten
.
medialib
in order to store metadata of files in a folder and query
them (#3115).
--unsafe
option (#3113). This makes the startup much faster but
disables some guarantees (and might even make the script crash...).
string.split.first
(#3146).
string.getter.single
(#3125).
dune
for building the binary and libraries.
cry
to be a required dependency.
output.harbor
, output.icecast
output.shoutcast
to UTF-8
(#2704)
timeout
settings and parameters are now float
values
and in seconds (#2809)
output.{shoutcast,icecast}
:
icy_metadata
renamed to send_icy_metadata
and changed to a nullable bool
. null
means guess.
icy_metadata
now returns a list of metadata to send with ICY updates.
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.
icy_id
in output.icecast
and etc.
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.
reopen
method to output.file
.
%define
variables, superseded by support for actual
variables in encoders.
append
source.
trace
method, making it
possible to programmatically point to file, line and character offsets
of each step in the error call trace (#2712)
harbor
http handler API to be more flexible. Added a new
node/express-like registration and middleware API (#2599).
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).
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.
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.
sorted
option to file.ls
.
buffer_length
method to input.external.rawaudio
and
input.external.wav
(#2612).
OCaml
backtrace as trace
to runtime errors returned from OCaml code.
let json.stringify
in favor of json.stringify()
.
video.text
,
video.add_text
, etc.) (#2623).
on_cycle
option to video.add_text
to register a handler when cycling
(#2621).
{get,set}env
into environment.{get,set}
add_decoder
, add_oblivious_decoder
and add_metadata_resolver
into, respectively, decoder.add
, decoder.oblivious.add
, decoder.metadata.add
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()
.
request.duration
.
--list-plugins-json
and --list-plugins-xml
options.
--list-functions-json
option.
strftime
conversions in output filenames, replaced
by an explicit call to time.string
(#2593)
{int,float,bool}_of_string
conversion functions, raise
an exception if conversion fails and no default is given.
string_of
in favor of string
(#2700).
string_of_float
in favor of string.float
(#2700).
settings.protocol.youtube_dl.timeout
to specify timeout when using
youtube-dl
protocol (#2827). Use yt-dlp
as default binary for the
protocol.
sleeper
operator is now scripted (#2899).
osx-secure-transport
. Doubt it was ever used, API deprecated
upstream (#3067)
rectangle
to add_rectangle
, and similarly for line
.
list.shuffle
used in playlist
was incorrect and
could lead to incorrectly randomized playlists (#2507, #2500).
prevent listening socket from being re-created on listener disconnection (#2556)
input.ffmpeg
-based urls (#2956)
%external
encoder (#3029)