mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-16 14:52:11 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 439c5c753c | |||
| cc11d3f75e | |||
| a35d7da6e3 | |||
| 2c50318f1c | |||
| addc534c36 |
@@ -5,10 +5,14 @@
|
|||||||
# Load icecast credentials from a JSON file
|
# Load icecast credentials from a JSON file
|
||||||
let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json")
|
let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentials.json")
|
||||||
|
|
||||||
# Enable replaygain metadata processing
|
# Enable replaygain metadata processing
|
||||||
enable_replaygain_metadata()
|
enable_replaygain_metadata()
|
||||||
l = playlog(duration = 14400.0, persistency="/home/pi/Conjurer/persistence.log")
|
|
||||||
def check(r)
|
# Set up a playlog for tracking played tracks
|
||||||
|
l = playlog(duration = 14400.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)
|
m = request.metadata(r)
|
||||||
if l.last(m) < 3600. then
|
if l.last(m) < 3600. then
|
||||||
log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).")
|
log.info("Rejecting #{m['filename']} (played #{l.last(m)}s ago).")
|
||||||
@@ -17,16 +21,18 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
l.add(m)
|
l.add(m)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
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()
|
||||||
|
|
||||||
# Define playlists to be used in the stream
|
# Function to process the request queue and add new requests
|
||||||
s1 = replaygain(playlist(reload_mode="watch", check_next=check, "/home/pi/Conjurer/all_playlist.playlist"))
|
def queue_processing()
|
||||||
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")
|
f1=file.read("/home/pi/Conjurer/request.playlist")
|
||||||
text = f1()
|
text = f1()
|
||||||
if text != "" then
|
if text != "" then
|
||||||
@@ -38,75 +44,89 @@ let json.parse credentials = file.contents("/home/pi/Conjurer/icecast_credentia
|
|||||||
else
|
else
|
||||||
log.info("no requests")
|
log.info("no requests")
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Randomly select a playlist with weights
|
||||||
|
s4 = random(id="randomizer", weights=[1, 3, 2], [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=[20, 1], [s4, jingles])
|
||||||
|
|
||||||
|
# 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])
|
||||||
|
|
||||||
|
# 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
|
||||||
|
end
|
||||||
|
|
||||||
# Randomly select a playlist with weights
|
# Run the queue processing function every 60 seconds
|
||||||
s = random(id="randomizer", weights=[1, 3, 2], [s1, s2, s3])
|
thread.run(every=60., queue_processing)
|
||||||
#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
|
# Set up an interactive control for skipping tracks
|
||||||
interactive.harbor(port = 9999)
|
p = interactive.bool("r1", false)
|
||||||
# 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
|
# Run the check_skip function every 5 seconds
|
||||||
s = nrj(normalize(s))
|
thread.run(every=5., check_skip)
|
||||||
s = amplify(a, s)
|
|
||||||
|
|
||||||
# Skip blank sections in the stream
|
# Handle metadata events
|
||||||
s = blank.skip(max_blank=2., s)
|
handle_metadata = fun (m) -> begin
|
||||||
|
|
||||||
# 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["title"])
|
||||||
log.info(m["artist"])
|
log.info(m["artist"])
|
||||||
log.info(m["filename"])
|
log.info(m["filename"])
|
||||||
end
|
end
|
||||||
radio.on_metadata(handle_metadata)
|
radio.on_metadata(handle_metadata)
|
||||||
|
|
||||||
# Enable persistent script parameters
|
# Enable persistent script parameters
|
||||||
interactive.persistent("script.params")
|
interactive.persistent("script.params")
|
||||||
|
|
||||||
# Configure output formats and destinations
|
# Configure output formats and destinations
|
||||||
output.file.hls("/tmp/hls", [("mp3-low", %mp3(bitrate=96)), ("mp3-hi", %mp3(bitrate=160))], radio)
|
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(%mp3, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="mp3-stream", 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(%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(%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(%aac, host="retropie", port=8000, password=credentials.password, icy_metadata="true", mount="aac-stream", radio)
|
||||||
|
|||||||
Reference in New Issue
Block a user