logging configs
This commit is contained in:
parent
c9eab2d2c0
commit
5f4418bbf6
|
@ -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:
|
||||
|
|
|
@ -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)
|
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -9,6 +9,8 @@ from typing import List
|
|||
|
||||
import croaker.path
|
||||
|
||||
logger = logging.getLogger('playlist')
|
||||
|
||||
playlists = {}
|
||||
|
||||
NowPlaying = None
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
import logging
|
||||
|
||||
from bottle import abort, route
|
||||
|
||||
from croaker import streamer
|
||||
|
||||
|
||||
@route("/play/<playlist_name>")
|
||||
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)])
|
|
@ -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:
|
||||
|
|
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue
Block a user