Recent Releases of liquidsoap
liquidsoap - Liquidsoap 2.4.0-rc1
This is the first (and hopefully last!) release candidate for liquidsoap 2.4.0!
This release includes several user-facing features intended at making user's life easier.
You can read a detailed presentation of these features here: https://www.liquidsoap.info/blog/2025-08-11-liquidsoap-2.4.0/
This release is recommended to any user who wants to get the latest feature and bugfixes.
To install via opam:
git clone https://github.com/savonet/liquidsoap.git
cd liquidsoap/
git checkout v2.4.0-rc1
opam pin -n .
opam install liquidsoap
Full changelog:
2.4.0-rc1 (2025-08-16)
New:
Language:
- Allow destructing function arguments using the same patterns as for variable assignment (#4562)
- Enhanced labeled arguments syntax (#4526)
- Add warning when erasing top-level variables (#4518)
nullcan now be used directly without having to callnull().null(value)calls are still valid and can be used to create non-null values with nullable types. Calls tonull()are marked as deprecated (#4516)- Added
liquidsoap.script.paththat contains the path to the current script's file, if available.
Core:
- BREAKING: Most callbacks have been moved to source methods and are now executed asynchronously by default. See migration notes for all the details.
- BREAKING: Added new file-to-file external
decoder.addAPI. This makes it much easier and safer to write external decoders (#4531) - Deprecated
insert_metadata, added defaultinsert_metadatamethod on every source (#4541) - Added client certificate support to
http.transport.tls(#4589)
Utilities:
- Added
cron.parse,cron.{add,remove}and a cron thread to allow registration of cron-like asynchronous tasks (#4579) - Added LUFS-based per-track loudness correction (#4545)
Changed:
Language:
- BREAKING: Error methods have been removed by default.
Use
error.methodsto get them! (#4537) - Make sure that
let { foo = gni } = vassigns a value tognibut not tofoo(#4561)
Core:
- Turned initial memory compaction on by default. This has show to greatly reduce initial memory consumption.
- Improved source and clock naming (#4497)
- Support for
ImageLibhas been removed. The library is not maintained anymore and causes issues with dangling external processes (#4595)
Utilities:
- Deprecated
replaygainoperator, introduced unifiednormalize_track_gainwhich works with both ReplayGain and LUFS (#4545)
Fixed:
- Fixed issues with autocue
start_next. This brings autocue's behavior inline with its expectation but can change existing script's output (#4605) - Fix error when loading script path having non-ascii characters in them (#4343)
- Fix error with interactive variables (#4592, @myeungdev)
- Prevent concurrent reload and request fetch in playlists (#4316)
- Don't mark source as ready until their clock has started. (#4496)
- Fixed mutex deadlock caused by aggressive inlining (#4540)
- Fixed segfault when using SRT on windows (#4538)
- Fixed memleak in ffmpeg inline encoder (#4501)
- Fixed
tmp:protocol logic (#4544)
- OCaml
Published by github-actions[bot] 10 months ago
liquidsoap - Liquidsoap Rolling Release 2.4.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!
⚠️ Warning ⚠️ 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.4.0 (unreleased)
New:
- BREAKING:
on_metadata,on_track,on_offset,on_end,on_wake_upanon_shutdowncallbacks have been moved to source methods and are now executed asynchronously by default. Also,on_offsetandon_endhave been merged into a singleon_positionsource methods. See migratons notes and PR #4536 for details and discussions. - Deprecated
insert_metadata, added defaultinsert_metadatamethod on every source (#4541) - Added
liquidsoap.script.paththat contains the path to the current script's file, if available. nullcan now be used directly without having to callnull().null(value)calls are still valid and can be used to create non-null values with nullable types. Calls tonull()are marked as deprecated (#4516)- Enhanced labeled arguments syntax (#4526)
- Add warning when erasing top-level variables (#4518)
Changed:
- Improved source and clock naming (#4497)
Fixed:
- Don't mark source as ready until their clock has started. (#4496)
- Fixed mutex deadlock caused by aggressive inlining (#4540)
- Fixed segfault when using SRT on windows (#4538)
- OCaml
Published by github-actions[bot] 11 months ago
liquidsoap - Liquidsoap 2.3.3
This is the third bug-fix release of the 2.3.x release cycle! 🎉
This release was triggered by a segfault caused by a memory corruption in the new lufs C code that was introduced with release 2.3.2. If you are using this code and this release, please consider upgrading.
Otherwise, the release includes minor fixes. It should be suitable for production but can be updated at your earliest convenience.
This release is also the first one to include builds for both versions of OCaml: 4.14.x and 5.x. As of now, the memory usage with Ocaml 5 is still significantly higher and not suitable for production in our opinion. However, we will need to make the switch one day or another so we decided to start providing both build to make sure that we stay compatible with the latest ocaml 5 code and can continuously test and improve memory optimization with this version.
⚠️ WHILE WE HAVE YOUR ATTENTION! ⚠️
Want to hear more from the liquidsoap community? Want to present your liquidsoap setup or the people using it?
Please consider attending our 5th liquidshop workshop!! More info: https://www.liquidsoap.info/liquidshop/5/
2.3.3 (2025-05-16)
New:
input.srt: addipv6onlyto allow to bind only to ipv6 addresses. Set it totruewhenbind_addressis ipv6.- Allow HLS segment names to contain sub-directories.
- Implicitly convert ffmpeg raw audio data, making it much more practical to write scripts using the raw ffmpeg format (#4478)
Changed:
- Made
defermore user-friendly by operating directly on genericsource(audio=pcm('a))sources. Renamed olddefertodefer.pcm_s16 dtools,duppyandxmlplaylisthave been moved into the liquidsoap code base and will no longer be developed or required as stand-alone packages (#12582)- Changed default value of
metadata.mapstripargument totrueandinsert_missingtofalseAddedsettings.metadata.map.stripandsettings.metadata.map.insert_missingconfiguration keys to revert to previous defaults. (#4447)
Fixed:
- Do not send empty metadata to shoutcast servers (#4408)
- Automatically close file descriptor opened via scripted values with a log message warning of file descriptor leaks (#4481)
- Fixed segfault in new
lufsC code introduced with release2.3.2(#4490)
- OCaml
Published by github-actions[bot] about 1 year ago
liquidsoap - Liquidsoap 2.3.2
Not an april's fool joke! 😄
This is the second bugfix release of the 2.3.x release branch of liquidsoap!
⚠️ This release includes some important fix with the long-term behavior of scripts that create dynamic sources such as when using crossfade or autocue. ⚠️
We recommend that everyone on the 2.3.x release branch update to this version!
Other than the fix above, this release contains low-level bugfix and should be safe for everyone to use.
🚨 While we have your attention! Liquidshop 5 is taking place on Friday June 13th! Please feel free to register and maybe submit a talk. We want to hear about your projects, community and more! More details here 🚨
2.3.2 (2025-04-01) 🃏
New:
- Added support for multiple metadata fields in ogg and flac metadata
- Added support for track-level REM ALBUM in cue file parsing (#4381)
Changed:
- Added
"pic"to list of excluded metadata for automatic charset conversion. - Added
settings.charset.max_string_lengthsetting to prevent automatic charset conversions of strings over that length.
Fixed:
- Optimized CPU usage (#4369, #4370)
- Fixed empty initial HLS segment (#4401)
- Fixed support for
durationmetadata in image decoder (#4397) - Fixed cue-out bug in cue file parsing (#4381)
- Bring back parse error location. (#4362)
- Fixed SRT encoding when restarting a stream with reverse data flow (#4399)
- Make sure that audioscrobbler
on_track/on_endoperations are sent to a asynchronous task queue. - Fixed resources accumulation leading to catchup when using
crossfade(#4419, #4410) - Fixed source reselection logic issue that was causing crashes when using
switchandfallbackoperators (#4420) - Fixed self-sync logic with pulse audio outputs (#4429)
- Fixed script caching on windows.
- OCaml
Published by github-actions[bot] about 1 year ago
liquidsoap - Liquidsoap 2.3.1
⚠️ Wanna help us know our users and plan the next release cycle? Fill up this form ⚠️
This is the first bugfix release of the liquidsoap 2.3.x release cycle!
So far, the 2.3.0 release has shown to be a pretty solid one! Therefore, this release only has minor bugfixes, most importantly about alsa devices and flac encoder.
Along with it are a couple of exciting features to keep things moving:
* The lastfm scrobbler implementation has been fixed and came with support for xml parsing and rendering.
* The CUE file parser for playlists has been rewritten natively and now supports many more dialects of the CUE file.
So, if you have a bunch of 90s CDs ripped with EAC that you want to scrobble to lastfm, this is your release! 😅
Also, we recommend that everyone else update to this version as well. It contains more bug fixes that may be affecting you and should be just as stable as 2.3.0!
⚠️ Warning ⚠️ Assets in this release may be deleted or updated. If you are looking for permanent links to release assets, please head over to https://github.com/savonet/liquidsoap-release-assets/releases
Full changelog:
2.3.1 (2025-02-05)
New:
- Added support for address resolution preference in SRT (#4317)
- Added global address resolution settings for SRT and Icecast (#4317)
- Added support for parsing and rendering XML natively (#4252)
- Added support for
WAVE_FORMAT_EXTENSIBLEto the internal wav decoder. - Added optional
buffer_sizeparameter toinput.alsaandoutput.alsa(#4243) - Reimplemented audioscrobbler support natively using the more recent protocol (#4250)
- Added boolean getter to disable/enable normalization (#4308)
Changed:
- Make alsa I/O work with buffer size different than liquidsoap internal frame (#4236)
- Reimplemented CUE file parser in native liquidsoap script, added support for multiple files and EAC non-compliant extension (#1373, #4330)
- Make
"song"metadata mapping to"title"metadata ininput.harbordisabled when either"artist"or"title"is also passed. Add a configuration key to disable this mechanism. (#4235, #2676) output.icecastnow re-sends the last metadata when connecting to the remote server unless explicitly disabled using thesend_last_metadata_on_connectoption (#3906)- Add full explicit support for
ipv4vs.ipv6resolution in SRT inputs and outputs, add globalsettings.srt.prefer_addressandsettings.icecast.prefer_address(#4317) - Added generic SRT socket get/set API. Added new socket options, including
latencyandipv6only.
Fixed:
- Fixed request resolution loop when enabling both
autocueandreplaygainmetadata resolvers (#4245, fixed in #4246) - Fixed
flacencoding segfault (#4286, #4274) - Fixed source
last_metadatanot being properly updated (#4262) - Convert all ICY (icecast) metadata from
input.httptoutf8. - Fixed
inotifyunwatching due to GC cleanup (#4275) - Fixed
delayinitial conditions (#4281)
- OCaml
Published by toots over 1 year ago
liquidsoap - Liquidsoap 2.3.0
⚠️ Wanna help us know our users and plan the next release cycle? Fill up this form ⚠️
We are stoked to announce the release of liquidsoap 2.3.0! 🎉 ✨
This release brings a lot of exciting changes. As usual, we recommend to first test it in a staging environment before deploying it to production. Migration notes for this release can be found here.
A lot of hard engineering work went into this release! The largest changes should that happened during this cycle were under the hood:
Complete re-implementation of the streaming cycle and clocks
This change allowed us to prepare the codebase to use OCaml's new multicore support in future releases and get rid of design decisions that were 20 years old now. Back then, we had no idea how things would evolve! In particular, we had to account for new form of content such as raw video and encoded content.
Instead of filling a partial frame during the streaming cycle, we are now manipulating chunks of immutable content, concatenating them to build a frame on each streaming cycle. This is much more inline with the logic underlying video and encoded content where pieces of content can happen at random time, according to their presentation timestamp (PTS) or decoder timestamp (DTS).
Abstracting content this way has allowed us to finally get rid of frame breaks doubling as both track marks and partial filling marks. With the new content model, track marks and metadata are first-class content and part of the frame generation.
If you have ever encountered any of the infamous #get_frame didn't add exactly one break! fatal error, you know what we mean. This early design decision had plagued us for a while and it's wonderful to see it gone!
Along with these changes, we also reimplemented from scratch our notion of clocks, the abstract API that runs the main streaming cycles.
While clocks are still a pretty complex topic (self-sync, active vs. passive etc), we hope that this rewrite will clarify things. It was a good opportunity to clean up our implementation and use the experience gained about it in the recent years.
With these changes, clocks are now surfaced to the user via a clock method on each source. This makes it possible to directly access source clocks, animate them in your script, etc. We've also started to support synchronous streaming scripts, which should make it possible to use liquidsoap as a CLI for offline processing.
Script caching and memory optimization
Another important new feature with this release is the ability to cache the standard library and user scripts. This allows liquidsoap to run much faster. More details are available in this blog post
Incidentally, script caching also has very important benefits for memory usage. This is documented here.
This feature is probably the most important one of this release for most users!
Internal autocue
Autocue, the method for computing the perfect crossfade has also been polished in this release. We have now switched to our internal implementation, which is available when enabling our ffmpeg support.
You should be able to enable it by adding this to your script:
liquidsoap
enable_autocue_metadata()
`
With this, all requests should resolve with the appropriate metadata so that any crossfade produces perfect transitions!
Remember that this feature requires CPU-heavy computations on each track!
A lot of testing went into this feature so we are really thankful to our users for the support and patience!
Other new features
Here's a list of other notable changes in this release:
* Frame duration was dropped to 0.02s. This should enhance streams latency and was made possible thanks to the new streaming implementation. See #4033 for a discussion about the trade-offs involved with this setting.
* New support for video size-independent placement of video elements. This makes it possible to design video streams with different elements whose placement is independent of the final video resolution. See this blog post for an example of it.
* Support for NDI output. We always try to extend the scope of applications that can be interfaced with liquidsoap. In the future, we would like to add support for NDI inputs and extend the supported formats.
The rest of the changelog is included below.
As with each release, we want to thank all our users for their patience, early testing and collaboration to make this release possible. It's a testament to their help that we are able to ship this release with such a level of confidence despite all the major changes that happened in the code base.
Special thanks go to: @vitoyucepi, @gAlleb, @RM-FM, @Moonbase59, @Russsgithub, @gilou, Xogium, the whole AzuraCast and Radio France team and everyone who helped reporting, fixing and confirming bugs.
Thanks y'all!
2.3.0 (2024-11-27)
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_trackand 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 their
clockmethods. Returned value is a stripped downclockvariable. Users can use theclockfunction to retrieve the full methods, e.g.s = sine(); c = clock(s.clock). This value has advanced functions for clock control such asstart/stop,ticksandself_syncto check forself-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 NDI output support (#4181)
- Added
finallyto 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
taglibsupport. It is superseded by the internalocaml-metadatamodule 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.canvasto 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)
- Added non-interleaved API to
%ffmpegencoder, enabled by default when only one stream is encoded. - Allow trailing commas in record definition (#3300).
- Added
metadata.getter.source.float(#3356). - BREAKING: Added
durationandticksto metadata available when computing HLS segment names (#4135) - Added optional
main_playlist_writertooutput.file.hlsand derivated operator (#3484) - Added
is_nan,is_infinite,ceil,floor,signandround(#3407) - Added
%track.dropto the%ffmpegencoder to allow partial encoding of a source's available tracks (#3480) - Added
let { foo? } = ...pattern matching (#3481) - Added
metadata.replaygainmethod to extract unified replay gain value from metadata (#3438). - Added
metadata.parse.amplifyto manually parse amplify override metadata. - Added
computeparameter tofile.replaygainto control gain calculation (#3438). - Added
computeparameter toenable_replaygain_metadatato control replay gain calculation (#3438). - Added
copy:protocol (#3506) - Added
file.touch. - Added support for sqlite databases (#3575).
- Added
string.of_intandstring.spaces. - Added
list.assoc.nullable. - Added
source.cue(#3620). - Added
string.chars(#4111) - Added atomic file write operations.
- Added new
macos_sayspeech synthesis protocol. Make it the default implementation for thesay:protocol onmacos. - Added
settings.request.timeoutto set the request timeout globally.
Changed:
- Reimplemented
request.once,singleand 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).
intcan optionally raises an error when passingnanorinfinity,int(infinity)now returnsmax_intandint(-infinity)returnsmin_int. (#3407)- Made default font a setting (#3507)
- Changed internal metadata format to be immutable (#3297).
- Removed
source.dumpandsource.dropin favor of saferrequest.dumpandrequest.drop.source.{dump, drop}can still be implemented manually when needed and with the proper knowledge of what's going on. - Allow a getter for the offset of
on_offsetand dropped the metadata mechanism for updating it (#3355). string.lengthandstring.subnow default toutf8encoding (#4109)- Disable output paging when
TERMenvironment variable is not set. - Allow running as
rootuser insidedockercontainer by default (#3406). - Run
check_nextbefore playlist's requests resolutions (#3625) - Set
forcetotrueby default infile.copyto make operator behave as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == xis alwaysfalseandnan != xis alwaystrue. Usefloat.is_nanto test if a float isnan. - BREAKING:
replaygainno longer takesebu_r128parameter (#3438). - BREAKING: assume
replaygain_track_gainalways 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.mp3is now considered infallible if/path/to/file.mp3can be decoded. - Added
parentsoption offile.mkdir(#3600, #3601). - Added
forced_major_collectionsrecord field to the result ofruntime.gc.stat()andruntime.gc.quick_stat()(#3783). - Changed the port for the built-in Prometheus exporter to
9599(#3801). - Set
segments_overheaderin 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:
- Fixed type generalization on values returned from function applications. Most notably, this should help with HTTP endpoint registration (#3303, fixed in #4030)
- OCaml
Published by github-actions[bot] over 1 year ago
liquidsoap - Liquidsoap 2.3.0-rc1
This is the first Release Candidate of release 2.3.0 of liquisoap! 🎉
The release has been maturing for a while and tested by multiple users. At this point we consider that the code is very close to being releasable.
We are providing this release to encourage our users to start testing and report issues. For the most part, we consider this release to be safe to use in production, after testing it in your staging environment.
Migration notes for this release are here: https://www.liquidsoap.info/doc-dev/migrating.html
Some of the key features for this release are: * An optimized caching mechanism that should both reduce runtime memory usage and startup time! * Fully rewritten streaming and content API. While this is an internal change that should mostly not affect users, we expect this change to vastly improve issues related to clock and track marks (or what used to be called breaks). * A new video canvas API that allows to construct video streams that are independent of the rendered size. See: https://www.liquidsoap.info/blog/2024-02-10-video-canvas-and-ai/ * The ability to set the frame size to as little as needed. See: https://github.com/savonet/liquidsoap/pull/3607
The full changelog is below. As usual, we wish to send a very warm thank you to all our users, contributors and testers without whom this release would not be possible!
2.3.0-rc1 (2024-09-23)
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_trackand 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 their
clockmethods. Returned value is a stripped downclockvariable. Users can use theclockfunction to retrieve the full methods, e.g.s = sine(); c = clock(s.clock). This value has advanced functions for clock control such asstart/stop,ticksandself_syncto check forself-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
finallyto 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) - Removed
taglibsupport. It is superseded by the internalocaml-metadatamodule 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.canvasto 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)
- Added non-interleaved API to
%ffmpegencoder, enabled by default when only one stream is encoded. - Allow trailing commas in record definition (#3300).
- Added
metadata.getter.source.float(#3356). - BREAKING: Added
durationandticksto metadata available when computing HLS segment names (#4135) - Added optional
main_playlist_writertooutput.file.hlsand derivated operator (#3484) - Added
is_nan,is_infinite,ceil,floor,signandround(#3407) - Added
%track.dropto the%ffmpegencoder to allow partial encoding of a source's available tracks (#3480) - Added
let { foo? } = ...pattern matching (#3481) - Added
metadata.replaygainmethod to extract unified replay gain value from metadata (#3438). - Added
metadata.parse.amplifyto manually parse amplify override metadata. - Added
computeparameter tofile.replaygainto control gain calculation (#3438). - Added
computeparameter toenable_replaygain_metadatato control replay gain calculation (#3438). - Added
copy:protocol (#3506) - Added
file.touch. - Added support for sqlite databases (#3575).
- Added
string.of_intandstring.spaces. - Added
list.assoc.nullable. - Added
source.cue(#3620). - Added
string.chars(#4111) - Added atomic file write operations.
Changed:
- Mute SDL startup messages (#2913).
intcan optionally raises an error when passingnanorinfinity,int(infinity)now returnsmax_intandint(-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_offsetand dropped the metadata mechanism for updating it (#3355). string.lengthandstring.subnow default toutf8encoding (#4109)- Disable output paging when
TERMenvironment variable is not set. - Allow running as
rootuser insidedockercontainer by default (#3406). - Run
check_nextbefore playlist's requests resolutions (#3625) - Set
forcetotrueby default infile.copyto make operator behave as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == xis alwaysfalseandnan != xis alwaystrue. Usefloat.is_nanto test if a float isnan. - BREAKING:
replaygainno longer takesebu_r128parameter (#3438). - BREAKING: assume
replaygain_track_gainalways stores volume in dB (#3438). - Added
parentsoption offile.mkdir(#3600, #3601). - Added
forced_major_collectionsrecord field to the result ofruntime.gc.stat()andruntime.gc.quick_stat()(#3783). - Changed the port for the built-in Prometheus exporter to
9599(#3801). - Set
segments_overheaderin HLS outputs to disable segments cleanup altogether. - Added support for caching LV2 and LADSPA plugins (#3959).
Fixed:
- Fixed type generalization on values returned from function applications. Most notably, this should help with HTTP endpoint registration (#3303, fixed in #4030)
- OCaml
Published by github-actions[bot] over 1 year ago
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 publish.
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!
⚠️ Warning ⚠️ 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_trackand etc). See @TODO@ for more details (#3577) - 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)
- 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.canvasto make it possible to position video elements independently of the rendered video size (#3656, blog post - Add cover manager (#3651)
- Added non-interleaved API to
%ffmpegencoder, 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_writertooutput.file.hlsand derivated operator (#3484) - Added
is_nan,is_infinite,ceil,floor,signandround(#3407) - Added
%track.dropto the%ffmpegencoder to allow partial encoding of a source's available tracks (#3480) - Added
let { foo? } = ...pattern matching (#3481) - Add
metadata.replaygainmethod to extract unified replay gain value from metadata (#3438). - Add
computeparameter tofile.replaygainto control gain calculation (#3438). - Add
computeparameter toenable_replaygain_metadatato control replay gain calculation (#3438). - Add
copy:protocol (#3506) - Add
file.touch. - Add support for sqlite databases (#3575).
- Add
string.of_intandstring.spaces. - Add
list.assoc.nullable. - Add
source.cue(#3620). - Added atomic file write operations.
- Added
file.cover.managerfrom an original code by @vitoyucepi (#3651)
Changed:
- Mute SDL startup messages (#2913).
intcan optionally raises an error when passingnanorinfinity,int(infinity)now returnsmax_intandint(-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_offsetand dropped the metadata mechanism for updating it (#3355). - Disable output paging when
TERMenvironment variable is not set. - Allow running as
rootuser insidedockercontainer by default (#3406). - Run
check_nextbefore playlist's requests resolutions (#3625) - Set
forcetotrueby default infile.copyto make operator behave as expected. - BREAKING: Float comparison now follows the expected specs, in particular:
nan == xis alwaysfalseandnan != xis alwaystrue. Usefloat.is_nanto test if a float isnan. - BREAKING:
replaygainno longer takesebu_r128parameter (#3438). - BREAKING: assume
replaygain_track_gainalways stores volume in dB (#3438). - Added
parentsoption offile.mkdir(#3600, #3601). - Added
forced_major_collectionsrecord field to the result ofruntime.gc.stat()andruntime.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).
- OCaml
Published by github-actions[bot] almost 2 years ago
liquidsoap - 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:
liquidsoap
enable_autocue_metadata()
To your script and see what happens!
2.2.5 (2024-05-01) (Mayday!)
New:
- Added
enable_autocue_metadataandautocue: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_levelsmethod toblank.*sources (#3790) - Added
excluded_metadata_resolverstorequest.createto make it possible to selectively disable specific metadata resolvers when resolving requests. - Normalized expected API from
autocue, allow multiple implementation and adaptcross/crossfadeto 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
namespaceand optional source IDs tomix.
Fixed:
- Prevent request metadata from overriding root metadata (#3813)
- Fixed
source.dropandsource.dumpclock 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
%ffmpegcopy muxer logic with some audio/video streams (#3840) - Fixed
durationmetadata calculation in the presence ofcue_in/cue_outmetadata.
- OCaml
Published by github-actions[bot] about 2 years ago
liquidsoap - 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
id3v2metadata inoutput.*.hlswhen using%mp3,%shineor%fdkaacencoders (#3604) - Added option to set preferred address class (
ipv4,ipv6or system default) when resolving hostnames in http transports andoutput.icecast - Added
self_syncoption toinput.srtto accommodate for streams in file mode (#3684) - Added
curveparameter to fade functions andliq_fade_{in,skip,out}_curvemetadata override (#3691) - Added
delayparameter to fade functions to make it possible to add delay before fade happens. Addliq_fade_{in,skip,out}_delaymetadata override. - Added
single_trackoption to allowsequenceto play each source until they are unavailable while keeping track marks.
Changed:
cue_cutoperator 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_errorcallback 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)
- OCaml
Published by github-actions[bot] over 2 years ago
liquidsoap - 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_telnetoption to all outputs to prevent telnet commands registration (#3545) - Added
file.touch
Changed:
- BREAKING:
setting.playlistshas been renamedsetting.playlist,settings.playlist.mime_typesnow 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)
- OCaml
Published by github-actions[bot] over 2 years ago
liquidsoap - 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.ffmpegby default. Disable usingtrim_url=false(#3424) - Automatically add HLS-specific ffmpeg parameters to
%ffmpegencoder (#3483) - BREAKING: default
on_failremoved onplaylist(#3479)
Fixed:
- Allow
channel_layoutargument in ffmpeg encoder to set the number of channels. - Improved support for unitary minus, fix runtime call of optional methods (#3498)
- Fixed
map.metadatamutating 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_untiltimestamp being in the past when usingposix-time2 - Make sure that temporary files are always cleaned up in HLS outputs (#3493)
- OCaml
Published by github-actions[bot] over 2 years ago
liquidsoap - 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_changeevents are now"created","updated"and"deleted", to better reflect the new atomic file operations (#3284) - Added
compactargument to thehttp.response.jsonfunction.http.response.jsonwill 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.httpcan only use the ffmpeg decoder at the moment. - Cleanup
output.fileencoding and file handling logic (#3328) - Added
ratiotosource.{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.harborencoder header when encoding with%ogg,%vorbisand 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.filereopening with flac encoding (#3328)
- OCaml
Published by github-actions[bot] over 2 years ago
liquidsoap - 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` 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](https://github.com/naggety/picotts) (#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 `
- OCaml
Published by github-actions[bot] almost 3 years ago
liquidsoap - 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!
⚠️ Warning ⚠️ 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.1 (unreleased)
Changed:
- BREAKING: on HLS outputs,
on_file_changeevents are now"created","updated"and"deleted", to better reflect the new atomic file operations (#3284) - Added
compactargument to thehttp.response.jsonfunction.http.response.jsonwill 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.httpcan only use the ffmpeg decoder at the moment. - Cleanup
output.fileencoding and file handling logic (#3328) - Added
ratiotosource.{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)
- 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.harborencoder header when encoding with%ogg,%vorbisand 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.filereopening with flac encoding (#3328)
- OCaml
Published by github-actions[bot] almost 3 years ago
liquidsoap - Liquidsoap 2.1.4
This is the fourth follow-up release for the liquidsoap 2.1.x release cycle!

This release brings more bugfix and stability to liquidsoap 2.1.x users with a couple of new features as well.
New features are:
* More logging around streaming exceptions to help diagnostics of hard failures while streaming
* Support for umask to bring the full unix/posix file/directory permissions control the way everyone's used to
* Added buffer_length method to buffers to help report and monitor buffer user (overrun/underrun, slow drain etc.)
The bugfixes include patch to prevent several situations that made the application crash under certain specific circumstances. Overall, we believe that this release should be a pretty stable iteration and highly recommend migrating to it. Make sure to always use a staging environment before updating your production systems!
We expect this release to be the last of the 2.1.x release cycle. The current development branch is about to be forked as rolling-release-v2.2.x and we should begin the stabilization process to bring that branch to a releasable state. There might still be bugfix releases on the 2.1.x branch but only for critical issues.
Thanks for all y'all continuing use of liquidsoap!
Full Changelog:
2.1.4 (2022-03-02)
New:
* Added buffer_length method to buffer operator.
* Always display error backtrace when a fatal exception
is raised in the streaming loop.
* Added umask() to get the current umask and umask.set(...)
to set the current umask (#2840)
Changed:
* Add break when restarting the external process in input.external.{rawaudio,rawvideo}
(#2860, #2872)
* Removed disconnect method on input.harbor. This method was doing the same as
the stop method. Added shutdown 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)
* Space trim in interactive variables set on telnet (#2785)
* Fixed internal streaming logic in max_duration and crossfade.
* 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 in output.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.
- OCaml
Published by github-actions[bot] about 3 years ago
liquidsoap - Liquidsoap 2.1.3
This is the third and, hopefully, last bug fix release for the 2.1.x release branch!
Overall, this release cycle was thankfully pretty calm, hence the more than two months since the previous one. The release contains a couple of new features that may also be useful such as being able to select or list portaudio devices and some enhancements in input.harbor dynamic capabilities.
Anyone on one of the 2.1.x releases should be able to upgrade safely to this version.
2.1.3 (2022-11-04)
New:
* Added time.string.
* Added error.on_error to report any error raised during the
script's execution. Enhanced reported error positions (#2712)
* Added device_id and latency options to input.portaudio
and output.portaudio to be able to choose the requested
device. Use liquidsoap --list-portaudio-devices to see the
list of devices (#2733)
* Added disconnect method to input.harbor, making it possible
to disconnect a source client programmatically, including when
a new client is trying to connect.
Changed:
* Send data in-memory in http.{post,put}.file when input data
is already in memory. This allows to use plain Content-Length
instead of chunked transfer encoding in these case, though
libcurl seems to always prefer chunked encoding for put
requests.
* Better error message when an encoder is not available on windows
(#2665)
* Create output directory in HLS outputs when it does not exist
using newly introduced perms permission argument (#2725)
* Removed restart_on_error argument on output.url and added
restart_delay which implements a delayed restart. Added
on_error argument to be notified of errors (#2731)
* Changed default encoding parameter in string.{quote, escape}
to be null. Fallback to "ascii" encoding when no encoding is
specified and "utf8" fails. This prevents unexpected script
failures but might not be backward-compatible if you used a
custom escape_char or special_char function (#2738)
Fixed:
* Enhanced methods typing support (#2659)
* Add support for song metadata (mapped to title) and url (mapped to
metadata_url) in input.harbor (#2676)
* Fixed blank.* operator types.
* Fixed request metadata escaping (#2732)
* Fixed input.external.rawadudio mono input (#2742)
* Fixed http response body on redirect (#2758)
- OCaml
Published by github-actions[bot] over 3 years ago
liquidsoap - Liquidsoap 2.1.2
This is the second follow-up release for the v2.1.x branch featuring bugfixes, updates and some new features!
Noticeable API changes:
* http.{post,put}.file has been added to be able to send a file content via HTTP without bloating the memory.
* Many new formats have been added to the taglib metadata resolver. This can change your script's behavior. If you are seeing issues, please report to us. To revert to the old behavior, use this settings:
ruby
settings.decoder.file_extensions.taglib.set(["mp3"])
Other than that, this release should bring more stability to your script so go for it. After some testings, as always! 🙂
2.1.2 (2022-09-26)
New:
* Added string.char, string.getter.flush and string.getter.concat.
* Added http.multipart_form_data and http.{post,put}.file.
Changed:
* Allow sub-second values in sleep() (#2610)
* Allowed many new format for taglib (#2605)
* Add settings.ffmpeg.content.copy.relaxed_compatibility_check.set settings to allow relaxed
compatibility check for ffmpeg copy content, making it possible to encode
streams with various audio samplerate or video size when the container
supports it.
Fixed:
* Stop error loop when opening a listening ssl socket with non-existent certificate. (#2590)
* Youtube HLS upload for live streams.
* Fixed data:... uri scheme to conform to RFC 2397 (#2491)
* Fixed multiple issues related to empty ogg/opus metadata (#2605)
* Ensure that video.add_text fails when the source does (#2609)
* Fixed metadata parsing in server.insert_metadata (#2619)
* Fixed extract_replaygain path (#2624, @parnikkapore)
* Fixed crash when terminating the process (#2585)
* Fixed channels conversion when using input.rawaudio (#2602)
* Fixed memory leak when using ffmpeg streams (input.ffmpeg, input.http, ...)
Internal Change:
* ref() implementation switched to OCaml's Atomic to prevent race conditions,
thread.mutexify and mutexify functions removed. (#2603)
- OCaml
Published by github-actions[bot] over 3 years ago
liquidsoap - Liquidsoap 2.1.1
This is the first bugfix release of the v2.1.x release cycle, fixing some minor and less-minor issues. So far, the release cycle seems to be holding up fairly well!
Worth noting:
- ocurl is now a mandatory dependency. Its functionalities, support for http.{get,put,post,..} providing, among other things, remote requests resolution, were already expected by most users.
- Windows build for v2.1.0 did not have the ffmpeg encoders and decoders enabled.. 🤦♂️
- playlist.next now returns the requests in the right order. This could be breaking some existing scripts!
- playlist.remaining has been renamed into playlist.remaining_files. This could be breaking some existing scripts!
Full changelog:
2.1.1 (2022-08-28)
New:
- Added process.quote.command to generate complex quoted command strings suitable
for use with process.run and os-independent.
Changed:
- Renamed
playlist.remainingintoplaylist.remaining_files(#2524) - Added
idargument toreplaygainoperator (#2537). - Made
ocurldependency required, addedurias required dependency (#2551)
Fixed:
- Fixed missing ffmpeg features on windows build.
- Fixed sync issues with
ffmpeg.encode.*inline encoders (#2584) - Fixed
http.getissues whenuser-agentwas not set (#2517) - Fixed order of
playlist.nextreturned requests. - Fixed infinite loop when reloading a failed playlist (#2576)
- Fixed http requests with urls containing spaces (#2551)
- Fixed
on_connecttype forsrtinputs and outputs. - Fixed parsing issues with functions/variables definitions
beginning with
recorreplaces(#2560) - Fixed infinite parse error loop (#2527)
- Fixed empty initial
mp4HLS segment. - Prevent initial start for autostart and fallible sources.
- OCaml
Published by github-actions[bot] almost 4 years ago
liquidsoap - Liquidsoap 2.1.0
This is the first release of the 2.1.x release branch! 🎉
This version comes with some major improvements and breaking changes. As usual, you can get a (mostly) complete list in the migration page
In particular, the following changes are noticeable:
JSON parsing is greatly improved
You should now be able to do:
ruby
let json.parse ({
foo,
bla,
gni
} : {
foo: string,
bla: float,
gni: bool
}) = '{ "foo": "aabbcc", "bla": 3.14, "gni": true }'
For any one who has ever tried to parse json in their liquidsoap scripts, this is gonna be a game changer. We have a detailed article here
Partial function application has been removed.
This is not so much an improvement but something we thought was an acceptable trade-off. Support for partial application is creating a lot of complexity in the language's implementation and not a lot of users are actively using it. This change means that instead of doing:
```ruby def f(x, y) = ... end
g = f(0) ```
You will now have to do:
```ruby def f(x, y) = ... end
def g(y) = f(0, y) end ```
Regular expressions are now first-class entities.
This should be familiar to anyone used to working with Javascript's regular expression. So, now, instead of doing:
ruby
string.match(pattern="\\d+", s)
You will now do:
ruby
r/\d+/.test(s)
There's a detailed description of this new feature here.
Full Changelog:
2.1.0 (2022-07-15)
New:
- Added support for variables in encoders (#1858)
- Added support for regular expressions (#1881)
- Added generalized support for value extraction patterns (#1970)
- Added support for string getter for
http.{post,put}operations (#1984) - Added
output.youtube.live.hls - Rewrote out internal JSON parser/renderer (#2011). Breaking change values
that cannot be represented as
JSONwill now raiseerror.jsonwhen converted toJSON.infiniteandnanfloats can be exported using thejson5export format. - Added socket API (#2014).
- Added support for ffmpeg bitstream filters (#2387)
- Added
liquidsoap.version.at_least. - Added
video.rectangle,video.persistence. - Added
video.vumeter. - Added
video.slideshow. - Added
video.add_text.camlimages(#2202). - Added
video.text.*and re-implementedvideo.add_text.*from those (#2226). - Added
irc.channeloperator to retrieve the contents of an IRC channel (#2210). - Added new in-house parsing of metadata for some image and video formats (#2236).
- Added
file.download - Added new options for
%ffmpegcopy encoder:ignore_keyframesandwait_for_keyframe(#2382)
Changed:
- Removed support for partial application, which should avoid some type errors, improve performance and simplifies the code related to the reduction (#2204).
- Video dimensions (width and height) can now be specified per stream in the
type and are then used instead of the default ones. For instance, you can now
write
s = (single("file.mp4") : source(video(width=300,height=200)))in order to force the decoding of a file to be performed at the 300×200 resolution (#2212). - Video images are now canvas, which means that they do not directly contain the images, but are constituted of multiple images placed at various positions. This should make much more efficient operations such as making videos from multiple ones, adding a logo, etc. (#2207)
output.youtube.liverenamedoutput.youtube.live.rtmp, removebitrateandqualityarguments and added a single encoder argument to allow stream copy and more.source.on_metadataandsource.on_tracknow return a source as this was the case in previous versions, and associated handlers are triggered only when the returned source is pulled (#2103).- Made
streams_infoparameter ofoutput.file.hlsa record (#2173). - Disable scrolling by default in
video.add_text. You can re-enable it by usingvideo.add_text(speed=70, ...). - Added "example" sections to operators documentation, we now need to populate those (#2227).
- Default implementation of
video.testsrcis now builtin, previous implementation can be found undervideo.testsrc.ffmpeg. - Images can now generate blank audio if needed, no need to add
mux_audio(audio=blank(),image)anymore (#2230). - Removed deprecated
timeoutargument inhttp.*operators. - Deprecated
request.readyin favor ofrequest.resolved.
Fixed:
- Fixed typo in
statuscommand of themixoperator. - Fixed performances issues with
input.ffmpegandinput.http(#2475) - Fixed
list.shufflewhich was used to randomize playlists inplaylistoperator (#2507, #2500).
- OCaml
Published by github-actions[bot] almost 4 years ago
liquidsoap - Liquidsoap 2.0.7
This is the seventh bugfix release of the 2.0.x release branch of liquidsoap. We promised to only release new versions for this branch for important bug fixes and found two:
* A memory leak with the opus headers. Technically this is a bug in ocaml-opus but we also had to release new binary assets.
* An inefficient initialization of decoding buffer and samplerate converters
This release addresses those issues as well as a minor one with initial shoutcast/icecast metadata. It is intended as the last versioned released with potential follow-up being pushed as rolling releases on a best-effort basis.
The initial 2.1.0 liquidsoap release was also produced as a companion release to this one. All users are now advise to start exploring the 2.1.x release branch as we expect most if not all bug fixes to be only applied on this branch.
Happy liquidsoap hacking!
2.0.7 (2022-07-15)
Fixed: * Fixed memory leaks with opus bindings. * Make sure decoding buffer and samplerate converter are only created once. (#2475) * Make sure first metadata is always sent in icecast/shoutcast output (#2506)
- OCaml
Published by github-actions[bot] almost 4 years ago
liquidsoap - Liquidsoap 2.0.6
This is the 6th and last bugfix release for the 2.0.x branch. Following this release, the 2.0.x development branch will only be updated on a best-effort basis. New projects are now advised to work with the rolling-release-v2.1.x branch, will is set to be the next stable release.
This release contains a set of minor fixes. Production scripts using any 2.0.x version are advised to switch to it but, still, after testing that there is no unforeseen regression.
A lot of effort has been put into debugging memory-releated issues with regard to requests. If your script uses a lot of requests (playlist, request.dynamic etc.) you should benefit from upgrading to this version.
Full changelog:
2.0.6 (2022-06-20)
New:
* Added video/mp4 to list of recognized mime types for request resolutions.
Changed:
* Log errors when using process.read (##2420, @martinkirch)
Fixed:
* Memory leak when executing process.run (#2424)
* Delay harbor server endpoint registration until application has started (#1589)
* Print user-readable encoder parameter error report.
* Fixed m3u metadata parsing when artist has a comma in their name (#2449)
* Cleanup failed request in playlist operator.
* Make sure requests are always cleaned up, making request.destroy calls
optionals.
- OCaml
Published by github-actions[bot] almost 4 years ago
liquidsoap - 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!
⚠️ Warning ⚠️ 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 to buffer operator.
* Always display error backtrace when a fatal exception
is raised in the streaming loop.
* Added umask() to get the current umask and umask.set(...)
to set the current umask (#2840)
Changed:
* Add break when restarting the external process in input.external.{rawaudio,rawvideo}
(#2860, #2872)
* Removed disconnect method on input.harbor. This method was doing the same as
the stop method. Added shutdown 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 and crossfade.
* 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 in output.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.
- OCaml
Published by github-actions[bot] about 4 years ago
liquidsoap - Liquidsoap 2.0.5
This is the 5th bugfix release of the 2.0.x branch, fixing mostly minor issues. This is also the last stable release on this branch as 2.1.x is expected to be the next stable release cycle.
2.0.5 (24-05-2022)
New: * Extended m3u EXTINF parser to support empty duration and annotations.
Changed:
* Brought back mix operator (#2401)
Fixed:
* Allow crossfade duration override of 0.
* Buffer synchronization issues.
* Drop methods from ffmpeg filter input source
types to avoid unecessary conflicts.
* Fix evaluation of abstract values with methods.
* Prevent some sources from being consumed when not active,
namely ffmpeg inline encoders, soundtouch, resample and all
the muxing operators.
* Raise runtime exceptions in string.replace failures with
useful message. (#2408)
* Prevent request.dynamic from raising exceptions when checking
if the source is ready (#2381)
- OCaml
Published by github-actions[bot] about 4 years ago
liquidsoap - Liquidsoap 2.0.x rolling release
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!
⚠️ Warning ⚠️ 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.0.x (permanent rolling release)
This development branch has reached the end of its release cycle and will only be
maintained on a best-effort basis. You are advised to switch to the 2.1.x development
branch for all new liquidsoap work.
- OCaml
Published by github-actions[bot] about 4 years ago
liquidsoap - Liquidsoap 2.0.4
Release 2.0.4 is mostly focused on CPU and memory optimization. As 2.0.x was getting adopted, we started receiving reports of increased CPU and memory usage compared to 1.4.4. We investigated them and found a couple of places that needed to be optimized:
* Our new media content API, which was extended to support the new ffmpeg raw and encoded data, was accessing content in a way that was not optimal
* Our internal format for PCM audio content had been switched from OCaml native float array to Bigarrays holding C arrays of floats. However, performances when accessing Bigarray float data in our audio filters written in OCaml were problematic.
These two issues have been fixed and we've been able to observe performances on-par with liquidsoap 1.4.4 for this release.
These improvements are particularly relevant if: * Your liquidsoap script is using a lof of internal filters and audio processing operators. * Your liquidsoap is handling multiple stream/inputs/outputs.
The other breaking change for this release is related to source shutdown methods. We realized that only specific sources (outputs and active sources) should have a shutdown method so we removed it from the other ones. Sources without a shutdown method are cleaned up when all the sources depending on them have been shutdown.
While this release should be, for the most part, functionally equivalent to any previous 2.0.x release, we recommend trying it in a staging environment prior to deploying it to production. The changes for the underlying audio format were pretty invasive and, also, there is always the chance that your setup was relying on an incorrect behavior fixed in the release.
Full changelog for this release:
Liquidsoap 2.0.4 (04-23-2022)
New:
* Added settings.video.add_text to enforce consistent choice of
video.add_text implementation (#2302)
Changed:
* Make sure source shutdown can only be called on sources that
can actually be shutdown:
- Remove generic source.shutdown
- Keep s.shutdown() method only on sources that are active.
Refs: #2259
* Optimized memory usage when accessing frame content (#2266)
* Optimized memory usage when accessing ground terms.
* Allow crossfade duration getter to override duration at the
end of each track if duration isn't set via metadata.
* Make sure crossfade metadata are not duplicated (#2153)
* Renamed map_metadata into metadata.map, deprecated map_metadata.
* Deprecatdd list.mem_assoc
* Enhanced remaining time when using add (#2255)
* Added timeout_ms to http.* to provide time in milliseconds, deprecated
timeout argument.
* Connect output.icecast when data is available instead of when
operator starts to avoid useless connections when underlying source
fails immediately.
Fixed:
* Prevent infinite loops when crossfade duration is negative (#2287)
* Prevent mutex deadlock when recursively locking mutexes (#2274)
* Mark method add() as internal in request.queue, fix method length() (#2274)
* Fixed retry_delay being ignored in some cases in request.dynamic.
* Prevent race condition in external process handler.
* Fixed A/V sync when streaming encoded data via ffmpeg encoder (#2159)
* Prevent stopped/iddle sources from being restarted when reseting
clock(s) after too much latency (#2278)
* Fixed registration of video.add_text.ffmpeg as possible implementation
for video.add_text (#2302)
* Fixed http.* calls preventing liquidsoap from shutting down.
* Fixed http protocol not returning an error when timing out (#2242)
* Reworked ffmpeg filters feeding mechanism.
* Fixed inconsistencies in playlist.parser (#2257)
* Fixed inconsistent reselect in rotate (#2300)
* Fixed special characters escaping in video.add_text.ffmpeg (#2324)
* Fixed input.rawaudio and input.rawvideo when handling non-stereo
content.
- OCaml
Published by github-actions[bot] about 4 years ago
liquidsoap - Liquidsoap 2.0.3

This is the third Liquidsoap bugfix release of the 2.0.x release branch. This release was focused on long-term concerns regarding memory consumptions, crossfade transitions and metadata issues. Overall, it follows a trend of stabilization of the 2.0.x features and we're happy to see adoption expanding and users reporting issues and usages that are more and more specialized.
Specific things to focus on for this release:
* We spent quite a while investigating issues related to memory consumption. It turns out that those seem to be mostly related to finer-tweaking of the OCaml memory management unit, called the garbage collector (GC). Details about our findings with some hints about how to change the settings there are here and here
* The default buffer size for input.harbor has been increased to 12s to make it possible to use it with crossfade transition out of the box. Make sure to drop if while upgrading if you rely on a smaller buffer.
* The API for fetching and manipulating date and time has been cleaned up to make it more user friendly. Details are here. Make sure to check out this link if you are using time.utc() or time.now()
* The logic behind metadata being passed when switching between sources has been fixed. This could impact your running code if you relied on a broken implementation before. See #2138
This is mostly it! 🎉 Again, we want to thank all our users, contributors and supporters. We would never be able to keep improving the quality of the software without y'all patient testing, reporting and follow-ups! Merci!
- OCaml
Published by github-actions[bot] over 4 years ago
liquidsoap - Liquidsoap 2.0.2
This is the second bugfix release of the liquidsoap 2.0.x branch. It contains important fixes and a couple of enhancements. Update is recommended with a little bit of testing before.
Noticeable new features are:
* We now show highlighted code excerpts on errors, which should help finding out which part of a script are not working
* We export the last_metadata of a source, which can be used to make transitions between sources easier.
Noticeable bug fixes are:
* Fixed a segfault in ocaml-lame. Make sure to install version 0.3.5
* Fixed a memory leak when using muxing operators.
* Fixed last metadata not showing up in some switches or fallback
* Fixed input.rtmp deadlocking on shutdown
* Fixed %ffmpeg copy encoder crashing when switching sources.
We believe that this release is bringing liquidsoap 2.0.x to a great level of stability and have worked on it with a couple of partners implementing it for their streaming systems. We suggest to upgrade whenever possible. However, because of the changes in metadata behavior with switches, it might be good to do some minimal testings beforehand. If anything, though, the change in behavior should bring liquidsoap back where most users would expect it to be.
As usual, we want to warmly thank all users, bug reporters and contributors for their invaluable help and patience working with us on this release!
Full Changelog:
2.0.2 (28-12-2021)
New:
* Show code excerpts on errors (#2086)
* Added on_get_ready callback to sources, to be
executed after a source's has initialized.
* Added flush_and_skip telnet command to request.dynamic
to empty the request's queue before skipping the current
track, forcing a full reload.
* Added last_metadata method on sources to return the
last metadata produced by the source.
Fixed:
* Fixed ffmpeg copy encoder crash when switching between
streams.
* Fixed unbound buffer in muxing operators (#2054)
* Return correct positions when parsing strings (#2095)
* Deadlock when shutting down with input.rtmp (#2089)
* Add timeout to srt operations (#2082)
* Fixed request.queue queue telnet command returning
nothing (#2088)
* Fixed single quotes being escaped in json stringify.
(#2120)
* Fixed frame caching issues when no initial break was
present in the memoized frame. (#2109. AzuraCast/AzuraCast#4825)
* Fixed replay_metadata not replaying metadata from active sources
(#2109)
Note:
For source compilation, please use the liquidsoap-2.0.2-1.tar.bz2 tarball. The liquidsoap-2.0.2.tar.bz2 tarball will be replaced by this one shortly.
- OCaml
Published by github-actions[bot] over 4 years ago
liquidsoap - Liquidsoap 2.0.1
Just a couple of days shy of the 2 months mark since the first Liquidsoap 2.x, we are please to release the first 2.0.1 bug fix release from this branch!
This release includes a couple of new features but, mostly, some important fixes for the issues that have been reported from our patient and wonderful users. This includes important fixes with our ffmpeg bindings (not included in the Liquidsoap ChangeLog), a rather intricate issue that looked like a memory leak (https://github.com/savonet/liquidsoap/issues/2054, https://github.com/savonet/liquidsoap/issues/1740), some issues with transition in switches and fallback eating track marks (https://github.com/savonet/liquidsoap/issues/1999) and more.
We recommend upgrading to this version from 2.0.0 and believe that it should be pretty safe to do so.
Changelog:
New:
* Added time.predicate to parse time predicates at runtime.
* Added support for ffmpeg filter commands, unify video.add_text.ffmpeg
with other operators, make it the default when available. (#2050)
Changed:
* Removed encode_metadata option in input.file.hls as it does nothing with
the main encoder for HLS format, %ffmpeg (#2023)
* Converted output.icecast optional parameters to nullable.
Fixes:
* Fixed switch-based sources not respecting track boundaries when
using default transitions with one track only per selected source. (#1999)
* Fixed playlist annotation. (#2005)
* Raise a proper runtime exception when string.escape fails. (#2010)
* Account for internal caching in request.dynamic.list's queue and set_queue methods.
* Keep buffering for crossfade when new source has track mark but is still ready.
* Added missing output start/stop commands.
* Fixed perms, dir_perms and append not bring honored when delegating file output
to the encoder.
* Fixed base directory not being created when delegating file output to the encoder.
(#2069)
* Use process.quote in process calls (#2031)
- OCaml
Published by github-actions[bot] over 4 years ago
liquidsoap - Liquidsoap 2.0.0
It is with great excitement and some ~2 years of anticipation that we have the pleasure to announce the release of Liquidsoap 2.0.0!

🤔 What is liquidsoap?
Liquidsoap is a statically-typed, type-inferred, functional scripting language equipped with specialized operators to build audio and video stream automation.
The liquidsoap language offers all the flexibility and expressivity of a fully featured programming language to help build your media streams.
Using liquidsoap, one can very quickly stand up a media streaming platform that can rotate files from playlists, accept live DJ input, mux audio and video, encode (or not!) and send the resulting data to youtube, icecast, HLS and more..
:whitecheckmark: Why liquidsoap?
While there are many tools that offer competing features, the real difference with liquidsoap is its scripting language.
Setting up tools using configuration files is often easier and more straight forward, however, when it comes to the finer details, such as inserting jingles between shows, defining crossfades between tracks and more, potentially, each project has its own set of expectations, and this is where liquidsoap becomes really useful!
:zap:️ What's new in Liquidsoap 2.0.0? :zap:
Liquidsoap 2.0.0 brings major improvements in two areas:
:film_projector: Video support via ffmpeg
While video has been supported for a while, audio remained the primary target of the software. This is all changed now! In keeping with the tradition of focusing on what we do well and delegating to others what they have expertise on, we implemented a tight integration of the remarkably awesome ffmpeg API.
This has brought to liquidsoap all the exciting features of ffmpeg, including support for multiple input and output formats, filters and also support for end-to-end encoded content, which allows liquidsoap, when possible, to stream content without having to re-encode it, a long requested user feature.
Our aim with the ffmpeg integration is to become a scripting language built on top of ffmpeg in such ways that, if something is possible with the ffmpeg command-line, it should be possible with liquidsoap.
Meanwhile, the scripting language also provides functionalities based on ffmpeg that are either hard or impossible to implement using the command-line executable, such as fully typed, composable ffmpeg filter operators and shared encoding
:gear: Expanded language features
With this release, the liquidsoap language is expanded, introducing multiple features much needed for the comfort of the programmer such as: * Module and records, allow to attach method to variables * Exception handling * Support for structured data, tuples and etc.
Along with these changes, we have released The Liquidsoap Book, which we hope will help users of all skill level to work with the liquidsoap language and streaming projects.
But we are not stopping here! We have even more exciting features in store for the liquidsoap language, some of them already committed to the main development branch.
:children_crossing: Roadmap and versioning
Our roadmap consists of:
:construction: Bugfix releases
While we are satisfied with the current 2.0.0 release and believe it is safe to use for production-ready work, software projects are never free of bugs so we will keep improving on the current stable branch.
Stable releases are numbered using the patch part of their version, i.e. 2.0.x. However, when it comes to liquidsoap, it is important to keep in mind that some of our operators have complex behavior and interactions with each other. While we do our best to maintain backward compatibility between bugfix versions, we always recommend to test them in a staging area before pushing them to production.
Our workflow for reporting bugs is via github's issues tracker. This is our preferred way to keep track of issues, discuss them and mark them as fixed. If you have questions related to setting up your script, installing liquidsoap and etc, you can also start a discussion. In some cases, issues get transferred to discussions as we see fit and, also, discussions can in fact lead to reporting an associated issue.
We do encourage all reports as we find a lot of value in our users feedback. We try to respond to all of them diligently but we also appreciated your patience.
:bulb: Future major release
While we were busy stabilizing the current stable branch, we couldn't resist working on new features! So far, it looks like the next major release will focus on expanding the language's capabilities with features such as: * Support for variable in encoders * Generalized extraction patterns * First-class module system * Vastly improved support for json parsing and rendering * Type-system flexibility improvements
A vision that we have is to bring the liquidsoap language to the same flexibility and type-safety as languages such as TypesScript but with inferred types so you never have to write them (99% of the time..)! :slightlysmilingface:
🚀 Need help?
If you need help with your liquidsoap project, you can join our online chat room, which is currently hosted on slack. We also provide professional support. Holler at us if you are in such need we'd love to see how we can help as well!
⚠️ Windows users
Please note that the windows build does not support our regular encoders (lame, ogg, etc.) along with ffmpeg (they are compiled statically and some of the symbols are conflicting). Since ffmpeg provides the same encoders and more, we have decided to only enable ffmpeg on this build. Please, refer to the documentation here to see how to use ffmpeg to encode in various formats.
- OCaml
Published by github-actions[bot] over 4 years ago
liquidsoap - Liquidsoap 2.0.0-rc1
Liquidsoap 2.0.0-rc1 is out!
The 2.0.0 release branch brings important and fundamental changes to liquidsoap, in particular:
* First-class support of video
* Tight integration with ffmpeg, encoders, decoders, filters and more
* Enhanced language features making the script language a fully-featured language
* A fully featured book to learn about the language
About this release
This is the first release candidate for the 2.0.0 release branch. This release means that we are satisfied with the current stability of the branch and are looking at releasing a final version soon.
As a result, the repository's main branch has been versioned to 2.1.0 and we have forked off a 2.0.0-rc1 branch. This branch will only get bug fixes and we shall keep releases of the 2.0.x series for bug fixes in the future.
This release is also the first to make it to the opam repository. This means that users installing liquidsoap without a specific version will get 2.0.0~rc1 installed. While this version may not be entirely free of bugs (are there any such thing?), we believe that it is ready for larger consumption and, also, that this will accelerate the release process by exposing more and more users to it, helping us to shape it to its final form.
If you absolutely need to make sure you installed a given version, please update your scripts using opam to install a fixed version, i.e.:
opam install liquidsoap.1.4.4
This is actually a good practice for any automated liquidsoap opam install that depends on a specific version.
We want to thank all our users for their critical help in testing, reporting, working with us and trusting us through this release process. We can't wait to have the final 2.0.0 version out!
Personal note
This release was delayed as one of our developers was being displaced due to hurricane Ida's path of destruction through Southern Louisiana. While New Orleans is often the focus of the world's attention (and usually not for so long), this catastrophic event has impacted a lot of smaller communities around southern Louisiana that usually get little or no focus. While this open-source project is provided free of charge, if you feel so inclined to make a donation as a form of appreciation, we suggest they can be send to: * Greater New Orleans Foundation * Cajun Navy Relief * MutualAidLA
- OCaml
Published by github-actions[bot] over 4 years ago
liquidsoap - Liquidsoap 2.0.0-beta3
This is the third and, hopefully, last beta for the upcoming 2.0.0 major release!
The 2.0.0 release branch brings important and fundamental changes to liquidsoap, in particular:
* First-class support of video
* Tight integration with ffmpeg, encoders, decoders, filters and more
* Enhanced language features making the script language a fully-featured language
* A fully featured book to learn about the language
Since the second beta, we have pushed a bunch of bug fixes, thanks to our early testers and reporters. We try to avoid breaking changes but we also introduced some new features too:
* Parametrization of request-based sources such as playlist, request.dynamic etc. has been simplified to be able to simply set a prefetch argument to tell the operator to queue a certain number of requests in advance. Methods have been added to the operator to also allow advanced use, queue inspection, manual push and etc.
* Settings are now fully typed via a top-level settings module. Typically, set("log.level", 4) becomes settings.log.level.set(4). This is fully backward compatible too!
* The ffmpeg decoder can now be used to decode images so, if you are planning to implement video streams using static images, all you should need is the ffmpeg binding.
Next, we are planning of ending the beta release cycle to keep fixing bugs without introducing major changes so we can start looking at release candidates. Once liquidsoap 2.0.0 is out, we will resume adding new features.
Again, we want to thank all y’all for y’all patience testing, reporting and contributing, this is an immense help for us, we wouldn’t be able to do all this work without y’all!
- OCaml
Published by github-actions[bot] almost 5 years ago
liquidsoap - Liquidsoap 2.0.0-beta2
A little over a year after introducing support for abstract internal frame content in #1237, we’re happy to announce that the second beta of liquidsoap 2.0.0 is now available: https://github.com/savonet/liquidsoap/releases/tag/v2.0.0-beta2
This journey, which started over a year and a half ago at FOSDEM is now bringing liquidsoap to a new level. One can now do things that were previously thought as impossible or very hard to implement. This includes:
- Taking advantage of a fully-featured language with modules, exceptions, nullable values and more.
- Mixing encoded and raw content, sharing encoders, leveraging most of FFmpeg’s supported encoders/decoders/filters
- Streaming video efficiently
With this second beta, we are solidifying the current code, although with perhaps one more disrupting change in the pipes (see below). We encourage any interested user to migrate their script and report any issue as we aim to:
- Maintain compatibility with migrated scripts for the final version as much as possible
- Provide production-ready stability as quickly as possible
To this end, we try our best to be responsive to any bug report concerning the 2.0.0 release branch. In order to help migrating scripts, we have started a migration page with tips about what needs to be changed and will update it as we get reports from our users.
We are in the process of updating our online documentation so you should already see some improvements there. Also, we now have a fully featured Liquidsoap book that provides a lot more details and background information about liquidsoap and streaming in general.
This release also introduces new CI-based APK package builds for alpine for the x86_64 and aarch64 architectures as well as a docker images for Alpine linux. These images are 5x smaller than our default production images!
- OCaml
Published by github-actions[bot] almost 5 years ago
liquidsoap - Liquidsoap 2.0.0-beta1
This is the first beta release of liquidsoap 2.0!
The 2.0.0 release branch brings important and fundamental changes to liquidsoap, in particular:
* First-class support of video
* Tight integration with ffmpeg, encoders, decoders, filters and more
* Enhanced language features making the script language a fully-featured language
This release is the first beta release, which means that we believe that we are done with most of the fundamental changes and are now considering stabilizing the existing core. We are encouraging users to test it, with the confidence that, once their scripts are adapted to the new changes, they will work with the final release with very little changes and that we will be reactive to bug reports so we can move toward a final release quicker.
This release also comes with the first version of the Liquidsoap book!! 🎉
The book covers the Liquidsoap language, in version 2.0.0, with a view to stream generation, from the basics to advanced use cases. We believe that it'll be a great companion while switching to or working on learning about the 2.0.0 release.
It is available: * For purchase on Amazon: https://www.amazon.com/Liquidsoap-book-Samuel-Mimram/dp/B095PVTYR3/ * Online at: https://github.com/savonet/book/raw/main/book.pdf
Windows users: Please note that the windows build does not support our regular encoders (lame, ogg, etc.) along with ffmpeg (they are compiled statically and some of the symbols are conflicting). Since ffmpeg provides the same encoders and more, we have decided to only enable ffmpeg on this build. Please, refer to the documentation here to see how to use ffmpeg to encode in various formats.
- OCaml
Published by github-actions[bot] almost 5 years ago
liquidsoap - Liquidsoap 2.0.0-alpha1
This is the first alpha release of liquidsoap 2.0!
This release features important and fundamental changes, in particular:
* First-class support of video
* Deep integration with ffmpeg, encoders, decoders, filters and more
* Enhanced language features making the script language a fully-featured language
We are currently working on updating the documentation. The online one might be out of sync for a bit as we progressively iterate through the changes.
We presented some of the changes during the liquidshop back in January. You can view the video online here. The slides, with examples, are available here
Feel free to try this release and report any issue that you encounter with it. We are pretty excited to get this version ready for a full release as soon as we can!
- OCaml
Published by github-actions[bot] about 5 years ago
liquidsoap - Liquidsoap 1.4.4
1.4.4 (27-02-2021)
New:
- Added process.quote to quote process' arguments (#1215)
Changed:
- Fetch mime type using curl first when available.
- Make override metadata name case-sensitive in amplify (#1323)
Fixed:
- Remote file resolution when passing URLs with spaces (#1410)
- Fixed empty {http,https} body (#1417)
- Fixed input.harbor shoutcast client connection (#1353)
- Fixed exception reporting when output fails to start (#1372)
- Fixed random track selection (#1468)
- Fixed playlist request leak when using reload="watch" with inotify on a folder (#1451)
- Deadlock when LO server thread crashes (#1409)
- OCaml
Published by github-actions[bot] over 5 years ago
liquidsoap - Liquidsoap 1.4.3
This is the 3rd bugfix release for the 1.4.x branch. It contains important fixes and a couple of new minor features. Update is recommended and should be fairly safe.
Along we this release, we have now added builds for arm64 debian packages and docker-ready production images for amd64 and arm64 architectures available at: https://hub.docker.com/repository/docker/savonet/liquidsoap
Again, we would like to warmly thank all users, contributors and reporters for helping us bring liquidsoap to the next step!
Also, please note that a couple of issues had to be left out to make sure that the release comes out on time. These are listed here and will be tackled as soon as possible.
New:
- Allow to set min/max/bitrate in mp3 vbr mode (#1294).
- Added optional http_version parameters to http{s}.* methods.
- Added on_cue_{in,out} callbabacks to cue_cut
- Added support for file:/path/to/file along with file:///path/to/file
- Implement default OPTIONS * handler for harbor input (#1334)
Changed:
- Fixed default ffmpeg log level.
- Changed default HTTP response for unrecognized harbor /admin commands (#1334).
- Use replay gain metadata when present (#1102).
Fixed:
- Fixed exponential memory usage in clock unification algorithm (#1272).
- Fixed rotate source order (#1279).
- Fixed invalid new track duration in
crossfadewhen track ends while buffering (#1074). - Make sure warnings do not prevent the script from running (#994).
- Fixed seek implementation in FFMPEG decoder (#1291).
- Fixed
http{s}.*request body reader (#1300). - Fixed duplicate metadata insertion in caching mode (#1241).
- Fixed SSL connection error (#1304).
- Better error reporting for Clockconflict and Clockloop errors (#985).
- Make sure playlist change watch is only setup once (#1246).
- Fixed windows service launch (#907).
- Fixed
rotatenot respecting source weights when not used after selecting a source (#1327). - Bring back
{lastfm,librefm}.submit(#1343).
- OCaml
Published by toots over 5 years ago
liquidsoap - Liquidsoap 1.4.2
Liquidsoap 1.4.2 is another bugfix release from the 1.4.x branch. It fixes a couple of important issues. See the ChangeLog below for a full list.
Install
See our installation instructions
⚠️ Breaking change ⚠️
One notable change with this release is that sources created using cross and crossfade operators are now fallible. This is required as the crossfade transitions can be any user-provided functions, including functions returning failing sources. Make sure to update your scripts accordingly, typically moving your security fallback to after applying any cross/crossfade.
Once again, we want to thank all users, contributors and patient testers, we wouldn't be able to find, address and confirm that all these issues have been fixed without our community! ✨
Full ChangeLog
New:
- Added
retry_delayargument torequest.dynamic(#1169). - Renamed
request.dynamictorequest.dynamic.listand updated its callback function type to return an array of requests, making possible to return multiple requests at once but, more importantly, to return[]when no next requests are available. (#1169)
Changed:
- Set
audio/flacas mime for flac (#1143). - Deprecated
request.dynamic.
Fixed:
- Fixed errors when installing bash-completion files (#1095)
- Fixed failures in
extract-replaygainscript (#1125) - Do not crash when loading playlists using
~/path/to/..paths. - Set setdefaultverify_paths for SSL (#450)
- Use 443 as default port for https (#1127)
- Fix implementation of
rotate(#1129). - Register audio/opus mime type for ogg decoding (#1089)
- Re-encode name, genre and description in
output.icecastusing the given encoding (#1092) - Accept 24 bits per sample in %flac encoder (#1073).
- Fix rare stack overflow during clock unification (#1108).
- Prevent metadata inserted via
insert_metadatafrom being visible to underlying sources (#1115) - Fix
cross()fallability. - Fix decoder remaining time when decoding is done (#1159)
- Fixed crash when cleaning up
output.hls - Fix
get_process_linesregexp logic (#1151)
- OCaml
Published by toots about 6 years ago
liquidsoap - Liquidsoap 1.4.1
This is a bug fix release, addressing an issue with crossfade transitions related to fade.initial and fade.final. See #1009 for more details.
The binary code is not changed in this release, only the definitions for those two operators, located in the libs/fades.liq file. It is, then, also possible to simply update this one file and keep an installed 1.4.0 release.
Finally, the arguments of the two operators have been changed. This is technically breaking the script API but we believe it should not affect most of our users.
Feel free to drop us a message on the Slack channel or at savonet-users@lists.sourceforge.net
- OCaml
Published by toots over 6 years ago
liquidsoap - Liquidsoap 1.4.0
This is with great pleasure (and a bit of relief!) that we can now announce that liquidsoap 1.4.0 is out! :tada:
This has been quite a long release cycle but it also comes with some awesome changes. Let's have a look at some of the most important ones:
Utf8 script parsing is now supported, allowing to define variables in utf8 (hello
🎵 = playlist("..")!) but, more importantly, to write and deal with utf8 strings in your script, such as metadata and etc.You can now use any tuple size in the language, i.e.
x = (1,"abc",true,..)and fetch members of a tuple via the new keyword:let (a,b,c) = xWe support encoding and decoding using the
ffmpeglibrary. This allows a wide range of codec support both as input and output. Support is limited to audio for this release but is expected to extend to video for the next major release.External executions can now optionally be sandboxed using bubblewrap. This feature can enhance the security of your setup if, for instance, your radio receives URLs from external sources.
HLS output is now supported via
output.file.hlsandoutput.harbor.hls[.ssl].cross/crossfadeandsmart_cross/smart_crossfadeare now merged. Newcross/crossfadebehave like the old crossfade operators by default and like their smart counter-part by passingsmart=true. 'overridedurationmetadata now uses the label"liqcross_duration"`.SRT input and output are now supported, via
input.srtandoutput.srt
Full changelog:
New:
- UTF8 parsing!
- Added support for tuples:
x = (1,"aa",false)(#838) - Added support for deconstructing tuples:
let (z,t,_) = x(#838) - Added
input.{file,harbor}.hlsto read HLS stream (#59, #295, #296). - Added
output.hlsto natively stream in HLS (#758). - Added
%ffmpegnative encoder, only for audio encoding for now (#952) - Added ffmpeg-based stream decoder, limited to mime type
application/ffmpegfor now. - Added
(to_){string,float,int,bool}_getteroperators to handle getters in script side. - Made
pparameter insmooth_addafloatgetter (#601) - Added
source.timeto get a source's clock time. - Added
max_durationto limit a source's duration. - Added
file.temp_dirto create temporary directories. - Added
file.{unlink,rmdir}to remove, resp., file and directories. - Added
file.writeto write content to a file. - Added
file.readto read contents of a file without loading all of it in memory. - Added
youtube-pl:<ID>protocol to resolve and parse youtube playlists (or any playlist supported byyoutube-dl) (#761) - Added
protocol.aws.endpointsetting for thes3://protocol, thanks to @RecursiveGreen. (#778) - Added support for sandboxing
run_processcalls. (#785) - Added
harbor.{http,https}.staticto serve static path. - Added
log.{critical,severe,important,info,warning,debug}. Use aliases in code as well (#800, #801, #802) - Added
sleepfunction. - Added
mkavailablefunction. - Added
fade.skipfunction. (#804) - Added
video.external.testsrcfunction. - Added
video.frame.*andaudio.samplerate. - Added
input.external.ffmpegandoutput.external.ffmpeg. - Added
output.youtube.live.ffmpeg. - Added
output.file.hls.ffmpeg. - Added
reopentelnet command inoutput.external. - Enabled external decoders in windows (#742)
- Added support for bash completion.
- Added
video.add_text.native. - Added
configure.bindir - Added
forandwhileloop functions. - Added
list.case. - Added
metadata.string_getterandmetadata.float_getter. - Added
string.contains. - Added
request.uri. - Added
{input,output}.srt(#898) - Added
path.remove_extension. - Added SSL read/write timeout options, use it for incoming socket connections (#932)
- Added ffmpeg resampler (#947).
- Added
lslandlsr.
Changed:
- Depends on OCaml >= 4.08.0
- Changed return type of
http.*andrun_processto use tuples (#838) - Better error reporting with coloring and uniform format. (#790)
- Improved reporting of file, line and character during parsing errors.
- Remove dynamic plugin build option.
- Made
on_enddelay a float getter. - Reimplemented
fade.{in,initial,out,final}as scripted operators. (#664) - Removed
cross/crossfadeoperators, superseeded bysmart_cross/smart_crossfade - Rename
smart_cross/smart_crossfadeoperators ascross/crossfade - Default behavior of
crossfadeis old (simple) crossfade. Usesmart=trueto enable oldsmart_crossfadebehavior. - Rename
file.durationasrequest.duration - Removed duplicate
is_directory - Rename
{basename,dirname}aspath.{is_directory,basename,dirname} - Empty playlists return by scripted resolvers is now considered a failure to resolve.
- Rewrite
smooth_addto use newmkcrossfunctions. - Reimplemented
open_process_fullto get a hand onpidand finer-grained closing workflow (#703) - Added
transition_lengthtoswitch-based operators to limit transition lengths and allow garbage collection of transition sources. - SDL renders text in UTF-8. (#712)
- Made
xandyparameters invideo.add_textfloatgetters. (#730) - Reimplemented
extract-replaygainusingffmpeg, added an optional replay gain option to theffmpeg2wavprotocol. Thanks to @Yamakaky for contributing on this. (#749) - The
ratioparameter ofcompressandlimitis a float getter. (#745) - Removed
rewrite_metadatawhich had been deprecated for a while now. - Allow string getter for
harborHTTP responses. - Renamed
get_clock_statustoclock.statusandlog_clockstoclock.log. - Renamed
rms_windowparameter ofcompresstowindow. (#796) - Added
chopoperator. - Keep master tracks' boundaries in
mux_*functions. (#795) - Added
new_trackoptional argument to callback ininsert_metadata. - Use getters for weights of
rotate. (#808) - Added
conservative,lengthanddefault_durationparams toplaylist.{reloadable,once,merge}(#818) - Renamed
input.externalintoinput.external.rawaudio, addedinput.external.wav. - Renamed
gstreamer.hlstooutput.file.hls.gstreamer. - Raise an error when using a format (e.g.
%vorbis,%mp3, ..) that is not enabled. (#857) - Set default encoders and ladspa plugins samplerate and channels to configured
internal
"frame.audio.samplerate"and"frame.audio.channels". (#870) - Handle unary minus in the preprocessor instead of the parser in order to avoid duplicating the parser. (#860)
- Add
filteroption toplaylist.once. - Added a
replay_delayoption to thepipeoperator to replay metadata and breaks after a delay instead of restart the piping process. (#885) - Add
buffer_lengthtelnet command toinput.harbor. - Bumped default
lengthparameter for request-based sources (playlist,request.dynamic, ..) to40.to assure that there always is at least one request ready to play when the current one ends. - Added support for cue in/out and fade in/out/type metadata support in
ffmpeg2wavprotocol. Rename protocol toffmpeg. (#909) list.assocandlist.remove_assocrequire an ordered type as first component.- Renamed
quotetostring.quote. - Added
phase_inversion={true/false}to%opusencoder (#937) - Fixed encoders forcing frame rate and audio channels too early (#933)
- Change filename to a string getter in file-based outputs. (#198)
- Changed
audio.converter.samplerate.preferredoption toaudio.converter.samplerate.convertersto give a list of possible converters.
Fixed:
- Lack of documentation for
cross/crossfade(#743) - Fixed before metadata being lost during crossfade not in conservative mode.
- Correct types and default values for
random.int(#767). - Allow changing pipeline in gstreamer functions. (#762)
- Script deadlock after a long time, most likely related to old crossfade transitions (#755)
- AVI export fixed. (#789)
%externaldoes not stop processes anymore on each metadata. (#789)- Fixed exit getting stuck when using
input.jack(#769) - Stop lo server on shutdown. (#820)
- Fixed external process stop not detected on second and further calls (#833)
- Add
seekin operators where implementation is clear (#853) - Do not enter buffering mode between tracks in
buffer(#836) - Fixed file descriptor leak in external processes (#865)
- Fixed encoded output creating empty files from failing sources (#876)
- Fixed
cue_cutnot working when used beforecross/crossfade(#874) - Fixed audio glitches when seeking within a MP3 file.
- Fixed
insert_metadatalogic when insert new track and metadata (#903) - Fixed
replay-gainscript default location. - Fixed audio glitches at the end of crossfade transitions.
- Specify that
list.removeremoves only the first occurrence and avoid reversing the list (#922). - File descriptor leak when using openssl-based operators.
- Fixed SSL read taking too long to timeout (#932)
- Fixed output starting when underlying source is not available (#393)
- OCaml
Published by toots over 6 years ago
liquidsoap - Liquidsoap 1.3.7
Bugfix release which address a particularly annoying timeout issue with external processes. Code change is bigger than usual for a bugfix but call for early testing bring hope that the fixes should be correct and without regressions.
Changed:
Reimplemented
open_process_fullto get a hand onpidand finer-grained closing workflow (#703)Better log message when request download times out (#708)
Drop
log.levelforffmpegmessages to5
Fixed:
Timeout when executing external processes (#691, #736, #726, #708)
Set buffering only when frame is partial in time_wrap.ml. Makes it work with crossfade transitions (#695)
Changed
Icy-MetaData:1toIcy-MetaData: 1in HTTP source headers. Fixes some shoutcast implementations (#727)Fixed deadlock in
input.httpsource status command (#367)
- OCaml
Published by toots about 7 years ago
liquidsoap - Liquidsoap 1.3.6
1.3.6 (23-01-2019)
Fixed:
Fixed smart_crossfade transitions skipping data after track marks. (#683, #652)
Fixed
input.pulseaudioparameters.Fixed crash when copying frame content (#684)
- OCaml
Published by toots over 7 years ago
liquidsoap - Liquidsoap 1.3.5
1.3.5 (25-12-2018)
New:
Added a bunch of base mathematics primitive,
exp,log,cos,sine, ...Added
"extinf_duration"to parsed#EXTINFmetadata.
Fixed:
Fixed inotify watch semantics (#677)
Enhanced
#EXTINFparsing in ambigious cases (#625)Fixed
output.youtube.live(#630)Make sure server writes are synchronous (#643)
Fixed crash when loading some frei0r plugins (#435)
Fixed compilation with
osx-secure-transportFixed invalid opus stream generated when no data was ever encoded (#180)
- OCaml
Published by toots over 7 years ago
liquidsoap - Liquidsoap 1.3.4
Tons of bug fixes and several neat improvements.
Changelog
New:
Added
FFMPEGdecoder using the newocaml-ffmpegAPI. Thanks for @gndl for the hard work there.Added
"init.allow_root"setting to allow running liquidsoap as root.Added
on_trackcallback for playlists. Can be used to force a reload.Added
server.condition,server.wait,server.broadcastandserver.signal. Used to control server command execution.Added
server.write,server.read{chars,line}to write interactive server commands in conjunction with the above functions. (#544, #568)Added
output.youtube.liveas a wrapper aroundoutput.gstreamer.audio_videoto stream live to Youtube (#498)Added metadata extraction to
ffmpeg2wavprotocol (#623).
Changed:
Depends on OCaml >= 4.03.0
Depends on camomile > 1.0.0
Use
http{s}.headwhen available to fetch remote file's mime type. (win32 port)Better log messages for root exit and buffer override.
Switch default log to stdout. Set to file when
log.file.pathis set (#612)Disabled Gstreamer stream decoder.
Removed asynchronous mode for
output.gstreamer.audio_videoReworked
smartcrossinternal logic (#596)Enabled
replaygainonm4afiles, thanks to @gilou (#604)Added
encodingparameter tooutput.shoutcastto allow alternative string encoding for metadata updates (#411)Deprecated
rewrite_metadata
Fixed:
Decouple dyntools compilation.
Support for OCaml >= 4.06
File descriptor leak in
output.icecast(#548)Fixed URL regexp for
input.https(#593)Multiple gstreamer fixes:
- File decoder with video.
- Memory leaks (#516, #511, #434, #318)
- Process freeze (#608, #278)
Duppy crash on exit (#160)
Fixed audio glitches when using the
pipeoperator (#614)Deadlock in external decoder. (#611)
- OCaml
Published by toots over 7 years ago
liquidsoap - Liquidsoap 1.3.3
This a minor release, containing mostly bug fixes and a couple of new features.
Changelog:
New:
Added
on_changetoregisterAdded IPv6 support for
input.harbor. (#491)Added
time,localtimeandgmtimeto help with time-predicates (#481)Added
on_startto execute callback when liquidsoap starts.Added
enable_external_ffmpeg_decoderto enable ffmpeg-base external decoder.Added
"decoder.external.{ffmpeg,ffprobe,flac,metaflac,faad,mpcdec}.path"configuration settings.
Changed:
Renamed secure transport harbor key paths to: harbor.secure_transport.*
Renamed secure transport I/O to:
{input,output}.harbor.secure_transport.Added
.wmatogstreamerfile decoder file extensions (#483)
Fixed:
Fixed memory leak in
output.icecastconnection method. (#490)Fixed
mutexifyMake sure that metadata are always passed in increasing position order in
map_metadata(#469)
- OCaml
Published by toots over 8 years ago
liquidsoap - Liquidsoap 1.3.2
This is a bugfix release, mostly related to SSL support and execution of external process.
ChangeLog
Changed:
Removed
kicktelnet/server command, duplicate ofstop.Support
replaygainfor mp3 files, thanks to @d4h3r0 (#460)Implement
input.harbor.sslusing SecureTransport for OSX.
Fixed:
Fix scheduler loop causing high CPU usage when using Process_handler without some of the default callbacks. (#475)
Revert
wait_forimplementation to pre-1.3.0, using a customselectloop (#453)Handle mime-type arguments in input.harbor streams. (#456)
Tell ocaml to use the same C compiler at build and link time. Fixes build on FreeBSD when using C++-based bindings such as taglib. (#465)
Accept any capitalization of HTTP(S) as regular HTTP URL (#464)
Fix compilation with osx-secure-transport enabled.
- OCaml
Published by toots over 8 years ago
liquidsoap - Liquidsoap 1.3.1
This is a bugfix release, addressing a couple of bugs from the recent 1.3.0 release. Changelog is:
New:
Allow any tags allowed in
"encoder.encoder.export"settings in vorbis streams (#418)Allow
"audio/mp3"mime-type for mp3 in file resolution protocol. (#451)
Fixed:
Fixed runprocess, getprocesslines, getprocess_output when compiling with OCaml <= 4.03 (#437, #439)
Calls to wait_for while the scheduler isn't running (#442)
Revert default handling of environment in runprocess, getprocesslines, getprocess_output to passing calling process' environment by default.
- OCaml
Published by toots about 9 years ago
liquidsoap - Liquidsoap 1.3.0
New:
Added support for recursive functions (#406)
Add peak and peak.stereo operators (#364)
Change
track_sensitiveparameter to a boolean getter (fixed value or anonymous function).Add SSL support to the varous harbor operators, either via openssl or OSX's SecureTransport.
Add optional "dj" and "next" metadata for Shoutcast v2, wrap "dj" value in a callback in output.shoutcast (#370, #388)
Allow partial parsing of JSON objects in of_json.
Generalize list.assoc to allow default values. Legacy code must be updated: list.assoc(k,l) -> list.assoc(default="",k,l)
Generalize list.hd to allow default values. Legacy code must be updated: list.hd(l) -> list.hd(default="",l)
Allow to pass a default to list.nth. Legacy code must be updated: list.nth(l,pos) -> list.nth(default=<..>,l,pos)
Added on_offset to execute a callback at a given offset within a source's tracks.
Added mutexify to protect a function from being called concurrently.
Added request.log to get log data associated with a request
Added overlap_sources to rotate between sources with overlapping tracks.
Added replay_metadata to input.harbor()
Added <char code> syntax for strings (#368)
Added string.sub
Added runprocess to run a process with optional environment and return (stdout,stderr,exitstatus)
Added addplaylistparser to register new playlist parsers
Added optional static parameter to add_protocol
Added file.temp to create fresh temporary filename
Added process: protocol
Reimplemented curl-based fetch process using process:
Added s3:// protocol to fetch files from AWS S3 using the AWS CLI.
Added polly: protocol to enable speech synthesis using AWS polly. Generated files are mono so make sure you use audiotostereo().
Added youtube-dl: protocol to resolved requests using youtube-dl
Added which() to find an exectuable within the $PATH
Added register() to allow to register new configuration settings
Changed:
Reverted default value for --erroraswarnings option, renamed to --strict.
Moved say: protocol registration to utils.liq.
Moved getprocesslines and getprocessoutput to utils.liq, added optional env parameter
Set conservative=true by default in cross() and smartcross()
Deprecated (can be removed in any future version):
- Dynamic plugins compilation, deprecated in favor of opam rebuild mechanism.
Removed:
aac and aacplus encoders, removed in favor of fdk-aac.
dirac/schroedinger video encoder: obsolete, abandoned upstream.
force_mpeg option in taglib metadata decoder. Has not been used for years and allows to decouple taglib code from the mad decoder.
Bugfixes:
Fix negative seek (#390)
Prevent flows metadata updata from stalling sources (#377)
Add revdns setting for telnet, set all revdns default to false (#372)
Fix icy metadata in output.harbor (#358)
Fix missing first line of headers from icy clients in input.harbor (#380)
Fix timestamp in some logged output (#395)
Fix crash in external (download) protocol.
Fix fade.{in,out} metadata handling for new fade duration and type.
Compute normalization regardless of child sources ready status in add() to avoid unexpected change of volume.
- OCaml
Published by toots about 9 years ago
liquidsoap - Liquidsoap 1.2.1
1.2.1 (01-07-2016)
New: - Support for https (SSL/TLS) icecast connections. - Added http.{put,head,delete}, https.{get,post,head,put,delete}. - Added input.https. - Added list.mapi. - Added rotate.sequence. - New pipe() operator to pipe audio data through an external program. - Switched to curl for request resolution/fetch.
Bugfixes: - Fix metadata update for shoutcast v2 when sid <> 1 (#320). - Fix connection to input.harbor using the shoutcast v1 protocol (#337).
- OCaml
Published by toots almost 10 years ago
liquidsoap - Liquidsoap 0.9.0
Bugs fixed: - Fixed byte swapping function. - Fixed unix server socket failure (#160). - Fixed mp3 audio glitches when decoding files with picture id3v2 tags using ocaml-mad (#162). - Fixed liquidsoap crash on weird telnet and harbor input (#164). - Fixed request.queue() not considering initial queue on wake-up (#196). - Fixed source leak in append(). - Fixed afteroutput propagation in the transitions of switches (#208). - Fixed compilation for ocaml 3.11 (#216). - Fixed (again) Vorbis mono output (#211). - Avoid crashing on broken symlinks when parsing directories (#154). - Use random temporary file in liGuidsoap. - Fixed liGuidsoap to use the (not so) new metadata field initialuri. - Fix bugs in the life cycle (sleep/wakeup) of queued request sources, which made saymetadata unfunctional. - Remove buggy unbuffered {input,output}.jack. (#231) - Fixed audio information sent to icecast. (#226) - Fixed global reset starting inactive sources. (#227) - Fixed shoutcast source initial answer in harbor. (#254) - Fixed frame and metadata duplication in cross operators. (#257) - Fixed several sources (outputs, external streams) that were not going to sleep correctly.
Changes: - Warning: interactive_float() is now interactive.float().
New: - Compatible with OCaml 3.09. - Faster shutdown. - Rewrote ogg decoding, for files and streams. - Support for ogg skeletons, currently only used for theora. - Cleanup icecast class hierarchy and restart mechanism, especially with respect to the encoder. - Support for breaks and metadata in generators. As a result, input.http() and input.harbor() now fully support them. See newtrackonmetadata parameters there. - Switch operators (fallback,random and switch) can now replay the metadata of a source that has been left in the middle of a track. - New forcemime parameter for input.http(). - New insertmissing parameter for append(). - Multi-line strings in liq scripts, with a caml-like syntax. - Slight modification of the scripting syntax, handling unary minus. - Added useragent parameter for input.http and input.lastfm - Added speex support for files and HTTP streams. - Added EXPERIMENTAL support for AU, AIFF and NSV mp3 audio files using ocaml-natty. - Added "prefix" parameter to the playlist operators. Allows to prefix each uri in order to force resolution through a specific protocol, like replaygain: for instance. (#166) - Support for external processes as audio encoder: - Added output.icecast.lame to output to icecast using the lame binary. - Added output.icecast.flac to output to icecast using the flac binary. - Full generic support awaits some changes in libshout. - Support for external processes as audio stream decoder: - Added input.mplayer to stream data coming from mplayer. - Support for external processes as audio file decoder: - Added support for flac audio files using the flac binary. - Added support for m4a files using the faad binary. - Added optional support for mplayer, enabled with enablemplayer(). - Support for external metadata decoders. - Support for generic authentication function in harbor, also available for ICY (shoutcast) clients. - Added optional support for the samplerate library, and dynamic configuration of resampling routine. - Added lag() operator, which delays a stream by a constant time. - Initial support for PulseAudio. - Added experimental support for {input,output}.marshal, allowing raw communication between various liquidsoap instances. - Added optional alternatives to store buffered audio data: - raw: in memory, s16le format - disk: on disk, several big files - diskmanyfiles: on disk, a lot of small files See documentation for more details. - Added EXPERIMENTAL video support: - Support for ogg/theora file input. - Support for ogg/theora file and icecast output - Support for SDL output. - Optional support for ocaml-gavl as video converter. - Support for video in some existing operators, including switches, add(), metadata/track manipulations. - Added operators: video.fade.*, video.fill, video.greyscale, video.image, video.invert, video.lomo, video.noise, video.opacity, video.opacity.blur, video.rotate, video.scale, video.sepia, video.text, video.tile, video.transparent, video.volume.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.0.0 beta 1
This beta version introduces two major new features: heterogeneous stream types and clocks.
New: - Different sources can carry different types of content. - Encoding formats have been introduced to help infer stream content types. This brings static checking for bounds in encoding parameters. - Introduce conversions between stream contents (mono, stereo, drop audio, video, etc) and muxing. - Allow explicit type annotations in scripts. - Introduce clocks, cleanly allowing for the coexistence of different time flows, and avoiding inconsistencies that can result from it. Soundcard I/O and cross-based operators notably make use of it. - Remove root.sync, replaced by attaching a source s to clock(sync=false,s). - Enable dynamic source creation and source.shutdown(). - Extend and adapt MIDI and video operators. - Introduce purely metadata streams (audio=video=midi=0 channels) and metadata stream decoder. - Support WAV streams in input.http/harbor(). - Introduce static image decoder using SDL image. - Remove bound of request identifies (RID). - Experimental: source.dynamic() for advanced dangerous hacking. - Make path relative to script in %include "PATH", and introduce %include <...> where path is relative to liquidsoap library directory. - Add channelsmatrix parameter to output.ao(). - Add on(dis)connect hooks in input.harbor().
Cleanup and fixes: - Lots of cleanup and fixes as with all major code rewriting. - Optimize video and stabilize it a little bit... still not perfect. - Rewrite stream and file decoding API, as well as file format detection. - Enhance shutdown and error message reporting, notably for icecast and request-based sources. - Avoid quasi-infinite loop in failed request resolving.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.0.0 beta 2
This release introduces lots of fixes and cleanup, but also some new features. Major novelties: support for fast seeking and cue points, FLAC and improved AAC+ support, introduction of the liquidsoap yellowpages "flows", plugin support and improved messages for scripting errors. Compatibility warning: insertmetadata has changed, and clock.assignnew() should be used instead of clock() to avoid some of the new static checks
Decoders:
- New support for seeking and fast computation of durations in most formats
- New decoders: FLAC (native & Ogg) and images using Camlimages
- Fixes in Ogg decoding: LS-515 (loss of data) and LS-537 (segfault).
- Fix LS-337: periodical failures when decoding AAC(+) streams
- AAC(+): use new ocaml-faad with builtin mp4ff, easier to build
- New detection mechanism mixing extensions and MIME types (when available),
with corresponding settings "decoder.fileextensions.
Encoders: - New FLAC encoders %flac (native) and %ogg(%flac) - New AAC+ 2.0 and vo-aacenc - New settings to theora: keyframes make files much smaller! - New settings for WAV encoding: headerless, samplesize. - Fix segfaults with ocaml-aacplus - Enhancement LS-441: filter metadata before encoding, based on the "encoder.metadata.export" setting. - Rework infrastructure of encoded outputs to fit all formats, outputs and styles of metadata handling, file reopening (#386)
Harbor: - New: output.harbor() which acts as a mini icecast server, accepting listeners directly. Encoding is shared among users, and is only performed when needed. - New: ability to register HTTP GET/POST handlers to create simpler web services, using harbor.http.register/remove(). - Make all settings local: port, user and password can be set independently for each input.harbor() source - New: "metadatacharset" and "icymetadata_charset" in input.harbor() - Fix: race condition possibly leading to abusive "source taken" (LS-500)
Icecast: - Add support for streaming native flac, only works when streaming to input.harbor(), not supported by actual Icecast servers - Fix bugs in ICY protocol support (header parsing, user name) - Use ICY metadata updates when streaming AAC(+) - New: "encoding" parameter for output.icecast(), used for recoding metadata Defaults to "latin1" with shoutcast servers - New: icy.update_metadata() function for manual updates - Enhance default "song" metadata, avoiding " - " when unnecessary (#467)
Input/output: - New experimental input.v4l/v4l2() for webcams - New experimental input/output.udp() for unchecked UDP streaming, available with most formats (at your own risk) - Restore output.pipe.external(), now called output.external() - New parameters for most outputs and inputs (start, onstart, onstop, fallible); cleanup and uniformize implementations (LS-365) - New ALSA settings alsa.alsabuffer, alsa.bufferlength and alsa.periods Setting periods=0 allows to not attempt to set the number periods, which is impossible on some devices - New preference order in input/output.prefered(): pulseaudio, portaudio, oss, alsa, ao, dummy
Operators: - New: support for cue points with cuecut() - Change insert.metadata() which is now more script friendly, returning an insertion function rather than register a server command. The old functionality is available as server.insertmetadata(). - New: rms() operator for getting RMS of a stream, and server.rms() which makes this information available as a server command. - New: track_sensitive mode for blank detection operators - New: playlist.reloadable() for playing a list once, with a command for restarting it. - Remove id.*() which can be replaced by type annotations
Scripting API: - New: OSC support through osc.bool(), osc.float() and osc.floatpair() - New: JSON export jsonof() - New: http.get() and http.post() - New: url.encode/decode(), base64.encode/decode() - New: string.recode() for charset conversions using camomile - New: notifymetadata() and osdmetadata(), suitable for use with ontrack() and onmetadata() - New: request.metadata() for getting a request's metadata - New: string.length() - Enhance logclocks() with parameter for delaying startup - Enhance getclock_status() with "uptime" reference time
Server interface:
- Print the playlist's URI when calling
Script language: - Option "-i" doesn't show types for pervasives anymore - Pretty printing of types (LS-474) with indentation, also used in the documentation - Enhanced type errors (LS-459): no more traces, only the relevant part of types is displayed, plus a few special friendly messages. - Enhanced static checks (LS-123) thanks to the introduction of the active_source subtype, for unused variables and ignored values This should avoid common errors, help troubleshooting If needed, advanced users can work around errors using --check-lib and --errors-as-warnings
General:
- Do not attempt to install "daemon" files if user/group have not been
set, unless forced using "make INSTALL_DAEMON= install"
- Fix several core "source protocol" bugs, causing assert failures and
other crashes: LS-460 (source becomes not ready without operator knowing)
#403 (information about being ready is not precise enough)
- Fix incorrect image accesses (LS-430) by introducing a safer VFrame API
Applies to most video operators (video.fade(), video.text(), effects...)
- Cleanup resource (de)allocation, which is becoming critical with dynamic
reconfigurations (e.g., dynamic output creation, source.dynamic())
Enforce that server commands are always deallocated (LS-495)
Attempt to stop sources when initialization fails, so they cleanup as
much as possible (LS-503)
Avoid deadlocks upon crashes in IoRing-based operators
Share code for stoppable feeding threads, use it in input.harbor()
Avoid useless initialization of SDL systems
- Dynamic loading of lame and aacplus libraries, making it possible to
ship them as separate binary packages. This is particularly useless
for non-free libraries and for those that depend on X (e.g., SDL)
which is often undesirable on servers
- Support for separate compilation of most optional features as plugins
Use --enable-
Miscellaneous: - Update liguidsoap, make microphone input optional (LS-496) - Do not crash upon charset-recoding failures [LS-473] - Fix in source.dynamic(): missing source re-selection [LS-354] - Avoid deadlock on startup in daemon mode [LS-229] - Fixes in LADSPA and SDL causing early freezing of Frame parameters. - Fullscreen mode for output.sdl() - Fix: SIGPIPE used to cause crashes (LS-53,LS-287) - Fix: video.volume() could crash upon some end-of-track situationos - Fix: properly escape filenames in external file duration methods - Rework timeout management for various sockets (notably icecast & harbor) Set nodelay, remove TCP_*TIMEOUT [LS-508,LS-509]
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.0.0 beta 2.1
- Fix: playlist.safe() was unusable in beta2, as a side effect of removing duplicate "timeout" parameter in playlist().
- Minor enhancements to documentation, settings and reference.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.0.0 beta 3
- Feature: Added of_json to parse json data. Depends on json-wheel.
- Feature: Added file.exists and is_directory.
- Feature: Added timeout options for: telnet, harbor (server), input.icecast
- Enhancement: finer-grained timeout detection for input.harbor and input.http
- Fix: deadlock when disconnecting harbor users through server/telnet command.
- Fix: dynlink detection in native mode with old versions of ocaml
- Fix: deadlock when an exception is raised during startup while the clock is owned by a source (e.g. input.alsa). See LS-527 for more details.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 0.9.2
This release is a snapshot of upcoming features. It also contains several important bugfixes. As a snapshot, it contains experimental or unpolished features, and also breaks compatibility with previous versions. You should in particular notice the two "New" items below: - random(strict=true) is now called rotate(); - request sources (playlists, request.*) have a new queuing behavior, check the doc (request-sources.html) or revert to conservative=true.
Bugs fixed: - Ogg encoder now muxes pages according to their ending time. - Support "ogg/audio" and "ogg/video" mime types for HTTP ogg streams. - Changed external encoder's "restartencoder" to the more relevant "restartonnewtrack". Added optional "restartafterdelay" to restart the encoder after some delay. Also completely rewrite stop mechanism. Stop operation now waits for the encoding process to finish, allowing proper restartonnewtrack like for ogg encoded data. - Factorized buffered I/O code. Also added a blocking API, which avoids "no available frame" and "reader not ready" messages and audio glitches. It enforces that "root.sync" be deactivated for these sources, such that synchronisation is done by the source. (#203) - Factorized file decoding code. - Fixed reversed order when parsing playlists using playlist.parse(). - Avoid bad crashes when resources lack, e.g. no more memory. - Tighten and enforce the inter-source protocol. - All outputs: fix the autostart server command. With the former code, a modification of the autostart parameter was only taken into account one start/stop cycle later. - onblank(): fix a bug that prevented the first call to onnoise. - Fixed estimated remaining samples on ogg files, fixes issues with operators relying on this value, in particular crossfade() and request-based sources when operating in non-conservative mode. - Fixed socket descriptor leak in input.http. (#318) - Fixed deadlock at init when an exception was raised at wakeup phase. (#319) - Fix delay() which could sometimes incorrectly declare itself ready, and thus try to get some data from its unavailable input source. - Bug in queue duration estimation led to infinite feeding of the queue, until all request IDs are taken. - Several fixes enforcing clean (non-deadlocking) sleep/shutdown.
New: - The operator rotate() replaces random(strict=true), and random() does not have a strict parameter anymore. - Switch to new behaviour in request-based sources. Use conservative=true to get to the old behaviour. - onblank(): provide an onnoise handler. - playlist(): add server commands for reloading the playlist and changing its URI. - Fallible outputs: all outputs now have a fallible mode, in which they accept fallible sources, and automatically start/stop when the child fails to stream. - EXPERIMENTAL ogg/dirac encoding support. - output..aacplus(): native outputs encoding in AAC+ using ocaml-aacplus. - Switched to a custom implementation of the various shout protocols. It notably allows arbitrary content-type settings which enables AAC+ streaming. Enabled wrappers for external encoders for AAC+ format aacplusenc (#220 and #136). Also added custom IRC, AIM and ICQ headers to shoutcast wrappers (#192). - Harbor now supports Shoutcast/ICY headers properly. This allows in particular the use of any supported data format for the source client. - Harbor sources now also consider "song" field when updating metadata. - Added built-in support for m4a audio files and metadata. Made external support optional through enablefaad. - Added optional resampling for output.external operators (#273). - Added optional host and port parameters for audioscrobbling submissions. Allows to use alternate systems, such as libre.fm of jamendo's compatibility API. Added nowplaying submission, and various wrappers, including a full submission process (now playing at beginning, submit some times before the end). - New variables in the script language: liquidsoap.version and configure.{libdir,pidfile,logdir}. - Added built-in support for replaygain, through the replaygain protocol (enabled by default) and the replay gain metadata resolver (to be enabled using enablereplaygainmetadata()). (#103 & #317) - Reverse DNS operations can be disabled using settings keys "server.telnet.reversedns" and "harbor.reverse_dns".
Experimental: - MIDI: file decoding, synthesis, virtual keyboard.
Removed: - RTP input and output. - Removed decoders using ocaml-natty. Slow, unmaintained and superseded by the mplayer decoder.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.0.0
Finally, the 1.0.0 release! It brings several important fixes, but also some nice novelties. The most outstanding difference concerns output.icecast(): its restart and restartdelay parameters are gone, replaced by a new `onstophandler which is called on every error (failed connection or disconnection) and returns the new restart delay. Theonerrorhandler receives a string describing the error which enables user-friendly reporting, adaptative
delays, etc. Note thatonerrordefaults tofun()->3.which is equivalent to havingrestart=true,restartdelay=3.in previous versions, NOT the same as the formerrestart=false` default. As a result, Liquidsoap won't fail to startup if an initial connection attempt fails.
Fixes: - LS-532,527: avoid freeze after errors in streaming threads or source initialization routines - LS-542: race condition in playlist() breaking randomness - LS-489: double expiration lead to illegal queue length and freeze of request-based sources - Avoid multiple simultaneous reloading in playlist(), thanks to Fabio Costa for his help on this one! - Pass charset information to icecast server to avoid encoding bugs - LS-555: timeout for icecast connection attempts - LS-559: permanent stop after disconnection on Ogg streams - LS-565: efficient and crash-free error handling in input.http/harbor() when the input stream has an invalid number of channels - LS-431: proper handling of duration in blank() avoids abusive empty tracks - LS-556: rework conversion operators, optimizations used to be unsafe & broken - LS-574: silent MIDI synthesis operators - LS-396: drop*()'s types reflect that they don't support variable arities - LS-442: allow comments not terminated by newline at end of file
New: - onerror handler in output.icecast(), see above - New msg param in %mp3 for marking frame headers, defaults to version string - output.file(): new onclose parameter, may be used to write exact duration - %mp3.vbr/abr for variable bitrate MP3, %mp3 is now a synonym of %mp3.cbr - MP3 encoders now support ID3v2 tags - input.http(): new "status" command - LS-556: muxmono() for adding a single audio channel into a stream - video.addtext() using libgd (gd4o) for environments without X Dependency on graphics can be disabled (to work around erreneous detection) - script language: add infix operator mod (patch by Fabio Costa) - delay() now has an "initial" parameter - LS-557: "server.timeout" setting can now be disabled by setting it to -1 - LS-532: source.init() for selective init with a way to handle errors, plus settings "clock.allowstreamingerrors" and "init.forcestat" (or --force-start on the command line) for easing dynamic uses of liquidsoap Enhancements: - Panic crash to avoid frozen liquidsoap after duppy crashes - Text-to-speech: festival and sox are now only runtime dependencies - LS-475,516: better support for dynamic URL change in input.http() - LS-484: display user-friendly error messages in interactive mode - LS-308: use seconds internally in request sources, avoid overflow and display more user-friendly debug messages - Cleanup visu.volume() and video.visvolume() - LS-573: replace " " by "_" in identifiers to make them valid in the server - Script syntax: unary minus now usable without parenthesis after semicolon - Two generic queues by default, to avoid deadlocks in advanced situations - Documentation, build & install system, etc.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.0.1
Fixes: - correct type for the "flush" parameter in output.external() thanks to Romaric Petion for pointing it out - fix bug where MP3 encoder would discard initial ID3v2 rendering - fix bug where smart_cross() would stop before the end of tracks, thanks to Edward Kimber for raising the issue - load libraries in --interactive [LS-618] - update examples, notably the installed radio.liq thanks to Emery Hemingway for noticing the problem - generalize the types of input.http() and input.harbor() to allow variable content kinds, and also allow video for harbor [LS-601] - request.equeue() now allows to remove requests from the primary queue - fix compilation of lame dynamic plugin.
New: - new values for metadata fields does not override old one anymore; use setting "request.metadatadecoders.override" to restore old behavior - stereomode and internalquality parameters for %mp3 encoder - enable mad decoder for MP1 and MP2 in addition to MP3, create aliased configuration keys "decoder.fileextensions/mimetypes.mad" - support for CUE sheet playlists and metadata in M3U - setting "decoder.taglib.forcempeg" to force taglib to consider files as MPEG - scripting builtins getenv(), setenv() and environment() - scripting builtin source.fallible() - harbor is now verb-oriented, supporting GET, POST, PUT, HEAD, DELETE, OPTIONS - load DSSI plugins from environment variables and using dssi.register() - also display the type of the whole expression when -i is passed - generalized custom path support for facilitating standalone distributions - and as usual, various improvements in the code, log and error messages, etc.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.1.0
New: - Add support for GStreamer decoding, processing and encoding (%gstreamer format, v4l webcam input is now implemented using GStreamer). - Add support for opus decoding and encoding. - Add support for the shine encoder, which can efficiently work on architectures without FPU. - Add support for automatically computing the duration of tracks in the "duration" metadata [LS-641]. It can be enabled with set("request.metadata_decoders.duration",true) - Add support for frei0r video effects. - Allow %define'd variables in encoding formats [LS-634], e.g. %define BITRATE 24 %define STEREO true output.file(%mp3(bitrate = BITRATE, stereo = STEREO),"bla.mp3",s)
Enhancements: - Taglib now reads all metadatas (even non-standard ones). - Add a mode to automatically reload a playlist when the file was changed [LS-363,LS-523]. For instance, s = playlist("~/Music",reloadmode="watch"). Also, add file.watch to call a callback when a file is changed, with inotify support when present. - Add support for FFMpeg as video converter, which you can use with set("video.converter.preferred", "ffmpeg") - Add backtime argument to blank operators [LS-609]. - Add a metadata to override fade.final duration. - MIME is computed at most once when extracting replaygain. - Default samplerate converter is now "fast". - BPM detection (bpm) now uses a callback. - Add clock.unify to unify clocks of all sources from a list. - Add "sourceurl" metadata to input.http streams. - Improved error message when theora format is not supported. - Add list.filter function. - video.addimage can now take any image format as input. - Add mux_stereo. - Support for external decoders in streams. - Move bugtracker to https://github.com/savonet/liquidsoap/issues
Bugfixes: - Configure is now compatible with OCaml >= 4.0 and removed support for OCaml < 3.11 [LS-625]. - Fix random memory access / memory leak when decoding AAC/MP4 files [LS-647]. - Correct resampling of wav files. - Use the length for data indicated in header for wav files. - Argv.(0) now returns the script name [LS-605]. - Liquidsoap should now operate fine when compiled with -noassert [LS-578]. - Better handling of inexistent MIDI channels. - Video decoder now correctly handles videos from Icecast. - Avoid visu.volume freezing Liquidsoap on shutdown. - Fix a memory leak when decoding both audio and video in ogg [LS-636]. - More efficient handling of video converters, also fixes some crashes [LS-623]. - Have the soundtouch operator preserve tags [LS-621]. - Fix remaining time estimation in cross and smart_cross. - Avoid deadlocks in harbor and input.http. - Remove leftover files in configure [LS-567]. - Handle wav files with padded fmt headers. - Handle end-of-stream when seeking mp3 with mad.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.1.1
New: - Add support for FDK-AAC, which seems to be the best AAC(+) encoder around for now. Replacement candidate for VO-AAC and AACPLUS - Add %ifencoder to check whether Liquidsoap was compiled with support for a particular encoding format. - There is now an emacs mode in scripts/liquidsoap-mode.el. - Liquidsoap can be used as a Windows service.
Enhancements: - Handle more OSC types (float, floatpair, bool, string, stringpair) and added osc.on*. - Better infrastructure for decoding images. addimage can now handle most image file types. - Add random.int as well as minint and maxint to standard library. - Add playlist.merge to play a whole playlist as one track. - Add gstreamer.hls to play http live streams (HLS). - Add say.program to specify text-to-speech program in scripts. - Add "random" transition type to video.fade.* in order to select a random transition each time. - Add max parameter to drop data on buffer overrun with input.gstreamer.*. - Add bytesperpage parameter to ogg encoders. - Add support for DTX in speex and opus, as well as VAD for speex. - Localize some more parsing errors in files.
Bugfixes: - Avoid deadlocks in harbor. - Correctly flush lame encoder. - Correct sequence operator when there is only one source. - Handle relative URLs in http playlists. - portaudio is now an active source. - Avoid jack I/O lowering the volume.
- OCaml
Published by smimram over 10 years ago
liquidsoap - Liquidsoap 1.2.0
New: - Websocket server (#90): this means that you can stream to harbor directly from your browser! - Add support for AIFF format (#112). - Add url.split_args to split the argument of an url (#123). - Add buffer.adaptative to cope with small network delays (#131). - Add sleeper operator to simulate network delays and test robustness (#131). - Add stereo.left and stereo.right to extract channels from a stereo stream. - Add restart command to restart liquidsoap (#135). - Add file.contents to read the contents of a file. - Add filter.rc for first-order RC filters.
Enhancements: - Add support for sending OSC data (osc.send_*). - Native support for (some) AVI files (#256) which enables support for external video encoders (#233). - Improve rms operator (#105) to have per channel rms (#102), the ability to dynamically set window duration (#103) and multiple monitors (#104). - Icecast streaming can now use HTTP1.1 chunked encoding (#82, #107). - Add support for multiple shoutcast extensions (#216). - Fade type can be overridden by metadata in fade.in / fade.out (#64). - Allow LADSPA plugins with arbitrary number of channels (#191). - Rename shine encoder from %mp3.fxp to %shine. - fdkaac: dynamic plugin (#79), set afterburner parameter, use MPEG4 by default (#83). - Improved subtyping on lists (#125, #126). - Add native simple JSON decoder. - Better code: do not abusively use assertions (#137), issue more warnings and fix them (#162).
Bugfixes: - Correctly close connection in http.get / http.post (#72). - Remove input.lastfm which has been broken for a while. - Lots of small bugfixes.
- OCaml
Published by toots over 10 years ago