Page
Library
Module
Module type
Parameter
Class
Class type
Source
Changed:
on_file_change events are now "created", "updated" and "deleted", to better reflect the new atomic file operations (#3284)compact argument to the http.response.json function. http.response.json will produce minified JSON by default. Added a newline symbol to the end of the JSON data produced by http.response.json. (#3299)input.http can only use the ffmpeg decoder at the moment.output.file encoding and file handling logic (#3328)ratio to source.{dump,drop} to make it possible to control its CPU peaks.Fixed:
output.harbor (#3255)output.harbor encoder header when encoding with %ogg, %vorbis and etc. (#3276)stereo: protocol in say: protocol: this is now handled automatically by the decoder and generates latency via high CPU usage peak.output.file reopening with flac encoding (#3328)New:
pcm_s16 and pcm_f32 (#3008)socket() method on srt input/outputs (#2556)ocaml-tls (#3074)video.align.string.index.v2.2.0 frames and pictures.track.audio.defer to be used to buffer large amount of audio data (#3136)runtime.locale.force to force the system's locale (#3231)jemalloc memory allocator (#3170)source.drop to animate a source as fast as possible..Added in house replaygain computation:
source.replaygain.compute to compute replaygain of a sourcefile.replaygain to compute the replaygain of a filelet {foo, gni, ..y} = x and y = { foo = 123, gni = "aabb", ...x} (#2737)file.{copy, move} (#2771)null.map.'a are now objects of type (()->'a).{set : ('a) -> unit}. This means that you should use x() instead of !x in order to get the value of a reference. Setting a reference can be done both by x.set(v) and x := v, which is still supported as a notation (#2881).ref.make and ref.map.video.board, video.graph, video.info (#2886).pico2wave protocol in order to perform speech synthesis using Pico TTS (#2934).settings.protocol.gtts.lang to be able to select gtts' language, added settings.protocol.gtts.options to be able to add any other option (#3182)settings.protocol.pico2wave.lang to be able to select pico2wav language (#3182)"metadata_url" to the default list of exported metadata (#2946)list.filter_map and list.flatten.medialib in order to store metadata of files in a folder and query them (#3115).--unsafe option (#3113). This makes the startup much faster but disables some guarantees (and might even make the script crash...).string.split.first (#3146).string.getter.single (#3125).Changed:
dune for building the binary and libraries.cry to be a required dependency.output.harbor, output.icecast output.shoutcast to UTF-8 (#2704)timeout settings and parameters are now float values and in seconds (#2809)BREAKING: in output.{shoutcast,icecast}:
icy_metadata renamed to send_icy_metadata and changed to a nullable bool. null means guess.icy_metadata now returns a list of metadata to send with ICY updates.icy_song argument to generate default "song" metadata for ICY updates. Defaults to <artist> - <title> when available, otherwise artist or title if available, otherwise null, meaning don't add the metadata.icy_id in output.icecast and etc.mount mandatory and name nullable. Use mount as name when name is null.reopen_on_error and reopen_on_metadata in output.file and related operators are now callbacks to allow dynamic handling.reopen method to output.file.%define variables, superseded by support for actual variables in encoders.append source.trace method, making it possible to programmatically point to file, line and character offsets of each step in the error call trace (#2712)harbor http handler API to be more flexible. Added a new node/express-like registration and middleware API (#2599)."liq_fade_out", "liq_fade_skip", "liq_fade_in", "liq_cross_duration" and "liq_fade_type" now all reset on new tracks. Use persist_overrides to revert to previous behavior (persist_override for cross/crossfade) (#2488)./.dockerenv file.id3v2 argument of %mp3 encoder changed to "none" or version number to allow to choose the metadata version. true is still accepted and defaults to version 3. Switched to our internal implementation so that it does not require taglib anymore.self_sync in input.ffmpeg to be a boolean getter, changed self_sync in input.http to be a nullable boolean getter. Set self_sync to true in input.http when an icecast or shoutcast server can be detected.sorted option to file.ls.buffer_length method to input.external.rawaudio and input.external.wav (#2612).OCaml backtrace as trace to runtime errors returned from OCaml code.let json.stringify in favor of json.stringify().video.text, video.add_text, etc.) (#2623).on_cycle option to video.add_text to register a handler when cycling (#2621).{get,set}env into environment.{get,set}add_decoder, add_oblivious_decoder and add_metadata_resolver into, respectively, decoder.add, decoder.oblivious.add, decoder.metadata.addget_mime, added file.mime.libmagic and file.mime.cli, made file.mime try file.mime.libmagic if present and file.mime.cli otherwise, changed eturned value when no mime was found to null().request.duration.--list-plugins-json and --list-plugins-xml options.--list-functions-json option.strftime conversions in output filenames, replaced by an explicit call to time.string (#2593){int,float,bool}_of_string conversion functions, raise an exception if conversion fails and no default is given.string_of in favor of string (#2700).string_of_float in favor of string.float (#2700).settings.protocol.youtube_dl.timeout to specify timeout when using youtube-dl protocol (#2827). Use yt-dlp as default binary for the protocol.sleeper operator is now scripted (#2899).osx-secure-transport. Doubt it was ever used, API deprecated upstream (#3067)rectangle to add_rectangle, and similarly for line.Fixed:
list.shuffle used in playlist was incorrect and could lead to incorrectly randomized playlists (#2507, #2500).input.ffmpeg-based urls (#2956)%external encoder (#3029)New:
buffer_length method to buffer operator.umask() to get the current umask and umask.set(...) to set the current umask (#2840)Changed:
input.external.{rawaudio,rawvideo} (#2860, #2872)disconnect method on input.harbor. This method was doing the same as the stop method. Added shutdown method to properly shutdown the source even when not connected to an output.input.external.{rawaudio,rawvideo} (#2877)Fixed:
stats_interval in SRT I/O.request.dynamic never crash the process (#2897)filename getter being called multiple time in output.file (#2842)output.*.hls operators (#2930)max_duration and crossfade.metadata.json.parse always returns an empty list (#2816).icy_id being ignored in output.shoutcast (#2819)%include directives (#2775)Unix.EINTR event (#2861)string.interpolate (#2883)New:
time.string.error.on_error to report any error raised during the script's execution. Enhanced reported error positions (#2712)device_id and latency options to input.portaudio and output.portaudio to be able to choose the requested device. Use liquidsoap --list-portaudio-devices to see the list of devices (#2733)disconnect method to input.harbor, making it possible to disconnect a source client programmatically, including when a new client is trying to connect.Changed:
http.{post,put}.file when input data is already in memory. This allows to use plain Content-Length instead of chunked transfer encoding in these case, though libcurl seems to always prefer chunked encoding for put requests.perms permission argument (#2725)restart_on_error argument on output.url and added restart_delay which implements a delayed restart. Added on_error argument to be notified of errors (#2731)encoding parameter in string.{quote, escape} to be null. Fallback to "ascii" encoding when no encoding is specified and "utf8" fails. This prevents unexpected script failures but might not be backward-compatible if you used a custom escape_char or special_char function (#2738)Fixed:
song metadata (mapped to title) and url (mapped to metadata_url) in input.harbor (#2676)blank.* operator types.input.external.rawadudio mono input (#2742)http response body on redirect (#2758)New:
string.char, string.getter.flush and string.getter.concat.http.multipart_form_data and http.{post,put}.file.Changed:
sleep() (#2610)taglib (#2605)settings.ffmpeg.content.copy.relaxed_compatibility_check.set settings to allow relaxed compatibility check for ffmpeg copy content, making it possible to encode streams with various audio samplerate or video size when the container supports it.Fixed:
data:... uri scheme to conform to RFC 2397 (#2491)ogg/opus metadata (#2605)video.add_text fails when the source does (#2609)server.insert_metadata (#2619)extract_replaygain path (#2624, @parnikkapore)input.rawaudio (#2602)Internal Change:
ref() implementation switched to OCaml's Atomic to prevent race conditions, thread.mutexify and mutexify functions removed. (#2603)New:
process.quote.command to generate complex quoted command strings suitable for use with process.run and os-independent.Changed:
playlist.remaining into playlist.remaining_files (#2524)id argument to replaygain operator (#2537).ocurl dependency required, added uri as required dependency (#2551)Fixed:
ffmpeg.encode.* inline encoders (#2584)http.get issues when user-agent was not set (#2517)playlist.next returned requests.on_connect type for srt inputs and outputs.rec or replaces (#2560)mp4 HLS segment.New:
http.{post,put} operations (#1984)output.youtube.live.hlsJSON will now raise error.json when converted to JSON. infinite and nan floats can be exported using the json5 export format.liquidsoap.version.at_least.video.rectangle, video.persistence.video.vumeter.video.slideshow.video.add_text.camlimages (#2202).video.text.* and re-implemented video.add_text.* from those (#2226).irc.channel operator to retrieve the contents of an IRC channel (#2210).file.download%ffmpeg copy encoder: ignore_keyframes and wait_for_keyframe (#2382)Changed:
Video dimensions (width and height) can now be specified per stream in the type and are then used instead of the default ones. For instance, you can now write
s = (single("file.mp4") : source(video(width=300,height=200)))in order to force the decoding of a file to be performed at the 300×200 resolution (#2212).
output.youtube.live renamed output.youtube.live.rtmp, remove bitrate and quality arguments and added a single encoder argument to allow stream copy and more.source.on_metadata and source.on_track now return a source as this was the case in previous versions, and associated handlers are triggered only when the returned source is pulled (#2103).streams_info parameter of output.file.hls a record (#2173).video.add_text. You can re-enable it by using video.add_text(speed=70, ...).video.testsrc is now builtin, previous implementation can be found under video.testsrc.ffmpeg.mux_audio(audio=blank(),image) anymore (#2230).timeout argument in http.* operators.request.ready in favor of request.resolved.Fixed:
status command of the mix operator.input.ffmpeg and input.http (#2475)list.shuffle which was used to randomize playlists in playlist operator (#2507, #2500).Fixed:
New:
video/mp4 to list of recognized mime types for request resolutions.Changed:
process.read (##2420, @martinkirch)Fixed:
process.run (#2424)playlist operator.request.destroy calls optionals.New:
Changed:
mix operator (#2401)Fixed:
0.soundtouch, resample and all the muxing operators.string.replace failures with useful message. (#2408)request.dynamic from raising exceptions when checking if the source is ready (#2381)New:
settings.video.add_text to enforce consistent choice of video.add_text implementation (#2302)Changed:
Make sure source shutdown can only be called on sources that can actually be shutdown:
source.shutdowns.shutdown() method only on sources that are active. Refs: #2259map_metadata into metadata.map, deprecated map_metadata.list.mem_assocadd (#2255)timeout_ms to http.* to provide time in milliseconds, deprecated timeout argument.output.icecast when data is available instead of when operator starts to avoid useless connections when underlying source fails immediately.Fixed:
add() as internal in request.queue, fix method length() (#2274)retry_delay being ignored in some cases in request.dynamic.clock(s) after too much latency (#2278)video.add_text.ffmpeg as possible implementation for video.add_text (#2302)http.* calls preventing liquidsoap from shutting down.http protocol not returning an error when timing out (#2242)playlist.parser (#2257)rotate (#2300)video.add_text.ffmpeg (#2324)input.rawaudio and input.rawvideo when handling non-stereo content.New:
memtracetime.{zone,zone.set,make} (#2178)runtime.gc module, rename garbage_collect as runtime.gc.full_major with deprecated compatibility wrapper, added runtime.gc.stat, runtime.gc.quick_stat, runtine.gc.print_stat and runtime.gc.{get,set}.runtime.sys.word_sizeruntime.mem_usageruntime.memory wrapper to get info about the system and process' memory usage.configure.camomile_dir to export expected location of camomile directory when packaging liquidsoap.liquidsoap.chroot.make to copy all files required for a liquidsoap install.Changed:
input.harbor default buffer to 12. to make it possible to use it with crossfade transitions without changing default values (#2156)year method as returned in time.local and time.utc now returns the actual year instead of years since 1900 (#2178)mday, mon, wday and yday methods as returned in time.local and time.utc have been renamed to, resp., day, month, week_day and year_day (#2178)month method as returned in time.local and time.utc now returns the month as a number between 1 and 12 (#2178)week_day method as returned in time.local and time.utc now returns the week day as a number between 1 and 7 (#2178)year_day method as returned in time.local and time.utc now returns the week day as a number between 1 and 366 (#2178)input.rtmp should behave as a server or a client (#2197)video.add_text.ffmpeg (#2189)thread_name argument from thread.on_error callbacks.Fixed:
video.add_text.sdl (#2187)thread.on_error implementation (#2171)ffmpeg video scaling to make sure it always is proportional (#2211)New:
on_get_ready callback to sources, to be executed after a source's has initialized.flush_and_skip telnet command to request.dynamic to empty the request's queue before skipping the current track, forcing a full reload.last_metadata method on sources to return the last metadata produced by the source.Fixed:
input.rtmp (#2089)request.queue queue telnet command returning nothing (#2088)replay_metadata not replaying metadata from active sources (#2109)New:
time.predicate to parse time predicates at runtime.video.add_text.ffmpeg with other operators, make it the default when available. (#2050)Changed:
encode_metadata option in input.file.hls as it does nothing with the main encoder for HLS format, %ffmpeg (#2023)output.icecast optional parameters to nullable.Fixes:
string.escape fails. (#2010)request.dynamic.list's queue and set_queue methods.start/stop commands.perms, dir_perms and append not bring honored when delegating file output to the encoder.process.quote in process calls (#2031)New:
error.* and try ... catch (#1242).null.* (#1242).x ? y : z syntax (#1266).(string, 'a) lists to regular lists, add support for json5 floats (NaN, Infinity), return null for those otherwise, rename json_of into json.stringify and of_json into json.parse with deprecation (#1824)ffmpeg (#1038).ffmpeg (#1380)output.hls (#1391).output.hls (#1391).output.url for encoders that support handling data output (currently only %ffmpeg) (#1038).output.file.dash.ffmpeg.string.nth (#970).string.binary.to_int (#970).string.hex_of_int.file.ls (#1011).file.mp3.metadata, file.mp3.parse_apic and file.cover (#987).lists.exists, list.for_all, list.init, list.ind, list.index, list.last, list.shuffle.request.id.profiler.enable and the results are obtained with profiler.stats.string (#1027).gtts protocol to use Google TTS (#1034).liquidsoap.executable to get the path of the currently running Liquidsoap.source.dump.source.elapsed and source.durationsynth protocol (#1014).input.srt and output.srt (#1377)srt.enforced_encryption setting.validate parameter to register, which allows to validate a value before setting it (#1046, @CyberDomovoy)string.null_terminated (#960).string.utf8.escape in favor or a unifited, utf8-aware string.escape.string.unescape.file.metadata (#1058).predicate.activates, predicate.changes, predicate.first, predicate.once, predicate.signal (#1075).playlist.list.reloadable and playlist.list (#1133).accelerate operator (#1144).video.resize.getter.int_of_float and getter.float_of_int.source.dump (#1036).stereo and synth protocols (#1036).video.add_text.ffmpeg.file:///path/to/file and file:/path/to/fileprotocols.unsafe.single.infallible to single.infallible.list.indexed.for and while loops (#1252).min and max functions.lufs to compute the LUFS loundness (#1497).interactive.harbor in order to expose interactive variables over harbor (#1495).interactive.persistent (as well as interactive.save and interactive.load) to make interactive variables persistent (#1495).server.habor (#1502).metronome.playlist.files.getter.is_constant.assert.source.available.request.once.file.getter.normalize function (with more reasonable parameters, more customisable, and written in Liquidsoap) is now provided. The old one is renamed normalize.old.compress function. The previous one was renamed compress.old (#868, #869).stereo.width.file.mkdir.time.up.video.cover.video.still_frame.request.status.playlog to record how long ago a song was last played (#333 and #1530).clock.log_delay to configure how often clock catchup error messages should be printed.input.rtmp (#1640).%ifversion and %else preprocessing commands (#1682).dtmf and dtmf.detect to generate and detect DTMF tones (#1796).sine.detect to detect sines (#1796).on_air_timestamp to request's metadata to get the request's on_air time as a Unix timestamp (#1871)Changed:
active_source type, make all output return unit type. (#1671)fallback, rotate, random) as scripted operators, removed track_sensitive argument from rotate and random as it does not have a sound meaning for them.code to shutdown.verb argument info method in output.icecast.add behavior, also fixing an clock issue (#668).fallible option to single operator.input.ffmpeg to control its own clock or delegate to CPU clock (#1628)input.http using ffmpeg, deprecate input.https in favor of unified input.http (#1628)input.http and input.ffmpeg url parameter into a string getterrequest.queue into a Liquidsoap implementation (#1013).request.equeue, such a feature could be re-implemented in Liquidsoap, see request.queue.playlist operator is now fully implemented in Liquidsoap (#1015).playlist.once, its behavior can be achieved by passing "never" to the reload_mode argument of playlist (#1015).playlist.merged: it is not that useful and can be achieved easily with merge_tracks on a playlist (#1015).playlist.safe (#1015).add_timeout to thread.run.recurrent, added thread.run variant, renamed exec_at to thread.when and renamed mutexify to thread.mutexify (#1019).add to float (#1022).which to file.which.blank() duration semantics to mean forever only on negative values.base64.decode/base64.encode to string.base64.decode/string.base64.encode.input.http and input.https url parameter into a string getter (#1084).path.home.unrelate.video.add_image (#1176).x, y, width and height argument to image, unify with video.add_image.audio_to_stereo to video frames and those without audio.empty to fail.request.dynamic (#1213).request.create.raw, you should use request.create instead.http.*, https.*, rms, peak and request.queue (#1234).string.extract are now integers instead of strings (#1240).l[k] notation so that the key k can be of any type (on which we know how to compare).ref is not a keyword anymore: this means that ref x is not accepted anymore, you need to write ref(x) (#1254).file.unlink to file.remove.get_process_output, get_process_lines, test_process and system in favor of process.run, process.read, process.read.lines and process.test.http_codes to http.codes and put first member as integer.http.response to http.response and http.response.stream to http.response.stream.localtime and gmtime now return a record.{eat,strip,skip,on}_blank in favor of blank.{eat,strip,skip,detect}.http{,s}.{get,post,push} now perform redirections if needed, which can be disabled with the redirect parameter (#1319).gettimeofday in favor or time, renamed localtime to time.local and gmtime to time.utc, and the argument of these two last functions is now optional (#1320).gavl video converter in favor of ffmpeg.persist argument in output.*.hls and use nullable value for persist_at.input and output in favor or setting your desired input or output explicitly.interactive.* on script side (#1493).file.write does not return a boolean anymore, exceptions are used for exceptional cases (#1500).source.dynamic now takes a nullable argument.on_end to source.on_end.fallback.skip.Normalize ReplayGain handling:
replaygain_track_gain metadatareplay_gain to replaygainreplaygain operator to perform amplificationnormalize now handles all channels uniformly.filter.rc now takes the cutoff frequency instead of the time constant as argument.file.watch now returns unit with unwatch method.bpm: the bpm can now be retrieved using a method of the returned source instead of having a callback.server.read* and server.write*.Fixed:
cloexec on all relevant Unix calls (#1192).blank() source unavailable past is expected duration (#668).video.add_text.gstreamer shade in background (#1190).video.add_text.gd (#1188).= in them (#1340).input.harbor (#1944)"tracknumber" and "year" returning 0 in taglib (#1901)Removed:
New:
process.quote to quote process' arguments (#1215)Changed:
amplify (#1323)Fixed:
{http,https} body (#1417)input.harbor shoutcast client connection (#1353)random track selection (#1468)reload="watch" with inotify on a folder (#1451)Fixed:
New:
retry_delay argument to request.dynamic (#1169).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:
audio/flac as mime for flac (#1143).request.dynamic.Fixed:
extract-replaygain script (#1125)~/path/to/.. paths.set_default_verify_paths for SSL (#450)rotate (#1129).output.icecast using the given encoding (#1092)insert_metadata from being visible to underlying sources (#1115)cross() fallability.output.hlsget_process_lines regexp logic (#1151)New:
retry_delay argument to request.dynamic (#1169).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:
audio/flac as mime for flac (#1143).request.dynamic.Fixed:
extract-replaygain script (#1125)~/path/to/.. paths.set_default_verify_paths for SSL (#450)rotate (#1129).output.icecast using the given encoding (#1092)insert_metadata from being visible to underlying sources (#1115)cross() fallability.output.hlsget_process_lines regexp logic (#1151)Fixed:
fade.final and fade.initial (#1009)New:
x = (1,"aa",false) (#838)let (z,t,_) = x (#838)input.{file,harbor}.hls to read HLS stream (#59, #295, #296).output.hls to natively stream in HLS (#758).%ffmpeg native encoder, only for audio encoding for now (#952)application/ffmpeg for now.(to_){string,float,int,bool}_getter operators to handle getters in script side.p parameter in smooth_add a float getter (#601)source.time to get a source's clock time.max_duration to limit a source's duration.file.temp_dir to create temporary directories.file.{unlink,rmdir} to remove, resp., file and directories.file.write to write content to a file.file.read to read contents of a file without loading all of it in memory.youtube-pl:<ID> protocol to resolve and parse youtube playlists (or any playlist supported by youtube-dl) (#761)protocol.aws.endpoint setting for the s3:// protocol, thanks to @RecursiveGreen. (#778)run_process calls. (#785)harbor.{http,https}.static to serve static path.log.{critical,severe,important,info,warning,debug}. Use aliases in code as well (#800, #801, #802)sleep function.mkavailable function.fade.skip function. (#804)video.external.testsrc function.video.frame.* and audio.samplerate.input.external.ffmpeg and output.external.ffmpeg.output.youtube.live.ffmpeg.output.file.hls.ffmpeg.reopen telnet command in output.external.on_frame (#886).video.add_text.native.configure.bindirfor and while loop functions.list.case.metadata.getter and metadata.getter.float.string.contains.request.uri.{input,output}.srt (#898)path.remove_extension.lsl and lsr.Changed:
http.* and run_process to use tuples (#838)on_end delay a float getter.fade.{in,initial,out,final} as scripted operators. (#664)cross/crossfade operators, superseded by smart_cross/smart_crossfadesmart_cross/smart_crossfade operators as cross/crossfadecrossfade is old (simple) crossfade. Use smart=true to enable old smart_crossfade behavior.file.duration as request.durationis_directory{basename,dirname} as path.{is_directory,basename,dirname}smooth_add to use new mkcross functions.open_process_full to get a hand on pid and finer-grained closing workflow (#703)transition_length to switch-based operators to limit transition lengths and allow garbage collection of transition sources.x and y parameters in video.add_text float getters. (#730)extract-replaygain using ffmpeg, added an optional replay gain option to the ffmpeg2wav protocol. Thanks to @Yamakaky for contributing on this. (#749)ratio parameter of compress and limit is a float getter. (#745)rewrite_metadata which had been deprecated for a while now.harbor HTTP responses.get_clock_status to clock.status and log_clocks to clock.log.rms_window parameter of compress to window. (#796)chop operator.mux_* functions. (#795)new_track optional argument to callback in insert_metadata.rotate. (#808)conservative, length and default_duration params to playlist.{reloadable,once,merge} (#818)input.external into input.external.rawaudio, added input.external.wav.gstreamer.hls to output.file.hls.gstreamer.%vorbis, %mp3, ..) that is not enabled. (#857)"frame.audio.samplerate" and "frame.audio.channels". (#870)filter option to playlist.once.replay_delay option to the pipe operator to replay metadata and breaks after a delay instead of restart the piping process. (#885)buffer_length telnet command to input.harbor.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.ffmpeg2wav protocol. Rename protocol to ffmpeg. (#909)list.assoc and list.assoc.remove require an ordered type as first component.quote to string.quote, removed process.quote in favor or string.quote (#1635)phase_inversion={true/false} to %opus encoder (#937)audio.converter.samplerate.preferred option to audio.converter.samplerate.converters to give a list of possible converters.Fixed:
cross/crossfade (#743)random.int (#767).%external does not stop processes anymore on each metadata. (#789)input.jack (#769)seek in operators where implementation is clear (#853)buffer (#836)cue_cut not working when used before cross/crossfade (#874)insert_metadata logic when insert new track and metadata (#903)replay-gain script default location.list.remove removes only the first occurrence and avoid reversing the list (#922).string.escape also quoting its string.Changed:
open_process_full to get a hand on pid and finer-grained closing workflow (#703)log.level for ffmpeg messages to 5Fixed:
Icy-MetaData:1 to Icy-MetaData: 1 in HTTP source headers. Fixes some shoutcast implementations (#727)input.http source status command (#367)Fixed:
smart_crossfade transitions skipping data after track marks. (#683, #652)input.pulseaudio parameters.New:
exp, log, cos, sine, ..."extinf_duration" to parsed #EXTINF metadata.Fixed:
#EXTINF parsing in ambiguous cases (#625)output.youtube.live (#630)osx-secure-transportNew:
FFMPEG decoder using the new ocaml-ffmpeg API. Thanks for @gndl for the hard work there."init.allow_root" setting to allow running liquidsoap as root.on_track callback for playlists. Can be used to force a reload.server.condition, server.wait, server.broadcast and server.signal. Used to control server command execution.server.write, server.read{chars,line} to write interactive server commands in conjunction with the above functions. (#544, #568)output.youtube.live as a wrapper around output.gstreamer.audio_video to stream live to Youtube (#498)ffmpeg2wav protocol (#623).Changed:
http{s}.head when available to fetch remote file's mime type. (win32 port)log.file.path is set (#612)output.gstreamer.audio_videosmartcross internal logic (#596)replaygain on m4a files, thanks to @gilou (#604)encoding parameter to output.shoutcast to allow alternative string encoding for metadata updates (#411)rewrite_metadataFixed:
output.icecast (#548)input.https (#593)Multiple gstreamer fixes:
pipe operator (#614)New:
on_change to registerinput.harbor. (#491)time, localtime and gmtime to help with time-predicates (#481)on_start to execute callback when liquidsoap starts.enable_external_ffmpeg_decoder to enable ffmpeg-base external decoder."decoder.external.{ffmpeg,ffprobe,flac,metaflac,faad,mpcdec}.path" configuration settings.Changed:
harbor.secure_transport.*{input,output}.harbor.secure_transport..wma to gstreamer file decoder file extensions (#483)Fixed:
output.icecast connection method. (#490)mutexifymap_metadata (#469)Changed:
kick telnet/server command, duplicate of stop.replaygain for mp3 files, thanks to @d4h3r0 (#460)input.harbor.ssl using SecureTransport for OSX.Fixed:
wait_for implementation to pre-1.3.0, using a custom select loop (#453)input.harbor streams. (#456)Gc.finalise (#609)New:
"encoder.encoder.export" settings in vorbis streams (#418)"audio/mp3" mime-type for mp3 in file resolution protocol. (#451)Fixed:
run_process, get_process_lines, get_process_output when compiling with OCaml <= 4.03 (#437, #439)wait_for while the scheduler isn't running (#442)run_process, get_process_lines, get_process_output to passing calling process' environment by default.New:
track_sensitive parameter to a boolean getter (fixed value or anonymous function).of_json.list.assoc(k,l) -> list.assoc(default="",k,l)list.hd(l) -> list.hd(default="",l)list.nth(l,pos) -> list.nth(default=<..>,l,pos)on_offset to execute a callback at a given offset within a source's tracks.overlap_sources to rotate between sources with overlapping tracks.replay_metadata to input.harbor()\<char code> syntax for strings (#368)run_process to run a process with optional environment and return (stdout,stderr,exit_status)add_playlist_parser to register new playlist parsersprotocol.addaudio_to_stereo().which() to find an executable within the $PATHregister() to allow to register new configuration settingsChanged:
--error_as_warnings option, renamed to --strict.get_process_lines and get_process_output to utils.liq, added optional env parameterconservative=true by default in cross() and smartcross()Deprecated (can be removed in any future version):
Removed:
force_mpeg option in taglib metadata decoder. Has not been used for years and allows to decouple taglib code from the mad decoder.Bugfixes:
input.harbor (#380)fade.{in,out} metadata handling for new fade duration and type.add() to avoid unexpected change of volume.New:
http.{put,head,delete}, https.{get,post,head,put,delete}.input.https.list.mapi.rotate.sequence.pipe() operator to pipe audio data through an external program.Bugfixes:
input.harbor using the shoutcast v1 protocol (#337).New:
url.split_args to split the argument of an url (#123).buffer.adaptative to cope with small network delays (#131).stereo.left and stereo.right to extract channels from a stereo stream.file.contents to read the contents of a file.filter.rc for first-order RC filters.Enhancements:
osc.send_*).fade.in / fade.out (#64).%mp3.fxp to %shine.Bugfixes:
input.lastfm which has been broken for a while.New:
Enhancements:
float, float_pair, bool, string, string_pair) and added osc.on_*.add_image can now handle most image file types.random.int as well as min_int and max_int to standard library.playlist.merge to play a whole playlist as one track.gstreamer.hls to play http live streams (HLS).say.program to specify text-to-speech program in scripts.video.fade.* in order to select a random transition each time.input.gstreamer.*.bytes_per_page parameter to ogg encoders.Bugfixes:
Avoid jack I/O lowering the volume.
** This version brings some new features as well as correcting bugs. **
New:
set("request.metadata_decoders.duration",true)Allow %define'd variables in encoding formats [LS-634], e.g.
%define BITRATE 24
%define STEREO true
output.file(%mp3(bitrate = BITRATE, stereo = STEREO),"bla.mp3",s)Enhancements:
s = playlist("~/Music",reload_mode="watch"). Also, add file.watch to call a callback when a file is changed, with inotify support when present.set("video.converter.preferred", "ffmpeg")back_time argument to blank operators [LS-609].clock.unify to unify clocks of all sources from a list.source_url metadata to input.http streams.video.add_image can now take any image format as input.mux_stereo.Bugfixes:
Argv.(0) now returns the script name [LS-605].smart_cross.input.http.Handle end-of-stream when seeking mp3 with mad.
** This version brings bug fixes and minor enhancements over 1.0.0. **
Fixes:
output.external() thanks to Romaric Petion for pointing it outsmart_cross() would stop before the end of tracks, thanks to Edward Kimber for raising the issueinput.http() and input.harbor() to allow variable content kinds, and also allow video for harbor [LS-601]request.equeue() now allows to remove requests from the primary queueNew:
request.metadata_decoders.override to restore old behaviorstereo_mode and internal_quality parameters for %mp3 encodergetenv(), setenv() and environment()source.fallible()dssi.register()Finally, the 1.0.0 release! It brings several important fixes, but also some nice novelties. The most outstanding difference concerns output.icecast(): its restart and restart_delay parameters are gone, replaced by a new on_stop handler which is called on every error (failed connection or disconnection) and returns the new restart delay. The on_error handler receives a string describing the error which enables user-friendly reporting, adaptative delays, etc. Note that on_error defaults to fun(_)->3. which is equivalent to having restart=true, restart_delay=3. in previous versions, NOT the same as the former restart=false default. As a result, liquidsoap won't fail to startup if an initial connection attempt fails.
Fixes:
playlist*() breaking randomnessplaylist*(), thanks to Fabio Costa for his help on this one!input.http/harbor() when the input stream has an invalid number of channelsblank() avoids abusive empty tracksdrop*()'s types reflect that they don't support variable aritieson_error handler in output.icecast(), see aboveoutput.file(): new on_close parameter, may be used to write exact durationinput.http(): new "status" commandmux_mono() for adding a single audio channel into a streamvideo.add_text() using libgd (gd4o) for environments without X Dependency on graphics can be disabled (to work around erreneous detection)delay() now has an "initial" parametersource.init() for selective init with a way to handle errors, plus settings "clock.allow_streaming_errors" and "init.force_stat" (or --force-start on the command line) for easing dynamic uses of liquidsoap Enhancements:input.http()visu.volume() and video.vis_volume()of_json to parse json data. Depends on json-wheel.input.harbor and input.httpinput.alsa). See LS-527 for more details.playlist.safe() was unusable in beta2, as a side effect of removing duplicate "timeout" parameter in playlist().This release introduces lots of fixes and cleanup, but also some new features. Major novelties: support for fast seeking and cue points, FLAC and improved AAC+ support, introduction of the liquidsoap yellowpages "flows", plugin support and improved messages for scripting errors Compatibility warning: insert_metadata has changed, and clock.assign_new() should be used instead of clock() to avoid some of the new static checks
Decoders:
decoder.file_extensions.<format> and decoder.mime_types.<format>.Encoders:
Harbor:
output.harbor() which acts as a mini icecast server, accepting listeners directly. Encoding is shared among users, and is only performed when needed.harbor.http.register/remove().input.harbor() sourceinput.harbor()Icecast:
input.harbor(), not supported by actual Icecast serversoutput.icecast(), used for recoding metadata Defaults to "latin1" with shoutcast serversicy.update_metadata() function for manual updatesInput/output:
input.v4l/v4l2() for webcamsinput/output.udp() for unchecked UDP streaming, available with most formats (at your own risk)output.pipe.external(), now called output.external()input/output.preferred(): pulseaudio, portaudio, oss, alsa, ao, dummyOperators:
cue_cut()insert.metadata() which is now more script friendly, returning an insertion function rather than register a server command. The old functionality is available as server.insert_metadata().rms() operator for getting RMS of a stream, and server.rms() which makes this information available as a server command.track_sensitive mode for blank detection operatorsplaylist.reloadable() for playing a list once, with a command for restarting it.id.*() which can be replaced by type annotationsScripting API:
osc.bool(), osc.float() and osc.float_pair()json_of()http.get() and http.post()url.encode/decode(), base64.encode/decode()string.recode() for charset conversions using camomilenotify_metadata() and osd_metadata(), suitable for use with on_track() and on_metadata()request.metadata() for getting a request's metadatastring.length()log_clocks() with parameter for delaying startupget_clock_status() with "uptime" reference timeServer interface:
<playlist>.uri without an argument.<queue>.ignore now works also in the primary queueinput.http(), ref #466. The command is <id>.url and it needs a restart (<id>.stop, then start) to take effect.Script language:
active_source subtype, for unused variables and ignored values This should avoid common errors, help troubleshooting If needed, advanced users can work around errors using --check-lib and --errors-as-warningsGeneral:
video.fade(), video.text(), effects...)source.dynamic()) Enforce that server commands are always deallocated (LS-495) Attempt to stop sources when initialization fails, so they cleanup as much as possible (LS-503) Avoid deadlocks upon crashes in IoRing-based operators Share code for stoppable feeding threads, use it in input.harbor() Avoid useless initialization of SDL systems--enable-<feature>-dynamic-plugin in ./configure and --dynamic-plugins-dir in liquidsoapMiscellaneous:
source.dynamic(): missing source re-selection [LS-354]output.sdl()video.volume() could crash upon some end-of-track situationosTCP_*TIMEOUT [LS-508,LS-509]This beta version introduces two major new features: heterogeneous stream types and clocks.
New:
source.shutdown().input.http/harbor().source.dynamic() for advanced dangerous hacking.%include "PATH", and introduce %include <...> where path is relative to liquidsoap library directory.channels_matrix parameter to output.ao().on_(dis)connect hooks in input.harbor().Cleanup and fixes:
This release is a bugfix of the latest snapshot (0.9.2). It will be the last bugfix before 1.0.
Bugs fixed:
input.harbor.input.harbor.input.lastfm.This release is a SNAPSHOT of upcoming features. It also contains several important bugfixes. As a snapshot, it contains experimental or unpolished features, and also breaks compatibility with previous versions. You should in particular notice the two "New" items below:
random(strict=true) is now called rotate();playlists, request.*) have a new queuing behavior, check the doc (request-sources.html) or revert to conservative=true.Bugs fixed:
root.sync be deactivated for these sources, such that synchronization is done by the source. (#203)playlist.parse().on_blank(): fix a bug that prevented the first call to on_noise.crossfade() and request-based sources when operating in non-conservative mode.input.http. (#318)delay() which could sometimes incorrectly declare itself ready, and thus try to get some data from its unavailable input source.New:
rotate() replaces random(strict=true), and random() does not have a strict parameter anymore.on_blank(): provide an on_noise handler.playlist*(): add server commands for reloading the playlist and changing its URI.output.*.aacplus(): native outputs encoding in AAC+ using ocaml-aacplus.liquidsoap.version and configure.{libdir,pidfile,logdir}.enable_replaygain_metadata()). (#103 & #317)server.telnet.reverse_dns and harbor.reverse_dns.Experimental:
Removed:
Bugs fixed:
New:
strip_blank (#260).on_connect function for input.harbor now receives the list of headers given by the connected source (#266).on_end operator, to execute a handler when a track ends.request.{equeue,queue}, playlist). This allows these sources to prepare less files in advance. In particular, primary queue may only contain the file currently played. Default behaviour has been set to the old behaviour, and a conservative option has been added to switch to the new behaviour. New behavivour will be the default for the next release. fixes #169, references #146Bugs fixed:
request.queue() not considering initial queue on wake-up (#196).append().after_output propagation in the transitions of switches (#208).say_metadata unfunctional.{input,output}.jack. (#231)Changes:
interactive_float() is now interactive.float().New:
input.http() and input.harbor() now fully support them. See new_track_on_metadata parameters there.force_mime parameter for input.http().insert_missing parameter for append().user_agent parameter for input.http and input.lastfmSupport for external processes as audio encoder:
Support for external processes as audio stream decoder:
input.mplayer to stream data coming from mplayer.Support for external processes as audio file decoder:
enable_mplayer().lag() operator, which delays a stream by a constant time.{input,output}.marshal, allowing raw communication between various liquidsoap instances.Added optional alternatives to store buffered audio data:
Added EXPERIMENTAL video support:
add(), metadata/track manipulations.video.fade.*, video.fill, video.greyscale, video.image, video.invert, video.lomo, video.noise, video.opacity, video.opacity.blur, video.rotate, video.scale, video.sepia, video.text, video.tile, video.transparent, video.volume.Bugs fixed:
input.harbor with icecast2 source protocolinput.oss. Liquidsoap now works with OSS4 ! Fixes #158New:
input.harbor, for debugging purpose.input.harbor for custom authentifications. Fixes #157Internal:
Bugs fixed:
input.http() now has a bind_address parameter.smartcross() is now more compliant with the inter-sources protocol, fixes several "get frame didn't change the buffer" bugs.input.http/harbor().input.http().fade.out() used to run into infinite loops when the delay was 0.New:
in/output.jack.legacy().output.file.*() now have the features that used to be only in output.file.vorbis(), notable re-opening. Added %w to the strftime-like format codes allowed in their filename parameter.clear_metadata() and map_metadata(). Now, rewrite_metadata() is a simple specialization of map_metadata(), written in utils.liq.amplify(), e.g. useful for replay gain.As always:
Bugfix release:
Bugfix release:
Notation: "-" stands for a change, "+" for an addition.
Language
interactive_*() for mutable values.Sources
input.lastfm() to relay last.fm streams.input.harbor() to received Icecast2 source streams.noise() to generate white noiseOperators
compress(), flanger(), pan().filter.fir.*(), filter.iir.*(), filter.biquad.*(), comb().eat_blank() to remove blanks.Outputs
output.icecast.*().output.icecast.vorbis() into output.icecast.vorbis.*() to distinguish between encoding modes -- and similarly for output.file.vorbis and mp3.IO
fade.*().input.http(), support for playlists._[_] notation for assoc(), ruby-style anti-quotation ("..#{..}.."), add_timeout(), execute(), log()...libao().cross() operator allowing cross-fading.say_metadata() into append() and prepend().cross(), fade.*(), prepend() and append() using requests' metadatas.input.http.mp3(), including support for icy metadata.pipe() operator which allows one to filter the raw audio through an external program. However, sox and other common tools aren't suitable for that because they don't flush their output often enough.on_blank() operator for calling a callback on excessive blanks.on_metadata operator for performing arbitrary actions (typically a call to an external script) when metadata packets occur in a stream.