From 87692c860b40aa985987983bd141e9ca9a350049 Mon Sep 17 00:00:00 2001 From: bkfox Date: Sun, 28 Apr 2024 18:59:33 +0200 Subject: [PATCH] streamer: integrate, fix, ui change --- README.md | 0 aircox/templates/aircox/base.html | 1 + aircox_streamer/connector.py | 14 +-- aircox_streamer/controllers/sources.py | 2 +- .../aircox_streamer/scripts/station.liq | 15 +-- .../aircox_streamer/source_item.html | 107 +++++++++--------- aircox_streamer/urls.py | 4 +- aircox_streamer/viewsets.py | 12 +- 8 files changed, 79 insertions(+), 76 deletions(-) mode change 100755 => 100644 README.md mode change 100644 => 100755 aircox_streamer/templates/aircox_streamer/source_item.html mode change 100644 => 100755 aircox_streamer/urls.py mode change 100644 => 100755 aircox_streamer/viewsets.py diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/aircox/templates/aircox/base.html b/aircox/templates/aircox/base.html index 94fb483..552416b 100644 --- a/aircox/templates/aircox/base.html +++ b/aircox/templates/aircox/base.html @@ -24,6 +24,7 @@ Usefull context: { "imports": { "vue": "{{vue_url}}" + {% block assets-import-map %}{% endblock %} } } diff --git a/aircox_streamer/connector.py b/aircox_streamer/connector.py index ef04b28..37382d6 100755 --- a/aircox_streamer/connector.py +++ b/aircox_streamer/connector.py @@ -70,14 +70,14 @@ class Connector: data = bytes("".join([str(d) for d in data]) + "\n", encoding="utf-8") try: self.socket.sendall(data) - data = "" - while not response_re.search(data): - data += self.socket.recv(1024).decode("utf-8") + resp = "" + while not response_re.search(resp): + resp += self.socket.recv(1024).decode("utf-8") - if data: - data = response_re.sub(r"\1", data).strip() - data = self.parse(data) if parse else self.parse_json(data) if parse_json else data - return data + if resp: + resp = response_re.sub(r"\1", resp).strip() + resp = self.parse(resp) if parse else self.parse_json(resp) if parse_json else resp + return resp except Exception: self.close() if try_count > 0: diff --git a/aircox_streamer/controllers/sources.py b/aircox_streamer/controllers/sources.py index e47858e..7993502 100755 --- a/aircox_streamer/controllers/sources.py +++ b/aircox_streamer/controllers/sources.py @@ -131,7 +131,7 @@ class QueueSource(Source): def push(self, *paths): """Add the provided paths to source's play queue.""" for path in paths: - self.controller.send(f"{self.id}_queue.push {path}") + print(self.controller.send(f"{self.id}_queue.push {path}")) def fetch(self): super().fetch() diff --git a/aircox_streamer/templates/aircox_streamer/scripts/station.liq b/aircox_streamer/templates/aircox_streamer/scripts/station.liq index 88a3574..e0f3650 100755 --- a/aircox_streamer/templates/aircox_streamer/scripts/station.liq +++ b/aircox_streamer/templates/aircox_streamer/scripts/station.liq @@ -19,7 +19,7 @@ end {# Transition to live sources #} def to_live(stream, live) - stream = fade.final(duration=2., type='log', stream) + stream = fade.out(duration=2., type='log', stream) live = fade.initial(duration=2., type='log', live) add(normalize=false, [stream,live]) end @@ -31,12 +31,12 @@ def to_stream(live, stream) end {# Skip command #} -def add_skip_command(s) = +def add_skip_command(id, s) = def skip(_) = source.skip(s) "Done!" end - server.register(namespace="#{source.id(s)}", + server.register(namespace=id, usage="skip", description="Skip the current song.", "skip",skip) @@ -58,9 +58,8 @@ def interactive (id, s) = usage="remaining", "remaining", fun (_) -> begin json.stringify(source.remaining(s)) end) - add_skip_command(s) + add_skip_command(id, s) - {# metadata: create an interactive variable as "{id}_meta" #} s_meta = interactive.string("#{id}_meta", "") s = source.on_metadata(s, fun(meta) -> s_meta.set(json.stringify(meta))) @@ -82,10 +81,7 @@ set("server.socket", true) set("server.socket.path", "{{ streamer.socket_path }}") set("log.file.path", "{{ log_file }}") {% endblock %} - -{% block config_extras %} -{% endblock %} - +{% block config_extras %}{% endblock %} {% block sources %} {% with source=streamer.dealer %} @@ -94,7 +90,6 @@ live = audio_to_stereo(interactive('{{ source.id }}', )) {% endwith %} - streams = rotate(id="streams", [ {% for source in streamer.sources %} {% if source != streamer.dealer %} diff --git a/aircox_streamer/templates/aircox_streamer/source_item.html b/aircox_streamer/templates/aircox_streamer/source_item.html old mode 100644 new mode 100755 index 4e012f4..a706329 --- a/aircox_streamer/templates/aircox_streamer/source_item.html +++ b/aircox_streamer/templates/aircox_streamer/source_item.html @@ -1,8 +1,9 @@ {% comment %}List item for a source.{% endcomment %} {% load i18n %} -
-
+
+ +
@@ -21,28 +22,70 @@
+ + + + + + + + + + + + + + +
+ {% translate "Status" %} + + + + [[ source.data.status_verbose || "—" ]] +
+ {% translate "Air time" %} + + + +
+ {% translate "Time left" %} + + + [[ source.remainingString ]] +
+ {% translate "Data source" %} + + + [[ (source.data.uri && source.data.uri.slice(-64)) || '—' ]] +
+
+ +
- - - +
@@ -89,46 +132,4 @@
-
-
Metadata
- - - - - - - - - - - - - - -
- {% translate "Status" %} - - - - [[ source.data.status_verbose || "—" ]] -
- {% translate "Air time" %} - - - -
- {% translate "Time left" %} - - - [[ source.remainingString ]] -
- {% translate "Data source" %} - - - [[ (source.data.uri && source.data.uri.slice(-64)) || '—' ]] -
-
diff --git a/aircox_streamer/urls.py b/aircox_streamer/urls.py old mode 100644 new mode 100755 index 3351e20..6ca7691 --- a/aircox_streamer/urls.py +++ b/aircox_streamer/urls.py @@ -9,10 +9,10 @@ from . import views, viewsets __all__ = ("api", "urls") -prefix = "(?P[0-9]+)/" +prefix = "/" -router = DefaultRouter() +router = DefaultRouter(use_regex_path=False) router.register(prefix + "playlist", viewsets.PlaylistSourceViewSet, basename="streamer-playlist") router.register(prefix + "queue", viewsets.QueueSourceViewSet, basename="streamer-queue") router.register("streamer", viewsets.StreamerViewSet, basename="streamer") diff --git a/aircox_streamer/viewsets.py b/aircox_streamer/viewsets.py old mode 100644 new mode 100755 index d6689a2..9b9948a --- a/aircox_streamer/viewsets.py +++ b/aircox_streamer/viewsets.py @@ -46,7 +46,7 @@ class ControllerViewSet(viewsets.ViewSet): if station_pk is None: return None if station_pk not in self.streamers: - raise Http404("station not found") + raise Http404(f"station not found: {station_pk}") return self.streamers[station_pk] def get_serializer(self, **kwargs): @@ -60,7 +60,8 @@ class ControllerViewSet(viewsets.ViewSet): return serializer.data def dispatch(self, request, *args, station_pk=None, **kwargs): - self.streamer = self.get_streamer(station_pk) + if not self.streamer: + self.streamer = self.get_streamer(station_pk) return super().dispatch(request, *args, **kwargs) @@ -80,6 +81,9 @@ class StreamerViewSet(ControllerViewSet): def dispatch(self, request, *args, pk=None, **kwargs): if pk is not None: kwargs.setdefault("station_pk", pk) + if pk := kwargs.get("station_pk"): + kwargs["station_pk"] = int(pk) + self.streamer = self.get_streamer(**kwargs) self.object = self.streamer return super().dispatch(request, *args, **kwargs) @@ -88,6 +92,8 @@ class StreamerViewSet(ControllerViewSet): class SourceViewSet(ControllerViewSet): serializer_class = SourceSerializer model = controllers.Source + lookup_field = "pk" + lookup_value_converter = "str" def get_sources(self): return (s for s in self.streamer.sources if isinstance(s, self.model)) @@ -139,7 +145,7 @@ class QueueSourceViewSet(SourceViewSet): model = controllers.QueueSource def get_sound_queryset(self, request): - return Sound.objects.station(request.station).broadcast() + return Sound.objects.station(request.station) @action(detail=True, methods=["POST"]) def push(self, request, pk):