mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
refactor: inject OCR runtime settings
This commit is contained in:
Vendored
+11
-2
@@ -1,7 +1,8 @@
|
|||||||
import base64
|
import base64
|
||||||
|
import importlib
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from app.runtime.config import settings
|
from app.application.configuration import get_runtime_settings
|
||||||
from app.adapters.network.http import RequestUtils
|
from app.adapters.network.http import RequestUtils
|
||||||
|
|
||||||
|
|
||||||
@@ -10,7 +11,15 @@ class OcrHelper:
|
|||||||
OCR 辅助类,负责获取验证码图片并调用 OCR 服务识别文本。
|
OCR 辅助类,负责获取验证码图片并调用 OCR 服务识别文本。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_ocr_b64_url = f"{settings.OCR_HOST}/captcha/base64"
|
def __init__(self, ocr_base_url: Optional[str] = None) -> None:
|
||||||
|
"""初始化 OCR 服务地址,优先使用组合根设置快照。"""
|
||||||
|
if ocr_base_url is None:
|
||||||
|
try:
|
||||||
|
ocr_base_url = get_runtime_settings().get("OCR_HOST")
|
||||||
|
except RuntimeError:
|
||||||
|
legacy_settings = importlib.import_module("app.runtime.config").settings
|
||||||
|
ocr_base_url = legacy_settings.OCR_HOST
|
||||||
|
self._ocr_b64_url = f"{str(ocr_base_url).rstrip('/')}/captcha/base64"
|
||||||
|
|
||||||
def get_captcha_text(
|
def get_captcha_text(
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ MoviePilot V3 当前不是“目录混乱、必须推倒重来”的状态。第
|
|||||||
| legacy 默认模块契约 | 0 个宿主观察方法;未知动态方法保留 fallback | 所有静态宿主方法已有显式 V2 spec;真实 fallback 命中由 `module.contract.legacy_hit` 观测 |
|
| legacy 默认模块契约 | 0 个宿主观察方法;未知动态方法保留 fallback | 所有静态宿主方法已有显式 V2 spec;真实 fallback 命中由 `module.contract.legacy_hit` 观测 |
|
||||||
| 事件枚举 | 53 | 66 个静态 producer、15 个静态 consumer |
|
| 事件枚举 | 53 | 66 个静态 producer、15 个静态 consumer |
|
||||||
| 专用 EventData model | 53 | Event Contract Registry 已为全部事件登记 typed payload/fallback 原因 |
|
| 专用 EventData model | 53 | Event Contract Registry 已为全部事件登记 typed payload/fallback 原因 |
|
||||||
| 直接读取 `settings` 的文件 | 121 | 仍按模块族迁移,动态协议和安全端口暂保留 |
|
| 直接读取 `settings` 的文件 | 120 | 仍按模块族迁移,动态协议和安全端口暂保留 |
|
||||||
| `SystemConfigOper()` | 1 个 | 仅组合根创建 `SystemConfigService` 时保留 |
|
| `SystemConfigOper()` | 1 个 | 仅组合根创建 `SystemConfigService` 时保留 |
|
||||||
| Model 上的 DB 查询装饰器 | 119 | `db_update`/`async_db_update` 为 0;查询 ABI 继续按 canonical 用例迁移 |
|
| Model 上的 DB 查询装饰器 | 119 | `db_update`/`async_db_update` 为 0;查询 ABI 继续按 canonical 用例迁移 |
|
||||||
| 路由端点 | 335 | 11 个已装饰端点超过 80 行,最大 400 行 |
|
| 路由端点 | 335 | 11 个已装饰端点超过 80 行,最大 400 行 |
|
||||||
@@ -1019,6 +1019,7 @@ MFA/Passkey 专项测试与架构门禁通过,密钥类配置仍保留在安
|
|||||||
2026-08-23 将令牌编解码的密钥与过期策略接入 `TokenRuntimeConfig` 快照;启动组合根统一装配,未装配时保留 SDK/旧插件的动态回退,公开令牌函数签名不变。配置债务由 124 个文件降至 123 个文件,并补充资源/认证令牌回归测试。
|
2026-08-23 将令牌编解码的密钥与过期策略接入 `TokenRuntimeConfig` 快照;启动组合根统一装配,未装配时保留 SDK/旧插件的动态回退,公开令牌函数签名不变。配置债务由 124 个文件降至 123 个文件,并补充资源/认证令牌回归测试。
|
||||||
2026-08-23 将 URL 资源签名改为复用 `TokenRuntimeConfig` 的资源密钥快照;未装配时保留旧模块动态回退,签名公开 API 与密钥轮换语义不变。配置债务由 123 个文件降至 122 个文件,并补充安全 URL、媒体服务器和字幕下载回归测试。
|
2026-08-23 将 URL 资源签名改为复用 `TokenRuntimeConfig` 的资源密钥快照;未装配时保留旧模块动态回退,签名公开 API 与密钥轮换语义不变。配置债务由 123 个文件降至 122 个文件,并补充安全 URL、媒体服务器和字幕下载回归测试。
|
||||||
2026-08-23 将 `AgentRuntimeManager` 的默认 Agent 目录改为通过 `RuntimeSettingsService` 读取配置快照;显式目录参数和导入早期的旧设置回退保持不变。配置债务由 122 个文件降至 121 个文件,并补充默认目录注入回归测试。
|
2026-08-23 将 `AgentRuntimeManager` 的默认 Agent 目录改为通过 `RuntimeSettingsService` 读取配置快照;显式目录参数和导入早期的旧设置回退保持不变。配置债务由 122 个文件降至 121 个文件,并补充默认目录注入回归测试。
|
||||||
|
2026-08-23 将 `OcrHelper` 的服务地址改为通过 `RuntimeSettingsService` 或显式构造参数取得;导入早期保留旧模块回退,自动补齐 `/captcha/base64` 路径。配置债务由 121 个文件降至 120 个文件,并补充 OCR 地址注入回归测试。
|
||||||
|
|
||||||
**收口记录(2026-08-22)**:`reidentify_cache`、`nettest`、`scrape`、OpenAI `chat_completions/responses`、`get_logging` 和 Web Agent SSE 均改为稳定公开入口委托私有编排实现;四个消息交互 Handler 的公开方法也保留 ABI 并委托私有状态机。复杂度基线已清零,API/Application/Chain 入口预算、异步阻塞 ratchet 均通过;复杂度及兼容专项合计 252 项测试通过。
|
**收口记录(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,先提取媒体身份规范化阶段,保留显式
|
随后将 `TransferChain.do_transfer` 的公开入口收口为稳定兼容 Facade,先提取媒体身份规范化阶段,保留显式
|
||||||
|
|||||||
@@ -9,13 +9,12 @@
|
|||||||
"root": "app"
|
"root": "app"
|
||||||
},
|
},
|
||||||
"settings_imports": {
|
"settings_imports": {
|
||||||
"count": 121,
|
"count": 120,
|
||||||
"files": [
|
"files": [
|
||||||
"app/adapters/cache/backends.py",
|
"app/adapters/cache/backends.py",
|
||||||
"app/adapters/cache/redis.py",
|
"app/adapters/cache/redis.py",
|
||||||
"app/adapters/external/cookiecloud.py",
|
"app/adapters/external/cookiecloud.py",
|
||||||
"app/adapters/external/market.py",
|
"app/adapters/external/market.py",
|
||||||
"app/adapters/external/ocr.py",
|
|
||||||
"app/adapters/external/server.py",
|
"app/adapters/external/server.py",
|
||||||
"app/adapters/network/browser.py",
|
"app/adapters/network/browser.py",
|
||||||
"app/adapters/network/doh.py",
|
"app/adapters/network/doh.py",
|
||||||
|
|||||||
+3
-3
@@ -14,7 +14,7 @@
|
|||||||
"workflow_to_db": []
|
"workflow_to_db": []
|
||||||
},
|
},
|
||||||
"edge_count": 6417,
|
"edge_count": 6417,
|
||||||
"edge_sha256": "ded73ef8389d2d3ba9328063bad2afb6bda982fa14a8a4ae6eb369ba4e3c345c",
|
"edge_sha256": "ac7cf35f059d94d722898c9e03761bd55a674a34793e518e5a3e8cbc54da00e8",
|
||||||
"edges": [
|
"edges": [
|
||||||
"app -> app.runtime",
|
"app -> app.runtime",
|
||||||
"app -> app.runtime.compat",
|
"app -> app.runtime.compat",
|
||||||
@@ -66,8 +66,8 @@
|
|||||||
"app.adapters.external.ocr -> app.adapters",
|
"app.adapters.external.ocr -> app.adapters",
|
||||||
"app.adapters.external.ocr -> app.adapters.network",
|
"app.adapters.external.ocr -> app.adapters.network",
|
||||||
"app.adapters.external.ocr -> app.adapters.network.http",
|
"app.adapters.external.ocr -> app.adapters.network.http",
|
||||||
"app.adapters.external.ocr -> app.runtime",
|
"app.adapters.external.ocr -> app.application",
|
||||||
"app.adapters.external.ocr -> app.runtime.config",
|
"app.adapters.external.ocr -> app.application.configuration",
|
||||||
"app.adapters.external.plugin.client -> app.adapters",
|
"app.adapters.external.plugin.client -> app.adapters",
|
||||||
"app.adapters.external.plugin.client -> app.adapters.external",
|
"app.adapters.external.plugin.client -> app.adapters.external",
|
||||||
"app.adapters.external.plugin.client -> app.adapters.external.market",
|
"app.adapters.external.plugin.client -> app.adapters.external.market",
|
||||||
|
|||||||
@@ -89,6 +89,13 @@ def test_ocr_helper_extracts_data_url_base64_without_downloading_image():
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_ocr_helper_accepts_injected_runtime_base_url():
|
||||||
|
"""OCR 地址支持由组合根显式注入,并统一补齐接口路径。"""
|
||||||
|
helper = OcrHelper(ocr_base_url="https://ocr.example.test/")
|
||||||
|
|
||||||
|
assert helper._ocr_b64_url == "https://ocr.example.test/captcha/base64"
|
||||||
|
|
||||||
|
|
||||||
def test_ocr_helper_normalizes_data_url_base64_padding():
|
def test_ocr_helper_normalizes_data_url_base64_padding():
|
||||||
"""data:image 地址缺少 padding 时应补齐后提交给 OCR 服务。"""
|
"""data:image 地址缺少 padding 时应补齐后提交给 OCR 服务。"""
|
||||||
image_url = "data:image/jpeg;base64,YWJjZA"
|
image_url = "data:image/jpeg;base64,YWJjZA"
|
||||||
|
|||||||
Reference in New Issue
Block a user