# 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() l = playlog(duration = 14400.0, persistency="/home/pi/Conjurer/persistence.log") def check(r) m = request.metadata(r) if l.last(m) < 3600. 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")) requests_queue = request.queue() def queue_processing() f1=file.read("/home/pi/Conjurer/request.playlist") text = f1() if text != "" then requests_queue.push.uri(text) file.remove("/home/pi/Conjurer/request.playlist") f = file.open("/home/pi/Conjurer/request.playlist", create=true) f.close() log.info("done") else log.info("no requests") end end # Randomly select a playlist with weights s = random(id="randomizer", weights=[1, 3, 2], [s1, s2, s3]) #s = delay(duration=5., s) #radio = add([delay(1800., jingles), music]) #radio = fallback([delay(1800., jingles), music]) #p = predicate.signal() #radio = switch([(p, jingles), ({true}, music)]) #thread.run(every=1200., {p.signal()}) # def cmd(_) # p.signal() # "Jingle inserted!" # end # server.register("insert_jingle", cmd) # Set up an interactive harbor for controlling the stream interactive.harbor(port = 9999) # 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., 1.) s = compress.multiband.interactive(bands=3, s) # Apply audio processing effects s = nrj(normalize(s)) s = amplify(a, s) # Skip blank sections in the stream s = blank.skip(max_blank=2., s) # Configure logging settings log_to_stdout = true log_to_file = true logpath = "/home/pi/Conjurer/radio_log.log" loglevel = 4 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") # Create a fallback stream with the main stream and emergency track cross_s = crossfade(fade_out=3., fade_in=3., duration=5., fallback(id="switcher", track_sensitive=false, [requests_queue, s])) radio = fallback(id="switcher2", track_sensitive=false, [cross_s, emergency]) thread.run(every=60., queue_processing) # Handle metadata events handle_metadata = fun (m) -> begin log.info(m["title"]) log.info(m["artist"]) log.info(m["filename"]) end radio.on_metadata(handle_metadata) # Enable persistent script parameters interactive.persistent("script.params") # Configure output formats and destinations output.file.hls("/tmp/hls", [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))], radio) output.icecast(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream", radio) # 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)