Page
Library
Module
Module type
Parameter
Class
Class type
Source
New:
input.srt
: add ipv6only
to allow to bind only to ipv6 addresses. Set it to true
when bind_address
is ipv6.Changed:
defer
more user-friendly by operating directly on generic source(audio=pcm('a))
sources. Renamed old defer
to defer.pcm_s16
dtools
, duppy
and xmlplaylist
have been moved into the liquidsoap code base and will no longer be developed or required as stand-alone packages (#12582)metadata.map
strip
argument to true
and insert_missing
to false
Added settings.metadata.map.strip
and settings.metadata.map.insert_missing
configuration keys to revert to previous defaults. (#4447)Fixed:
lufs
C code introduced with release 2.3.2
(#4490)New:
Changed:
"pic"
to list of excluded metadata for automatic charset conversion.settings.charset.max_string_length
setting to prevent automatic charset conversions of strings over that length.Fixed:
duration
metadata in image decoder (#4397)on_track
/on_end
operations are sent to a asynchronous task queue.crossfade
(#4419, #4410)switch
and fallback
operators (#4420)New:
WAVE_FORMAT_EXTENSIBLE
to the internal wav dexcoder.buffer_size
parameter to input.alsa
and output.alsa
(#4243)Changed:
"song"
metadata mapping to "title"
metadata in input.harbor
disabled when either "artist"
or "title"
is also passed. Add a configuration key to disable this mechanism. (#4235, #2676)output.icecast
now re-sends the last metadata when connecting to the remote server unless explicitly disabled using the send_last_metadata_on_connect
option (#3906)ipv4
vs. ipv6
resolution in SRT inputs and outputs, add global settings.srt.prefer_address
and settings.icecast.prefer_address
(#4317)latency
and ipv6only
.Fixed:
autocue
and replaygain
metadata resolvers (#4245, fixed in #4246)flac
encoding segfault (#4286, #4274)last_metadata
not being properly updated (#4262)input.http
to utf8
.inotify
unwatching due to GC cleanup (#4275)delay
initial conditions (#4281)New:
source.on_track
and etc). (#3577)clock
methods. Returned value is a stripped down clock
variable. Users can use the clock
function to retrieve the full methods, e.g. s = sine(); c = clock(s.clock)
. This value has advanced functions for clock control such as start
/stop
, ticks
and self_sync
to check for self-sync
. (#3781)0.04s
. Smaller frames means less latency and memory consumption at the expense of a higher CPU usage (#3607)0.02s
(#4033)finally
to execute code regardless of whether or not an exception is raised (see: #3895 for more details).ffmpeg
. (#4036)taglib
support. It is superseded by the internal ocaml-metadata
module and taglib, with its dependency on the C++ runtime library, has been causing issues with binary builds portability and crashes with the (not yet supported) OCaml 5 compiler. (#4087)video.canvas
to make it possible to position video elements independently of the rendered video size (#3656, blog post)%ffmpeg
encoder, enabled by default when only one stream is encoded.metadata.getter.source.float
(#3356).duration
and ticks
to metadata available when computing HLS segment names (#4135)main_playlist_writer
to output.file.hls
and derivated operator (#3484)is_nan
, is_infinite
, ceil
, floor
, sign
and round
(#3407)%track.drop
to the %ffmpeg
encoder to allow partial encoding of a source's available tracks (#3480)let { foo? } = ...
pattern matching (#3481)metadata.replaygain
method to extract unified replay gain value from metadata (#3438).metadata.parse.amplify
to manually parse amplify override metadata.compute
parameter to file.replaygain
to control gain calculation (#3438).compute
parameter to enable_replaygain_metadata
to control replay gain calculation (#3438).copy:
protocol (#3506)file.touch
.string.of_int
and string.spaces
.list.assoc.nullable
.source.cue
(#3620).string.chars
(#4111)macos_say
speech synthesis protocol. Make it the default implementation for the say:
protocol on macos
.settings.request.timeout
to set the request timeout globally.Changed:
request.once
, single
and more using source.dynamic
. Removed experiment flag on source.dynamic
. The operator is considered stable enough to define advanced sources but the user should be careful when using it.int
can optionally raises an error when passing nan
or infinity
, int(infinity)
now returns max_int
and int(-infinity)
returns min_int
. (#3407)source.dump
and source.drop
in favor of safer request.dump
and request.drop
. source.{dump, drop}
can still be implemented manually when needed and with the proper knowledge of what's going on.on_offset
and dropped the metadata mechanism for updating it (#3355).string.length
and string.sub
now default to utf8
encoding (#4109)TERM
environment variable is not set.root
user inside docker
container by default (#3406).check_next
before playlist's requests resolutions (#3625)force
to true
by default in file.copy
to make operator behave as expected.nan == x
is always false
and nan != x
is always true
. Use float.is_nan
to test if a float is nan
.replaygain
no longer takes ebu_r128
parameter (#3438).replaygain_track_gain
always stores volume in dB (#3438).annotate:key="value",...:/path/to/file.mp3
is now considered infallible if /path/to/file.mp3
can be decoded.parents
option of file.mkdir
(#3600, #3601).forced_major_collections
record field to the result of runtime.gc.stat()
and runtime.gc.quick_stat()
(#3783).9599
(#3801).segments_overheader
in HLS outputs to disable segments cleanup altogether.Fixed:
New:
enable_autocue_metadata
and autocue:
protocol to automatically compute cue points and crossfade parameters (#3753, #3811, @RM-FM and @Moonbase59)db_levels
method to blank.*
sources (#3790)excluded_metadata_resolvers
to request.create
to make it possible to selectively disable specific metadata resolvers when resolving requests.autocue
, allow multiple implementation and adapt cross
/crossfade
to work with it out of the box with workaround for short tracks.mem_usage
.Changed:
http.*
url normalization. Add warning when url normalization changes the url (#3789)namespace
and optional source IDs to mix
.Fixed:
source.drop
and source.dump
clock initialization.input.harbor
.%ffmpeg
copy muxer logic with some audio/video streams (#3840)duration
metadata calculation in the presence of cue_in
/cue_out
metadata.New:
id3v2
metadata in output.*.hls
when using %mp3
, %shine
or %fdkaac
encoders (#3604)ipv4
, ipv6
or system default) when resolving hostnames in http transports and output.icecast
self_sync
option to input.srt
to accommodate for streams in file mode (#3684)curve
parameter to fade functions and liq_fade_{in,skip,out}_curve
metadata override (#3691)delay
parameter to fade functions to make it possible to add delay before fade happens. Add liq_fade_{in,skip,out}_delay
metadata override.single_track
option to allow sequence
to play each source until they are unavailable while keeping track marks.Changed:
cue_cut
operator has been removed. Cueing mechanisms have been moved to underlying file-based sources. See migration notes for more details.Fixed:
on_error
callback in output.icecast
(#3635)output.file
(#3675)input.harbor
, input.ffmpeg
, SRT sources and request.dynamic
)add
(#3678)New:
string.escape.html
(#3418, @ghostnumber7)blank.detect
(#3452).source(audio=pcm(5.1))
Changed:
input.ffmpeg
by default. Disable using trim_url=false
(#3424)%ffmpeg
encoder (#3483)on_fail
removed on playlist
(#3479)Fixed:
channel_layout
argument in ffmpeg encoder to set the number of channels.map.metadata
mutating existing metadata.mpegts
(#3483)libsamplerate
(#3429)interactive.harbor
(#3418, @ghostnumber7)wait_until
timestamp being in the past when using posix-time2
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.add
get_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.hls
JSON
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.shutdown
s.shutdown()
method only on sources that are active. Refs: #2259map_metadata
into metadata.map
, deprecated map_metadata
.list.mem_assoc
add
(#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:
memtrace
time.{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
, runtime.gc.print_stat
and runtime.gc.{get,set}
.runtime.sys.word_size
runtime.mem_usage
runtime.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.duration
synth
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/file
protocols.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.harbor
(#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 replaygain
replaygain
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.hls
get_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.hls
get_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.bindir
for
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_crossfade
smart_cross
/smart_crossfade
operators as cross
/crossfade
crossfade
is old (simple) crossfade. Use smart=true
to enable old smart_crossfade
behavior.file.duration
as request.duration
is_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 5
Fixed:
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-transport
New:
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_video
smartcross
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_metadata
Fixed:
output.icecast
(#548)input.https
(#593)Multiple gstreamer fixes:
pipe
operator (#614)New:
on_change
to register
input.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)mutexify
map_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.add
audio_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.http
input.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.lastfm
Support 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.