Releases: savonet/liquidsoap
Liquidsoap Rolling Release 2.3.x
This release is a pre-release of the 2.3.x
release branch of liquidsoap. It is provided to allow for early testing of the 2.3.0
release before it is officially published.
You can use it to install the latest stable code before it is published and test/prepare your production environment for it.
Please consider the code publishing here as in alpha release stage!
Assets in this release will be deleted. If you are looking for permanent links to release assets, please head over to https://github.com/savonet/liquidsoap-release-assets/releases
For more details about our release process, please checkout https://github.com/savonet/liquidsoap#release-details
2.3.0 (unreleased)
New:
- Rewrote the streaming API to work with immutable frame content. This
should greatly impact impredictable side-effect of the previous models w.r.t.
track marks, content sharing and more. This also impacts multiple operators
behavior. Mostly, things should be roughly the same with differences around
behaviors related to track marks (source.on_track
and etc). See @todo@ for
more details (#3577) - Added script caching layer for faster script startup time. See: our blog post
for details (#3924, #3949, #3959 and #3977) - Rewrote the clock/streaming loop layer. This prepares our streaming system to
support multicore when the OCaml compiler is mature enough to allow it. Clocks
are now attached to sources via theirclock
methods. Returned value is a stripped
downclock
variable. Users can use theclock
function to retrieve the full
methods, e.g.s = sine(); c = clock(s.clock)
. This value has advanced functions
for clock control such asstart
/stop
,ticks
andself_sync
to check for
self-sync
. See @todo@ for more details. (#3781) - Allow frames duration shorter than one video frames, typically values under
0.04s
.
Smaller frames means less latency and memory consumption at the expense of
a higher CPU usage. See @todo@ for more details (#3607) - Change default frame duration to
0.02s
(#4033) - Optimized runtime (#3927, #3928, #3919)
- Added
finally
to execute code regardless of whether or not an exception is raised
(see: #3895 for more details). - Removed gstreamer support. Gstreamer's architecture was never a good fit for us
and created a huge maintenance and debugging burden and it had been marked as
deprecated for a while. Most, if not all of its features should be available using
ffmpeg
. (#4036) - Add
video.canvas
to make it possible to position video elements independently
of the rendered video size (#3656, blog post) - Add cover manager from an original code by @vitoyucepi (#3651)
- Added non-interleaved API to
%ffmpeg
encoder, enabled by default when only
one stream is encoded. - Allow trailing commas in record definition (#3300).
- Add
metadata.getter.source.float
(#3356). - Added optional
main_playlist_writer
tooutput.file.hls
and
derivated operator (#3484) - Added
is_nan
,is_infinite
,ceil
,floor
,sign
andround
(#3407) - Added
%track.drop
to the%ffmpeg
encoder to allow partial encoding
of a source's available tracks (#3480) - Added
let { foo? } = ...
pattern matching (#3481) - Add
metadata.replaygain
method to extract unified replay gain value from metadata (#3438). - Add
compute
parameter tofile.replaygain
to control gain calculation (#3438). - Add
compute
parameter toenable_replaygain_metadata
to control replay gain calculation (#3438). - Add
copy:
protocol (#3506) - Add
file.touch
. - Add support for sqlite databases (#3575).
- Add
string.of_int
andstring.spaces
. - Add
list.assoc.nullable
. - Add
source.cue
(#3620). - Added atomic file write operations.
Changed:
- Mute SDL startup messages (#2913).
int
can optionally raises an error when passingnan
orinfinity
,int(infinity)
now returnsmax_int
andint(-infinity)
returnsmin_int
. (#3407)- Made default font a setting (#3507)
- Changed internal metadata format to be immutable (#3297).
- Allow a getter for the offset of
on_offset
and dropped the metadata
mechanism for updating it (#3355). - Disable output paging when
TERM
environment variable is not set. - Allow running as
root
user insidedocker
container by default (#3406). - Run
check_next
before playlist's requests resolutions (#3625) - Set
force
totrue
by default infile.copy
to make operator behave
as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == x
is alwaysfalse
and
nan != x
is alwaystrue
. Usefloat.is_nan
to test if a float isnan
. - BREAKING:
replaygain
no longer takesebu_r128
parameter (#3438). - BREAKING: assume
replaygain_track_gain
always stores volume in dB (#3438). - Added
parents
option offile.mkdir
(#3600, #3601). - Added
forced_major_collections
record field to the result ofruntime.gc.stat()
and
runtime.gc.quick_stat()
(#3783). - Changed the port for the built-in Prometheus exporter to
9599
(#3801). - Add support for caching LV2 and LADSPA plugins (#3959).
Fixed:
Liquidsoap 2.3.0-rc2
This is the second release candidate for liquidsoap 2.3.0
.
Release Summary
Since the previous release candidate, we have worked on stabilizing certain areas such as our native autocue
implementation and memory and CPU usage.
There were a lot of important under-the-hood changes done in this release cycle and, not surprisingly, those need a little more attention before the final release.
But the good news is: more and more of our larger users are switching to this release. 🎉
If you want to get it and try it too, this would help a lot!
What's New?
You can read about some of the most important benefits and changes in memory usage and startup time here and there.
Hopefully, with a little more time and increased adoption, we should be pretty close to the final release.
What's Next?
Oh, one last thing. Want to help us figure out the next step for the project? We would love to hear more about how people use the software and what they're hoping to see happening with it. We know y'all out there but we want to know more! Feel free to fill-up this form.
Thanks!
Full changelog:
2.3.0-rc2 (2024-11-15)
New:
- Rewrote the streaming API to work with immutable frame content. This
should greatly impact impredictable side-effect of the previous models w.r.t.
track marks, content sharing and more. This also impacts multiple operators
behavior. Mostly, things should be roughly the same with differences around
behaviors related to track marks (source.on_track
and etc). (#3577) - Added script caching layer for faster script startup time. See: https://www.liquidsoap.info/blog/2024-06-13-a-faster-liquidsoap/ for details (#3924, #3949, #3959 and #3977)
- Rewrote the clock/streaming loop layer. This prepares our streaming system to
support multicore when the OCaml compiler is mature enough to allow it. Clocks
are now attached to sources via theirclock
methods. Returned value is a stripped
downclock
variable. Users can use theclock
function to retrieve the full
methods, e.g.s = sine(); c = clock(s.clock)
. This value has advanced functions
for clock control such asstart
/stop
,ticks
andself_sync
to check for
self-sync
. (#3781) - Allow frames duration shorter than one video frames, typically values under
0.04s
.
Smaller frames means less latency and memory consumption at the expense of
a higher CPU usage (#3607) - Change default frame duration to
0.02s
(#4033) - Optimized runtime (#3927, #3928, #3919)
- Added
finally
to execute code regardless of whether or not an exception is raised
(see: #3895 for more details). - Added support for Spinitron submission API (#4158)
- Removed gstreamer support. Gstreamer's architecture was never a good fit for us
and created a huge maintenance and debugging burden and it had been marked as
deprecated for a while. Most, if not all of its features should be available using
ffmpeg
. (#4036) - Removed
taglib
support. It is superseded by the internalocaml-metadata
module
and taglib, with its dependency on the C++ runtime library, has been causing issues
with binary builds portability and crashes with the (not yet supported) OCaml 5
compiler. (#4087) - Added
video.canvas
to make it possible to position video elements independently
of the rendered video size (#3656, blog post) - Added cover manager from an original code by @vitoyucepi (#3651)
- Reworked scheduler queues logic, allow user-defined queues, add options to pick
the queue to send asynchronous tasks to (#4151) - Added non-interleaved API to
%ffmpeg
encoder, enabled by default when only
one stream is encoded. - Allow trailing commas in record definition (#3300).
- Added
metadata.getter.source.float
(#3356). - BREAKING: Added
duration
andticks
to metadata available when computing HLS segment names (#4135) - Added optional
main_playlist_writer
tooutput.file.hls
and
derivated operator (#3484) - Added
is_nan
,is_infinite
,ceil
,floor
,sign
andround
(#3407) - Added
%track.drop
to the%ffmpeg
encoder to allow partial encoding
of a source's available tracks (#3480) - Added
let { foo? } = ...
pattern matching (#3481) - Added
metadata.replaygain
method to extract unified replay gain value from metadata (#3438). - Added
metadata.parse.amplify
to manually parse amplify override metadata. - Added
compute
parameter tofile.replaygain
to control gain calculation (#3438). - Added
compute
parameter toenable_replaygain_metadata
to control replay gain calculation (#3438). - Added
copy:
protocol (#3506) - Added
file.touch
. - Added support for sqlite databases (#3575).
- Added
string.of_int
andstring.spaces
. - Added
list.assoc.nullable
. - Added
source.cue
(#3620). - Added
string.chars
(#4111) - Added atomic file write operations.
- Added new
macos_say
speech synthesis protocol. Make it the default implementation for thesay:
protocol onmacos
. - Added
settings.request.timeout
to set the request timeout globally.
Changed:
- Reimplemented
request.once
,single
and more usingsource.dynamic
. Removed experiment
flag onsource.dynamic
. The operator is considered stable enough to define advanced sources
but the user should be careful when using it. - Mute SDL startup messages (#2913).
int
can optionally raises an error when passingnan
orinfinity
,int(infinity)
now returnsmax_int
andint(-infinity)
returnsmin_int
. (#3407)- Made default font a setting (#3507)
- Changed internal metadata format to be immutable (#3297).
- Allow a getter for the offset of
on_offset
and dropped the metadata
mechanism for updating it (#3355). string.length
andstring.sub
now default toutf8
encoding (#4109)- Disable output paging when
TERM
environment variable is not set. - Allow running as
root
user insidedocker
container by default (#3406). - Run
check_next
before playlist's requests resolutions (#3625) - Set
force
totrue
by default infile.copy
to make operator behave
as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == x
is alwaysfalse
and
nan != x
is alwaystrue
. Usefloat.is_nan
to test if a float isnan
. - BREAKING:
replaygain
no longer takesebu_r128
parameter (#3438). - BREAKING: assume
replaygain_track_gain
always stores volume in dB (#3438). - BREAKING: protocols can now check for nested static uri. Typically, this means
that requests for an uri of the form:annotate:key="value",...:/path/to/file.mp3
is now considered infallible if/path/to/file.mp3
can be decoded. - Added
parents
option offile.mkdir
(#3600, #3601). - Added
forced_major_collections
record field to the result ofruntime.gc.stat()
and
runtime.gc.quick_stat()
(#3783). - Changed the port for the built-in Prometheus exporter to
9599
(#3801). - Set
segments_overheader
in HLS outputs to disable segments cleanup altogether. - Added support for caching LV2 and LADSPA plugins (#3959).
- Pulseaudio input and output now restart on pulseaudio errors (#4174).
Fixed:
Liquidsoap Rolling Release 2.2.x
This release provides liquidsoap assets before they are published as a new versioned release.
You can use it to install the latest stable code before it is published and test/prepare your production environment for it.
Rolling releases can also be useful for us to quickly detect and report bugs before the final published release!
Assets in this release will be deleted. If you are looking for permanent links to release assets, please head over to https://github.com/savonet/liquidsoap-release-assets/releases
For more details about our release process, please checkout https://github.com/savonet/liquidsoap#release-details
2.2.5 (unreleased)
New:
- Added various ffmpeg timestamps when exporting ffmpeg metadata from filters.
- Added
enable_autocue_metadata
andautocue:
protocol to automatically compute cue points and crossfade parameters (#3753, @RM-FM and @Moonbase59) - Added
db_levels
method toblank.*
sources (#3790) - Added
excluded_metadata_resolvers
torequest.create
to make it possible to selectively disable specific metadata resolvers when resolving requests.
Changed:
- Allow to disable
http.*
url normalization. Add warning when url normalization changes the url (#3789)
Fixed:
- Fixed
source.drop
andsource.dump
clock initialization. - Fixed bogus report of non-monotonous PTS content when using raw ffmpeg content.
- Fixed streaming errors when disconnecting
input.harbor
. - Fixed issues with rendered id3v2 frame that contain binary data (#3817)
Liquidsoap 2.2.5
This is the fifth release of the 2.2.x
release cycle, following the initial 2.2.0
release.
This release comes with some minor bugfixes and changed feature and one big chunk of new functionality around crossfading: autocue
.
We will post a longer article about this on our blog. The gist of the functionality is that it should allow to compute excellent crossfade transition parameters in your sources, at the expense of an increased CPU usage.
Users can register their own autocue
implementations and there is a default one that is available if you have compiled liquidsoap
with its ffmpeg
support.
In this case, you can try to add:
enable_autocue_metadata()
To your script and see what happens!
2.2.5 (2024-05-01) (Mayday!)
New:
- Added
enable_autocue_metadata
andautocue:
protocol to automatically compute cue points and crossfade parameters (#3753, #3811, @RM-FM and @Moonbase59) - Added various ffmpeg timestamps when exporting ffmpeg metadata from filters.
- Added
db_levels
method toblank.*
sources (#3790) - Added
excluded_metadata_resolvers
torequest.create
to make it possible to selectively disable specific metadata resolvers when resolving requests. - Normalized expected API from
autocue
, allow multiple implementation and adaptcross
/crossfade
to work with it out of the box with workaround for short tracks. - Added private and swapped memory reporting when compiled with
mem_usage
. - Added priorities to metadata deocoders, allows finer-control of metadata overriding. (#3887)
Changed:
- Allow to disable
http.*
url normalization. Add warning when url normalization changes the url (#3789) - Add
namespace
and optional source IDs tomix
.
Fixed:
- Prevent request metadata from overriding root metadata (#3813)
- Fixed
source.drop
andsource.dump
clock initialization. - Fixed bogus report of non-monotonous PTS content when using raw ffmpeg content.
- Fixed streaming errors when disconnecting
input.harbor
. - Fixed issues with rendered id3v2 frame that contain binary data (#3817)
- Fixed memory leaks with SRT listen socket polling callbacks.
- Fixed
%ffmpeg
copy muxer logic with some audio/video streams (#3840) - Fixed
duration
metadata calculation in the presence ofcue_in
/cue_out
metadata.
Liquidsoap 2.2.4
This is the fourth follow-up release from the 2.2.x
branch. This release comes with important bug fixes related to memory consumption and audio quality.
You can refer to the liquidsoap blog for more details about this release: https://www.liquidsoap.info/blog/2024-02-07-liquidsoap-v2.2.4/
As usual, we recommend any user on the 2.2.x
branch to upgrade to this version. However, this time, it is recommended to read about the non-trivial changes it brings and to test it with your staging or pre-prod environment!
Full release changelog:
2.2.4 (2024-02-04)
New:
- Added support for
id3v2
metadata inoutput.*.hls
when using%mp3
,%shine
or%fdkaac
encoders (#3604) - Added option to set preferred address class (
ipv4
,ipv6
or system default) when resolving hostnames in http transports andoutput.icecast
- Added
self_sync
option toinput.srt
to accommodate for streams in file mode (#3684) - Added
curve
parameter to fade functions andliq_fade_{in,skip,out}_curve
metadata override (#3691) - Added
delay
parameter to fade functions to make it possible to add delay before fade happens. Addliq_fade_{in,skip,out}_delay
metadata override. - Added
single_track
option to allowsequence
to play each source until they are unavailable while keeping track marks.
Changed:
cue_cut
operator has been removed. Cueing mechanisms have been moved to underlying file-based sources. See migration notes for more details.
Fixed:
- Fix pop/click at the end of fade out/in (#3318)
- Fix audio/video synchronization issues when decoding live streams using ffmpeg.
- Fix issues with TLS connecting clients not being properly timed out (#3598)
- Make sure reconnection errors are router through the regulat
on_error
callback inoutput.icecast
(#3635) - Fixed discontinuity count after a restart in HLS outputs.
- Fixed file header logic when reopening in
output.file
(#3675) - Fixed memory leaks when using dynamically created sources (
input.harbor
,input.ffmepg
, SRT sources andrequest.dynamic
) - Fixed invalid array fill in
add
(#3678) - Fixed deadlock when connecting to a non-SSL icecast using the TLS transport (#3681)
- Fixed crash when closing external process (#3685)
Liquidsoap 2.2.3
This is the third and, hopefully, near final point release of the liquidsoap 2.2.x
release cycle.
The most important changes in this release are:
- A fix involving shared active sources leading to infinite loop and CPU usage going to 100%. This impacted in particular scripts doing recording of a streamer being sent via another output. See: #3537 for such an example.
- Several SRT-related fixes w.r.t file descriptor leaks and the caller connection not being properly processed asynchronously.
This release should be safe to upgrade to for any script on the 2.2.x
branch. But, as usual, don't forget to test it with a staging environment first!
2.2.3 (2023-12-14)
New:
- Added
register_telnet
option to all outputs to
prevent telnet commands registration (#3545) - Added
file.touch
Changed:
- BREAKING:
setting.playlists
has been renamed
setting.playlist
,settings.playlist.mime_types
now refers to a full list of records (#3561)
Fixed:
- Cleanup telnet commands on output shutdown,
prevent commands registration for internal
outputs (#3545, fixes: #3541) - Allow overwrite in youtube-dl/yt-dlp call,
remove use of unix-specific process call.
(#3563) - Fixed playlist parsers not being registered
when evaluatin top-level script (#3553) - Fixed infinite loop on some active sources
(#3560, fixes: #3544, and #3537) - Fixed fd leak on failed connection in srt
caller mode (#3583) - Fixed high CPU usage on failed connection
in srt caller mode (#3583, #3573) - Prevent outputs from keeping the last 10 cover
metadata (#3504)
Liquidsoap 2.2.2
This release is the second bugfix release of the 2.2.x
release cycle. The most important fix is related to pop/clicks heard during crossfade (#3318) and the ffmpeg decoder failing with files and streams with unknown codecs.
This is the first release since we improved developers tools so feel free to also take this opportunity to update your developer setup!
As usual, we recommend trying this version with a staging/preview system before putting it on production. Beside that, this release should improve the stability of all scripts running on the 2.2.x
release branch.
We want to thank all contributors, bug reporters and patient users who have helped us bring all these improvements!
2.2.2 (2023-11-02)
New:
- Added
string.escape.html
(#3418, @ghostnumber7) - Add support for getters in arguments of
blank.detect
(#3452). - Allow float in source content type annotation so that it possible to write:
source(audio=pcm(5.1))
Changed:
- Trim urls in
input.ffmpeg
by default. Disable usingtrim_url=false
(#3424) - Automatically add HLS-specific ffmpeg parameters to
%ffmpeg
encoder (#3483) - BREAKING: default
on_fail
removed onplaylist
(#3479)
Fixed:
- Allow
channel_layout
argument in ffmpeg encoder to set the number of channels. - Improved support for unitary minus, fix runtime call of optional methods (#3498)
- Fixed
map.metadata
mutating existing metadata. - Fixed reloading loop in playlists with invalid files (#3479)
- Fixed main HLS playlist codecs when using
mpegts
(#3483) - Fixed pop/clicks in crossfade and source with caching (#3318)
- Fixed pop/clicks when resampling using
libsamplerate
(#3429) - Fixed gstreamer compilation. Remember that gstreamer features are DEPRECATED! (#3459)
- Fixed html character escaping in
interactive.harbor
(#3418, @ghostnumber7) - Fixed icecast not reconnecting after erroring out while closing connection in some circumstances (#3427)
- Fixed parse-only mode (#3423)
- Fixed ffmpeg decoding failing on files with unknown codecs.
- Fixed a crash due to
wait_until
timestamp being in the past when usingposix-time2
- Make sure that temporary files are always cleaned up in HLS outputs (#3493)
Liquidsoap 2.2.1
This is the first bugfix release from the liquidsoap 2.2.x
release cycle! It contains important fixed in the HLS outputs and muxer operator. This release should be safe to upgrade from 2.2.0
with some minor breaking changes on the HLS output on_file_change
callback to account for the atomic file operations.
2.2.1 (2023-09-05)
Changed:
- BREAKING: on HLS outputs,
on_file_change
events are
now"created"
,"updated"
and"deleted"
, to better
reflect the new atomic file operations (#3284) - Added
compact
argument to thehttp.response.json
function.http.response.json
will produce minified JSON by
default. Added a newline symbol to the end of the JSON data produced byhttp.response.json
. (#3299) - Bumped internal ogg decoder to make sure that it is used over the ffmpeg decoder whenever possible.
FFmpeg has issues with metadata in chained streams which needs to be fixed upstream. Unfortunately,
input.http
can only use the ffmpeg decoder at the moment. - Cleanup
output.file
encoding and file handling logic (#3328) - Added
ratio
tosource.{dump,drop}
to make it possible to control its CPU peaks. - Enhanced clock error reporting (#3317)
Fixed:
- Fixed slow memory leak in muxer operator (#3372, #3181, #3334)
- Fixed discontinuity logic error in HLS outputs after a restart.
- Fixed HTTP response status in
output.harbor
(#3255) - Make sure main HLS playlist is regenerated after being
unlinked (#3275) - Fixed hard crash on icecast disconnection errors.
- Fix
output.harbor
encoder header when encoding with
%ogg
,%vorbis
and etc. (#3276) - Fixed quality argument parsing in ffmpeg encoders (#3267)
- Make all HLS file write atomic (#3284)
- Allow seek and cue operators to work with muxed sources
using a single underlying source (#3252) - Fixed export of cover art metadata (#3279)
- Remove use of
stereo:
protocol insay:
protocol:
this is now handled automatically by the decoder and generates latency via
high CPU usage peak. - Fixed
output.file
reopening with flac encoding (#3328)
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. - Rem...
Liquidsoap Rolling Release 2.1.x
This release provides liquidsoap assets before they are published as a new versioned release.
You can use it to install the latest stable code before it is published and test/prepare your production environment for it.
Rolling releases can also be useful for us to quickly detect and report bugs before the final published release!
Assets in this release will be deleted. If you are looking for permanent links to release assets, please head over to https://github.com/savonet/liquidsoap-release-assets/releases
For more details about our release process, please checkout https://github.com/savonet/liquidsoap#release-details
2.1.x (rolling-release)
Fixed:
- Fixed non-monotonous PTS in ffmpeg raw content (#2978)
- Fixed external encoder (#3020)
- Fixed deadlock in
%external
encoder (#3029)
2.1.4 (2022-03-01)
New:
- Added
buffer_length
method tobuffer
operator. - Always display error backtrace when a fatal exception
is raised in the streaming loop. - Added
umask()
to get the currentumask
andumask.set(...)
to set the currentumask
(#2840)
Changed:
- Add break when restarting the external process in
input.external.{rawaudio,rawvideo}
(#2860, #2872) - Removed
disconnect
method oninput.harbor
. This method was doing the same as
thestop
method. Addedshutdown
method to properly shutdown the
source even when not connected to an output. - Made process a string getter in
input.external.{rawaudio,rawvideo}
(#2877)
Fixed:
- Fixed parameter type for
stats_interval
in SRT I/O. - Fixed type generalization on variable and pattern bindings
(#2782) - Fixed memory leak in http requests (#2935)
- Make sure that exception raised in
request.dynamic
never crash
the process (#2897) - Fixed
filename
getter being called multiple time in
output.file
(#2842) - Fixed default directory permissions in
output.*.hls
operators (#2930) - Space trim in interactive variables set on telnet (#2785)
- Fixed internal streaming logic in
max_duration
andcrossfade
. - Make sure that there's at most one metadata at any given
frame position (#2786) - Fixed
metadata.json.parse
always returns an empty list (#2816). - Fixed
icy_id
being ignored inoutput.shoutcast
(#2819) - Fixed shutdown livelock with some ffmpeg inline encoder,
decoder and filter operators. - Fixed input polling stop (#2769)
- Fixed parsed error report in
%include
directives (#2775) - Fixed crash in external processes when received a
Unix.EINTR
event (#2861) - Fixed crash in
string.interpolate
(#2883) - Cleaned up srt support.