diff --git a/app/config.json b/app/config.json index b8f325e..778965c 100644 --- a/app/config.json +++ b/app/config.json @@ -2,5 +2,6 @@ "theme": "auto", "token": "", "server_url": "", - "server_port": "32400" + "server_port": "", + "server_scheme": "" } \ No newline at end of file diff --git a/app/main.py b/app/main.py index d330b87..a80f7ee 100644 --- a/app/main.py +++ b/app/main.py @@ -14,11 +14,12 @@ templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "t 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): config = load_config() theme = config.get("theme", "auto") - scheme, host, port = get_server_settings(config) + token,scheme, host, port = get_server_settings(config) return templates.TemplateResponse( "login.html", { @@ -26,22 +27,25 @@ async def home(request: Request): "theme": theme, "path": "/login", "scheme": scheme, + "token": token, "server_url": host, "port": port, }, ) +# 登录页面和处理 @app.get("/login", response_class=HTMLResponse) async def login_page(request: Request): config = load_config() theme = config.get("theme", "auto") - scheme, host, port = get_server_settings(config) + token, scheme, host, port = get_server_settings(config) return templates.TemplateResponse( "login.html", { "request": request, "theme": theme, "path": "/login", + "token": token, "scheme": scheme, "server_url": host, "port": port, @@ -53,19 +57,26 @@ 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") + port: str = Form("32400"), ): config = load_config() theme = config.get("theme", "auto") + # 尝试连接到 Plex 服务器 try: - full_url = url - if not full_url.startswith("http://") and not full_url.startswith("https://"): - full_url = f"{scheme}://{url}" - connect_plex(config, user, pw, full_url, port) + # 优先使用 token 连接,如果 token 为空则使用用户名和密码连接 + _, token_success = connect_plex(user, pw, token, scheme, url, port) + # 成功连接后保存配置到配置文件 + config.update({ + "server_url": url, + "server_scheme": scheme, + "server_port": port, + "token": token_success, + }) save_config(config) - scheme, host, port = get_server_settings(config) + token, scheme, host, port = get_server_settings(config) return templates.TemplateResponse( "login.html", { @@ -74,6 +85,7 @@ async def login( "success": True, "theme": theme, "path": "/login", + "token": token, "scheme": scheme, "server_url": host, "port": port, diff --git a/app/templates/login.html b/app/templates/login.html index 1103cab..c5bfd43 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -6,12 +6,16 @@

🔐 登录信息

- +
- + +
+
+ +
@@ -34,4 +38,31 @@ {% if message %}
{{ message }}
{% endif %} -{% endblock %} \ No newline at end of file + +{% endblock %} diff --git a/app/utils/common.py b/app/utils/common.py new file mode 100644 index 0000000..a199763 --- /dev/null +++ b/app/utils/common.py @@ -0,0 +1,6 @@ +def str_is_empty(s: str) -> bool: + """Check if a string is empty or contains only whitespace.""" + if s is None: + return True + stripped = s.replace(" ", " ") + return not bool(stripped) \ No newline at end of file diff --git a/app/utils/config.py b/app/utils/config.py index f67e190..5c635cb 100644 --- a/app/utils/config.py +++ b/app/utils/config.py @@ -17,7 +17,8 @@ def save_config(new_config): def get_server_settings(config): """Return (scheme, host, port) using defaults when not configured.""" - scheme = "https" + scheme = config.get("server_scheme", "https") + token = config.get("token", "") or "" host = "" port = config.get("server_port", "32400") or "32400" @@ -31,5 +32,5 @@ def get_server_settings(config): port = str(parsed.port) else: host = url - - return scheme, host, port + print(f"server_scheme: {scheme}, host: {host}, port: {port}") + return token, scheme, host, port diff --git a/app/utils/plex_client.py b/app/utils/plex_client.py index 6dab047..da05dd2 100644 --- a/app/utils/plex_client.py +++ b/app/utils/plex_client.py @@ -1,17 +1,15 @@ from plexapi.myplex import MyPlexAccount from plexapi.server import PlexServer from urllib.parse import urlparse +from app.utils.common import str_is_empty - -def connect_plex(config, username, password, url, port="32400"): - """Return a connected PlexServer instance and update config with token and server info.""" - token = config.get("token") - if not token: - account = MyPlexAccount(username, password) - token = account.authenticationToken - config["token"] = token - - parsed = urlparse(url) +def build_plex_url(scheme, url, port="32400"): + """Build a full Plex URL from scheme, url, and port.""" + # 如果url不以http://或https://开头,则添加scheme + full_url = url + if not full_url.startswith("http://") and not full_url.startswith("https://"): + full_url = f"{scheme}://{url}" + parsed = urlparse(full_url) if parsed.scheme in ("http", "https"): netloc = parsed.netloc or parsed.path @@ -20,6 +18,33 @@ def connect_plex(config, username, password, url, port="32400"): base_url = f"{parsed.scheme}://{netloc}" else: base_url = f"http://{url}:{port}" + return base_url + +def connect_plex(username, password, token, scheme, url, port="32400"): + """Return a connected PlexServer instance and update config with token and server info.""" + # 如果token存在且不为空,则使用token连接 + if not str_is_empty(token): + return connect_plex_with_token(token, scheme, url, port) + else: + return connect_plex_with_pw(username, password, scheme, url, port) + + +def connect_plex_with_pw(username, password, scheme, url, port="32400"): + """Return a connected PlexServer instance and update config with token and server info.""" + # url 初始化 + base_url = build_plex_url(scheme, url, port) + # account 初始化 + account = MyPlexAccount(username, password) + # token 获取 + token = account.authenticationToken + server = PlexServer(base_url, token) - config.update({"server_url": url, "server_port": port}) - return server + return server, token + +def connect_plex_with_token(token, scheme, url, port="32400"): + """Return a connected PlexServer instance using a token.""" + # URL 初始化 + base_url = build_plex_url(scheme, url, port) + + server = PlexServer(base_url, token) + return server, token \ No newline at end of file