From c3d1662465b3071f6c7a7795b08a58c478741768 Mon Sep 17 00:00:00 2001 From: Koha9 Date: Sat, 19 Jul 2025 18:00:48 +0900 Subject: [PATCH] logger added. plex_client method naming fix. --- app/main.py | 5 +++-- app/utils/config.py | 10 ++++++++-- app/utils/logger.py | 33 +++++++++++++++++++++++++++++++++ app/utils/plex_client.py | 8 ++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 app/utils/logger.py diff --git a/app/main.py b/app/main.py index ee3a9ac..df1e6e8 100644 --- a/app/main.py +++ b/app/main.py @@ -5,6 +5,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles from app.utils.plex_client import plex_client +from app.utils.logger import logger app = FastAPI() templates = Jinja2Templates( @@ -79,7 +80,7 @@ async def login( ) # 成功连接后保存配置到配置文件 if plex_client.connected: - server_config.set_config( + server_config.set_and_save_config( token=token_success, scheme=scheme, url=url, port=port ) return templates.TemplateResponse( @@ -139,5 +140,5 @@ async def set_playlist( @app.post("/set-theme") async def set_theme(theme: str = Form(...)): - server_config.set_config(theme=theme) + server_config.set_and_save_config(theme=theme) return RedirectResponse("/login", status_code=303) diff --git a/app/utils/config.py b/app/utils/config.py index 72046ab..30fe91d 100644 --- a/app/utils/config.py +++ b/app/utils/config.py @@ -1,5 +1,6 @@ import json import os +from app.utils.logger import logger CONFIG_PATH = os.path.abspath( os.path.join(os.path.dirname(__file__), "..", "config.json") @@ -20,20 +21,23 @@ class ServerConfig: try: with open(CONFIG_PATH, "r", encoding="utf-8") as f: config = json.load(f) - + logger.debug(f"Loaded server config: {config}") except FileNotFoundError: # 如果配置文件不存在,使用默认值 self.save() + logger.debug("Config file not found, using default values.") return except json.JSONDecodeError: # 如果配置文件格式错误,使用默认值 self.save() + logger.debug("Config file is invalid, using default values.") return self.theme = config.get("theme", "auto") self.token = config.get("token", "") self.url = config.get("server_url", "") self.scheme = config.get("server_scheme", "https") self.port = config.get("server_port", "32400") + logger.info(f"Server config loaded: {self.__dict__}") def save(self): config = { @@ -45,6 +49,7 @@ class ServerConfig: } with open(CONFIG_PATH, "w", encoding="utf-8") as f: json.dump(config, f, indent=4, ensure_ascii=False) + logger.info(f"Server config saved: {config}") def set_url(self, url: str) -> None: self.url = url @@ -61,10 +66,11 @@ class ServerConfig: def set_theme(self, theme: str) -> None: # check theme is valid if theme not in ["auto", "dark", "light"]: + logger.error(f"Invalid theme: {theme}") raise ValueError("Invalid theme. Must be 'auto', 'dark', or 'light'.") self.theme = theme - def set_config( + def set_and_save_config( self, theme: str = None, token: str = None, diff --git a/app/utils/logger.py b/app/utils/logger.py new file mode 100644 index 0000000..a4a9ccb --- /dev/null +++ b/app/utils/logger.py @@ -0,0 +1,33 @@ +import logging +import os + +LOG_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "logs", "app.log")) + +LOG_LEVEL = logging.DEBUG + +def logger_initialize() -> logging.Logger: + """Initialize the logger for the application. Return a logger that logs to console and a app.log.""" + logger = logging.getLogger("PlexPlaylistSync") + if logger.hasHandlers(): + return logger + + # check log path exists, if not create it + os.makedirs(os.path.dirname(LOG_PATH), exist_ok=True) + + logger.setLevel(LOG_LEVEL) + # 2025-07-19 17:23:05,116 [levelname]: message + formatter = logging.Formatter("%(asctime)s [%(levelname)s]: %(message)s") + file_handler = logging.FileHandler(LOG_PATH, encoding="utf-8") + file_handler.setFormatter(formatter) + + # add file handler + logger.addHandler(file_handler) + # console handler + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + logger.addHandler(console_handler) + + return logger + +logger = logger_initialize() \ No newline at end of file diff --git a/app/utils/plex_client.py b/app/utils/plex_client.py index 3fbc40f..45eef21 100644 --- a/app/utils/plex_client.py +++ b/app/utils/plex_client.py @@ -2,6 +2,7 @@ from plexapi.myplex import MyPlexAccount from plexapi.server import PlexServer from urllib.parse import urlparse from app.utils.common import str_is_empty +from app.utils.logger import logger def build_plex_url(scheme, url, port="32400"): @@ -52,6 +53,7 @@ class PlexClient: # Update the base URL and connection status self.base_url = build_plex_url(scheme, url, port) self.connected = True + logger.info(f"Connected to Plex server at {self.base_url} with token: {self.token}") return self.server, self.token except Exception as e: self.connected = False @@ -67,6 +69,7 @@ class PlexClient: self.token = account.authenticationToken self.server = PlexServer(self.base_url, self.token) + logger.debug(f"Connected to Plex server with username: {username}, token: {self.token}") return self.server, self.token def _connect_with_token(self, token: str, scheme: str, url: str, port: str = "32400"): @@ -75,23 +78,28 @@ class PlexClient: self.base_url = build_plex_url(scheme, url, port) self.server = PlexServer(self.base_url, token) + logger.debug(f"Connected to Plex server with token: {token}") return self.server, token def get_server(self) -> PlexServer | None: """Return the connected Plex server instance.""" if not self.connected: + logger.error("Plex client is not connected.") raise RuntimeError("Plex client is not connected.") return self.server def get_all_playlist(self) -> list | None: """Return all playlists from the Plex server.""" if not self.connected or not self.server: + logger.error("Plex server is not connected.") raise ValueError("Plex server is not connected.") try: playlists = self.server.playlists() + logger.info(f"Fetched {len(playlists)} playlists from the server.") return playlists except Exception as e: + logger.warning(f"Failed to fetch playlists: {str(e)}") raise RuntimeError(f"Failed to fetch playlists: {str(e)}") plex_client = PlexClient() \ No newline at end of file