1
0
Fork 0

Rewrite liq scripts for liquidsoap 2.2.

Icedream 2023-03-17 04:41:51 +01:00
parent 1bd68fc0ba
commit 7b37ea2dfa
Signed by: icedream
GPG Key ID: 468BBEEBB9EC6AEA
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)
# 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() ?? []
# 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)
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-credentials","true"),
("access-control-allow-methods","GET,POST"),
@ -47,11 +50,14 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
end
# 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() ?? []
cover = metadata.cover(m) ?? "".{mime="text/plain"}
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-credentials","true"),
("access-control-allow-methods","GET,POST"),
@ -61,7 +67,7 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
("content-type", cover.mime),
], data=string_of(cover))
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-credentials","true"),
("access-control-allow-methods","GET,POST"),
@ -73,7 +79,11 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
end
# 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 : {
data: [(string * string)] as json.object
}) = data
@ -108,7 +118,7 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
# set metadata on stream
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"),
("access-control-allow-origin","*"),
("access-control-allow-credentials","true"),
@ -119,8 +129,11 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
end
# 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) =
http.response(protocol=protocol, code=200, headers=[
def on_http_metadata_cors(request) =
http_version = request.http_version
headers = request.headers
http.response(http_version=http_version, status_code=200, headers=[
("allow","POST"),
("access-control-allow-origin","*"),
("access-control-allow-credentials","true"),
@ -130,17 +143,17 @@ def setup_harbor_metadata_api(~metadata_api_port=21338, s) =
], data="POST")
end
harbor.http.register(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="GET", "/#{id}/meta", on_http_get_metadata)
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(port=metadata_api_port, method="OPTIONS", "/#{id}/cover", on_http_metadata_cors)
harbor.http.register.simple(port=metadata_api_port, method="GET", "/#{id}/cover", on_http_get_cover)
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(port=metadata_api_port, method="OPTIONS", "/#{id}", on_http_metadata_cors)
harbor.http.register.simple(port=metadata_api_port, method="POST", "/#{id}", on_http_metadata)
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(port=metadata_api_port, method="OPTIONS", "/", on_http_metadata_cors)
harbor.http.register.simple(port=metadata_api_port, method="POST", "/", on_http_metadata)
harbor.http.register.simple(port=metadata_api_port, method="OPTIONS", "/", on_http_metadata_cors)
s
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")
# 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)
output.dummy(a)
def append_encoder_meta(m) =
[
def append_encoder_meta(_) =
new_meta = [
("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
a = map_metadata(id="main", append_encoder_meta, a)
a = metadata.map(id="main", append_encoder_meta, a)
a = setup_harbor_metadata_api(a)
@ -55,10 +69,10 @@ def internal_icecast(
headers=[],
port=61120,
host="127.0.0.1",
user=internal_icecast_username,
password=internal_icecast_password,
name=stream_name,
description=stream_description,
user=null.get(internal_icecast_username),
password=null.get(internal_icecast_password),
name=null.get(stream_name),
description=null.get(stream_description),
e, s)
end
@ -123,7 +137,7 @@ setup_harbor_stream_api(internal_icecast(
))
# 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(
id="out_a_rekt",
# %ogg(%flac),
@ -133,10 +147,10 @@ if string.length(rektfm_username) > 0 and string.length(rektfm_password) > 0 the
port=60000,
host="stream.rekt.network",
# host="stream.rekt.fm",
user=rektfm_username,
name=stream_name,
description=stream_description,
password=rektfm_password,
user=null.get(rektfm_username),
name=null.get(stream_name),
description=null.get(stream_description),
password=null.get(rektfm_password),
start=false,
%ffmpeg(
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
# 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 on_list(~protocol, ~data, ~headers, uri) =
data = stream_api_streams
http.response(protocol=protocol, code=200, headers=[
def on_list(_) =
http.response(status_code=200, headers=[
("content-type","application/json"),
], data=json.stringify(data))
], data=json.stringify(stream_api_streams()))
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
def setup_harbor_stream_api(s) =
def on_start(~protocol, ~data, ~headers, uri) =
def on_start(_) =
s.start()
http.response(protocol=protocol, code=200, headers=[
http.response(status_code=200, headers=[
("content-type","application/json"),
], data=json.stringify([]))
end
def on_stop(~protocol, ~data, ~headers, uri) =
def on_stop(_) =
s.stop()
http.response(protocol=protocol, code=200, headers=[
http.response(status_code=200, headers=[
("content-type","application/json"),
], data=json.stringify([]))
end
def on_info(~protocol, ~data, ~headers, uri) =
def on_info(_) =
data = [
("id", s.id()),
("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_active", json.stringify(s.is_active())),
]
http.response(protocol=protocol, code=200, headers=[
http.response(status_code=200, headers=[
("content-type","application/json"),
], data=json.stringify(data))
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(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="POST", "/streams/#{s.id()}/start", on_start)
harbor.http.register.simple(port=stream_api_port, method="POST", "/streams/#{s.id()}/stop", on_stop)
harbor.http.register.simple(port=stream_api_port, method="GET", "/streams/#{s.id()}", on_info)
s
end