Skip to content

Releases: savonet/liquidsoap

Liquidsoap 1.4.2

03 May 19:15
Compare
Choose a tag to compare

Liquidsoap 1.4.2 is another bugfix release from the 1.4.x branch. It fixes a couple of important issues. See the ChangeLog below for a full list.

Install

See our installation instructions

⚠️ Breaking change ⚠️

One notable change with this release is that sources created using cross and crossfade operators are now fallible. This is required as the crossfade transitions can be any user-provided functions, including functions returning failing sources. Make sure to update your scripts accordingly, typically moving your security fallback to after applying any cross/crossfade.

Once again, we want to thank all users, contributors and patient testers, we wouldn't be able to find, address and confirm that all these issues have been fixed without our community! ✨

Full ChangeLog

New:

  • Added retry_delay argument to request.dynamic (#1169).
  • Renamed request.dynamic to request.dynamic.list 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 [] when no next requests are available. (#1169)

Changed:

  • Set audio/flac as mime for flac (#1143).
  • Deprecated request.dynamic.

Fixed:

  • Fixed errors when installing bash-completion files (#1095)
  • Fixed failures in extract-replaygain script (#1125)
  • Do not crash when loading playlists using ~/path/to/.. paths.
  • Set set_default_verify_paths for SSL (#450)
  • Use 443 as default port for https (#1127)
  • Fix implementation of rotate (#1129).
  • Register audio/opus mime type for ogg decoding (#1089)
  • Re-encode name, genre and description in output.icecast using the given encoding (#1092)
  • Accept 24 bits per sample in %flac encoder (#1073).
  • Fix rare stack overflow during clock unification (#1108).
  • Prevent metadata inserted via insert_metadata from being visible to underlying sources (#1115)
  • Fix cross() fallability.
  • Fix decoder remaining time when decoding is done (#1159)
  • Fixed crash when cleaning up output.hls
  • Fix get_process_lines regexp logic (#1151)

Liquidsoap 1.4.1

18 Jan 16:11
Compare
Choose a tag to compare

This is a bug fix release, addressing an issue with crossfade transitions related to fade.initial and fade.final. See #1009 for more details.

The binary code is not changed in this release, only the definitions for those two operators, located in the libs/fades.liq file. It is, then, also possible to simply update this one file and keep an installed 1.4.0 release.

Finally, the arguments of the two operators have been changed. This is technically breaking the script API but we believe it should not affect most of our users.

Feel free to drop us a message on the Slack channel or at [email protected]

Liquidsoap 1.4.0

01 Oct 00:20
Compare
Choose a tag to compare

This is with great pleasure (and a bit of relief!) that we can now announce that liquidsoap 1.4.0 is out! 🎉

This has been quite a long release cycle but it also comes with some awesome changes. Let's have a look at some of the most important ones:

  • Utf8 script parsing is now supported, allowing to define variables in utf8 (hello 🎵 = playlist("..")!) but, more importantly, to write and deal with utf8 strings in your script, such as metadata and etc.

  • You can now use any tuple size in the language, i.e. x = (1,"abc",true,..) and fetch members of a tuple via the new keyword: let (a,b,c) = x

  • We support encoding and decoding using the ffmpeg 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.

  • External executions can now optionally be sandboxed using bubblewrap. This feature can enhance the security of your setup if, for instance, your radio receives URLs from external sources.

  • HLS output is now supported via output.file.hls and output.harbor.hls[.ssl].

  • cross/crossfade and smart_cross/smart_crossfade are now merged. New cross/crossfade behave like the old crossfade operators by default and like their smart counter-part by passing smart=true. 'override_durationmetadata now uses the label"liq_cross_duration"`.

  • SRT input and output are now supported, via input.srt and output.srt

Full changelog:

New:

  • UTF8 parsing!
  • Added support for tuples: x = (1,"aa",false) (#838)
  • Added support for deconstructing tuples: let (z,t,_) = x (#838)
  • Added input.{file,harbor}.hls to read HLS stream (#59, #295, #296).
  • Added output.hls to natively stream in HLS (#758).
  • Added %ffmpeg native encoder, only for audio encoding for now (#952)
  • Added ffmpeg-based stream decoder, limited to mime type application/ffmpeg for now.
  • Added (to_){string,float,int,bool}_getter operators to handle getters in
    script side.
  • Made p parameter in smooth_add a float getter (#601)
  • Added source.time to get a source's clock time.
  • Added max_duration to limit a source's duration.
  • Added file.temp_dir to create temporary directories.
  • Added file.{unlink,rmdir} to remove, resp., file and directories.
  • Added file.write to write content to a file.
  • Added file.read to read contents of a file without loading all of it in memory.
  • Added youtube-pl:<ID> protocol to resolve and parse youtube playlists (or
    any playlist supported by youtube-dl) (#761)
  • Added protocol.aws.endpoint setting for the s3:// protocol, thanks to
    @RecursiveGreen. (#778)
  • Added support for sandboxing run_process calls. (#785)
  • Added harbor.{http,https}.static to serve static path.
  • Added log.{critical,severe,important,info,warning,debug}. Use aliases in code as well (#800, #801, #802)
  • Added sleep function.
  • Added mkavailable function.
  • Added fade.skip function. (#804)
  • Added video.external.testsrc function.
  • Added video.frame.* and audio.samplerate.
  • Added input.external.ffmpeg and output.external.ffmpeg.
  • Added output.youtube.live.ffmpeg.
  • Added output.file.hls.ffmpeg.
  • Added reopen telnet command in output.external.
  • Enabled external decoders in windows (#742)
  • Added support for bash completion.
  • Added video.add_text.native.
  • Added configure.bindir
  • Added for and while loop functions.
  • Added list.case.
  • Added metadata.string_getter and metadata.float_getter.
  • Added string.contains.
  • Added request.uri.
  • Added {input,output}.srt (#898)
  • Added path.remove_extension.
  • Added SSL read/write timeout options, use it for incoming socket connections (#932)
  • Added ffmpeg resampler (#947).
  • Added lsl and lsr.

Changed:

  • Depends on OCaml >= 4.08.0
  • Changed return type of http.* and run_process to use tuples (#838)
  • Better error reporting with coloring and uniform format. (#790)
  • Improved reporting of file, line and character during parsing errors.
  • Remove dynamic plugin build option.
  • Made on_end delay a float getter.
  • Reimplemented fade.{in,initial,out,final} as scripted operators. (#664)
  • Removed cross/crossfade operators, superseeded by
    smart_cross/smart_crossfade
  • Rename smart_cross/smart_crossfade operators as cross/crossfade
  • Default behavior of crossfade is old (simple) crossfade. Use smart=true
    to enable old smart_crossfade behavior.
  • Rename file.duration as request.duration
  • Removed duplicate is_directory
  • Rename {basename,dirname} as path.{is_directory,basename,dirname}
  • Empty playlists return by scripted resolvers is now considered a failure to
    resolve.
  • Rewrite smooth_add to use new mkcross functions.
  • Reimplemented open_process_full to get a hand on pid and finer-grained
    closing workflow (#703)
  • Added transition_length to switch-based operators to limit transition
    lengths and allow garbage collection of transition sources.
  • SDL renders text in UTF-8. (#712)
  • Made x and y parameters in video.add_text float getters. (#730)
  • Reimplemented extract-replaygain using ffmpeg, added an optional replay
    gain option to the ffmpeg2wav protocol. Thanks to @Yamakaky for contributing
    on this. (#749)
  • The ratio parameter of compress and limit is a float getter. (#745)
  • Removed rewrite_metadata which had been deprecated for a while now.
  • Allow string getter for harbor HTTP responses.
  • Renamed get_clock_status to clock.status and log_clocks to clock.log.
  • Renamed rms_window parameter of compress to window. (#796)
  • Added chop operator.
  • Keep master tracks' boundaries in mux_* functions. (#795)
  • Added new_track optional argument to callback in insert_metadata.
  • Use getters for weights of rotate. (#808)
  • Added conservative, length and default_duration params to
    playlist.{reloadable,once,merge} (#818)
  • Renamed input.external into input.external.rawaudio, added
    input.external.wav.
  • Renamed gstreamer.hls to output.file.hls.gstreamer.
  • Raise an error when using a format (e.g. %vorbis, %mp3, ..) that is not
    enabled. (#857)
  • Set default encoders and ladspa plugins samplerate and channels to configured
    internal "frame.audio.samplerate" and "frame.audio.channels". (#870)
  • Handle unary minus in the preprocessor instead of the parser in order to avoid
    duplicating the parser. (#860)
  • Add filter option to playlist.once.
  • Added a replay_delay option to the pipe operator to replay metadata and
    breaks after a delay instead of restart the piping process. (#885)
  • Add buffer_length telnet command to input.harbor.
  • Bumped default length parameter for request-based sources (playlist,
    request.dynamic, ..) to 40. to assure that there always is at least
    one request ready to play when the current one ends.
  • Added support for cue in/out and fade in/out/type metadata support in ffmpeg2wav
    protocol. Rename protocol to ffmpeg. (#909)
  • list.assoc and list.remove_assoc require an ordered type as first
    component.
  • Renamed quote to string.quote.
  • Added phase_inversion={true/false} to %opus encoder (#937)
  • Fixed encoders forcing frame rate and audio channels too early (#933)
  • Change filename to a string getter in file-based outputs. (#198)
  • Changed audio.converter.samplerate.preferred option to
    audio.converter.samplerate.converters to give a list of possible converters.

Fixed:

  • Lack of documentation for cross/crossfade (#743)
  • Fixed before metadata being lost during crossfade not in conservative mode.
  • Correct types and default values for random.int (#767).
  • Allow changing pipeline in gstreamer functions. (#762)
  • Script deadlock after a long time, most likely related to old crossfade
    transitions (#755)
  • AVI export fixed. (#789)
  • %external does not stop processes anymore on each metadata. (#789)
  • Fixed exit getting stuck when using input.jack (#769)
  • Stop lo server on shutdown. (#820)
  • Fixed external process stop not detected on second and further calls (#833)
  • Add seek in operators where implementation is clear (#853)
  • Do not enter buffering mode between tracks in buffer (#836)
  • Fixed file descriptor leak in external processes (#865)
  • Fixed encoded output creating empty files from failing sources (#876)
  • Fixed cue_cut not working when used before cross/crossfade (#874)
  • Fixed audio glitches when seeking within a MP3 file.
  • Fixed insert_metadata logic when insert new track and metadata (#903)
  • Fixed replay-gain script default location.
  • Fixed audio glitches at the end of crossfade transitions.
  • Specify that list.remove removes only the first occurrence and avoid
    reversing the list (#922).
  • File descriptor leak when using openssl-based operators.
  • Fixed SSL read taking too long to timeout (#932)
  • Fixed output starting when underlying source is not available (#393)

Liquidsoap 1.3.7

10 Apr 03:51
Compare
Choose a tag to compare

Bugfix release which address a particularly annoying timeout issue with external processes. Code change is bigger than usual for a bugfix but call for early testing bring hope that the fixes should be correct and without regressions.

Changed:

  • Reimplemented open_process_full to get a hand on pid and finer-grained closing workflow (#703)

  • Better log message when request download times out (#708)

  • Drop log.level for ffmpeg messages to 5

Fixed:

  • Timeout when executing external processes (#691, #736, #726, #708)

  • Set buffering only when frame is partial in time_wrap.ml. Makes it work with crossfade transitions (#695)

  • Changed Icy-MetaData:1 to Icy-MetaData: 1 in HTTP source headers. Fixes some shoutcast implementations (#727)

  • Fixed deadlock in input.http source status command (#367)

Liquidsoap 1.3.6

23 Jan 16:00
Compare
Choose a tag to compare

1.3.6 (23-01-2019)

Fixed:

  • Fixed smart_crossfade transitions skipping data after track marks. (#683, #652)

  • Fixed input.pulseaudio parameters.

  • Fixed crash when copying frame content (#684)

Liquidsoap 1.3.5

25 Dec 22:53
Compare
Choose a tag to compare

1.3.5 (25-12-2018)

New:

  • Added a bunch of base mathematics primitive, exp, log, cos, sine, ...

  • Added "extinf_duration" to parsed #EXTINF metadata.

Fixed:

  • Fixed inotify watch semantics (#677)

  • Enhanced #EXTINF parsing in ambigious cases (#625)

  • Fixed output.youtube.live (#630)

  • Make sure server writes are synchronous (#643)

  • Fixed crash when loading some frei0r plugins (#435)

  • Fixed compilation with osx-secure-transport

  • Fixed invalid opus stream generated when no data was ever encoded (#180)

Liquidsoap 1.3.4

11 Sep 05:04
Compare
Choose a tag to compare

Tons of bug fixes and several neat improvements.

Changelog

New:

  • Added FFMPEG decoder using the new ocaml-ffmpeg API. Thanks for @gndl for the hard work there.

  • Added "init.allow_root" setting to allow running liquidsoap as root.

  • Added on_track callback for playlists. Can be used to force a reload.

  • Added server.condition, server.wait, server.broadcast and server.signal. Used to control server command execution.

  • Added server.write, server.read{chars,line} to write interactive server commands in conjunction with the above functions. (#544, #568)

  • Added output.youtube.live as a wrapper around output.gstreamer.audio_video to stream live to Youtube (#498)

  • Added metadata extraction to ffmpeg2wav protocol (#623).

Changed:

  • Depends on OCaml >= 4.03.0

  • Depends on camomile > 1.0.0

  • Use http{s}.head when available to fetch remote file's mime type. (win32 port)

  • Better log messages for root exit and buffer override.

  • Switch default log to stdout. Set to file when log.file.path is set (#612)

  • Disabled Gstreamer stream decoder.

  • Removed asynchronous mode for output.gstreamer.audio_video

  • Reworked smartcross internal logic (#596)

  • Enabled replaygain on m4a files, thanks to @gilou (#604)

  • Added encoding parameter to output.shoutcast to allow alternative string encoding for metadata updates (#411)

  • Deprecated rewrite_metadata

Fixed:

  • Decouple dyntools compilation.

  • Support for OCaml >= 4.06

  • File descriptor leak in output.icecast (#548)

  • Fixed URL regexp for input.https (#593)

  • Multiple gstreamer fixes:

  • Duppy crash on exit (#160)

  • Fixed audio glitches when using the pipe operator (#614)

  • Deadlock in external decoder. (#611)

Liquidsoap 1.3.3

14 Oct 18:39
Compare
Choose a tag to compare

This a minor release, containing mostly bug fixes and a couple of new features.

Changelog:

New:

  • Added on_change to register

  • Added IPv6 support for input.harbor. (#491)

  • Added time, localtime and gmtime to help with time-predicates (#481)

  • Added on_start to execute callback when liquidsoap starts.

  • Added enable_external_ffmpeg_decoder to enable ffmpeg-base external decoder.

  • Added "decoder.external.{ffmpeg,ffprobe,flac,metaflac,faad,mpcdec}.path" configuration settings.

Changed:

  • Renamed secure transport harbor key paths to: harbor.secure_transport.*

  • Renamed secure transport I/O to: {input,output}.harbor.secure_transport.

  • Added .wma to gstreamer file decoder file extensions (#483)

Fixed:

  • Fixed memory leak in output.icecast connection method. (#490)

  • Fixed mutexify

  • Make sure that metadata are always passed in increasing position order in map_metadata (#469)

Liquidsoap 1.3.2

02 Sep 16:20
Compare
Choose a tag to compare

This is a bugfix release, mostly related to SSL support and execution of external process.

ChangeLog

Changed:

  • Removed kick telnet/server command, duplicate of stop.

  • Support replaygain for mp3 files, thanks to @d4h3r0 (#460)

  • Implement input.harbor.ssl using SecureTransport for OSX.

Fixed:

  • Fix scheduler loop causing high CPU usage when using Process_handler without some of the default callbacks. (#475)

  • Revert wait_for implementation to pre-1.3.0, using a custom select loop (#453)

  • Handle mime-type arguments in input.harbor streams. (#456)

  • Tell ocaml to use the same C compiler at build and link time. Fixes build on FreeBSD when using C++-based bindings such as taglib. (#465)

  • Accept any capitalization of HTTP(S) as regular HTTP URL (#464)

  • Fix compilation with osx-secure-transport enabled.

Liquidsoap 1.3.1

28 May 09:55
Compare
Choose a tag to compare

This is a bugfix release, addressing a couple of bugs from the recent 1.3.0 release. Changelog is:

New:

  • Allow any tags allowed in "encoder.encoder.export" settings in vorbis streams (#418)

  • Allow "audio/mp3" mime-type for mp3 in file resolution protocol. (#451)

Fixed:

  • Fixed run_process, get_process_lines, get_process_output when compiling with OCaml <= 4.03 (#437, #439)

  • Calls to wait_for while the scheduler isn't running (#442)

  • Revert default handling of environment in run_process, get_process_lines, get_process_output to passing calling process' environment by default.