Skip to content

Commit eb62384

Browse files
authored
feat(parser): 重构懒下载模式替代原有的延迟发送功能 (#20)
* feat(parser): 重构懒下载模式替代原有的延迟发送功能 - 移除旧的延迟发送配置选项(parser_delay_send_media、parser_delay_send_emoji_ids、parser_delay_send_lazy_download) - 新增懒下载配置选项(parser_lazy_download)和下载命令列表(parser_download_command) - 实现LazyManager类管理用户下载会话,支持超时自动清理 - 添加懒下载命令匹配器,用户可发送指定命令下载媒体资源 - 修改渲染器逻辑,分离立即发送和可转发的内容处理 - 移除基于表情点赞的延迟发送机制,改用命令驱动的懒下载模式 - 更新README文档中的配置说明 * feat(config): 添加懒下载模式超时配置项 - 新增 parser_lazy_download_timeout 配置项,默认值为30秒 - 在配置模型中添加对应的属性和文档说明 - 通过 lazy_download_timeout 属性提供访问接口 - 将 README.md 中的配置说明同步更新 * fix(matchers): 修复LazyManager资源清理逻辑 确保在所有情况下都能正确清理用户会话资源, 将LazyManager.remove调用移到finally块中以保证执行。 * refactor(renderer): 优化媒体内容处理逻辑 - 添加sourcery代码优化跳过注释 - 简化视频和音频内容的条件判断逻辑 - 将嵌套的条件语句重构为更清晰的if-else结构 - 保持原有的功能不变,但提高代码可读性 * chore(build): 更新.gitignore并移除VSCode设置中的ruff组织导入配置 移除.gitignore中大部分内容,只保留__pycache__/条目 移除VSCode设置中ruff.organizeImports选项 * feat(config): 分离音频和视频上传配置选项 - 将原来的 parser_need_upload 配置项拆分为 parser_need_upload_audio 和 parser_need_upload_video,分别控制音频和视频的上传行为 - 移除废弃的 need_upload 属性,保留 need_upload_audio 和 need_upload_video 属性 - 更新 README.md 中的相关配置说明 * refactor(matchers): 优化懒下载管理器的异步操作 - 将 LazyManager 的 add、get、remove 方法从异步改为同步方法 - 改进超时处理器中的任务取消逻辑,避免 self-cancel 异常 - 添加 current_task 参数来防止超时回调中的自我取消 - 更新相关调用处的 await 关键字使用
1 parent 65e9be7 commit eb62384

8 files changed

Lines changed: 280 additions & 627 deletions

File tree

.gitignore

Lines changed: 1 addition & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -1,158 +1 @@
1-
# Byte-compiled / optimized / DLL files
2-
__pycache__/
3-
*.py[cod]
4-
*$py.class
5-
6-
# C extensions
7-
*.so
8-
9-
# Distribution / packaging
10-
.Python
11-
build/
12-
develop-eggs/
13-
dist/
14-
downloads/
15-
eggs/
16-
.eggs/
17-
lib/
18-
lib64/
19-
parts/
20-
sdist/
21-
var/
22-
wheels/
23-
share/python-wheels/
24-
*.egg-info/
25-
.installed.cfg
26-
*.egg
27-
MANIFEST
28-
29-
# PyInstaller
30-
# Usually these files are written by a python script from a template
31-
# before PyInstaller builds the exe, so as to inject date/other infos into it.
32-
*.manifest
33-
*.spec
34-
35-
# Installer logs
36-
pip-log.txt
37-
pip-delete-this-directory.txt
38-
39-
# Unit test / coverage reports
40-
htmlcov/
41-
.tox/
42-
.nox/
43-
.coverage
44-
.coverage.*
45-
.cache
46-
nosetests.xml
47-
coverage.xml
48-
*.cover
49-
*.py,cover
50-
.hypothesis/
51-
.pytest_cache/
52-
cover/
53-
54-
# Translations
55-
*.mo
56-
*.pot
57-
58-
# Django stuff:
59-
*.log
60-
local_settings.py
61-
db.sqlite3
62-
db.sqlite3-journal
63-
64-
# Flask stuff:
65-
instance/
66-
.webassets-cache
67-
68-
# Scrapy stuff:
69-
.scrapy
70-
71-
# Sphinx documentation
72-
docs/_build/
73-
74-
# PyBuilder
75-
.pybuilder/
76-
target/
77-
78-
# Jupyter Notebook
79-
.ipynb_checkpoints
80-
81-
# IPython
82-
profile_default/
83-
ipython_config.py
84-
85-
86-
87-
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
88-
__pypackages__/
89-
90-
# Celery stuff
91-
celerybeat-schedule
92-
celerybeat.pid
93-
94-
# SageMath parsed files
95-
*.sage.py
96-
97-
# Environments
98-
.env
99-
.venv
100-
env/
101-
venv/
102-
ENV/
103-
env.bak/
104-
venv.bak/
105-
106-
# Spyder project settings
107-
.spyderproject
108-
.spyproject
109-
110-
# Rope project settings
111-
.ropeproject
112-
113-
# mkdocs documentation
114-
/site
115-
116-
# mypy
117-
.mypy_cache/
118-
.dmypy.json
119-
dmypy.json
120-
121-
# Pyre type checker
122-
.pyre/
123-
124-
# pytype static type analyzer
125-
.pytype/
126-
127-
# Cython debug symbols
128-
cython_debug/
129-
130-
# ruff
131-
.ruff_cache/
132-
133-
# LSP config files
134-
pyrightconfig.json
135-
136-
.idea/
137-
138-
139-
# localstorage use cwd
140-
cache
141-
data
142-
config
143-
144-
# macOS
145-
.DS_Store
146-
junit*.xml
147-
coverage*.xml
148-
149-
# VSCode
150-
.vscode/
151-
152-
153-
# env
154-
!.env.test
155-
.env.*
156-
render_result.md
157-
render_result_html.md
158-
render_result_combined.md
1+
__pycache__/

.vscode/settings.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
"ruff.format.preview": false,
2020
"isort.check": true,
2121
"ruff.importStrategy": "useBundled",
22-
"ruff.organizeImports": false,
2322
"[javascript]": {
2423
"editor.defaultFormatter": "esbenp.prettier-vscode"
2524
},

README.md

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ parser_bili_video_quality=80
7979
parser_xhs_ck=""
8080

8181
# [可选] 音频解析,是否需要上传群文件
82-
parser_need_upload=False
82+
parser_need_upload_audio=False
83+
84+
# [可选] 视频解析,是否需要上传群文件
85+
parser_need_upload_video=False
8386

8487
# [可选] 视频,图片,音频是否使用 base64 发送
8588
# 注意:编解码和传输 base64 会占用更多的内存,性能和带宽, 甚至可能会使 websocket 连接崩溃
@@ -103,14 +106,14 @@ parser_append_url=False
103106
# [可选] 是否需要转发媒体内容(超过 4 项时始终使用合并转发)
104107
parser_need_forward_contents=True
105108

106-
# [可选] 是否延迟发送视频/音频,需要用户发送特定表情或点赞特定表情后才发送
107-
parser_delay_send_media=False
109+
# [可选] 是否开启懒下载模式,仅在用户请求时才下载视频
110+
parser_lazy_download=False
108111

109-
# [可选] 触发延迟发送视频的表情ID列表,用于监听group_msg_emoji_like事件
110-
parser_delay_send_emoji_ids=[128077]
112+
# [可选] 懒下载模式等待命令超时时间
113+
parser_lazy_download_timeout=30
111114

112-
# [可选] 是否开启懒下载模式,仅在用户请求时才下载视频
113-
parser_delay_send_lazy_download=False
115+
# [可选] 在懒下载模式中用户请求下载视频时的命令列表
116+
parser_download_command=["下载视频", "xz"]
114117

115118
# [可选] 图片反代,用于解决可能的403和外网访问问题
116119
# (例如,https://image.baidu.com/search/down?url=)

src/nonebot_plugin_parser/config.py

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
from pathlib import Path
22

3+
import nonebot_plugin_localstore as _store
4+
from bilibili_api.video import VideoCodecs, VideoQuality
35
from nonebot import get_driver, get_plugin_config
6+
from nonebot.plugin import PluginMetadata, inherit_supported_adapters
47
from pydantic import BaseModel
5-
from bilibili_api.video import VideoCodecs, VideoQuality
68

79
from .constants import PlatformEnum
810

9-
import nonebot_plugin_localstore as _store
10-
from nonebot.plugin import PluginMetadata, inherit_supported_adapters
11-
1211

1312
class Config(BaseModel):
1413
parser_bili_ck: str | None = None
@@ -45,12 +44,12 @@ class Config(BaseModel):
4544
"""B站视频清晰度"""
4645
parser_need_forward_contents: bool = True
4746
"""是否需要合并转发内容(大于四项时始终转发)"""
48-
parser_delay_send_media: bool = False
49-
"""是否延迟发送视频/音频,需要用户发送特定表情或点赞特定表情后才发送"""
50-
parser_delay_send_emoji_ids: list[int] = [128077]
51-
"""触发延迟发送视频的表情ID列表,用于监听group_msg_emoji_like事件"""
52-
parser_delay_send_lazy_download: bool = False
47+
parser_lazy_download: bool = False
5348
"""是否开启懒下载模式,仅在用户请求时才下载视频"""
49+
parser_lazy_download_timeout: int = 30
50+
"""懒下载模式等待命令超时时间"""
51+
parser_download_command: list[str] = ["下载视频", "xz"]
52+
"""在懒下载模式中用户请求下载视频时的命令列表"""
5453
parser_pic_proxy: str | None = None
5554
"""图片反向代理地址,用于处理图片下载失败的问题"""
5655
parser_browser_path: str | None = None
@@ -111,11 +110,6 @@ def xhs_ck(self) -> str | None:
111110
"""小红书 cookies"""
112111
return self.parser_xhs_ck
113112

114-
@property
115-
def need_upload(self) -> bool:
116-
"""是否需要上传音视频文件(兼容旧配置)"""
117-
return self.parser_need_upload
118-
119113
@property
120114
def need_upload_audio(self) -> bool:
121115
"""是否需要上传音频文件"""
@@ -152,19 +146,19 @@ def blacklist_users(self) -> list[str]:
152146
return self.parser_blacklist_users
153147

154148
@property
155-
def delay_send_media(self) -> bool:
156-
"""是否延迟发送视频/音频"""
157-
return self.parser_delay_send_media
149+
def download_command(self) -> list[str]:
150+
"""在懒下载模式中用户请求下载视频时的命令列表"""
151+
return self.parser_download_command
158152

159153
@property
160-
def delay_send_emoji_ids(self) -> list[int]:
161-
"""触发延迟发送视频的表情ID列表"""
162-
return self.parser_delay_send_emoji_ids
154+
def lazy_download(self) -> bool:
155+
"""是否开启懒下载模式"""
156+
return self.parser_lazy_download
163157

164158
@property
165-
def delay_send_lazy_download(self) -> bool:
166-
"""是否开启懒下载模式"""
167-
return self.parser_delay_send_lazy_download
159+
def lazy_download_timeout(self) -> int:
160+
"""懒下载模式等待命令超时时间"""
161+
return self.parser_lazy_download_timeout
168162

169163
@property
170164
def pic_proxy(self) -> str | None:

0 commit comments

Comments
 (0)