aircox/aircox_streamer/management/commands/streamer.py
Thomas Kairos f7a61fe6c0 Feat: packaging (#127)
- Add configuration files for packaging
- Precommit now uses ruff

Co-authored-by: bkfox <thomas bkfox net>
Reviewed-on: #127
2023-10-11 10:58:34 +02:00

101 lines
3.2 KiB
Python
Executable File

"""Handle the audio streamer and controls it as we want it to be. It is used
to:
- generate config files and playlists;
- monitor Liquidsoap, logs and scheduled programs;
- cancels Diffusions that have an archive but could not have been played;
- run Liquidsoap
"""
from datetime import timezone
import time
from argparse import RawTextHelpFormatter
from django.core.management.base import BaseCommand
from django.utils import timezone as tz
from aircox.models import Station
from aircox_streamer.controllers import Monitor, Streamer
# force using UTC
tz.activate(timezone.UTC)
class Command(BaseCommand):
help = __doc__
def add_arguments(self, parser):
parser.formatter_class = RawTextHelpFormatter
group = parser.add_argument_group("actions")
group.add_argument(
"-c",
"--config",
action="store_true",
help="generate configuration files for the stations",
)
group.add_argument(
"-m",
"--monitor",
action="store_true",
help="monitor the scheduled diffusions and log what happens",
)
group.add_argument(
"-r",
"--run",
action="store_true",
help="run the required applications for the stations",
)
group = parser.add_argument_group("options")
group.add_argument(
"-d",
"--delay",
type=int,
default=1000,
help="time to sleep in MILLISECONDS between two updates when we "
"monitor. This influence the delay before a diffusion is "
"launched.",
)
group.add_argument(
"-s",
"--station",
type=str,
action="append",
help="name of the station to monitor instead of monitoring " "all stations",
)
group.add_argument(
"-t",
"--timeout",
type=float,
default=Monitor.cancel_timeout.total_seconds() / 60,
help="time to wait in MINUTES before canceling a diffusion that " "should have ran but did not. ",
)
# TODO: sync-timeout, cancel-timeout
def handle(self, *args, config=None, run=None, monitor=None, station=[], delay=1000, timeout=600, **options):
stations = Station.objects.filter(name__in=station) if station else Station.objects.all()
streamers = [Streamer(station) for station in stations]
for streamer in streamers:
if not streamer.outputs:
raise RuntimeError("Streamer {} has no outputs".format(streamer.id))
if config:
streamer.make_config()
if run:
streamer.run_process()
if monitor:
delay = tz.timedelta(milliseconds=delay)
timeout = tz.timedelta(minutes=timeout)
monitors = [Monitor(streamer, delay, cancel_timeout=timeout) for streamer in streamers]
while not run or streamer.is_running:
for monitor in monitors:
monitor.monitor()
time.sleep(delay.total_seconds())
if run:
for streamer in streamers:
streamer.wait_process()