# -*- coding: utf-8 -*- # Copyright (c) 2025 relakkes@gmail.com # # This file is part of MediaCrawler project. # Repository: https://github.com/NanmiCoder/MediaCrawler/blob/main/api/routers/settings.py # GitHub: https://github.com/NanmiCoder # Licensed under NON-COMMERCIAL LEARNING LICENSE 1.1 # # 声明:本代码仅供学习和研究目的使用。使用者应遵守以下原则: # 1. 不得用于任何商业用途。 # 2. 使用时应遵守目标平台的使用条款和robots.txt规则。 # 3. 不得进行大规模爬取或对平台造成运营干扰。 # 4. 应合理控制请求频率,避免给目标平台带来不必要的负担。 # 5. 不得用于任何非法或不当的用途。 # # 详细许可条款请参阅项目根目录下的LICENSE文件。 # 使用本代码即表示您同意遵守上述原则和LICENSE中的所有条款。 """Unified settings endpoint. Consolidates what used to be scattered across the monitor router. The older ``/api/monitor/cookie`` and ``/api/monitor/webhook`` endpoints are deliberately left in place -- they still work and removing them would be a breaking change for no gain. """ from typing import Any, Dict from fastapi import APIRouter, HTTPException, Query from ..monitor import app_settings from ..monitor.db import get_session from ..monitor.platforms import PLATFORM_XHS from ..schemas.settings import SettingsUpdatePayload router = APIRouter(prefix="/settings", tags=["settings"]) @router.get("") async def read_settings(platform: str = Query(default=PLATFORM_XHS)): """Settings for one platform, plus the system-wide ones. Platform-scoped values are returned for the requested platform; system-scoped values are the same regardless. Every spec carries its resolved ``key`` so the UI can PUT changes straight back. Sensitive values are returned as ``{present, length}`` only. """ async with get_session() as session: return await app_settings.get_all(session, platform) @router.put("") async def write_settings( payload: SettingsUpdatePayload, platform: str = Query(default=PLATFORM_XHS) ): """Partial update: only the keys present in the body are written. A key belonging to a different platform is rejected rather than written somewhere unexpected. """ values: Dict[str, Any] = payload.values() async with get_session() as session: try: changed = await app_settings.update(session, values, platform) except app_settings.SettingValidationError as exc: raise HTTPException(status_code=400, detail=str(exc)) return {"message": f"已保存 {len(changed)} 项设置", "changed": changed}