diff --git a/astrbot/core/message/components.py b/astrbot/core/message/components.py index 8218b088b..fb6af3c40 100644 --- a/astrbot/core/message/components.py +++ b/astrbot/core/message/components.py @@ -238,9 +238,6 @@ class Video(BaseMessageComponent): path: T.Optional[str] = "" def __init__(self, file: str, **_): - # for k in _.keys(): - # if k == "c" and _[k] not in [2, 3]: - # logger.warn(f"Protocol: {k}={_[k]} doesn't match values") super().__init__(file=file, **_) @staticmethod @@ -298,6 +295,25 @@ class Video(BaseMessageComponent): return f"{callback_host}/api/file/{token}" + async def to_dict(self): + """需要和 toDict 区分开,toDict 是同步方法""" + url_or_path = self.file + if url_or_path.startswith("http"): + payload_file = url_or_path + elif callback_host := astrbot_config.get("callback_api_base"): + callback_host = str(callback_host).removesuffix("/") + token = await file_token_service.register_file(url_or_path) + payload_file = f"{callback_host}/api/file/{token}" + logger.debug(f"Generated video file callback link: {payload_file}") + else: + payload_file = url_or_path + return { + "type": "video", + "data": { + "file": payload_file, + }, + } + class At(BaseMessageComponent): type: ComponentType = "At" @@ -630,9 +646,7 @@ class Nodes(BaseMessageComponent): async def to_dict(self): """将 Nodes 转换为字典格式,适用于 OneBot JSON 格式""" - ret = { - "messages": [] - } + ret = {"messages": []} for node in self.nodes: d = await node.to_dict() ret["messages"].append(d) diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py index af749a554..b5539b7eb 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py @@ -9,6 +9,7 @@ from astrbot.api.message_components import ( Nodes, Plain, Record, + Video, File, BaseMessageComponent, ) @@ -38,6 +39,9 @@ class AiocqhttpMessageEvent(AstrMessageEvent): # For File segments, we need to handle the file differently d = await segment.to_dict() return d + elif isinstance(segment, Video): + d = await segment.to_dict() + return d else: # For other segments, we simply convert them to a dict by calling toDict return segment.toDict()