File size: 1,674 Bytes
cf2569a
 
 
4c031a8
cf2569a
 
4c031a8
 
 
cf2569a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4c031a8
cf2569a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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)}