- 自定义识别词组:TMDB 自动建组时备注为空导致 PostgreSQL
NOTE NOT NULL报错,入库前兜底为空串
- 备份恢复兼容新旧版本差异:导入前按目标表列过滤,新版本备份恢复到旧版本不再因多余列丢数据
- 站点详情页抓取空/失败时按站退避重试(0.8~6s 递增,恢复正常自动恢复并发),减少触发站点风控;非 2xx 响应记录状态码便于定位
- 容器内嵌 nginx 上游端口随
NEXUS_PORT每次启动自动渲染,修改端口后无需改 nginx 配置
- Web Push 浏览器/移动端系统推送:VAPID 联系邮箱可配置,推送订阅记录日志;前端 PWA(Service Worker + 图标清单)同步配套
- 下载器实时速率与负载:新增
/download/statistics,首页展示下载/上传实时速率与限速占用(支持多下载器聚合,无限速时仅显示速率) - 订阅记录新增
add_date入库时间:首页订阅数“今日新增”统计有可靠口径
- 站点解析健康统计收口到仓储层(实体/接口/适配器拆分),逻辑与存储解耦
- 站点解析健康自检(前端站点维护页同步):从各站 RSS 采样真实种子单抓解析,按站点定义逐项校验选择器/字段命中,识别页面改版与配置漂移;后台异步执行不阻塞、前端轮询刷新;每日 03:20 定时自检并可推送独立「站点解析告警」通知开关
- 状态语义清晰:限流/空响应为临时态跳过不告警;未登录/凭据失效单独归类(不误报结构变更);连续两轮异常才告警,异常持续按 7 天间隔复读
- 种子属性获取统一收敛到站点定义:HTML 选择器(FREE/2XFREE/HR/PEER_COUNT/PUBDATE)与 API 字段(free_key/peer_count_key)统一求值入口,自检与刷流共用同一解析
- 详情页发布时间(PUBDATE)参与刷流时间规则,且以种子页面日期为准(需站点定义含 PUBDATE 选择器,如 U2)
- 刷流免费种子误删相关链路复核:详情页属性失败收敛为“属性未知”跳过(站点未匹配/TID 提取失败/非 JSON/业务失败均不再误判非免费);详情 URL 按站点主域拼接(兼容带 scheme 域名);M-Team 等 enclosure 签名链接优先用 PAGE_URL 取详情
- 种子详情 ID 提取:剥离域名数字后取最后数字,修复 u2.dmhy.org 的 2 抢占 tid 致解析错种
- API 站属性解析:支持 GET params(朱雀 detail);free_value=0(数值判免费)不再漏判;仅配 pubdate 规则的刷流同样抓取详情页
- 站点配置修正(已同步 nexus-media-sites):Rousi 做种字段 data.seeders、朱雀 data.torrent.seeding、U2 详情页模板与发布时间选择器
- qBittorrent 删种竞态 NotFound404Error 静默(不再整段 ERROR 栈)
- MEDIASYNC_ITEMS varchar 列与 int 入参类型收敛,修复 PostgreSQL
varchar = integer报错(含写侧字段规范化) - M-Team 签到 401(登录态过期)给出明确提示,引导在真实浏览器登录并同步 CookieCloud,避免服务器侧重登触发风控
- 刷流误删免费种子:删种/停种/免费自动恢复路径改用详情页 URL 解析免费状态(M-Team 等站 RSS enclosure 为一次性签名链接无法取到 TID);详情属性解析失败统一收敛为"属性未知"跳过本轮——站点未匹配、TID 提取失败、非 JSON 响应、业务失败响应(如限流
{"code":1}无 data)均不再误判"非免费"触发删种 - 详情页 URL 按站点主域拼接:修复 RSS 域名与主站域名分离的站点(M-Team rss.m-team.cc / kp.m-team.cc)解析不到属性的问题;兼容域名自带 scheme 的站点(观众),RSS 与主站同域站点行为不变
- 观众站点改版后做种数解析失效(新版
span#seeders,旧div#peercount已移除),补充新版选择器,PEER_COUNT 恢复正常 - 删种/停种规则日志补 [Brush] 前缀,日志页可按来源归类检索
- 首页看板重设计(前端仓库同步发版):KPI 卡整卡可点击跳转对应页面、环比趋势徽标(电视剧按"今日新增剧数"口径,后端入库统计新增
tv_series_nums按天去重 TMDBID)、系统状态卡(CPU/内存环形图 + 存储进度条 + 下载器负载,30s 轮询)、入库趋势 7/30/90 天切换、最近入库通栏海报墙;配色统一 Tabler 主题变量 - 站点数据统计页重设计(前端仓库同步发版):站点多时图表 TopN 截断展示并标注、跨图统一站点颜色映射(图例/曲线/扇区同色)、暗色模式图例与坐标轴文字修复、今日流量卡与图表卡样式统一、近 7 天/30 天零增量站点自动过滤
- 系统状态接口新增 CPU/内存占用:
/system/status与/system/info返回cpu_percent、memory_percent、memory_used_mb、memory_total_mb - M-Team API 域名迁移至 api.m-team.cc:站点配置、字幕下载接口统一按站点定义动态解析
api.base_url,移除废弃MT_URL常量 - M-Team 自动签到适配:浏览器指纹类请求头从站点维护 headers 合并(核心认证头不可覆盖)、UA 缺省回退系统 UA、webversion 缺省取站点当前前端版本、签到成功判定兼容字符串状态码
- CookieCloud 同步补写 LocalStorage:M-Team 等 JWT 登录站点 Cookie 同步后免 Cookie 亦可签到,手动/定时同步行为一致
- M-Team 字幕下载与签到在旧域名 api.m-team.io 下的失效问题(随域名迁移一并解决)
- 刷流删种/停种条件语义反转修复:
freestatus/stopfree现为“Free 到期才删/停”——仍免费保留做种,变非免费才触发(此前前端存值Y命中恒删/恒停,免费种子刚进即被删/停) - 刷流重复进种:RSS enclosure 为一次性签名链接(sign 每轮变化)时改为按详情页
/detail/{id}tid 去重;新增“近期已删除种子”记忆,删除过的种子 RSS 再现时跳过,杜绝 进→删 死循环 - 配套新增删种/停种到期语义与去重回归测试
- 插件市场:远程源(官方源一键添加/自定义源)、catalog 同步/审计门禁(sha256 + SAST)、目录浏览与详情懒加载、定时自动同步、可更新检测与安装/更新/启用/卸载全链路,市场页完整落地(来源/分类标签筛选、SAST 预检弹窗)
- 站点级免费活动补判时间窗兼容 ISO 与 epoch 秒/毫秒,M-Team 全站免费活动期间刷流选种/删停种正确生效
- RSS 轮询单条资源异常不再中断整轮:识别与逐条处理补兜底并落完整堆栈;过滤引擎对空 rev_string 条目不再把 None 传入正则
- 插件注册表保存清单改为同 id 更新,修复残留清单导致安装 Duplicate PRIMARY
- qBittorrent 磁力支持 32 位 base32 infohash;添加失败必记 qB 原始返回(重复种子会提示 Fails.)
- Jackett 索引器列表请求补 apikey,避免登录会话失效时空列表
- 下载任务引用已删除下载器时自动清理历史并聚合日志,消除"下载器配置不存在"每 5s 刷屏
- 前端日志页选择来源/级别后返回"共 0 条"实为 24h 全量扫描超时:改 mmap 检索并加命中截断(truncated 标记与提示)
- 移动端侧栏/布局恢复模板行为(logo 旁按钮抽屉展开菜单 + 遮罩),与官方表现一致
- 日志写入治理:缓存命中/未命中、标签隔离、消息模板渲染等高频 DEBUG 收敛或移除,日写入量降 10 倍以上
- 日志默认级别改为 INFO;轮转大小与保留天数支持配置并在设置页开放
- 启动自动清理超期轮转日志
- M-Team 全站免费活动期间种子上传者折扣徽标未更新(大量仍显示 50%/普通),刷流“只看免费”误拒导致不进种:种子详情按站点级活动规则(
promotionRule,含起止时间有效期校验)补判免费,活动结束即失效
- 识别历史列表海报富化:按 TMDBID 自动解析海报(TMDB 缓存优先,缺失回源一次并进程内去重),前端卡片可直接展示
- 站点抓取全面支持"直连优先 → 失败/反爬挑战自动 nexus-chrome 降级":种子详情、用户信息、HTML 搜索统一口径;直连非 2xx(403/429)也视为失败触发降级;仅对已开启浏览器自动化的站点生效
- 内置索引器 HTML 站点搜索同步"直连优先 → chrome 降级"(chrome 开启时)
- 已下载列表接口开放 page_size(默认 30,上限 200)
- 索引器单站搜索自适应超时支持环境变量调整(
NEXUS_MEDIA_INDEXER_TIMEOUT上限默认 45s、NEXUS_MEDIA_INDEXER_TIMEOUT_MIN下限默认 15s)
- nexus-chrome 会话清理真正生效:
ChromeTransport.close()长期被httpx2.BaseTransport.close()(空实现)遮蔽,非持久会话永不删除导致会话/标签页堆积;现降级请求完成后即关闭会话,用完即删 - 浏览器持久会话开关(browser_persistent)全链路透传:需长期保持认证态(挑战/2FA 已过)的站点可开启,会话跨请求复用、避免每次重新过盾
- 刷流删种落库元组解包错误修复
- 刷流详情属性并入统一缓存 + RSS 并发预取,任务生命周期取实时状态,降低站点限流压力与重复抓取
- Rousi 签到失败时记录底层异常原因(疑似签到已生效但响应异常,便于定位)
- HR"未知不下载"仅对实际限制 HR 的规则生效:#/N/空(不限)不再抓详情或误停下载(修复无 HR 站点受影响)
- AI 助手接入系统配置能力:配置读写、消息通知渠道、插件启停与配置、下载器/媒体服务器/索引器/刮削、媒体库目录、目录同步、批量配置清单(config_apply_manifest),附对话式配置向导
- 系统日志检索支持"近 N 小时"时间窗口(默认 24h),按文件修改时间跳过旧日志;AI 助手可查磁盘历史日志
- 刷流任务删除加固:站点/下载器已删时删除不再被构建异常阻断(DB 行照删)
- 启动时自动清理站点已删除的刷流任务(孤儿任务不再隐藏且反复注册)
- 刷流选种"排除已订阅"规则:rss_sites 兼容 JSON/逗号存储、media_info.site 赋站点名,修复崩溃导致规则静默失效
- 刷流种子详情属性抓取失败按"未知"处理:不再把仍免费的种子误判为免费到期而反复删种/停种,HR 未知不再下载
- qBittorrent 添加种子失败时记录下载器实际返回信息,便于定位
- 精简高频噪音日志(站点/索引器正常结果、进度追踪、分布式锁等),真实告警不再被淹没
- 删种规则不依赖 free/hr 时不再逐种子抓取详情页,降低站点限流压力
- 刷流详情支持浏览器自动化:指纹 + Cookie + 渲染,可过 Cloudflare/2FA 站点
- 站点管理新增"保持浏览器会话"开关(浏览器会话按站点持久可选)
- M-Team/Rousi 刷流识别:标签解析、tid 提取、RSS 域名匹配
- 刷流任务删除加固(构建失败不阻断删除)
- 下载器种子状态字段补全:平均上传速度准确值 + 缓存,做种种 ratio/上传/做种时间
- 日志来源统一与噪音抑制(HTTP/websockets)
- 日志来源统一化:日志调用处统一为规范组件名(大小写、中英混用、小写模块名/函数名噪音),来源下拉不再杂乱
- 日志噪音抑制:屏蔽 httpx2/httpcore2/websockets 的 DEBUG 帧与追踪日志(HTTP 请求追踪、keepalive PING/PONG),避免刷屏与磁盘膨胀
- 日志页筛选:筛选/搜索模式下停止实时流,避免未过滤日志污染搜索结果
- 系统日志支持全量搜索与导出:搜索与导出不再受内存缓冲约 2000 条限制,改为读取磁盘日志文件(含轮转文件)全文检索;新增来源全量列表接口供下拉筛选
- PostgreSQL/MySQL 数据库兼容:
- 过滤规则初始化
INSERT OR IGNORE适配错误修复(PostgreSQLON CONFLICT前残留分号导致语法错误;恢复规则组直接执行原始 SQL 未适配) - 刷流任务体积统计
cast为 INTEGER 在 PostgreSQL 下超过 2^31 溢出,改用 BIGINT
- 过滤规则初始化
- 系统日志页来源筛选下拉闪烁修复:来源选项改为稳定累积集合驱动,不再随实时日志流每次刷新重建导致无法选中
- 消息通知渠道全面插件化:除 Telegram/微信/内置消息页外,全部第三方渠道(Bark/Chanify/Gotify/IYUU/ntfy/PushDeer/PushPlus/Server酱/Slack/Synology Chat/Webhook)迁移为插件,按需启用;第三方依赖随插件 manifest 自动安装;渠道图标随插件分发
- 新增飞书消息插件:企业自建应用长连接双向交互(搜索/订阅/下载/卡片按钮分页),带图通知(海报随通知推送)
- 新增钉钉消息插件:Stream 长连接交互 + 会话精准回复(无需群机器人)+ 机器人单聊主动通知 + 图片海报
- Slack / Synology Chat 交互渠道迁移至插件公开回调(apikey + IP 白名单校验),旧回调地址自动重定向
- 下载器插件化:迅雷 / Aria2 迁移为插件;不支持 PT(私有站点种子自动拦截),不可用于刷流
- 媒体服务器插件化框架:注册表/测试连接/生命周期开放,新媒体服务器类型(如极影视)可经插件接入
- 站点匹配支持主站与 RSS 域名分离:用户配置的 RSS 域名自动识别种子归属,功能访问始终走主站
- Docker Compose 按部署场景拆分:基础(SQLite+Redis)/MySQL/PostgreSQL 三个独立文件;密码统一走
.env必填校验;数据库迁移由后端启动自动执行(移除独立 migration 容器,消除 Web UI 误报)
- 刷流多项修复:
- 存活天数(alive_time)删种规则时区错误(naive/aware 相减)修复,规则恢复正常生效
- H&R 数量上限改为实时统计下载器中带 HR 标签的做种数(此前进程累计只增不减,达上限后永久封死)
- 下载器不可达不再误判为"0 个下载中"放行;删种流程不再误清种子记录(
get_torrents不可达返回 None) - 删种统计计数取反修复(此前删除失败的被计为已删除)
- 未完成但暂停(pausedDL/stoppedDL)的种子正确归入下载中,dltime/pending_time 规则生效
- hr_time 规则加 HR 门控(非 HR 种子不再按 HR 做种时间被误删)
- 已删除种子可重新进种(去重查询过滤删除记录);下载失败种子不再被缓存 1 小时,可重试
- processed 缓存按任务隔离,任务间不再互相影响;dlcount 加下载器级互斥,并发不超额
- qbittorrent 下载中任务数不再把已完成(暂停做种)的任务计入(刷流同时下载数规则精确)
- 插件框架渠道扩展点:插件公开回调注册、渠道标识字符串化、
get_search_types动态化、回调安全加固(真实来源 IP、body 限流、依赖白名单) - 消息/下载器插件生命周期统一:启用按需加载(防双连接)、禁用记录随动停用、渠道/下载器实例由用户手动创建
- 内置消息页渠道(WebMessage)保留核心,图标/说明完善
- 转移-刮削解耦:刮削(NFO/图片/FFmpeg)从转移逐文件热路径移出,改为后台异步队列(3 并发);目录同步刮削同步异步化。转移吞吐不再被刮削的网络调用/FFmpeg 阻塞,刮削失败不再影响转移
- 图片下载全局限速:所有刮削来源(异步队列/整库/手动)的图片 CDN 请求并发封顶 4,避免大批量刮削请求突发
- nexus-chrome 增强:支持可选 API 鉴权(
AUTH_PASSWORD,启用后需在实验室「访问凭证(API Key)」配置);数据统一持久化到宿主机./data/chrome(指纹数据库/会话/指纹画像/浏览器用户数据),重建容器不丢失;旧版本数据迁移见安装文档
- TMDB 识别优化:识别结果改为 Redis 持久缓存(7 天,重启不丢),未命中结果负缓存 1 天;新增全局识别并发信号量(8);批量识别并发 2→8;TMDB 限速 2.5/s→4/s、等待超时 30s→60s。实测批量识别冷启动 ~1.6 条/s,重复识别秒级完成
- 订阅搜索分批限额:每轮最多处理 20 个订阅(
subscribe.batch_limit可调),其余保持 PENDING 下一轮继续,避免大批量订阅一次性挤占 TMDB 全局预算导致交互式搜索变慢
- 重新识别跳过无效项:未识别项路径已不存在(已转移/删除)的直接跳过,重复 ID 去重,避免无效识别
- 刷流优惠状态变化后不再被永久忽略:已处理种子缓存由永久 set 改为 TTL(1 小时)过期,种子上架后转免费/2X 等时变状态变化可重新评估进种(此前首次评估未免费则被永久缓存,优惠开始后也不再处理)
- 刷流任务站点标识统一解析:缓存建立站点配置 id/名称双向索引,
get_sites按数字 DB id 或配置 id/名称一致解析,修复 TTG、ourbits 等以站点配置 id 创建的任务在刷流重启后消失的问题 - 站点 id 统一为 DB 主键:启动迁移把刷流任务配置中 id/名称形式的 SITE 修正为 DB id,后续所有查询统一走 DB 主键,消除多源不一致
- 刷流任务加载容错:单个任务构建失败跳过不中断整个加载循环,避免重启后只剩部分任务(之前某任务异常会中断加载)
- num_filesize 对非大小文本不再报错:站点页面结构变化导致大小字段捕获到日期时间时,直接返回 0,不再记录
could not convert string to float错误刷屏
- RBAC 初始化懒加载报错:创建角色/用户后 ORM 实例已游离,访问
permissions/menus/users/roles触发DetachedInstanceError(日志刷屏)。改为创建后重新查询并预加载关联,消除游离实例懒加载
- nexus-chrome 认证支持:nexus-chrome 启用
AUTH_PASSWORD后,浏览器自动化请求自动携带凭证(API Key / 管理 token)。凭证统一读取实验室配置chrome_admin_token(复用该字段,同时兼作画像配置中心推送凭证) - 实验室设置新增「访问凭证(API Key)」配置项(系统设置 → 基础设置 → 实验室)
- 文档:configuration/installation 补充凭证配置说明
- 设置模型补
chrome_admin_token字段(此前保存实验室配置时该值会被丢弃)
- 版本号与前端同步至 4.11.3(本次为前端修复:图表渲染无限递归导致浏览器内存暴涨/OOM,后端无功能改动)
- 刷流任务重启后丢失:任务列表查询改 LEFT JOIN,站点被删除/ID 不匹配的任务不再被过滤(之前 INNER JOIN 导致任务在数据库存在但重启后从界面消失)
- 站点数据刷新时间:支持逗号分隔多个时间点(如
00:05,12:00,18:00),热重载自动清理多时间任务
- 站点数据统计精确化:每日 00:05 抓取"日界快照"作为当天历史基准(对齐自然日),配合 6 小时周期刷新保持实时值;前一天增量 = 当天日界值 - 前一天日界值,当天增量 = 实时值 - 当天日界值
- 观众(audiences.me)签到误报失败:签到页 Turnstile 通过后显示"今天已经签到过了",成功标记未匹配导致误报"人机验证未完成";新增签到成功/已签标记,配合 nexus-chrome 复选框定位修复
- 未配置 nexus-chrome 时指纹同步误报失败:改为正常跳过(不再返回"指纹同步失败(nexus-chrome 不可达或未配置)")
- 多后端存储与转移:同后端转移走服务端 COPY/MOVE 免本地暂存;多后端镜像转移/上传(串行队列,已启用后端均完整收到结果);手动转移支持远程存储源并显式指定目标后端
- 蓝光原盘远程源:后端感知检测 + 整盘复制
- 多后端剧集目录:更新时优先选择已有该剧集的目录
- 下载目录均衡:下载器多保存路径按剩余空间均衡选择
- 存储后端实测修复:SMB/OpenList/WebDAV 的 move/rename、跨目录复制、非标准端口、中文路径上传与空目录
- 消息通知竞态:客户端类定义时自动注册,修复启动竞态导致通知失效
- 本地刮削整理重命名为英文:TMDB 语言改为线程本地存储,消除并发(识别/别名补取)覆盖导致的英文标题写入
- HTTP 客户端迁移:httpx 全面迁移至 httpx2
- 部署文档补充容器间网络互通排查(连不上 mysql/网桥残留导致超时);compose 示例显式声明网桥、mysql 健康检查并等待就绪
- 站点配置更新源可配置:新增
pt.sites_update_url配置(支持PT__SITES_UPDATE_URL环境变量),可指向自建站点配置源;默认仍为 nexus-media-sites 官方 release - 站点 id 统一小写:14 个站点 id 规范化(U2→u2、PANDA→panda、HDKylin→hdkylin 等);配套 Alembic 迁移自动重映射存量数据(索引器配置/刷流/订阅/用户 RSS),
get_by_id兼容旧大小写,升级无需手动干预 - 站点配置 schema 完善:补齐解析器实际读取的字段(nested 模式 torrents、html_field 扩展、torrent_attr.response、user_info 等),新增 validate.py 语义检查(重复 id/未知键/废弃过滤器)
- 站点配置缺陷:chdbits
defualt_value拼写错误、ourbits 字符串过滤器(后端解析器不支持)修复 - 站点配置清理:移除 95 个站点中不生效的废弃过滤器(trim/dateparse 等)
- YemaPT 适配新版开放 API:搜索/用户信息/下载迁移到
/openApi/*(AuthKey 认证);api_chained下载支持 POST 与下载凭证 URL 编码
- WebDAV 目录列表:href 去服务器前缀 + URL 解码(中文/空格文件夹名不再乱码或为空);请求路径百分号编码(进入含空格/中文的子目录不再返回空);exists 支持 HEAD 405 回退 PROPFIND
- 目录同步监控:远程源与本地不存在目录跳过文件系统观察器、仅追加已成功启动的观察器(修复监控反复启停、线程 join 异常)
- 媒体身份识别体系(ADR-014):统一身份解析/匹配分层(别名索引、edition 图谱、IdentityResolver、TargetMatcher),灰度开关控制渐进转正;订阅匹配与搜索过滤接入统一判等,quick_name_match 降级为召回
- 识别链路增强:置信度端到端透传、外部解析 Work 学成回写(冷→热闭环)、集数重映射覆盖 RSS/分组路径、identity 模块 DI 收敛
- 英文标题识别失效:identify_batch 去重/组装键归一化不一致致英文标题 lookup 结果丢失,修复后恢复
- 站点解析修复:Rousi 自动签到适配 Peergo 新架构;移除 rousi.zip 重复定义;FRDS 做种统计;audiences.me 加入日期 / hhanclub 用户名
- RBAC 安全加固:默认管理员删除/改名后不再重启复活;禁止删除最后一个超级管理员、禁用或删除内置 superadmin 角色;超管判定改为角色制,清理无用 is_superadmin 字段
- 首次登录提示:仍使用初始默认密码时强制引导修改
- 资源搜索:新增分辨率过滤维度;失效搜索会话的进度条不再挂死
- TMDB 搜索:失败与无结果可区分提示,不再误报"未找到相关媒体"
- 订阅签到误报"挑战未通过":挑战特征收窄避免命中内嵌 Turnstile,增加内嵌验证等待与真实指纹画像
- 标题解析将 "100-nin"、"The 100 Girlfriends" 误判为集号
- Agent 网页搜索:新增 web_search 工具,通过内置 Chrome 搜索 Google/Bing/Baidu,主引擎不可达时自动降级
- 站点资源每页数量:
page_size透传站点请求,前端选择值直达站点
- 首次加载请求超时:启动初始化移入后台线程,未就绪时快速返回 503,前端自动退避重试、就绪后自动恢复;指纹同步与图片代理同步调用移入线程池,不再独占事件循环;路由初始化失败兜底服务不可用页,插件资源加载增加超时与退避;瞬时网络故障不再误踢登录
- 高清杜比(hddolby)搜索:API 改用 application/json 提交、剔除空数组参数、Content-Type 去 charset,修复非空分类返回 500、每页仅 10 条分页失效与空关键词浏览回归
- 站点资源分页:返回
has_more(前端不再用幽灵 +1 计数),API 站每页数量按站点实际参数名(pageSize/size 等)覆盖 - 转移历史去重加固:仅信任源路径存在的历史记录,目标存在性检查支持存储后端
- 索引器统计竞态:
last_error共享实例属性被并发搜索污染,成功搜索被误记失败
- nexus-chrome VNC_PASSWORD 必填:禁止使用默认密码,未设置时 compose 启动报错提示
- 铃铛未读角标可关闭:通知弹窗新增「未读角标」开关(localStorage 持久化),关闭后隐藏铃铛红色数字/圆点,通知列表功能不受影响
- 移动端指纹保护:站点已由桌面端指纹设置时,移动端提交仅同步独立画像(
user_{id}_mobile),不设置默认画像、不覆盖站点 UA/请求头,避免 PC/移动指纹交替触发站点风控(API 返回site_skipped/site_skip_reason标识) - 自动化浏览器污染指纹:前端跳过
navigator.webdriver/ HeadlessChrome 等自动化/无头浏览器提交,防止测试会话覆盖真实浏览器指纹
- 浏览器指纹未写入站点 UA/高级请求头:指纹同步误写入索引器配置表(
INDEXER_SITE_CONFIG.DEFAULT_SETTINGS),而运行时站点请求、索引器搜索与前端维护页读取的站点配置表(CONFIG_SITE)未生效;现改为写入站点配置表(NOTE.ua/NOTE.headers/HEADERS列),启用状态取自索引器配置,仅覆盖 UA 相关键、保留用户自定义认证头 - UA 重复展示:指纹 UA 仅写入站点「认证信息-User-Agent」字段,高级请求头不再重复写入 User-Agent(保留 sec-ch-ua / Accept / Sec-Fetch-* 等 Client Hints)
- 移动端指纹覆盖桌面端:站点已由桌面端指纹设置时,移动端提交仅同步独立画像(
user_{id}_mobile),不设置默认画像、不覆盖站点 UA/请求头,避免 PC/移动指纹交替触发站点风控(API 返回site_skipped/site_skip_reason标识) - 自动化浏览器污染指纹:前端跳过
navigator.webdriver/ HeadlessChrome 等自动化/无头浏览器提交,防止测试会话覆盖真实浏览器指纹
- Agent 推理强度与思考模式:全局配置
agent.reasoning_effort(low/high/max,默认 high)与agent.disable_thinking,统一作用于对话、媒体识别、意图解析、记忆抽取等所有 LLM 调用;聊天按次覆盖(推理强度下拉 + 深度思考开关),OpenAI 兼容/Ollama/Gemini 均映射原生推理参数,模型不支持时自动剥离降级 - 前端 CI 提速:去掉 windows 矩阵、pnpm 缓存改为 PR 也写入
- 4.7.0 启动失败:浏览器指纹路由
request: Request | None参数使 FastAPI 构建路由时报Invalid args for response field,应用无法启动(现改为必选Request)
- Agent 工具扩充至 40 个:新增下载历史、站点状态、订阅详情、刷流状态、数据总览、转移历史、用户 RSS、知识库状态、索引器统计、删种/存储状态、识别词管理(增删改)、插件运行
- 浏览器指纹注入站点:指纹 UA 与高级请求头更新到站点配置,区分 API / HTML 站点(Accept、Sec-Fetch-*、Client Hints)
- Agent 多轮上下文恢复:历史会话重新加载,修复"可以/继续"无法接续上文
- 索引器统计细化:超时/HTTP 失败正确计入失败(原全部计成功),耗时精确到秒级小数;首页新增成功/失败/耗时组合图
- 启动 ASCII Banner(Spring Boot 风格)
- 订阅下载动漫入库失败:转移时从父目录名/下载历史 SE 提取集号兜底;转移失败不再误报成功
- 站点高级请求头保留用户自定义认证头(仅覆盖 UA 相关键)
- 订阅续订断点推导:从订阅起点推导续订点(支持中途订阅——订阅从第 N 集开始跟踪时,历史只有 N 之后的集,现从 N 数起而非从第 1 集),
current_ep随转移/刷新同步推进(首个待下载集),历史推导只向前不倒退,避免重新订阅重复下载已转移剧集 - 订阅进度显示:转移完成事件同步推进
current_ep(此前只更新缺失集数lack,current_ep停在订阅创建值导致前端进度显示卡住) - Telegram 消息 HTML 转义:媒体通知改用
parse_mode=HTML+ 转义,文件名/番号中的_ [ ] ~ #等特殊字符不再触发 Telegram 400 "can't parse entities"、也不再显示原始符号 - Telegram 发布通知渲染:GitHub Release 通知的 changelog(markdown)转 Telegram 兼容 HTML(加粗、列表圆点、代码等宽、链接可点击),不再显示原始 markdown 符号
- 站点维护部分编辑保留认证:维护页只编辑部分字段时,未携带的 cookie/headers/api_key 等保留存量,不再被覆盖清空
- 内置索引器站点资源接口异常:
list()路径last_error未初始化导致/api/site/sites/resources报错 - 星空站点签到:star-space 访问首页即签到(服务端自动),补签配置(
p_index/index.php+ 登录态判定),修复签到失败
- 中文名缺失:TMDB detail 返回英文名时,中文名现从
translations(zh-CN/zh/zh-TW)兜底提取(原仅查alternative_titles),并放宽update_tmdbinfo_cn_title触发条件匹配所有中文语言配置(zh-CN/zh-Hans 等),下载/入库通知正确显示中文标题 - TMDB 缓存版本化:
TMDBCachekey 增加TMDB_CACHE_VERSION,中文名补全逻辑变更后旧缓存(存英文名)自动作废重建,避免 7 天 TTL 内持续显示英文标题 - 订阅搜索站点回退:订阅未配置
search_sites时回退默认订阅设置的站点(原空列表覆盖 → 0 站点搜索),RSS 未配置rss_sites时同样回退默认而非轮询全部站点 - Agent 会话并发竞态:
get_or_create并发创建同一会话时撞唯一约束,现捕获IntegrityError回滚重查,消除偶发 500 - 消息通知模板兜底:Web 等客户端无模板配置或空模板(
{})时回退默认模板,内置消息页入库/下载通知正确显示 emoji(此前纯文本) - 搜索进度失败站点汇总:"搜索完成"文本现附带失败站点(错误/超时)汇总
- 集数补全:
total_episodes从解析集信息补全(单集=1、多集范围=差+1),修复"共 0 集"显示 - 前端刷新状态:订阅卡片点击"刷新"后轮询拉取列表(最多 5 次),"搜索中"状态及时显示,无需手动刷新页面;消息中心单图通知改为企业微信图文卡片样式(图片横幅 + 文字区,固定最大宽度)
- Web 消息未读轻量接口:新增
GET /api/agent/message/unread(未读列表 + 未读数单请求),通知栏下拉不再拉全量历史 - 配置热重载全面覆盖:保存配置即生效,无需重启——
- Agent RAG / 知识库 / 长程记忆:embedding / vector_store / rag / memory 配置变更时自动重建(
agent_reload),废弃原"必须重启才可用" - Agent LLM Provider:default_provider / providers 的 api_key / api_url / model 变更热刷新
- 定时任务:
pt.ptrefresh_date_cron、subscribe.queue_interval、media.mediasync_interval/sync_transfer_interval、agent 记忆 ttl 等变更时自动重注册默认定时任务 - 媒体服务器类型切换:emby ↔ jellyfin 切换无需重启(连接参数本就懒读生效)
- ConfigReloader 支持快照对比(仅实际变更才重建)+ 失败隔离(单步骤失败不影响其他)
- Agent RAG / 知识库 / 长程记忆:embedding / vector_store / rag / memory 配置变更时自动重建(
- ConfigReloader:修复重建步骤返回
None时覆盖上下文字段的 bug(媒体服务器被置空导致定时任务重注册级联失败),仅非 None 时赋值 - 搜索季解析:支持英文季/集格式(
S02/S2/Season 2/S02E06/E06),修复搜索只返回 S01 的问题(此前仅识别中文"第X季")
- 知识库自动更新 handler 改为可重入注册(配置热重载重复调用不会重复订阅事件)
- AI 助手(消息中心):基于 pydantic-ai 重构 Agent 引擎——多步工具循环、推理内容实时 SSE 推送、工具调用事件流式下发(同名工具多次调用时步骤正确配对)、思考过程面板支持
- Web 消息通道:通知/回复持久化到
AGENT_WEB_MESSAGE(刷新/重启后恢复),内置消息中心页面 - Agent 记忆:会话/消息/长程语义记忆模型与迁移(
AGENT_CONVERSATION/AGENT_MESSAGE/AGENT_WEB_MESSAGE) - 知识库 ingest handler 与内置文档读取接口
- 已下载记录返回季集信息(
season_episode字段)
- 媒体识别:移除发布组剥离列表误伤真实片名的
sparks;抽取_post_process公共后处理统一identify/identify_batch/identify_files,消除"识别测试正常但转移识别错"的路径差异;副标题英文名仅在主标题缺失时采用,避免无意义目录名覆盖真实标题 - 下载优先规则:
_dedup、搜索展示排序、RSS 订阅初步排序统一尊重「做种数优先/站点优先」设置,做种数优先时做种数提到站点顺序前 - 刷流:等待时间规则改用进种时长并覆盖 Pending/Queued 等待态(原用未活动时间导致等待种子永不触发删种)
- 浏览器:挑战检测收敛为强特征并与 nexus-chrome 服务端对齐,修复普通页面文案(正在/请稍候/由 Cloudflare 提供)误判导致的 120s 空轮询
- 测试环境:
DATABASE__SQLITE_PATH配置真正生效,测试改用隔离临时库(修复全量测试清空真实data/user.db的问题)
- 代码规范:统一将延迟导入移至文件顶部(ruff PLC0415)
- DEBUG 模式默认关闭,生产环境不暴露
/docsAPI 文档 - 文档全面完善:新增 AI 助手、过滤规则、资源搜索、服务与调度、存储后端、用户与权限等文档页,更新全部截图(敏感信息打码)
- AI 助手(消息中心):基于 pydantic-ai 重构 Agent 引擎——多步工具循环、推理内容实时 SSE 推送、工具调用事件流式下发(同名工具多次调用时步骤正确配对)、思考过程面板支持
- Web 消息通道:通知/回复持久化到
AGENT_WEB_MESSAGE(刷新/重启后恢复),内置消息中心页面 - Agent 记忆:会话/消息/长程语义记忆模型与迁移(
AGENT_CONVERSATION/AGENT_MESSAGE/AGENT_WEB_MESSAGE) - 知识库 ingest handler 与内置文档读取接口
- 已下载记录返回季集信息(
season_episode字段)
- 媒体识别:移除发布组剥离列表误伤真实片名的
sparks;抽取_post_process公共后处理统一identify/identify_batch/identify_files,消除"识别测试正常但转移识别错"的路径差异;副标题英文名仅在主标题缺失时采用,避免无意义目录名覆盖真实标题 - 下载优先规则:
_dedup、搜索展示排序、RSS 订阅初步排序统一尊重「做种数优先/站点优先」设置,做种数优先时做种数提到站点顺序前 - 刷流:等待时间规则改用进种时长并覆盖 Pending/Queued 等待态(原用未活动时间导致等待种子永不触发删种)
- 浏览器:挑战检测收敛为强特征并与 nexus-chrome 服务端对齐,修复普通页面文案(正在/请稍候/由 Cloudflare 提供)误判导致的 120s 空轮询
- 测试环境:
DATABASE__SQLITE_PATH配置真正生效,测试改用隔离临时库(修复全量测试清空真实data/user.db的问题)
- 代码规范:统一将延迟导入移至文件顶部(ruff PLC0415)
- DEBUG 模式默认关闭,生产环境不暴露
/docsAPI 文档 - 文档全面完善:新增 AI 助手、过滤规则、资源搜索、服务与调度、存储后端、用户与权限等文档页,更新全部截图(敏感信息打码)
- 重命名格式:新增独立「重命名」配置入口(配合前端芯片式格式构建器),后端新增字段目录 / 格式校验 / 实时预览 API(
GET/POST /api/media/name_format/*);格式串支持可选片段语法{field:模板}(字段为空时整段消失),新增source(片源)/media_type(类型)/category(分类)占位符 - 浏览器指纹:支持登录同步真实浏览器指纹画像,后台流程(站点定时刷新 / RSS 自动化等无用户上下文场景)复用该指纹;
render_normalize从browser_mode抽取独立模块 - 转移:
{en_title}/{episode_title}占位符在真实转移路径(MediaExistenceChecker)正确渲染,与设置页预览一致
- 识别:公开站站点标记(
[EZTVx.to]、www.UIndex.org、裸域名水印等)在 UnifiedParser 前置剥离,转移与媒体搜索入口行为一致,不再抢占片名;meta_info清洗正则补齐常见短顶级域 - 识别:自定义识别词(屏蔽 / 替换 / 集偏移)接入转移识别链路(
identify/identify_batch/identify_files),与meta_info一致,命中时输出 info 日志 - 订阅:RSS 轮询懒更新 TMDB 总集数(优先季详情集数,规避主详情
episode_count滞后),订阅自动补齐新增集 - 订阅:订阅完成后保留下载历史,重新订阅不再重复下载已完成的剧集(洗版订阅除外,仍允许升级重下)
- HTTP 客户端迁移至 httpx2(httpx 分支续作,API 兼容);项目改为源码运行(移除打包构建配置,
run.py注入src路径,pytest 配置pythonpath)
- 新增重命名格式渲染/校验/路径预览、识别词接入转移链路、站点标记剥离、meta_info 站点标记回归测试;全量测试通过(2200+)
- 文件管理器:新增目录创建(
POST /media/dir/mkdir)、文件批量移动/复制(/media/files/move、/media/files/copy)、文件下载(GET /media/file/download)与上传(POST /media/file/upload)接口;MediaFileService抽取_resolve_backend统一后端解析,新增文件名安全校验与批量操作部分失败聚合
- 识别:
search_tv_by_season首轮命中校验目标季存在,修复同名真人剧抢占动漫条目(如《更衣人偶坠入爱河》S02 误识别为日韩剧) - 识别:multi search 降级由「取首个名称命中」改为按名称/季/体量评分选优,稳定区分同名条目
- 识别:集名粘连修复剥离前缀中的发布组方括号与末尾年份,修复年份粘入片名导致 TMDB 查不到(如
KAIJU.GIRL.CARAMELISE.2026) - 识别:元数据 token 补充
ASSx2/SSAx2字幕轨标记,修复[WebRip 1080p HEVC-10bit AAC ASSx2]整段被误作片名 - 识别:前置发布组括号支持多组联合发布(
[Studio A&GroupB])及 fansub/raws/kissaten 特征词的带空格组名(如[Studio GreenTea&LoliHouse]) - 转移:修复字幕语言正则字符类缺失闭括号导致
PatternError中断字幕转移 - 转移:目标字幕已存在且大小不一致时改用序号标签(
.1/.2…),不再对已存在路径硬链接报File exists;单条字幕失败不再中断主文件与其他字幕转移 - 转移:字幕/音轨转移新增
dst_backend参数,目标判断与写入均走 StorageBackend(远程存储 link 自动降级 copy),与主文件转移路径一致
- 文件管理:页面对齐真实文件管理器交互重设计
- 订阅:搜索页/详情页订阅确认弹窗「编辑」按钮无效修复,打开编辑弹窗前拉取默认订阅设置预填
- 订阅:编辑弹窗先加载站点选项再填表单,修复默认订阅站点(rss_sites/search_sites)被空选项过滤清空
- 新增字幕/音轨转移本地与远程后端用例 11 例、按季搜索季校验与四例解析回归用例;全量测试通过(2100+)
- 初始化:
_execute_raw改用exec_driver_sql原样下发 SQL,修复正则非捕获分组(?:简体|…)被text()误解析为绑定参数导致默认过滤规则初始化失败、「中字」规则组(1002)从未创建的问题(自 v4.4.1 起);init_filter.sql的 NOTE 列 NULL 改为空串以兼容严格模式数据库 - 过滤规则:
get_filterrules弃用按 NULL 结尾的正则文本解析,改为 SQLAlchemy 内存引擎执行后读回结构化数据,修复/api/filter/rules报list index out of range - 删种:任务更新由「先删后插」改为原子 UPDATE,修复更新失败产生重复任务、任务 ID 每次变更导致调度任务反复重建的问题;tid 对应记录不存在时回退为新增
- 删种:预览接口无符合条件种子时返回空列表而非错误,前端不再误报红色错误提示
- 删种:候选筛选中分享率/做种时间/平均上传速度为 0 时不再参与过滤(原
is not None判定使 0 值条件误生效);候选列表站点列改用注册域名展示(去除 tracker 子域) - 插件:刷新媒体库/Webhook 订阅事件名
media.transfered修正为实际发布的media.transfer_finished,修复入库后媒体库从不刷新、Webhook 收不到转移完成通知 - 插件:种子标记 PT 判定改为查询并遍历全部 tracker(原仅判定首个 tracker 且限 5 条)
- 下载:自动删种任务页面整体重构,卡片式布局与刷流规则页统一,条件标签差异化配色,卡片底部操作栏(执行/预览/编辑/删除)+ 启用开关快捷切换,新增/编辑弹窗分组表单与字段帮助提示
- 新增过滤规则初始化执行、规则组解析、删种任务原子更新回归测试;全量测试通过(2100+)
- 识别:
name_extractor不再把字幕标签([JPSC_JPTC]/[SRT]等)当作片名,纯数字括号(集号)不再被当成标题 - 识别:新增罗马数字季标解析(
Ⅲ/III→ 对应季数),修复Mushoku Tensei Ⅲ类命名识别为 S01 而非正确季 - 识别:
compare_tmdb_names子串匹配阈值由 0.95 放宽至 0.85,兼容动漫罗马音标题的-kun/-chan/-san后缀 - 识别:multi-search 降级新增英文名/全部别名比对(
_match_tmdb_candidate),修复英文标题匹配不到中文 TMDB 名的问题(如 The King of Devil Beasts → 克雷瓦提斯) - 识别:
identify_files补全set_tmdb_info调用、改用完整 TMDB detail(含 origin_country/genres),修复动漫类型误判为 tv、剧集/电影分类落到根目录的问题 - 识别:
set_tmdb_info兼容 TMDBgenres字段(原仅读genre_ids),修复部分动漫因缺 genre_ids 被识别为 tv - 识别:电影分类改用 movie 规则(
rule_map.get("movie")),修复电影被归入 anime 规则导致分类为空、入库到 Movie 根目录(现正确进动画/华语/外语电影子目录) - 转移:
_do_transfer_file结合转移历史去重(tmdb+季+集),修复目标路径规则变化导致已入库剧集重复入库 - 转移:已存在(转移历史/目标文件已存在)不再计为失败,且不再进入消息聚合,修复「入库失败」误报与重复推送「已入库」消息
- 转移:
total_episodes按识别季集数正确设置,修复多集转移消息显示单集(S01 E04)而非「共 N 集」 - 转移:黑名单插入去重,避免定时转移每周期重复插入导致表膨胀
- 转移:聚合目录多条下载记录同属一部剧时使用其 TMDB 提示,修复聚合目录无法识别
- 目录同步:
_do_transfer支持处理文件夹内媒体文件(含真实媒体文件时),修复文件夹下载(如单集文件夹)不自动转移 - 签到:新增 FRDS(朋友)专属签到配置,访问首页
index.php即完成签到(该站无attendance.php),修复误走通用 fallback 的attendance.php导致 404「请检查站点连通性」
- 修正安装文档端口(前端 8080 / 后端 3000:8080)、Redis 配置(移除 redis.conf 挂载,改为实际命令)、数据库配置与迁移机制、目录挂载(NEXUS_MEDIA_DATA、/media)
- 新增开箱即用的简单 docker-compose 示例(前后端+Redis+MySQL 推荐版 / 仅前后端 SQLite 体验版)
- 同步修正 docker/readme.md、development.md、notifications.md、faq.md 中的端口引用
- 全量测试通过(2118 passed);新增字幕标签剥离、罗马数字季标、批量识别类型判定等回归测试
- 匹配:识别缓存命中时用当前解析重建资源字段(org_string/发布组/分辨率/音视频),不再返回首次缓存种子的过期资源字段。TMDB 身份(tmdb_id/名称/年份/海报)仍来自缓存避免重复查 TMDB
- 识别:名称识别测试
name_test用cache=False,始终返回当前输入的资源字段,避免展示首次缓存的错误资源信息 - 解析:剥离 FRDS
mUHD源标记(name_extractor._META_TOKEN_RE新增muhd),修复Green.Book...mUHD-FRDS.mkv识别为Green Book Muhd(名称残留 → TMDB 搜不到) - 解析:多括号标题(中/英/日 + 发布注释)的方括号层提取不再被自由文本层覆盖(
_extract_free_text仅填充缺失名称),修复[剧场版 鬼灭之刃...][自壓(付相關專輯)]取成发行注释 - 前端:服务面板 → 新增缓存管理弹窗(
GET/POST /system/caches),列出各缓存键数/占用/命中率统计,支持单个或全部清理 - 前端:缓存管理弹窗改为内联面板 NModal
v-model:show(修复子组件:show导致弹窗内联渲染在页面底部) - 前端:服务面板整体重构,使用
tabler-theme.css颜色系统(统计卡片加图标 + 服务卡片彩色标记 + Tabler 阴影/圆角/过渡) - 前端:名称识别测试
nameTestApi支持subtitle参数,传 description 提高多语言标题命中率 - 前端:未识别列表识别弹窗先打开再请求(加载动画可见),修复加载期间无动画
- 前端:
discovery/index.vue推荐项跳转搜索页字段mediaType→media_type,修复类型字段引用错误 - 前端:订阅(影视/剧集)页面移除未使用的
startSearchSSE解构,修复 typecheck 报错 - 签到:浏览器签到直接访问签到页
attendance.php(不再首页+点击);等待签到页 WAF/雷池挑战清除后判定;串行化浏览器签到(消除并发竞争) - 签到:
browser_transport关闭时删除对应 chrome 会话;docker-compose 缩短 chrome SESSION_TTL 为 30 分钟
- 搜索:新增
GET /search/progress/{session_id}SSE 进度流,WEB 搜索进度按会话隔离推送 - 系统:新增
GET /system/caches(缓存列表与统计)、POST /system/caches/clear(按名或全部清理缓存)
- 全量测试通过(2116 passed);新增 mUHD 剥离、多括号标题不覆盖、批量识别拉丁名直通回归测试
- 匹配:媒体 en_name 不再被日文/中文原名污染(
set_tmdb_info仅存拉丁名),缺拉丁名时补取 TMDB 英文标题,修复日漫(如克雷瓦提斯)搜索词缺英文名导致中字资源搜不到 - 匹配:批量识别在 match_media 已知时,拉丁名(英文名)严格匹配即直通,不再因短中文名前缀被「全名共识」否决(修复中英双名种子误拒)
- 签到:浏览器签到改为直接访问签到页
attendance.php(GET 即完成签到),不再首页查找+点击,且等待签到页自身 WAF/雷池挑战清除后再判定,修复「已签到却误报失败」 - 签到:串行化浏览器签到(模块级锁),消除并发启动多个浏览器会话导致的 WAF 挑战超时误报
- 签到:
_PAGE_WAIT_TIMEOUT由 120s 放宽到 180s,给慢挑战更多余量 - 订阅:订阅搜索始终自动下载,不再受「搜索后自动下载」开关影响;WEB/手动搜索仍按开关决定
- 过滤:中字过滤规则重写,覆盖简体/繁體/中字/国语/国配/双语/CHS/CHT/内封中字等更全字幕标记,避免动漫中字资源漏过
- 浏览器会话:HTTP 浏览器 transport 关闭时删除对应 chrome 会话,避免
audiences:xxx等会话长时间残留(配合缩短 chrome SESSION_TTL)
- 搜索:新增
GET /search/progress/{session_id}SSE 进度流,WEB 搜索进度按会话隔离推送 - 站点资源:资源列表支持 TMDB 识别(前端「识别」按钮,复用
/media/name_test),资源列表服务附加解析级识别字段 - 前端:站点资源列表每个资源新增「识别」按钮,点击弹窗显示完整识别结果(名称/tmdbid/海报/季集/年份/资源质量)
- 未识别列表:识别弹窗改为先打开再请求(加载动画可见),修复「识别测试」加载期间无加载动画
- 全部通过;新增批量识别拉丁名直通、en_name 补全等测试
- 搜索:新增
SearchOrchestrator+SearchContext,统一 Web/交互式/订阅三条搜索路径 - 搜索:SSE 进度推送
GET /search/progress/{session_id},前端不再轮询,进度按 session 隔离 - 解析:统一解析器替换 anitopy(ADR-019),合并动漫/影视解析为单一流程
- 数据库:下载历史/订阅描述迁移 TEXT,转移历史新增种子字段与索引
- 搜索:
search_medias_for_web异常保护 try/finally,后台线程异常不再导致进度卡死 - 搜索:进度跨 session 串扰导致 SSE 提前返回,
get_progress改为 per-session 键 + 全局详细进度双读 - 搜索:豆瓣详情失败降级回退标题识别,不再炸掉整个搜索
- 解析:
~...~日文副标题提取为 episode_title,不再污染 cn_name - 解析:剔除【生】【附日字】等全角元数据标签
- 解析:后缀剥词保护剩余标题词,修复
A Ma等短标题被剥空 - 解析:片假名/平假名标题(如 ブラックトリック)判为 anime
- 解析:标题含 H264/x264 视频编码时不再误判为纯音频
- 匹配:en_name 精确/子串命中时校验 cn_name 衍生词(特别篇/OVA),拦截攻壳系列噪声
- 搜索:修复
search_year未定义变量、remap缺少end_episode参数
- 转移:
_lookup_download_record对目录/父目录聚合下载记录增加计数判断,杜绝整目录错误套用单个 TMDBID(批量误识别为同一剧) - 解析:季集号(SxxExx)后的集标题切分为 episode_title,不再并入主标题(
Medalist.S02E09.It.Begins→ Medalist) - 解析:预处理器不再剥离含空格的英文片名括号(
[Silent_Witch]→ 不再误判为 "12") - 解析:移除
watch元数据 token 误判(Witch Watch不再被剥词) - 识别:修复
identify_files去重 key 与组装 key 格式不一致,逐文件 TMDB 识别结果不再丢失 - 转移:标题有效性防呆——纯数字、过短、TMDBID=0 的识别结果拒绝入库,进未识别列表
- 转移:自动同步(监控/目录同步)不再覆盖媒体库已存在文件,仅手动转移可覆盖
- 转移:转移成功后无条件更新未识别状态,未识别列表不再残留
- 转移:
/api/sync/unknown/delete支持ids字段(前端批量删除未识别) - 消息:
transfer_finished通知模板补充季集显示(单集S01 E05、多集S01 共N集) - 签到:配置浏览器自动化的站点无专用 handler 时直接走浏览器签到,修复 HTTP 过盾失败误报
- 订阅:编辑订阅不再清空已配置的站点/集数(更新时 None 字段保留原值),修复站点设置刷新后消失
- 过滤:默认过滤规则改为幂等补齐(每次启动执行 INSERT OR IGNORE),新增独立「中字」分组(1002)
- 下载:HTML 站点种子下载始终携带站点 cookie(sign 预签名启发式仅对 API 站点生效),修复天空/HDSky 下载失败
- 搜索:WEB 搜索未显式指定站点时应用默认订阅设置的 search_sites(默认为空则不搜索)
- 搜索:
_filter_indexers站点过滤空列表 → 不搜索(订阅未配置站点不再搜全站) - 订阅:新增订阅时空数组也应用默认订阅设置的站点;已有订阅站点为空时搜索回退默认设置
- 前端:消息通知模板「重置」仅恢复默认模板,不再清空用户渠道配置/推送开关,修复重置崩溃
- 2114 项全部通过;新增统一解析器、真实标题、动漫标题、集标题切分、订阅更新保留字段等测试
- 匹配:
quick_name_match类型互斥 — MOVIE 种子不再匹配 TV/ANIME 订阅 - 匹配:
SequenceMatcher收紧(0.8→0.86, 0.7→0.75)防同名衍生(如 SAC_2045 匹配 2026 剧集) - 匹配:CJK
_cn_simplify分级阈值 — 全中文后缀含衍生词(剧场版/特别篇/OVA)→高阈值 0.65,含英文字母(SAC/GIG/TV)→高阈值 0.65,纯元数据(简繁内封字幕)→低阈值 0.4 - 匹配:英文名
mn in mmn通过时检查 cn_name 是否含英文字母后缀,防止 SAC/ARISE/GIG 等绕过 - 匹配:低置信(仅中文名)
quick_name_match通过后仍走 TMDB 识别,match_filter中 TMDB 未识别时拒绝而非回调 - 匹配:
org_string兜底检测[Movie]标签,补解析器遗漏的类型判定 - 匹配:
_EDITION_MARKERS词表(剧场版/特别篇/总集篇/特别版/OVA/OAD)强制高阈值 - 匹配:非 CJK
_cn_simplify子串加最小比率 ≥0.5,防极端短名误入长名 - 解析:
init_episode排除^\d+bit$,防止10bit/8bit被解析为 S01 E10/E08 - TMDB:
cn_name/en_name按字符类型判定而非绑定original_language,en_name不再受ja/zh影响 - TMDB:新增
get_tmdb_zh_title(language="zh-CN")自动填充中文标题 - 订阅:搜索时懒更新 TMDB 总集数 — 延迟更新的剧集自动同步到订阅,防止提前完成
- 转移:
existence_checker文件扫码名称匹配改为多语言子串(cn_name/en_name/title) - 转移:已下载检测新增
TRANSFER_HISTORYDB 查询优先,按 tmdb_id+season 查已转移剧集,跳过文件名语言匹配
- 新增 39 个
TestQuickNameMatch用例覆盖攻壳机动队全系列(SAC/ARISE/INNOCENCE/GIG/剧场版/特别篇/2026全集)+ Chainsmoker Cat
- TMDB:
search_tv/_fuzzy_match多候选匹配从「取第一个 anime」改为综合评分(名称相似度 + 关键词重叠 + 季号匹配 + 已完结加权),解决同名衍生作品被新版覆盖的问题 - TMDB:无集号标记时自动交叉搜索 TV/Movie,用
_fetch_allnames+ 综合评分比较选出最优类型 - TMDB:
search_multi_infos降级路径增加compare_tmdb_names名称校验,不再盲取第一个类型匹配的条目 - 解析:动漫名清洗增加年份(1900-2030)和批量关键词(Complete/全集/合集/Season N)剥离,解决搜索名过长导致 TMDb 返回 0 结果的问题
- 下载:
add_torrent_and_get_id种子已在 qBittorrent 时返回真实 hash 而非"EXISTS",不再跳过历史写入导致下载页不可见 - 订阅:
is_exists_download_history_by_tmdb(不限 STATE)改为is_completed_by_tmdb(仅 STATE=completed),已删除/失败的种子允许重新下载
- 解析:原始标题含批量关键词(
COMPLETE/全集/合集/BATCH/PACK/SEASON)时跳过跨类型 Movie 搜索,减少不必要的 API 调用 - 下载:文件列表 ≥3 个递进编号文件判定为 TV,1 个文件判定为 Movie,类型不一致时输出 warn
- 新增
TestScoreFuzzyMatch:综合评分 6 个维度(精确匹配、模糊区分、季号加分/惩罚、已完结、关键词重叠) - 新增
TestBatchKeywordsRE:12 种批量关键词模式匹配 - 新增
TestInferTypeFromFiles:文件列表类型推断 13 种模式
- 签到:修复浏览器回退逻辑对已有专用 handler 的站点(如 FreeFarm)仍然触发 Chrome 回退的问题,增加
is_dedicated判断和get_chrome_server_url()可用性检查 - 签到:浏览器挑战等待检测加入雷池 WAF 特征(
slg-bg、slg-box、雷池、安全拦截),避免误判为页面已加载 - 签到:修复
QuestionAnswerAgent.ready在 AI 服务未配置时None.ready空指针崩溃
-
签到:修复 API 响应中
\uXXXXUnicode 转义导致already_markers/success_markers匹配失败的问题(如 pterclub 猫站签到成功却被判定为失败) -
签到:修复
_http.py中config.get("success_markers") or DEFAULT把显式空列表[]当作 falsy 回退到默认标记的问题,导致 homepage-only 站点(ssd/春天、tnode/ZhuQue)永远无法匹配 -
签到:修复 HDSky/FreeFarm/Opencd/Tjupt 等 handler 签到 URL 使用
signurl(仅有域名),缺少各自的签到页路径(/showup.php、/attendance.php等),导致签到请求发送到错误的 URL -
签到:修复 HDSky handler 签到失败时错误提示为 "未获取到验证码"(实际已获取),改为显示服务器实际返回消息
-
签到:修复 FreeFarm handler
_check_cookie("login.php")误判 cookie 失效(页面正常也包含该字样),改为检查登录表单特征(type="password"等) -
签到:修复 Browser signin handler 固定
time.sleep(10/15)等待 Cloudflare 五秒盾不可靠的问题,改为动态轮询等页面稳定(最长 120s) -
签到:修复 U2/Tnode handler 硬编码域名(
u2.dmhy.org、zhuque.in),改为从ctx.site_url动态推导 -
签到:修复
_api.py/_wrap_auth使用 api_key 时手动拼接{header_name: api_key}header 而非使用ApiKeyAuth认证类 -
签到:修复
_types.py(BakatestQaHandler)和hdsky.py中cookies=CookieAuth._parse_cookies(cookie)裸传 cookies,改为auth=CookieAuth(cookie) -
签到:新增 HDUpt 签到 handler、新增 hhanclub/ssd 签到配置、删除已停运的 hdchina handler 及站点配置
-
RSS:修复 TTG/Ourbits/Zhuque/Starspace 等 handler 将
cookies=ctx.cookieraw string 传httpx.Client.request()导致 cookie 未生效、请求被拒绝(报 "请检查站点连通性") -
RSS:修复 MTeam handler 误用
ctx.headers取 API key(实际在ctx.api_key独立字段),改为ApiKeyAuth -
RSS:修复 YemaPT handler 站点定义配置为 cookie 认证但不传
CookieAuth、只读ctx.headers的问题 -
RSS:修复
_api.pymarker 匹配同样存在 Unicode 转义失败的问题 -
RSS:修复
_api.pyapi_key 认证手动拼接 header 而非使用ApiKeyAuth,且未从站点定义api.auth.header_name回退获取 header 名 -
RSS:MTeam/TTG/YemaPT/HDHome 从专用 handler 改为纯配置驱动的泛型 handler
-
RSS:新增 rousi RSS 配置(Bearer 认证 + API endpoint)
-
RSS:修复
_api.py_resolve_auth未从站点定义获取 auth header_name 回退的问题
- 删除已停运站点 hdchina(handler + 站点配置)
- nexus-chrome:修复
Session.close_tab()吞掉tab.close()异常导致孤儿 tab 累积;添加 CDPTarget.CloseTarget回退关闭
- 插件中心:修复
PluginRegistry.scan()每次请求都扫描内置插件并写入数据库,导致"已安装插件"页面加载慢/超时的问题;改为 60 秒节流,且 manifest 未变化时跳过数据库写入,保留热更新能力 - 启动速度:将
plugin_sandbox.load_all()、插件菜单同步、消息客户端初始化/菜单刷新从 lifespan 同步执行改为后台异步任务,缩短app.state.ready为true前的 503 窗口,减少前后端连接不上的情况 - 消息交互:修复
MessageCommandHandler只识别/ptr/ptt等精确斜杠命令,中文"订阅""搜索""下载"及/rss/ssa等订阅类命令被当作插件命令或漏到无响应分支的问题;现在统一路由到MessageSearchService并立即回复"正在搜索/订阅" - 刮削:修复
Scraper._scrape_tv/_scrape_movie所有步骤共用一个 try/except,任意一步(douban API、TMDB 季详情、fanart 图片下载等)抛异常即终止整条刮削,导致 TV/动漫即使元数据配置已全开,下载完成转移后仍没有任何 NFO/图片生成;现在每个步骤独立 try/except 容错,单步失败只记日志不影响其他刮削输出 - HTTP 图片下载:修复
HttpClient.request中用or短路表达式 popraise_exception,raise_for_status的默认True使or右侧永远不执行,导致raise_exception参数泄露到httpx.Client.request()引发TypeError;改为分别 pop 后逻辑或
- 新增
PluginRegistry.scan节流与 manifest 未变化跳过写入的单元测试 - 新增
message_webhook企业微信文本消息与 click 菜单事件路由的单元测试 - 新增
Scraper配置热加载回归测试
- 消息客户端:修复
active_interactive_clients用字符串search_type作为 key,但 Telegram / 微信 / Slack / Synology Chat 的 Webhook 与MessageDispatcher使用SearchType枚举查询,导致所有交互式客户端都匹配不到、提示未配置的问题 - 企业微信消息:修复
GET /wechat与POST /wechat只读取signature参数,而加密模式下企业微信实际发送msg_signature,导致 URL 验证/消息接收签名验证失败的问题 - 消息交互:修复
message_webhook处理消息时创建MessageCommandHandler未传入thread_executor,导致搜索/订阅命令被提交到线程池后未执行、用户发送消息无响应的问题 - 下载通知:修复搜索结果合并到原匹配媒体时
TmdbLookup.merge_media_info没有复制poster_path/backdrop_path/fanart_*等图片字段,导致下载通知的media_info缺失图片、使用 TMDB 占位图的问题 - 文件识别:修复
MediaService.identify_files批量识别文件时,从 TMDB 查回的结果没有写入poster_path/backdrop_path的问题 - 订阅匹配:修复
SubscribeMatcher中电影种子在rss_movies不匹配后仍可能落入电视剧订阅匹配的问题,导致订阅电视剧却下载到同名电影资源(RSS 订阅同样走此匹配器,同步修复)
- 新增
message_webhook路由企业微信msg_signature/signature参数兼容的单元测试 - 新增
TmdbLookup.merge_media_info图片字段合并的单元测试 - 新增
SubscribeMatcher电影/电视剧订阅类型隔离的单元测试
- RBAC 登录日志:用户不存在时
user_id由0改为NULL,并允许RBAC_USER_LOGIN_LOGS.USER_ID为 nullable,修复外键约束失败导致登录异常报IntegrityError - 企业微信消息:代理地址
default_proxy缺少 scheme 时自动补全为https://,修复unknown url type错误 - 企业微信消息:新增
GET /wechatURL 验证与POST /wechat消息接收,支持 Token 签名校验和 AES 加密消息解密,返回success响应 - Telegram:新增
secret_token配置,支持 Telegram 官方X-Telegram-Bot-Api-Secret-Token头部验证;同时修复 webhook 模式下_webhook_url从未被赋值的 bug - 消息客户端:修复
delete_message_client返回None导致 API 返回失败、前端无法删除消息客户端的问题 - 消息客户端:修复
upsert_client修改时删除旧记录再插入新记录导致 ID 变化、产生重复客户端的问题,改为存在cid时直接更新原记录 - 消息客户端:修复
ClientManager._ensure_loaded()只加载一次、不刷新已有客户端interactive/enabled状态的问题,导致开启交互后仍提示WeChat client not configured
- 新增迁移:将
RBAC_USER_LOGIN_LOGS.USER_ID改为 nullable
- 新增
WeChat代理地址规范化、URL 验证、消息解析/解密单元测试 - 新增
TelegramWebhook URL 构造与secret_token单元测试
- 自动删种:修复
filter_status按下载器支持状态校验导致Stopped等全局状态保存失败的问题 - 自动删种:修复
RemoveStrategy.from_dict未将字符串状态转换为TorrentStatus枚举,导致状态过滤不生效的问题
- 新增
TorrentRemoverService与RemoveStrategy状态校验/转换单元测试
- 删除任务:
TORRENT_REMOVE_TASK.NOTE列改为 nullable,修复插入时NOT NULL constraint failed错误 - 自动签到:前端历史记录请求文件路径从
signin_history.json修正为history.json,解决签到历史页面空白问题
- IYUU 自动辅种:补充
run()方法,支持调度任务/插件框架手动立即执行 - 系统日志:初始加载与 SSE 本地缓存上限从 200 条提升到 1000 条
- 自动签到:403/HTML/468 回退浏览器逻辑细化,异常时自动回退浏览器;Bakatest 问答路径类型加固;API 站点也允许使用通用 HTTP 回退
- TorrentMark 插件:manifest 配置项缺失逗号格式修复
- IYUU 辅种:站点引擎解析下载链接(genDlToken/api/HTML 统一)、
sites留空不辅种、start_torrents补downloader_id - 刷流
DOWNLOAD_ID为空时跳过入库(修复 NOT NULL 约束) - CookieCloud 混合认证站点 cookie 校验改用 HTML 登录态
- 自动转移做种:下载器选择改多选、
progress判准修正、路径容错 - 下载联动删除:
PluginContext.read_plugin_data跨插件恢复转种/辅种完整清理 - 自动签到:403/HTML/468 自动回退浏览器、U2 handler 大小写匹配、chdbits xpath 空结果守卫
PluginContext.read_plugin_data跨插件数据读取 API- speedlimiter / torrentmark manifest 补
downloaders字段
- RateLimitEngine 限流解析支持
1/2s/1/30s等分数间隔格式 - RateLimitEngine token_bucket 路径补
timeout>0阻塞循环(Redis/Memory 双后端统一) - Redis 限流后端 backend_rate 修正(不再乘 1000,Lua 脚本内部已处理 ms→s 转换)
- Redis 后端 NOSCRIPT 异常重载脚本重试
- IYUU 默认限流调整为
1/30s(匹配 reportExisting ~1 次/分钟的限制,避免触发冷却封禁)
- IYUU reportExisting JSON body 发送方式修复(缺少
sid_list) - IYUU API 默认限流从
5/s调整为1/2s,避免服务端限流
- 插件自定义 API 框架:
PluginContext.register_api(path, handler)+ 通用调度路由GET/POST /plugins/{id}/api/{path},支持插件声明式注册自定义接口,按 HTTP method 控制 view/manage 权限,sandbox 卸载时自动清理 - IYUU 自动辅种插件绑定站点功能:前端鉴权页面(
frontend/index.mjsDI render 组件,列表+行内输入+持久化徽章),后端 API(bindable_sites/bind_site)+bound_sites.json持久化记录;辅种任务 IYUU API 与站点级限流;manifest 补充 downloaders/sites 配置项 - IYUU 自动辅种插件适配当前服务层架构:
add_torrent/exists_torrents改为通过下载器客户端实例调用;种子下载链接补全 host+schema、剥离凭证占位符;_can_seedingTorrentStatus 枚举判定;_resolve_local_site支持 HTML 站点定义按名称匹配本地配置 - Depth Studio(dstudio.me)与 Sunny(sunnypt.top)站点 HTML 配置(NexusPHP table 模板,分类 401-409)
- CookieCloud 混合认证站点(api_key/bearer 类型)cookie 校验失败:改为按站点认证类型分流——纯 cookie/csrf 走引擎 test_connection,api_key/bearer 走 HTML 首页登录态校验
- 刷流已存在于下载器的种子(qb EXISTS 分支 DOWNLOAD_ID 为 None)插入
SITE_BRUSH_TORRENTS触发 NOT NULL 约束,改为跳过入库
- 新增 CookieCloud 插件校验、IYUU 插件(辅种+绑定+解析)、插件 API 注册表与调度路由、刷流入库测试(4 个测试文件,全量 1187 通过)
- 下载器设置支持浏览选择目录:新增
/download/downloaders/browse_dirs端点,通过下载器 API 读取默认保存路径、分类路径及已有种子保存路径;下载保存目录从下载器浏览选择,Nexus Media 访问目录支持本地/存储后端浏览选择 - 下载器客户端新增
list_remote_dirs能力:qBittorrent(默认保存路径 + 分类路径 + 种子路径)、Transmission(会话目录 + 种子路径)、Aria2(全局下载目录)
- 修复目录同步保存后目的目录丢失、点击编辑变新增一列的问题(前端请求字段
id/target与后端契约sid/dest不一致) - 修复目录同步列表目的目录、同步方式、目标后端显示不正确的问题(读取字段与后端返回
dest/operation/dst_backend_id不一致) - 修复服务面板同步目录列表为空的问题
- 新增下载器
list_remote_dirs单元测试与browse_dirs路由测试
- 探索页媒体卡片新增类型、国家/地区、语言元数据标签展示
- 探索页支持类型、地区、语言筛选,Bangumi 数据补默认元数据以支持筛选
- 刮削设置新增配置持久化:读取/保存到数据库
system_dict - 后端新增
/system/config/scraper读取与/system/config/scraper/save写入端点
- 推荐服务统一解析豆瓣 overview 和 TMDB 元数据并按白名单过滤
- 完善
media_metadata领域模块:统一类型、国家/地区、语言映射与聚合
- 修复 Bangumi 推荐数据缺失 genres/countries/languages 导致筛选为空
- 修复豆瓣 overview 解析演员名混入类型的问题
- 修复 HDDolby API 分页请求 content-type 格式
- 修复 btschool 站点配置 int 字段导致的 Jinja 渲染错误
- 自动签到(autosignin)插件站点驱动重构:签到 URL 从站点引擎动态读取,不再硬编码;新增配置驱动流程,支持 API、HTTP 和浏览器自动化三种通用签到方式(ADR-018)
- 自动生成 RSS(autogenrss)插件重构:内置站点生成器迁移到插件本地 handler 与注册表模式
- 新增通用 HTTP 签到配置回退
__fallback_http__.json - 新增
haidan、hares、hdarea、pterclubnet、yemapt等站点签到配置 - 新增
crabpt、railgunpt、xingtan站点定义配置 - 新增
hdchina、ttg、u2动态 token/表单处理 handler
- 统一浏览器自动化传输:
HttpClient在is_browser模式下直接通过BrowserModeConfig访问浏览器,上层无需额外分支 - 优化自动签到日志输出,包含站点解析、handler 选择、失败详情和重试名称
- Docker 构建优化:使用
uv sync --frozen --no-cache --no-install-package nexus-media避免构建挂起 - 容器服务命名规范化:
nexus-media-chrome→nexus-chrome、nexus-media-ocr→nexus-verify - 实验室设置页布局优化:服务开关与地址输入成对展示,禁用态随开关联动
- 修复 M-Team
localStorage域名解析从硬编码m-team.io改为实际站点域名 - 修复 CookieCloud
localStorage同步同时兼容dict和list格式 - 修复
btschool签到路径和成功判定(index.php?action=addbonus+ 不存在 “每日签到” 按钮) - 修复
rousi签到使用x-sign-token认证头 - 修复签到历史文件路径为
history.json - 修复失败站点自动进入重试列表逻辑,避免
retry_keyword误过滤 - 修复站点 ID 识别日志显示正确的定义 ID(
audiences、m-team、rousi、btschool) - 修复 Plex 客户端若干 pyright 类型报错(空值访问、返回类型不一致)
- 新增 autosignin API/HTTP handler 测试、配置存储测试
- 新增 autogenrss 插件测试
- 新增 OCR 基础设施测试
- 统一浏览器自动化传输:
HttpClient在is_browser模式下直接通过BrowserModeConfig访问浏览器,上层无需额外分支 - 优化自动签到日志输出,包含站点解析、handler 选择、失败详情和重试名称
- Docker 构建优化:使用
uv sync --frozen --no-cache --no-install-package nexus-media避免构建挂起 - 容器服务命名规范化:
nexus-media-chrome→nexus-chrome、nexus-media-ocr→nexus-verify - 实验室设置页布局优化:服务开关与地址输入成对展示,禁用态随开关联动
- 修复 M-Team
localStorage域名解析从硬编码m-team.io改为实际站点域名 - 修复 CookieCloud
localStorage同步同时兼容dict和list格式 - 修复
btschool签到路径和成功判定(index.php?action=addbonus+ 不存在 “每日签到” 按钮) - 修复
rousi签到使用x-sign-token认证头 - 修复签到历史文件路径为
history.json - 修复失败站点自动进入重试列表逻辑,避免
retry_keyword误过滤 - 修复站点 ID 识别日志显示正确的定义 ID(
audiences、m-team、rousi、btschool) - 修复 Plex 客户端若干 pyright 类型报错(空值访问、返回类型不一致)
- 新增 autosignin API/HTTP handler 测试、配置存储测试
- 新增 autogenrss 插件测试
- 新增 OCR 基础设施测试
- 新增
ocr_server_enabled远程 provider 测试
- 网页自动化(浏览器过盾)原生集成到
HttpClient:站点开启chrome开关后,抓取请求自动经 Chrome 服务器过盾(Cloudflare / 五秒盾 / 雷池)并复用 Cookie,上层调用点无需改动(ADR-017) - 新增站点级
browser_render开关:可选返回浏览器渲染后的 DOM(适配 JS 前端渲染站点),渲染 HTML 解析前自动剥离 tbody 归一化,现有直接子选择器规则无需修改 - 新增
BrowserSession/AsyncBrowserSession交互式浏览器会话客户端,用于签到等多步流程(navigate / click / input / execute / fetch) - 实验室配置新增
chrome_enabled全局开关(站点级仍需单独开启chrome)
- 签到(autosignin)、企业微信 IP 变更、自动生成 RSS 等插件改用新的
BrowserSession交互客户端 - 索引器透传
chrome/browser_render站点配置,浏览器模式判定不再依赖全局 Chrome 探活 HttpClientConfig默认超时提升,适配浏览器过盾耗时
- 修复 Alembic 迁移
oxrva77k36j6父节点挂接错误导致迁移链分叉出多个 head,alembic upgrade head失败、迁移无法执行 DOWNLOAD_SETTING.NOTE列改为可空,避免下载设置备注为空时写入失败- 备份时
config.yaml不存在(纯环境变量运行)导致备份中断,改为存在才复制 - 移除失效的旧
ChromeClient(仍在调用已下线的/tabs接口)
- 修复刷流删种规则所有 lambda 被调用时缺少
rv参数(rule_value未传入check_func),导致删种功能完全不生效 - 修复删种规则
values字典缺少hr键,HR 规则在 and 模式下错误阻止所有删种 - 修复
check_range_rule非数字规则值导致ValueError,单条种子异常影响整批删种处理 - 修复停种任务无异常守卫,单条种子异常会杀死整个停种调度周期
- 修复
avg_upspeed倍数错误(1024**3→1024),用户配置的 KB/s 阈值被放大百万倍,平均上传速度删种/停种规则永不生效 - 修复
dateutil.parser隐式导入依赖其他模块加载顺序
- 新增
BrushRuleEngine单元测试 114 条,覆盖check_range_rule/check_remove_rule/check_stop_rule/check_rss_rule/ 解析格式化 - 新增跨天时间段测试 10 条(如
22:00-06:00),验证刷流时间段跨天逻辑正确
- 修复文件名开头方括号中文剧名被误删(如
[虚颜]只剩英文名,导致刮削匹配错误影片) - 修复修改用户名导致权限丢失,支持修改用户名;编辑资料不再因空角色列表清空角色
- 修复 CookieCloud 同步后站点测试/搜索仍使用规范域名而非用户配置域名
- 修复 API 站点(M-Team/Zhuque)测试连接空 body 导致误报
- 修复菜单设置与插件菜单重启后被重置为默认
- 修复订阅卡片悬停闪烁、右边缘截断、移动端末尾卡片偏大
- 修复 Bangumi/TMDB 网页搜索/图片下载器等境外请求未走代理
- 修复代理在 socks5 及 https 键配置时调用方取不到
- 修复 cookiecloud 站点去重(按站点 id 保留最后一条并防止重复新增),同步结果标注具体域名
- 订阅 TMDB 信息贯穿下载/转移/刮削全链路,文件转移与刮削可直接使用订阅时确认的 TMDB 身份,避免依赖文件名解析
- 菜单管理增加「重置到初始状态」功能,支持恢复误修改的内置菜单
- 菜单新增 IS_BUILTIN 字段区分内置与用户自建菜单;删除内置菜单后记录墓碑,重启不重建
- 代理配置归一化:
app.proxies中http/https任一键配置即全局生效,支持 socks5/socks5h
- 站点维护新增「批量测试」:可勾选站点后并发测试连通性,展示成功率、延时与失败原因
- CookieCloud 同步支持域名择优:在同步域名 / 当前签到域名 / 配置别名中,按可用性、稳定性(成功率)与延时自动选择最优域名(带迟滞防抖)
- 媒体详情「已订阅」显示具体订阅的季;探索 / 详情 / 资源搜索页多季电视剧支持追加与管理订阅(勾选订阅、取消勾选退订)
- 修复多季订阅退订不生效(季号存储格式
S01与前端1不匹配导致删除条件不命中) - 资源搜索:切换页面再返回时恢复当前搜索进度与结果,而非展示上一次的旧结果;修复「正在搜索」标题为空
- 资源搜索海报卡片点击进入媒体详情,不再直接触发搜索
- 站点测试连接、搜索、详情页链接改用用户配置的站点域名(签到域名 / 别名),不再固定使用站点规范域名
- 修复 API 站点(M-Team / Zhuque 等)测试连接误报密钥失效 / 连接失败:POST 空 body 改为发送
{},登录判定兼容code/status成功响应 - 用户管理修改用户名后权限丢失:编辑资料不再因空角色列表清空角色;支持修改用户名;修复邮箱校验属性名错误
- CookieCloud 站点去重(按站点定义 id 保留最后一条并防止重复新增),同步结果标注具体域名,仅在 Cookie 实际变化时记为「已更新」,新增站点优先级递增避免重复
- 媒体库首页接口并发获取媒体数量 / 播放历史 / 空间 / 媒体库 / 继续观看 / 最新入库,显著降低耗时并放宽前端超时
- 资源搜索 1000+ 结果卡顿优化:分组分页渲染(默认 30 条,可加载更多),折叠分组不渲染
- 「更多推荐」页卡片统一为通用媒体卡片
- 订阅季选择框改为从左到右自适应网格;修复电视剧订阅管理页卡片竖排、订阅卡片悬停闪烁、右边缘悬浮面板被截断、移动端末尾卡片偏大等布局问题
- 移除重复站点配置
ptchdbits.json,并入chdbits的域名别名
- 电影/电视剧订阅支持「只订阅免费」:订阅可设置仅匹配免费/促销资源
- 修复免费/促销状态识别错误,避免非免费资源被误判
- 修复 M-Team RSS 订阅下载失败:预签名下载链接(dlv2 的
sign参数自带认证)不再附加站点 API Key,避免被当作 API 认证返回 JSON 错误;enclosure 链接过期时自动用详情页 tid 重新申请新链接重试 - 修复插件框架加载时从未注册 manifest 声明的事件钩子,导致
on_hook(plugin.config_changed等)全部失效 - 修复 RBAC 角色查询在 session 关闭后访问懒加载关系触发
DetachedInstanceError刷屏日志,改为selectinload预加载 - 修复搜索进度任务完成后返回 0 导致前端轮询无法结束
- 修复搜索结果制作组为空时显示空按钮,改为显示"未知"
- 修复媒体搜索有结果时仍显示"未找到相关媒体"空状态
- 修复多站点做种数据解析(hhanclub/hdsky/star-space/织梦等 NexusPHP 站点):自动检测表头列索引、支持 JS 分页、用户详情页汇总提取、修复字符串逐字符遍历导致的 IP 统计错误
- 内置索引器关键字搜索支持自动翻页(最多 5 页),修复海贼王等长剧集只能获取首页 100 条数据的问题
- 新增「站点分享率监控」插件:定时检查各站点分享率,低于阈值发送通知,自动排除第三方索引器
- 新增「Tracker 管理」插件:批量替换下载器中种子的 tracker 地址,支持正则匹配
- 应用层 DNS 映射:
HttpClient/AsyncHttpClient支持host_mapping及全局映射注册,请求时动态解析无需重建连接池 customhosts插件改为应用层 DNS 映射,无需 root 权限修改/etc/hostsPluginContext新增get_plugin_config/set_plugin_config跨插件配置 API- 下载器客户端补充 tracker 增删改方法
- 站点详细数据对无上传下载的不活跃站点整行降低透明度标识
cloudflarespeedtest替换 hosts 前检查域名是否 Cloudflare 托管,避免非 CF 站点 SSL 握手失败- 预签名下载链接判断改为配置驱动(
download.presigned) - 插件质量统一整改(18 个):手动运行绕过启用检查、移除「立即运行一次」冗余开关、补充协作式线程停止
- 下载器/站点 API 支持
source过滤,排除第三方索引器站点 - 更新项目依赖
- 修复插件首次启用菜单不加载:
RBACMenu.to_dict()在 session 关闭后访问children触发DetachedInstanceError,异常被静默吞掉导致角色菜单分配失败。改为object_session(self) is not None检查 - 修复
HttpClient/AsyncHttpClientkeep-alive 模式下连接复用导致远程返回陈旧数据 - 修复
CookieCloud插件re.match→re.search关键词匹配失效、同步时未正确遍历所有站点、域名别名匹配不完整 - 修复站点 favicon 下载时未处理连接超时导致引擎初始化阻塞
- 修复站点图标缓存 key 未区分域名导致不同站点图标错乱
- 修复
IndexerSiteConfig缺少适配器导致刷流取种异常 - 修复图片代理路由
/img缺少去重逻辑导致重复下载 - 修复字符串工具
SPLIT_CHARS缺少★分隔符导致剧集标题识别失败 - 修复搜索进度在任务完成后返回 0 导致前端轮询永不结束:
ProgressTracker.get_process()在end()后因enable=False返回None,改为始终返回已有进度详情 - 修复种子限速参数(上传/下载/分享率/做种时间)为
None时float(None)报错导致下载记录入库失败 - 修复种子促销因子(
uploadvolumefactor/downloadvolumefactor)为空字符串时float("")报错导致搜索结果过滤异常 - 修复搜索结果
media_type使用display_name(如 "TV Show")而非value(如 "TV")导致前端类型筛选失败 - 修复 WEB 搜索同步阻塞请求线程导致前端超时,改为后台线程池异步执行
- 修复 Telegram 发布通知中 changelog 含未转义 HTML 标签导致消息发送失败
- 数据库连接池大幅缩减:
pool_size50→10、max_overflow100→10、pool_recycle3600s→1800s,容器内存从 ~782MB 降至 ~480MB(-39%) SceneChecker识别不区分大小写,支持★08(abema先行版)★等特殊格式的集号提取- NFO 生成器支持
<uniqueid>写入 TMDB/IMDB ID - 媒体刮削器支持海报多图下载并写入 NFO
- Docker Compose 所有服务添加日志轮转(
max-size: 10m, max-file: 3),防止日志撑爆磁盘
- 前端 Docker 镜像新增
BACKEND_HOST/BACKEND_PORT环境变量,支持独立docker run部署时动态指定后端地址 - Docker 部署文档:修正后端镜像描述(Debian 非 Alpine),新增前端单独部署章节,统一
installation.md与docker/readme.md
- CookieCloud 插件重构:修复
re.match→re.search黑/白名单关键词匹配失效;移除错误的test_connection条件门,始终同步云端 cookie;HttpClient改用with上下文管理器防止连接池泄漏;域名别名支持(_find_matching_sites遍历所有匹配站点而非仅第一条) - 修复
BrushTaskRepositoryAdapter缺少insert_brush_event导致刷流进种异常 - 修复 qBittorrent 已存在种子时
DownloadPipeline返回空download_id导致误报"下载失败":区分真实错误(retmsg 有内容)和 EXISTS 情况(retmsg 为空) - 修复
RSS_RULE/REMOVE_RULE列 VARCHAR(255) 溢出为 TEXT:JSON 规则超过 255 字符时报Data too long - 修复删除刷流任务时未清理对应的
BRUSH_EVENT_LOG事件日志
- 刷流事件日志详细原因:进种时记录匹配的选种规则(免费/2X免费/体积符合/发布时间符合等)+ 种子即时状态(免费标记/HR/做种数/体积)
- 刷流未进种事件日志(skip):被选种规则拒绝时记录具体拒绝原因
- 刷流事件日志支持跳转种子详情页:新增
TORRENT_URL列,前端种子名渲染为可点击链接 - 刷流种子记录新增
PAGE_URL列:删种/停种时也能获取种子详情页 URL
- 订阅质量/分辨率支持多选:编辑订阅和默认设置弹窗改为 NSelect multiple,后端过滤支持逗号分隔值
- 订阅添加/更新后自动触发即时队列搜索(SUBSCRIBE_ADD 事件处理器)
- 下载页面显示种子大小(card + list 两视图)
- ERROR 状态订阅自动重试:每 5 次队列搜索周期恢复一次
- 订阅卡片/详情弹窗新增质量(紫色)和分辨率(青色)标签,9 类标签全部使用独立 HSL 色值
- 搜索并行化:
_search_movies/_search_tvs改用 ThreadPoolExecutor(5 workers)并发处理 - 协调器锁 TTL 从 14400s 降至 300s,新增后台守护线程自动续期(每 60s 延长 300s)
- 策略全局锁 TTL 从 1800s 降至 300s,新增
strategy_lock上下文管理器自动续期 - 监控器运行时间持久化:
SystemConfig存储_last_queue_run / _last_rss_run / _last_search_run,避免重启全量搜索洪峰 monitor.run()移除wait(tasks)阻塞,改为非阻塞提交 +_running_tasks去重- 质量/分辨率 tag 改为独立色值:规则(rose) / 洗版(amber) / 质量(purple) / 分辨率(cyan) / 制作组(mint) / 包含(green) / 排除(rose) / 订阅站(blue) / 搜索站(slate)
- 发现页"编辑"入口预加载订阅默认设置
- 修复订阅默认设置未应用到订阅:电影页
res?.data误判,后端仅在字段为 None 时回填默认 - 修复协调器锁存在性检查的竞态:
try_acquire移到check_exists_medias前面 - 修复协调器锁 key 对空 TMDB ID 共享风险:降级链
tmdb_id → rssid → title:year - 修复 M-Team 中文搜索失效:
language改为zh - 修复订阅重新下载被旧历史阻塞:
filter_downloaded改用is_completed_by_tmdb - 修复 qBittorrent 批量获取种子属性时单个异常导致整体列表丢失:逐条 try/except
- 修复下载页面
v-htmlXSS 警告:tooltip 改用文本插值 - 修复
rssid类型不一致:前后端统一改为int - 修复前端质量/分辨率格式化:
formatRestype/formatPix大小写不敏感映射
- 默认订阅设置弹窗重构:复用
SubscribeEditModal同款分段布局 + 站点卡片样式 - 订阅历史页改为横向卡片 + 电影/剧集筛选 tab
- 创建共享图片工具
utils/image.ts(getImgUrl/handleImageError/fallbackImage) - 创建共享过滤选项
utils/subscribe.ts(restypeOptions/pixOptions/splitMultiSelect/joinMultiSelect)
- 插件前端 UMD → DI 模式:插件改为
export default function(host)接收宿主注入的 Vue/IconifyIcon/API,不再依赖 import map / CDN / window 全局变量 - 索引器配置从
SYSTEM_DICT迁移到INDEXER_CONFIG专用表,与 Downloader/MediaServer 保持一致
- 修复视频标题解析 CRC 标签
[EE32E859]被误判为集号 E859 - 修复内置索引器站点名大小写不匹配导致站点不显示(Jackett "Mikan" vs 引擎 "MiKan")
- 修复禁用第三方索引器后其站点仍在
/api/site/sites、/api/download/indexers等接口中出现 - 修复禁用第三方索引器后其站点仍参与搜索
- 修复令牌自动续期漏洞:过期 JWT 不再自动签发新令牌
- 修复
SystemUtils.execute使用shell=True导致命令注入风险 - 修复
ConfigRepository.execute暴露原始 SQL 执行接口 - 修复 TransferPipeline 刮削使用下载源路径而非目标路径
- 修复 DownloadMonitor 预热与正常检查使用不同过滤器
- 修复下载器标签排序硬编码 "NEXUS_MEDIA" 而未使用 PT_TAG 常量
- 修复 Scraper/FileTransferService
settings.get()链式调用无 None 保护导致 AttributeError - 修复 cleanup_service 解析 SEASON_EPISODE 时
int("01E05")崩溃 - 修复 StorageUsage 组件 usedPercent 类型为字符串触发 Vue prop 警告
- 修复用户列表 API 缺失 is_superadmin 字段,角色加载失败静默吞异常
- 修复 transfer_repository 跨 session 查-插竞态条件
- 修复插件依赖注入缺失:PluginSandbox 未注入 searcher/downloader/subscribe 等服务
- 修复
_do_run_plugin重复手动加载模块导致缺少依赖注入 - 修复插件历史页面每次需禁用启用后才显示:refreshSidebarMenus 清除动态路由后未重载插件
- 修复下载失败静默:fire-and-forget 线程异常不再吞掉,push DOWNLOAD_FAILED 到 SSE 队列
- 修复 DownloadedCore._get_downloader_lock 竞态:改为双层检查+模块级锁
- 修复 DownloadedCore.transfer 锁范围过窄,扩展至完整转移循环
- 修复 pipeline.insert_download_history DB 写入失败导致流水线崩溃
- 修复字幕下载 ThreadExecutor Future 丢弃,添加带标题的异常日志
- 修复 download_event_queue 无限内存增长:Queue() → Queue(maxsize=1000)
- 修复 find_hardlinks 返回 raw [] 而非 CommonResponse
- 修复 torrentleech.json page_url 缺少 domain 字段映射
- 修复 CORS allow_origins=["*"]+allow_credentials=True 违反规范
- 修复 db_session_cleanup 死亡中间件(body 为空)
- 修复 search_repository SQLite 非原子 INSERT:改用 sqlite_insert+on_conflict_do_update
- 修复 SubscribeAddPayload 歧义联合类型:post_init 归一化 str→int/list/bool
- 修复 lifespan 无异常处理导致静默启动失败,每步 try/except+log.error
- 修复后端根路径 / 直接报错:添加友好提示 JSON 返回 app/version/message
- 修复前端版本号未显示:package.json 同步至 4.1.13,关于页面展示前端版本
- 修复 TransferLineChart 渐变色语法非法:改用 hsla 格式
- 修复 StorageUsage usedPercent 类型为字符串触发 Vue prop 警告
- 修复 GaugeChart 未注册:echarts.ts 导入 GaugeChart
- 修复首页图表面板 ECharts CSS 变量无法渲染:改用硬编码+useChartTheme 主题切换
- 首页图表全面升级:堆叠面积图/环形图/仪表盘/玫瑰图/水平柱状图/渐变柱状图
- 首页+媒体库图表配色统一:入库趋势/媒体库分布采用暖橙-蓝-粉配色
- 新增 16 色调色板共享常量
chartColors.ts - 新增暗色模式支持:
useChartThemecomposable 监听主题切换 - 新增存储空间 ECharts 仪表盘(阈值绿→橙→红)
- 站点做种分布恢复玫瑰图
- 媒体库最近动态改为时间线样式
- 媒体库存储卡片重设计:大号百分比 + 进度条 + mt-auto 撑满高度
- 用户管理操作按钮改为下拉菜单
- 站点统计 近7天流量增量/上传量分布 位置调换
- 令牌自动续期漏洞修复:过期 token 返回空 payload,不再自动续期
- 命令注入修复:
SystemUtils.execute改用shlex.split+shell=False - 原始 SQL 暴露修复:
execute重命名为_execute_raw标记为仅初始化使用 - 登录端点限速:
/api/auth/login5次/分钟/IP
- Jackett/Prowlarr 索引器支持启用/禁用开关
- 站点统计卡片颜色优化,8 张卡片使用独立色值
- 数据库外键约束:CONFIGFILTERRULES/CONFIGCATEGORYRULE/CUSTOMWORDS/APIKEYLOG
- 数据库索引:DOWNLOADER(ENABLED,TYPE)/CONFIGSYNCPATHS(ENABLED)/SITEBRUSHTORRENTS(DOWNLOAD_ID)/SEARCHRESULTINFO(SEEDERS)/SITEUSERINFOSTATS(USERNAME)
- 事件系统:异步事件类型注入 (DOWNLOAD_STARTED/DOWNLOAD_FAILED/SUBSCRIBE_FINISHED)
- 插件前端文件名
index.umd.js→index.mjs - 用户管理卡片操作按钮改为下拉菜单模式
- 插件路由从绝对路径改为相对路径,支持 generateAccess 重载后自动恢复
- RBAC 用户查询全部改为 selectinload 链式预加载角色/权限/菜单
- subscribe/system handler 添加 payload isinstance 防御检查
- 修复刷流一直不进种:
resolve_torrent_attr硬编码 POST 导致 rousi/tnode 的 GET 端点失败 - 修复
get_tid_by_url忽略site.tid_pattern,导致 rousi UUID TID 提取失败 - 修复刷流、订阅匹配、下载三条链路中
api_key/bearer_token丢失,导致 API 站点认证失败 - 修复
Torrent.save_torrent_file硬编码CookieAuth,忽略站点实际认证类型 - 修复
_build_auth缺少ApiKeyAuth对象,CSRF 认证缺少CookieAuth - 修复
resolve_torrent_attr数值型 free 值与配置字符串比较失败,改为float()数值比较 - 修复 mteam 刷流 302 参数错误:
data=body(dict) 被 httpx form-encode,mteam API 接受 form-encoded 而非 JSON - 修复
POST /api/brush/tasks/run同步阻塞超时,改为ThreadExecutor后台执行 - 修复
get_downloading_torrents只查询status="downloading"导致暂停种子被排除,改为多状态列表 - 修复
detail_page_url未配置时 HTML 种子的详情页解析失败,新增引擎兜底(用 torrent_url) - 修复
rss_free字符串"N"truthy 误判,改为布尔比较 - 修复受众页面结构变化导致 free XPath 不匹配(实际是
detail_page_url缺失) - 修复暂停任务仍执行删种/停种,新增状态检查
- 修复删种集合差逻辑导致暂停种子被误删,改为一次
get_torrents全量查询 - 修复
RULE_IDInteger 列存 JSON 字符串报错,改为三个独立 FK 列替代 - 修复手动删种后保种体积不更新阻止进种,RSS 检查前先清理
torrent_attr配置新增body_format字段,区分 POST 请求体格式- rousi/mteam 站点配置新增
2xfree_key/2xfree_value,支持 FREE_2X 检测 - 75 个 NexusPHP 站点补上
detail_page_url - SITE_BRUSH_RULE 新增
TYPE列(rss/remove/stop),规则按类型独立创建和管理 - SITE_BRUSH_TASK 新增
RSS_RULE_ID/REMOVE_RULE_ID/STOP_RULE_ID三列,刷流任务可分别选择三种规则 /download/tasks新增分页参数page/page_size,返回{items, total}- 下载器批量操作端点:
/tasks/batch/start、/tasks/batch/stop、/tasks/batch/remove - 下载任务响应新增
labels/category字段 _fetch_page支持 API 站点的_build_auth认证
_build_auth统一三种认证类型的 auth 对象创建(ApiKeyAuth/BearerAuth/CookieAuth)resolve_torrent_attr/engine_download统一 Content-Type 处理get_downloading_torrents改用TorrentStatus列表过滤(qBittorrent/Aria2/Thunder 统一)category从 list 转为 string 传递给前端- 删除
RULE_ID列,迁移为三个独立 FK 列 + Alembic 迁移 _load_rules_from_template支持三个独立规则 ID 加载
- 通知统一使用
useAppNotification(duration:3000),修复永不消失问题 - 正在下载页新增分页、批量选择/暂停/开始/删除、标签/分类彩色 badge、状态 badge
- 海报 TMDB URL 直转
/img/tmdb/路径,绕过 301 重定向 - 刷流规则页重构:Type Tab 三栏分离、面板式卡片、类型彩色标签
- 刷流任务表单:三列独立规则选择器,移除旧合并选择器
- 统一索引器站点管理:引入
INDEXER_SITE_CONFIG表,内置索引器按站点级enabled过滤,支持BuiltinIndexerEnabled总开关 - 启动时自动创建公开(BT)内置站点(0Magnet / 1377x / ACG.RIP / 动漫花园 / MiKan / Nyaa),优先级 100~105
INDEXER_SITE_CONFIG新增DEFAULT_SETTINGS列(JSON),预留 BT 站点默认搜索设置- 新增
IndexerSiteConfigRepository、IndexerSiteConfigRepositoryAdapter、IndexerSiteConfigEntity等基础设施 - 站点维护页新增搜索启用开关(集成到编辑弹窗功能开关),BT 站点隐藏刷流/统计/解析开关
- 卡片底部标签栏展示所有已启用功能(含搜索/字幕/标签)
- 搜索入库 299→74 丢失:改为 dialect 无关批量 UPSERT + session 清理,对齐
(PAGEURL, SITE, SEARCH_SESSION_ID)唯一索引 USER_LEVELNULL 导致IntegrityError (1048):默认化为空字符串- 搜索事件
**SearchStartPayload解包报错:添加isinstance检查 - 自动创建 BT 站点
signurl双重https://:判断 domain 是否已含协议
- 移除
show_more_sites(实验室→展示更多站点)后端和前端所有相关代码 - 索引器页面移除内置站点多选框,改为单一总开关
- 移除前端"默认搜索索引器"选择器
builtin.py清理未使用的settings/IndexerConfimport,补上漏掉的DownloadRepository
- 站点卡片 BT/PT 标签按引擎定义
site_public显示,不随 cookie 变化
c4d5e6f7a8b9: 新增INDEXER_SITE_CONFIG.DOWNLOAD_SETTING列ee2445e35880: 新增INDEXER_SITE_CONFIG.DEFAULT_SETTINGS列,从UserIndexerSites迁移历史数据
test_search_repository.py: 搜索入库回归测试(299 条全量插入、去重、session 替换)test_indexer_site_config_repository.py: 索引器站点配置仓储测试test_site_service_get_sites_merge.py: 站点服务合并逻辑测试
- Dockerfile 支持
UV_INDEX_URL构建参数,便于构建时自定义 PyPI 镜像源 - 修复 builder 阶段
uv sync --no-install-project导致项目包未安装的问题
- 重新设计我的媒体库页面,统一卡片、存储与活动列表视觉风格
- 重构基础设置页面信息架构并改为标签页布局,优化表单层级
- 统一媒体详情页视觉风格,拆分 HeroSection/CastList/FactPanel 等组件
- 优化站点列表卡片视觉设计与操作按钮可访问性
- 重构站点资源卡片与列表:精简海报占位、统一标签语义色、新增 Dolby/HDR 标签类型
- 重构站点统计图表为独立组件,对齐 dashboard/home 实现,修复 tooltip 闪烁与 StatTable 数据引用导致的重绘
- 刷流任务页面重构:改用行内开关与更多操作下拉,移除冗余“已停用”状态选项,调整规则卡片视觉
- 站点编辑弹窗为 API Key / Bearer Token 输入关闭浏览器自动填充
- 全局通知默认时长恢复组件默认,避免通知过早消失
- 资源标签使用更鲜明的语义色变量
- 无需迁移
brushtask_interval字段类型错误:API 模型定义为int,前端传 cron 表达式字符串"*/30 * * * *"导致 422 解析失败,改为int | str+ 双格式校验(≥5 分钟 / 5 位 cron)- 错误日志不到 SSE:
LOG_BUFFER容量仅 200 条,启动和运行时高频日志将 error 挤出队列,增大到 2000
- KamePT 站点配置:支持 NexusPHP HTML 模式的 KamePT(CosAV/音声/游戏 CG)
- 无需迁移
- 转移事件处理器 TypeError:
DownloadCompletedPayload(**event.payload)对 dataclass 实例用**解包崩溃,事件总线静默吞异常导致下载完成→转移链路从未触发 - 下载监控多工厂实例缓存不同步:
DownloadCore/DownloaderCore/DownloadMonitor各持有独立DownloadClientFactory实例,CRUD 后只刷新前两个,DownloadMonitor工厂永不过期 - 下载器
download_dir不生效:DOWNLOAD_DIRDB 列为空时直接取空值,忽略config.download_dirJSON 中的实际配置,导致get_download_dir_info匹配失败、match_path全部跳过 only_nexus_media标签隔离:pipeline 未将PT_TAG注入种子标签,监控按NEXUS_MEDIA过滤时找不到已完成种子- 磁力链接
save_path始终为空:_stage_post对 magnet 链接显式设save_dir=None - 图片代理
/img?url=斜杠重定向死循环:前端 nginx 301 加斜杠,Starlette 307 去斜杠互斥,双路由注册消除重定向 - 订阅电影/电视剧 INSERT 失败:
KEYWORD/FILTER_ORDER/FILTER_RESTYPE等可选列为NOT NULL但传None,仓库层统一空值默认化 - 索引器切换后订阅站点列表不更新:
/download/indexers固定返回内置站点,改为get_user_indexers()随当前激活索引器变化 - 过滤引擎拒绝纯音频文件匹配视频订阅(FLAC/MP3/OST 等)
- 索引器统计插入时自动清理 7 天前旧数据
- 探索页面无限滚动卡死:首屏数据加载期 IntersectionObserver 触发被 loading guard 拦截后不再重新触发
- 订阅编辑模态框切换索引器后已保存站点未过滤,旧站点名残留
- 无需迁移
- API 站点数据刷新无响应:
api_key/bearer_token贯穿整个用户信息获取调用链,修复 M-Team/Rousi/TNode 等 API 站点的站点数据刷新静默返回 0 条的问题 - Bearer Token 认证重复前缀:
_build_auth中 BearerAuth 构造时剥离已添加的Bearer前缀,修复 Rousi 等 Bearer 认证站点返回 401 - Rousi 站点配置:
user_info.profile端点 query 参数从 URL path 移到params对象,修复方括号被 URL 编码后服务器不识别的问题 DOWNLOADER.DOWNLOAD_DIR列VARCHAR(255)过短导致下载器配置保存报错,改为TEXTSITE_STATISTICS_HISTORY和SITE_USER_INFO_STATS中无默认值列添加server_default,修复bulk_insert_mappings遇None值时 MySQL NOT NULL 约束报错- 刷流任务状态变更统一使用
BrushTaskState枚举,修复Y/N/S魔法字符串不一致 - 文件转移路径解析
get_format_dict/get_movie_dest_path/get_tv_dest_path的media_service参数改为可选,修复无媒体服务时路径格式化报错 - 进度跟踪器
finish()方法补充设置 value=100 和完成文本 - 新增
GET /download/torrent-remove-tasks/seed-statuses端点,返回种子状态中英文列表 - 删种任务种子状态输入框改为多选下拉列表,支持中文显示
- 修复 TMDB 黑名单和搜索文件两处 API 路径重复
/api/前缀的问题 - 区分
Paused(已暂停)和Stopped(已停止)的中文标签,避免下拉列表重复 - 修复识别历史统计字段大小写不匹配(
MovieNums→movie_nums)导致reduce报错 - 修复下载目录分类未推送到下载器:类型匹配支持中英文,
category推分类label推标签 - 新增站点「拾刻」www.ptskit.org(NexusPHP)
- M-Team 添加 description 字段(概述),详情页域名改为 kp.m-team.cc
- HTML 站点解析支持用户配置的别名域名(domain_aliases)
- 修复站点 tag 字段返回字符串导致前端开关状态不正确,pipeline 改用 name 作为下载器标签
- 索引器统计启动不再清空,查询加 24 小时时间过滤,前端添加 24h 标签
d5e6f7a8b9c0:DOWNLOADER.DOWNLOAD_DIR列类型调整为TEXTe6f7a8b9c0d1:SITE_STATISTICS_HISTORY.USER_LEVEL和SITE_USER_INFO_STATS.USER_LEVEL添加默认值''f6f7a8b9c0d1:SITE_USER_INFO_STATS和SITE_STATISTICS_HISTORY中无默认值的数值/字符串列批量添加server_default
- 媒体类型识别统一使用
MediaType.from_string,支持Movie/Series/show/TV等别名 - fnOS 媒体库同步:
get_items在 API 按库过滤返回空时回退到全量获取后本地过滤,修复同步无数据 - fnOS 客户端:修复
fetch_all_pages中响应数据覆盖请求 payload 的变量遮蔽问题 - 功能开关统一为布尔值:站点 note 中的
parse/proxy/chrome/subtitle/tag/message/public读取写入均使用布尔值 - 修复部分更新
rss_enable/brush_enable/statistic_enable时清除未传入开关的问题,改为增量更新 - 修复
/sites/detail接口返回原始实体数据而非缓存计算后状态的问题
- 新增
SiteUseType枚举(RSS=D, BRUSH=S, STATISTIC=T),替代D/S/T魔法字符串 - 新增
SwitchState枚举(ON=Y, OFF=N),替代Y/N魔法字符串 - 新增
UserRssTaskUseType枚举(DOWNLOAD=D, SUBSCRIBE=R, SEARCH=S) - 刷流任务状态统一使用已有的
BrushTaskState枚举(RUNNING=Y, STOPPED=S, DISABLED=N) - 删除
SiteEntity中未使用的 dead code 属性 - Alembic 迁移:将
CONFIG_SITE.NOTE中旧Y/N字符串开关转换为布尔值
- 站点编辑页:note 开关直接发送布尔值,不再转
Y/N字符串 - 站点类型选择器改用
NSwitch,form.public 改为布尔值 - 删除
parseNoteBool兼容函数 - 修复
NNotificationProvider的 extraneous non-props attributes 警告
- 媒体服务器配置保存兼容无前缀字段,修复前端保存配置时返回“配置为空”
- 豆瓣网络连通性测试改为调用真实豆瓣 API,避免直接访问根路径被误报异常
- 修复媒体服务器配置更新时
NOTE为null导致 MySQLIntegrityError的问题 - 内置索引器识别 API Key / Bearer Token 认证的站点(如 M-Team),不再因缺少 cookie/headers 被过滤
- 内置索引器匹配站点
domain_aliases,修复 M-Team 等使用别名域名配置的站点不显示的问题 - 内置索引器收集 API 站点定义,修复 API 认证站点(如 M-Team)被排除的问题
- IndexerConf 传递
api_key/bearer_token到 API 搜索器,修复 M-Team 搜索 401 - 下载链接解析和下载流水线传递
api_key/bearer_token,修复 API 站点下载认证 - 代理配置支持 http / https / socks5 三种协议
- 下载流水线失败时补上 SSE 事件推送,种子下载失败时直接推送 SSE
- 下载历史存在判断改用
downloader+download_id唯一键,修复任务列表重复和重复插入 - 种子文件名优先取
filename*=头,避免中文 ISO-8859-1 编码报错 - torrent URL 下载时设置
media_info.enclosure,避免ENCLOSURE为 null 报错 - 下载任务列表按
downloader+download_id去重,不再显示重复记录 - 站点维护功能开关支持独立
rss_enable/brush_enable/statistic_enable布尔字段
- 网络连通性测试耗时为 0:
NetTestService改为在 HTTP 请求完成后计算耗时,并改用total_seconds()避免超过 1 秒时数值错误 - 消息客户端模板保存失败:
MESSAGE_CLIENT.TEMPLATES列从VARCHAR(255)改为TEXT,兼容长 JSON 模板 - FnOS 媒体服务器配置项错误:配置表单从错误的
Api Key改为正确的用户名 / 密码,并添加迁移将已有api_key值迁移到username
89c719931b5f:MESSAGE_CLIENT.TEMPLATES列类型调整为TEXT1ee439ce9b6d:FnOS 媒体服务器配置api_key迁移为username
DownloadStartedPayload增加download_id字段DOWNLOAD_STARTED事件从流水线入口移至_stage_add成功后发布,避免 fetch/resolve 失败时误报- 新增
download_event_queue模块级queue.Queue作为事件通道 - handler 推送
download.started/download.failed/download.completed事件到队列 - 新增
GET /api/download/eventsSSE 端点,权限download:view
/api/download/indexers始终返回内置索引器站点列表,不受索引器切换影响IndexerService新增get_builtin_user_indexers()方法
CONFIG_SITE.EXCLUDE、SIZE添加 ORM 默认值,修复新增站点 500SITE_USER_INFO_STATS.JOIN_AT、EXT_INFO等列添加 ORM 默认值,修复统计更新 500site_service.update_site异常分支添加log.error和msg,不再吞掉错误信息site_repository.update_site_user_statistics中JOIN_AT=None时写入空字符串
- 缓存线程安全:
_torrents_cache加threading.Lock防止并发下载重复种子 - 删种前用
get_torrents确认种子离开下载器,避免边缘状态误删记录导致孤儿 - 删种失败不再标记为已删除
- 新任务不触发全量
start_service(),缓存在delete_brushtask未命中时回退查 DB
- RSS 自动订阅事件处理器已注册到 DI,功能恢复可用
- 删除订阅时同步清理
SubscribeTorrents种子记录,重新订阅可正常下载 truncate_rss_episodes只清除非活跃订阅的剧集进度- TOCTOU 并发防重复插入订阅
- 状态字符串统一替换为
SubscribeState枚举 - 状态设为 SEARCHING 移到协调锁之后,消除异常窗口
- 测试配置改用临时文件 + SQLite,不再依赖外部 MySQL 服务器
- 14 处 String=Integer 类型比较加 cast 适配 PostgreSQL
- MySQL ENCLOSURE 索引加前缀长度,避免 VARCHAR(8192) 超限
ConfigRepository.execute适配 SQLAlchemy 2.0text()drop_tableSQL 注入修复- SQL 适配器 MySQL 双引号转反引号
get_secret_key保存后reload确保同次运行不生成多个密钥_brush_tasks先停旧 job 再 pop,消除竞态窗口- auth router 清除重复标签,prefix 统一到
include_router - 清理绞杀式迁移相关注释
- 后端 nginx 加兜底路由代理
/docs等非 API 路径
python-jose替换为PyJWT[crypto],消除ecdsa安全告警
- ConfigReloader 重构:改为工厂模式重建实例,而非 reset(),tmdb_client 热重载时清除 Redis 缓存
- settings.save 合并:修复保存时只保留 database 节点导致其他配置(TMDB key 等)丢失
- 配置保存触发重载:/config/update 自动调用 ConfigReloader.reload()
- NOGROUP 根治:RedisMessageQueue dispatch 循环幂等创建消费组
- static 目录持久化:跟随 NEXUS_MEDIA_DATA 落到 /data/static
- 过滤规则初始化:首次启动从 init_filter.sql 导入默认规则,INSERT OR IGNORE 防覆盖
- TMDB 异常降级:get_tmdb_new_movies/tvs 捕获异常返回 [],不抛 500
- Docker Compose 三模式部署:支持基础模式(前端+后端+Redis+MySQL/PostgreSQL)、完整模式(+OCR+Chrome)、仅前后端模式(SQLite)
- 默认基础 MySQL 模式:执行
docker compose up -d即可启动 - 统一数据库环境变量:Docker 与代码统一使用
DATABASE__*格式读取配置 - Redis 默认命令启动:移除对
./config/redis.conf文件挂载的依赖 - 数据库升级到 MySQL 8.4 / PostgreSQL 17-alpine
- 数据库查询性能: 消除
site_repository/transfer_repositoryN+1 查询;为SUBSCRIBE_MOVIES/SUBSCRIBE_TVS/CONFIG_USER_RSS/SITE_BRUSH_TORRENTS/TRANSFER_HISTORY/TRANSFER_UNKNOWN添加索引;subscribe_repository用单次first()替代.all()+ 循环 - HTTP 客户端连接池复用:
HttpClient/AsyncHttpClient按配置复用底层httpx.Client/httpx.AsyncClient,相同代理/头/超时/认证/SSL 配置共享连接池 - 缓存系统:
RedisStore.hgetall改为单次hgetall;MemoryCacheAdapter仅在存在监听器时触发CacheEvent,避免高频空转 - 消息队列:
MessageQueueFactory单例实现线程安全,避免重复创建队列 - 下载完成监控:
DownloadMonitor改为增量检查,后续轮询只拉取新增任务;qBittorrent 使用sync/maindata增量接口获取 completed 任务,减少数据传输与 per-torrent API 调用 - 图片代理: 下载逻辑全面异步化,使用
AsyncHttpClient连接池与asyncio.gather并发下载,替代ThreadPoolExecutor - JSON 序列化: 高频路径统一使用
JsonUtils(orjson为主,stdlib 为 fallback)
- EventBus 注册: 修复 DI 容器创建的
EventBus与@on_eventhandler 注册脱节的问题;SystemLifecycleService现在从 DI 接收真实EventBus - 认证: 移除
SessionMiddleware与 session 认证兼容层,API 统一使用 JWT/Token 认证 - 消息通知图片: 添加诊断日志定位图片丢失问题;修复
_get_script_path依赖注入错误
- 升级
redis/cryptography/pydantic-ai/granian/python-multipart/openai/google-genai/boto3/beautifulsoup4/qbittorrent-api/ruff等依赖 - 引入
orjson/uvloop;启用httpxHTTP/2 - 新增 Alembic 迁移
e9d9eaed8d5c补充查询索引 - 安全扫描:
just bandit/just safety均通过 - 测试: 1195 个测试通过,覆盖率
36%;新增事件系统异常隔离与异步投递测试
4.0.0 是 Nas-Tools 的全新重构版本,涵盖后端架构、前端框架、部署运行和代码质量的全面升级。
- 项目重命名为 Nexus Media,全面替换旧品牌标识
- 项目结构标准化为
src/layout,统一get_project_root()消除硬编码路径 - 架构分层重构:消除
helper/层、解除循环依赖、基础设施统一归位 - 全面重构 DI 容器,引入
ConfigReloader集中热重载,消灭NEXUS_MEDIA_CONFIG硬性依赖 - 统一 Repository 适配层,移除
MediaDb直接数据库操作,拆分engine/session/transaction模块 - 拆分超大服务文件:
filetransfer_service.py/message.py/scheduler_core.py/rss_service.py - 消息通知、下载器、索引器、媒体服务器模块重构为插件化扩展架构
- 缓存事件系统整合到 EventBus,移除旧
task_queue/reliable_message_queue - 移除 10+ 个类的
SingletonMeta(Rss/IyuuHelper/CookiecloudHelper/IndexerHelper/ 豆瓣相关类等)
- 自动签到插件重构为声明式配置架构:删除 21 个旧站点硬编码实现,支持“自定义 handler > 声明式配置 > 通用匹配”三层分发
- 站点模块迁移到 SiteCache / SiteResolver / SiteFaviconService 领域架构,写操作后缓存自动刷新
- 新增 分布式锁 实现,覆盖 RSS 下载、插件安装/卸载、站点刷新、订阅搜索、删种、媒体库同步、转移等场景
- 引入
tenacity替换手写重试,实现 API 速率限制器 - 图片代理与缓存优化,支持 TMDB / 豆瓣 / Bangumi / 媒体库内网图片
- HTTP 客户端重构:中间件集成、配置修复、异步线程安全
- 日志支持 JSON 结构化输出,兼容 ELK;gunicorn access log 每日轮转 + 自动清理
- 服务器由 uvicorn/gunicorn 迁移至 Granian,统一
run.py入口 - 新增 ADR-007 ~ ADR-013 架构决策记录
- 前端框架升级至 vben v5.7.0(应用版本同步至 4.0.0)
- vue-router 生产环境改为 history 模式
- 前端目录
views/rss/统一迁移为views/subscription/,与后端路由对齐 - 前端 Nginx 增加
/api/、/img、/docs、/openapi.json、/ws反向代理 - 修复设置按钮点击无反应、头像更新不生效、153 处 TypeScript 类型错误
- Docker 镜像升级至
python:3.14-slim-trixie,弃用 Alpine - nginx 内部端口改为 8080,healthcheck 检查 nginx 而非直连 Granian
- docker-compose 增加独立 migration 服务,backend 设
SKIP_MIGRATION=true,避免 alembic 并发冲突 - 修复 SQLite 下历史迁移脚本的
no such table、ALTER CONSTRAINT等兼容性问题 - 新增
.dockerignore和运行时目录排除,缩减镜像体积 - 修复 nginx
merge_slashes导致/img代理 URL 双斜杠丢失
- 迁移配置到 pydantic-settings,建立分层异常体系,完善 OpenAPI 文档
- 新增
RedisConfig配置模型,支持环境变量REDIS__HOST/REDIS__PORT/REDIS__PASSWORD/REDIS__DB - 修复
settings.py中数值配置字段类型(str→int)导致的 pydantic 校验错误 - 新增
.env.example环境变量模板,重写以对齐 pydantic-settings 字段
- 新增 CI 质量门禁、pre-commit hooks、justfile 任务运行器
- 全部非测试文件完成空安全加固,消除 111 处 null access
- 全部
reportArgumentType清零,227 处类型窄化 - 95 处
reportIncompatibleMethodOverride基类/子类签名对齐 - 重构测试体系,删除不可用旧测试,新建 41 个可运行测试
- 使用
just替代 Makefile,统一uv run工作流
- 支持迅雷下载器
- 支持Rousi站点(API v1接口)
- 新增自动重启插件
- 新增消息模板
- 搜索结果支持分页浏览(输入 n/p 翻页)
- 支持直接从搜索结果中选择下载
- 优化数据库性能(使用连接池、WAL模式)
- 优化HTTP工具类(添加连接池和重试策略)
- 优化自动签到插件(跳过BT站点)
- 优化馒头站点仿真登录
- 优化Web界面交互体验
- 添加消息模板配置支持
- 修复Aria2状态显示拼写错误
- 修复下载器返回值格式问题
- 修复authorization请求头处理问题
- 支持馒头仿真登录
- 支持自由农场签到
- 刷流支持下载付费种子
- 签到流程优化
- 增加仿真签到延时
- 优化搜索速度
- 重启时重置订阅状态
- 修复微信插件初始化问题
- 修复观众做种数据
- 修复飞牛图片显示问题
- 修复猫站签到
- 修复chrome服务找不到一直报错
- 修复transmission状态显示
- 修复http工具类
- 修复tags没有配置时无法添加任务
- 支持飞牛媒体服务器
- 憨憨支持H&R
- 优化调度
- 修复下载器标签排序问题
- cf优选插件下载路径错误
- 订阅下载重复
- 黑名单条目无法删除
- 新增PTGTK站点支持
- Server酱支持TAG和图片
- 增加TMDB黑名单功能
- 优化索引器搜索速度
- TMDB缓存优化
- 站点维护增加图标LOGO
- 修复订阅搜索暂停问题
- 修复HDSky生成RSS失败
- 新增RSS自动生成插件
- 自动备份插件支持WebDAV和Samba
- 支持唐门、雨、财神等新站点
- Emby媒体库同步插件支持原生webhook
- 企业微信插件支持二维码扫码登录
- 修复馒头模拟登录失效
- 修复观众站点资源访问失败
- 修复Prowlarr下载失败
- 支持OpenAI自定义模型
- 支持HHCLUB备用域名
- 修复天空种子列表获取问题
- 修复冰淇淋副标题显示问题
完整版本历史请查看GitHub发布页面
注意:建议始终使用最新版本以获得最佳体验和安全更新