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