Refactor Plex interaction into separate module

This commit is contained in:
Koha9 2025-06-20 21:54:55 +09:00
parent 78422a7d33
commit aa4223b413
5 changed files with 51 additions and 6 deletions

View File

@ -12,6 +12,10 @@ PlexPlaylistSync 是一个用于同步 Plex 播放列表和本地 `.m3u`/`.m3u8`
- **低功耗运行**: 适合 NAS 或服务器 24 小时运行,优化资源使用,减少能耗。 - **低功耗运行**: 适合 NAS 或服务器 24 小时运行,优化资源使用,减少能耗。
- **Docker 部署**: 可通过 Docker 轻松部署和运行。 - **Docker 部署**: 可通过 Docker 轻松部署和运行。
### Token 登录
首次登录时使用用户名和密码连接 Plex 服务器,成功后程序会将获得的 `token` 保存在配置文件中,后续通信仅使用该 `token`,不再保存明文密码。
## 安装 ## 安装
首先安装依赖: 首先安装依赖:

View File

@ -1,3 +1,7 @@
{ {
"theme": "light" "theme": "light",
"token": "",
"server_url": "",
"server_port": "",
"library": ""
} }

View File

@ -4,6 +4,7 @@ from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from app.utils.plex_client import connect_plex
app = FastAPI() app = FastAPI()
templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "templates")) templates = Jinja2Templates(directory=os.path.join(os.path.dirname(__file__), "templates"))
@ -36,11 +37,30 @@ async def login(
): ):
config = load_config() config = load_config()
theme = config.get("theme", "auto") theme = config.get("theme", "auto")
# demo假装连接成功 try:
if user == "admin": connect_plex(config, user, pw, url, port, library)
return templates.TemplateResponse("login.html", {"request": request, "message": "连接成功", "success": True, "theme": theme, "path": "/login"}) save_config(config)
else: return templates.TemplateResponse(
return templates.TemplateResponse("login.html", {"request": request, "message": "连接失败:用户名错误", "success": False, "theme": theme, "path": "/login"}) "login.html",
{
"request": request,
"message": "连接成功",
"success": True,
"theme": theme,
"path": "/login",
},
)
except Exception as e:
return templates.TemplateResponse(
"login.html",
{
"request": request,
"message": f"连接失败:{str(e)}",
"success": False,
"theme": theme,
"path": "/login",
},
)
@app.get("/playlist", response_class=HTMLResponse) @app.get("/playlist", response_class=HTMLResponse)
async def get_playlist(request: Request): async def get_playlist(request: Request):

16
app/utils/plex_client.py Normal file
View File

@ -0,0 +1,16 @@
from plexapi.myplex import MyPlexAccount
from plexapi.server import PlexServer
def connect_plex(config, username, password, url, port, library):
"""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
base_url = f"http://{url}:{port}"
server = PlexServer(base_url, token)
config.update({"server_url": url, "server_port": port, "library": library})
return server

View File

@ -2,3 +2,4 @@ fastapi
uvicorn[standard] uvicorn[standard]
jinja2 jinja2
python-multipart python-multipart
plexapi