hotfix(v2.0.3): 补全媒体反代修复与 GIF 压缩,恢复媒体发送#79
Conversation
* fix(media): harden predownload and config handling * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* docs: refresh help image and project docs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs: update pull request template * ci: remove unused knowledgebase script --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* fix(media): improve media detection and platform sending * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix(media): address platform review feedback * fix(media): address review feedback * refactor(media): add table rendering pipeline --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* feat(pages): add push retry and data self-healing * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix(pages): address web api review feedback * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * refactor(pages): split dashboard modules --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* fix(pages): improve multi-select filters * fix(pages): address filter review comments
* fix(kb): reconcile route knowledge manifest * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix(kb): address manifest review feedback --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
… upload (#74) * fix(db): drop legacy link_preview column and add napcat stream upload 修复 Issue #58:旧库残留的 link_preview NOT NULL 列导致 /sub 创建订阅失败。 新增 V2 迁移在启动时安全删除该列(幂等)。 同时把 OneBot 的 prefer_local_video 配置替换为 napcat_stream_mode (disabled/fallback/always):媒体已统一预下载,发送统一使用本地文件; 新增 NapCat 流式上传模块,支持发送前预上传或失败后流式重试,避免大文件 OOM。 主动推送场景通过 platform_manager 解析 bot 客户端,旧 prefer_local_video 配置在启动自愈时迁移为对应 napcat_stream_mode。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix(config): replace stale FFmpegSettings export with MediaRuntimeSettings FFmpegSettings was renamed to MediaRuntimeSettings in the napcat_stream refactor but the __init__.py re-exports in config/ and models/ still referenced the old name, causing ImportError at runtime. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* feat: bundle Noto Sans SC font and remove hardcoded system font paths Ship NotoSansSC-subset.otf (~14 MB) in assets/fonts/ so the table image renderer works out-of-the-box with CJK text on any OS. Remove the six hardcoded absolute system font paths from _iter_font_candidates() to eliminate platform-dependent font probing. - Add assets/fonts/NotoSansSC-subset.otf (Noto Sans SC Subset Variable OTF) - Add assets/fonts/OFL.txt (SIL Open Font License 1.1) - Remove hardcoded macOS/Linux system font paths from table_image_renderer.py - Update font type annotations to support FreeTypeFont | ImageFont union - Add tests for bundled font discovery and system path verification - Update docs/project/formatting.md to reflect bundled font Font search priority: env vars > assets/fonts/ > Pillow default fallback * feat: runtime font download instead of bundled CJK font Replace the 14 MB bundled NotoSansSC-subset.otf with runtime download from jsDelivr CDN. Font is downloaded at plugin startup, verified with SHA256 + size checks, and atomically written to persistent data dir. When no CJK font is available (download failed or offline), tables fall back to plain text (A | B | C) instead of using Pillow default font, preventing broken CJK rendering. - Add font_manager.py with async download, double-check lock, atomic write - Remove ImageFont.load_default() fallback from table_image_renderer - Add _warned_no_font + early return None when no font - Add get_runtime_font_dir() to font candidate priority list - Wire await ensure_table_font() in bootstrap startup flow - Add 8 font_manager tests + update table_renderer tests - Fix conftest.py namespace package conflict across feature branches - Update formatting.md docs Closes #71 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* perf(rendering): 字体改为后台预取+按需加载,不再阻塞插件启动 启用表格转图时,字体下载在 bootstrap 中由同步 await 改为后台 asyncio.create_task 预取,首次表格渲染前再按需等待就绪(未配置下载的 环境直接回退纯文本,不发起网络请求)。同时补全缺失的表格转图总开关 EntryTextFormatter.configure_table_to_image,修复其原本不存在却被 bootstrap 调用导致的启动 AttributeError。 * refactor(interfaces): 移除无效的 GreedyStr 兼容层 astrbot_compat 命令处理器参数均带默认值(args: GreedyStr = ""),框架解析时只读默认值 不读注解,greedy 合并分支恒不触发——该注解功能上是惰性的,等价于 str。 故将注解统一改为 str,文件上传监听改用框架原生 filter.event_message_type(filter.EventMessageType.ALL),删除整个 astrbot_compat 兼容层并同步重写相关回归测试。 * refactor(config): telegraph_proxy 归位 Telegram 策略并接通 将 telegraph_proxy 从顶层 media 配置移入 telegram_strategy 模板,与 enable_telegraph/telegraph_token 同源。发送时由 TelegramSender 从策略 解析并传入 TelegraphClient(留空即直连,不再继承通用 HTTP 代理),修复 此前 _get_telegraph_proxy 定义却从未被调用的死配置问题,并移除相关死链路。 启动配置自愈新增迁移:旧 media.telegraph_proxy 会自动写入首个 telegram 策略模板项。 * docs: 整理 usage 文档与 README,精简 CHANGELOG 2.0.3 新增/完善 docs/usage 下的命令、配置、AI 工具、Plugin Pages 与兼容性文档; commands.md 补 sub_stop 的 rss_stop 别名并修正 rsshelp 别名,configuration.md 随 telegraph_proxy 归位 Telegram 策略同步调整。CHANGELOG 2.0.3 由 22 条精简为 面向用户的高层要点。一并清理已内置字体后多余的 assets/fonts/OFL.txt,并在 metadata.yaml 声明最低 AstrBot 版本 >=4.24.0。 * fix(messaging): 用 TYPE_CHECKING 块消除 __all__ 懒加载告警 messaging 包通过 __getattr__ 懒加载所有导出,导致 __all__ 中 31 个名字在 类型检查器看来「未定义」(reportUnsupportedDunderAll)。新增 if TYPE_CHECKING 块真实导入这些符号:类型检查时静态可见、告警清零,运行时该块不执行,原有 懒加载行为完全保留。 * fix(subscription): 查重按会话隔离,允许多群订阅同一源 (#70) 订阅查重原先用 (user_id, feed_id) 忽略 target_session,导致同一用户在不同 群聊订阅同一 Feed 被误判为「您已经订阅了此源」。将仓储方法 get_by_user_and_feed 收紧为 get_by_user_feed_session(user_id, feed_id, target_session),/sub 与导入两处查重均带上会话;同时避免多会话行存在时 scalar_one_or_none 误抛。新增回归测试覆盖「不同会话各自成功、相同会话仍拒绝」。 * docs(changelog): 2.0.3 恢复 Added/Changed/Removed/Fixed 分节结构 将此前压缩成扁平要点的 2.0.3 条目还原为 Keep a Changelog 分节格式,并把 「媒体缓存 GC / 完整性阈值 / 平台降级策略不再作为用户配置项暴露」从 Changed 提取为独立的 Removed 段。 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs(dev): 新增仓库体积上限与函数中文 docstring 规范 - maintenance.md 新增「仓库体积」章节:插件仓库总大小严格不得超过 16 MB, 大体积资源应按需下载而非纳入仓库。 - engineering-principles.md 代码组织新增:每个函数/方法必须有确切的中文 docstring,并与实现保持一致。 * fix: 缓存字体校验结果并防御订阅查重重复行 - font_manager: ensure_table_font_runtime 引入模块级缓存 _cached_verified_font + _verify_lock,首次校验后命中缓存,避免按 <table> 反复跑 15MB 全量 SHA256 阻塞事件循环;ensure_table_font 在校验/下载成功后同步更新缓存。 - subscription_repository_impl: get_by_user_feed_session 改用 limit(1) + scalars().first(),(user_id, feed_id, target_session) 无唯一约束时若存在 重复行不再抛 MultipleResultsFound。 - 补 font_manager 缓存回归测试与缓存重置 fixture。 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* fix(media): 实现媒体反代并修复下载崩溃,新增 GIF 大小限制压缩 反代(修复严重回归): - #74 给 base_sender 加了反代管线,把 image_relay_base_url/media_relay_base_url 传给 MediaDownloader.get_or_download(_prepared),但下载器从未接收这两个参数, 导致每次媒体下载 TypeError 被吞、download_failed=True,所有媒体静默发不出去。 - 在 get_or_download / get_or_download_prepared 加这两个参数并真正接通:新增 _build_relay_url(支持 https://wsrv.nl/ 与 https://wsrv.nl/?url= 两种形式)和 _select_relay_base(图片优先图片反代、非图片走通用反代),在抓取处"先反代再 回源"。缓存 key 与 original_url 始终保持原始 URL,m3u8 不走反代,两个反代为空 时行为与之前一致。 ffmpeg: - 新增 FFmpegTool.transcode_to_gif_under_limit,逐步降分辨率/帧率把视频转为不超过 指定字节数的 GIF;media_downloader 在生成 GIF 变体时调用。 测试: - 新增反代回归测试与 GIF 压缩测试;修正 test_base_sender_ffmpeg 中因 #74 起就过时 的预期 call dict(补 relay 键)。 * refactor(media): 按评审意见调整 relay 类型标注与 GIF 体积校验 - relay 辅助函数与下载器参数(_build_relay_url / _select_relay_base / image_relay_base_url / media_relay_base_url)类型标注改为 str | None, 如实反映内部 `or ""` 容忍 None 的用法。 - transcode_to_gif_under_limit 每次尝试只读取一次 output_path.stat().st_size (缓存快速路径与转码后校验各缓存一次),减少重复 syscall。
- 帮助图副标题改为 "Everything is RSSable",并重新生成 light/dark 帮助图。 - README 顶部加 Last Commit 徽章,新增「命令一览」段贴帮助图。 - docs/usage/commands.md 补全 RSSHub Routes 知识库命令的中文别名。 - CHANGELOG 2.0.3 补记媒体反代(image/media relay,先反代再回源、缓存键保持原始 URL)与无声视频转 GIF 体积上限压缩,刷新发版内容。
|
Important Review skippedToo many files! This PR contains 177 files, which is 27 over the limit of 150. To get a review, narrow the scope: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (177)
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
紧急热修:已发布的 v2.0.3(master)缺少媒体反代修复,导致所有媒体(图片/视频/音频)静默发不出去。本 PR 把 dev 上已合并的修复补到 master,刷新 v2.0.3 发布内容。趁插件市场远程缓存尚未更新,尽快合入。
get_or_download(_prepared)报unexpected keyword argument 'image_relay_base_url':#74 给 sender 加了反代管线却没给下载器加对应参数,每次媒体下载抛TypeError被吞、download_failed=True。该修复(#77)在 v2.0.3 发版 squash 之后才并入 dev,故 master 上的 v2.0.3 未包含。Modifications / 改动点
src/infrastructure/media/media_downloader.py:给get_or_download/get_or_download_prepared接通image_relay_base_url/media_relay_base_url;新增_build_relay_url、_select_relay_base,下载时「先反代再回源」,缓存键与失败展示链接保持原始 URL(修复严重回归)。src/infrastructure/utils/ffmpeg_helper.py:新增transcode_to_gif_under_limit,将无声视频转 GIF 压到平台大小限制内。test_base_sender_ffmpeg预期。Everything is RSSable并重新生成、README 命令一览、KB 命令中文别名、CHANGELOG 2.0.3 补记反代与 GIF 压缩。Screenshots or Test Results / 运行截图或测试结果
各项改动已在 #77、#78 合入 dev 前分别验证通过。
Checklist / 检查清单