From 368350b269d7a86ff69e626e3d2d462218cfbaf3 Mon Sep 17 00:00:00 2001 From: Jonas L Date: Fri, 22 Jul 2022 16:26:43 +0200 Subject: [PATCH] feat(playout): use single clients instance (#1980) - Use legacy_client across playout code to make the difference between the old and new clients. - Setup clients during initialization, and pass clients down to the different apps. --- .../liquidsoap/entrypoint.py | 6 ++--- .../liquidsoap/liquidsoap_auth.py | 6 ++--- playout/libretime_playout/main.py | 24 +++++++++++-------- playout/libretime_playout/notify/main.py | 4 ++-- playout/libretime_playout/player/fetch.py | 16 +++++++------ playout/libretime_playout/player/file.py | 4 ++-- playout/libretime_playout/player/push.py | 2 -- playout/libretime_playout/recorder.py | 18 +++++++------- playout/libretime_playout/stats.py | 12 +++++----- 9 files changed, 49 insertions(+), 43 deletions(-) diff --git a/playout/libretime_playout/liquidsoap/entrypoint.py b/playout/libretime_playout/liquidsoap/entrypoint.py index cbe89b5be..ef14934bb 100644 --- a/playout/libretime_playout/liquidsoap/entrypoint.py +++ b/playout/libretime_playout/liquidsoap/entrypoint.py @@ -5,7 +5,7 @@ import traceback from pathlib import Path from typing import Optional -from libretime_api_client.v1 import ApiClient +from libretime_api_client.v1 import ApiClient as LegacyClient from loguru import logger @@ -50,8 +50,8 @@ def generate_entrypoint(log_filepath: Optional[Path]): while not successful: try: - ac = ApiClient(logger) - ss = ac.get_stream_setting() + legacy_client = LegacyClient(logger) + ss = legacy_client.get_stream_setting() generate_liquidsoap_config(ss, log_filepath) successful = True except Exception as e: diff --git a/playout/libretime_playout/liquidsoap/liquidsoap_auth.py b/playout/libretime_playout/liquidsoap/liquidsoap_auth.py index c885f056c..28f922df5 100644 --- a/playout/libretime_playout/liquidsoap/liquidsoap_auth.py +++ b/playout/libretime_playout/liquidsoap/liquidsoap_auth.py @@ -1,8 +1,8 @@ import sys -from libretime_api_client.v1 import ApiClient +from libretime_api_client.v1 import ApiClient as LegacyClient -api_client = ApiClient() +legacy_client = LegacyClient() dj_type = sys.argv[1] username = sys.argv[2] @@ -14,7 +14,7 @@ if dj_type == "--master": elif dj_type == "--dj": source_type = "dj" -response = api_client.check_live_stream_auth(username, password, source_type) +response = legacy_client.check_live_stream_auth(username, password, source_type) if "msg" in response and response["msg"] == True: print(response["msg"]) diff --git a/playout/libretime_playout/main.py b/playout/libretime_playout/main.py index e457e1922..709b20d78 100644 --- a/playout/libretime_playout/main.py +++ b/playout/libretime_playout/main.py @@ -13,7 +13,8 @@ from threading import Lock from typing import Optional, Tuple import click -from libretime_api_client.v1 import ApiClient +from libretime_api_client.v1 import ApiClient as LegacyClient +from libretime_api_client.v2 import ApiClient from libretime_shared.cli import cli_config_options, cli_logging_options from libretime_shared.config import DEFAULT_ENV_PREFIX from libretime_shared.logging import level_from_name, setup_logger @@ -32,14 +33,14 @@ from .timeout import ls_timeout class Global: - def __init__(self, api_client): - self.api_client = api_client + def __init__(self, legacy_client: LegacyClient): + self.legacy_client = legacy_client def selfcheck(self): - return self.api_client.is_server_compatible() + return self.legacy_client.is_server_compatible() def test_api(self): - self.api_client.test() + self.legacy_client.test() def keyboardInterruptHandler(signum, frame): @@ -127,8 +128,9 @@ def cli(log_level: str, log_filepath: Optional[Path], config_filepath: Optional[ signal.signal(signal.SIGINT, keyboardInterruptHandler) + legacy_client = LegacyClient() api_client = ApiClient() - g = Global(api_client) + g = Global(legacy_client) while not g.selfcheck(): time.sleep(5) @@ -136,7 +138,7 @@ def cli(log_level: str, log_filepath: Optional[Path], config_filepath: Optional[ success = False while not success: try: - api_client.register_component("pypo") + legacy_client.register_component("pypo") success = True except Exception as e: logger.error(str(e)) @@ -166,7 +168,7 @@ def cli(log_level: str, log_filepath: Optional[Path], config_filepath: Optional[ pmh.daemon = True pmh.start() - pfile = PypoFile(media_q) + pfile = PypoFile(media_q, api_client) pfile.daemon = True pfile.start() @@ -177,6 +179,8 @@ def cli(log_level: str, log_filepath: Optional[Path], config_filepath: Optional[ telnet_lock, pypo_liquidsoap, config, + api_client, + legacy_client, ) pf.daemon = True pf.start() @@ -185,11 +189,11 @@ def cli(log_level: str, log_filepath: Optional[Path], config_filepath: Optional[ pp.daemon = True pp.start() - recorder = Recorder(recorder_q, config) + recorder = Recorder(recorder_q, config, legacy_client) recorder.daemon = True recorder.start() - stat = ListenerStat(config) + stat = ListenerStat(config, legacy_client) stat.daemon = True stat.start() diff --git a/playout/libretime_playout/notify/main.py b/playout/libretime_playout/notify/main.py index 857e2ec3a..c37e6bf44 100644 --- a/playout/libretime_playout/notify/main.py +++ b/playout/libretime_playout/notify/main.py @@ -16,7 +16,7 @@ from pathlib import Path from typing import Optional import click -from libretime_api_client.v1 import ApiClient +from libretime_api_client.v1 import ApiClient as LegacyClient from libretime_shared.cli import cli_logging_options from libretime_shared.config import DEFAULT_ENV_PREFIX from libretime_shared.logging import level_from_name, setup_logger @@ -24,7 +24,7 @@ from loguru import logger def api_client(): - return ApiClient(logger=logger) + return LegacyClient(logger=logger) @click.group(context_settings={"auto_envvar_prefix": DEFAULT_ENV_PREFIX}) diff --git a/playout/libretime_playout/player/fetch.py b/playout/libretime_playout/player/fetch.py index 4a984f340..86d9c6d8b 100644 --- a/playout/libretime_playout/player/fetch.py +++ b/playout/libretime_playout/player/fetch.py @@ -12,8 +12,8 @@ from queue import Empty from subprocess import PIPE, Popen from threading import Thread, Timer -from libretime_api_client.v1 import ApiClientV1 -from libretime_api_client.v2 import ApiClientV2 +from libretime_api_client.v1 import ApiClient as LegacyClient +from libretime_api_client.v2 import ApiClient from loguru import logger from ..config import CACHE_DIR, POLL_INTERVAL, Config @@ -38,14 +38,16 @@ class PypoFetch(Thread): telnet_lock, pypo_liquidsoap, config: Config, + api_client: ApiClient, + legacy_client: LegacyClient, ): Thread.__init__(self) # Hacky... PypoFetch.ref = self - self.v1_api_client = ApiClientV1() - self.api_client = ApiClientV2() + self.api_client = api_client + self.legacy_client = legacy_client self.fetch_queue = pypoFetch_q self.push_queue = pypoPush_q self.media_prepare_queue = media_q @@ -143,7 +145,7 @@ class PypoFetch(Thread): def set_bootstrap_variables(self): logger.debug("Getting information needed on bootstrap from Airtime") try: - info = self.v1_api_client.get_bootstrap_info() + info = self.legacy_client.get_bootstrap_info() except Exception as e: logger.exception("Unable to get bootstrap info.. Exiting pypo...") @@ -257,7 +259,7 @@ class PypoFetch(Thread): stream_id = info[0] status = info[1] if status == "true": - self.v1_api_client.notify_liquidsoap_status( + self.legacy_client.notify_liquidsoap_status( "OK", stream_id, str(fake_time) ) @@ -470,7 +472,7 @@ class PypoFetch(Thread): # push metadata to TuneIn. We have to do this because TuneIn turns # off metadata if it does not receive a request every 5 minutes. def update_metadata_on_tunein(self): - self.v1_api_client.update_metadata_on_tunein() + self.legacy_client.update_metadata_on_tunein() Timer(120, self.update_metadata_on_tunein).start() def main(self): diff --git a/playout/libretime_playout/player/file.py b/playout/libretime_playout/player/file.py index 32dd71b17..499f766ff 100644 --- a/playout/libretime_playout/player/file.py +++ b/playout/libretime_playout/player/file.py @@ -12,11 +12,11 @@ from requests.exceptions import ConnectionError, Timeout class PypoFile(Thread): - def __init__(self, schedule_queue): + def __init__(self, schedule_queue, api_client: ApiClient): Thread.__init__(self) self.media_queue = schedule_queue self.media = None - self.api_client = ApiClient() + self.api_client = api_client def copy_file(self, media_item): """ diff --git a/playout/libretime_playout/player/push.py b/playout/libretime_playout/player/push.py index 9a33ca02e..a56ceaacf 100644 --- a/playout/libretime_playout/player/push.py +++ b/playout/libretime_playout/player/push.py @@ -6,7 +6,6 @@ from datetime import datetime from queue import Queue from threading import Thread -from libretime_api_client.v1 import ApiClient from loguru import logger from ..config import PUSH_INTERVAL, Config @@ -25,7 +24,6 @@ def is_file(media_item): class PypoPush(Thread): def __init__(self, q, telnet_lock, pypo_liquidsoap, config: Config): Thread.__init__(self) - self.api_client = ApiClient() self.queue = q self.telnet_lock = telnet_lock diff --git a/playout/libretime_playout/recorder.py b/playout/libretime_playout/recorder.py index 545bb2450..831378fe8 100644 --- a/playout/libretime_playout/recorder.py +++ b/playout/libretime_playout/recorder.py @@ -12,7 +12,7 @@ from threading import Thread from zoneinfo import ZoneInfo import mutagen -from libretime_api_client.v1 import ApiClient +from libretime_api_client.v1 import ApiClient as LegacyClient from loguru import logger from libretime_playout.config import PUSH_INTERVAL, RECORD_DIR, Config @@ -44,9 +44,10 @@ class ShowRecorder(Thread): filelength, start_time, config: Config, + legacy_client: LegacyClient, ): Thread.__init__(self) - self.api_client = ApiClient() + self.legacy_client = legacy_client self.config = config self.filelength = filelength self.start_time = start_time @@ -120,7 +121,7 @@ class ShowRecorder(Thread): "show_instance": self.show_instance, } - self.api_client.upload_recorded_show(files, self.show_instance) + self.legacy_client.upload_recorded_show(files, self.show_instance) def set_metadata_and_save(self, filepath): """ @@ -168,9 +169,9 @@ class ShowRecorder(Thread): class Recorder(Thread): - def __init__(self, q, config: Config): + def __init__(self, q, config: Config, legacy_client: LegacyClient): Thread.__init__(self) - self.api_client = ApiClient() + self.legacy_client = legacy_client self.config = config self.sr = None self.shows_to_record = {} @@ -182,7 +183,7 @@ class Recorder(Thread): success = False while not success: try: - self.api_client.register_component("show-recorder") + self.legacy_client.register_component("show-recorder") success = True except Exception as e: logger.error(str(e)) @@ -304,6 +305,7 @@ class Recorder(Thread): show_length_seconds, start_time_formatted, self.config, + self.legacy_client, ) self.sr.start() break @@ -327,7 +329,7 @@ class Recorder(Thread): # Bootstrap: since we are just starting up, we need to grab the # most recent schedule. After that we can just wait for updates. try: - temp = self.api_client.get_shows_to_record() + temp = self.legacy_client.get_shows_to_record() if temp is not None: self.process_recorder_schedule(temp) logger.info("Bootstrap recorder schedule received: %s", temp) @@ -345,7 +347,7 @@ class Recorder(Thread): self.loops = 0 # Fetch recorder schedule try: - temp = self.api_client.get_shows_to_record() + temp = self.legacy_client.get_shows_to_record() if temp is not None: self.process_recorder_schedule(temp) logger.info("updated recorder schedule received: %s", temp) diff --git a/playout/libretime_playout/stats.py b/playout/libretime_playout/stats.py index ade6cce59..38ae95dad 100644 --- a/playout/libretime_playout/stats.py +++ b/playout/libretime_playout/stats.py @@ -7,7 +7,7 @@ from datetime import datetime from threading import Thread import defusedxml.minidom -from libretime_api_client.v1 import ApiClient +from libretime_api_client.v1 import ApiClient as LegacyClient from loguru import logger from .config import Config @@ -17,10 +17,10 @@ class ListenerStat(Thread): HTTP_REQUEST_TIMEOUT = 30 # 30 second HTTP request timeout - def __init__(self, config: Config): + def __init__(self, config: Config, legacy_client: LegacyClient): Thread.__init__(self) self.config = config - self.api_client = ApiClient() + self.legacy_client = legacy_client def get_node_text(self, nodelist): rc = [] @@ -31,7 +31,7 @@ class ListenerStat(Thread): def get_stream_parameters(self): # [{"user":"", "password":"", "url":"", "port":""},{},{}] - return self.api_client.get_stream_parameters() + return self.legacy_client.get_stream_parameters() def get_stream_server_xml(self, ip, url, is_shoutcast=False): auth_string = "%(admin_user)s:%(admin_pass)s" % ip @@ -132,12 +132,12 @@ class ListenerStat(Thread): return stats def push_stream_stats(self, stats): - self.api_client.push_stream_stats(stats) + self.legacy_client.push_stream_stats(stats) def update_listener_stat_error(self, stream_id, error): keyname = "%s_listener_stat_error" % stream_id data = {keyname: error} - self.api_client.update_stream_setting_table(data) + self.legacy_client.update_stream_setting_table(data) def run(self): # Wake up every 120 seconds and gather icecast statistics. Note that we