This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

superconfig / 2configs / services / radio / radio.liq
3.4 kB 108 lines
1log.stdout.set(true) 2 3# use yt-dlp 4settings.protocol.youtube_dl.path.set("yt-dlp") 5 6# add filenames to metadata 7settings.encoder.metadata.export.set(list.append(settings.encoder.metadata.export(), [ "filename" ])) 8 9## functions 10 11def filter_music(req) = 12 filename = request.filename(req) 13 if string.match(pattern = '.*/\\.graveyard/.*', filename) then 14 false 15 else 16 true 17 end 18end 19 20def queue_contents(q) = 21 list.map(fun (req) -> request.uri(req), q) 22end 23## main 24 25env = environment() 26port = string.to_int(env["RADIO_PORT"], default = 8000) 27 28all_music = playlist(env["MUSIC"], check_next = filter_music) 29wishlist = request.queue() 30tracks = fallback(track_sensitive = true, [wishlist, all_music]) 31tracks = blank.eat(tracks) 32 33last_metadata = ref([]) 34def on_metadata(m) = 35 last_metadata := m 36 print("changing tracks") 37 out = process.read(env["HOOK_TRACK_CHANGE"], env = m, timeout = 5.0) 38 print(out) 39end 40tracks.on_metadata(on_metadata) 41 42# some nice effects 43music = crossfade(tracks) 44music = mksafe(music) 45music = normalize(music) 46 47news = request.queue() 48radio = smooth_add(normal = music, special = amplify(1.5, news)) 49 50if string.length(env["ICECAST_HOST"]) > 0 then 51 output.icecast(host = env["ICECAST_HOST"], mount = '/music.ogg', password = 'hackme', %vorbis(quality = 1), music) 52 output.icecast(host = env["ICECAST_HOST"], mount = '/music.mp3', password = 'hackme', %mp3.vbr(), music) 53 output.icecast(host = env["ICECAST_HOST"], mount = '/music.opus', password = 'hackme', %opus(bitrate = 128), music) 54 55 output.icecast(host = env["ICECAST_HOST"], mount = '/radio.ogg', password = 'hackme', %vorbis(quality = 1), radio) 56 output.icecast(host = env["ICECAST_HOST"], mount = '/radio.mp3', password = 'hackme', %mp3.vbr(), radio) 57 output.icecast(host = env["ICECAST_HOST"], mount = '/radio.opus', password = 'hackme', %opus(bitrate = 128), radio) 58 output.icecast(host = env["ICECAST_HOST"], mount = '/radio.badge', password = 'hackme', send_icy_metadata = false, %mp3.cbr(bitrate = 64), radio) 59else 60 output(fallible = true, buffer(radio)) 61end 62 63interactive.harbor(port = port) 64 65def current(request, response) = 66 response.data(metadata.json.stringify(last_metadata())) 67end 68harbor.http.register(port = port, "/current", current) 69 70def skip(request, response) = 71 tracks.skip() 72 response.data(metadata.json.stringify(last_metadata())) 73end 74harbor.http.register(method = "POST", port = port, "/skip", skip) 75 76def all_tracks(request, response) = 77 response.data(json.stringify(all_music.remaining_files())) 78end 79harbor.http.register(port = port, "/all_tracks", all_tracks) 80 81def wish_track(req, response) = 82 if string.match(pattern = '^process:', req.body()) then 83 response.status_code(400) 84 else 85 # TODO report errors back 86 wish = request.create(req.body()) 87 wishlist.push(wish) 88 response.data("ok") 89 end 90end 91harbor.http.register(method = "POST", port = port, "/wish", wish_track) 92 93def wish_tracklist(request, response) = 94 response.data(json.stringify(queue_contents(wishlist.queue()))) 95end 96harbor.http.register(port = port, "/wish", wish_tracklist) 97 98def announce(req, response) = 99 news.push(request.create("http://c.r/announce.ogg")) 100 response.data("ok") 101end 102harbor.http.register(method = "POST", port = port, "/announce", announce) 103 104def newsshow(req, response) = 105 news.push(request.create("http://c.r/news.ogg")) 106 response.data("ok") 107end 108harbor.http.register(method = "POST", port = port, "/newsshow", newsshow)