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
ffmpeglibrary. This allows a wide range of codec support both as input and output. Support is limited to audio for this release but is expected to extend to video for the next major release. -
External executions can now optionally be sandboxed using bubblewrap. This feature can enhance the security of your setup if, for instance, your radio receives URLs from external sources.
-
HLS output is now supported via
output.file.hlsandoutput.harbor.hls[.ssl]. -
cross/crossfadeandsmart_cross/smart_crossfadeare now merged. Newcross/crossfadebehave like the old crossfade operators by default and like their smart counter-part by passingsmart=true. 'override_durationmetadata now uses the label"liq_cross_duration"`. -
SRT input and output are now supported, via
input.srtandoutput.srt
Full changelog:
New:
- UTF8 parsing!
- Added support for tuples:
x = (1,"aa",false)(#838) - Added support for deconstructing tuples:
let (z,t,_) = x(#838) - Added
input.{file,harbor}.hlsto read HLS stream (#59, #295, #296). - Added
output.hlsto natively stream in HLS (#758). - Added
%ffmpegnative encoder, only for audio encoding for now (#952) - Added ffmpeg-based stream decoder, limited to mime type
application/ffmpegfor now. - Added
(to_){string,float,int,bool}_getteroperators to handle getters in
script side. - Made
pparameter insmooth_addafloatgetter (#601) - Added
source.timeto get a source's clock time. - Added
max_durationto limit a source's duration. - Added
file.temp_dirto create temporary directories. - Added
file.{unlink,rmdir}to remove, resp., file and directories. - Added
file.writeto write content to a file. - Added
file.readto read contents of a file without loading all of it in memory. - Added
youtube-pl:<ID>protocol to resolve and parse youtube playlists (or
any playlist supported byyoutube-dl) (#761) - Added
protocol.aws.endpointsetting for thes3://protocol, thanks to
@RecursiveGreen. (#778) - Added support for sandboxing
run_processcalls. (#785) - Added
harbor.{http,https}.staticto serve static path. - Added
log.{critical,severe,important,info,warning,debug}. Use aliases in code as well (#800, #801, #802) - Added
sleepfunction. - Added
mkavailablefunction. - Added
fade.skipfunction. (#804) - Added
video.external.testsrcfunction. - Added
video.frame.*andaudio.samplerate. - Added
input.external.ffmpegandoutput.external.ffmpeg. - Added
output.youtube.live.ffmpeg. - Added
output.file.hls.ffmpeg. - Added
reopentelnet command inoutput.external. - Enabled external decoders in windows (#742)
- Added support for bash completion.
- Added
video.add_text.native. - Added
configure.bindir - Added
forandwhileloop functions. - Added
list.case. - Added
metadata.string_getterandmetadata.float_getter. - Added
string.contains. - Added
request.uri. - Added
{input,output}.srt(#898) - Added
path.remove_extension. - Added SSL read/write timeout options, use it for incoming socket connections (#932)
- Added ffmpeg resampler (#947).
- Added
lslandlsr.
Changed:
- Depends on OCaml >= 4.08.0
- Changed return type of
http.*andrun_processto use tuples (#838) - Better error reporting with coloring and uniform format. (#790)
- Improved reporting of file, line and character during parsing errors.
- Remove dynamic plugin build option.
- Made
on_enddelay a float getter. - Reimplemented
fade.{in,initial,out,final}as scripted operators. (#664) - Removed
cross/crossfadeoperators, superseeded by
smart_cross/smart_crossfade - Rename
smart_cross/smart_crossfadeoperators ascross/crossfade - Default behavior of
crossfadeis old (simple) crossfade. Usesmart=true
to enable oldsmart_crossfadebehavior. - Rename
file.durationasrequest.duration - Removed duplicate
is_directory - Rename
{basename,dirname}aspath.{is_directory,basename,dirname} - Empty playlists return by scripted resolvers is now considered a failure to
resolve. - Rewrite
smooth_addto use newmkcrossfunctions. - Reimplemented
open_process_fullto get a hand onpidand finer-grained
closing workflow (#703) - Added
transition_lengthtoswitch-based operators to limit transition
lengths and allow garbage collection of transition sources. - SDL renders text in UTF-8. (#712)
- Made
xandyparameters invideo.add_textfloatgetters. (#730) - Reimplemented
extract-replaygainusingffmpeg, added an optional replay
gain option to theffmpeg2wavprotocol. Thanks to @Yamakaky for contributing
on this. (#749) - The
ratioparameter ofcompressandlimitis a float getter. (#745) - Removed
rewrite_metadatawhich had been deprecated for a while now. - Allow string getter for
harborHTTP responses. - Renamed
get_clock_statustoclock.statusandlog_clockstoclock.log. - Renamed
rms_windowparameter ofcompresstowindow. (#796) - Added
chopoperator. - Keep master tracks' boundaries in
mux_*functions. (#795) - Added
new_trackoptional argument to callback ininsert_metadata. - Use getters for weights of
rotate. (#808) - Added
conservative,lengthanddefault_durationparams to
playlist.{reloadable,once,merge}(#818) - Renamed
input.externalintoinput.external.rawaudio, added
input.external.wav. - Renamed
gstreamer.hlstooutput.file.hls.gstreamer. - Raise an error when using a format (e.g.
%vorbis,%mp3, ..) that is not
enabled. (#857) - Set default encoders and ladspa plugins samplerate and channels to configured
internal"frame.audio.samplerate"and"frame.audio.channels". (#870) - Handle unary minus in the preprocessor instead of the parser in order to avoid
duplicating the parser. (#860) - Add
filteroption toplaylist.once. - Added a
replay_delayoption to thepipeoperator to replay metadata and
breaks after a delay instead of restart the piping process. (#885) - Add
buffer_lengthtelnet command toinput.harbor. - Bumped default
lengthparameter for request-based sources (playlist,
request.dynamic, ..) to40.to assure that there always is at least
one request ready to play when the current one ends. - Added support for cue in/out and fade in/out/type metadata support in
ffmpeg2wav
protocol. Rename protocol toffmpeg. (#909) list.assocandlist.remove_assocrequire an ordered type as first
component.- Renamed
quotetostring.quote. - Added
phase_inversion={true/false}to%opusencoder (#937) - Fixed encoders forcing frame rate and audio channels too early (#933)
- Change filename to a string getter in file-based outputs. (#198)
- Changed
audio.converter.samplerate.preferredoption to
audio.converter.samplerate.convertersto give a list of possible converters.
Fixed:
- Lack of documentation for
cross/crossfade(#743) - Fixed before metadata being lost during crossfade not in conservative mode.
- Correct types and default values for
random.int(#767). - Allow changing pipeline in gstreamer functions. (#762)
- Script deadlock after a long time, most likely related to old crossfade
transitions (#755) - AVI export fixed. (#789)
%externaldoes not stop processes anymore on each metadata. (#789)- Fixed exit getting stuck when using
input.jack(#769) - Stop lo server on shutdown. (#820)
- Fixed external process stop not detected on second and further calls (#833)
- Add
seekin operators where implementation is clear (#853) - Do not enter buffering mode between tracks in
buffer(#836) - Fixed file descriptor leak in external processes (#865)
- Fixed encoded output creating empty files from failing sources (#876)
- Fixed
cue_cutnot working when used beforecross/crossfade(#874) - Fixed audio glitches when seeking within a MP3 file.
- Fixed
insert_metadatalogic when insert new track and metadata (#903) - Fixed
replay-gainscript default location. - Fixed audio glitches at the end of crossfade transitions.
- Specify that
list.removeremoves only the first occurrence and avoid
reversing the list (#922). - File descriptor leak when using openssl-based operators.
- Fixed SSL read taking too long to timeout (#932)
- Fixed output starting when underlying source is not available (#393)