diff --git a/croaker/cli.py b/croaker/cli.py index b721ef3..8ca8c68 100644 --- a/croaker/cli.py +++ b/croaker/cli.py @@ -63,6 +63,8 @@ ICECAST_URL= app = typer.Typer() app_state = {} +logger = logging.getLogger('cli') + @app.callback() def main( @@ -111,8 +113,8 @@ def start( """ Start the Croaker command and control webserver. """ - logging.debug("Switching to session_start playlist...") - logging.debug("Starting server...") + logger.debug("Switching to session_start playlist...") + logger.debug("Starting server...") if daemonize: server.daemonize() else: diff --git a/croaker/client.py b/croaker/client.py deleted file mode 100644 index f980150..0000000 --- a/croaker/client.py +++ /dev/null @@ -1,43 +0,0 @@ -import logging -from dataclasses import dataclass -from functools import cached_property - -import bottle -import requests - -# needs to be imported to attach routes to the default app -from croaker import routes - -assert routes - - -@dataclass -class Client: - host: str - port: int - - @cached_property - def _session(self): - return requests.Session() - - @property - def _routes(self): - return [r.callback.__name__ for r in bottle.default_app().routes] - - def get(self, uri: str, *args, **params): - url = f"http://{self.host}:{self.port}/{uri}" - if args: - url += "/" + "/".join(args) - res = self._session.get(url, params=params) - logging.debug(f"{url = }, {res = }") - return res - - def __getattr__(self, attr): - if attr in self._routes: - - def dispatch(*args, **kwargs): - logging.debug(f"calling attr, {args = }, {kwargs = }") - return self.get(attr, *args, **kwargs) - - return dispatch - return self.__getattribute__(attr) diff --git a/croaker/controller.py b/croaker/controller.py index 3221ecd..f000039 100644 --- a/croaker/controller.py +++ b/croaker/controller.py @@ -5,6 +5,8 @@ import threading from croaker.playlist import load_playlist from croaker.streamer import AudioStreamer +logger = logging.getLogger('controller') + class Controller(threading.Thread): def __init__(self, control_queue): @@ -23,12 +25,12 @@ class Controller(threading.Thread): return self._streamer def run(self): - logging.debug("Starting AudioStreamer...") + logger.debug("Starting AudioStreamer...") self.streamer.start() self.load("session_start") while True: data = self._control_queue.get() - logging.debug(f"{data = }") + logger.debug(f"{data = }") self.process_request(data) def process_request(self, data): @@ -38,7 +40,7 @@ class Controller(threading.Thread): return handler = getattr(self, f"handle_{cmd}", None) if not handler: - logging.debug("Ignoring invalid command: {cmd} = }") + logger.debug("Ignoring invalid command: {cmd} = }") return handler(args) @@ -46,7 +48,7 @@ class Controller(threading.Thread): return self.load(args[0]) def handle_FFWD(self, args): - logging.debug("Sending SKIP signal to streamer...") + logger.debug("Sending SKIP signal to streamer...") self.skip_event.set() def handle_STOP(self): @@ -60,6 +62,6 @@ class Controller(threading.Thread): def load(self, playlist_name: str): self.playlist = load_playlist(playlist_name) - logging.debug(f"Switching to {self.playlist = }") + logger.debug(f"Switching to {self.playlist = }") for track in self.playlist.tracks: self._streamer_queue.put(str(track).encode()) diff --git a/croaker/path.py b/croaker/path.py index 16ec69f..e5883f8 100644 --- a/croaker/path.py +++ b/croaker/path.py @@ -1,9 +1,8 @@ -import logging import os from pathlib import Path _setup_hint = "You may be able to solve this error by running 'croaker setup' or specifying the --root parameter." -_reinstall_hint = "You might need to reinstall Groove On Demand to fix this error." +_reinstall_hint = "You might need to reinstall Croaker to fix this error." def root(): @@ -12,13 +11,11 @@ def root(): def cache_root(): path = Path(os.environ.get("CACHE_ROOT", root() / Path("cache"))).expanduser() - logging.debug(f"Media cache root is {path}") return path def playlist_root(): path = Path(os.environ.get("PLAYLIST_ROOT", root() / Path("playlsits"))).expanduser() - logging.debug(f"Playlist root is {path}") return path diff --git a/croaker/pidfile.py b/croaker/pidfile.py index 3dacea1..e609740 100644 --- a/croaker/pidfile.py +++ b/croaker/pidfile.py @@ -5,15 +5,17 @@ from pathlib import Path from daemon import pidfile as _pidfile +logger = logging.getLogger('daemon') + def pidfile(pidfile_path: Path, sig=signal.SIGQUIT, terminate_if_running: bool = True): pf = _pidfile.TimeoutPIDLockFile(str(pidfile_path.expanduser()), 30) pid = pf.read_pid() if pid and terminate_if_running: try: - logging.debug(f"Stopping PID {pid}") + logger.debug(f"Stopping PID {pid}") os.kill(pid, sig) except ProcessLookupError: - logging.debug(f"PID {pid} not running; breaking lock.") + logger.debug(f"PID {pid} not running; breaking lock.") pf.break_lock() return pf diff --git a/croaker/playlist.py b/croaker/playlist.py index 6db07c7..64e6c59 100644 --- a/croaker/playlist.py +++ b/croaker/playlist.py @@ -9,6 +9,8 @@ from typing import List import croaker.path +logger = logging.getLogger('playlist') + playlists = {} NowPlaying = None diff --git a/croaker/routes.py b/croaker/routes.py deleted file mode 100644 index 3f278e0..0000000 --- a/croaker/routes.py +++ /dev/null @@ -1,31 +0,0 @@ -import logging - -from bottle import abort, route - -from croaker import streamer - - -@route("/play/") -def play(playlist_name=None): - if not streamer.load(playlist_name): - return - return "OK" - - -@route("/skip") -def skip(): - if not streamer.play_next(): - return - return "OK" - - -@route("/next_in_queue") -def next_in_queue(): - pl = controller.now_playing() - logging.debug(pl) - if not pl: - abort() - track1 = pl.current - controller.play_next() - controller.now_playing().current - return "\n".join([str(track1), str(track2)]) diff --git a/croaker/server.py b/croaker/server.py index 2ebd936..d46b2db 100644 --- a/croaker/server.py +++ b/croaker/server.py @@ -10,6 +10,8 @@ from croaker import path from croaker.controller import Controller from croaker.pidfile import pidfile +logger = logging.getLogger('server') + class RequestHandler(socketserver.StreamRequestHandler): supported_commands = { @@ -23,7 +25,7 @@ class RequestHandler(socketserver.StreamRequestHandler): def handle(self): while True: self.data = self.rfile.readline().strip().decode() - logging.debug(f"{self.data = }") + logger.debug(f"{self.data = }") try: cmd = self.data[0:4].strip().upper() args = self.data[5:] @@ -72,7 +74,7 @@ class CroakerServer(socketserver.TCPServer): self._queue.put(msg) def daemonize(self) -> None: - logging.info(f"Daemonizing controller; pidfile and output in {path.root()}") + logger.info(f"Daemonizing controller; pidfile and output in {path.root()}") super().__init__((os.environ["HOST"], int(os.environ["PORT"])), RequestHandler) self._context.pidfile = self._pidfile() @@ -84,7 +86,7 @@ class CroakerServer(socketserver.TCPServer): self.controller.start() self.serve_forever() except KeyboardInterrupt: - logging.info("Shutting down.") + logger.info("Shutting down.") self.stop() def stop(self) -> None: diff --git a/croaker/streamer.py b/croaker/streamer.py index 2ed14b8..a72b578 100644 --- a/croaker/streamer.py +++ b/croaker/streamer.py @@ -7,6 +7,8 @@ from time import sleep import shout +logger = logging.getLogger('streamer') + class AudioStreamer(threading.Thread): def __init__(self, queue, skip_event, stop_event): @@ -30,12 +32,12 @@ class AudioStreamer(threading.Thread): return s def run(self): - logging.debug("Initialized") + logger.debug("Initialized") self._shout.open() while not self.stop_requested.is_set(): self._shout.get_connected() track = self.queue.get() - logging.debug(f"Received: {track = }") + logger.debug(f"Received: {track = }") if track: self.play(Path(track.decode())) continue @@ -45,7 +47,7 @@ class AudioStreamer(threading.Thread): def play(self, track: Path): with track.open("rb") as fh: self._shout.get_connected() - logging.debug(f"Streaming {track.stem = }") + logger.debug(f"Streaming {track.stem = }") self._shout.set_metadata({"song": track.stem}) input_buffer = fh.read(4096) while not self.skip_requested.is_set():