| 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 |
| |
| 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): |
| |
| 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)} |
|
|