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)
  • null can now be used directly without having to call null(). null(value) calls are still valid and can be used to create non-null values with nullable types. Calls to null() are marked as deprecated (#4516)
  • Added liquidsoap.script.path that 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.add API. This makes it much easier and safer to write external decoders (#4531)
  • Deprecated insert_metadata, added default insert_metadata method 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.methods to get them! (#4537)
  • Make sure that let { foo = gni } = v assigns a value to gni but not to foo (#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 ImageLib has been removed. The library is not maintained anymore and causes issues with dangling external processes (#4595)

Utilities:

  • Deprecated replaygain operator, introduced unified normalize_track_gain which 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_up an on_shutdown callbacks have been moved to source methods and are now executed asynchronously by default. Also, on_offset and on_end have been merged into a single on_position source methods. See migratons notes and PR #4536 for details and discussions.
  • Deprecated insert_metadata, added default insert_metadata method on every source (#4541)
  • Added liquidsoap.script.path that contains the path to the current script's file, if available.
  • null can now be used directly without having to call null(). null(value) calls are still valid and can be used to create non-null values with nullable types. Calls to null() 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: add ipv6only to allow to bind only to ipv6 addresses. Set it to true when bind_address is 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 defer more user-friendly by operating directly on generic source(audio=pcm('a)) sources. Renamed old defer to defer.pcm_s16
  • dtools, duppy and xmlplaylist have 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.map strip argument to true and insert_missing to false Added settings.metadata.map.strip and settings.metadata.map.insert_missing configuration 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 lufs C code introduced with release 2.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_length setting 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 duration metadata 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_end operations 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 switch and fallback operators (#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_EXTENSIBLE to the internal wav decoder.
  • Added optional buffer_size parameter to input.alsa and output.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 in input.harbor disabled when either "artist" or "title" is also passed. Add a configuration key to disable this mechanism. (#4235, #2676)
  • output.icecast now re-sends the last metadata when connecting to the remote server unless explicitly disabled using the send_last_metadata_on_connect option (#3906)
  • Add full explicit support for ipv4 vs. ipv6 resolution in SRT inputs and outputs, add global settings.srt.prefer_address and settings.icecast.prefer_address (#4317)
  • Added generic SRT socket get/set API. Added new socket options, including latency and ipv6only.

Fixed:

  • Fixed request resolution loop when enabling both autocue and replaygain metadata resolvers (#4245, fixed in #4246)
  • Fixed flac encoding segfault (#4286, #4274)
  • Fixed source last_metadata not being properly updated (#4262)
  • Convert all ICY (icecast) metadata from input.http to utf8.
  • Fixed inotify unwatching due to GC cleanup (#4275)
  • Fixed delay initial 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_track and etc). (#3577)
  • Added script caching layer for faster script startup time. See: https://www.liquidsoap.info/blog/2024-06-13-a-faster-liquidsoap/ for details (#3924, #3949, #3959 and #3977)
  • Rewrote the clock/streaming loop layer. This prepares our streaming system to support multicore when the OCaml compiler is mature enough to allow it. Clocks are now attached to sources via their clock methods. Returned value is a stripped down clock variable. Users can use the clock function to retrieve the full methods, e.g. s = sine(); c = clock(s.clock). This value has advanced functions for clock control such as start/stop, ticks and self_sync to check for self-sync. (#3781)
  • Allow frames duration shorter than one video frames, typically values under 0.04s. Smaller frames means less latency and memory consumption at the expense of a higher CPU usage (#3607)
  • Change default frame duration to 0.02s (#4033)
  • Optimized runtime (#3927, #3928, #3919)
  • Added NDI output support (#4181)
  • Added finally to execute code regardless of whether or not an exception is raised (see: #3895 for more details).
  • Added support for Spinitron submission API (#4158)
  • Removed gstreamer support. Gstreamer's architecture was never a good fit for us and created a huge maintenance and debugging burden and it had been marked as deprecated for a while. Most, if not all of its features should be available using ffmpeg. (#4036)
  • Removed taglib support. It is superseded by the internal ocaml-metadata module and taglib, with its dependency on the C++ runtime library, has been causing issues with binary builds portability and crashes with the (not yet supported) OCaml 5 compiler. (#4087)
  • Added video.canvas to make it possible to position video elements independently of the rendered video size (#3656, blog post)
  • Added cover manager from an original code by @vitoyucepi (#3651)
  • Added non-interleaved API to %ffmpeg encoder, enabled by default when only one stream is encoded.
  • Allow trailing commas in record definition (#3300).
  • Added metadata.getter.source.float (#3356).
  • BREAKING: Added duration and ticks to metadata available when computing HLS segment names (#4135)
  • Added optional main_playlist_writer to output.file.hls and derivated operator (#3484)
  • Added is_nan, is_infinite, ceil, floor, sign and round (#3407)
  • Added %track.drop to the %ffmpeg encoder to allow partial encoding of a source's available tracks (#3480)
  • Added let { foo? } = ... pattern matching (#3481)
  • Added metadata.replaygain method to extract unified replay gain value from metadata (#3438).
  • Added metadata.parse.amplify to manually parse amplify override metadata.
  • Added compute parameter to file.replaygain to control gain calculation (#3438).
  • Added compute parameter to enable_replaygain_metadata to control replay gain calculation (#3438).
  • Added copy: protocol (#3506)
  • Added file.touch.
  • Added support for sqlite databases (#3575).
  • Added string.of_int and string.spaces.
  • Added list.assoc.nullable.
  • Added source.cue (#3620).
  • Added string.chars (#4111)
  • Added atomic file write operations.
  • Added new macos_say speech synthesis protocol. Make it the default implementation for the say: protocol on macos.
  • Added settings.request.timeout to set the request timeout globally.

Changed:

  • Reimplemented request.once, single and more using source.dynamic. Removed experiment flag on source.dynamic. The operator is considered stable enough to define advanced sources but the user should be careful when using it.
  • Mute SDL startup messages (#2913).
  • int can optionally raises an error when passing nan or infinity, int(infinity) now returns max_int and int(-infinity) returns min_int. (#3407)
  • Made default font a setting (#3507)
  • Changed internal metadata format to be immutable (#3297).
  • Removed source.dump and source.drop in favor of safer request.dump and request.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_offset and dropped the metadata mechanism for updating it (#3355).
  • string.length and string.sub now default to utf8 encoding (#4109)
  • Disable output paging when TERM environment variable is not set.
  • Allow running as root user inside docker container by default (#3406).
  • Run check_next before playlist's requests resolutions (#3625)
  • Set force to true by default in file.copy to make operator behave as expected.
  • BREAKING: Float comparison now follows the expected specs, in particular: nan == x is always false and nan != x is always true. Use float.is_nan to test if a float is nan.
  • BREAKING: replaygain no longer takes ebu_r128 parameter (#3438).
  • BREAKING: assume replaygain_track_gain always stores volume in dB (#3438).
  • BREAKING: protocols can now check for nested static uri. Typically, this means that requests for an uri of the form: annotate:key="value",...:/path/to/file.mp3 is now considered infallible if /path/to/file.mp3 can be decoded.
  • Added parents option of file.mkdir (#3600, #3601).
  • Added forced_major_collections record field to the result of runtime.gc.stat() and runtime.gc.quick_stat() (#3783).
  • Changed the port for the built-in Prometheus exporter to 9599 (#3801).
  • Set segments_overheader in HLS outputs to disable segments cleanup altogether.
  • Added support for caching LV2 and LADSPA plugins (#3959).
  • Pulseaudio input and output now restart on pulseaudio errors (#4174).

Fixed:

  • 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_track and etc). (#3577)
  • Added script caching layer for faster script startup time. See: https://www.liquidsoap.info/blog/2024-06-13-a-faster-liquidsoap/ for details (#3924, #3949, #3959 and #3977)
  • Rewrote the clock/streaming loop layer. This prepares our streaming system to support multicore when the OCaml compiler is mature enough to allow it. Clocks are now attached to sources via their clock methods. Returned value is a stripped down clock variable. Users can use the clock function to retrieve the full methods, e.g. s = sine(); c = clock(s.clock). This value has advanced functions for clock control such as start/stop, ticks and self_sync to check for self-sync. (#3781)
  • Allow frames duration shorter than one video frames, typically values under 0.04s. Smaller frames means less latency and memory consumption at the expense of a higher CPU usage. (#3607)
  • Change default frame duration to 0.02s (#4033)
  • Optimized runtime (#3927, #3928, #3919)
  • Added finally to execute code regardless of whether or not an exception is raised (see: #3895 for more details).
  • Removed gstreamer support. Gstreamer's architecture was never a good fit for us and created a huge maintenance and debugging burden and it had been marked as deprecated for a while. Most, if not all of its features should be available using ffmpeg. (#4036)
  • Removed taglib support. It is superseded by the internal ocaml-metadata module and taglib, with its dependency on the C++ runtime library, has been causing issues with binary builds portability and crashes with the (not yet supported) OCaml 5 compiler. (#4087)
  • Added video.canvas to make it possible to position video elements independently of the rendered video size (#3656, blog post)
  • Added cover manager from an original code by @vitoyucepi (#3651)
  • Added non-interleaved API to %ffmpeg encoder, enabled by default when only one stream is encoded.
  • Allow trailing commas in record definition (#3300).
  • Added metadata.getter.source.float (#3356).
  • BREAKING: Added duration and ticks to metadata available when computing HLS segment names (#4135)
  • Added optional main_playlist_writer to output.file.hls and derivated operator (#3484)
  • Added is_nan, is_infinite, ceil, floor, sign and round (#3407)
  • Added %track.drop to the %ffmpeg encoder to allow partial encoding of a source's available tracks (#3480)
  • Added let { foo? } = ... pattern matching (#3481)
  • Added metadata.replaygain method to extract unified replay gain value from metadata (#3438).
  • Added metadata.parse.amplify to manually parse amplify override metadata.
  • Added compute parameter to file.replaygain to control gain calculation (#3438).
  • Added compute parameter to enable_replaygain_metadata to control replay gain calculation (#3438).
  • Added copy: protocol (#3506)
  • Added file.touch.
  • Added support for sqlite databases (#3575).
  • Added string.of_int and string.spaces.
  • Added list.assoc.nullable.
  • Added source.cue (#3620).
  • Added string.chars (#4111)
  • Added atomic file write operations.

Changed:

  • Mute SDL startup messages (#2913).
  • int can optionally raises an error when passing nan or infinity, int(infinity) now returns max_int and int(-infinity) returns min_int. (#3407)
  • Made default font a setting (#3507)
  • Changed internal metadata format to be immutable (#3297).
  • Allow a getter for the offset of on_offset and dropped the metadata mechanism for updating it (#3355).
  • string.length and string.sub now default to utf8 encoding (#4109)
  • Disable output paging when TERM environment variable is not set.
  • Allow running as root user inside docker container by default (#3406).
  • Run check_next before playlist's requests resolutions (#3625)
  • Set force to true by default in file.copy to make operator behave as expected.
  • BREAKING: Float comparison now follows the expected specs, in particular: nan == x is always false and nan != x is always true. Use float.is_nan to test if a float is nan.
  • BREAKING: replaygain no longer takes ebu_r128 parameter (#3438).
  • BREAKING: assume replaygain_track_gain always stores volume in dB (#3438).
  • Added parents option of file.mkdir (#3600, #3601).
  • Added forced_major_collections record field to the result of runtime.gc.stat() and runtime.gc.quick_stat() (#3783).
  • Changed the port for the built-in Prometheus exporter to 9599 (#3801).
  • Set segments_overheader in HLS outputs to disable segments cleanup altogether.
  • Added support for caching LV2 and LADSPA plugins (#3959).

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_track and 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.canvas to 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 %ffmpeg encoder, enabled by default when only one stream is encoded.
  • Allow trailing commas in record definition (#3300).
  • Add metadata.getter.source.float (#3356).
  • Added optional main_playlist_writer to output.file.hls and derivated operator (#3484)
  • Added is_nan, is_infinite, ceil, floor, sign and round (#3407)
  • Added %track.drop to the %ffmpeg encoder to allow partial encoding of a source's available tracks (#3480)
  • Added let { foo? } = ... pattern matching (#3481)
  • Add metadata.replaygain method to extract unified replay gain value from metadata (#3438).
  • Add compute parameter to file.replaygain to control gain calculation (#3438).
  • Add compute parameter to enable_replaygain_metadata to control replay gain calculation (#3438).
  • Add copy: protocol (#3506)
  • Add file.touch.
  • Add support for sqlite databases (#3575).
  • Add string.of_int and string.spaces.
  • Add list.assoc.nullable.
  • Add source.cue (#3620).
  • Added atomic file write operations.
  • Added file.cover.manager from an original code by @vitoyucepi (#3651)

Changed:

  • Mute SDL startup messages (#2913).
  • int can optionally raises an error when passing nan or infinity, int(infinity) now returns max_int and int(-infinity) returns min_int. (#3407)
  • Made default font a setting (#3507)
  • Changed internal metadata format to be immutable (#3297).
  • Allow a getter for the offset of on_offset and dropped the metadata mechanism for updating it (#3355).
  • Disable output paging when TERM environment variable is not set.
  • Allow running as root user inside docker container by default (#3406).
  • Run check_next before playlist's requests resolutions (#3625)
  • Set force to true by default in file.copy to make operator behave as expected.
  • BREAKING: Float comparison now follows the expected specs, in particular: nan == x is always false and nan != x is always true. Use float.is_nan to test if a float is nan.
  • BREAKING: replaygain no longer takes ebu_r128 parameter (#3438).
  • BREAKING: assume replaygain_track_gain always stores volume in dB (#3438).
  • Added parents option of file.mkdir (#3600, #3601).
  • Added forced_major_collections record field to the result of runtime.gc.stat() and runtime.gc.quick_stat() (#3783).
  • Changed the port for the built-in Prometheus exporter to 9599 (#3801).
  • Add support for caching LV2 and LADSPA plugins (#3959).

- 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_metadata and autocue: protocol to automatically compute cue points and crossfade parameters (#3753, #3811, @RM-FM and @Moonbase59)
  • Added various ffmpeg timestamps when exporting ffmpeg metadata from filters.
  • Added db_levels method to blank.* sources (#3790)
  • Added excluded_metadata_resolvers to request.create to make it possible to selectively disable specific metadata resolvers when resolving requests.
  • Normalized expected API from autocue, allow multiple implementation and adapt cross/crossfade to work with it out of the box with workaround for short tracks.
  • Added private and swapped memory reporting when compiled with mem_usage.
  • Added priorities to metadata deocoders, allows finer-control of metadata overriding. (#3887)

Changed:

  • Allow to disable http.* url normalization. Add warning when url normalization changes the url (#3789)
  • Add namespace and optional source IDs to mix.

Fixed:

  • Prevent request metadata from overriding root metadata (#3813)
  • Fixed source.drop and source.dump clock initialization.
  • Fixed bogus report of non-monotonous PTS content when using raw ffmpeg content.
  • Fixed streaming errors when disconnecting input.harbor.
  • Fixed issues with rendered id3v2 frame that contain binary data (#3817)
  • Fixed memory leaks with SRT listen socket polling callbacks.
  • Fixed %ffmpeg copy muxer logic with some audio/video streams (#3840)
  • Fixed duration metadata calculation in the presence of cue_in/cue_out metadata.

- 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 id3v2 metadata in output.*.hls when using %mp3, %shine or %fdkaac encoders (#3604)
  • Added option to set preferred address class (ipv4, ipv6 or system default) when resolving hostnames in http transports and output.icecast
  • Added self_sync option to input.srt to accommodate for streams in file mode (#3684)
  • Added curve parameter to fade functions and liq_fade_{in,skip,out}_curve metadata override (#3691)
  • Added delay parameter to fade functions to make it possible to add delay before fade happens. Add liq_fade_{in,skip,out}_delay metadata override.
  • Added single_track option to allow sequence to play each source until they are unavailable while keeping track marks.

Changed:

  • cue_cut operator has been removed. Cueing mechanisms have been moved to underlying file-based sources. See migration notes for more details.

Fixed:

  • Fix pop/click at the end of fade out/in (#3318)
  • Fix audio/video synchronization issues when decoding live streams using ffmpeg.
  • Fix issues with TLS connecting clients not being properly timed out (#3598)
  • Make sure reconnection errors are router through the regulat on_error callback in output.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 and request.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_telnet option to all outputs to prevent telnet commands registration (#3545)
  • Added file.touch

Changed:

  • BREAKING: setting.playlists has been renamed setting.playlist, settings.playlist.mime_types now refers to a full list of records (#3561)

Fixed:

  • Cleanup telnet commands on output shutdown, prevent commands registration for internal outputs (#3545, fixes: #3541)
  • Allow overwrite in youtube-dl/yt-dlp call, remove use of unix-specific process call. (#3563)
  • Fixed playlist parsers not being registered when evaluatin top-level script (#3553)
  • Fixed infinite loop on some active sources (#3560, fixes: #3544, and #3537)
  • Fixed fd leak on failed connection in srt caller mode (#3583)
  • Fixed high CPU usage on failed connection in srt caller mode (#3583, #3573)
  • Prevent outputs from keeping the last 10 cover metadata (#3504)

- 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.ffmpeg by default. Disable using trim_url=false (#3424)
  • Automatically add HLS-specific ffmpeg parameters to %ffmpeg encoder (#3483)
  • BREAKING: default on_fail removed on playlist (#3479)

Fixed:

  • Allow channel_layout argument in ffmpeg encoder to set the number of channels.
  • Improved support for unitary minus, fix runtime call of optional methods (#3498)
  • Fixed map.metadata mutating existing metadata.
  • Fixed reloading loop in playlists with invalid files (#3479)
  • Fixed main HLS playlist codecs when using mpegts (#3483)
  • Fixed pop/clicks in crossfade and source with caching (#3318)
  • Fixed pop/clicks when resampling using libsamplerate (#3429)
  • Fixed gstreamer compilation. Remember that gstreamer features are DEPRECATED! (#3459)
  • Fixed html character escaping in interactive.harbor (#3418, @ghostnumber7)
  • Fixed icecast not reconnecting after erroring out while closing connection in some circumstances (#3427)
  • Fixed parse-only mode (#3423)
  • Fixed ffmpeg decoding failing on files with unknown codecs.
  • Fixed a crash due to wait_until timestamp being in the past when using posix-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_change events are now "created", "updated" and "deleted", to better reflect the new atomic file operations (#3284)
  • Added compact argument to the http.response.json function. http.response.json will produce minified JSON by default. Added a newline symbol to the end of the JSON data produced by http.response.json. (#3299)
  • Bumped internal ogg decoder to make sure that it is used over the ffmpeg decoder whenever possible. FFmpeg has issues with metadata in chained streams which needs to be fixed upstream. Unfortunately, input.http can only use the ffmpeg decoder at the moment.
  • Cleanup output.file encoding and file handling logic (#3328)
  • Added ratio to source.{dump,drop} to make it possible to control its CPU peaks.
  • Enhanced clock error reporting (#3317)

Fixed:

  • Fixed slow memory leak in muxer operator (#3372, #3181, #3334)
  • Fixed discontinuity logic error in HLS outputs after a restart.
  • Fixed HTTP response status in output.harbor (#3255)
  • Make sure main HLS playlist is regenerated after being unlinked (#3275)
  • Fixed hard crash on icecast disconnection errors.
  • Fix output.harbor encoder header when encoding with %ogg, %vorbis and etc. (#3276)
  • Fixed quality argument parsing in ffmpeg encoders (#3267)
  • Make all HLS file write atomic (#3284)
  • Allow seek and cue operators to work with muxed sources using a single underlying source (#3252)
  • Fixed export of cover art metadata (#3279)
  • Remove use of stereo: protocol in say: protocol: this is now handled automatically by the decoder and generates latency via high CPU usage peak.
  • Fixed output.file reopening with flac encoding (#3328)

- 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 ` - ` when available, otherwise `artist` or `title` if available, otherwise `null`, meaning don't add the metadata. - Cleanup, removed parameters that were irrelevant to each operator, i.e. `icy_id` in `output.icecast` and etc. - Make `mount` mandatory and `name` nullable. Use `mount` as `name` when `name` is `null`. - `reopen_on_error` and `reopen_on_metadata` in `output.file` and related operators are now callbacks to allow dynamic handling. - Added `reopen` method to `output.file`. - Added support for a Javascript build an interpreter. - Removed support for `%define` variables, superseded by support for actual variables in encoders. - Cancel pending append when skipping current track on `append` source. - Errors now report proper stack trace via their `trace` method, making it possible to programmatically point to file, line and character offsets of each step in the error call trace (#2712) - Reimplemented `harbor` http handler API to be more flexible. Added a new node/express-like registration and middleware API (#2599). - Switched default persistence for cross and fade-related overrides to follow documented behavior. By default, `"liq_fade_out"`, `"liq_fade_skip"`, `"liq_fade_in"`, `"liq_cross_duration"` and `"liq_fade_type"` now all reset on new tracks. Use `persist_overrides` to revert to previous behavior (`persist_override` for `cross`/`crossfade`) (#2488). - Allow running as root by default when docker container can be detected using the presence of a `/.dockerenv` file. - `id3v2` argument of `%mp3` encoder changed to `"none"` or version number to allow to choose the metadata version. `true` is still accepted and defaults to version `3`. Switched to our internal implementation so that it does not require `taglib` anymore. - Moved HLS outputs stream info as optional methods on their respective encoder. - Changed `self_sync` in `input.ffmpeg` to be a boolean getter, changed `self_sync` in `input.http` to be a nullable boolean getter. Set `self_sync` to `true` in `input.http` when an icecast or shoutcast server can be detected. - Add `sorted` option to `file.ls`. - Add `buffer_length` method to `input.external.rawaudio` and `input.external.wav` (#2612). - Added full `OCaml` backtrace as `trace` to runtime errors returned from OCaml code. - Removed confusing `let json.stringify` in favor of `json.stringify()`. - Font, font size and colors are now getters for text operators (`video.text`, `video.add_text`, etc.) (#2623). - Add `on_cycle` option to `video.add_text` to register a handler when cycling (#2621). - Renamed `{get,set}env` into `environment.{get,set}` - Renamed `add_decoder`, `add_oblivious_decoder` and `add_metadata_resolver` into, respectively, `decoder.add`, `decoder.oblivious.add`, `decoder.metadata.add` - Deprecated `get_mime`, added `file.mime.libmagic` and `file.mime.cli`, made `file.mime` try `file.mime.libmagic` if present and `file.mime.cli` otherwise, changed eturned value when no mime was found to `null()`. - Return a nullable float in `request.duration`. - Removed `--list-plugins-json` and `--list-plugins-xml` options. - Added `--list-functions-json` option. - Removed built-in use of `strftime` conversions in output filenames, replaced by an explicit call to `time.string` (#2593) - Added nullable default to `{int,float,bool}_of_string` conversion functions, raise an exception if conversion fails and no default is given. - The camomile library for charset conversion is now optional (#2696). - Deprecated `string_of` in favor of `string` (#2700). - Deprecated `string_of_float` in favor of `string.float` (#2700). - Added `settings.protocol.youtube_dl.timeout` to specify timeout when using `youtube-dl` protocol (#2827). Use `yt-dlp` as default binary for the protocol. - The `sleeper` operator is now scripted (#2899). - Reworked remote request file extension resolution (#2947) - REMOVED `osx-secure-transport`. Doubt it was ever used, API deprecated upstream (#3067) - Renamed `rectangle` to `add_rectangle`, and similarly for `line`. Fixed: - The randomization function `list.shuffle` used in `playlist` was incorrect and could lead to incorrectly randomized playlists (#2507, #2500). - Fixed srt output in listener mode to allow more than one listener at a time and prevent listening socket from being re-created on listener disconnection (#2556) - Fixed race condition when switching `input.ffmpeg`-based urls (#2956) - Fixed deadlock in `%external` encoder (#3029) - Fixed crash in encoders due to concurrent access (#3064) - Fixed long-term connection issues with SSL (#3067) </details> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 3 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134597"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/rolling-release-v2.2.x">Liquidsoap Rolling Release 2.2.x</a> </h5> <p class="card-text"> <p>This release provides liquidsoap assets before they are published as a new versioned release.</p> <p>You can use it to install the latest stable code before it is published and test/prepare your production environment for it.</p> <p>Rolling releases can also be useful for us to quickly detect and report bugs before the final published release!</p> <p>⚠️ <strong>Warning</strong> ⚠️ 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</p> <p>For more details about our release process, please checkout https://github.com/savonet/liquidsoap#release-details</p> <h1>2.2.1 (unreleased)</h1> <p>Changed:</p> <ul> <li>BREAKING: on HLS outputs, <code>on_file_change</code> events are now <code>"created"</code>, <code>"updated"</code> and <code>"deleted"</code>, to better reflect the new atomic file operations (#3284)</li> <li>Added <code>compact</code> argument to the <code>http.response.json</code> function. <code>http.response.json</code> will produce minified JSON by default. Added a newline symbol to the end of the JSON data produced by <code>http.response.json</code>. (#3299)</li> <li>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, <code>input.http</code> can only use the ffmpeg decoder at the moment.</li> <li>Cleanup <code>output.file</code> encoding and file handling logic (#3328)</li> <li>Added <code>ratio</code> to <code>source.{dump,drop}</code> to make it possible to control its CPU peaks.</li> <li>Enhanced clock error reporting (#3317)</li> </ul> <p>Fixed:</p> <ul> <li>Fixed slow memory leak in muxer operator (#3372, #3181)</li> <li>Fixed discontinuity logic error in HLS outputs after a restart.</li> <li>Fixed HTTP response status in <code>output.harbor</code> (#3255)</li> <li>Make sure main HLS playlist is regenerated after being unlinked (#3275)</li> <li>Fixed hard crash on icecast disconnection errors.</li> <li>Fix <code>output.harbor</code> encoder header when encoding with <code>%ogg</code>, <code>%vorbis</code> and etc. (#3276)</li> <li>Fixed quality argument parsing in ffmpeg encoders (#3267)</li> <li>Make all HLS file write atomic (#3284)</li> <li>Allow seek and cue operators to work with muxed sources using a single underlying source (#3252)</li> <li>Fixed export of cover art metadata (#3279)</li> <li>Remove use of <code>stereo:</code> protocol in <code>say:</code> protocol: this is now handled automatically by the decoder and generates latency via high CPU usage peak.</li> <li>Fixed <code>output.file</code> reopening with flac encoding (#3328)</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 3 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134598"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.1.4">Liquidsoap 2.1.4</a> </h5> <p class="card-text"> <p>This is the fourth follow-up release for the liquidsoap <code>2.1.x</code> release cycle!</p> <p><img src="https://user-images.githubusercontent.com/871060/222461762-63f4d0c6-94e2-458c-9dc0-22273082bde4.gif" alt="giphy"></p> <p>This release brings more bugfix and stability to liquidsoap <code>2.1.x</code> users with a couple of new features as well.</p> <p>New features are: * More logging around streaming exceptions to help diagnostics of hard failures while streaming * Support for <code>umask</code> to bring the full unix/posix file/directory permissions control the way everyone's used to * Added <code>buffer_length</code> method to buffers to help report and monitor buffer user (overrun/underrun, slow drain etc.)</p> <p>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!</p> <p>We expect this release to be the last of the <code>2.1.x</code> release cycle. The current development branch is about to be forked as <code>rolling-release-v2.2.x</code> and we should begin the stabilization process to bring that branch to a releasable state. There might still be bugfix releases on the <code>2.1.x</code> branch but only for critical issues.</p> <p>Thanks for all y'all continuing use of liquidsoap!</p> <h3>Full Changelog:</h3> <h1>2.1.4 (2022-03-02)</h1> <p>New: * Added <code>buffer_length</code> method to <code>buffer</code> operator. * Always display error backtrace when a fatal exception is raised in the streaming loop. * Added <code>umask()</code> to get the current <code>umask</code> and <code>umask.set(...)</code> to set the current <code>umask</code> (#2840)</p> <p>Changed: * Add break when restarting the external process in <code>input.external.{rawaudio,rawvideo}</code> (#2860, #2872) * Removed <code>disconnect</code> method on <code>input.harbor</code>. This method was doing the same as the <code>stop</code> method. Added <code>shutdown</code> method to properly shutdown the source even when not connected to an output. * Made process a string getter in <code>input.external.{rawaudio,rawvideo}</code> (#2877)</p> <p>Fixed: * Fixed parameter type for <code>stats_interval</code> 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 <code>request.dynamic</code> never crash the process (#2897) * Fixed <code>filename</code> getter being called multiple time in <code>output.file</code> (#2842) * Space trim in interactive variables set on telnet (#2785) * Fixed internal streaming logic in <code>max_duration</code> and <code>crossfade</code>. * Make sure that there's at most one metadata at any given frame position (#2786) * Fixed <code>metadata.json.parse</code> always returns an empty list (#2816). * Fixed <code>icy_id</code> being ignored in <code>output.shoutcast</code> (#2819) * Fixed shutdown livelock with some ffmpeg inline encoder, decoder and filter operators. * Fixed input polling stop (#2769) * Fixed parsed error report in <code>%include</code> directives (#2775) * Fixed crash in external processes when received a <code>Unix.EINTR</code> event (#2861) * Fixed crash in <code>string.interpolate</code> (#2883) * Cleaned up srt support.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] about 3 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134599"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.1.3">Liquidsoap 2.1.3</a> </h5> <p class="card-text"> <p>This is the third and, hopefully, last bug fix release for the <code>2.1.x</code> release branch!</p> <p>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 <code>portaudio</code> devices and some enhancements in <code>input.harbor</code> dynamic capabilities.</p> <p>Anyone on one of the <code>2.1.x</code> releases should be able to upgrade safely to this version.</p> <h1>2.1.3 (2022-11-04)</h1> <p>New: * Added <code>time.string</code>. * Added <code>error.on_error</code> to report any error raised during the script's execution. Enhanced reported error positions (#2712) * Added <code>device_id</code> and <code>latency</code> options to <code>input.portaudio</code> and <code>output.portaudio</code> to be able to choose the requested device. Use <code>liquidsoap --list-portaudio-devices</code> to see the list of devices (#2733) * Added <code>disconnect</code> method to <code>input.harbor</code>, making it possible to disconnect a source client programmatically, including when a new client is trying to connect.</p> <p>Changed: * Send data in-memory in <code>http.{post,put}.file</code> when input data is already in memory. This allows to use plain <code>Content-Length</code> instead of <code>chunked</code> transfer encoding in these case, though <code>libcurl</code> seems to always prefer <code>chunked</code> encoding for <code>put</code> 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 <code>perms</code> permission argument (#2725) * Removed <code>restart_on_error</code> argument on <code>output.url</code> and added <code>restart_delay</code> which implements a delayed restart. Added <code>on_error</code> argument to be notified of errors (#2731) * Changed default <code>encoding</code> parameter in <code>string.{quote, escape}</code> to be <code>null</code>. Fallback to <code>"ascii"</code> encoding when no encoding is specified and <code>"utf8"</code> fails. This prevents unexpected script failures but might not be backward-compatible if you used a custom <code>escape_char</code> or <code>special_char</code> function (#2738)</p> <p>Fixed: * Enhanced methods typing support (#2659) * Add support for <code>song</code> metadata (mapped to <code>title</code>) and <code>url</code> (mapped to <code>metadata_url</code>) in <code>input.harbor</code> (#2676) * Fixed <code>blank.*</code> operator types. * Fixed request metadata escaping (#2732) * Fixed <code>input.external.rawadudio</code> mono input (#2742) * Fixed <code>http</code> response body on redirect (#2758)</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 3 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134600"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.1.2">Liquidsoap 2.1.2</a> </h5> <p class="card-text"> <p>This is the second follow-up release for the <code>v2.1.x</code> branch featuring bugfixes, updates and some new features! </p> <p>Noticeable API changes: * <code>http.{post,put}.file</code> 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: <code>ruby settings.decoder.file_extensions.taglib.set(["mp3"]) </code></p> <p>Other than that, this release should bring more stability to your script so go for it. After some testings, as always! 🙂</p> <h1>2.1.2 (2022-09-26)</h1> <p>New: * Added <code>string.char</code>, <code>string.getter.flush</code> and <code>string.getter.concat</code>. * Added <code>http.multipart_form_data</code> and <code>http.{post,put}.file</code>.</p> <p>Changed: * Allow sub-second values in <code>sleep()</code> (#2610) * Allowed many new format for <code>taglib</code> (#2605) * Add <code>settings.ffmpeg.content.copy.relaxed_compatibility_check.set</code> 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.</p> <p>Fixed: * Stop error loop when opening a listening ssl socket with non-existent certificate. (#2590) * Youtube HLS upload for live streams. * Fixed <code>data:...</code> uri scheme to conform to RFC 2397 (#2491) * Fixed multiple issues related to empty <code>ogg/opus</code> metadata (#2605) * Ensure that <code>video.add_text</code> fails when the source does (#2609) * Fixed metadata parsing in <code>server.insert_metadata</code> (#2619) * Fixed <code>extract_replaygain</code> path (#2624, @parnikkapore) * Fixed crash when terminating the process (#2585) * Fixed channels conversion when using <code>input.rawaudio</code> (#2602) * Fixed memory leak when using ffmpeg streams (<code>input.ffmpeg</code>, <code>input.http</code>, ...)</p> <p>Internal Change: * <code>ref()</code> implementation switched to OCaml's <code>Atomic</code> to prevent race conditions, <code>thread.mutexify</code> and <code>mutexify</code> functions removed. (#2603)</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 3 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134601"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.1.1">Liquidsoap 2.1.1</a> </h5> <p class="card-text"> <p>This is the first bugfix release of the <code>v2.1.x</code> release cycle, fixing some minor and less-minor issues. So far, the release cycle seems to be holding up fairly well!</p> <p>Worth noting: - <code>ocurl</code> is now a mandatory dependency. Its functionalities, support for <code>http.{get,put,post,..}</code> providing, among other things, remote requests resolution, were already expected by most users. - Windows build for <code>v2.1.0</code> did not have the <code>ffmpeg</code> encoders and decoders enabled.. 🤦‍♂️ - <code>playlist.next</code> now returns the requests in the right order. This could be breaking some existing scripts! - <code>playlist.remaining</code> has been renamed into <code>playlist.remaining_files</code>. This could be breaking some existing scripts!</p> <p>Full changelog:</p> <h1>2.1.1 (2022-08-28)</h1> <p>New: - Added <code>process.quote.command</code> to generate complex quoted command strings suitable for use with <code>process.run</code> and os-independent.</p> <p>Changed:</p> <ul> <li>Renamed <code>playlist.remaining</code> into <code>playlist.remaining_files</code> (#2524)</li> <li>Added <code>id</code> argument to <code>replaygain</code> operator (#2537).</li> <li>Made <code>ocurl</code> dependency required, added <code>uri</code> as required dependency (#2551)</li> </ul> <p>Fixed:</p> <ul> <li>Fixed missing ffmpeg features on windows build.</li> <li>Fixed sync issues with <code>ffmpeg.encode.*</code> inline encoders (#2584)</li> <li>Fixed <code>http.get</code> issues when <code>user-agent</code> was not set (#2517)</li> <li>Fixed order of <code>playlist.next</code> returned requests.</li> <li>Fixed infinite loop when reloading a failed playlist (#2576)</li> <li>Fixed http requests with urls containing spaces (#2551)</li> <li>Fixed <code>on_connect</code> type for <code>srt</code> inputs and outputs.</li> <li>Fixed parsing issues with functions/variables definitions beginning with <code>rec</code> or <code>replaces</code> (#2560)</li> <li>Fixed infinite parse error loop (#2527)</li> <li>Fixed empty initial <code>mp4</code> HLS segment.</li> <li>Prevent initial start for autostart and fallible sources.</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134602"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.1.0">Liquidsoap 2.1.0</a> </h5> <p class="card-text"> <p>This is the first release of the <code>2.1.x</code> release branch! 🎉</p> <p>This version comes with some major improvements and breaking changes. As usual, you can get a (mostly) complete list in the <a href="https://www.liquidsoap.info/doc-dev/migrating.html">migration page</a></p> <p>In particular, the following changes are noticeable:</p> <h3>JSON parsing is greatly improved</h3> <p>You should now be able to do: <code>ruby let json.parse ({ foo, bla, gni } : { foo: string, bla: float, gni: bool }) = '{ "foo": "aabbcc", "bla": 3.14, "gni": true }' </code> 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 <a href="https://www.liquidsoap.info/doc-dev/json.html">here</a></p> <h3>Partial function application has been removed.</h3> <p>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:</p> <p>```ruby def f(x, y) = ... end</p> <p>g = f(0) ```</p> <p>You will now have to do:</p> <p>```ruby def f(x, y) = ... end</p> <p>def g(y) = f(0, y) end ```</p> <h3>Regular expressions are now first-class entities.</h3> <p>This should be familiar to anyone used to working with Javascript's regular expression. So, now, instead of doing:</p> <p><code>ruby string.match(pattern="\\d+", s) </code></p> <p>You will now do:</p> <p><code>ruby r/\d+/.test(s) </code></p> <p>There's a detailed description of this new feature <a href="https://www.liquidsoap.info/doc-dev/language.html#regular_expressions">here</a>.</p> <h3>Full Changelog:</h3> <h1>2.1.0 (2022-07-15)</h1> <p>New:</p> <ul> <li>Added support for variables in encoders (#1858)</li> <li>Added support for regular expressions (#1881)</li> <li>Added generalized support for value extraction patterns (#1970)</li> <li>Added support for string getter for <code>http.{post,put}</code> operations (#1984)</li> <li>Added <code>output.youtube.live.hls</code></li> <li>Rewrote out internal JSON parser/renderer (#2011). <strong>Breaking change</strong> values that cannot be represented as <code>JSON</code> will now raise <code>error.json</code> when converted to <code>JSON</code>. <code>infinite</code> and <code>nan</code> floats can be exported using the <code>json5</code> export format.</li> <li>Added socket API (#2014).</li> <li>Added support for ffmpeg bitstream filters (#2387)</li> <li>Added <code>liquidsoap.version.at_least</code>.</li> <li>Added <code>video.rectangle</code>, <code>video.persistence</code>.</li> <li>Added <code>video.vumeter</code>.</li> <li>Added <code>video.slideshow</code>.</li> <li>Added <code>video.add_text.camlimages</code> (#2202).</li> <li>Added <code>video.text.*</code> and re-implemented <code>video.add_text.*</code> from those (#2226).</li> <li>Added <code>irc.channel</code> operator to retrieve the contents of an IRC channel (#2210).</li> <li>Added new in-house parsing of metadata for some image and video formats (#2236).</li> <li>Added <code>file.download</code></li> <li>Added new options for <code>%ffmpeg</code> copy encoder: <code>ignore_keyframes</code> and <code>wait_for_keyframe</code> (#2382)</li> </ul> <p>Changed:</p> <ul> <li>Removed support for partial application, which should avoid some type errors, improve performance and simplifies the code related to the reduction (#2204).</li> <li>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 <code> s = (single("file.mp4") : source(video(width=300,height=200))) </code> in order to force the decoding of a file to be performed at the 300×200 resolution (#2212).</li> <li>Video images are now <em>canvas</em>, 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)</li> <li><code>output.youtube.live</code> renamed <code>output.youtube.live.rtmp</code>, remove <code>bitrate</code> and <code>quality</code> arguments and added a single encoder argument to allow stream copy and more.</li> <li><code>source.on_metadata</code> and <code>source.on_track</code> now return a source as this was the case in previous versions, and associated handlers are triggered only when the returned source is pulled (#2103).</li> <li>Made <code>streams_info</code> parameter of <code>output.file.hls</code> a record (#2173).</li> <li>Disable scrolling by default in <code>video.add_text</code>. You can re-enable it by using <code>video.add_text(speed=70, ...)</code>.</li> <li>Added "example" sections to operators documentation, we now need to populate those (#2227).</li> <li>Default implementation of <code>video.testsrc</code> is now builtin, previous implementation can be found under <code>video.testsrc.ffmpeg</code>.</li> <li>Images can now generate blank audio if needed, no need to add <code>mux_audio(audio=blank(),image)</code> anymore (#2230).</li> <li>Removed deprecated <code>timeout</code> argument in <code>http.*</code> operators.</li> <li>Deprecated <code>request.ready</code> in favor of <code>request.resolved</code>.</li> </ul> <p>Fixed:</p> <ul> <li>Fixed typo in <code>status</code> command of the <code>mix</code> operator.</li> <li>Fixed performances issues with <code>input.ffmpeg</code> and <code>input.http</code> (#2475)</li> <li>Fixed <code>list.shuffle</code> which was used to randomize playlists in <code>playlist</code> operator (#2507, #2500).</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134603"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.7">Liquidsoap 2.0.7</a> </h5> <p class="card-text"> <p>This is the seventh bugfix release of the <code>2.0.x</code> 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 <code>ocaml-opus</code> but we also had to release new binary assets. * An inefficient initialization of decoding buffer and samplerate converters</p> <p>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.</p> <p>The initial <code>2.1.0</code> liquidsoap release was also produced as a companion release to this one. All users are now advise to start exploring the <code>2.1.x</code> release branch as we expect most if not all bug fixes to be only applied on this branch.</p> <p>Happy liquidsoap hacking!</p> <h1>2.0.7 (2022-07-15)</h1> <p>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)</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134604"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.6">Liquidsoap 2.0.6</a> </h5> <p class="card-text"> <p>This is the 6th and last bugfix release for the <code>2.0.x</code> branch. Following this release, the <code>2.0.x</code> development branch will only be updated on a best-effort basis. New projects are now advised to work with the <code>rolling-release-v2.1.x</code> branch, will is set to be the next stable release.</p> <p>This release contains a set of minor fixes. Production scripts using any <code>2.0.x</code> version are advised to switch to it but, still, after testing that there is no unforeseen regression.</p> <p>A lot of effort has been put into debugging memory-releated issues with regard to requests. If your script uses a lot of requests (<code>playlist</code>, <code>request.dynamic</code> etc.) you should benefit from upgrading to this version.</p> <p>Full changelog:</p> <h1>2.0.6 (2022-06-20)</h1> <p>New: * Added <code>video/mp4</code> to list of recognized mime types for request resolutions.</p> <p>Changed: * Log errors when using <code>process.read</code> (##2420, @martinkirch)</p> <p>Fixed: * Memory leak when executing <code>process.run</code> (#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 <code>playlist</code> operator. * Make sure requests are always cleaned up, making <code>request.destroy</code> calls optionals.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134605"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/rolling-release-v2.1.x">Liquidsoap Rolling Release 2.1.x</a> </h5> <p class="card-text"> <p>This release provides liquidsoap assets before they are published as a new versioned release.</p> <p>You can use it to install the latest stable code before it is published and test/prepare your production environment for it.</p> <p>Rolling releases can also be useful for us to quickly detect and report bugs before the final published release!</p> <p>⚠️ <strong>Warning</strong> ⚠️ 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</p> <p>For more details about our release process, please checkout https://github.com/savonet/liquidsoap#release-details</p> <h1>2.1.x (rolling-release)</h1> <p>Fixed: * Fixed non-monotonous PTS in ffmpeg raw content (#2978) * Fixed external encoder (#3020) * Fixed deadlock in <code>%external</code> encoder (#3029)</p> <h1>2.1.4 (2022-03-01)</h1> <p>New: * Added <code>buffer_length</code> method to <code>buffer</code> operator. * Always display error backtrace when a fatal exception is raised in the streaming loop. * Added <code>umask()</code> to get the current <code>umask</code> and <code>umask.set(...)</code> to set the current <code>umask</code> (#2840)</p> <p>Changed: * Add break when restarting the external process in <code>input.external.{rawaudio,rawvideo}</code> (#2860, #2872) * Removed <code>disconnect</code> method on <code>input.harbor</code>. This method was doing the same as the <code>stop</code> method. Added <code>shutdown</code> method to properly shutdown the source even when not connected to an output. * Made process a string getter in <code>input.external.{rawaudio,rawvideo}</code> (#2877)</p> <p>Fixed: * Fixed parameter type for <code>stats_interval</code> 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 <code>request.dynamic</code> never crash the process (#2897) * Fixed <code>filename</code> getter being called multiple time in <code>output.file</code> (#2842) * Fixed default directory permissions in <code>output.*.hls</code> operators (#2930) * Space trim in interactive variables set on telnet (#2785) * Fixed internal streaming logic in <code>max_duration</code> and <code>crossfade</code>. * Make sure that there's at most one metadata at any given frame position (#2786) * Fixed <code>metadata.json.parse</code> always returns an empty list (#2816). * Fixed <code>icy_id</code> being ignored in <code>output.shoutcast</code> (#2819) * Fixed shutdown livelock with some ffmpeg inline encoder, decoder and filter operators. * Fixed input polling stop (#2769) * Fixed parsed error report in <code>%include</code> directives (#2775) * Fixed crash in external processes when received a <code>Unix.EINTR</code> event (#2861) * Fixed crash in <code>string.interpolate</code> (#2883) * Cleaned up srt support.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] about 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134606"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.5">Liquidsoap 2.0.5</a> </h5> <p class="card-text"> <p>This is the 5th bugfix release of the <code>2.0.x</code> branch, fixing mostly minor issues. This is also the last stable release on this branch as <code>2.1.x</code> is expected to be the next stable release cycle.</p> <h1>2.0.5 (24-05-2022)</h1> <p>New: * Extended m3u EXTINF parser to support empty duration and annotations.</p> <p>Changed: * Brought back <code>mix</code> operator (#2401)</p> <p>Fixed: * Allow crossfade duration override of <code>0.</code> * 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, <code>soundtouch</code>, <code>resample</code> and all the muxing operators. * Raise runtime exceptions in <code>string.replace</code> failures with useful message. (#2408) * Prevent <code>request.dynamic</code> from raising exceptions when checking if the source is ready (#2381)</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] about 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134607"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/rolling-release-v2.0.x">Liquidsoap 2.0.x rolling release</a> </h5> <p class="card-text"> <p>This release provides liquidsoap assets before they are published as a new versioned release.</p> <p>You can use it to install the latest stable code before it is published and test/prepare your production environment for it.</p> <p>Rolling releases can also be useful for us to quickly detect and report bugs before the final published release!</p> <p>⚠️ <strong>Warning</strong> ⚠️ 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</p> <p>For more details about our release process, please checkout https://github.com/savonet/liquidsoap#release-details</p> <h1>2.0.x (permanent rolling release)</h1> <p>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 <code>2.1.x</code> development branch for all new liquidsoap work.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] about 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134608"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.4">Liquidsoap 2.0.4</a> </h5> <p class="card-text"> <p>Release <code>2.0.4</code> is mostly focused on CPU and memory optimization. As <code>2.0.x</code> was getting adopted, we started receiving reports of increased CPU and memory usage compared to <code>1.4.4</code>. 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 <code>ffmpeg</code> 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 <code>OCaml</code> native float array to <code>Bigarrays</code> holding C arrays of floats. However, performances when accessing <code>Bigarray</code> float data in our audio filters written in OCaml were problematic.</p> <p>These two issues have been fixed and we've been able to observe performances on-par with liquidsoap <code>1.4.4</code> for this release.</p> <p>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.</p> <p>The other breaking change for this release is related to source <code>shutdown</code> 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.</p> <p>While this release should be, for the most part, functionally equivalent to any previous <code>2.0.x</code> 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.</p> <p>Full changelog for this release:</p> <p><strong>Liquidsoap 2.0.4 (04-23-2022)</strong></p> <p>New: * Added <code>settings.video.add_text</code> to enforce consistent choice of <code>video.add_text</code> implementation (#2302)</p> <p>Changed: * Make sure source shutdown can only be called on sources that can actually be shutdown: - Remove generic <code>source.shutdown</code> - Keep <code>s.shutdown()</code> 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 <code>map_metadata</code> into <code>metadata.map</code>, deprecated <code>map_metadata</code>. * Deprecatdd <code>list.mem_assoc</code> * Enhanced remaining time when using <code>add</code> (#2255) * Added <code>timeout_ms</code> to <code>http.*</code> to provide time in milliseconds, deprecated <code>timeout</code> argument. * Connect <code>output.icecast</code> when data is available instead of when operator starts to avoid useless connections when underlying source fails immediately.</p> <p>Fixed: * Prevent infinite loops when crossfade duration is negative (#2287) * Prevent mutex deadlock when recursively locking mutexes (#2274) * Mark method <code>add()</code> as internal in <code>request.queue</code>, fix method <code>length()</code> (#2274) * Fixed <code>retry_delay</code> being ignored in some cases in <code>request.dynamic</code>. * 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 <code>video.add_text.ffmpeg</code> as possible implementation for <code>video.add_text</code> (#2302) * Fixed <code>http.*</code> calls preventing liquidsoap from shutting down. * Fixed <code>http</code> protocol not returning an error when timing out (#2242) * Reworked ffmpeg filters feeding mechanism. * Fixed inconsistencies in <code>playlist.parser</code> (#2257) * Fixed inconsistent reselect in <code>rotate</code> (#2300) * Fixed special characters escaping in <code>video.add_text.ffmpeg</code> (#2324) * Fixed <code>input.rawaudio</code> and <code>input.rawvideo</code> when handling non-stereo content.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] about 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134609"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.3">Liquidsoap 2.0.3</a> </h5> <p class="card-text"> <p><img src="https://user-images.githubusercontent.com/871060/153687681-3929c568-ce90-4a8f-b004-5346b241d8d6.gif" alt="giphy"></p> <p>This is the third Liquidsoap bugfix release of the <code>2.0.x</code> 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 <code>2.0.x</code> features and we're happy to see adoption expanding and users reporting issues and usages that are more and more specialized.</p> <p>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 <a href="https://github.com/savonet/liquidsoap/issues/2146#issuecomment-1026280833">here</a> and <a href="https://github.com/AzuraCast/AzuraCast/issues/5010#issuecomment-1030131029">here</a> * The default <code>buffer</code> size for <code>input.harbor</code> has been increased to <code>12s</code> to make it possible to use it with <code>crossfade</code> 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 <a href="https://github.com/savonet/liquidsoap/discussions/2179">here</a>. Make sure to check out this link if you are using <code>time.utc()</code> or <code>time.now()</code> * 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</p> <p>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!</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134610"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.2">Liquidsoap 2.0.2</a> </h5> <p class="card-text"> <p>This is the second bugfix release of the liquidsoap <code>2.0.x</code> branch. It contains important fixes and a couple of enhancements. Update is recommended with a little bit of testing before. </p> <p>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 <code>last_metadata</code> of a source, which can be used to make transitions between sources easier.</p> <p>Noticeable bug fixes are: * Fixed a segfault in <code>ocaml-lame</code>. Make sure to install version <code>0.3.5</code> * Fixed a memory leak when using muxing operators. * Fixed last metadata not showing up in some switches or fallback * Fixed <code>input.rtmp</code> deadlocking on shutdown * Fixed <code>%ffmpeg</code> copy encoder crashing when switching sources.</p> <p>We believe that this release is bringing liquidsoap <code>2.0.x</code> 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.</p> <p>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!</p> <p>Full Changelog:</p> <h1>2.0.2 (28-12-2021)</h1> <p>New: * Show code excerpts on errors (#2086) * Added <code>on_get_ready</code> callback to sources, to be executed after a source's has initialized. * Added <code>flush_and_skip</code> telnet command to <code>request.dynamic</code> to empty the request's queue before skipping the current track, forcing a full reload. * Added <code>last_metadata</code> method on sources to return the last metadata produced by the source.</p> <p>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 <code>input.rtmp</code> (#2089) * Add timeout to srt operations (#2082) * Fixed <code>request.queue</code> <code>queue</code> 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 <code>replay_metadata</code> not replaying metadata from active sources (#2109)</p> <p><strong>Note:</strong> For source compilation, please use the <code>liquidsoap-2.0.2-1.tar.bz2</code> tarball. The <code>liquidsoap-2.0.2.tar.bz2</code> tarball will be replaced by this one shortly.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134611"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.1">Liquidsoap 2.0.1</a> </h5> <p class="card-text"> <p>Just a couple of days shy of the 2 months mark since the first Liquidsoap <code>2.x</code>, we are please to release the first <code>2.0.1</code> bug fix release from this branch!</p> <p>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 <code>ffmpeg</code> 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.</p> <p>We recommend upgrading to this version from <code>2.0.0</code> and believe that it should be pretty safe to do so.</p> <h3>Changelog:</h3> <p>New: * Added <code>time.predicate</code> to parse time predicates at runtime. * Added support for ffmpeg filter commands, unify <code>video.add_text.ffmpeg</code> with other operators, make it the default when available. (#2050)</p> <p>Changed: * Removed <code>encode_metadata</code> option in <code>input.file.hls</code> as it does nothing with the main encoder for HLS format, <code>%ffmpeg</code> (#2023) * Converted <code>output.icecast</code> optional parameters to <code>nullable</code>.</p> <p>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 <code>string.escape</code> fails. (#2010) * Account for internal caching in <code>request.dynamic.list</code>'s <code>queue</code> and <code>set_queue</code> methods. * Keep buffering for crossfade when new source has track mark but is still ready. * Added missing output <code>start</code>/<code>stop</code> commands. * Fixed <code>perms</code>, <code>dir_perms</code> and <code>append</code> 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 <code>process.quote</code> in process calls (#2031)</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134612"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.0">Liquidsoap 2.0.0</a> </h5> <p class="card-text"> <p>It is with great excitement and some ~2 years of anticipation that we have the pleasure to announce the release of <strong>Liquidsoap 2.0.0</strong>!</p> <p><img src="https://user-images.githubusercontent.com/871060/135865244-4c858167-ecf6-498e-9f25-f6aac3861a2f.gif" alt="giphy"></p> <h2>🤔 What is liquidsoap?</h2> <p>Liquidsoap is a statically-typed, type-inferred, functional scripting language equipped with specialized operators to build audio and video stream automation.</p> <p>The liquidsoap language offers all the flexibility and expressivity of a fully featured programming language to help build your media streams.</p> <p>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..</p> <h2>:white<em>check</em>mark: Why liquidsoap?</h2> <p>While there are many tools that offer competing features, the real difference with liquidsoap is its scripting language.</p> <p>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!</p> <h1>:zap:️ What's new in Liquidsoap 2.0.0? :zap:</h1> <p>Liquidsoap 2.0.0 brings major improvements in two areas:</p> <h3>:film_projector: Video support via ffmpeg</h3> <p>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.</p> <p>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.</p> <p>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.</p> <p>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 <a href="https://www.liquidsoap.info/doc-2.0.0/ffmpeg_filters.html">fully typed, composable ffmpeg filter operators</a> and <a href="https://www.liquidsoap.info/doc-2.0.0/cookbook.html">shared encoding</a></p> <h3>:gear: Expanded language features</h3> <p>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.</p> <p>Along with these changes, we have released <a href="https://www.liquidsoap.info/doc-dev/book.html">The Liquidsoap Book</a>, which we hope will help users of all skill level to work with the liquidsoap language and streaming projects.</p> <p>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.</p> <h1>:children_crossing: Roadmap and versioning</h1> <p>Our roadmap consists of:</p> <h3>:construction: Bugfix releases</h3> <p>While we are satisfied with the current <code>2.0.0</code> 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.</p> <p>Stable releases are numbered using the patch part of their version, i.e. <code>2.0.x</code>. 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.</p> <p>Our workflow for reporting bugs is via github's <a href="https://github.com/savonet/liquidsoap/issues">issues tracker</a>. 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 <a href="https://github.com/savonet/liquidsoap/discussions">discussion</a>. In some cases, issues get transferred to discussions as we see fit and, also, discussions can in fact lead to reporting an associated issue.</p> <p>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.</p> <h3>:bulb: Future major release</h3> <p>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</p> <p>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..)! :slightly<em>smiling</em>face:</p> <h2>🚀 Need help?</h2> <p>If you need help with your liquidsoap project, you can join our online chat room, which is currently hosted on <a href="http://slack.liquidsoap.info/">slack</a>. 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!</p> <h3>⚠️ Windows users</h3> <p>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 <a href="https://www.liquidsoap.info/doc-2.0.0/encoding_formats.html">here</a> to see how to use ffmpeg to encode in various formats.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134613"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.0-rc1">Liquidsoap 2.0.0-rc1</a> </h5> <p class="card-text"> <p>Liquidsoap <code>2.0.0-rc1</code> is out!</p> <p>The <code>2.0.0</code> 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 <a href="https://www.liquidsoap.info/doc-dev/book.html">book</a> to learn about the language</p> <h3>About this release</h3> <p>This is the first release candidate for the <code>2.0.0</code> 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.</p> <p>As a result, the repository's <code>main</code> branch has been versioned to <code>2.1.0</code> and we have forked off a <code>2.0.0-rc1</code> branch. This branch will only get bug fixes and we shall keep releases of the <code>2.0.x</code> series for bug fixes in the future.</p> <p>This release is also the first to make it to the <code>opam</code> repository. This means that users installing liquidsoap without a specific version will get <code>2.0.0~rc1</code> 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.</p> <p>If you absolutely need to make sure you installed a given version, please update your scripts using <code>opam</code> to install a fixed version, i.e.: <code> opam install liquidsoap.1.4.4 </code> This is actually a good practice for any automated liquidsoap <code>opam</code> install that depends on a specific version.</p> <p>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 <code>2.0.0</code> version out!</p> <h3>Personal note</h3> <p>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: * <a href="https://www.instagram.com/gnofoundation/">Greater New Orleans Foundation</a> * <a href="https://www.instagram.com/cajunnavyrelief/">Cajun Navy Relief</a> * <a href="https://www.instagram.com/mutualaidlouisiana/">MutualAidLA</a></p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 4 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134614"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.0-beta3">Liquidsoap 2.0.0-beta3</a> </h5> <p class="card-text"> <p>This is the third and, hopefully, last beta for the upcoming <code>2.0.0</code> major release!</p> <p>The <code>2.0.0</code> 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 <a href="https://www.liquidsoap.info/doc-dev/book.html">book</a> to learn about the language</p> <p>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 <code>playlist</code>, <code>request.dynamic</code> etc. has been simplified to be able to simply set a <code>prefetch</code> 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, <code>set("log.level", 4)</code> becomes <code>settings.log.level.set(4)</code>. 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.</p> <p>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 <code>2.0.0</code> is out, we will resume adding new features.</p> <p>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!</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 5 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134615"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.0-beta2">Liquidsoap 2.0.0-beta2</a> </h5> <p class="card-text"> <p>A little over a year after introducing support for abstract internal frame content in <a href="https://github.com/savonet/liquidsoap/pull/1237">#1237</a>, 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</p> <p>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:</p> <ul> <li>Taking advantage of a fully-featured language with modules, exceptions, nullable values and more.</li> <li>Mixing encoded and raw content, sharing encoders, leveraging most of FFmpeg’s supported encoders/decoders/filters</li> <li>Streaming video efficiently</li> </ul> <p>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:</p> <ul> <li>Maintain compatibility with migrated scripts for the final version as much as possible</li> <li>Provide production-ready stability as quickly as possible</li> </ul> <p>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 <a href="https://www.liquidsoap.info/doc-dev/migrating.html">migration page</a> with tips about what needs to be changed and will update it as we get reports from our users.</p> <p>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 <a href="https://www.liquidsoap.info/doc-dev/book.html">Liquidsoap book</a> that provides a lot more details and background information about liquidsoap and streaming in general.</p> <p>This release also introduces new CI-based APK package builds for alpine for the x86_64 and aarch64 architectures as well as a <a href="https://hub.docker.com/r/savonet/liquidsoap-alpine">docker images</a> for Alpine linux. These images are 5x smaller than our default production images!</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 5 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134616"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.0-beta1">Liquidsoap 2.0.0-beta1</a> </h5> <p class="card-text"> <p>This is the first beta release of liquidsoap <code>2.0</code>!</p> <p>The <code>2.0.0</code> release branch brings important and fundamental changes to liquidsoap, in particular: * First-class support of video * Tight integration with <code>ffmpeg</code>, encoders, decoders, filters and more * Enhanced language features making the script language a fully-featured language</p> <p>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.</p> <p>This release also comes with the first version of the Liquidsoap book!! 🎉 </p> <p>The book covers the Liquidsoap language, in version <code>2.0.0</code>, 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 <code>2.0.0</code> release.</p> <p>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</p> <p><strong>Windows users:</strong> Please note that the windows build does not support our regular encoders (<code>lame</code>, <code>ogg</code>, etc.) along with <code>ffmpeg</code> (they are compiled statically and some of the symbols are conflicting). Since <code>ffmpeg</code> provides the same encoders and more, we have decided to only enable <code>ffmpeg</code> on this build. Please, refer to the documentation <a href="https://www.liquidsoap.info/doc-dev/encoding_formats.html">here</a> to see how to use <code>ffmpeg</code> to encode in various formats.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] almost 5 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134617"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v2.0.0-alpha1">Liquidsoap 2.0.0-alpha1</a> </h5> <p class="card-text"> <p>This is the first alpha release of liquidsoap 2.0!</p> <p>This release features important and fundamental changes, in particular: * First-class support of video * Deep integration with <code>ffmpeg</code>, encoders, decoders, filters and more * Enhanced language features making the script language a fully-featured language</p> <p>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.</p> <p>We presented some of the changes during the liquidshop back in January. You can view the video online <a href="https://www.youtube.com/watch?v=VT6TEjJzWoY">here</a>. The slides, with examples, are available <a href="http://www.liquidsoap.info/liquidshop/slides/beauxis.pdf">here</a></p> <p>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!</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] about 5 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134618"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v1.4.4">Liquidsoap 1.4.4</a> </h5> <p class="card-text"> <h1>1.4.4 (27-02-2021)</h1> <p>New: - Added <code>process.quote</code> to quote process' arguments (#1215)</p> <p>Changed: - Fetch mime type using curl first when available. - Make override metadata name case-sensitive in <code>amplify</code> (#1323)</p> <p>Fixed: - Remote file resolution when passing URLs with spaces (#1410) - Fixed empty <code>{http,https}</code> body (#1417) - Fixed <code>input.harbor</code> shoutcast client connection (#1353) - Fixed exception reporting when output fails to start (#1372) - Fixed <code>random</code> track selection (#1468) - Fixed playlist request leak when using <code>reload="watch"</code> with <code>inotify</code> on a folder (#1451) - Deadlock when LO server thread crashes (#1409)</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by github-actions[bot] over 5 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134619"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v1.4.3">Liquidsoap 1.4.3</a> </h5> <p class="card-text"> <p>This is the 3rd bugfix release for the <code>1.4.x</code> branch. It contains important fixes and a couple of new minor features. Update is recommended and should be fairly safe.</p> <p>Along we this release, we have now added builds for <code>arm64</code> debian packages and docker-ready production images for <code>amd64</code> and <code>arm64</code> architectures available at: https://hub.docker.com/repository/docker/savonet/liquidsoap</p> <p>Again, we would like to warmly thank all users, contributors and reporters for helping us bring liquidsoap to the next step!</p> <p>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 <a href="https://github.com/savonet/liquidsoap/milestone/7">here</a> and will be tackled as soon as possible.</p> <p>New: - Allow to set min/max/bitrate in mp3 vbr mode (#1294). - Added optional <code>http_version</code> parameters to <code>http{s}.*</code> methods. - Added <code>on_cue_{in,out}</code> callbabacks to <code>cue_cut</code> - Added support for <code>file:/path/to/file</code> along with <code>file:///path/to/file</code> - Implement default <code>OPTIONS *</code> handler for harbor input (#1334)</p> <p>Changed: - Fixed default ffmpeg log level. - Changed default HTTP response for unrecognized harbor <code>/admin</code> commands (#1334). - Use replay gain metadata when present (#1102).</p> <p>Fixed:</p> <ul> <li>Fixed exponential memory usage in clock unification algorithm (#1272).</li> <li>Fixed rotate source order (#1279).</li> <li>Fixed invalid new track duration in <code>crossfade</code> when track ends while buffering (#1074).</li> <li>Make sure warnings do not prevent the script from running (#994).</li> <li>Fixed seek implementation in FFMPEG decoder (#1291).</li> <li>Fixed <code>http{s}.*</code> request body reader (#1300).</li> <li>Fixed duplicate metadata insertion in caching mode (#1241).</li> <li>Fixed SSL connection error (#1304).</li> <li>Better error reporting for Clock<em>conflict and Clock</em>loop errors (#985).</li> <li>Make sure playlist change watch is only setup once (#1246).</li> <li>Fixed windows service launch (#907).</li> <li>Fixed <code>rotate</code> not respecting source weights when not used after selecting a source (#1327).</li> <li>Bring back <code>{lastfm,librefm}.submit</code> (#1343).</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 5 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134620"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/v1.4.2">Liquidsoap 1.4.2</a> </h5> <p class="card-text"> <p>Liquidsoap <code>1.4.2</code> is another bugfix release from the <code>1.4.x</code> branch. It fixes a couple of important issues. See the <code>ChangeLog</code> below for a full list.</p> <h3>Install</h3> <p>See our <a href="https://www.liquidsoap.info/doc-1.4.1/install.html">installation instructions</a></p> <h3>⚠️ Breaking change ⚠️</h3> <p>One notable change with this release is that sources created using <code>cross</code> and <code>crossfade</code> operators are now <code>fallible</code>. 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 <em>after</em> applying any <code>cross</code>/<code>crossfade</code>.</p> <p>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! ✨</p> <h3>Full <code>ChangeLog</code></h3> <p>New:</p> <ul> <li>Added <code>retry_delay</code> argument to <code>request.dynamic</code> (#1169).</li> <li>Renamed <code>request.dynamic</code> to <code>request.dynamic.list</code> and updated its callback function type to return an array of requests, making possible to return multiple requests at once but, more importantly, to return <code>[]</code> when no next requests are available. (#1169)</li> </ul> <p>Changed:</p> <ul> <li>Set <code>audio/flac</code> as mime for flac (#1143).</li> <li>Deprecated <code>request.dynamic</code>.</li> </ul> <p>Fixed:</p> <ul> <li>Fixed errors when installing bash-completion files (#1095)</li> <li>Fixed failures in <code>extract-replaygain</code> script (#1125)</li> <li>Do not crash when loading playlists using <code>~/path/to/..</code> paths.</li> <li>Set set<em>default</em>verify_paths for SSL (#450)</li> <li>Use 443 as default port for https (#1127)</li> <li>Fix implementation of <code>rotate</code> (#1129).</li> <li>Register audio/opus mime type for ogg decoding (#1089)</li> <li>Re-encode name, genre and description in <code>output.icecast</code> using the given encoding (#1092)</li> <li>Accept 24 bits per sample in %flac encoder (#1073).</li> <li>Fix rare stack overflow during clock unification (#1108).</li> <li>Prevent metadata inserted via <code>insert_metadata</code> from being visible to underlying sources (#1115)</li> <li>Fix <code>cross()</code> fallability.</li> <li>Fix decoder remaining time when decoding is done (#1159)</li> <li>Fixed crash when cleaning up <code>output.hls</code></li> <li>Fix <code>get_process_lines</code> regexp logic (#1151)</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots about 6 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134621"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.4.1">Liquidsoap 1.4.1</a> </h5> <p class="card-text"> <p>This is a bug fix release, addressing an issue with crossfade transitions related to <code>fade.initial</code> and <code>fade.final</code>. See #1009 for more details.</p> <p>The binary code is not changed in this release, only the definitions for those two operators, located in the <code>libs/fades.liq</code> file. It is, then, also possible to simply update this one file and keep an installed <code>1.4.0</code> release.</p> <p>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.</p> <p>Feel free to drop us a message on the <a href="http://slack.liquidsoap.info/">Slack channel</a> or at savonet-users@lists.sourceforge.net</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 6 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134622"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.4.0">Liquidsoap 1.4.0</a> </h5> <p class="card-text"> <p>This is with great pleasure (and a bit of relief!) that we can now announce that liquidsoap <code>1.4.0</code> is out! :tada:</p> <p>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:</p> <ul> <li><p>Utf8 script parsing is now supported, allowing to define variables in utf8 (hello <code>🎵 = playlist("..")</code>!) but, more importantly, to write and deal with utf8 strings in your script, such as metadata and etc.</p></li> <li><p>You can now use any tuple size in the language, i.e. <code>x = (1,"abc",true,..)</code> and fetch members of a tuple via the new keyword: <code>let (a,b,c) = x</code></p></li> <li><p>We support encoding and decoding using the <code>ffmpeg</code> library. 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.</p></li> <li><p>External executions can now optionally be sandboxed using <a href="https://github.com/projectatomic/bubblewrap">bubblewrap</a>. This feature can enhance the security of your setup if, for instance, your radio receives URLs from external sources.</p></li> <li><p>HLS output is now supported via <code>output.file.hls</code> and <code>output.harbor.hls[.ssl]</code>. </p></li> <li><p><code>cross</code>/<code>crossfade</code> and <code>smart_cross</code>/<code>smart_crossfade</code> are now merged. New <code>cross</code>/<code>crossfade</code> behave like the old crossfade operators by default and like their smart counter-part by passing <code>smart=true</code>. 'override<em>duration<code>metadata now uses the label</code>"liq</em>cross_duration"`.</p></li> <li><p><a href="https://github.com/Haivision/srt">SRT</a> input and output are now supported, via <code>input.srt</code> and <code>output.srt</code></p></li> </ul> <p>Full changelog:</p> <p>New:</p> <ul> <li>UTF8 parsing!</li> <li>Added support for tuples: <code>x = (1,"aa",false)</code> (#838)</li> <li>Added support for deconstructing tuples: <code>let (z,t,_) = x</code> (#838)</li> <li>Added <code>input.{file,harbor}.hls</code> to read HLS stream (#59, #295, #296).</li> <li>Added <code>output.hls</code> to natively stream in HLS (#758).</li> <li>Added <code>%ffmpeg</code> native encoder, only for audio encoding for now (#952)</li> <li>Added ffmpeg-based stream decoder, limited to mime type <code>application/ffmpeg</code> for now.</li> <li>Added <code>(to_){string,float,int,bool}_getter</code> operators to handle getters in script side.</li> <li>Made <code>p</code> parameter in <code>smooth_add</code> a <code>float</code> getter (#601)</li> <li>Added <code>source.time</code> to get a source's clock time.</li> <li>Added <code>max_duration</code> to limit a source's duration.</li> <li>Added <code>file.temp_dir</code> to create temporary directories.</li> <li>Added <code>file.{unlink,rmdir}</code> to remove, resp., file and directories.</li> <li>Added <code>file.write</code> to write content to a file.</li> <li>Added <code>file.read</code> to read contents of a file without loading all of it in memory.</li> <li>Added <code>youtube-pl:<ID></code> protocol to resolve and parse youtube playlists (or any playlist supported by <code>youtube-dl</code>) (#761)</li> <li>Added <code>protocol.aws.endpoint</code> setting for the <code>s3://</code> protocol, thanks to @RecursiveGreen. (#778)</li> <li>Added support for sandboxing <code>run_process</code> calls. (#785)</li> <li>Added <code>harbor.{http,https}.static</code> to serve static path.</li> <li>Added <code>log.{critical,severe,important,info,warning,debug}</code>. Use aliases in code as well (#800, #801, #802)</li> <li>Added <code>sleep</code> function.</li> <li>Added <code>mkavailable</code> function.</li> <li>Added <code>fade.skip</code> function. (#804)</li> <li>Added <code>video.external.testsrc</code> function.</li> <li>Added <code>video.frame.*</code> and <code>audio.samplerate</code>.</li> <li>Added <code>input.external.ffmpeg</code> and <code>output.external.ffmpeg</code>.</li> <li>Added <code>output.youtube.live.ffmpeg</code>.</li> <li>Added <code>output.file.hls.ffmpeg</code>.</li> <li>Added <code>reopen</code> telnet command in <code>output.external</code>.</li> <li>Enabled external decoders in windows (#742)</li> <li>Added support for bash completion.</li> <li>Added <code>video.add_text.native</code>.</li> <li>Added <code>configure.bindir</code></li> <li>Added <code>for</code> and <code>while</code> loop functions.</li> <li>Added <code>list.case</code>.</li> <li>Added <code>metadata.string_getter</code> and <code>metadata.float_getter</code>.</li> <li>Added <code>string.contains</code>.</li> <li>Added <code>request.uri</code>.</li> <li>Added <code>{input,output}.srt</code> (#898)</li> <li>Added <code>path.remove_extension</code>.</li> <li>Added SSL read/write timeout options, use it for incoming socket connections (#932)</li> <li>Added ffmpeg resampler (#947).</li> <li>Added <code>lsl</code> and <code>lsr</code>.</li> </ul> <p>Changed:</p> <ul> <li>Depends on OCaml >= 4.08.0</li> <li>Changed return type of <code>http.*</code> and <code>run_process</code> to use tuples (#838)</li> <li>Better error reporting with coloring and uniform format. (#790)</li> <li>Improved reporting of file, line and character during parsing errors.</li> <li>Remove dynamic plugin build option.</li> <li>Made <code>on_end</code> delay a float getter.</li> <li>Reimplemented <code>fade.{in,initial,out,final}</code> as scripted operators. (#664)</li> <li>Removed <code>cross</code>/<code>crossfade</code> operators, superseeded by <code>smart_cross</code>/<code>smart_crossfade</code></li> <li>Rename <code>smart_cross</code>/<code>smart_crossfade</code> operators as <code>cross</code>/<code>crossfade</code></li> <li>Default behavior of <code>crossfade</code> is old (simple) crossfade. Use <code>smart=true</code> to enable old <code>smart_crossfade</code> behavior.</li> <li>Rename <code>file.duration</code> as <code>request.duration</code></li> <li>Removed duplicate <code>is_directory</code></li> <li>Rename <code>{basename,dirname}</code> as <code>path.{is_directory,basename,dirname}</code></li> <li>Empty playlists return by scripted resolvers is now considered a failure to resolve.</li> <li>Rewrite <code>smooth_add</code> to use new <code>mkcross</code> functions.</li> <li>Reimplemented <code>open_process_full</code> to get a hand on <code>pid</code> and finer-grained closing workflow (#703)</li> <li>Added <code>transition_length</code> to <code>switch</code>-based operators to limit transition lengths and allow garbage collection of transition sources.</li> <li>SDL renders text in UTF-8. (#712)</li> <li>Made <code>x</code> and <code>y</code> parameters in <code>video.add_text</code> <code>float</code> getters. (#730)</li> <li>Reimplemented <code>extract-replaygain</code> using <code>ffmpeg</code>, added an optional replay gain option to the <code>ffmpeg2wav</code> protocol. Thanks to @Yamakaky for contributing on this. (#749)</li> <li>The <code>ratio</code> parameter of <code>compress</code> and <code>limit</code> is a float getter. (#745)</li> <li>Removed <code>rewrite_metadata</code> which had been deprecated for a while now.</li> <li>Allow string getter for <code>harbor</code> HTTP responses.</li> <li>Renamed <code>get_clock_status</code> to <code>clock.status</code> and <code>log_clocks</code> to <code>clock.log</code>.</li> <li>Renamed <code>rms_window</code> parameter of <code>compress</code> to <code>window</code>. (#796)</li> <li>Added <code>chop</code> operator.</li> <li>Keep master tracks' boundaries in <code>mux_*</code> functions. (#795)</li> <li>Added <code>new_track</code> optional argument to callback in <code>insert_metadata</code>.</li> <li>Use getters for weights of <code>rotate</code>. (#808)</li> <li>Added <code>conservative</code>, <code>length</code> and <code>default_duration</code> params to <code>playlist.{reloadable,once,merge}</code> (#818)</li> <li>Renamed <code>input.external</code> into <code>input.external.rawaudio</code>, added <code>input.external.wav</code>.</li> <li>Renamed <code>gstreamer.hls</code> to <code>output.file.hls.gstreamer</code>.</li> <li>Raise an error when using a format (e.g. <code>%vorbis</code>, <code>%mp3</code>, ..) that is not enabled. (#857)</li> <li>Set default encoders and ladspa plugins samplerate and channels to configured internal <code>"frame.audio.samplerate"</code> and <code>"frame.audio.channels"</code>. (#870)</li> <li>Handle unary minus in the preprocessor instead of the parser in order to avoid duplicating the parser. (#860)</li> <li>Add <code>filter</code> option to <code>playlist.once</code>.</li> <li>Added a <code>replay_delay</code> option to the <code>pipe</code> operator to replay metadata and breaks after a delay instead of restart the piping process. (#885)</li> <li>Add <code>buffer_length</code> telnet command to <code>input.harbor</code>.</li> <li>Bumped default <code>length</code> parameter for request-based sources (<code>playlist</code>, <code>request.dynamic</code>, ..) to <code>40.</code> to assure that there always is at least one request ready to play when the current one ends.</li> <li>Added support for cue in/out and fade in/out/type metadata support in <code>ffmpeg2wav</code> protocol. Rename protocol to <code>ffmpeg</code>. (#909)</li> <li><code>list.assoc</code> and <code>list.remove_assoc</code> require an ordered type as first component.</li> <li>Renamed <code>quote</code> to <code>string.quote</code>.</li> <li>Added <code>phase_inversion={true/false}</code> to <code>%opus</code> encoder (#937)</li> <li>Fixed encoders forcing frame rate and audio channels too early (#933)</li> <li>Change filename to a string getter in file-based outputs. (#198)</li> <li>Changed <code>audio.converter.samplerate.preferred</code> option to <code>audio.converter.samplerate.converters</code> to give a list of possible converters.</li> </ul> <p>Fixed:</p> <ul> <li>Lack of documentation for <code>cross</code>/<code>crossfade</code> (#743)</li> <li>Fixed before metadata being lost during crossfade not in conservative mode.</li> <li>Correct types and default values for <code>random.int</code> (#767).</li> <li>Allow changing pipeline in gstreamer functions. (#762)</li> <li>Script deadlock after a long time, most likely related to old crossfade transitions (#755)</li> <li>AVI export fixed. (#789)</li> <li><code>%external</code> does not stop processes anymore on each metadata. (#789)</li> <li>Fixed exit getting stuck when using <code>input.jack</code> (#769)</li> <li>Stop lo server on shutdown. (#820)</li> <li>Fixed external process stop not detected on second and further calls (#833)</li> <li>Add <code>seek</code> in operators where implementation is clear (#853)</li> <li>Do not enter buffering mode between tracks in <code>buffer</code> (#836)</li> <li>Fixed file descriptor leak in external processes (#865)</li> <li>Fixed encoded output creating empty files from failing sources (#876)</li> <li>Fixed <code>cue_cut</code> not working when used before <code>cross</code>/<code>crossfade</code> (#874)</li> <li>Fixed audio glitches when seeking within a MP3 file.</li> <li>Fixed <code>insert_metadata</code> logic when insert new track and metadata (#903)</li> <li>Fixed <code>replay-gain</code> script default location.</li> <li>Fixed audio glitches at the end of crossfade transitions.</li> <li>Specify that <code>list.remove</code> removes only the first occurrence and avoid reversing the list (#922).</li> <li>File descriptor leak when using openssl-based operators.</li> <li>Fixed SSL read taking too long to timeout (#932)</li> <li>Fixed output starting when underlying source is not available (#393)</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 6 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134623"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.7">Liquidsoap 1.3.7</a> </h5> <p class="card-text"> <p>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.</p> <h2>Changed:</h2> <ul> <li><p>Reimplemented <code>open_process_full</code> to get a hand on <code>pid</code> and finer-grained closing workflow (#703)</p></li> <li><p>Better log message when request download times out (#708)</p></li> <li><p>Drop <code>log.level</code> for <code>ffmpeg</code> messages to <code>5</code></p></li> </ul> <h2>Fixed:</h2> <ul> <li><p>Timeout when executing external processes (#691, #736, #726, #708)</p></li> <li><p>Set buffering only when frame is partial in time_wrap.ml. Makes it work with crossfade transitions (#695)</p></li> <li><p>Changed <code>Icy-MetaData:1</code> to <code>Icy-MetaData: 1</code> in HTTP source headers. Fixes some shoutcast implementations (#727)</p></li> <li><p>Fixed deadlock in <code>input.http</code> source status command (#367)</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots about 7 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134624"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.6">Liquidsoap 1.3.6</a> </h5> <p class="card-text"> <h1>1.3.6 (23-01-2019)</h1> <p>Fixed:</p> <ul> <li><p>Fixed smart_crossfade transitions skipping data after track marks. (#683, #652)</p></li> <li><p>Fixed <code>input.pulseaudio</code> parameters.</p></li> <li><p>Fixed crash when copying frame content (#684)</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 7 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134625"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.5">Liquidsoap 1.3.5</a> </h5> <p class="card-text"> <h1>1.3.5 (25-12-2018)</h1> <p>New:</p> <ul> <li><p>Added a bunch of base mathematics primitive, <code>exp</code>, <code>log</code>, <code>cos</code>, <code>sine</code>, ...</p></li> <li><p>Added <code>"extinf_duration"</code> to parsed <code>#EXTINF</code> metadata.</p></li> </ul> <p>Fixed:</p> <ul> <li><p>Fixed inotify watch semantics (#677)</p></li> <li><p>Enhanced <code>#EXTINF</code> parsing in ambigious cases (#625)</p></li> <li><p>Fixed <code>output.youtube.live</code> (#630)</p></li> <li><p>Make sure server writes are synchronous (#643)</p></li> <li><p>Fixed crash when loading some frei0r plugins (#435)</p></li> <li><p>Fixed compilation with <code>osx-secure-transport</code></p></li> <li><p>Fixed invalid opus stream generated when no data was ever encoded (#180)</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 7 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134627"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.4">Liquidsoap 1.3.4</a> </h5> <p class="card-text"> <p>Tons of bug fixes and several neat improvements.</p> <h2>Changelog</h2> <p>New:</p> <ul> <li><p>Added <code>FFMPEG</code> decoder using the new <code>ocaml-ffmpeg</code> API. Thanks for @gndl for the hard work there.</p></li> <li><p>Added <code>"init.allow_root"</code> setting to allow running liquidsoap as root.</p></li> <li><p>Added <code>on_track</code> callback for playlists. Can be used to force a reload.</p></li> <li><p>Added <code>server.condition</code>, <code>server.wait</code>, <code>server.broadcast</code> and <code>server.signal</code>. Used to control server command execution.</p></li> <li><p>Added <code>server.write</code>, <code>server.read{chars,line}</code> to write interactive server commands in conjunction with the above functions. (#544, #568)</p></li> <li><p>Added <code>output.youtube.live</code> as a wrapper around <code>output.gstreamer.audio_video</code> to stream live to Youtube (#498)</p></li> <li><p>Added metadata extraction to <code>ffmpeg2wav</code> protocol (#623).</p></li> </ul> <p>Changed:</p> <ul> <li><p>Depends on OCaml >= 4.03.0</p></li> <li><p>Depends on camomile > 1.0.0</p></li> <li><p>Use <code>http{s}.head</code> when available to fetch remote file's mime type. (win32 port)</p></li> <li><p>Better log messages for root exit and buffer override.</p></li> <li><p>Switch default log to stdout. Set to file when <code>log.file.path</code> is set (#612)</p></li> <li><p>Disabled Gstreamer stream decoder.</p></li> <li><p>Removed asynchronous mode for <code>output.gstreamer.audio_video</code></p></li> <li><p>Reworked <code>smartcross</code> internal logic (#596)</p></li> <li><p>Enabled <code>replaygain</code> on <code>m4a</code> files, thanks to @gilou (#604)</p></li> <li><p>Added <code>encoding</code> parameter to <code>output.shoutcast</code> to allow alternative string encoding for metadata updates (#411)</p></li> <li><p>Deprecated <code>rewrite_metadata</code></p></li> </ul> <p>Fixed:</p> <ul> <li><p>Decouple dyntools compilation.</p></li> <li><p>Support for OCaml >= 4.06</p></li> <li><p>File descriptor leak in <code>output.icecast</code> (#548)</p></li> <li><p>Fixed URL regexp for <code>input.https</code> (#593)</p></li> <li><p>Multiple gstreamer fixes:</p> <ul> <li>File decoder with video.</li> <li>Memory leaks (#516, #511, #434, #318)</li> <li>Process freeze (#608, #278)</li> </ul></li> <li><p>Duppy crash on exit (#160)</p></li> <li><p>Fixed audio glitches when using the <code>pipe</code> operator (#614)</p></li> <li><p>Deadlock in external decoder. (#611)</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 7 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134629"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.3">Liquidsoap 1.3.3</a> </h5> <p class="card-text"> <p>This a minor release, containing mostly bug fixes and a couple of new features.</p> <h1>Changelog:</h1> <p>New:</p> <ul> <li><p>Added <code>on_change</code> to <code>register</code></p></li> <li><p>Added IPv6 support for <code>input.harbor</code>. (#491)</p></li> <li><p>Added <code>time</code>, <code>localtime</code> and <code>gmtime</code> to help with time-predicates (#481)</p></li> <li><p>Added <code>on_start</code> to execute callback when liquidsoap starts.</p></li> <li><p>Added <code>enable_external_ffmpeg_decoder</code> to enable ffmpeg-base external decoder.</p></li> <li><p>Added <code>"decoder.external.{ffmpeg,ffprobe,flac,metaflac,faad,mpcdec}.path"</code> configuration settings.</p></li> </ul> <p>Changed:</p> <ul> <li><p>Renamed secure transport harbor key paths to: harbor.secure_transport.*</p></li> <li><p>Renamed secure transport I/O to: <code>{input,output}.harbor.secure_transport</code>.</p></li> <li><p>Added <code>.wma</code> to <code>gstreamer</code> file decoder file extensions (#483)</p></li> </ul> <p>Fixed:</p> <ul> <li><p>Fixed memory leak in <code>output.icecast</code> connection method. (#490)</p></li> <li><p>Fixed <code>mutexify</code></p></li> <li><p>Make sure that metadata are always passed in increasing position order in <code>map_metadata</code> (#469)</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 8 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134631"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.2">Liquidsoap 1.3.2</a> </h5> <p class="card-text"> <p>This is a bugfix release, mostly related to SSL support and execution of external process.</p> <h1>ChangeLog</h1> <p>Changed:</p> <ul> <li><p>Removed <code>kick</code> telnet/server command, duplicate of <code>stop</code>.</p></li> <li><p>Support <code>replaygain</code> for mp3 files, thanks to @d4h3r0 (#460)</p></li> <li><p>Implement <code>input.harbor.ssl</code> using SecureTransport for OSX.</p></li> </ul> <p>Fixed:</p> <ul> <li><p>Fix scheduler loop causing high CPU usage when using Process_handler without some of the default callbacks. (#475)</p></li> <li><p>Revert <code>wait_for</code> implementation to pre-<code>1.3.0</code>, using a custom <code>select</code> loop (#453)</p></li> <li><p>Handle mime-type arguments in input.harbor streams. (#456)</p></li> <li><p>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)</p></li> <li><p>Accept any capitalization of HTTP(S) as regular HTTP URL (#464)</p></li> <li><p>Fix compilation with osx-secure-transport enabled.</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 8 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134633"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.1">Liquidsoap 1.3.1</a> </h5> <p class="card-text"> <p>This is a bugfix release, addressing a couple of bugs from the recent <code>1.3.0</code> release. Changelog is:</p> <h2>New:</h2> <ul> <li><p>Allow any tags allowed in <code>"encoder.encoder.export"</code> settings in vorbis streams (#418)</p></li> <li><p>Allow <code>"audio/mp3"</code> mime-type for mp3 in file resolution protocol. (#451)</p></li> </ul> <h2>Fixed:</h2> <ul> <li><p>Fixed run<em>process, get</em>process<em>lines, get</em>process_output when compiling with OCaml <= 4.03 (#437, #439)</p></li> <li><p>Calls to wait_for while the scheduler isn't running (#442)</p></li> <li><p>Revert default handling of environment in run<em>process, get</em>process<em>lines, get</em>process_output to passing calling process' environment by default.</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots about 9 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134635"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.3.0">Liquidsoap 1.3.0</a> </h5> <p class="card-text"> <p>New:</p> <ul> <li><p>Added support for recursive functions (#406)</p></li> <li><p>Add peak and peak.stereo operators (#364)</p></li> <li><p>Change <code>track_sensitive</code> parameter to a boolean getter (fixed value or anonymous function).</p></li> <li><p>Add SSL support to the varous harbor operators, either via openssl or OSX's SecureTransport.</p></li> <li><p>Add optional "dj" and "next" metadata for Shoutcast v2, wrap "dj" value in a callback in output.shoutcast (#370, #388)</p></li> <li><p>Allow partial parsing of JSON objects in of_json.</p></li> <li><p>Generalize list.assoc to allow default values. Legacy code must be updated: list.assoc(k,l) -> list.assoc(default="",k,l)</p></li> <li><p>Generalize list.hd to allow default values. Legacy code must be updated: list.hd(l) -> list.hd(default="",l)</p></li> <li><p>Allow to pass a default to list.nth. Legacy code must be updated: list.nth(l,pos) -> list.nth(default=<..>,l,pos)</p></li> <li><p>Added on_offset to execute a callback at a given offset within a source's tracks.</p></li> <li><p>Added mutexify to protect a function from being called concurrently.</p></li> <li><p>Added request.log to get log data associated with a request</p></li> <li><p>Added overlap_sources to rotate between sources with overlapping tracks.</p></li> <li><p>Added replay_metadata to input.harbor()</p></li> <li><p>Added <char code> syntax for strings (#368)</p></li> <li><p>Added string.sub</p></li> <li><p>Added run<em>process to run a process with optional environment and return (stdout,stderr,exit</em>status)</p></li> <li><p>Added add<em>playlist</em>parser to register new playlist parsers</p></li> <li><p>Added optional static parameter to add_protocol</p></li> <li><p>Added file.temp to create fresh temporary filename</p></li> <li><p>Added process: protocol</p></li> <li><p>Reimplemented curl-based fetch process using process:</p></li> <li><p>Added s3:// protocol to fetch files from AWS S3 using the AWS CLI.</p></li> <li><p>Added polly: protocol to enable speech synthesis using AWS polly. Generated files are mono so make sure you use audio<em>to</em>stereo().</p></li> <li><p>Added youtube-dl: protocol to resolved requests using youtube-dl</p></li> <li><p>Added which() to find an exectuable within the $PATH</p></li> <li><p>Added register() to allow to register new configuration settings</p></li> </ul> <p>Changed:</p> <ul> <li><p>Reverted default value for --error<em>as</em>warnings option, renamed to --strict.</p></li> <li><p>Moved say: protocol registration to utils.liq.</p></li> <li><p>Moved get<em>process</em>lines and get<em>process</em>output to utils.liq, added optional env parameter</p></li> <li><p>Set conservative=true by default in cross() and smartcross()</p></li> </ul> <p>Deprecated (can be removed in any future version):</p> <ul> <li>Dynamic plugins compilation, deprecated in favor of opam rebuild mechanism.</li> </ul> <p>Removed:</p> <ul> <li><p>aac and aacplus encoders, removed in favor of fdk-aac.</p></li> <li><p>dirac/schroedinger video encoder: obsolete, abandoned upstream.</p></li> <li><p>force_mpeg option in taglib metadata decoder. Has not been used for years and allows to decouple taglib code from the mad decoder.</p></li> </ul> <p>Bugfixes:</p> <ul> <li><p>Fix negative seek (#390)</p></li> <li><p>Prevent flows metadata updata from stalling sources (#377)</p></li> <li><p>Add revdns setting for telnet, set all revdns default to false (#372)</p></li> <li><p>Fix icy metadata in output.harbor (#358)</p></li> <li><p>Fix missing first line of headers from icy clients in input.harbor (#380)</p></li> <li><p>Fix timestamp in some logged output (#395)</p></li> <li><p>Fix crash in external (download) protocol.</p></li> <li><p>Fix fade.{in,out} metadata handling for new fade duration and type.</p></li> <li><p>Compute normalization regardless of child sources ready status in add() to avoid unexpected change of volume.</p></li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots about 9 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134637"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.2.1">Liquidsoap 1.2.1</a> </h5> <p class="card-text"> <h1>1.2.1 (01-07-2016)</h1> <p>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.</p> <p>Bugfixes: - Fix metadata update for shoutcast v2 when sid <> 1 (#320). - Fix connection to input.harbor using the shoutcast v1 protocol (#337).</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots almost 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134638"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/0.9.0">Liquidsoap 0.9.0</a> </h5> <p class="card-text"> <p>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 after<em>output 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 initial</em>uri. - Fix bugs in the life cycle (sleep/wake<em>up) of queued request sources, which made say</em>metadata 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.</p> <p>Changes: - Warning: interactive_float() is now interactive.float().</p> <p>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 new<em>track</em>on<em>metadata 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 force</em>mime parameter for input.http(). - New insert<em>missing parameter for append(). - Multi-line strings in liq scripts, with a caml-like syntax. - Slight modification of the scripting syntax, handling unary minus. - Added user</em>agent 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 enable<em>mplayer(). - 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 - disk</em>manyfiles: 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 <em>some</em> 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.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134639"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.0.0-beta1">Liquidsoap 1.0.0 beta 1</a> </h5> <p class="card-text"> <p>This beta version introduces two major new features: heterogeneous stream types and clocks.</p> <p>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 channels<em>matrix parameter to output.ao(). - Add on</em>(dis)connect hooks in input.harbor().</p> <p>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.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134640"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.0.0-beta2">Liquidsoap 1.0.0 beta 2</a> </h5> <p class="card-text"> <p>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: insert<em>metadata has changed, and clock.assign</em>new() should be used instead of clock() to avoid some of the new static checks</p> <p>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.file<em>extensions.<format>" and "decoder.mime</em>types.<format>". - Decoder order can be user-defined thanks to new settings "decoder.file<em>decoders", "decoder.stream</em>decoders" and "decoder.metadata_decoders". - Indicate which decoder is used in the "decoder" metadata - More helpful log for various errors - Fix segfault with SdlImage image decoder</p> <p>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)</p> <p>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: "metadata<em>charset" and "icy</em>metadata_charset" in input.harbor() - Fix: race condition possibly leading to abusive "source taken" (LS-500)</p> <p>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)</p> <p>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, on<em>start, on</em>stop, fallible); cleanup and uniformize implementations (LS-365) - New ALSA settings alsa.alsa<em>buffer, alsa.buffer</em>length 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</p> <p>Operators: - New: support for cue points with cue<em>cut() - 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.insert</em>metadata(). - 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</p> <p>Scripting API: - New: OSC support through osc.bool(), osc.float() and osc.float<em>pair() - New: JSON export json</em>of() - New: http.get() and http.post() - New: url.encode/decode(), base64.encode/decode() - New: string.recode() for charset conversions using camomile - New: notify<em>metadata() and osd</em>metadata(), suitable for use with on<em>track() and on</em>metadata() - New: request.metadata() for getting a request's metadata - New: string.length() - Enhance log<em>clocks() with parameter for delaying startup - Enhance get</em>clock_status() with "uptime" reference time</p> <p>Server interface: - Print the playlist's URI when calling <playlist>.uri without an argument. - Ehance <queue>.ignore now works also in the primary queue - New command for changing the URL of an input.http(), ref #466. The command is <id>.url and it needs a restart (<id>.stop, then start) to take effect. - Fixed double registration of server commands which resulted in broken "help" command (LS-521)</p> <p>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</p> <p>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-<feature>-dynamic-plugin in ./configure and --dynamic-plugins-dir in liquidsoap - Better Win32 support, more version checks, separate compilation of C files and compliance with Debian's OCaml standards - Externalize many audio and video functions in the new ocaml-mm library Factorize and optimize various conversions - Rewrite harbor and server code using the new Duppy monad, introducing camlp4 into the build system - New regression tests (make test) - More user-friendly exception printing - Avoid problems preventing backtrace printing</p> <p>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]</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134641"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.0.0-beta2.1">Liquidsoap 1.0.0 beta 2.1</a> </h5> <p class="card-text"> <ul> <li>Fix: playlist.safe() was unusable in beta2, as a side effect of removing duplicate "timeout" parameter in playlist().</li> <li>Minor enhancements to documentation, settings and reference.</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134642"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.0.0-beta3">Liquidsoap 1.0.0 beta 3</a> </h5> <p class="card-text"> <ul> <li>Feature: Added of_json to parse json data. Depends on json-wheel.</li> <li>Feature: Added file.exists and is_directory.</li> <li>Feature: Added timeout options for: telnet, harbor (server), input.icecast</li> <li>Enhancement: finer-grained timeout detection for input.harbor and input.http</li> <li>Fix: deadlock when disconnecting harbor users through server/telnet command.</li> <li>Fix: dynlink detection in native mode with old versions of ocaml</li> <li>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.</li> </ul> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134643"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/0.9.2">Liquidsoap 0.9.2</a> </h5> <p class="card-text"> <p>This release is a <em>snapshot</em> 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.</p> <p>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 "restart<em>encoder" to the more relevant "restart</em>on<em>new</em>track". Added optional "restart<em>after</em>delay" to restart the encoder after some delay. Also completely rewrite stop mechanism. Stop operation now waits for the encoding process to finish, allowing proper restart<em>on</em>new<em>track 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. - on</em>blank(): fix a bug that prevented the first call to on<em>noise. - 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 wake</em>up 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.</p> <p>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. - on<em>blank(): provide an on</em>noise handler. - playlist<em>(): 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.</em>.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 enable<em>faad. - 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 replay</em>gain, through the replay<em>gain protocol (enabled by default) and the replay gain metadata resolver (to be enabled using enable</em>replaygain<em>metadata()). (#103 & #317) - Reverse DNS operations can be disabled using settings keys "server.telnet.reverse</em>dns" and "harbor.reverse_dns".</p> <p>Experimental: - MIDI: file decoding, synthesis, virtual keyboard.</p> <p>Removed: - RTP input and output. - Removed decoders using ocaml-natty. Slow, unmaintained and superseded by the mplayer decoder.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134644"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.0.0">Liquidsoap 1.0.0</a> </h5> <p class="card-text"> <p>Finally, the 1.0.0 release! It brings several important fixes, but also some nice novelties. The most outstanding difference concerns <code>output.icecast()</code>: its restart and restart<em>delay parameters are gone, replaced by a new `on</em>stop<code>handler which is called on every error (failed connection or disconnection) and returns the new restart delay. The</code>on<em>error<code>handler receives a string describing the error which enables user-friendly reporting, adaptative delays, etc. Note that</code>on</em>error<code>defaults to</code>fun(<em>)->3.<code>which is equivalent to having</code>restart=true<code>,</code>restart</em>delay=3.<code>in previous versions, NOT the same as the former</code>restart=false` default. As a result, Liquidsoap won't fail to startup if an initial connection attempt fails.</p> <p>Fixes: - LS-532,527: avoid freeze after errors in streaming threads or source initialization routines - LS-542: race condition in playlist<em>() breaking randomness - LS-489: double expiration lead to illegal queue length and freeze of request-based sources - Avoid multiple simultaneous reloading in playlist</em>(), 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</p> <p>New: - on<em>error handler in output.icecast(), see above - New msg param in %mp3 for marking frame headers, defaults to version string - output.file(): new on</em>close 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: mux<em>mono() for adding a single audio channel into a stream - video.add</em>text() 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.allow<em>streaming</em>errors" and "init.force<em>stat" (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.vis</em>volume() - 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.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134645"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.0.1">Liquidsoap 1.0.1</a> </h5> <p class="card-text"> <p>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.</p> <p>New: - new values for metadata fields does not override old one anymore; use setting "request.metadata<em>decoders.override" to restore old behavior - stereo</em>mode and internal<em>quality parameters for %mp3 encoder - enable mad decoder for MP1 and MP2 in addition to MP3, create aliased configuration keys "decoder.file</em>extensions/mime<em>types.mad" - support for CUE sheet playlists and metadata in M3U - setting "decoder.taglib.force</em>mpeg" 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.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134646"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.1.0">Liquidsoap 1.1.0</a> </h5> <p class="card-text"> <p>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)</p> <p>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",reload<em>mode="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 back</em>time 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 "source<em>url" metadata to input.http streams. - Improved error message when theora format is not supported. - Add list.filter function. - video.add</em>image 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</p> <p>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.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134647"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/liquidsoap-1.1.1">Liquidsoap 1.1.1</a> </h5> <p class="card-text"> <p>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.</p> <p>Enhancements: - Handle more OSC types (float, float<em>pair, bool, string, string</em>pair) and added osc.on<em>*. - Better infrastructure for decoding images. add</em>image can now handle most image file types. - Add random.int as well as min<em>int and max</em>int 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 bytes<em>per</em>page 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.</p> <p>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.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by smimram over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div><div class="card mb-3 release d-flex" id="release_134648"> <div class="card-body pb-1"> <div class="d-flex"> <div class="flex-grow-1 ms-3 text-break"> <h5 class='card-title'> <a href="https://science.ecosyste.ms/projects/36529">liquidsoap</a> - <a href="https://github.com/savonet/liquidsoap/releases/tag/1.2.0">Liquidsoap 1.2.0</a> </h5> <p class="card-text"> <p>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.</p> <p>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).</p> <p>Bugfixes: - Correctly close connection in http.get / http.post (#72). - Remove input.lastfm which has been broken for a while. - Lots of small bugfixes.</p> </p> <p class="card-subtitle mb-2 text-muted"><small> - OCaml <br/> Published by toots over 10 years ago <br /> </small></p> </div> <div class="flex-shrink-0"> <img src="https://github.com/savonet.png" class="rounded" height='40' width='40' onerror="this.style.display='none'"> </div> </div> </div> </div> </div> </div> <footer class="footer dark-section"> <div class="container"> <div class="row"> <div class="col-md-8"> <a class="site-logo site-logo--white" href="/">Ecosyste.ms</a> <p class="small">Tools and open datasets to support, sustain, and secure critical digital infrastructure.</p> <p class="small"> Code: <a href="https://github.com/ecosyste-ms/documentation/blob/main/LICENSE">AGPL-3</a> — Data: <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a> </p> <p class='footer-icons'> <a target="_blank" href="https://github.com/ecosyste-ms"> <svg width="20" height="20" alt="ecosyste.ms on Github" class="bi bi-github" viewBox="0 0 16 16" fill="currentColor" version="1.1" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"></path></svg> </a> <a target="_blank" href="https://mastodon.social/@ecosystems"> <svg width="20" height="20" alt="ecosyste.ms on Mastodon" class="bi bi-mastodon" viewBox="0 0 16 16" fill="currentColor" version="1.1" aria-hidden="true"><path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z"></path></svg> </a> <a target="_blank" href="https://opencollective.com/ecosystems"> <svg width="20" height="20" alt="ecosyste.ms on Open Collective" class="bi bi-opencollective" viewBox="0 0 16 16" fill="currentColor" version="1.1" aria-hidden="true"><path fill-opacity=".4" d="M12.995 8.195c0 .937-.312 1.912-.78 2.693l1.99 1.99c.976-1.327 1.6-2.966 1.6-4.683 0-1.795-.624-3.434-1.561-4.76l-2.068 2.028c.468.781.78 1.679.78 2.732z"></path> <path d="M8 13.151a4.995 4.995 0 1 1 0-9.99c1.015 0 1.951.273 2.732.82l1.95-2.03a7.805 7.805 0 1 0 .04 12.449l-1.951-2.03a5.07 5.07 0 0 1-2.732.781z"></path></svg> </a> </p> <div> <h3 class="mt-5 h6">Supported by</h3> <div class="row justify-content-start align-items-center g-4 mb-4 mb-lg-0"> <div class="col-auto"> <a href="https://www.schmidtfutures.org"> <img alt="Schmidt Futures" class="img-fluid p3" src="/assets/logo-schmidt-white-efa52873280decb2588e601323ef616a96a7891c254db5cdf0cca626ed85acc5.svg" width="267" height="20" /> </a> </div> <div class="col-auto"> <a href="https://oscollective.org"> <img alt="Open Source Collective" class="img-fluid p3" src="/assets/logo-osc-white-43e420a5624e755fe206869f9c3ff608e9476881d847007a020ea01d37e36dfa.png" width="210" height="56" /> </a> </div> </div> <p class="mt-3"><a href="https://opencollective.com/ecosystems" class="small">Become a sponsor</a></p> </div> </div> <div class="col-md-4"> <ul class="list-unstyled footer-links mt-3 small"> <li><strong><a href="https://ecosyste.ms">About</a></strong></li> <li><strong><a href="https://blog.ecosyste.ms">Blog</a></strong></li> <li><strong><a href="https://mastodon.social/@ecosystems">Contact</a></strong></li> <li><strong><a href="https://ecosyste.ms/privacy">Privacy</a></strong></li> <li><strong><a href="https://ecosyste.ms/terms">Terms</a></strong></li> <li><strong><a href="https://ecosystems.appsignal-status.com/">Status</a></strong></li> </ul> </div> </div> </div> </footer> </body> </html>