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