Add playlist overview homepage
This commit is contained in:
+65
-7
@@ -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,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user