github savonet/liquidsoap 1.4.0
Liquidsoap 1.4.0

latest releases: v2.2.5, rolling-release-v2.2.x, v2.2.4...
4 years ago

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)

Don't miss a new liquidsoap release

NewReleases is sending notifications on new releases.