Liquidsoap 2.2.0
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
andpcm_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, addedsocket()
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 sourcefile.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
andy = { 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 usex()
instead of!x
in order to get
the value of a reference. Setting a reference can be done both byx.set(v)
andx := v
, which is still supported as a notation (#2881). - Added
ref.make
andref.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 selectgtts
' language,
addedsettings.protocol.gtts.options
to be able to add any other option (#3182) - Added
settings.protocol.pico2wave.lang
to be able to selectpico2wav
language (#3182) - Added
"metadata_url"
to the default list of exported metadata (#2946) - Added log colors!
- Added
list.filter_map
andlist.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
toUTF-8
(#2704) - BREAKING: all
timeout
settings and parameters are nowfloat
values
and in seconds (#2809) - BREAKING: in
output.{shoutcast,icecast}
:- Old
icy_metadata
renamed tosend_icy_metadata
and changed to a nullablebool
.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, otherwiseartist
ortitle
if available, otherwise
null
, meaning don't add the metadata. - Cleanup, removed parameters that were irrelevant to each operator, i.e.
icy_id
inoutput.icecast
and etc. - Make
mount
mandatory andname
nullable. Usemount
asname
whenname
isnull
.
- Old
reopen_on_error
andreopen_on_metadata
inoutput.file
and related operators are now callbacks to
allow dynamic handling.- Added
reopen
method tooutput.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. Usepersist_overrides
to revert to previous behavior
(persist_override
forcross
/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 requiretaglib
anymore.- Moved HLS outputs stream info as optional methods on their respective encoder.
- Changed
self_sync
ininput.ffmpeg
to be a boolean getter, changedself_sync
ininput.http
to be a nullable boolean getter. Setself_sync
totrue
in
input.http
when an icecast or shoutcast server can be detected. - Add
sorted
option tofile.ls
. - Add
buffer_length
method toinput.external.rawaudio
and
input.external.wav
(#2612). - Added full
OCaml
backtrace astrace
to runtime errors returned from OCaml code. - Removed confusing
let json.stringify
in favor ofjson.stringify()
. - Font, font size and colors are now getters for text operators (
video.text
,
video.add_text
, etc.) (#2623). - Add
on_cycle
option tovideo.add_text
to register a handler when cycling
(#2621). - Renamed
{get,set}env
intoenvironment.{get,set}
- Renamed
add_decoder
,add_oblivious_decoder
andadd_metadata_resolver
into, respectively,decoder.add
,decoder.oblivious.add
,decoder.metadata.add
- Deprecated
get_mime
, addedfile.mime.libmagic
andfile.mime.cli
, made
file.mime
tryfile.mime.libmagic
if present andfile.mime.cli
otherwise,
changed eturned value when no mime was found tonull()
. - 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 totime.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 ofstring
(#2700). - Deprecated
string_of_float
in favor ofstring.float
(#2700). - Added
settings.protocol.youtube_dl.timeout
to specify timeout when using
youtube-dl
protocol (#2827). Useyt-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
toadd_rectangle
, and similarly forline
.
Fixed:
- The randomization function
list.shuffle
used inplaylist
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)