Skip to content

Commit 36cb209

Browse files
committed
✨ UniMessage.download
resolve #123
1 parent dc4daf4 commit 36cb209

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/nonebot_plugin_alconna/uniseg/message.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
from typing import TYPE_CHECKING, Any, Callable, Literal, NoReturn, Protocol, TypeVar, Union
1010
from typing_extensions import Self, SupportsIndex, deprecated
1111

12+
from nonebot import get_driver
1213
from nonebot.exception import FinishedException
1314
from nonebot.internal.adapter import Bot, Event, Message
15+
from nonebot.internal.driver import HTTPClientMixin, Request
1416
from nonebot.internal.matcher import current_bot, current_event
1517
from tarina import lang
1618
from tarina.context import ContextModel
@@ -33,6 +35,7 @@
3335
I18n,
3436
Image,
3537
Keyboard,
38+
Media,
3639
Reference,
3740
RefNode,
3841
Reply,
@@ -1178,3 +1181,29 @@ def load(cls: type[UniMessage[Segment]], data: str | list[dict[str, Any]]):
11781181
else:
11791182
_data = data
11801183
return cls(get_segment_class(seg_data["type"]).load(seg_data) for seg_data in _data)
1184+
1185+
async def download(self, stream: bool = False, **kwargs):
1186+
"""将消息中的媒体链接下载为文件数据
1187+
1188+
Args:
1189+
stream (bool, optional): 是否以流式下载. Defaults to False.
1190+
**kwargs: 传递给下载器的参数
1191+
"""
1192+
driver = get_driver()
1193+
for media in self.select(Media):
1194+
if not media.url:
1195+
continue
1196+
if not isinstance(driver, HTTPClientMixin):
1197+
raise TypeError("Current driver does not support http client")
1198+
request = Request("GET", media.url)
1199+
sess = driver.get_session(**kwargs)
1200+
raw = b""
1201+
if stream:
1202+
async for chunk in sess.stream_request(request):
1203+
raw += chunk.content # type: ignore
1204+
else:
1205+
response = await sess.request(request)
1206+
raw = response.content # type: ignore
1207+
media.url = None
1208+
media.raw = raw
1209+
return self

src/nonebot_plugin_alconna/uniseg/message.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,4 @@ class UniMessage(list[_TS]):
412412
def dump(self, media_save_dir: str | Path | bool | None = None, json: Literal[True] = True) -> str: ...
413413
@classmethod
414414
def load(cls: type[UniMessage[Segment]], data: str | list[dict[str, Any]]): ...
415+
async def download(self, stream: bool = False, **kwargs) -> Self: ...

0 commit comments

Comments
 (0)