- 按聚影最新版开发者文档接入只读
/api/dev/search/aggregate/:搜索增加fuzzy=true,改善别名、译名和轻微标题差异的召回;候选仍必须通过 MoviePilot 规则、类型、年份、季号与媒体身份确认后才能处理。 - 聚影请求固定为
source=juying,不再重复拉取插件已有的独立 PanSou 来源;自动订阅会传递合法年份及movie/tv类型,站内匹配上限使用文档允许的 20 部影片。 - 规范化顶层及嵌套响应、影片元数据、提取码、实际资源年份、网盘类型和发布时间;过滤意外 PanSou 项、重复链接、非法协议与隐藏/空链接。
- 补齐 API 缓存、
source_status、结果摘要、401/403/429/5xx 与Retry-After脱敏诊断,并接入插件现有来源健康和熔断链路;日志不输出响应正文、资源链接或凭据。 - “测试连通”由包含凭据的 GET 查询串改为插件后端 POST 请求体;AppID/API Key 输入默认隐藏,外部请求仍只通过
X-App-Id/X-App-KeyHeader 发送。默认域名为https://www.jying.top。 - 最新文档列出 13 个接口;本阶段只接入资源搜索,不调用签到、求片、资源上传或提交记录等写接口。聚影客户端与前后端安全契约共 11 项新增测试通过;Python 全量 292 项、前端 Node 12 项、Python 编译、Vite 生产构建、JSON/版本、Ruff、凭据传输/日志模式扫描和
git diff --check均通过。
- 恢复 v4.1.3 的核心复制方式:结果按钮只有一个普通
click,安全上下文中直接调用navigator.clipboard.writeText(),Promise 成功后才提示“链接已复制”。 - HTTP、Clipboard API 缺失或权限拒绝时,不尝试
execCommand、临时 textarea、DOM Range、自动聚焦、自动全选或滚动恢复;只在当前结果卡片内显示可手动选择的完整链接及明确的Ctrl+C提示。 - 链接仍从八种原始资源字段中安全提取,115 提取码按需补齐,并兼容多重转义的
&;标题和展示文本不会被当成链接。 - 浏览器诊断仅记录协议、安全上下文、Clipboard 能力、浏览器主版本和前后端版本,不记录资源链接或凭据。
- 本地验证:Python 全量测试 281 项、前端 Node 测试 12 项通过;运行时代码确认不存在
execCommand、临时 DOM、Range、选择、焦点、定时器或滚动复制逻辑;Python 编译、Vite 构建、JSON、Ruff 与git diff --check全部通过。 - 真实 Windows Chrome/Edge 粘贴验证必须在宿主安装 v4.8.33 后执行;完成前不宣称一键复制已经解决。
- 完整撤销 v4.8.31 新增的 DOM Range 二次复制、自动全选弹窗和剪贴板验证实验,恢复到 v4.8.30 的复制实现基线。
- 本次回退用于消除 Windows 网页点击“复制链接”后浏览器或电脑卡死的风险;不修改搜索、转存、订阅、任务账本或其它业务逻辑。
- 版本号继续递增,确保 MoviePilot 能识别并安装该安全回退版本。
- 回退验证:Python 全量测试 281 项、前端 Node 测试 15 项通过;Python 编译、Vite 生产构建、JSON/版本解析、改动 Python 契约 Ruff 与
git diff --check通过。
- 移除“复制链接”按钮的
pointerdown.prevent与click双事件,统一在浏览器认可的单次click用户手势内调用 Clipboard API 和兼容复制,避免手机 WebView 因按钮未聚焦或手势类型不被认可而复制失败。 - textarea 回退不再仅依赖
document.activeElement猜测滚动容器;调用方直接传入真实点击按钮,记录并恢复其 MoviePilot 宿主滚动祖先、窗口位置和焦点。 - 兼容复制节点保持在视口内且近乎透明,避免部分 iOS/WebView 拒绝选择远离视口的文本节点;同步恢复后再在下一动画帧复核滚动位置。
Page.vue与备用ManualSearch.vue统一使用同一复制实现;复制不触发打开、搜索、转存或订阅操作。- 交付验证:Python 全量测试 281 项、前端 Node 测试 15 项通过;Python 编译、Vite 生产构建、JSON 解析、改动 Python 契约 Ruff 与
git diff --check通过。未执行真实转存。
- 修复手机端 MoviePilot 内嵌页面点击“复制链接”后跳到页面底部且复制失败的问题:除窗口位置外,同时保存并恢复触发按钮所在的宿主滚动容器位置。
- 局域网 HTTP WebView 会在同一指针手势内先发起 Clipboard API,再立即走 textarea 兼容复制;避免 API 在手势结束后才异步拒绝,导致兼容复制也失效。
- 临时复制节点移至可视区外,不导航、不搜索、不转存;安全上下文仍优先等待 Clipboard API 结果。
- 交付验证:Python 全量测试 281 项、前端 Node 测试 14 项通过;Python 编译、Vite 生产构建、JSON 解析、改动 Python 契约 Ruff 与
git diff --check通过。已在真实 MoviePilot 宿主确认前后端均为 4.8.29;两条手动结果的复制均写入有效资源链接,页面地址与滚动位置未改变。未执行真实转存。
- 手动结果的链接仅从原始资源字段提取,兼容
share_url、resource_url、magnet、download_url、enclosure、page_url、url、link;115 分享缺少提取码时仅在操作时补齐,HTML 转义的查询分隔符会恢复为真实 URL。 - 移动端复制在按下手势内优先调用 Clipboard API,拒绝后使用临时 textarea 回退并恢复页面滚动位置;两种方式都失败时显示本地可选择的“手动复制链接”对话框,不会触发跳转、搜索或转存。
- 手动 115 转存把失败精确归类为分享链接、目标目录、读取分享目录、文件标识或接收资源阶段。
share_snap失败或未给出真实 fid/cid 时停止,不再伪造file_id=0;目录分享使用返回的 cid,share_receive只提交核对过的必要字段。 - 本轮仅调整手动复制和独立手动 115 转存:不改变订阅、自动转存、磁力队列、搜索、媒体识别、规则或 MoviePilot 核心。
- 交付验证:Python 全量测试 281 项、前端 Node 测试 12 项通过;Python 编译、Vite 生产构建、JSON 解析、Ruff 与
git diff --check通过。真实宿主验证仅待安装更新确认,不执行真实转存。
- 修复配置页通过目录浏览保存数字 CID 后,手动“转存到默认目录”把它错误改写成
/CID的问题。 - 纯数字默认值现在保持 CID 语义,直接提交给 115
share_receive;只有以/开头或包含目录名的值才按路径解析/按需创建目录。 - 不再尝试创建名称为数字 CID 的错误目录;自动转存、手动指定目录和磁力离线的既有 CID 行为不变。
- 交付验证:Python 全量测试 275 项、前端测试 10 项通过;Python 编译、Vite 生产构建、JSON 解析、改动行 Ruff 检查和
git diff --check通过。
- 对局域网 HTTP 与嵌入式浏览器,点击时仍会立即尝试 Clipboard API;部分 WebView 即使非安全上下文也会提供该能力,不再被前端提前跳过。
- Clipboard 被明确拒绝时才使用 textarea 回退;回退会保存并恢复页面滚动位置,避免临时输入框聚焦把手机页面带到最底部。
- “复制链接”和“打开链接”都阻止点击事件向外冒泡或触发默认行为,避免结果卡片/宿主页面处理该点击。
- 交付验证:Python 全量测试 274 项、前端复制/打开测试 10 项通过;Python 编译、Vite 生产构建、JSON 解析、改动行 Ruff 检查和
git diff --check通过。
- 手动结果统一从
share_url、magnet、download_url、enclosure、page_url、url、link中提取完整有效资源链接;115 链接仍按需要补齐提取码,避免复制展示标题或空值。 - 局域网 HTTP 页面不再先异步等待 Clipboard API 拒绝,而是直接同步使用临时 textarea 与
execCommand('copy'),避免移动浏览器因用户手势丢失而复制失败;安全上下文仍优先使用 Clipboard API。 - 每张手动结果卡片新增“打开链接”:HTTP(S) 以受保护的新标签页打开,磁力使用临时锚点触发系统关联程序;无效链接只显示提示,不触发转存或搜索。
- 交付验证:Python 全量测试 274 项、前端链接操作测试 8 项通过;Python 编译、Vite 生产构建、JSON 解析、改动行 Ruff 检查和
git diff --check通过。
- 115 手动转存目录改为可选:打开弹窗后默认使用插件设置中已经绑定的 115 转存目录,无需再次浏览或选择。
- 需要临时改存其他位置时,可点击“选择其他目录”浏览 115 目录并提交对应 cid;也可随时切回默认目录。
POST /manual/transfer的target改为可选字段;省略或留空时复用P115Transfer.default_target_path,不新增另一套目录配置。- 本次只调整独立手动 115 转存的目录选择,不改订阅核验、自动转存、磁力下载、搜索或任务账本。
- 交付验证:Python 全量测试 274 项、前端测试 5 项通过;Python 编译、Vite 生产构建、JSON 解析、改动行 Ruff 检查与
git diff --check通过。
- 115 手动搜索结果的“转存”不再复用订阅候选处理弹窗:点击后只浏览并选择 115 目标目录,再通过独立的
POST /manual/transfer提交分享链接和目录 cid。 - 独立手动转存接口不读取或更新 MoviePilot 订阅,不写入自动磁力账本,不触发订阅完成;磁力“离线到115”和订阅/自动处理仍保留原有身份确认流程。
- “复制链接”优先调用 Clipboard API;局域网 HTTP、浏览器拒绝剪贴板权限或 API 不存在时,使用临时 textarea 与
execCommand('copy')回退,并保证节点清理。 - 空值、展示文本或非法链接会给出明确提示;复制和转存均使用完整资源链接,但不会将完整链接写入日志或响应。
- 交付验证:Python 全量测试 274 项、前端 Node 测试 4 项全部通过;Python 编译、Vite 生产构建、JSON 解析与
git diff --check通过。本轮 Python 改动行通过 Ruff 检查,未扩展处理既存代码的历史规则债务。
- v4.8.11 在真实 MoviePilot 宿主中确认前后端与构建标识完全一致,但
manual-search-body内仍只有 Vue 注释节点和构建信息:ManualSearch根节点不存在、输入框数量为 0。这排除了旧资源缓存和单纯 CSS 隐藏,确认故障边界是联邦子组件未挂载。 - 搜索范围、原生输入框、搜索按钮、资源/画质/网盘筛选、结果卡片及操作入口全部直接内联到
Page.vue的同一个联邦入口,不再依赖额外的ManualSearch子块或错误边界才能出现。 - 搜索正文始终挂载;加载、空结果和请求失败只改变正文内提示。结果先补齐安全字段,浏览器会话缓存失败仅关闭缓存,运行状态与诊断刷新不会重建搜索状态。
- 364px 移动端使用单列输入和全宽按钮;生产构建已确认只生成一个 Page 搜索逻辑块,不再生成运行时必需的
ManualSearch资源块。
- 真实 MoviePilot 移动端复现确认:点击搜索后进入
searching=true分支,联邦前端首次渲染条件v-progress-circular时子组件渲染失败;旧错误边界又继续挂载故障组件,导致搜索正文只剩空注释节点。实测正文高度由约 265px 变为 40px,输入框数量由 1 变为 0。 - 加载态改用原生文本节点,搜索正文保持正高度、可见与可溢出;清理 Page 中已废弃的第二套搜索状态。子组件若再异常,父页改显示不依赖 Vuetify、会话缓存或运行状态的原生后备搜索框。
- 运行状态接口返回后端版本,详情页显示前端版本、构建标识与构建时间;前后端不一致时明确提示刷新插件资源缓存。
- “订阅处理诊断”增加二次确认的强制清理:只删除
SubscriptionTimeline显示记录,不清除磁力任务账本、不取消 115 任务、不删除文件、不修改订阅。正在运行的真实任务可在下一状态变化时重建新诊断记录。
- 手动搜索框、搜索按钮、搜索范围和资源筛选保持常驻;
sessionStorage读取、写入和删除全部可安全降级,缓存权限或配额异常不再中断搜索。API 超时、非标准响应及缺失字段会转换为安全提示和规范化结果,父页面提供局部“重新加载搜索区域”恢复入口。 - 115 任务下载完成后仍保持
pending_organize,只有 MoviePilotTransferComplete整理事件唯一匹配或订阅历史确认时才进入completed。整理事件兼容tmdb_id/tmdbid、douban_id/doubanid和季号字段差异。 - 离线账本记录脱敏的整理事件状态、历史检查状态、最后对账时间和等待原因;账本完成、失败或超时会同步更新对应订阅及季的诊断时间线,不再长期停留在“等待整理”。
- 诊断页面仅展示 BTIH 前 12 位、等待阶段和脱敏原因,不展示完整磁力、分享链接、Cookie、Token、完整任务 ID 或媒体路径。
- 修复“订阅处理诊断”的“清理状态记录”因活动记录而静默禁用、点击无反馈的问题。按钮会明确反馈无可清理记录、活动记录保护、请求失败或实际已清理数量。
- 后端仅删除本地
completed、recovered、failed、skipped诊断记录;running、waiting、waiting_organize保持保护。清理不会删除 115 文件、取消下载或修改订阅,也不影响“磁力下载任务”的独立清理功能。 - 清理接口固定返回
success、message、removed_count、remaining_count、active_count、脱敏request_id;成功后页面立即刷新列表。
- 按宿主兼容性反馈,将
Page.vue与ManualSearch.vue完整恢复为 v4.8.4 的已验证页面结构与搜索交互。 - 不回退周期搜索、来源风控、115 离线、任务账本、媒体身份确认或手动搜索 API 的安全响应结构。
- 修复手动搜索虽然已渲染、但被运行状态、订阅诊断和磁力任务列表推到详情页底部的问题。
- 手动搜索现固定在插件详情页顶部;搜索范围、关键字输入框、搜索按钮和资源筛选无需滚过任务账本即可操作。
- 手动搜索的 Vue 联邦工程位于
plugins.v2/tgsearch115/frontend,由 MoviePilot 通过frontend/dist/assets/remoteEntry.js加载;构建命令为在该目录执行npm run build。 - API 未注入、来源异常或超时不会再让手动搜索区域静默消失:页面显示安全错误、重试和“重新加载插件页面”入口。
- 手动搜索 API 的成功和错误响应统一包含
success、message、items、source_stats与脱敏request_id;不向前端透传原始异常。
- 修复新版 MoviePilot/PostgreSQL 中仅保存豆瓣 ID 的订阅:当候选已通过 MoviePilot 本地标题、年份、媒体类型核验,且候选媒体已识别到 TMDB ID 时,不再因候选缺少豆瓣交叉映射而误拒绝。
- 显式目标 TMDB ID 仍是最高优先级:目标 TMDB 与候选 TMDB 不一致必定拒绝;本地标题、年份或类型不一致也不会进入兼容分支。
- 身份识别标题会删除纯 HDR、音轨、编码等技术括号标签,避免 MoviePilot 将技术字段误识别为片名;严格规则、中文/清晰度要求和实际转存来源顺序不变。
- 将有界身份确认预算由 3 条扩展到 5 条,已通过规则的候选遇到技术标题解析失败时可继续安全确认后续候选,不会无限请求来源或放宽匹配条件。
- 修复 PanSou/TG 候选转换时
parsed_meta在初始化前被引用,导致来源已返回资源却整体异常回退的问题。 - PanSou 在 504/429 短退避后可获得一次有界完成窗口;仍受单订阅总预算约束,不会无限占用队列。
- 已通过 251 项 Python 测试、Python 编译、Vite 生产构建、JSON 解析与
git diff --check。
- 移除手动搜索结果区重复的“结果来源(全部/TG 等)”按钮组及会话状态;来源仅在搜索框上方通过“搜索范围”选择。资源类型、网盘、画质与字幕筛选不受影响。
- 已通过 250 项 Python 测试、Python 编译、Vite 生产构建、JSON 解析与
git diff --check。
- 修复旧用户配置只在内存补齐、接口读取仍缺少新字段的问题。插件启动或重载会合并默认字段再保存,来源超时和单订阅搜索预算等配置在运行时、API 与前端保持一致。
- 已通过 250 项 Python 测试、Python 编译、Vite 生产构建、JSON 解析与
git diff --check。
- 自动订阅搜索新增单来源超时(默认 20 秒)和单订阅总搜索预算(默认 60 秒)。超时来源会记录为超时、进入健康/熔断统计并释放单一处理队列;TG 仍会保留已完成频道的部分结果。
- 同一来源的超时请求尚未结束时,后续订阅不会叠加并发请求,避免来源风控放大;下一周期可安全重试。
- 新增事件、周期扫描和详情页正式处理在入队成功时即写入脱敏时间线,页面可区分“排队中”和“搜索来源中”。手动搜索仍优先于等待中的自动任务,但不会中断正在运行的网络请求。
- 已通过 249 项 Python 测试、Python 编译、Vite 生产构建、JSON 解析与
git diff --check。
- 自动订阅流程持久化脱敏时间线,展示订阅读取、来源召回、规则与身份确认、115 提交、等待整理和安全恢复等阶段;插件重启会自动将中断运行安全恢复,不会永久显示处理中。
- 详情页新增默认折叠的“订阅处理诊断”,并显示 TG、观影、PanSou、聚影的来源健康分。健康分只用于诊断和后续预算优化,绝不绕过来源顺序、规则或身份确认。
- 补齐“搜索范围在搜索框上方、结果来源即时筛选”的前端契约测试;v4.7.52 首次发布发现测试未同步,已在本版本修复并重新完成全量验证。
- “搜索范围”移动至手动搜索框上方,明确标注“选择后点击搜索生效”;已有结果的即时筛选继续使用下方“结果来源”,避免二者混淆。
- 新增统一资源分类器,TG、观影、PanSou 和聚影手动结果统一返回资源类型、网盘类型、画质、中文字幕、原盘、季号和年份;前端优先使用这些字段,旧会话缓存仍会用安全的文本兜底解析。
- 修复普通 BluRay/BDRip/WEB-DL 被误判为原盘,4K/2160P/UHD、1080P/1080i/1920×1080、720P/720i/1280×720 统一分类;“国语/中文配音”不再误判为中文字幕。
- 网盘类型按实际 URL 域名优先判定,切换磁力/网盘会重置细分筛选;结果页显示后端、来源、资源类型和细分筛选四级数量。
- 分享与磁力链接不再写入插件日志。筛选仅影响展示,正式转存仍必须经 MoviePilot 规则和媒体身份复核。
- 默认磁力模式固定为
direct_115;完整磁力只调用插件内置 115,不调用或回退 CMS。115 分享继续使用插件内置 115 转存。 - 配置、状态、操作入口和前端构建产物不再展示 CMS 地址、Token、模式或任务名称;插件主页使用 MoviePilot 官方插件库。
- 资源分类日志与成功通知覆盖来源、类型、年份、季集、分辨率、质量、视频/音频编码、字幕、语言、HDR、媒体匹配、规则、去重和最终动作;BTIH 只记录前缀。
CmsTaskLedger与旧持久化键作为历史任务账本命名保留,只承担 115 磁力幂等、状态轮询和重启恢复,不会调用外部 CMS。
- 新增
tg_search_enabled总开关,同时控制自动订阅搜索和详情页手动搜索;关闭后 PanSou 等其它来源仍可独立工作,运行状态显示 TG 已关闭或没有启用频道。 - TG 搜索总预算超时后保留已经完成频道的命中结果,返回
partial_success和来源统计;PanSou 超时不会清空 TG 结果。手动搜索兼容items、results、resources和嵌套data.items。 - 修复 115 状态轮询中未定义
direct_records导致的持续NameError,查询异常不再影响搜索结果和任务账本。
- 自动候选默认最多提交 5 个不同 BTIH;只有
cancelled、failed、no_resource等明确终态才切换下一个,unknown必须按 BTIH 对账,下载中、已下载和待整理状态继续保持 TG115 处理权。 - 首次排序后的 BTIH 队列、当前索引、尝试历史、状态、所有者和过期时间写入插件数据;重启后不会重新提交已尝试 BTIH。候选耗尽或达到上限后才释放 MoviePilot,配置可关闭最终回退。
- 电视剧候选支持声明集数覆盖计算;生产仲裁通过在
waiting_organize等在途状态保持订阅state=P阻断 MoviePilot 补搜,终态后才恢复订阅并按媒体库真实缺集重新处理。 - 配置页增加轮换开关、最大尝试数、单候选无进展时间、队列总时限、取消后切换和最终回退设置。
- 自动成功通知将来源数量明确标记为“搜索命中”,并增加实际执行成功候选的“最终来源”;直接观影显示观影,PanSou 候选显示 PanSou 及其
upstream_source。 - PanSou 上游来源贯穿搜索命中、候选转换、MoviePilot 规则、媒体身份确认和最终通知,不会被错误改写为直接 TG 或观影来源。
- 自动评估增加来源阶段统计:原始返回、目标季初筛拒绝、跨关键词/跨来源去重拒绝和进入统一搜索池数量;MoviePilot 规则通过数继续单独诊断。
- PanSou 手动搜索改用实际可用的
GET /api/search?kw=...,解析data.merged_by_type和文档兼容的results[].links,统一标记source=PanSou并保留上游来源。 - 手动 PanSou 不再限制网盘类型,页面拆分“搜索来源”和“结果来源”,结果来源筛选只过滤当前结果,不重复请求。
- 手动搜索结果写入
TgSearch115:manual-search:v1的sessionStorage,最多 500 条;刷新或重新挂载可恢复,下一次有效搜索开始前清空,失败状态也会保存。缓存不含订阅、凭证或正式确认状态。
- TG 手动结果在标题不规范时,可由消息正文包含查询片名且年份不冲突进行宽松召回;非 TG 来源和正式处理复核仍保持严格。
- TG、观影、PanSou 和聚影改为并行搜索,统一在 35 秒内收口并按最终过滤、去重后的展示结果统计各来源数量;PanSou 手动请求不执行重试。
- 前端递归解开 MoviePilot 多层
data响应包装,正确读取结果、来源状态与总数;正式转存或离线仍需选择订阅并通过后端规则及媒体身份确认。
- 手动搜索不再要求预先选择 MoviePilot 订阅;TG、观影、PanSou 和聚影按来源隔离执行,单源失败不会清空其它来源结果。
- 只有点击 115 转存或磁力离线时才弹窗选择订阅,后端仍重新执行 MoviePilot 规则和精确媒体身份确认。
- 详情页运行状态默认折叠,移除订阅干跑区域,手动搜索成为页面主体并显示来源数量或失败状态。
- 搜索来源缓存改用统一判定:只有无 HTTP、业务或网络错误的完整响应才可缓存;正常的空搜索结果仍可缓存,来源超时和错误会在后续周期重试。
- 新增 PanSou 健康检查、401/403/429/5xx、Retry-After、客户端关闭和错误缓存策略行为测试。局域网健康页只读检查成功;一次聚合搜索在 25 秒内超时,未执行转存、下载或订阅写入。
- 本阶段版本为
v4.7.34。MoviePilot 宿主更新和单条真实闭环测试仍要求先获得有效宿主会话,并由用户明确指定唯一测试订阅。
- 新增独立
PanSouClient,兼容results、merged_by_type、data、resources、list等响应结构,并将资源转换为现有统一候选模型。 - PanSou 默认通过局域网直连,不继承 MoviePilot 的外部代理;只有显式配置
pansou_proxy时才使用专用或 MoviePilot 全局代理。 - 非 JSON、401/403/429、5xx 和网络超时均按错误处理并进入来源失败计数,不会缓存成“有效空结果”;正常的
code=0且total=0仍可作为真实空结果缓存。 - 429/临时 5xx 支持数字秒数及 HTTP 日期格式的
Retry-After,并使用有界指数退避。配置、运行状态和日志不返回 PanSou Token 或原始响应。 - 自动搜索缓存键包含片名、年份、媒体类型、季号和 PanSou 网盘类型;TG、观影与 PanSou 按 BTIH、115 分享码和规范化 URL 跨来源去重。
- 阶段验证:43 项 PanSou、缓存、去重、配置迁移、来源顺序及前端契约测试通过。宽范围 PanSou 查询可能受上游聚合耗时影响而超时,插件会保留错误状态并在后续周期重试,不误报无资源。
- 手动搜索执行真实转存或磁力下载前必须é 10BC8 €‰择一个 MoviePilot 订阅,并在二次确认后调用统一的后端处理端点。
- 后端不信任前端展示结果,会重新构造候选并执行订阅媒体识别、MoviePilot 规则组、订阅过滤、目标季、115 文件名只读探测以及 TMDB/豆瓣身份确认;任何一步失败都不会创建真实任务。
- 手动界面不再直接调用裸
/transfer或/magnet/offline执行按钮路径。日志仅记录订阅 ID、来源和资源类型,不记录分享链接、磁力、提取码或凭据。 - 修复
wait_for_mp_organize配置此前未参与 115 分享完成逻辑的问题。默认转存成功仅把订阅置为等待状态,不发送SubscribeComplete;MoviePilot 监控、整理和订阅历史确认后才由宿主完成订阅。 - 阶段验证:47 项聚焦测试、Python 编译、
git diff --check和 Vue/Vite 生产构建通过。
- 版本已统一升级为
v4.7.33,插件清单新增 PanSou、可信候选排序、手动后端复核和等待 MoviePilot 整理的版本说明。 - 发布前验证通过:164 项 Python 测试、全插件 Python 编译、根清单与前端清单 JSON 解析、Vue/Vite 生产构建、
git diff --check以及敏感字面量扫描。 - 真实转存和整理验证必须在宿主更新后使用一个明确指定的订阅执行;在未选定测试订阅前,不会自动选择其它活动订阅或批量创建真实任务。
MoviePilot v2 插件:订阅新增或周期扫描时按 TG 频道、观影 115 中文字幕、观影磁力中文字幕、聚影顺序搜索;匹配资源通过 115 直连或 CMS 离线到 115,失败时回退到 MoviePilot 默认搜索。
当前版本:v4.7.36。新增 PanSou 聚合搜索,统一执行季级缓存、跨来源去重、MoviePilot 规则和精确媒体身份确认;确认后的实际处理顺序为 TG 115、观影 115、PanSou 115、观影磁力、PanSou 磁力、聚影。普通手动搜索不要求订阅,四来源并行并在 35 秒内分别返回统计,TG 展示层允许正文包含片名且年份不冲突的结果;只有正式转存或离线时才选择订阅并通过后端严格复核。来源错误不会写入空缓存或清空其它来源结果。
电视剧身份确认以“目标季号 + 媒体类型 + TMDB/豆瓣 ID”为硬条件。订阅总年份、季首播年、资源站年份和文件名年份可能不同,例如订阅为 2023 而 S03 为 2026:该差异只进入诊断与受限 MediaChain 确认,不会单独拒绝或放行候选。电影仍维持严格的年份兼容策略。
详情页的“订阅干跑验证”调用只读接口:仅搜索、读取分享文件名、运行规则和身份确认;不转存、不提交磁力、不调用 CMS、不修改订阅、任务账本或通知。
├── package.v2.json
└── plugins.v2/tgsearch115/
├── __init__.py # 订阅事件、匹配、排序、API
├── tg_scraper.py # Telegram 公开频道网页搜索
├── site_scraper.py # 观影 PoW、搜索和资源详情抓取
├── juying_scraper.py # 聚影开发者 API
├── cms_client.py # CMS Token API / 115 磁力离线
├── p115_offline.py # 115 Cookie Web 磁力离线与任务状态(v4.7.0 计划)
├── p115_transfer.py # 115 分享转存
└── frontend/ # MoviePilot Vue 前端
tg_scraper.py使用t.me/s/{channel}?q={片名}获取服务端模糊搜索结果,但本地不再校验标题。_filter_resources只应用 MoviePilot 的规则组及 include/exclude、清晰度等条件,不负责媒体身份校验。- 订阅流程从过滤后的 115 结果中直接选择第一条,缺少片名、别名、年份、季集和来源可信度评分。
- 观影的年份过滤在“无精确年份结果”时会保留全部模糊结果,也可能把错误作品带入订阅链路。
因此当前“10 条约 2 条正确”符合代码行为:召回量提高了,但准确率没有对应的二次校验和排序保障。
- 本地
v4.2.14的/res/downurl/{dir}/{id}遇到 403/404 会直接返回空数组,前端只能看到作品搜索成功,无法看到具体资源。 - 上游
v4.2.17-v4.2.18已增加完整浏览器请求头重试、页面 HTML 兜底提取和磁力优先提取;本地尚未包含这些改动。 - MoviePilot 运行时仍需用结构化日志区分
HTTP 403、非 JSON、业务code != 200、登录过期及“确实无资源”。
- 先同步并审查上游
v4.2.18的观影修复,解决已知版本缺口。 - 在 TG 和观影召回之后增加统一的媒体身份标准化、硬过滤和置信度评分。
- 订阅自动转存设置置信度门槛;低置信度结果只展示,不自动完成订阅。
- 为搜索、详情获取和选择结果增加可观测日志与回归样本集。
媒体确认应优先复用 MoviePilot v2.13.16 已有能力:
MetaInfo(title, subtitle)解析候选标题、年份和季集;TorrentHelper.match_torrent(...)做低成本标题、别名、年份和类型初筛;MediaChain().recognize_by_meta(...)通过 MoviePilot 配置的识别源确认候选身份;- 候选
tmdb_id与订阅MediaInfo.tmdb_id相同后,才允许进入自动转存。
不建议插件直接请求 TMDB API,也不建议直接调用 SubscribeChain.match:前者会绕过 MoviePilot 的缓存、识别源和限流策略,后者是全局订阅匹配流程,可能产生下载等额外副作用。
建议实施顺序:
P0 观影止血与诊断
-> P1 TG 身份硬过滤
-> P2 统一评分、去重和自动转存阈值
-> P3 影子运行、灰度启用和指标验收
自动订阅应遵循“宁可回退,不可错转”:标题或年份冲突直接淘汰;信息不足但可能正确的结果只进入手动搜索,不自动转存。
详细方案、阶段记录和验收指标见 项目立项与迭代总结。
- 日志确认“铁血战士:杀戮之地”已经取得 4 条通过规则的观影 115 候选,但前三个泛 TG 分享先占用只读探测和身份确认额度;“痴迷/Obsession”则被拼接成重复片名和
2025 2025,导致 MoviePilot 元信息解析偏移。 - 身份标题改为优先使用资源文件名,来源作品名只作结构化兜底,不再叠加完整消息、显示名和重复年份。分享文件名探测也使用同一清洗器。
- 识别探测按显式 TMDB ID 一致、已验证文件名、观影作品页与目标名称命中排序;显式 TMDB ID 冲突在调用 MoviePilot 前拒绝。排序仅决定最多 3 次身份确认的名额,不改变自动转存来源顺序。
- 新增重复年份、观影正确候选不被 TG 噪声挤出、显式 ID 一致优先和冲突拒绝测试;标题相似度本身仍不能绕过 MoviePilot 精确 ID、类型、季号和资源规则。
- 新增电视剧季级年份策略:优先读取
MediaInfo.season_years[target_season];候选年份不等于订阅总年份时,仍须通过 TV 类型、目标季和 TMDB/豆瓣 ID 的精确确认,才可成为自动处理候选。 - 电影候选继续采用严格年份策略,年份冲突在媒体识别与自动处理前拒绝。
- 正式订阅处理与订阅干跑共用同一只读候选评估器;干跑输出季号、季首播年、候选年份、文件名探测、规则、TMDB、类型和季号的汇总诊断,不含分享链接、凭据、磁力或任务 ID。
- 干跑的候选年份从无计数的集合改为“年份 x 数量”分布,能够区分 S03 的 2026 季首播候选和其它年份的候选。
- 详情页同步显示年份硬拒绝、季级 TMDB 延后确认、TMDB 一致/不一致、类型不一致、季号不一致和最终安全候选数;仅暴露汇总数据。
- 该阶段不放宽电影年份、TV 类型、TMDB/豆瓣 ID、目标季、完整剧集、中文字幕或清晰度要求,也不增加任何写操作。
- 修复 MoviePilot 将 Vue 插件的空
get_page()结果误判为无详情页的问题:插件返回最小、无状态的隐藏占位项以登记详情页能力,实际界面仍由联邦Page.vue渲染。 - 占位项不含配置、订阅、任务、链接或凭据;详情页的干跑接口与全部自动处理条件不变。
- 修复分享元数据缓存初始化使用不存在的
maxsize参数,改为TtlCache的公开参数max_entries。 - 此错误会在 MoviePilot 加载插件阶段抛出
TypeError,使插件没有运行实例、详情页和 API;新增回归测试确保启动参数有效。
- 对现有“末日地堡”S02/S03 执行真实只读干跑:S03 的 2026 候选进入
tv_year_deferred_to_tmdb,未发生年份硬拒绝;首次结果也暴露出宿主MediaInfo.season_years缺失及候选识别游标生命周期异常。 - 插件现通过 MoviePilot 自身只读
TmdbChain.tmdb_seasons()补齐目标季首播年份并缓存;当MediaChain识别不可用时,受限改用同一宿主的 TMDB 搜索。多结果只挑选订阅 TMDB/豆瓣 ID 精确一致项,类型、季号、完整剧集、字幕和规则门槛不变。 - 本阶段只增加只读识别能力,未放宽自动下载条件,不输出链接、凭据、磁力或完整任务 ID。
- S03 复验表明,季首播年份已补齐为 2026,但通用候选识别仍会受宿主 PostgreSQL 游标生命周期异常影响。回退改为按订阅的精确 TMDB ID 读取 MoviePilot 原生目标元数据,而不是接受模糊搜索首条结果。
- 目标元数据回退后必须重新使用
TorrentHelper.match_torrent()核验实际候选标题/别名;类型、目标季、完整剧集、中文字幕和规则过滤仍不可绕过。标题不匹配或目标元数据不可用时继续拒绝。
- 新增受 Bearer 鉴权保护的
POST /subscription/process,仅在请求体明确携带confirm=true时,把指定订阅放入既有手动高优先级队列。接口本身不更新订阅、不创建账本或下载任务。 - 这允许对处于
R状态、不会被周期N状态扫描捕获的既有订阅进行真实闭环验证。队列仍复用正式身份确认、来源排序、115 账本、整理确认和失败恢复流程。
- 修复
R状态订阅虽可进入队列、却被常规认领逻辑跳过的问题。显式处理记录原状态,只对N/R临时认领为P;未命中、识别失败或处理异常后恢复原状态。 P、完成等其它状态及重复入队继续拒绝,避免并发重复处理或意外恢复已暂停任务。
- 对临时“末日地堡”S02/S03 先执行真实只读干跑,再逐季执行显式确认的正式处理。两季独立入队,处理期间均为
R -> P,完成后恢复为R,没有相互覆盖。 - S02 的目标季首播年为 2024,候选未通过可验证规则;S03 的目标季首播年为 2026,候选年份被记录为
tv_year_deferred_to_tmdb,年份硬拒绝数为 0。 - 两季均没有通过完整身份与资源规则,因此没有创建 115/CMS 任务、没有网盘转存、没有磁力提交、没有订阅完成或完成通知。这验证了真实处理在不安全候选下的恢复闭环。
- 修复观影站只按订阅总年份查询的问题。电视剧每个季级关键词最多执行“订阅总年份、目标季首播年份、无年份”三次受限查询;S02 采用 2023/2024/无年份,S03 采用 2023/2026/无年份,缓存键同时包含季号和查询年份。
- 电影仍只按订阅年份查询且继续严格年份拒绝。TV 页面年份差异仅帮助排序与诊断,候选仍必须完成精确 TMDB/豆瓣 ID、TV 类型、目标季、完整剧集、中文字幕、1080P/4K 和 MoviePilot 规则校验。
- 干跑新增观影实际查询年份、各年份召回数、详情磁力总数及中字 1080P/4K 数。详情资源标题、页面标题和副标题共同传入季号、字幕、清晰度与身份识别;不返回链接或磁力原文。
- 真实干跑显示 S02/S03 已按季首播年份召回,但资源站同年结果很多且详情抓取受每轮上限约束。资源站现在会把明确命中
Sxx、第N季或覆盖目标季的季合集排在同年结果前面,再抓取有限详情页;缓存键继续隔离关键词、年份与季号。 - 站点详情 API 返回的磁力带有页面标题、资源标题和查询年份。此类候选可进入 MoviePilot 精确媒体识别,不能因本地别名解析遗漏而提前拒绝;这不是确认或放行,仍必须通过 TV 类型、目标季、TMDB/豆瓣 ID、完整季、中文字幕、1080P/4K 与规则组。
- 当新版 MoviePilot 的通用
MediaChain在 PostgreSQL 游标清理阶段不可用时,插件改用 MoviePilot 原生TmdbChain.tmdb_info()按订阅绑定的 TMDB ID 和媒体类型做只读精确读取,并短期缓存结果。 - 回退得到的官方元数据仍会重新核验候选标题/别名、TV 类型、目标季和精确 TMDB/豆瓣 ID;任何读取、核验或资源规则失败仍拒绝下载,不创建 115/CMS 任务。
- 修复启动队列的防御性清理会停止并移除刚初始化识别协调器的问题。插件安装、更新或重载后会创建全新的可接收协调器,不再让全部候选错误进入“MoviePilot 媒体识别暂时不可用”。
- 真实宿主数据已验证 S02 有 3 个候选通过目标 TMDB、TV 类型与 S02 确认;S03 也通过目标 TMDB、TV 类型与 S03 确认。S02 已进入插件内置 115 任务闭环,任务完成后仍等待 MoviePilot 整理确认。
- 修复观影作品搜索错误使用
嗜血法医 S01、Dexter S01等季号后缀查询,导致站点只按基础作品名建立的索引返回 0 条。TG 继续使用带季号关键词,观影改用 MoviePilot 缓存中的基础片名与别名。 - 观影详情返回后仍严格按资源标题筛选目标季。例如
第1-9季合集与第一季全12集可以覆盖 S01,其它单季不会误匹配;随后继续执行中文字幕、1080P/4K、MoviePilot 规则与精确 TMDB/类型确认。
- 修复候选策略已生成
TG 115 → 观影 115 → 观影磁力 → 聚影顺序后,订阅评估器再次用磁力 + 分享重排,导致观影 115 已命中却先提交磁力的问题。 - 评估、身份确认与执行现在完整保留策略输出顺序。只有前序 115 分享身份不符或转存失败时,才继续尝试观影中文字幕 1080P/4K 磁力;磁力成功仍进入下载与 MoviePilot 整理等待状态。
- “海军罪案调查处”已成功转存覆盖多季的 115 分享,MoviePilot 正在识别并整理各季文件。后续季订阅再次处理同一分享时,115 返回“文件已接收,无需重复接收”;插件现在将其视为幂等成功,让对应季进入整理等待,而不是误报转存失败。
- 115 分享日志已脱敏:不再输出完整分享地址、提取码、用户标识、转存表单或原始响应,仅记录接口状态、条目数量和是否定位到文件。
v4.7.28宿主正式验证 S11 时发现,搜索只发送“海军罪案调查处 S11”和“NCIS S11”;已转存的多季分享标题只有总剧名,因此 TG 返回 0 条,无法进入“已接收”的幂等分支。- 电视剧关键词仍限制为最多 6 个,但固定保留中文总剧名和一个英文别名作为末位回退。观影会复用已存在的基础标题缓存,主要新增 TG 对无季号多季分享的召回。
- 无季号 115 分享不直接算作季号匹配,只允许进入受限只读文件名探测。探测结果生成内部季号摘要并重新严格校验目标季;明确写着其它季的分享仍在探测前拒绝。
- 分享通过季号复核后仍须满足完整剧集、中文字幕、1080P/4K、MoviePilot 规则和精确 TMDB/豆瓣身份确认,才会转存或按幂等成功进入整理等待。
v4.7.29正式验证显示 3 条候选进入季号复核,但 TG 日志仍只有两个带S11的查询。根因是第二个关键词从观影得到至少 5 条结果后触发提前结束,排在末尾的中文/英文基础标题尚未执行。- 提前停止现在必须同时满足“当前关键词已有足够候选”和“所有预留基础标题均已查询”。即使观影先命中,也会继续完成 TG 总剧名回退;关键词总数、TG 并发和请求间隔均未增加。
- 每个自动关键词增加安全日志,便于确认实际执行顺序;不记录分享链接、磁力、Cookie、Token 或原始响应。
- “宝莱坞鸡尾酒2”日志显示插件依次搜索中文、英文、印地语、俄语等本地化名称,TG 全部为 0;观影多次超时,却被外层当成正常空结果并继续重复查询。
- 搜索名称现优先保留订阅正式名、英文原名和一个额外中文别名。已有中文与英文名称时,不再为了凑满关键词上限加入俄语、印地语等低价值别名;如果媒体确实只有其它语种名称,仍保留正式名和一个兜底名称。
- TG 请求仍使用 URL 编码,但日志改为显示解码后的可读名称,例如显示
Коктейль 2,不再显示%D0%9A...;历史乱码频道名在搜索入口再次执行安全修复。 - 观影搜索和详情超时会设置安全错误分类,进入来源连续失败与冷却统计;超时产生的空结果不写入周期缓存,避免后续周期误以为站点已正常返回 0 条。
- 任务区“清除记录”从无文字图标改为带无障碍标签和文字的危险操作按钮,并在确认对话框中说明影响范围和可清理数量。
- 后端
/tasks/clear强制要求confirm=true;缺失或错误确认会返回拒绝。活动任务仍禁止清除,确认操作不删除 115 文件、不取消离线下载、不修改订阅。 - 本阶段前曾误清除 24 条已结束的本地账本记录;这些记录无法从插件恢复,但不影响 115 文件、离线任务或订阅状态。
- 复现“末日地堡 S02”时,17 条 TG 115 分享已通过季号初筛,却因构造为
size=0、未知促销/发布时间而被新版 MoviePilot 规则组全部拒绝。 - 新增离线分享规则兼容器:原生 MoviePilot 规则结果优先;仅对 115 分享,以当前运行中的 MoviePilot 规则定义复核可验证的文本与 TMDB 条件,跳过大小、做种、免费、发布时间等来源无法提供的字段。
- 观影磁力保留既有的零做种规则适配;115 分享不会因此绕过中文字幕、1080P/4K、标题、年份、季号、完整剧集、类型或 TMDB/豆瓣身份确认。
- 失败通知和日志现区分规则拒绝、识别不可用、类型、季号与 TMDB/豆瓣 ID 不一致,且只输出安全类别。
- 发布后以“末日地堡(2023)S02”运行强制仅搜索验证:禁止转存、磁力提交和订阅状态写入。
- 完成代码、版本和上游差异检查。
- 确认 TG 主要问题为缺少媒体身份二次校验及直接取首条结果。
- 确认本地观影实现落后上游 4 个补丁版本,缺少 403/404 兜底链路。
- MoviePilot 地址可访问;2026-07-19 使用更正后的账户凭证成功登录,运行版本为
v2.13.16。
- 制定 P0-P3 分阶段实施路线和量化验收指标。
- TG 链路采用媒体身份硬过滤 + 可解释评分 + 自动转存阈值。
- 观影链路先同步上游修复,再增加搜索与详情分层诊断,避免失败被伪装成空结果。
- 上线前先以影子模式运行,只记录候选和评分,不执行转存或完成订阅。
- 核对
jxxghp/MoviePilot与jxxghp/MoviePilot-Plugins,并以运行环境对应的v2.13.16标签验证接口。 - 确认插件可复用
MetaInfo、TorrentHelper.match_torrent和MediaChain.recognize_by_meta。 - 将 TMDB 确认定义为自动转存的身份硬门槛,不把网络识别用于所有搜索结果。
- 确定两级策略:本地初筛全部候选,只对排名靠前的少量候选进行 MoviePilot/TMDB 确认。
downurl现在区分 JSON、HTML、HTTP 和业务错误,不再把所有失败折叠为空结果。- 403/404 或 HTML 响应会携带页面导航请求头重试,并从返回页面兜底提取磁力和常见网盘链接。
- 新增链接去重、HTML 实体解码、磁力标题解码和邻近提取码识别。
/check_site修复未定义配置变量,并会在有测试样本时同时检查搜索和详情接口。- 新增 3 个离线回归测试,全部通过;真实宿主网络/WAF 结果仍需部署后验证。
- 新增
identity_matcher.py,复用 MoviePilotMetaInfo、TorrentHelper和MediaChain。 - 自动转存要求候选 TMDB/豆瓣 ID 与订阅一致;剧集还要求季号一致,多季候选直接淘汰。
- 删除“第一条 115 结果直接转存”行为;本地初筛全部候选,最多对 3 条有效候选调用媒体识别。
- TG、观影、聚影统一进入订阅召回;按 115
share_code去重,避免重复候选消耗识别额度。 - 观影指定年份没有精确结果时返回空,不再回退到其它年份的模糊作品。
- 插件版本升级为
v4.3.0,9 个离线测试全部通过。
- 实机复现 TG 搜索“法警小队(2026)”返回 43 条,大量混入“双姝美探”“雪迷宫”等正文模糊命中。
- 新增规范化片名/年份硬过滤,支持季名后缀和“电视剧:换行片名”结构,并按分享码或 URL 去重。
- 实机确认观影
search_suggest可用但 httpxdownurl返回 403;同凭证在 Windows 使用 urllib 可成功取详情。 - 新增 urllib 独立 CookieJar + PoW + downurl 直连降级,仅在原 httpx/HTML 路径失败后启用。
- v2rayN
192.168.1.9:10808出口测试仍为 403,故观影不依赖该代理;Git 推送仍可在需要时使用它。 - 测试扩展到 15 个,全部通过。
v4.3.1在 MoviePilot 实机中已正确进入 urllib 降级,但详情仍返回urllib HTTP 403。- 对比配置和成功探针后确认,用户保存的是
app_auth=值完整 Cookie 片段,插件却把整段作为 Cookie 值,导致请求实际登录态无效。 - 新增输入规范化:同时接受纯 token、
app_auth=token和Cookie: ...; app_auth=token; ...。 - Windows 直连对照验证:规范化前
downurl为 403,规范化后为 HTTP 200,并取得 33 条网盘链接。 - 插件版本升级为
v4.3.2,新增两项 Cookie 格式回归测试。 - 已部署到 MoviePilot
v2.13.16:观影搜索“双姝美探(2026)”返回 37 条唯一详情资源,URL 全部非空且无警告。 - 部署后回归 TG“法警小队(2026)”:返回 12 条唯一链接、仅 1 个规范化标题,错误作品为 0。
- 聚影没有单独的“非开发者端口”;指南中的非开发者调用仍使用
/api/dev/*。 - 所有 7 个开发者端点均要求同时提供已审核的开发者
AppID和调用用户自己的个人API Key。 - “非开发者共享 10 次/分钟”表示非开发者通过他人的已审核
AppID共享调用,并不表示个人API Key可以单独鉴权。 - 当前 MoviePilot 的聚影开关、域名、AppID 和 API Key 均为空,未写入或输出用户提供的密钥。
- 现有插件已经支持共享调用模式;取得可用的开发者 AppID 和聚影 HTTPS 域名后,只需在聚影配置页填入三项凭证并测试连通。
- 自动订阅候选继续先经过 MoviePilot 规则组、include/exclude、画质参数和 TMDB/豆瓣身份确认。
- 启用观影磁力优先时,完整观影磁力排在 115 分享前;按 BTIH 去重,失败后仍可回退 115 或 MoviePilot 默认搜索。
v4.4.0曾把磁力作为TorrentInfo.enclosure提交给 MoviePilotDownloadChain;该路径已在v4.5.0被 CMS/115 官方 Token API 取代,当前磁力不会进入任意 MoviePilot 下载器。- 剧集仅允许明确完结/全集磁力自动提交;未完结剧集、聚影磁力和其它来源磁力不参与该优先路径。
- 新增独立资源策略模块和 3 项回归测试;前端配置开关与手动搜索筛选控件将在同版本下一阶段完成。
- 观影设置新增“完整磁力优先交给 MoviePilot”开关,默认开启;关闭后保持原有仅自动处理 115 分享的行为。
- 配置弹窗和插件详情页新增一致的资源筛选按钮(全部/磁力/网盘/115)与画质按钮(全部画质/4K/1080P/高帧率/排除 HDR)。
- 前端筛选逻辑共用单一模块,已通过资源类型、画质和 HDR 排除断言;生产构建成功。
- 发布版本升级为
v4.4.0,完整测试扩展到 20 项并全部通过。 v4.4.1补充默认配置与旧配置合并,确保升级后磁力优先开关明确显示开启而不是null。
- 根据
imaliang/cms-docs官方文档接入POST /api/cloud/add_share_down_by_token,不再把观影磁力交给 MoviePilot 中任意下载器。 - 自动磁力在提交前仍依次经过 MoviePilot 规则组、include/exclude/画质过滤、中文片名与年份初筛、TMDB/豆瓣 ID 和剧集完整性确认。
- CMS 地址与 Token 只保存在 MoviePilot 插件配置;CMS 登录账号和密码不参与 API 调用,密钥不写入代码、README、日志或 Git。
- CMS 失败时跳过剩余磁力并继续尝试后续 115 分享;CMS 接口只表示“任务已创建”,插件仅暂停订阅等待同步,不再误发下载完成事件。
- 配置弹窗和插件详情页的磁力结果新增“离线到115”操作;高帧率筛选补充
60帧、60帧率等中文形式。 - 本地已通过 23 个 Python 测试、Python 编译、Vue/Vite 生产构建、Node 筛选断言、清单解析和
git diff --check;未提交真实磁力任务。 v4.5.0部署后发现“检查 CMS”先保存配置会触发 MoviePilot 关闭弹窗;v4.5.1改为独立 POST 检查当前表单,不保存配置、不关闭弹窗,Token 也不进入 URL。
- 新增单一有界优先队列;新增订阅、周期扫描和手动搜索不再各自无限创建线程,手动搜索在等待队列中优先于周期任务。
- 周期扫描只处理 MoviePilot
state=N的活动订阅,并按片名、年份、类型和季去重;默认每 2 小时运行,每轮增加 0-10 分钟随机抖动。 - 自动搜索增加按来源 TTL 缓存;TG 默认并发降为 2,翻页间隔为 0.8-1.5 秒;观影详情间隔为 1.5-3 秒。
- TG 429、观影 403/429 支持退避并读取
Retry-After;连续失败达到阈值后来源进入 30-60 分钟冷却。 - CMS 任务账本持久化订阅 ID、媒体 ID、BTIH、标题、时间、状态和错误;跨重启按 BTIH 去重。
- CMS 接收任务后不会完成订阅;只有 MoviePilot 订阅历史出现或订阅被 MP 整理流程移除时才标记完成,超时则恢复订阅为
state=N。 - 34 个 Python 测试通过;下一步补齐配置界面、状态页和宿主验证后再发布
v4.6.0。
- 插件设置新增周期开关、1/2/3 小时周期、0-10 分钟抖动、缓存时长、订阅间隔、TG 并发/翻页间隔、失败阈值和 30/45/60 分钟来源冷却配置。
- 观影设置新增详情请求间隔和 CMS 任务超时时间;旧配置通过后端与前端默认值自动补齐。
- 插件详情页显示上次运行、下次运行、队列长度、本轮订阅数和各来源冷却状态。
- CMS 任务列表只显示标题、截断 BTIH、状态、时间和错误,不返回磁力原文或任何 Token;失败/超时任务支持手动重试。
- 对账进一步收紧:只有 MoviePilot 完成历史能确认整理完成;订阅消失但没有完成历史时标记失败,不误报完成。
- 35 个 Python 测试、Python 编译、Vue/Vite 生产构建和
git diff --check通过;未执行真实磁力或真实转存。
- BTIH 预留改为原子操作,自动订阅与手动离线并发时不会重复提交同一磁力;不同订阅抢到同一 BTIH 时回退后续候选。
- 无有效 BTIH 的磁力在进入 CMS 前被拒绝;任务账本并发读写增加锁保护,停止插件时队列中的手动请求立即取消。
- 版本元数据统一为
v4.6.0,包历史已记录本阶段功能。 - 38 个 Python 测试、Python 编译、Vue/Vite 生产构建、前端筛选断言、版本/JSON 检查、敏感信息扫描和
git diff --check通过。 - 未提交真实磁力、未执行真实 115 转存;待提交后进行 MoviePilot 宿主只读验证。
share_snap/share_receive仅用于 115 分享解析与接收,不能接收磁力,本阶段不会把磁力伪装成分享链接。- 115 Open API 提供
/open/offline/*,但需要 OAuth 凭据,当前仅 Cookie 的插件不直接依赖该接口。 - 已核对 115 Cookie Web 云下载接口:先由
GET https://115.com/?ct=clouddownload&ac=space获取sign/time,再由POST https://clouddownload.115.com/lixianssp/?ac=add_task_url创建磁力任务。 task_lists与get_user_task可返回以info_hash标识的任务状态;Web API 同时提供task_del、restart、pause_task和resume_task,具备创建、查询、取消和重试闭环的源码基础。- 状态值按已核对客户端实现映射为失败、停止、运行和成功;115 成功只代表离线下载完成,插件仍须等待 MoviePilot 订阅完成历史后才能最终完成订阅。
- 当前部署的 v4.6.0 没有云下载只读探测端点,因此宿主 Cookie 的签名/任务列表实测留到 v4.7.0 客户端接入后执行;探测只读取字段能力和任务数量,不返回任务名称、完整 ID 或任何凭据。
- 本阶段未创建、删除、暂停或重试任何真实 115 任务,也未修改用户网盘内容。
- 新增
p115_offline.py:校验 40 位十六进制或 32 位 Base32 BTIH,按 115 Cookie Web 协议获取签名、提交磁力、查询任务、取消和重试;创建请求使用 115lixianssp加密载荷,不调用share_receive。 - 客户端统一处理数字/字符串业务码、401/403、429、5xx、
Retry-After和指数退避;网络异常永远不会返回完成状态。 - 新增本地 BTIH 锁与进程内已提交缓存,并在提交前读取任务列表,避免同一 BTIH 并发或重启后重复提交。
cms_tasks.py兼容旧调用并迁移为脱敏记录:旧磁力原文不会继续写回,账本保留来源、订阅/媒体 ID、BTIH、task_id、状态、进度、错误和重试次数;独立offline_tasks.py提供通用账本。- 自动磁力策略新增
direct_115、direct_then_cms、cms_only,默认先直连 115,失败后 CMS;直接 115 成功只进入submitted,115 明确下载完成后进入pending_organize,仍须 MoviePilot 完成历史才可completed。 - 直接任务失败、取消或超时恢复订阅为
state=N;手动重试不重放未知磁力,而是恢复订阅让下一轮重新搜索,避免账本保存敏感原文。 - 配置页新增离线方式、目标目录、直连超时、轮询间隔、最大重试、等待 MP 整理等字段;详情页显示来源、脱敏 task_id、状态、进度和错误。
- 45 个 Python 测试、全量 Python 编译、Vue/Vite 构建和
git diff --check通过;未创建、删除、暂停或重试真实 115 任务。 - 当前限制:宿主只读 Cookie 探测端点尚未发布,暂未把真实 Cookie 带到 115 云下载接口验证;发布前必须先完成只读签名/任务列表探测,若接口被拒绝则保持 CMS 回退。
- 新增可停止的
tg115-offline-status单线程轮询器,默认等待 45 秒后查询;插件停止或重载时设置停止事件并等待线程退出。 - 任务列表读取失败时禁止继续提交,避免无法确认跨重启去重时重复创建;直接失败后 CMS 回退策略已有独立测试。
- 新增
/check_115_offline只读探测和配置页“检查 115 离线”按钮,只返回鉴权、签名、任务数量和字段能力。 - 新增配置控制的直接任务取消;取消成功后账本进入
cancelled并恢复订阅。失败/超时重试只恢复订阅重新搜索,不持久化或重放完整磁力。 - 清理自动链路中的完整资源 URL 日志,状态页统一使用
error_message和脱敏 task_id。 - 版本元数据已统一为
v4.7.0;48 个 Python 测试、Python 编译、Vue/Vite 构建、JSON/版本解析、敏感字面量扫描和git diff --check全部通过。
- 115 云下载列表、单任务查询、取消与重试统一使用
/web/接口;重试按协议提交info_hash。 - 离线目标路径先通过现有目录模块解析为数字 cid,禁止把
/电影等路径直接作为wp_path_id。 - 任务列表不可确认时禁止提交;任务失败或取消后清除进程内成功缓存,下一轮可重新创建。
- 直接任务重试实际调用 115
restart并累计次数,达到配置上限后拒绝;CMS 记录仍恢复订阅重新搜索。 - 状态对账增加互斥锁,避免轮询线程与详情页刷新同时更新账本;
state=false不会再被code=0误判成功。 - 配置页补充“115 请求最大重试”;50 个 Python 测试、Python 编译和 Vue/Vite 构建通过。
- 已推送并更新 MoviePilot:宿主显示
v4.7.1运行中,周期调度保持 2 小时,旧账本来源迁移为CMS 回退且 task_id 仅显示脱敏值。 /check_115_offline宿主只读验证成功:Cookie Web 签名与任务列表可用,返回任务数 30;验证过程中未创建、删除、暂停或重试任何任务。
- 使用已授权的单条真实磁力完成灰度验证:115 直连提交成功,下载期间保持“下载中”,没有把任务创建成功误报为完成;未再次提交第二条真实磁力。
- 修复 115 文件已落盘但
get_user_task仍返回运行态的问题:额外查询task_lists(stat=11)已完成分组,以 BTIH/task_id 交叉确认后进入“待整理”。 - 已完成分组只确认 115 下载完成,不会触发订阅完成;最终
completed仍由 MoviePilot 订阅完成历史确认。 - 账本补充目标 cid 和下载名称提示,详情页可查看脱敏任务对应的 115 落盘位置线索,不显示完整磁力或完整任务标识。
- 自动转存优先级调整为:TG 频道 → 观影 115 中文字幕 → 观影磁力中文字幕 → 聚影;观影资源缺少中文字幕标记时不自动转存。
- v4.7.2 推送并更新宿主后,只读刷新同一真实任务:状态已由“下载中”纠正为“待整理”,目标 cid 与下载名称提示可见,未误标为“已完成”。
- 宿主复现确认历史频道名称经过两轮错误解码,中文变成连续
Ã/Â字符;配置读取与运行时频道解析现在会保守修复一至两轮乱码。 - TG 资源此前只从消息可见文字中提取,按钮显示“立即查看”而真实 115 地址位于
href时会完全漏掉。 - 搜索现在合并消息文本、全部锚点/按钮
href和 Telegram 包装跳转参数中的 115 链接,并按规范化 URL 去重。 - 不提高 TG 并发、不增加最大翻页数、不缩短请求间隔,搜索覆盖提升来自解析完整性而不是增加请求频率。
- 配置页“手动搜索”和详情页搜索改为同一个共享组件,两处来源、输入、结果卡片、复制与转存行为完全一致。
- 选择“磁力”后显示:全部、720P、1080P、中字1080P、4K、中字4K、原盘、未知;选择“网盘”后显示:全部、迅雷、百度、夸克、天翼、115、UC、阿里。
- 自动转存只接受同时具备中文字幕标记和 1080P/4K 画质的观影磁力;720P、未知画质或无中文字幕磁力不自动提交。
- 完整磁力统一使用插件内置 115 离线,不回退 CMS;115 分享继续使用插件内置 115 转存
- 手动磁力离线入口增加顶层异常边界,任何内部错误都返回 JSON;前端兼容裸 JSON 与 MoviePilot/Axios 包装响应。
- 详情页“CMS / 115 任务”默认折叠,只显示任务数,点击标题后展开明细。
- 用户授权的单条真实中文字幕 1080P 磁力测试中,插件端点返回标准 JSON,但直连结果为失败;账本保持
failed,没有误报下载或整理完成。 - 脱敏诊断确认旧 SSP 请求被 115 明确拒绝为
decode fail;同一 Cookie、签名、目标 cid 和 BTIH 改用/web/表单协议后,真实返回state=true/code=0及正确任务标识。 v4.7.6创建任务统一使用 Webadd_task_url,状态、取消和重试继续使用同一协议;移除未被服务端接受的 SSP 自实现和全部临时正文诊断。- HTTP 200 但响应非 JSON 时不会直接判成功:最多三次按 BTIH 查询任务列表,只有确实出现任务才进入提交/下载状态,否则保持失败。
- 不记录响应正文、Cookie、完整磁力或完整任务标识;同一 BTIH 的真实复测没有创建不同资源任务。
v4.7.6已推送并安装到 MoviePilot。插件端点对同一 BTIH 返回标准 JSON 成功,账本显示 115 直连、进度 100%、目标 cid 与下载名称可用,并停在pending_organize等待 MoviePilot 整理历史,没有误报completed。- 发布验证通过 60 项 Python 测试、Python 全量编译、Vue/Vite 生产构建、JSON/版本检查和
git diff --check;安装期间临时切换的 MoviePilot 代理已恢复原值。
- MoviePilot v2 当前订阅表每行只有一个整数
season;界面中的 S00/S02/S03 是同媒体的三条订阅。周期去重现已保留 S00,不再把0当成空值。 - 新增季号解析,支持 S00/S02、Season 2、第二季、特别篇、S02E01、第1-2季、S01-S03 和全三季;无明确季号的电视剧候选不得匹配 S02/S03,多季合集包含目标季时可以继续确认。
- 自动关键词由订阅名、TMDB 标题、英文名、原名和别名生成,每季最多 6 个;来源缓存键升级为来源、关键词、年份、类型和季,缓存不含目标季时强制重查。
- 季号初筛提前到 TorrentInfo、MoviePilot 规则和 TMDB 识别之前,S01 不再消耗 S02/S03 的识别额度。
- 插件内 SubscribeChain/MediaChain 识别统一经单并发门控;
kill_cursor或首次空结果会释放锁、丢弃链、随机等待后重建并仅重试一次,连续失败返回identity_unavailable,不会提交资源或暂停订阅。 - 宿主
tmdbapi.py只记录异常文本而不保留堆栈,无法从现有日志证明底层精确行号;已确认 MoviePilot TMDB 模块是共享实例。插件记录队列、等待、重试和 unavailable 指标,但不修改 MoviePilot 核心。 - 多个季级关键词返回相同资源时按链接或资源标识稳定去重,保持 TG、观影 115、观影磁力、聚影的既定来源优先级,避免重复识别。
- 详情页显示 TMDB 识别等待数、活动数、历史最大并发、重试数和暂不可用次数;不显示异常正文或任何鉴权信息。
- 发布前 84 项 Python 测试、Python 全量编译和 Vue/Vite 生产构建通过;未提交真实磁力,未修改真实 115 任务或目录。
- MoviePilot
v2.13.16规则组会把seeders=0当作真实做种数;观影磁力实际上是未知值,且 115 使用服务端资源池。插件现在仅在执行规则组时让磁力跳过做种人数门槛,随后恢复原值;标题、年份、季号、质量、包含/排除、TMDB/豆瓣 ID 与中字 1080P/4K 条件均保留。 - 原流程在
SubscribeAdded后等待 3 秒,MoviePilot 核心可能同时开始默认搜索。现在新增订阅先临时设为state=P,TG、观影和聚影全部结束后再决定:成功保持暂停并进入转存/下载闭环,失败恢复state=N。 - 未命中和成功通知统一为“TG115 搜索完成”,一次展示 TG、观影、聚影的去重命中数与最终处理结果;相同订阅和结果 10 分钟内只通知一次。
- 详情页“CMS / 115 任务”改为“磁力下载任务”,新增清除记录按钮。存在活动任务时拒绝清除,避免任务状态和订阅恢复能力丢失。
- 本阶段新增做种门槛旁路、来源汇总去重和任务账本安全清理测试;全量测试增至 84 项。