jxxghp
23ca70fa37
fix(acoustid): 测试函数独立检测本地 fpcalc 依赖而非仅校验网络
...
原先 test() 依赖 init_module() 一次性缓存的 self._fpcalc_path,初始化之后再安装或移除 fpcalc 都不会反映在测试结果中,导致 UI 测试可能错误显示为通过。
- 抽出静态方法 _resolve_fpcalc() 基于 shutil.which 定位可执行 fpcalc,init_module() 复用
- test() 每次自行重新定位 fpcalc,缺失则直接失败且不发起网络请求,并写回 self._fpcalc_path
- 新增 3 个回归用例覆盖本地依赖检测与独立于 init 缓存的行为
2026-08-17 11:07:13 +08:00
jxxghp
77b7960b7d
fix(subscribe): 修复历史 note 双重 JSON 编码导致的订阅列表 500
...
2.0 时代旧代码对 JSON 列显式 json.dumps,导致 note 字段在库里是
字符串而非数组,响应模型按 List[int] 校验失败返回 500。
- 新增 3.0.7 数据迁移,解析并回写字符串型 note 为真正的 JSON 数组
- Subscribe 响应模型增加 note 字符串兼容解析,脏数据按空值处理
2026-08-17 10:56:31 +08:00
jxxghp
eefe1ec931
fix(config): 更新配置成功时返回空字符串消息,修复保存设置 500 错误
2026-08-17 10:34:45 +08:00
jxxghp
2436bdf3dd
docs(architecture): 新增 MoviePilot v3 架构设计总览文档
2026-08-17 09:37:38 +08:00
jxxghp
134c00fc7f
fix(compat): 补齐刮削与规则拆分后的旧路径映射,保持插件导入可用
...
- app.chain.media 登记 ScrapingChain/ScrapingOption/ScrapingConfig 符号叠加,
刮削能力拆出 ScrapingChain 后旧模块路径仍可惰性解析
- app.application.filter/filter_rules 映射到收敛后的 app.application.rules
- 补充旧路径模块身份与符号解析测试
2026-08-17 09:06:27 +08:00
jxxghp
d7e610e656
feat(agent): 新增 apply_patch 多文件补丁编辑工具
...
参考 Codex apply_patch 设计,支持单次调用对多个文本文件执行新增、
更新和删除:补丁以 *** Begin Patch / *** End Patch 包裹,Update 段
用 @@ 分隔 hunk,上下文行须与当前内容精确一致;先整体校验全部文件
操作,通过后才逐个原子写盘,并以校验期 sha256 防止并发修改。
- 工具描述与系统提示词明确 apply_patch / edit_file / write_file 分工:
跨多文件或增删文件用 apply_patch,单文件单处替换用 edit_file
- 注册进工具工厂与 ALWAYS_INCLUDE 列表,加入策略 inventory 与
MCP 隐藏列表,流式回调归类为 file_write
- 同步 create-moviepilot-plugin / publish-moviepilot-plugin /
create-moviepilot-skill 技能的 allowed-tools 与版本
- 新增 tests/test_agent_apply_patch.py 覆盖解析、多文件应用、
整体拒绝、权限边界与版本冲突场景
2026-08-17 08:01:59 +08:00
jxxghp
1402626a4a
refactor(tmdb): 空结果缓存过期时间收敛为设置项 EMPTY_RESULT_CACHE_TTL
...
- ConfigModel TMDB 配置区新增 EMPTY_RESULT_CACHE_TTL(默认 30 分钟),支持环境变量覆盖
- request/async_request/discover/TmdbCache 统一改读 settings,移除模块级常量与跨模块导入
2026-08-16 21:20:32 +08:00
jxxghp
fa06a4ac03
fix(tmdb): 空结果缓存使用独立短 TTL,故障恢复后快速自愈,关闭 #6332
...
- cached 装饰器新增 empty_ttl/empty_if,空结果按独立短 TTL 写入
- TMDB request/async_request/discover 空结果快照 30 分钟过期
- TmdbCache 未识别负缓存(id=0)同步改用 30 分钟短 TTL,正缓存不变
2026-08-16 20:50:55 +08:00
jxxghp
76a9223713
fix tests
2026-08-16 19:59:27 +08:00
jxxghp
54f093a099
Merge remote-tracking branch 'origin/v3' into v3
...
# Conflicts:
# app/api/endpoints/agent.py
# app/api/endpoints/anthropic.py
# app/api/endpoints/openai.py
# app/chain/__init__.py
# app/chain/message.py
# app/chain/site.py
# app/chain/subscribe.py
# app/chain/transfer.py
# app/modules/discord/__init__.py
# app/modules/qqbot/__init__.py
# app/modules/slack/__init__.py
# app/modules/telegram/__init__.py
# app/modules/wechat/__init__.py
# app/runtime/extensions/module_manager.py
# app/runtime/extensions/service_registry.py
# tests/test_agent_interaction.py
# tests/test_slash_command_interactions.py
# tests/test_web_agent_stream.py
2026-08-16 19:44:43 +08:00
jxxghp
240a4dffe6
refactor(schemas): 统一 message/notification 命名边界,旧名收敛至兼容映射表
...
- notification 域:渠道能力(MessageChannel→NotificationChannel、ChannelCapability* 迁入 notification.py)
- message 域:消息收发(Notification→Message、NotificationType→MessageType、CommingMessage→IncomingMessage、NotificationHistoryItem→MessageHistoryItem、NotificationClear*→MessageClear*)
- Agent 工具契约:send_notification_message→send_message、notification_callback→message_callback
- 源码不保留旧名物理别名,旧导入经 app/runtime/compat/manifest.py SYMBOL_ALIASES 惰性解析
- API 路径与持久化键冻结不变,前端零改动
- 新增兼容守护测试与 docs/rules/07 命名边界规范
2026-08-16 19:32:20 +08:00
jxxghp
3e417c1ac5
refactor(chain): _mixins.py 更名 _transfer.py,统一功能域 mixin 命名
...
TransferChain 的 7 个功能域 mixin 集合文件按域更名 _transfer.py,
与 _recognition/_messaging/_interaction/_music 的单域命名约定对齐;
同步更新 transfer.py 导入、9 个测试文件 patch 目标与架构文档。
另含 chain 基类导入排序优化与未使用导入清理(copy/datetime 已随
dispatch 方法迁入 _messaging.py)。
2026-08-16 17:25:49 +08:00
jxxghp
5810f6bc2b
refactor(application): filter_rules.py 更名 rules.py 并合并 RuleHelper
...
规则域收敛为单一事实来源 app/application/rules.py:
- filter_rules.py 更名为 rules.py(内置规则集 + RuleParser)
- filter.py 仅含 66 行 RuleHelper(用户规则组配置访问),并入 rules.py
- 同步更新 5 处引用方导入、nettest stub 目标与架构文档
- 兼容映射 app.helper.rule 指向新路径,legacy 导入仍可用
2026-08-16 17:13:51 +08:00
jxxghp
6424f76e70
fix(notification): 飞书/QQ/爪爪机器人跳过命令注册,修复 AttributeError
...
通知基类默认命令注册钩子调用 client.register_commands,但飞书 lark_oapi、
QQBot、WechatClawBot 客户端均无命令注册/删除 API(飞书机器人无斜杠命令概念),
启动时 FeishuModule.register_commands 抛 AttributeError。
三个模块覆写 _commands_enabled 返回 False 跳过注册,与企业微信走菜单 API
的钩子模式一致;Telegram/Slack/Discord 客户端具备该 API,不受影响。
2026-08-16 16:56:53 +08:00
jxxghp
7e851dbfa7
refactor(chain): 处理链功能域 mixin 化,清理未使用导入并根治兼容层循环导入
...
- ChainBase 拆分为 RecognitionMixin/MessageProcessingMixin/NotificationMixin
- TransferChain 拆分为 7 个功能 mixin(_mixins.py),SubscribeChain 音乐订阅域拆出 _music.py
- 斜杠命令交互四件套收敛为 InteractionChainMixin 委托,会话管理器移至 application 层,chain 层不再 re-export
- 模块基础类收敛到 app/modules/_base(notification/mediaserver 语义重命名)
- 清理 app/chain/__init__.py 24 个未使用导入,修正 49 处测试 patch 目标到实际命名空间
- 兼容层 legacy 符号不再并入 __all__,根治 schemas 初始化反向拉起 application.transfer 的循环导入
- 修复 bangumi 集数为字符串时 set_bangumi_info 抛 TypeError
- 新增重复代码等架构门禁测试;capability 清单校验排除下划线内部目录
2026-08-16 16:30:16 +08:00
jxxghp
98276a68a8
fix(api): 修复LLM manage端点目录查询返回列表无法透过Dict响应模型校验导致设置页500
2026-08-16 08:27:21 +08:00
jxxghp
cd5b85eb6c
fix(api): 修复LLM manage端点在空target时url_for报Must not be empty导致设置页500
2026-08-16 08:11:45 +08:00
jxxghp
7d0cf76d9c
fix(storage): 修复通用管理契约下存储页报未知错误
...
- usage 动作返回的 StorageUsage pydantic 模型无法透过
Response[Dict[str, Any]] 开放映射校验导致 500,统一转为 dict
- support_transtype 返回值恢复 transtype 包装结构,与前端期望一致
- 空结果(无用量/无整理方式)恢复成功空结构语义,
不再因 bool(结果) 被前端客户端当作业务失败弹窗
- dashboard 用量聚合改为 dict 取值;新增响应校验与空结果回归测试
2026-08-16 07:50:29 +08:00
jxxghp
441ec9475e
refactor(api): LLM 提供商管理端点收敛为通用 manage 接口,端点层零特色
...
- schemas 新增 LlmProviderAction 公共动作词汇表
- LLMProviderManager 新增 provider_manage 统一入口,默认值填充、
API Key 豁免判断、密钥脱敏与错误归因改写全部下沉封闭,
不再硬编码 chatgpt/github-copilot 等产品名
- endpoint 收敛为 POST /llm/manage(ManageRequest 透传);
OAuth 回跳地址由端点按具名回调路由统一构造后注入动作参数,
/provider-auth/callback/{provider_id} 因浏览器回跳协议约束保留具名路由
- 新增 14 项 provider_manage 契约守护测试,
替换原针对端点函数的两个旧测试文件
2026-08-16 07:50:16 +08:00
jxxghp
a6dbd799d5
refactor(api): 渠道与存储管理端点通用化,端点层零目标特色
...
- schemas 新增公共 ManageRequest(target+action+params) 与 StorageAction 词汇表
- endpoint 层收敛为 POST /notification/manage、/storage/manage 两个通用接口,
不再定义任何渠道/存储特定的名称、参数与响应字段,前端上送参数原样透传
- chain 层 manage_channel/manage_storage 接受字符串标识纯透明转发,
StorageChain 移除全部特色管理方法
- FileManagerModule 新增 storage_manage 统一入口,模块返回归一化为
{success, message, data};wechatclawbot channel_manage 同步归一化,
路由标识兼容枚举名/值/对象
- dashboard 与 agentopsassistant 的用量查询改走 manage_storage(usage)
- 新增 10 项存储契约守护测试,通知侧补充 3 项链透传与字符串路由测试,
API 守护测试对 ManageRequest 开放映射按设计豁免
2026-08-16 07:18:49 +08:00
jxxghp
5b0c631f80
refactor(notification): 建立通知渠道通用管理契约 channel_manage
...
- schemas 层新增 NotificationAction 公共动作词汇表(状态/二维码/退出/连通性/缓存迁移)
- 模块实现统一 channel_manage(channel, action, **params),按渠道名路由,
非本渠道返回 None;动作语义、表单参数解释与临时参数初始化封闭在模块内
- NotificationChain 收敛为单一 manage_channel 纯透明转发,
chain 层不再出现任何渠道名与模块特色
- endpoint 路由路径保持前端兼容,内部统一走通用接口
- 新增 6 项契约守护测试,文档记录通用模式:新渠道接入无需改 chain
2026-08-16 06:35:46 +08:00
jxxghp
a66cbe6192
refactor(wechatclawbot): 渠道管理改为模块方法契约,endpoint 不再接触客户端对象
...
- 收消息方向保持 Telegram 模式:模块自建连接轮询网关,转发本地消息 API
- 管理方向(状态/二维码/退出/连通性)封装为 wechatclawbot_status 等模块契约方法,
实例解析与临时客户端回退封闭在模块内部,统一返回 {success, message} dict
- 新建 NotificationChain 薄分发链,MessageChain 移除全部 clawbot 方法
- notification endpoint 改为纯 chain 调用,不再获取任何客户端对象
2026-08-16 05:45:58 +08:00
jxxghp
6504cb36f5
fix(recognize): 修复识别测试仅传数据源时被成对身份校验误拒,名称识别与临时识别词恢复生效
...
- 8bf2f601 引入的显式身份成对校验把'仅传 media_source'也视为显式身份,识别测试恒传数据源导致直接返回未识别
- 成对约束仅在显式传 media_id 时生效;仅传数据源时保留为请求级识别源约束,按名称在指定数据源内识别
- 字符串来源经 normalize_media_source 规范,meta 自带同源身份(如 {tmdbid=})时优先按身份识别
- 新增 tests/test_recognize_source_selection.py 覆盖 source-only、同源身份采纳与成对拒绝场景
2026-08-16 05:36:40 +08:00
jxxghp
4345fcfa22
refactor(chain): chain 与 module 仅经 run_module 契约互联,实现模块内容封闭
...
- mTorrent 字幕链接解析下沉为 IndexerModule.site_subtitle_links,subtitle 模块自行跳过 API 站点
- TMDB/MusicBrainz 识别缓存管理改为模块方法(tmdb_cache_*/music_cache_*)经 run_module 分发
- WechatClawBot 客户端查找/临时客户端/缓存迁移内聚为 wechatclawbot_* 模块方法,
chain 移除 WechatClawBot 类与 ModuleManager 内省
- LISTENBRAINZ_* 常量迁至 schemas/types.py,模块与链层再导入保持兼容
- TMDbException 升为 schemas/exception.py 跨层契约,vendored 异常保持类身份一致
- 架构守护测试新增 test_chain_does_not_import_module_internals(共 18 项)
- 文档同步:chain->module 仅允许 run_module 分发,直接导入禁止
2026-08-16 05:25:28 +08:00
jxxghp
02f0dd0b9a
refactor(architecture): 修复模块依赖违规并强化架构守护
...
- 字幕编排上移 DownloadChain.download_site_subtitles,SubtitleModule 仅保留站点链接解析
- TransferChain.recommend_name 上移 TV episodes_info 获取,filemanager 模块不再导入 TmdbChain
- endpoint 穿透修复:WXBizMsgCrypt3 迁至 adapters/external/wechat_crypt.py;
music/tmdb 缓存管理、listenbrainz 常量、TMDbException、WechatClawBot 辅助统一经 chain 包装
- RuleParser 与 builtin_rules 合并为 application/filter_rules.py;
fsproxy/fsworker 迁至 adapters/system/
- chain/__init__.py 删除 qbittorrentapi/transmission_rpc 导入,消除后端协议类型泄漏
- 架构守护测试新增三项检查:模块间隔离、入口层穿透、下载器 SDK 泄漏
- 文档同步:05-architecture.md 记录 DB/Oper 聚合例外与迁移文件位置,AGENTS.md 更新所有权表
2026-08-16 04:59:17 +08:00
jxxghp
f7e39a47c6
docs(agents): 移除已废弃的 app/helper 资源回退描述
2026-08-15 23:05:01 +08:00
jxxghp
4858f4652b
fix(runtime): 修复 ConfigReloadMixin 事件处理器因 __name__ 未同步被静默跳过,配置变更不再触发模块重载 ( #6329 )
2026-08-15 21:27:59 +08:00
jxxghp
67968dd0cb
fix(trimemedia): 飞牛影视登录适配新版 v2 协议,密码改用 SHA256 摘要 ( #6328 )
2026-08-15 20:44:19 +08:00
jxxghp
78b0063d4c
fix: 清理音乐刮削结果中 album_type 等字段的尾部空格 ( #6327 )
...
MusicBrainz 和 ListenBrainz 模块从 API 响应中提取 album_type、
secondary_types 时直接使用 dict.get() 取值,未做 strip() 处理,
导致部分结果带有尾部空格(如 'Album '、'Broadcast ')。
修复:
- MusicBrainz 新增 _stripped() 工具方法,3 处 album_type 赋值统一清理
- ListenBrainz 新增 _stripped() 工具方法,_fresh_release_to_info 中清理
- Pydantic schema 层增加 field_validator 作为兜底安全网
- 新增 9 个回归测试覆盖所有场景
2026-08-15 20:35:02 +08:00
jxxghp
dd38c16400
refactor(messaging): 拆分用户交互模块到 application/messaging 层
...
- 新增 application/messaging 交互层:router.py 统一会话优先级与回调分发,
site/subscribe/skill/media/plugin 各交互状态与视图从 Chain 迁出
- MessageChain 改为通过 InteractionRouter 派发文本会话与按钮回调,
新增结构化 callback_data 通道(兼容 CALLBACK: 文本前缀)
- Transfer 失败重试/AI 接管回调归入 TransferChain
- MediaInteractionChain 拆出为 app/chain/interaction.py(旧路径保留兼容别名)
- WebAgent Endpoint 去重,统一使用 agent.py 回调协议函数
- 删除 app/chain/skills.py(交互逻辑并入 SkillInteractionHandler)
- 同步更新架构文档与测试,全量 4476 通过
2026-08-15 16:36:39 +08:00
jxxghp
5a1808592a
fix(transfer): 修复未识别音乐任务登记作业因年份类型校验失败 ( #6325 )
2026-08-15 11:14:10 +08:00
jxxghp
a8dc6e9973
fix(servarr): Seerr 新增剧集订阅缺 tmdbId 或空季列表时无法创建订阅 ( #6315 )
...
Seerr 的 Sonarr 兼容请求体只携带 tvdbId、不携带 tmdbId,且季列表由
lookup 返回的季列表构造;lookup 季列表为空时请求体季列表为空,旧逻辑
直接返回成功但不创建任何订阅,导致 Seerr 显示请求正常而 MP 未收到订阅。
- 新增剧集订阅时按 tvdbId 补全媒体身份,识别失败返回 500 而非静默成功
- 请求体季列表为空时按已识别季集兜底,识别不到季默认第 1 季
- lookup 在 TVDB 无可用季信息时按 TMDB 季集兜底返回季列表
- 新增回归测试覆盖上述场景
2026-08-15 10:56:50 +08:00
jxxghp
bb63b40213
fix(transfer): 修复音乐整理因缺少 tmdb_id 字段崩溃
...
MusicInfo 不含 tmdb_id 等 60 个影视专用字段,整理链访问
task.mediainfo.tmdb_id 直接 AttributeError,导致无分类音乐自动
整理全部失败。
源头修复:为 domain 与 schemas 两层 MusicInfo 增加 __getattr__
兜底,缺失字段返回 None,避免下游逐点安全访问;dunder 方法
除外以保持 copy/pickle 钩子探测正常。显式声明 recognize_cache_hit
字段保留 getattr(..., False) 默认值语义。
2026-08-15 10:20:04 +08:00
jxxghp
96118e73e7
refactor(string): split utilities by responsibility
2026-08-15 08:03:55 +08:00
jxxghp
a2117bafc8
fix(compat): preserve legacy plugin imports
2026-08-15 07:15:03 +08:00
jxxghp
e28de9cfe1
fix: 修复音乐搜索进度更新
2026-08-14 22:15:17 +08:00
jxxghp
794bcfdfeb
fix(ci): isolate plugin market snapshot generator
2026-08-14 21:29:15 +08:00
jxxghp
d6bf78b63a
feat: 支持音乐识别信息转简体
2026-08-14 21:02:33 +08:00
jxxghp
c580181049
fix(api): keep src/dest fileitem fields in transfer history response
...
TransferHistory schema omitted src_fileitem, dest_fileitem and files which
are emitted by to_dict, so the response_model filter stripped the file
size the frontend reads from src_fileitem.size.
2026-08-14 20:40:02 +08:00
jxxghp
b3509c60bb
fix: support site resources from legacy docker updater
2026-08-14 20:26:51 +08:00
jxxghp
369d7d6448
refactor: reorganize backend module boundaries
2026-08-14 19:53:33 +08:00
jxxghp
fe0b444ceb
fix(test): stub app.infrastructure.sites in subprocess tests for CI
...
CI 无站点二进制模块,子进程测试绕过 conftest 垫片导致
test_manifest_aliases_reuse_real_canonical_modules 与
test_main_script_does_not_shadow_stdlib_platform 失败。
在子进程中复用 ensure_sites_stub,并给垫片补 __spec__。
2026-08-14 18:18:06 +08:00
jxxghp
7b3444c366
refactor backend module architecture
2026-08-14 15:45:38 +08:00
jxxghp
666e110693
docs: design backend import compatibility layer
2026-08-14 08:39:05 +08:00
jxxghp
895635c277
fix(db): 假值系统配置落库而非删除记录,布尔开关关闭态可持久化(#6309)
...
SystemConfigOper.set/async_set 原先对假值(False/0/None/空容器)执行删除记录,
读取端以「无记录」表示未配置并回落默认值,导致「挂载盘删除空目录」等布尔开关
关闭后刷新自动弹回开启。现改为假值同样落库更新,显式删除仍走 delete 方法。
2026-08-14 06:59:17 +08:00
jxxghp
87b1caf3ff
fix(agent): grant channel owners admin access
2026-08-14 00:01:37 +08:00
jxxghp
73df2aa331
fix(agent): 工具权限拦截时补齐流式换行,渠道主ID默认管理员权限
2026-08-13 23:15:28 +08:00
jxxghp
4de4fa4391
fix: 插件文件夹响应模型兼容新版对象格式
...
GET /plugin/folders 的响应模型 PluginFoldersData 只能校验旧版
数组格式,前端实际保存的是含展示配置的对象格式,导致建文件夹/
移入插件后刷新时响应校验失败(500),文件夹恢复为空。改为同时
兼容新旧两种格式。
2026-08-13 22:06:22 +08:00
jxxghp
86b35bda9a
fix: 优先使用简体音乐关键词搜索
2026-08-13 21:53:18 +08:00
jxxghp
d611891296
fix: 放宽音乐资源标题匹配
2026-08-13 20:57:15 +08:00
jxxghp
23a90991fc
feat: 支持站点音乐分类搜索
2026-08-13 19:45:09 +08:00
jxxghp
eebd81a0e4
feat(media): support iqiyi discover source
2026-08-13 15:34:58 +08:00
jxxghp
d0e06e4b85
chore(database): align v3 migration filenames
2026-08-13 13:47:37 +08:00
jxxghp
b4863a6550
feat(media): support extensible media sources
2026-08-13 13:26:17 +08:00
jxxghp
949464d064
fix(schemas): normalize legacy media source key for recommend cache
2026-08-13 08:04:15 +08:00
jxxghp
f17b0b1bb9
fix(api): restore successful query response semantics
2026-08-13 07:20:49 +08:00
jxxghp
00607bf5b3
fix(api): restore recommendation response compatibility
2026-08-13 05:03:42 +08:00
jxxghp
89265831e3
fix(metainfo): reject generic identity tags consistently
2026-08-13 04:38:58 +08:00
jxxghp
baf8850d63
refactor(api): standardize responses and restore media config contracts
2026-08-12 23:15:13 +08:00
jxxghp
ca32922a7f
refactor(media): unify media identity and chain responsibilities
2026-08-12 18:31:09 +08:00
jxxghp
cbb969e0ff
fix(music): default Douban explore to categories
2026-08-12 13:13:54 +08:00
jxxghp
8bf2f601a6
refactor(media): unify source identity and music browsing
2026-08-12 12:56:40 +08:00
jxxghp
9359dcb63d
Merge remote-tracking branch 'origin/v3' into v3
2026-08-12 10:55:59 +08:00
jxxghp
7ae3df7570
Merge remote-tracking branch 'origin/v3' into v3
2026-08-12 10:53:15 +08:00
jxxghp
5bb6c40227
Merge remote-tracking branch 'origin/v3' into HEAD
2026-08-12 10:51:37 +08:00
jxxghp
d1028a6902
feat(music): add TheAudioDB and Douban discovery
2026-08-12 10:50:13 +08:00
jxxghp
a1dd259143
feat(media): refine primary-source recognition
2026-08-12 08:33:10 +08:00
jxxghp
97dba2a8ae
feat: unify media recognition and music lifecycle
2026-08-12 06:51:58 +08:00
jxxghp
3f1b0cdb05
feat(music): 支持多源识别与元数据刮削
2026-08-11 23:34:00 +08:00
jxxghp
d7cf853bc8
fix(search): 支持单次搜索启用多个媒体数据源,合并显示所有源结果 ( #6270 )
...
- 新增 is_media_source_enabled/is_media_source_selected,请求级 source 支持逗号分隔多数据源,缺省回退全局 SEARCH_SOURCE 配置
- 四个媒体模块的搜索/人物/合集方法统一接入多源判断
- 补充多数据源搜索相关测试
2026-08-11 21:06:52 +08:00
jxxghp
9221f6e74a
fix(agent): 工具回调消息回填原会话ID,避免群聊@机器人时按钮等交互消息发到私聊 ( #6267 )
2026-08-11 19:48:43 +08:00
jxxghp
2f3bd95819
fix tests
2026-08-11 19:37:21 +08:00
jxxghp
7597c21872
feat(music): 自动整理时媒体类型判别
2026-08-11 19:08:05 +08:00
jxxghp
166d995f81
fix(locale): 补充音乐识别缓存接口的英文与繁体翻译
2026-08-11 13:36:19 +08:00
jxxghp
97a5197e63
feat(recognize): 影视与音乐统一插件辅助识别链路
...
- 音乐并入 select_recognize_source 统一选择流程,支持插件优先/原生优先,按 MusicNameRecognize 事件与远端身份谓词区分
- 新增 MediaRecognize 链式事件,与 MusicMediaRecognize 对称,统一为 _supplement_media_recognize 补充识别
- 插件回写统一要求 source 与远端身份,采信后统一上报共享识别
- 插件优先模式下辅助识别未取得身份时保留原生兜底结果
2026-08-11 13:23:37 +08:00
jxxghp
a11001cf8b
fix(music): 艺术家-年份-专辑三明治结构拆分提取发行年份
2026-08-11 11:55:12 +08:00
jxxghp
d0edcfa7bb
feat(music): 音乐订阅刷新与识别缓存
2026-08-11 11:39:08 +08:00
jxxghp
778d185c9d
fix(music): 系列专辑弱匹配要求分卷一致避免跨卷误配
...
- 资源带卷号(Ibiza Lounge Moments, Vol. 1)时候选卷号为其他分卷
直接排除,修复 Vol.1/Vol.2 被误配到 Vol.3 条目;
候选无卷号(条目本体不含分卷标记)时仍允许弱匹配
- 补充分卷一致性测试案例
2026-08-11 11:22:57 +08:00
jxxghp
ae2b7810a6
fix(music): 拉丁艺术家-专辑无空格连字符命名拆分修复解析归因
...
- 首个连字符左侧为艺术家(Gene Clark-White Light、Sophie Zelmani 同名专辑);
两侧均需含空格才采信,左侧保护 Jay-Z 类连字符艺术家名,
右侧排除 -ProfessorP 类发布组标签误拆
- 补充拉丁连字符拆分测试案例
2026-08-11 11:09:41 +08:00
jxxghp
9ab326e056
fix(music): 原声带电影名本体检索与合辑前缀拆分修复零命中
...
- musicbrainz: 原声带描述词(Original Motion Picture Soundtrack)剔除后
用电影名本体补充检索阶梯,候选比对支持本体与主标题弱匹配;
后缀定界防止 Ghost 类词内 ost 误剥,本体过短时不作独立检索目标
- musicbrainz: 尾部年份反复剥离,修复场景命名重复携带年份
(Live At Montreux 2011 2011)阻断精确匹配
- metamusic: Various Artists-Title 全拼合辑前缀拆分,未收录别名变体
统一归一为 Various Artists
- 补充原声带/重复年份/合辑前缀测试案例
2026-08-11 11:05:36 +08:00
jxxghp
44487f4343
fix(music): 卷号后缀剥离下沉到候选比对修复系列专辑失配
...
- 检索侧已剥离的 Vol. N 卷号后缀在候选挑选侧同样剥离,
「好歌茹芸, Vol. 3」本体名与条目「好歌, 茹芸」主标题弱匹配命中
- 检索词元切分补充 ASCII 逗号/分号,避免标点成为逐字检索词元
- 补充卷号弱匹配测试案例
2026-08-11 10:36:32 +08:00
jxxghp
ae393456bd
fix(music): 缩写点号还原与包含/演出后缀弱匹配修复失配
...
- metamusic: 连续单字母空格序列还原为点号缩写(S H E -> S.H.E),
在场景点分之后执行避免点号再被压平
- metamusic: 规格段残留判定收紧,发布组短词仅在格式词无空格连字符
形态(FLAC-HHWEB)放行,修复自然语言曲名(Ashielf Alpen)被误剥
- musicbrainz: 专辑候选新增包含关系弱匹配(原声带条目带额外前缀)
与演出后缀弱匹配(S.H.E十七音乐会 -> 条目「十七」)
- 补充 metamusic 缩写还原与 musicbrainz 弱匹配测试案例
2026-08-11 10:24:45 +08:00
jxxghp
19937b210b
fix(music): 署名前缀剥离与候选首段弱匹配修复失配
...
- 曲名开头的艺术家署名前缀(许茹芸的爱情电影主题曲)是命名习惯,
检索式与候选比对统一用剥离后的主体名,署名身份由艺术家要求保证
- 条目「主体名 补充说明」结构(愛情電影主題曲 雲且留住)首段一致视为弱匹配
- 采样率支持空格写法(44 1khz),合集/精选纳入发行形态标记剔除
- 规格剔除后仅剩悬空分隔符时仍拆出艺术家(周杰伦 - 合集 2000-2022)
- 修正合集修饰词正则中的杂空格
2026-08-11 09:55:22 +08:00
jxxghp
62019d3d23
fix(music): CJK 标题适配 Lucene 分词的逐字 OR 检索
...
- MusicBrainz 索引将连续 CJK 视为单一词元,短语检索对中文标题永远零命中,
新增 _query_phrase 将 CJK 文本拆为逐字 OR 检索式(OR 组带括号避免 AND 优先级歧义),
拉丁文本保持短语检索
- 逐字 OR 召回宽,候选挑选收紧:标题未命中的候选不能仅凭艺术家署名得分
- 汉字数字与阿拉伯数字写法差异归一比对(茹此精彩十三首/茹此精彩13首)
- 补充逐字 OR 检索式、数字归一、艺术家独占候选拒绝等测试案例
2026-08-11 09:28:40 +08:00
jxxghp
779e10c6ae
fix(music): 尾部规格段剥离与书名号结构归因修复
...
- 新增 _strip_spec_segments 尾部纯规格段整段剥离,避免规格后缀把
艺术家/曲名拆分点推到连字符上(许茹芸 - 等得到 ... ALAC-HHWEB)
- 段定位限定段内禁连字符,匹配落在最尾片段;发布组标签仅在
紧跟格式词的无空格形态或段内含规格词时剥离,保护单词曲名
- APE+CUE 联合写法的加号纳入规格段判定与悬空分隔符修剪
- 含书名号的括号注释(电影《xxx》主题曲)在结构解析前提取并拼回曲名,
单层括号消歧后缀(电影版)保留
- 书名号分支支持「曲名-歌手」艺术家段反向拆分与尾部碟号/年份提取
- MusicBrainz 候选弱匹配扩展冒号副标题与首段连字符,检索式剥离尾部年份
- 补充规格段/书名号/VA/场景点分等真实种子测试案例
2026-08-11 08:57:43 +08:00
jxxghp
ef73c79078
fix(test): mock _search_albums 避免音乐识别兜底测试触发真实网络请求
2026-08-11 08:32:52 +08:00
jxxghp
f09f81df72
refactor(music): 音乐识别核心下沉 MetaMusic 并优化 MusicBrainz 检索
...
- 标题解析核心从 app/helper/music.py 迁移到 MetaMusic(apply_title),
删除 music helper,metainfo/chain 调用点切换
- 解析增强:全角归一、场景点分命名、年份区间双模式、日期前缀、
视频标记剔除、VA 合辑署名归一、尾部年份提取、CJK 连字符拆分
- MusicBrainz 性能:全局 Session keep-alive 复用(6.3s→0.35s/请求),
无艺术家线索时跳过专辑回退检索
- 候选挑选支持冒号副标题弱匹配,检索式剥离尾部年份减少无效检索
- 测试:test_metamusic 32 案例、musicbrainz 弱匹配/检索式新用例
2026-08-11 08:18:27 +08:00
jxxghp
a15b8542ea
feat(music): 识别接口支持 MusicBrainz 数据源
...
- 选择 musicbrainz 数据源时非音频标题按音乐元数据解析
- 支持 艺术家 - 曲名 格式拆分艺术家后检索 MusicBrainz
2026-08-10 23:30:57 +08:00
jxxghp
ddc45a10c0
feat(v3): 覆盖用户通知模板前先输出日志备份
2026-08-10 23:08:40 +08:00
jxxghp
52820af6d8
feat(indexer): API 站点支持音乐搜索(馒头/杜比/海胆/Rousi Pro/SunnyPT)
...
- MTorrentSpider 新增音乐分类(406 Music(音樂)),音乐搜索不再误用电影分类
- HddolbySpider 新增音乐唱片分类(408),演唱会视频(406)不计入音乐
- HaiDanSpider 新增 HQ Audio 音乐分类(408),并修复解析时从响应顶层取 category 恒为空的既有问题
- RousiSpider 支持 music 分类参数与结果标记,分类 ID 映射补充 5->music
- SunnyPTSpider 分类映射与结果解析通用支持 music 媒体类型
- 新增对应站点 spider 音乐搜索单测
2026-08-10 22:33:18 +08:00
jxxghp
60dc01694f
feat(search): 搜索流事件携带过滤前候选资源数 candidate_items
...
标题搜索流逐批过滤导致候选数丢失,媒体搜索流最终事件补充候选数,供前端在候选全部被过滤规则淘汰时给出友好提示。Closes jxxghp/MoviePilot-Frontend#646
2026-08-10 21:41:04 +08:00
jxxghp
a322c4c375
feat(media): 媒体信息补充 TVDB slug 字段,修复 TheTvDb 数字 ID 链接 404
...
TVDB 已弃用数字 ID 直达 URL,仅 slug 形式可访问。详情接口在电视剧有 TVDB ID 时通过轻量 get_series 接口获取 slug,并随 MediaInfo 合并下发。Closes jxxghp/MoviePilot-Frontend#643
2026-08-10 21:41:04 +08:00
jxxghp
4a14af706c
feat(dashboard): 媒体统计新增音乐本月新增数量
...
- monthly_media_statistics 纳入音乐整理记录,按曲目计数并按媒体 ID 去重
- Statistic 新增 music_count_month 字段,仪表板统计接口一并返回
2026-08-10 20:33:25 +08:00
jxxghp
24a5102aa8
refactor(music): 重命名 helper/music_name.py 为 helper/music.py
2026-08-10 20:16:00 +08:00
jxxghp
07ea99442e
feat(music): 增强无标签音频识别,支持文件名/目录解析与专辑级匹配
...
- 新增 MusicNameParser:剥离曲序/碟号前缀、拆分歌手与曲名、解析专辑目录名(歌手/专辑/年份/音质)和 CD1 等碟片目录
- MetaInfoPath 与 MusicChain.read_path_meta 接入路径上下文,WAV 及标签不全的 FLAC/MP3 可补齐识别线索
- MusicBrainz 新增 match_music_album:按专辑名/歌手/曲名搜索候选发行版本,用曲目数、总时长、逐曲时长和曲名重合度打分对位
- MusicChain 新增 recognize_album_directory 目录级批量识别(按目录缓存),单曲识别未命中时自动兜底
- transfer 整理链路接入专辑匹配,命中后回填曲目身份用于重命名与刮削
2026-08-10 20:11:23 +08:00
jxxghp
85a7f98a94
fix(feishu): 修复群聊@回复发私聊及无目标通知报错 ( #6262 )
...
- 回复类消息携带 original_chat_id 时优先发回原会话,避免群聊@机器人的回复错误发送到私聊窗口
- update_or_post_message 编辑失败回退发新消息时保留原消息/会话上下文
- 无显式目标且未配置默认目标时,回退向最近互动过的会话广播发送(与企业微信策略一致)
- 仍无可用目标时报出含配置指引的明确错误(FEISHU_OPEN_ID/FEISHU_CHAT_ID)
Closes #6262
2026-08-10 18:18:48 +08:00
jxxghp
5acd8ab514
fix(notify): scope album title aggregation to notifications only
2026-08-10 14:34:58 +08:00
jxxghp
1d75826549
fix(notify): use album title in music batch notifications
2026-08-10 14:04:19 +08:00
jxxghp
d72ed5ed8e
feat(v3): move notification templates into DB migration and support music notifications
2026-08-10 13:23:20 +08:00
jxxghp
75e56d8e9a
feat(music): add audio quality workflow
2026-08-10 10:23:02 +08:00