64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any, Literal
|
|
from urllib.parse import urlparse
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
|
|
|
|
SUPPORTED_MODES = {"standard", "artwork", "photo", "illustration"}
|
|
SUPPORTED_FORMATS = {"webp", "png", "jpg"}
|
|
SUPPORTED_SCALES = {2, 4}
|
|
|
|
|
|
class UpscaleRequest(BaseModel):
|
|
job_id: int = Field(..., gt=0)
|
|
source_url: str
|
|
scale: Literal[2, 4]
|
|
mode: Literal["standard", "artwork", "photo", "illustration"]
|
|
output_format: Literal["webp", "png", "jpg"] = "webp"
|
|
|
|
@field_validator("source_url")
|
|
@classmethod
|
|
def validate_source_url(cls, value: str) -> str:
|
|
candidate = value.strip()
|
|
|
|
if candidate == "":
|
|
raise ValueError("source_url is required")
|
|
|
|
if candidate.startswith(("/", "./", "../", "file://")):
|
|
raise ValueError("source_url must be an http or https URL")
|
|
|
|
parsed = urlparse(candidate)
|
|
|
|
if parsed.scheme not in {"http", "https"} or parsed.netloc == "":
|
|
raise ValueError("source_url must be an http or https URL")
|
|
|
|
return candidate
|
|
|
|
|
|
class HealthResponse(BaseModel):
|
|
status: str
|
|
service: str
|
|
engine: str
|
|
device: str
|
|
models_loaded: bool
|
|
max_input_width: int
|
|
max_input_height: int
|
|
max_output_width: int
|
|
max_output_height: int
|
|
realesrgan: dict[str, Any] | None = None
|
|
|
|
|
|
class UpscaleResponse(BaseModel):
|
|
success: bool
|
|
job_id: int
|
|
output_url: str | None = None
|
|
output_base64: str | None = None
|
|
width: int
|
|
height: int
|
|
filesize: int
|
|
mime: str
|
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
model_config = ConfigDict(extra="forbid") |