This repository has no description
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)