Liquidsoap 1.4.0
This is with great pleasure (and a bit of relief!) that we can now announce that liquidsoap 1.4.0
is out! 🎉
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
andoutput.harbor.hls[.ssl]
. -
cross
/crossfade
andsmart_cross
/smart_crossfade
are now merged. Newcross
/crossfade
behave 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.srt
andoutput.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 insmooth_add
afloat
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 byyoutube-dl
) (#761) - Added
protocol.aws.endpoint
setting for thes3://
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.*
andaudio.samplerate
. - Added
input.external.ffmpeg
andoutput.external.ffmpeg
. - Added
output.youtube.live.ffmpeg
. - Added
output.file.hls.ffmpeg
. - Added
reopen
telnet command inoutput.external
. - Enabled external decoders in windows (#742)
- Added support for bash completion.
- Added
video.add_text.native
. - Added
configure.bindir
- Added
for
andwhile
loop functions. - Added
list.case
. - Added
metadata.string_getter
andmetadata.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
andlsr
.
Changed:
- Depends on OCaml >= 4.08.0
- Changed return type of
http.*
andrun_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 ascross
/crossfade
- Default behavior of
crossfade
is old (simple) crossfade. Usesmart=true
to enable oldsmart_crossfade
behavior. - Rename
file.duration
asrequest.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_add
to use newmkcross
functions. - Reimplemented
open_process_full
to get a hand onpid
and finer-grained
closing workflow (#703) - Added
transition_length
toswitch
-based operators to limit transition
lengths and allow garbage collection of transition sources. - SDL renders text in UTF-8. (#712)
- Made
x
andy
parameters invideo.add_text
float
getters. (#730) - Reimplemented
extract-replaygain
usingffmpeg
, added an optional replay
gain option to theffmpeg2wav
protocol. Thanks to @Yamakaky for contributing
on this. (#749) - The
ratio
parameter ofcompress
andlimit
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
toclock.status
andlog_clocks
toclock.log
. - Renamed
rms_window
parameter ofcompress
towindow
. (#796) - Added
chop
operator. - Keep master tracks' boundaries in
mux_*
functions. (#795) - Added
new_track
optional argument to callback ininsert_metadata
. - Use getters for weights of
rotate
. (#808) - Added
conservative
,length
anddefault_duration
params to
playlist.{reloadable,once,merge}
(#818) - Renamed
input.external
intoinput.external.rawaudio
, added
input.external.wav
. - Renamed
gstreamer.hls
tooutput.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 toplaylist.once
. - Added a
replay_delay
option to thepipe
operator to replay metadata and
breaks after a delay instead of restart the piping process. (#885) - Add
buffer_length
telnet command toinput.harbor
. - Bumped default
length
parameter 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.assoc
andlist.remove_assoc
require an ordered type as first
component.- Renamed
quote
tostring.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 beforecross
/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)