From db5310649416983e916e150aeb7580406615c686 Mon Sep 17 00:00:00 2001 From: David Trattnig <david.trattnig@o94.at> Date: Mon, 12 Oct 2020 01:33:46 +0200 Subject: [PATCH] Scheduled fallback queue. #43 --- modules/liquidsoap/engine.liq | 26 ++---- modules/liquidsoap/in_filesystem.liq | 115 +++++++++++++++++++++---- modules/liquidsoap/library.liq | 23 ----- modules/liquidsoap/serverfunctions.liq | 60 ------------- 4 files changed, 106 insertions(+), 118 deletions(-) diff --git a/modules/liquidsoap/engine.liq b/modules/liquidsoap/engine.liq index b7bd8ef0..cd083f03 100644 --- a/modules/liquidsoap/engine.liq +++ b/modules/liquidsoap/engine.liq @@ -78,21 +78,6 @@ stripped_stream = strip_blank( mixer ) -station_playlist = playlist( - id="station_playlist", - fallback_station_playlist_path, - mode="randomize", - reload_mode="watch", - reload=10) - -station_folder = mksafe( - playlist(id="station_folder", - fallback_station_dir, - mode="randomize", - reload=fallback_station_dir_reload, - reload_mode="seconds")) - - # When some regular playout is happening and it is returned to the fallback, # we don't want to resume the previous fallback track: def on_track_change(s) = @@ -101,14 +86,19 @@ def on_track_change(s) = end stripped_stream = on_track(on_track_change, stripped_stream) -station_playlist = augment_fallback(station_playlist) -station_folder = augment_fallback( station_folder) + + +output_source = fallback( + id="fallback-scheduled", + track_sensitive=false, + replay_metadata=true, + [ stripped_stream, input_fallback_scheduled]) output_source = fallback( id="fallback-station-playlist", track_sensitive=false, replay_metadata=true, - [ stripped_stream, station_playlist]) + [ output_source, station_playlist]) output_source = fallback( id="fallback-station-folder", diff --git a/modules/liquidsoap/in_filesystem.liq b/modules/liquidsoap/in_filesystem.liq index a8ab26e9..7feda267 100644 --- a/modules/liquidsoap/in_filesystem.liq +++ b/modules/liquidsoap/in_filesystem.liq @@ -17,24 +17,66 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. +# Called when some new metadata info is available +def on_metadata_notification(meta) = + filename = meta["filename"] + # artist = meta["artist"] + # title = meta["title"] + system('#{list.assoc(default="", "install_dir", ini)}/guru.py --on_play "#{filename}"') +end + + +##################################### +# DEFAULT SOURCES # +##################################### + +# Create Filesystem Sources input_filesystem_0 = request.equeue(id="in_filesystem_0") input_filesystem_1 = request.equeue(id="in_filesystem_1") -#input_fs = cue_cut(mksafe(request.equeue(id="fs"))) +# Apply ReplayGain Normalization +input_filesystem_0 = amplify(id="in_filesystem_0", 1., override="replay_gain", input_filesystem_0) +input_filesystem_1 = amplify(id="in_filesystem_1", 1., override="replay_gain", input_filesystem_1) -# Call engine core handler to "on_play" (e.g. to update track service) +# Add Event Handlers +input_filesystem_0 = on_metadata(id="in_filesystem_0", on_metadata_notification, input_filesystem_0) +input_filesystem_1 = on_metadata(id="in_filesystem_1", on_metadata_notification, input_filesystem_1) -def do_meta_filesystem(meta) = - filename = meta["filename"] - # artist = meta["artist"] - # title = meta["title"] - # print('CALLING GURU #{list.assoc(default="", "install_dir", ini)}/guru.py') - system('#{list.assoc(default="", "install_dir", ini)}/guru.py --on_play "#{filename}" &') -end -input_filesystem_0 = on_metadata(id="in_filesystem_0", do_meta_filesystem, input_filesystem_0) -input_filesystem_1 = on_metadata(id="in_filesystem_1", do_meta_filesystem, input_filesystem_1) +##################################### +# FALLBACK SOURCES # +##################################### + +input_fallback_scheduled = request.equeue(id="in_fallback_scheduled") + +station_playlist = playlist( + id="station_playlist", + fallback_station_playlist_path, + mode="randomize", + reload_mode="watch", + reload=10) + +station_folder = mksafe( + playlist(id="station_folder", + fallback_station_dir, + mode="randomize", + reload=fallback_station_dir_reload, + reload_mode="seconds")) + +# Apply ReplayGain Normalization +input_fallback_scheduled = amplify(id="in_fallback_scheduled", 1., override="replay_gain", input_fallback_scheduled) +station_playlist = amplify(id="station_playlist", 1., override="replay_gain", station_playlist) +station_folder = amplify(id="station_folder", 1., override="replay_gain", station_folder) +# Add Event Handlers +input_fallback_scheduled = on_metadata(id="in_fallback_scheduled", on_metadata_notification, input_fallback_scheduled) +station_playlist = on_metadata(id="station_playlist", on_metadata_notification, station_playlist) +station_folder = on_metadata(id="station_folder", on_metadata_notification, station_folder) + + +##################################### +# SERVER FUNCTIONS # +##################################### def clear_items(ns) = ret = server.execute("#{source.id(ns)}.primary_queue") @@ -53,11 +95,11 @@ def clear_queue(ns) = add_timeout(fast=false, 0.5, {clear_items(ns)}) end -# Clear Queue 0 +# Clear Filesystem Queue A server.register(namespace=source.id(input_filesystem_0), - description="Clear all items of the filesystem Queue A.", + description="Clear all items of the filesystem queue A.", usage="clear", - "clear_filesystem_0", + "clear", fun (s) -> begin @@ -66,11 +108,11 @@ server.register(namespace=source.id(input_filesystem_0), end ) -# Clear Queue 1 +# Clear Filesystem Queue B server.register(namespace=source.id(input_filesystem_1), - description="Clear all items of the filesystem Queue B.", + description="Clear all items of the filesystem queue B.", usage="clear", - "clear_filesystem_1", + "clear", fun (s) -> begin @@ -78,3 +120,42 @@ server.register(namespace=source.id(input_filesystem_1), "Clearing done." end ) + +# Clear Scheduled Fallback Queue +server.register(namespace=source.id(input_fallback_scheduled), + description="Clear all items of the scheduled fallback queue.", + usage="clear", + "clear", + + fun (s) -> + begin + clear_queue(input_fallback_scheduled) + "Clearing done." + end + ) + +# Seek Filesystem Queue A +server.register(namespace = source.id(input_filesystem_0), + description="seek to relative position in #{source.id(input_filesystem_0)}", + usage = "seek <duration in seconds>", + "seek", + fun(t) -> begin + log("Seeking #{t} sec") + t = float_of_string(default=0.,t) + ret = source.seek(input_filesystem_0, t) + "Seeked #{ret} seconds." + end +) + +# Seek Filesystem Queue B +server.register(namespace = source.id(input_filesystem_1), + description="seek to relative position in #{source.id(input_filesystem_1)}", + usage = "seek <duration in seconds>", + "seek", + fun(t) -> begin + log("Seeking #{t} sec") + t = float_of_string(default=0.,t) + ret = source.seek(input_filesystem_1, t) + "Seeked #{ret} seconds." + end +) \ No newline at end of file diff --git a/modules/liquidsoap/library.liq b/modules/liquidsoap/library.liq index a65b49e6..fbcf50f6 100644 --- a/modules/liquidsoap/library.liq +++ b/modules/liquidsoap/library.liq @@ -17,29 +17,6 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -##################### -# basics # -##################### - - -# Called when some new metadata info is available -def on_metadata_notification(meta) = - filename = meta["filename"] - # artist = meta["artist"] - # title = meta["title"] - system('#{list.assoc(default="", "install_dir", ini)}/guru.py --on_play "#{filename}"') -end - -def augment_fallback(source) = - - # Apply normalization using ReplayGain information - source = amplify(1., override="replay_gain", source) - # Watch metadata change - source = on_metadata(on_metadata_notification, source) - source -end - - ##################### # stream to icecast # ##################### diff --git a/modules/liquidsoap/serverfunctions.liq b/modules/liquidsoap/serverfunctions.liq index c1127ebd..78596246 100644 --- a/modules/liquidsoap/serverfunctions.liq +++ b/modules/liquidsoap/serverfunctions.liq @@ -186,66 +186,6 @@ server.register(namespace = "auraengine", end ) -# enable the seek function for the input from the filesystem -server.register(namespace = source.id(input_filesystem_0), - description="seek to relative position in #{source.id(input_filesystem_0)}", - usage = "seek <duration in seconds>", - "seek", - fun(t) -> begin - log("Seeking #{t} sec") - t = float_of_string(default=0.,t) - ret = source.seek(input_filesystem_0, t) - "Seeked #{ret} seconds." - end -) - -server.register(namespace = source.id(input_filesystem_1), - description="seek to relative position in #{source.id(input_filesystem_1)}", - usage = "seek <duration in seconds>", - "seek", - fun(t) -> begin - log("Seeking #{t} sec") - t = float_of_string(default=0.,t) - ret = source.seek(input_filesystem_1, t) - "Seeked #{ret} seconds." - end -) - -# server.register(namespace = source.id(input_filesystem_2), -# description="seek to relative position in #{source.id(input_filesystem_2)}", -# usage = "seek <duration in seconds>", -# "seek", -# fun(t) -> begin -# log("Seeking #{t} sec") -# t = float_of_string(default=0.,t) -# ret = source.seek(input_filesystem_2, t) -# "Seeked #{ret} seconds." -# end -# ) - -# server.register(namespace = source.id(input_filesystem_3), -# description="seek to relative position in #{source.id(input_filesystem_3)}", -# usage = "seek <duration in seconds>", -# "seek", -# fun(t) -> begin -# log("Seeking #{t} sec") -# t = float_of_string(default=0.,t) -# ret = source.seek(input_filesystem_3, t) -# "Seeked #{ret} seconds." -# end -# ) - -# server.register(namespace = source.id(input_filesystem_4), -# description="seek to relative position in #{source.id(input_filesystem_4)}", -# usage = "seek <duration in seconds>", -# "seek", -# fun(t) -> begin -# log("Seeking #{t} sec") -# t = float_of_string(default=0.,t) -# ret = source.seek(input_filesystem_4, t) -# "Seeked #{ret} seconds." -# end -# ) def fadeTo(source_number) = if source_number == "" then -- GitLab