Add playlist overview homepage

This commit is contained in:
Koha9
2025-11-24 17:35:42 +09:00
parent 9ff74550a2
commit 61794b8db9
5 changed files with 220 additions and 8 deletions
+65 -7
View File
@@ -1,4 +1,5 @@
import os
from typing import Tuple
from app.utils.config import server_config
from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse, RedirectResponse
@@ -6,6 +7,7 @@ from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from app.utils.plex_client import plex_client
from app.utils.logger import logger
from app.utils.local_playlist import scan_local_playlists
app = FastAPI()
templates = Jinja2Templates(
@@ -21,20 +23,76 @@ app.mount(
)
def _get_cloud_playlists() -> Tuple[list[dict], str, dict]:
"""Fetch playlists and connection state from the remote Plex server."""
server_config.load()
playlists: list[dict] = []
status = "unset"
server_info = {
"name": "未设置",
"domain": server_config.url or "未设置",
}
# no server url configured
if not server_config.url:
return playlists, status, server_info
status = "failed"
try:
plex_client.connect(
token=server_config.token,
scheme=server_config.scheme,
url=server_config.url,
port=server_config.port,
)
status = "connected" if plex_client.connected else "failed"
server_info.update(
{
"name": getattr(plex_client.server, "friendlyName", "未命名服务器"),
"domain": server_config.url,
}
)
for playlist in plex_client.server.playlists():
track_count = getattr(playlist, "itemCount", None)
if track_count is None:
try:
track_count = len(playlist.items())
except Exception:
track_count = 0
playlists.append(
{
"name": playlist.title,
"track_count": track_count,
}
)
except Exception as exc:
logger.warning(f"Failed to fetch cloud playlists: {exc}")
status = "failed"
playlists.sort(key=lambda item: item["name"].lower())
return playlists, status, server_info
# 显示主页
@app.get("/", response_class=HTMLResponse)
async def home(request: Request):
async def home(request: Request, local_path: str = "playlist"):
server_config.load()
local_playlists = scan_local_playlists(local_path)
cloud_playlists, connection_status, server_info = _get_cloud_playlists()
return templates.TemplateResponse(
"login.html",
"home.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,
"path": "/",
"local_playlists": local_playlists,
"local_path": local_path,
"cloud_playlists": cloud_playlists,
"connection_status": connection_status,
"server_info": server_info,
},
)