diff --git a/app/adapters/external/cookiecloud.py b/app/adapters/external/cookiecloud.py index 07061ffac..9f9f70165 100644 --- a/app/adapters/external/cookiecloud.py +++ b/app/adapters/external/cookiecloud.py @@ -1,7 +1,8 @@ import json +import importlib from typing import Any, Dict, Tuple, Optional -from app.runtime.config import settings +from app.application.configuration import get_runtime_settings from app.runtime.log import logger from app.foundation.crypto import CryptoJsUtils, HashUtils from app.adapters.network.http import RequestUtils @@ -10,6 +11,15 @@ from app.foundation import text as text_tools from app.foundation.url import UrlUtils +def _runtime_setting(key: str) -> Any: + """读取 CookieCloud 配置服务,未装配时回退旧 Settings ABI。""" + try: + return get_runtime_settings().get(key) + except RuntimeError: + legacy_settings = importlib.import_module("app.runtime.config").settings + return getattr(legacy_settings, key) + + class CookieCloudHelper: """负责 CookieCloud 配置同步、下载和本地数据解析。""" @@ -23,11 +33,11 @@ class CookieCloudHelper: """ 同步CookieCloud配置项 """ - self._server = UrlUtils.standardize_base_url(settings.COOKIECLOUD_HOST) - self._key = text_tools.strip_optional(settings.COOKIECLOUD_KEY) - self._password = text_tools.strip_optional(settings.COOKIECLOUD_PASSWORD) - self._enable_local = settings.COOKIECLOUD_ENABLE_LOCAL - self._local_path = settings.COOKIE_PATH + self._server = UrlUtils.standardize_base_url(_runtime_setting("COOKIECLOUD_HOST")) + self._key = text_tools.strip_optional(_runtime_setting("COOKIECLOUD_KEY")) + self._password = text_tools.strip_optional(_runtime_setting("COOKIECLOUD_PASSWORD")) + self._enable_local = _runtime_setting("COOKIECLOUD_ENABLE_LOCAL") + self._local_path = _runtime_setting("COOKIE_PATH") def download(self) -> Tuple[Optional[dict], str]: """ diff --git a/docs/refactor/backend-architecture-next-stage.md b/docs/refactor/backend-architecture-next-stage.md index c0157fdcf..cbc7c5f01 100644 --- a/docs/refactor/backend-architecture-next-stage.md +++ b/docs/refactor/backend-architecture-next-stage.md @@ -70,7 +70,7 @@ MoviePilot V3 当前不是“目录混乱、必须推倒重来”的状态。第 | legacy 默认模块契约 | 0 个宿主观察方法;未知动态方法保留 fallback | 所有静态宿主方法已有显式 V2 spec;真实 fallback 命中由 `module.contract.legacy_hit` 观测 | | 事件枚举 | 53 | 66 个静态 producer、15 个静态 consumer | | 专用 EventData model | 53 | Event Contract Registry 已为全部事件登记 typed payload/fallback 原因 | -| 直接读取 `settings` 的文件 | 120 | 仍按模块族迁移,动态协议和安全端口暂保留 | +| 直接读取 `settings` 的文件 | 119 | 仍按模块族迁移,动态协议和安全端口暂保留 | | `SystemConfigOper()` | 1 个 | 仅组合根创建 `SystemConfigService` 时保留 | | Model 上的 DB 查询装饰器 | 119 | `db_update`/`async_db_update` 为 0;查询 ABI 继续按 canonical 用例迁移 | | 路由端点 | 335 | 11 个已装饰端点超过 80 行,最大 400 行 | @@ -1020,6 +1020,7 @@ MFA/Passkey 专项测试与架构门禁通过,密钥类配置仍保留在安 2026-08-23 将 URL 资源签名改为复用 `TokenRuntimeConfig` 的资源密钥快照;未装配时保留旧模块动态回退,签名公开 API 与密钥轮换语义不变。配置债务由 123 个文件降至 122 个文件,并补充安全 URL、媒体服务器和字幕下载回归测试。 2026-08-23 将 `AgentRuntimeManager` 的默认 Agent 目录改为通过 `RuntimeSettingsService` 读取配置快照;显式目录参数和导入早期的旧设置回退保持不变。配置债务由 122 个文件降至 121 个文件,并补充默认目录注入回归测试。 2026-08-23 将 `OcrHelper` 的服务地址改为通过 `RuntimeSettingsService` 或显式构造参数取得;导入早期保留旧模块回退,自动补齐 `/captcha/base64` 路径。配置债务由 121 个文件降至 120 个文件,并补充 OCR 地址注入回归测试。 +2026-08-23 将 `CookieCloudHelper` 的五项运行配置改为通过 `RuntimeSettingsService` 读取;同步期间仍获取最新值,未装配时保留旧 Settings ABI。配置债务由 120 个文件降至 119 个文件,并通过 CookieCloud 路由与站点回归测试。 **收口记录(2026-08-22)**:`reidentify_cache`、`nettest`、`scrape`、OpenAI `chat_completions/responses`、`get_logging` 和 Web Agent SSE 均改为稳定公开入口委托私有编排实现;四个消息交互 Handler 的公开方法也保留 ABI 并委托私有状态机。复杂度基线已清零,API/Application/Chain 入口预算、异步阻塞 ratchet 均通过;复杂度及兼容专项合计 252 项测试通过。 随后将 `TransferChain.do_transfer` 的公开入口收口为稳定兼容 Facade,先提取媒体身份规范化阶段,保留显式 diff --git a/tests/fixtures/architecture/configuration-debt-baseline.json b/tests/fixtures/architecture/configuration-debt-baseline.json index adfea4a82..941b17634 100644 --- a/tests/fixtures/architecture/configuration-debt-baseline.json +++ b/tests/fixtures/architecture/configuration-debt-baseline.json @@ -9,11 +9,10 @@ "root": "app" }, "settings_imports": { - "count": 120, + "count": 119, "files": [ "app/adapters/cache/backends.py", "app/adapters/cache/redis.py", - "app/adapters/external/cookiecloud.py", "app/adapters/external/market.py", "app/adapters/external/server.py", "app/adapters/network/browser.py", diff --git a/tests/fixtures/architecture/dependency-baseline.json b/tests/fixtures/architecture/dependency-baseline.json index ec2b7c1b2..73a4a302c 100644 --- a/tests/fixtures/architecture/dependency-baseline.json +++ b/tests/fixtures/architecture/dependency-baseline.json @@ -13,8 +13,8 @@ "runtime_to_db": [], "workflow_to_db": [] }, - "edge_count": 6417, - "edge_sha256": "ac7cf35f059d94d722898c9e03761bd55a674a34793e518e5a3e8cbc54da00e8", + "edge_count": 6418, + "edge_sha256": "5849976e41ca96688d718358b3c1218d66d986efa0196051531be2a17aae1466", "edges": [ "app -> app.runtime", "app -> app.runtime.compat", @@ -34,6 +34,8 @@ "app.adapters.external.cookiecloud -> app.adapters", "app.adapters.external.cookiecloud -> app.adapters.network", "app.adapters.external.cookiecloud -> app.adapters.network.http", + "app.adapters.external.cookiecloud -> app.application", + "app.adapters.external.cookiecloud -> app.application.configuration", "app.adapters.external.cookiecloud -> app.domain", "app.adapters.external.cookiecloud -> app.domain.site", "app.adapters.external.cookiecloud -> app.foundation", @@ -41,7 +43,6 @@ "app.adapters.external.cookiecloud -> app.foundation.text", "app.adapters.external.cookiecloud -> app.foundation.url", "app.adapters.external.cookiecloud -> app.runtime", - "app.adapters.external.cookiecloud -> app.runtime.config", "app.adapters.external.cookiecloud -> app.runtime.log", "app.adapters.external.location -> app.adapters", "app.adapters.external.location -> app.adapters.network",