1
0
Fork 0

Compare commits

...

1 Commits

Author SHA1 Message Date
Icedream 7b37ea2dfa
Rewrite liq scripts for liquidsoap 2.2. 2023-03-17 04:41:51 +01:00
3 changed files with 74 additions and 48 deletions

View File

@ -16,7 +16,10 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
s = insert_metadata(s) s = insert_metadata(s)
# Handler for fetching metadata # Handler for fetching metadata
def on_http_get_metadata(~protocol, ~data, ~headers, uri) = def on_http_get_metadata(request) =
http_version = request.http_version
headers = request.headers
m = s.last_metadata() ?? [] m = s.last_metadata() ?? []
# remove cover info and link to it instead if existing # remove cover info and link to it instead if existing
@ -35,7 +38,7 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
m = metadata.cover.remove(m) m = metadata.cover.remove(m)
data = http_export_meta(compact=true, m) data = http_export_meta(compact=true, m)
http.response(protocol=protocol, code=200, headers=[ http.response(http_version=http_version, status_code=200, headers=[
("access-control-allow-origin","*"), ("access-control-allow-origin","*"),
("access-control-allow-credentials","true"), ("access-control-allow-credentials","true"),
("access-control-allow-methods","GET,POST"), ("access-control-allow-methods","GET,POST"),
@ -47,11 +50,14 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
end end
# Handler for fetching current cover art # Handler for fetching current cover art
def on_http_get_cover(~protocol, ~data, ~headers, uri) = def on_http_get_cover(request) =
http_version = request.http_version
headers = request.headers
m = s.last_metadata() ?? [] m = s.last_metadata() ?? []
cover = metadata.cover(m) ?? "".{mime="text/plain"} cover = metadata.cover(m) ?? "".{mime="text/plain"}
if string.length(cover) > 0 then if string.length(cover) > 0 then
http.response(protocol=protocol, code=200, headers=[ http.response(http_version=http_version, status_code=200, headers=[
("access-control-allow-origin","*"), ("access-control-allow-origin","*"),
("access-control-allow-credentials","true"), ("access-control-allow-credentials","true"),
("access-control-allow-methods","GET,POST"), ("access-control-allow-methods","GET,POST"),
@ -61,7 +67,7 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
("content-type", cover.mime), ("content-type", cover.mime),
], data=string_of(cover)) ], data=string_of(cover))
else else
http.response(protocol=protocol, code=404, headers=[ http.response(http_version=http_version, status_code=404, headers=[
("access-control-allow-origin","*"), ("access-control-allow-origin","*"),
("access-control-allow-credentials","true"), ("access-control-allow-credentials","true"),
("access-control-allow-methods","GET,POST"), ("access-control-allow-methods","GET,POST"),
@ -73,7 +79,11 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
end end
# Handler for receiving metadata # Handler for receiving metadata
def on_http_metadata(~protocol, ~data, ~headers, uri) = def on_http_metadata(request) =
http_version = request.http_version
data = request.data()
headers = request.headers
let json.parse (data : { let json.parse (data : {
data: [(string * string)] as json.object data: [(string * string)] as json.object
}) = data }) = data
@ -108,7 +118,7 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
# set metadata on stream # set metadata on stream
s.insert_metadata(new_track=new_track, m) s.insert_metadata(new_track=new_track, m)
http.response(protocol=protocol, code=200, headers=[ http.response(http_version=http_version, status_code=200, headers=[
("allow","POST"), ("allow","POST"),
("access-control-allow-origin","*"), ("access-control-allow-origin","*"),
("access-control-allow-credentials","true"), ("access-control-allow-credentials","true"),
@ -119,8 +129,11 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
end end
# Just in case we use a browser to send data to this (for example while emulating Tuna) # Just in case we use a browser to send data to this (for example while emulating Tuna)
def on_http_metadata_cors(~protocol, ~data, ~headers, uri) = def on_http_metadata_cors(request) =
http.response(protocol=protocol, code=200, headers=[ http_version = request.http_version
headers = request.headers
http.response(http_version=http_version, status_code=200, headers=[
("allow","POST"), ("allow","POST"),
("access-control-allow-origin","*"), ("access-control-allow-origin","*"),
("access-control-allow-credentials","true"), ("access-control-allow-credentials","true"),
@ -130,17 +143,17 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
], data="POST") ], data="POST")
end end
harbor.http.register(port=metadata_api_port, method="GET", "/#{id}/meta", on_http_get_metadata) harbor.http.register.simple(port=metadata_api_port, method="GET", "/#{id}/meta", on_http_get_metadata)
harbor.http.register(port=metadata_api_port, method="OPTIONS", "/#{id}/meta", on_http_metadata_cors) harbor.http.register.simple(port=metadata_api_port, method="OPTIONS", "/#{id}/meta", on_http_metadata_cors)
harbor.http.register(port=metadata_api_port, method="GET", "/#{id}/cover", on_http_get_cover) harbor.http.register.simple(port=metadata_api_port, method="GET", "/#{id}/cover", on_http_get_cover)
harbor.http.register(port=metadata_api_port, method="OPTIONS", "/#{id}/cover", on_http_metadata_cors) harbor.http.register.simple(port=metadata_api_port, method="OPTIONS", "/#{id}/cover", on_http_metadata_cors)
harbor.http.register(port=metadata_api_port, method="POST", "/#{id}", on_http_metadata) harbor.http.register.simple(port=metadata_api_port, method="POST", "/#{id}", on_http_metadata)
harbor.http.register(port=metadata_api_port, method="OPTIONS", "/#{id}", on_http_metadata_cors) harbor.http.register.simple(port=metadata_api_port, method="OPTIONS", "/#{id}", on_http_metadata_cors)
harbor.http.register(port=metadata_api_port, method="POST", "/", on_http_metadata) harbor.http.register.simple(port=metadata_api_port, method="POST", "/", on_http_metadata)
harbor.http.register(port=metadata_api_port, method="OPTIONS", "/", on_http_metadata_cors) harbor.http.register.simple(port=metadata_api_port, method="OPTIONS", "/", on_http_metadata_cors)
s s
end end

View File

@ -22,18 +22,32 @@ set("sandbox", "disabled")
s = input.http(id="input_ice_main", max_buffer=4., "http://127.0.0.1:61120/main") s = input.http(id="input_ice_main", max_buffer=4., "http://127.0.0.1:61120/main")
# Split audio off to be handled specially # Split audio off to be handled specially
a = drop_video(s) # NOTE - drop_video causes a weird error during script validation, we assume audio-only here
# a = drop_video(s)
a = s
a = mksafe_soft(a) a = mksafe_soft(a)
output.dummy(a) output.dummy(a)
def append_encoder_meta(m) = def append_encoder_meta(_) =
[ new_meta = [
("encoder", "Liquidsoap #{liquidsoap.version}"), ("encoder", "Liquidsoap #{liquidsoap.version}"),
("stream_name", stream_name),
("stream_description", stream_description),
] ]
new_meta = if null.defined(stream_name) then
[...new_meta, ("stream_name", null.get(stream_name))]
else
new_meta
end
new_meta = if null.defined(stream_description) then
[...new_meta, ("stream_description", null.get(stream_description))]
else
new_meta
end
new_meta
end end
a = map_metadata(id="main", append_encoder_meta, a) a = metadata.map(id="main", append_encoder_meta, a)
a = setup_harbor_metadata_api(a) a = setup_harbor_metadata_api(a)
@ -55,10 +69,10 @@ def internal_icecast(
headers=[], headers=[],
port=61120, port=61120,
host="127.0.0.1", host="127.0.0.1",
user=internal_icecast_username, user=null.get(internal_icecast_username),
password=internal_icecast_password, password=null.get(internal_icecast_password),
name=stream_name, name=null.get(stream_name),
description=stream_description, description=null.get(stream_description),
e, s) e, s)
end end
@ -123,7 +137,7 @@ setup_harbor_stream_api(internal_icecast(
)) ))
# REKT.fm # REKT.fm
if string.length(rektfm_username) > 0 and string.length(rektfm_password) > 0 then if null.defined(rektfm_username) and null.defined(rektfm_password) then
setup_harbor_stream_api(output.icecast( setup_harbor_stream_api(output.icecast(
id="out_a_rekt", id="out_a_rekt",
# %ogg(%flac), # %ogg(%flac),
@ -133,10 +147,10 @@ if string.length(rektfm_username) > 0 and string.length(rektfm_password) > 0 the
port=60000, port=60000,
host="stream.rekt.network", host="stream.rekt.network",
# host="stream.rekt.fm", # host="stream.rekt.fm",
user=rektfm_username, user=null.get(rektfm_username),
name=stream_name, name=null.get(stream_name),
description=stream_description, description=null.get(stream_description),
password=rektfm_password, password=null.get(rektfm_password),
start=false, start=false,
%ffmpeg( %ffmpeg(
format="ogg", format="ogg",

View File

@ -3,35 +3,34 @@ stream_api_port=21336
interactive.harbor(port=stream_api_port, uri="/interactive") # expose through stream API port interactive.harbor(port=stream_api_port, uri="/interactive") # expose through stream API port
# list of stream IDs that have been set up by setup_harbor_stream_api # list of stream IDs that have been set up by setup_harbor_stream_api
stream_api_streams=[] stream_api_streams=ref([])
def setup_harbor_stream_api_general() def setup_harbor_stream_api_general()
def on_list(~protocol, ~data, ~headers, uri) = def on_list(_) =
data = stream_api_streams http.response(status_code=200, headers=[
http.response(protocol=protocol, code=200, headers=[
("content-type","application/json"), ("content-type","application/json"),
], data=json.stringify(data)) ], data=json.stringify(stream_api_streams()))
end end
harbor.http.register(port=stream_api_port, method="GET", "/streams/", on_list) harbor.http.register.simple(port=stream_api_port, method="GET", "/streams/", on_list)
end end
def setup_harbor_stream_api(s) = def setup_harbor_stream_api(s) =
def on_start(~protocol, ~data, ~headers, uri) = def on_start(_) =
s.start() s.start()
http.response(protocol=protocol, code=200, headers=[ http.response(status_code=200, headers=[
("content-type","application/json"), ("content-type","application/json"),
], data=json.stringify([])) ], data=json.stringify([]))
end end
def on_stop(~protocol, ~data, ~headers, uri) = def on_stop(_) =
s.stop() s.stop()
http.response(protocol=protocol, code=200, headers=[ http.response(status_code=200, headers=[
("content-type","application/json"), ("content-type","application/json"),
], data=json.stringify([])) ], data=json.stringify([]))
end end
def on_info(~protocol, ~data, ~headers, uri) = def on_info(_) =
data = [ data = [
("id", s.id()), ("id", s.id()),
("last_metadata", json.stringify(s.last_metadata())), ("last_metadata", json.stringify(s.last_metadata())),
@ -40,16 +39,16 @@ def setup_harbor_stream_api(s) =
("is_ready", json.stringify(s.is_ready())), ("is_ready", json.stringify(s.is_ready())),
("is_active", json.stringify(s.is_active())), ("is_active", json.stringify(s.is_active())),
] ]
http.response(protocol=protocol, code=200, headers=[ http.response(status_code=200, headers=[
("content-type","application/json"), ("content-type","application/json"),
], data=json.stringify(data)) ], data=json.stringify(data))
end end
s.id()::stream_api_streams stream_api_streams := [...stream_api_streams(), s.id()]
harbor.http.register(port=stream_api_port, method="POST", "/streams/#{s.id()}/start", on_start) harbor.http.register.simple(port=stream_api_port, method="POST", "/streams/#{s.id()}/start", on_start)
harbor.http.register(port=stream_api_port, method="POST", "/streams/#{s.id()}/stop", on_stop) harbor.http.register.simple(port=stream_api_port, method="POST", "/streams/#{s.id()}/stop", on_stop)
harbor.http.register(port=stream_api_port, method="GET", "/streams/#{s.id()}", on_info) harbor.http.register.simple(port=stream_api_port, method="GET", "/streams/#{s.id()}", on_info)
s s
end end