From dbe33286dacb866915f161c1bc947c73334359df Mon Sep 17 00:00:00 2001 From: migatu Date: Sun, 10 Nov 2024 23:01:00 +0000 Subject: [PATCH] Final fixes in radio --- radio_conjurer.liq | 178 +++++++++++++++++++++++++++++++++++++++++++++ test_mic2.liq | 4 + test_mic3.liq | 4 + 3 files changed, 186 insertions(+) create mode 100644 radio_conjurer.liq create mode 100644 test_mic2.liq create mode 100644 test_mic3.liq diff --git a/radio_conjurer.liq b/radio_conjurer.liq new file mode 100644 index 0000000..a66ae62 --- /dev/null +++ b/radio_conjurer.liq @@ -0,0 +1,178 @@ +# FILEPATH: /home/mtuszowski/conjurer/conjurer_musician/radio_conjurer.liq + +# This script sets up a Liquidsoap radio stream with various features and configurations. + +# Load icecast credentials from a JSON file +let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json") + +# Enable replaygain metadata processing +enable_replaygain_metadata() + +# Set up a playlog for tracking played tracks + +l = playlog(duration = 72000.0, persistency="/home/pi/Conjurer/persistence.log") + +# Function to check if a track can be played based on its metadata +def check(r) + m = request.metadata(r) + if l.last(m) < 36000. then + log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).") + false + else + l.add(m) + true + end +end + +# Define playlists to be used in the stream +s1 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/all_playlist.playlist")) +s2 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/priority_queue.playlist")) +s3 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/hit.playlist")) + +# Create a request queue for user-generated requests +requests_queue = request.queue() + +# Function to process the request queue and add new requests +def queue_processing() + text=file.lines("/home/pi/Conjurer/request.playlist") + if text != [] then + list.iter(fun(item) -> requests_queue.push.uri(item), text) + file.remove("/home/pi/Conjurer/request.playlist") + f = file.open("/home/pi/Conjurer/request.playlist", create=true) + f.close() + end +end + +# Randomly select a playlist with weights +s4 = random(id="randomizer", weights=[2, 3, 5], [s1, s2, s3]) + +# Load jingles playlist +jingles = (playlist(reload_mode="watch", "/home/pi/Conjurer/jingles.playlist")) + +# Create the main stream with random playlist and jingles +s = rotate(id="randomizer", weights=[10, 1], [s4, jingles]) + +s = crossfade(fade_out=2., fade_in=2., duration=4., fallback(id="switcher", track_sensitive=false, [requests_queue, s])) + +# Set up an interactive harbor for controlling the stream +interactive.harbor(port = 9999) +#harbor.input(buffer=30.0) +# Set up interactive controls for bass boost +f = interactive.float("f", description="Frequency", min=0., max=1000., unit="Hz", 200.) +g = interactive.float("g", description="Gain", min=0., max=20., unit="dB", 8.) +b = bass_boost(frequency=f, gain=g, s) +s = add([s, b]) + +# Set up interactive control for main volume +a = interactive.float("main_volume", min=0., max=20., 0.4) +s = compress.multiband.interactive(bands=7, s) + +mic_gain = interactive.float("mic_volume", min=0., max=120., 6.) + +# Apply audio processing effects +tmic = buffer(input.pulseaudio()) # Microphone +mic = amplify(mic_gain, tmic) +mic = gate(threshold=-80., range=-120., mic) +mic = compress(threshold=0., ratio=2.,mic) +mic = nrj(normalize(mic)) + +# Apply audio processing effects +s = nrj(normalize(s)) +s = amplify(a, s) +# Skip blank sections in the stream +s = blank.skip(max_blank=10., s) + +#Manual audition override +live_enabled = interactive.bool("Going Live!", true) +s = switch(track_sensitive=false, + [(live_enabled, mic), + ({true}, s)]) + + +def fading_transition(a,b) + sequence([fade.out(a.source),fade.in(b.source)]) +end + +# Configure logging settings +log_to_stdout = true +log_to_file = true +logpath = "/home/pi/Conjurer/radio_log.log" +loglevel = 3 +set("log.stdout", log_to_stdout) +set("log.level", loglevel) + +# Enable logging to file +set("log.file", log_to_file) +set("log.file.path", logpath) + +# Set up emergency fallback track +emergency = single("/home/pi/RetroPie/mp3/Youtube/Dr. Peacock - Trip to Ireland [GvrvQTUbUcA].mp3") +radio = fallback(id="switcher2", track_sensitive=false, [s, emergency]) + +# Set up an interactive control for skipping tracks +p = interactive.bool("Skip track", false) +def http_skip(~protocol, ~data, ~headers, uri)= + radio.skip() + http.response(code=200,data="Skipped") +end +harbor.http.register(port=54321,method="GET","/skip", http_skip) + + +# Function to process the request queue and skip the current track if requested +def check_skip() + if p() then + log.info("Skipping current track.") + radio.skip() + p.set(false) + end +end + +# Run the queue processing function every 60 seconds +thread.run(every=60., queue_processing) + + +# Run the check_skip function every 5 seconds +thread.run(every=15., check_skip) + + +# Enable persistent script parameters +interactive.persistent("script.params") + +# Configure output formats and destinations + + +output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream", radio) +output.pulseaudio(radio) +#output.file.hls("/tmp/hls", [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))], radio) +# Uncomment the following lines to enable additional output formats +# output.icecast(%opus, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="opus-stream", radio) +# output.icecast(%ogg, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="ogg-stream", radio) +# output.icecast(%aac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="aac-stream", radio) +# output.icecast(%flac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="flac-stream", radio) +# output.icecast(%vorbis, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="vorbis-stream", radio) +# output.icecast(%speex, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="speex-stream", radio) +# output.icecast(%wav, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="wav-stream", radio) +# output.icecast(%pcm, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="pcm-stream", radio) +# output.icecast(%raw, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="raw-stream", radio) +# output.icecast(%s16l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s16l-stream", radio) +# output.icecast(%s16b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s16b-stream", radio) +# output.icecast(%s24l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s24l-stream", radio) +# output.icecast(%s24b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s24b-stream", radio) +# output.icecast(%s32l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s32l-stream", radio) +# output.icecast(%s32b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s32b-stream", radio) +# output.icecast(%s64l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s64l-stream", radio) +# output.icecast(%s64b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s64b-stream", radio) +# output.icecast(%s128l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s128l-stream", radio) +# output.icecast(%s128b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s128b-stream", radio) +# output.icecast(%s256l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s256l-stream", radio) +# output.icecast(%s256b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s256b-stream", radio) +# output.icecast(%s512l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s512l-stream", radio) +# output.icecast(%s512b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s512b-stream", radio) +# output.icecast(%s1024l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s1024l-stream", radio) +# output.icecast(%s1024b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s1024b-stream", radio) +# output.icecast(%s2048l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s2048l-stream", radio) +# output.icecast(%s2048b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s2048b-stream", radio) +# output.icecast(%s4096l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s4096l-stream", radio) +# output.icecast(%s4096b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s4096b-stream", radio) +# output.icecast(%s8192l, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s8192l-stream", radio) +# output.icecast(%s8192b, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="s8192b-stream", radio) diff --git a/test_mic2.liq b/test_mic2.liq new file mode 100644 index 0000000..b97de2a --- /dev/null +++ b/test_mic2.liq @@ -0,0 +1,4 @@ +let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json") + +output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream",input.alsa(bufferize=false)) + diff --git a/test_mic3.liq b/test_mic3.liq new file mode 100644 index 0000000..38d20b4 --- /dev/null +++ b/test_mic3.liq @@ -0,0 +1,4 @@ +let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json") + +output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream",input.pulseaudio()) +