Sublink / app /main.py
BirkhoffLee's picture
feat: 增加了静态页面用于生成订阅 URL
cf2569a unverified
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)}