96 lines
2.8 KiB
Text
96 lines
2.8 KiB
Text
# denpa-radio liquidsoap script
|
|
# adding a station: copy a station block, rename, restart liquidsoap.
|
|
|
|
settings.log.stdout.set(true)
|
|
settings.log.level.set(3)
|
|
|
|
source_pw = environment.get(default="", "SOURCE_PW")
|
|
|
|
def emit_now_playing(station, m) =
|
|
filename = m["filename"]
|
|
if filename != "" then
|
|
# decoder-reported metadata may be empty; fall back to request.duration which
|
|
# reads it directly from the file. -1.0 means unknown.
|
|
meta_dur = m["duration"]
|
|
dur_str =
|
|
if meta_dur != "" then
|
|
meta_dur
|
|
else
|
|
# request.duration returns float? in liquidsoap 2.3 — unwrap with default -1.
|
|
d = null.get(default=-1., request.duration(filename))
|
|
if d > 0. then string(int_of_float(d)) else "" end
|
|
end
|
|
payload = json()
|
|
payload.add("station", station)
|
|
payload.add("artist", m["artist"])
|
|
payload.add("title", m["title"])
|
|
payload.add("album", m["album"])
|
|
payload.add("filename", filename)
|
|
payload.add("duration", dur_str)
|
|
payload.add("started_at", string(int_of_float(time())))
|
|
file.write(data=payload.stringify(), atomic=true, temp_dir="/now-playing", "/now-playing/#{station}.json")
|
|
end
|
|
end
|
|
|
|
def append_history(station, m) =
|
|
filename = m["filename"]
|
|
if filename != "" then
|
|
history_path = "/now-playing/#{station}.history.json"
|
|
existing =
|
|
if file.exists(history_path) then
|
|
file.contents(history_path)
|
|
else
|
|
"[]"
|
|
end
|
|
arr =
|
|
try
|
|
json.parse(default=([] : [json]), existing)
|
|
catch _ do
|
|
([] : [json])
|
|
end
|
|
entry = json()
|
|
entry.add("title", m["title"])
|
|
entry.add("artist", m["artist"])
|
|
entry.add("album", m["album"])
|
|
entry.add("filename", filename)
|
|
entry.add("started_at", string(int_of_float(time())))
|
|
new_arr = list.add(entry, list.prefix(50, arr))
|
|
out_str = json.stringify(new_arr)
|
|
file.write(data=out_str, atomic=true, temp_dir="/now-playing", history_path)
|
|
end
|
|
end
|
|
|
|
# === station: minecraft ===
|
|
minecraft = playlist(
|
|
reload_mode="watch",
|
|
mode="randomize",
|
|
"/library/minecraft/tracks"
|
|
)
|
|
minecraft.on_track(fun (m) -> begin
|
|
emit_now_playing("minecraft", m)
|
|
append_history("minecraft", m)
|
|
end)
|
|
minecraft = crossfade(minecraft)
|
|
minecraft = mksafe(minecraft)
|
|
|
|
output.icecast(
|
|
%mp3(bitrate=192, stereo=true),
|
|
host="icecast", port=8000, password=source_pw,
|
|
mount="/minecraft.mp3",
|
|
name="Denpa — Minecraft",
|
|
description="Minecraft soundtracks",
|
|
genre="game-ost",
|
|
url="https://denpa.femboy.page",
|
|
minecraft
|
|
)
|
|
|
|
output.icecast(
|
|
%opus(bitrate=96, vbr="constrained", samplerate=48000, channels=2),
|
|
host="icecast", port=8000, password=source_pw,
|
|
mount="/minecraft.opus",
|
|
name="Denpa — Minecraft",
|
|
description="Minecraft soundtracks",
|
|
genre="game-ost",
|
|
url="https://denpa.femboy.page",
|
|
minecraft
|
|
)
|