xiangqinxiaochengxu/backend/app/utils/media.py
2026-05-18 14:24:55 +08:00

56 lines
1.6 KiB
Python

from __future__ import annotations
from pathlib import Path
from typing import Any
STATIC_ROOT = Path(__file__).resolve().parent.parent / "static"
def _local_static_file_exists(url: str) -> bool:
if not url.startswith("/static/"):
return True
relative_path = url.removeprefix("/static/")
file_path = STATIC_ROOT / Path(relative_path)
return file_path.is_file()
def sanitize_media_url(url: str | None) -> str | None:
if not url:
return None
if url.startswith("/static/") and not _local_static_file_exists(url):
return None
return url
def sanitize_media_list(urls: list[str] | None) -> list[str]:
if not isinstance(urls, list):
return []
items: list[str] = []
for item in urls:
if not isinstance(item, str):
continue
safe_url = sanitize_media_url(item)
if safe_url:
items.append(safe_url)
return items
def sanitize_user_media_payload(payload: dict[str, Any]) -> dict[str, Any]:
data = dict(payload)
avatar_url = sanitize_media_url(data.get("avatar_url"))
avatar_blur_url = sanitize_media_url(data.get("avatar_blur_url"))
profile_images = sanitize_media_list(data.get("profile_images"))
if not avatar_url and profile_images:
avatar_url = profile_images[0]
if not avatar_blur_url:
avatar_blur_url = avatar_url
if avatar_url and not profile_images:
profile_images = [avatar_url]
data["avatar_url"] = avatar_url
data["avatar_blur_url"] = avatar_blur_url
data["profile_images"] = profile_images
return data