diff --git a/icedreammusic/liquidsoap/metadata_api.liq b/icedreammusic/liquidsoap/metadata_api.liq index 97720a3..7457aa8 100644 --- a/icedreammusic/liquidsoap/metadata_api.liq +++ b/icedreammusic/liquidsoap/metadata_api.liq @@ -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 diff --git a/icedreammusic/liquidsoap/stream.liq b/icedreammusic/liquidsoap/stream.liq index 5f1979b..0d3073f 100644 --- a/icedreammusic/liquidsoap/stream.liq +++ b/icedreammusic/liquidsoap/stream.liq @@ -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", diff --git a/icedreammusic/liquidsoap/stream_api.liq b/icedreammusic/liquidsoap/stream_api.liq index d5fd5df..b74022a 100644 --- a/icedreammusic/liquidsoap/stream_api.liq +++ b/icedreammusic/liquidsoap/stream_api.liq @@ -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