This repository has no description
0

Configure Feed

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

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