Compare commits
1 Commits
130c33799b
...
7b37ea2dfa
Author | SHA1 | Date |
---|---|---|
|
7b37ea2dfa |
|
@ -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
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue