Releases: savonet/liquidsoap
Liquidsoap 1.4.3
This is the 3rd bugfix release for the 1.4.x
branch. It contains important fixes and a couple of new minor features. Update is recommended and should be fairly safe.
Along we this release, we have now added builds for arm64
debian packages and docker-ready production images for amd64
and arm64
architectures available at: https://hub.docker.com/repository/docker/savonet/liquidsoap
Again, we would like to warmly thank all users, contributors and reporters for helping us bring liquidsoap to the next step!
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 here and will be tackled as soon as possible.
New:
- Allow to set min/max/bitrate in mp3 vbr mode (#1294).
- Added optional
http_version
parameters tohttp{s}.*
methods. - Added
on_cue_{in,out}
callbabacks tocue_cut
- Added support for
file:/path/to/file
along withfile:///path/to/file
- Implement default
OPTIONS *
handler for harbor input (#1334)
Changed:
- Fixed default ffmpeg log level.
- Changed default HTTP response for unrecognized harbor
/admin
commands (#1334). - Use replay gain metadata when present (#1102).
Fixed:
- Fixed exponential memory usage in clock unification algorithm (#1272).
- Fixed rotate source order (#1279).
- Fixed invalid new track duration in
crossfade
when track ends while buffering (#1074). - Make sure warnings do not prevent the script from running (#994).
- Fixed seek implementation in FFMPEG decoder (#1291).
- Fixed
http{s}.*
request body reader (#1300). - Fixed duplicate metadata insertion in caching mode (#1241).
- Fixed SSL connection error (#1304).
- Better error reporting for Clock_conflict and Clock_loop errors (#985).
- Make sure playlist change watch is only setup once (#1246).
- Fixed windows service launch (#907).
- Fixed
rotate
not respecting source weights when not used after
selecting a source (#1327). - Bring back
{lastfm,librefm}.submit
(#1343).
Liquidsoap 1.4.2
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 torequest.dynamic
(#1169). - Renamed
request.dynamic
torequest.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
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 savonet-users@lists.sourceforge.net
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)
Liquidsoap 1.3.7
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 onpid
and finer-grained closing workflow (#703) -
Better log message when request download times out (#708)
-
Drop
log.level
forffmpeg
messages to5
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
toIcy-MetaData: 1
in HTTP source headers. Fixes some shoutcast implementations (#727) -
Fixed deadlock in
input.http
source status command (#367)
Liquidsoap 1.3.6
Liquidsoap 1.3.5
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
Tons of bug fixes and several neat improvements.
Changelog
New:
-
Added
FFMPEG
decoder using the newocaml-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
andserver.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 aroundoutput.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) -
Added
encoding
parameter tooutput.shoutcast
to allow alternative string encoding for metadata updates (#411) -
Deprecated
rewrite_metadata
Fixed:
Liquidsoap 1.3.3
This a minor release, containing mostly bug fixes and a couple of new features.
Changelog:
New:
-
Added
on_change
toregister
-
Added IPv6 support for
input.harbor
. (#491) -
Added
time
,localtime
andgmtime
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
togstreamer
file decoder file extensions (#483)
Fixed:
Liquidsoap 1.3.2
This is a bugfix release, mostly related to SSL support and execution of external process.
ChangeLog
Changed:
-
Removed
kick
telnet/server command, duplicate ofstop
. -
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 customselect
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.