From da436ca46d0c0ddfc8aa03e3a4892b6c9eb20ab9 Mon Sep 17 00:00:00 2001 From: yuexps <2899659758@qq.com> Date: Fri, 31 Jul 2026 11:45:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(config):=20=E4=BF=AE=E5=A4=8D=20parser=5Fbi?= =?UTF-8?q?li=5Fvideo=5Fcodes=20=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=20Pyd?= =?UTF-8?q?antic=20=E6=A0=A1=E9=AA=8C=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复背景:在配置 parser_bili_video_codes 环境变量(如 ["hev", "av01", "avc"])时,因 bilibili_api 中 VideoCodecs 枚举成员值为元组类型,导致 Pydantic 默认枚举校验报 ValidationError。 - 解决方案:在 Config 模型中增加 parser_bili_video_codes 的前置字段校验器(@field_validator(mode="before")),支持将字符串列表、JSON 数组及逗号分隔字符串自动转换并映射至对应的 VideoCodecs 枚举成员。 - 影响范围:仅影响 config.py 中 parser_bili_video_codes 配置项的反序列化与兼容解析。 --- src/nonebot_plugin_parser/config.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/nonebot_plugin_parser/config.py b/src/nonebot_plugin_parser/config.py index 439ca0d7..e172606b 100644 --- a/src/nonebot_plugin_parser/config.py +++ b/src/nonebot_plugin_parser/config.py @@ -1,6 +1,8 @@ from pathlib import Path +from typing import Any from nonebot import logger, require, get_driver, get_plugin_config +from nonebot.compat import field_validator from apilmoji import ELK_SH_CDN, EmojiStyle from pydantic import BaseModel from bilibili_api.video import VideoCodecs, VideoQuality @@ -59,6 +61,32 @@ class Config(BaseModel): parser_group_blacklist_enabled: bool = True """是否启用群组黑名单模式(默认启用,即所有群聊的解析都是开启的)""" + @field_validator("parser_bili_video_codes", mode="before") + @classmethod + def _validate_bili_video_codes(cls, v: Any) -> Any: + """兼容转换 B站视频编码配置""" + if isinstance(v, str): + import json + + try: + v = json.loads(v) + except Exception: + v = [x.strip() for x in v.split(",")] + if isinstance(v, (list, tuple)): + codecs = [] + for item in v: + if isinstance(item, VideoCodecs): + codecs.append(item) + continue + s = str(item).lower() + for c in VideoCodecs: + val = c.value + if s == c.name.lower() or (isinstance(val, tuple) and s in val) or val == s: + codecs.append(c) + break + return codecs + return v + @property def nickname(self) -> str: """机器人昵称"""