xtc-backend / app /api /image_fix.py
a3216's picture
deploy: initial release to Hugging Face Spaces
36fae79
Raw
History Blame Contribute Delete
2.01 kB
"""图片修正测试端点:POST /v1/xtc/image/fix/test
输入:image (data URL 或 URL) + mode
输出:处理后的图片二进制(PNG)
"""
from __future__ import annotations
import base64
import io
from typing import Optional
import httpx
from fastapi import APIRouter, Depends
from fastapi.responses import Response
from pydantic import BaseModel
from ..auth import require_access_key
from ..errors import HttpError
from ..media.imagefix import VALID_MODES, fix_image_bytes, parse_data_url
from ._common import CORS_HEADERS
router = APIRouter(prefix="/v1/xtc/image/fix", tags=["image-fix"])
class FixTestBody(BaseModel):
image: str
mode: str
camera_facing: Optional[str] = None
@router.post("/test")
async def fix_test(
body: FixTestBody,
_key: str = Depends(require_access_key),
) -> Response:
if body.mode not in VALID_MODES:
raise HttpError(
f"invalid mode, must be one of {sorted(VALID_MODES)}",
status=400,
code="bad_request",
)
image_url = body.image
if image_url.startswith("data:"):
_, raw = parse_data_url(image_url)
if not raw:
raise HttpError("invalid data URL", status=400, code="bad_request")
else:
# 拉取远程图片
try:
async with httpx.AsyncClient(timeout=30.0) as c:
resp = await c.get(image_url)
resp.raise_for_status()
raw = resp.content
except httpx.HTTPError as e:
raise HttpError(f"failed to fetch image: {e}", status=502, code="bad_gateway") from e
try:
out = fix_image_bytes(raw, body.mode)
except Exception as e:
raise HttpError(f"image fix failed: {e}", status=500, code="internal_error") from e
return Response(
content=out,
media_type="image/png",
headers={
**CORS_HEADERS,
"Cache-Control": "no-store",
"x-xtc-image-fix-mode": body.mode,
},
)