import os from app.utils.config import server_config from fastapi import FastAPI, Request, Form 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( directory=os.path.join(os.path.dirname(__file__), "templates") ) # mount static files # 这里的路径是相对于 main.py 文件所在的目录 app.mount( "/static", StaticFiles(directory=os.path.join(os.path.dirname(__file__), "static")), name="static", ) # 显示主页 @app.get("/", response_class=HTMLResponse) async def home(request: Request): server_config.load() return templates.TemplateResponse( "login.html", { "request": request, "theme": server_config.theme, "path": "/login", "scheme": server_config.scheme, "token": server_config.token, "server_url": server_config.url, "port": server_config.port, }, ) # 登录页面和处理 @app.get("/login", response_class=HTMLResponse) async def login_page(request: Request): server_config.load() return templates.TemplateResponse( "login.html", { "request": request, "theme": server_config.theme, "path": "/login", "token": server_config.token, "scheme": server_config.scheme, "server_url": server_config.url, "port": server_config.port, }, ) @app.post("/login", response_class=HTMLResponse) async def login( request: Request, user: str = Form(...), pw: str = Form(...), token: str = Form(...), scheme: str = Form("https"), url: str = Form(...), port: str = Form("32400"), ): # 尝试连接到 Plex 服务器 try: # 优先使用 token 连接,如果 token 为空则使用用户名和密码连接 _, token_success = plex_client.connect( username=user, password=pw, token=token, scheme=scheme, url=url, port=port, ) # 成功连接后保存配置到配置文件 if plex_client.connected: server_config.set_and_save_config( token=token_success, scheme=scheme, url=url, port=port ) return templates.TemplateResponse( "login.html", { "request": request, "message": "连接成功", "message_type": "success", "theme": server_config.theme, "path": "/login", "token": server_config.token, "scheme": server_config.scheme, "server_url": server_config.url, "port": server_config.port, }, ) except Exception as e: return templates.TemplateResponse( "login.html", { "request": request, "message": f"连接失败:{str(e)}", "message_type": "danger", "theme": server_config.theme, "path": "/login", "scheme": scheme, "server_url": url, "port": port, }, ) @app.get("/playlist", response_class=HTMLResponse) async def get_playlist(request: Request): return templates.TemplateResponse( "playlist.html", {"request": request, "theme": server_config.theme, "path": "/playlist"}, ) @app.post("/playlist", response_class=HTMLResponse) async def set_playlist( request: Request, address: str = Form(...), interval: str = Form(...) ): # demo:返回提交的设置 return templates.TemplateResponse( "playlist.html", { "request": request, "message": f"设置成功:地址 {address},间隔 {interval} 分钟", "message_type": "info", "theme": server_config.theme, "path": "/playlist", }, ) @app.post("/set-theme") async def set_theme(theme: str = Form(...)): server_config.set_and_save_config(theme=theme) return RedirectResponse("/login", status_code=303)