from pathlib import Path from urllib.parse import urlencode, quote from fastapi import FastAPI from fastapi.responses import HTMLResponse from pydantic import BaseModel app = FastAPI() STATIC_DIR = Path(__file__).parent / "static" class ConvertRequest(BaseModel): # 必填 target: str url: str # 可选文本 config: str | None = None filename: str | None = None include: str | None = None exclude: str | None = None group: str | None = None ver: str | None = None # bool 开关(None = 不传,由 subconverter 使用默认值) emoji: bool | None = None udp: bool | None = None tfo: bool | None = None sort: bool | None = None fdn: bool | None = None expand: bool | None = None append_type: bool | None = None list: bool | None = None new_name: bool | None = None scv: bool | None = None append_info: bool | None = None @app.get("/", response_class=HTMLResponse) def index(): return HTMLResponse(content=(STATIC_DIR / "index.html").read_text()) @app.post("/api/convert") def convert(req: ConvertRequest): # 需要 URL 编码的字段 encode_fields = {"url", "config", "include", "exclude"} params: list[tuple[str, str]] = [] for field, value in req.model_dump().items(): if value is None: continue if isinstance(value, bool): params.append((field, "true" if value else "false")) elif field in encode_fields: params.append((field, quote(str(value), safe=""))) else: params.append((field, str(value))) return {"url": "/sub?" + "&".join(f"{k}={v}" for k, v in params)}