This commit is contained in:
bkfox
2024-04-19 15:06:23 +02:00
parent 1d321a0de6
commit 07d72d799d
60 changed files with 503 additions and 306 deletions

View File

@ -3,6 +3,7 @@ import tzlocal
from aircox.utils import to_seconds
from ..conf import settings
from .metadata import Metadata, Request
@ -76,7 +77,7 @@ class PlaylistSource(Source):
self.program = program
super().__init__(controller, id=id, **kwargs)
self.path = os.path.join(self.station.path, f"{self.id}.m3u")
self.path = settings.get_dir(self.station, f"{self.id}.m3u")
def get_sound_queryset(self):
"""Get playlist's sounds queryset."""
@ -88,6 +89,7 @@ class PlaylistSource(Source):
def write_playlist(self, playlist=[]):
"""Write playlist to file."""
playlist = playlist or self.get_playlist()
os.makedirs(os.path.dirname(self.path), exist_ok=True)
with open(self.path, "w") as file:
file.write("\n".join(playlist or []))

View File

@ -95,6 +95,8 @@ class Streamer:
data = render_to_string(
self.template_name,
{
"dir": settings.get_dir(self.station),
"log_file": settings.get_dir(self.station, "liquidsoap.log"),
"station": self.station,
"streamer": self,
},

View File

@ -53,13 +53,13 @@ class SourceSerializer(MetadataSerializer):
class PlaylistSerializer(SourceSerializer):
program = serializers.CharField(source="program.id")
url_name = "admin:api:streamer-playlist-detail"
url_name = "streamer:api:streamer-playlist-detail"
class QueueSourceSerializer(SourceSerializer):
queue = serializers.ListField(child=RequestSerializer(), source="requests")
url_name = "admin:api:streamer-queue-detail"
url_name = "streamer:api:streamer-queue-detail"
class StreamerSerializer(BaseSerializer):
@ -69,7 +69,7 @@ class StreamerSerializer(BaseSerializer):
playlists = serializers.ListField(child=PlaylistSerializer())
queues = serializers.ListField(child=QueueSourceSerializer())
url_name = "admin:api:streamer-detail"
url_name = "streamer:api:streamer-detail"
def get_url(self, obj, **kwargs):
kwargs["pk"] = obj.station.pk

View File

@ -80,7 +80,7 @@ end
{% block config %}
set("server.socket", true)
set("server.socket.path", "{{ streamer.socket_path }}")
set("log.file.path", "{{ station.path }}/liquidsoap.log")
set("log.file.path", "{{ log_file }}")
{% endblock %}
{% block config_extras %}

View File

@ -1,16 +1,13 @@
{% extends "admin/base_site.html" %}
{% comment %}Admin tools used to manage the streamer.{% endcomment %}
{% extends "aircox/dashboard/base.html" %}
{% load i18n static %}
{% block init-scripts %}
aircox.init({apiUrl: "{% url "admin:api:streamer-list" %}"},
{config: window.StreamerApp})
{% endblock %}
{% block content %}
{% block title %}{% translate "Streamer monitor" %}{% endblock %}
{% block content-container %}
{{ block.super }}
<div id="app">
<a-streamer api-url="{% url "admin:api:streamer-list" %}">
<div class="container">
<a-streamer api-url="{% url "streamer:api:streamer-list" %}">
<template v-slot="{streamer,streamers,sources,fetchStreamers,Sound}">
<div class="navbar toolbar">
<div class="navbar-start">

View File

@ -1,33 +1,25 @@
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from django.urls import include, path
from aircox.viewsets import SoundViewSet
from . import viewsets
from .views import StreamerAdminView
from . import views, viewsets
admin.site.route_view(
"tools/streamer",
StreamerAdminView.as_view(),
"tools-streamer",
label=_("Streamer Monitor"),
)
streamer_prefix = "streamer/(?P<station_pk>[0-9]+)/"
__all__ = ("api", "urls")
prefix = "(?P<station_pk>[0-9]+)/"
router = admin.site.router
router.register(
streamer_prefix + "playlist",
viewsets.PlaylistSourceViewSet,
basename="streamer-playlist",
)
router.register(
streamer_prefix + "queue",
viewsets.QueueSourceViewSet,
basename="streamer-queue",
)
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")
router.register("sound", SoundViewSet, basename="sound")
urls = []
api = router.urls
urls = [
path("api/", include((api, "aircox_streamer"), namespace="api")),
path("", views.StreamerView.as_view(), name="dashboard-streamer"),
]

View File

@ -1,13 +1,13 @@
from django.utils.translation import gettext_lazy as _
from django.views.generic import TemplateView
from aircox.views.admin import AdminMixin
from aircox.views.dashboard import DashboardBaseView
from .controllers import streamers
class StreamerAdminView(AdminMixin, TemplateView):
class StreamerView(DashboardBaseView, TemplateView):
template_name = "aircox_streamer/streamer.html"
title = _("Streamer Monitor")
title = _("Streamer")
streamers = streamers
def dispatch(self, *args, **kwargs):

View File

@ -43,6 +43,8 @@ class ControllerViewSet(viewsets.ViewSet):
if station_pk is None:
station_pk = self.request.station.pk
self.streamers.fetch()
if station_pk is None:
return None
if station_pk not in self.streamers:
raise Http404("station not found")
return self.streamers[station_pk]
@ -78,7 +80,7 @@ class StreamerViewSet(ControllerViewSet):
def dispatch(self, request, *args, pk=None, **kwargs):
if pk is not None:
kwargs.setdefault("station_pk", pk)
self.streamer = self.get_streamer(request, **kwargs)
self.streamer = self.get_streamer(**kwargs)
self.object = self.streamer
return super().dispatch(request, *args, **kwargs)