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..d6caca2 100644
--- a/app/templates/login.html
+++ b/app/templates/login.html
@@ -12,6 +12,10 @@
+
+
+
+
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