|
| 1 | +# [3.2] - 2025-01 |
| 2 | + |
| 3 | +## 后端 |
| 4 | + |
| 5 | +### 新功能 |
| 6 | + |
| 7 | +- 新增 WebAuthn Passkey 无密码登录支持 |
| 8 | + - 支持注册、验证和管理 Passkey 凭证 |
| 9 | + - 多设备凭证备份检测(iCloud 钥匙串等) |
| 10 | + - 克隆攻击防护(sign_count 验证) |
| 11 | + - 认证策略模式统一密码和 Passkey 登录接口 |
| 12 | + - 支持无用户名登录(可发现凭证/resident keys) |
| 13 | +- 新增季度/集数偏移自动检测 |
| 14 | + - 通过分析 TMDB 剧集播出日期检测「虚拟季度」(如芙莉莲第一季分两部分播出) |
| 15 | + - 当播出间隔超过 6 个月时自动识别为不同部分 |
| 16 | + - 自动计算集数偏移量(如 RSS 显示 S2E1 → TMDB S1E29) |
| 17 | + - 后台扫描线程自动检测已有订阅的偏移问题 |
| 18 | + - 新增 API 端点:`POST /bangumi/detect-offset`、`PATCH /bangumi/dismiss-review/{id}` |
| 19 | +- 新增番剧归档功能 |
| 20 | + - 支持手动归档/取消归档 |
| 21 | + - 已完结番剧自动归档 |
| 22 | + - 新增 API 端点:`PATCH /bangumi/archive/{id}`、`PATCH /bangumi/unarchive/{id}`、`GET /bangumi/refresh/metadata` |
| 23 | +- 新增搜索源配置 API |
| 24 | + - `GET /search/provider/config` - 获取搜索源配置 |
| 25 | + - `PUT /search/provider/config` - 更新搜索源配置 |
| 26 | +- 偏移检查面板新增建议值显示(解析的季度/集数和建议的偏移量) |
| 27 | +- 修复季度偏移未应用到下载文件夹路径的问题 |
| 28 | + - 设置季度偏移后,qBittorrent 保存路径会自动更新(如 `Season 2` → `Season 1`) |
| 29 | + - RSS 规则的保存路径也会同步更新 |
| 30 | +- 优化集数偏移建议逻辑 |
| 31 | + - 简单季度不匹配时不再建议集数偏移(仅虚拟季度需要) |
| 32 | + - 改进提示信息,明确说明是否需要调整集数 |
| 33 | +- 新增 RSS 连接状态追踪 |
| 34 | + - 每次刷新后记录 `connection_status`(healthy/error)、`last_checked_at` 和 `last_error` |
| 35 | +- 新增首次运行设置向导 |
| 36 | + - 7 步引导配置:账户、下载器、RSS 源、媒体路径、通知 |
| 37 | + - 下载器连接测试、RSS 源验证 |
| 38 | + - 可选步骤可跳过,稍后在设置中配置 |
| 39 | + - 哨兵文件机制(`config/.setup_complete`)防止重复触发 |
| 40 | + - 未认证的设置 API(仅首次运行可用,完成后返回 403) |
| 41 | +- 新增日历视图,集成 Bangumi.tv 放送时间表 |
| 42 | +- 新增下载器 API 和管理界面 |
| 43 | +- 全面异步迁移 |
| 44 | + - 数据库层异步支持(aiosqlite),Passkey 操作非阻塞 I/O |
| 45 | + - `UserDatabase` 支持同步/异步双模式,向后兼容 |
| 46 | + - `Database` 上下文管理器支持 `with`(同步)和 `async with`(异步) |
| 47 | + - RSS 引擎、下载器、检查器、解析器全面转换为异步 |
| 48 | + - 网络请求从 `requests` 迁移到 `httpx`(AsyncClient) |
| 49 | +- 后端迁移到 `uv` 包管理器(pyproject.toml + uv.lock) |
| 50 | +- 服务器启动使用后台任务避免阻塞(修复 #891、#929) |
| 51 | +- 数据库迁移自动填充 NULL 值为模型默认值 |
| 52 | +- 数据库新增 `needs_review` 和 `needs_review_reason` 字段用于偏移检测 |
| 53 | + |
| 54 | +### 性能优化 |
| 55 | + |
| 56 | +- 共享 HTTP 客户端连接池,复用 TCP/SSL 连接 |
| 57 | +- RSS 刷新改为并发拉取(`asyncio.gather`),多源场景下速度提升约 10 倍 |
| 58 | +- 种子文件下载改为并发获取,下载多个种子时速度提升约 5 倍 |
| 59 | +- 重命名模块并发获取文件列表,速度提升约 20 倍 |
| 60 | +- 通知发送改为并发执行,移除 2 秒硬编码延迟 |
| 61 | +- 新增 TMDB 和 Mikan 解析结果缓存,避免重复 API 调用 |
| 62 | +- 为 `Torrent.url`、`Torrent.rss_id`、`Bangumi.title_raw`、`Bangumi.deleted`、`RSSItem.url` 添加数据库索引 |
| 63 | +- RSS 批量启用/禁用改为单次事务操作,替代逐条提交 |
| 64 | +- 预编译正则表达式(种子名解析规则、过滤器匹配) |
| 65 | +- `SeasonCollector` 在循环外创建,复用单次认证 |
| 66 | +- RSS 解析去重从 O(n²) 列表查找改为 O(1) 集合查找 |
| 67 | +- `Episode`/`SeasonInfo` 数据类添加 `__slots__`,减少内存占用 |
| 68 | + |
| 69 | +### 变更 |
| 70 | + |
| 71 | +- 升级 WebAuthn 依赖到 py_webauthn 2.7.0 |
| 72 | +- `_get_webauthn_from_request` 优先使用浏览器 Origin 头,修复跨端口开发环境验证问题 |
| 73 | +- `auth_user` 和 `update_user_info` 转换为异步函数 |
| 74 | +- `TitleParser.tmdb_parser` 转换为异步函数 |
| 75 | +- `RSSEngine` 方法全面异步化(`pull_rss`、`refresh_rss`、`download_bangumi`、`add_rss`) |
| 76 | +- `Checker.check_downloader` 转换为异步函数 |
| 77 | +- `ProgramStatus` 从 threading 迁移到 asyncio(Event、Lock) |
| 78 | + |
| 79 | +### 问题修复 |
| 80 | + |
| 81 | +- 修复下载器连接检查添加最大重试次数 |
| 82 | +- 修复添加种子时的网络瞬态错误,添加重试逻辑 |
| 83 | +- 修复搜索和订阅流程中的多个问题 |
| 84 | +- 改进种子获取可靠性和错误处理 |
| 85 | +- 修复 `aaguid` 类型错误(py_webauthn 2.7.0 中现为 `str`,不再是 `bytes`) |
| 86 | +- 修复缺失的 `credential_backup_eligible` 字段(替换为 `credential_device_type`) |
| 87 | +- 修复 `verify_authentication_response` 接收无效 `credential_id` 参数导致 TypeError |
| 88 | +- 修复程序启动阻塞服务器(修复 #891、#929、#886、#917、#946) |
| 89 | +- 修复搜索接口导出与组件期望不匹配 |
| 90 | +- 修复海报端点路径检查错误拦截所有请求(修复 #933、#934) |
| 91 | +- 修复 OpenAI 解析器安全问题 |
| 92 | +- 修复数据库测试使用异步会话与同步代码不匹配 |
| 93 | +- 修复从 3.1.x 升级到 3.2 时配置字段冲突导致设置丢失(修复 #956) |
| 94 | + - `program.sleep_time` / `program.times` 自动迁移到 `rss_time` / `rename_time` |
| 95 | + - 移除废弃的 `rss_parser` 字段(`type`、`custom_url`、`token`、`enable_tmdb`) |
| 96 | + - 修复 `ENV_TO_ATTR` 环境变量映射指向不存在的模型字段 |
| 97 | + - 修复 `DEFAULT_SETTINGS` 与当前配置模型不一致 |
| 98 | +- 修复版本升级迁移逻辑错误(所有升级都调用 3.0→3.1 迁移) |
| 99 | + - 新增基于源版本的版本感知迁移分发 |
| 100 | + - 新增 `from_31_to_32()` 迁移函数处理数据库架构变更 |
| 101 | + |
| 102 | +## 前端 |
| 103 | + |
| 104 | +### 新功能 |
| 105 | + |
| 106 | +- 全新 UI 设计系统重构 |
| 107 | + - 统一设计令牌(颜色、字体、间距、阴影、动画) |
| 108 | + - 支持深色/浅色主题切换 |
| 109 | + - 全面的无障碍支持(ARIA、键盘导航、焦点管理) |
| 110 | + - 移动端响应式布局 |
| 111 | +- 新增首次运行设置向导页面 |
| 112 | + - 多步骤向导组件(进度条 + 步骤导航) |
| 113 | + - 路由守卫自动检测并重定向到设置页面 |
| 114 | + - 下载器/RSS/通知连接测试反馈 |
| 115 | + - 中英文 i18n 支持 |
| 116 | +- 新增 Passkey 管理面板(设置页面) |
| 117 | + - WebAuthn 浏览器支持检测 |
| 118 | + - 自动识别设备名称 |
| 119 | + - Passkey 列表显示和删除 |
| 120 | +- 登录页面新增 Passkey 指纹登录按钮(支持无用户名登录) |
| 121 | +- 新增日历视图页面 |
| 122 | +- 新增下载器管理页面 |
| 123 | +- 番剧卡片新增悬停遮罩层(显示标题和标签) |
| 124 | +- 新增 `resolvePosterUrl` 工具函数,统一处理外部 URL 和本地路径(修复 #934) |
| 125 | +- 重新设计搜索面板,新增模态框和过滤系统 |
| 126 | + - 新增筛选区域,支持按字幕组、分辨率、字幕类型、季度分类筛选 |
| 127 | + - 多选筛选器,智能禁用不兼容的选项(灰色显示) |
| 128 | + - 结果项标签改为非点击式彩色药丸样式 |
| 129 | + - 统一标签样式(药丸形状、12px 字体) |
| 130 | + - 标签值标准化(分辨率:FHD/HD/4K,字幕:简/繁/双语) |
| 131 | + - 筛选分类和结果变体支持展开/收起 |
| 132 | + - 海报高度自动匹配 4 行变体项(168px) |
| 133 | + - 点击弹窗外部自动关闭 |
| 134 | +- 重新设计登录面板,采用现代毛玻璃风格 |
| 135 | +- 日志页面新增日志级别过滤功能 |
| 136 | +- 重新设计 LLM 设置面板(修复 #938) |
| 137 | +- 重新设计设置、下载器、播放器、日志页面样式 |
| 138 | +- 新增搜索源设置面板 |
| 139 | + - 支持查看、添加、编辑、删除搜索源 |
| 140 | + - 默认搜索源(mikan、nyaa、dmhy)不可删除 |
| 141 | + - URL 模板验证,确保包含 `%s` 占位符 |
| 142 | +- 新增 iOS 风格通知角标系统 |
| 143 | + - 黄色角标 + 紫色边框显示需要检查的订阅 |
| 144 | + - 支持组合显示(如 `! | 2` 表示有警告且有多个规则) |
| 145 | + - 卡片黄色发光动画提示需要注意 |
| 146 | +- 编辑弹窗新增警告横幅,支持一键自动检测和忽略 |
| 147 | +- 规则选择弹窗高亮显示有警告的规则 |
| 148 | +- 日历页面番剧分组:相同番剧的多个规则合并显示,点击可选择具体规则 |
| 149 | +- 番剧列表页新增可折叠的「已归档」分区 |
| 150 | +- 番剧列表页新增骨架屏加载动画 |
| 151 | +- 规则编辑器新增剧集偏移字段和「自动检测」按钮 |
| 152 | +- 首页空状态新增「添加 RSS 订阅」按钮,引导新用户快速上手 |
| 153 | +- 日历页面海报图片添加懒加载,提升性能 |
| 154 | +- 日历页面「未知播出日」独立为单独区块,优化视觉节奏 |
| 155 | +- RSS 管理页面新增连接状态标签:健康时显示绿色「已连接」,错误时显示红色「错误」并通过 tooltip 显示错误详情 |
| 156 | +- 全新移动端优先响应式设计 |
| 157 | + - 三层断点系统:移动端(<640px)、平板(640-1023px)、桌面端(≥1024px) |
| 158 | + - 移动端底部导航栏(带图标和文字标签) |
| 159 | + - 平板迷你侧边栏(56px 图标导航) |
| 160 | + - 移动端弹窗自动切换为底部抽屉 |
| 161 | + - 支持下拉刷新 |
| 162 | + - 支持水平滑动容器 |
| 163 | + - 移动端卡片列表替代数据表格(RSS 页面) |
| 164 | + - CSS Grid 响应式布局(番剧卡片网格) |
| 165 | + - 移动端表单标签垂直堆叠,输入框全宽 |
| 166 | + - 触摸目标最小 44px,符合无障碍标准 |
| 167 | + - 安全区域支持(刘海屏设备) |
| 168 | + - `100dvh` 动态视口高度(修复移动端浏览器地址栏问题) |
| 169 | + - `viewport-fit=cover` 全屏设备支持 |
| 170 | + |
| 171 | +### 新组件 |
| 172 | + |
| 173 | +- `ab-bottom-sheet` — 触摸驱动的底部抽屉组件(拖动关闭、最大高度限制) |
| 174 | +- `ab-adaptive-modal` — 自适应弹窗(移动端底部抽屉 / 桌面端居中对话框) |
| 175 | +- `ab-pull-refresh` — 下拉刷新包装组件 |
| 176 | +- `ab-swipe-container` — 水平滑动容器(CSS scroll-snap) |
| 177 | +- `ab-data-list` — 移动端友好的卡片列表(替代 NDataTable) |
| 178 | +- `ab-mobile-nav` — 增强版底部导航栏(图标 + 标签 + 激活指示器) |
| 179 | +- `useSafeArea` — 安全区域组合式函数 |
| 180 | + |
| 181 | +### 性能优化 |
| 182 | + |
| 183 | +- 下载器 store 使用 `shallowRef` 替代 `ref`,避免大数组的深层响应式代理 |
| 184 | +- 表格列定义改为 `computed`,避免每次渲染重建 |
| 185 | +- RSS 表格列与数据分离,数据变化时不重建列配置 |
| 186 | +- 日历页移除重复的 `getAll()` 调用 |
| 187 | +- `ab-select` 的 `watchEffect` 改为 `watch`,消除挂载时的无效 emit |
| 188 | +- `useClipboard` 提升到 store 顶层,避免每次 `copy()` 创建新实例 |
| 189 | +- `setInterval` 替换为 `useIntervalFn`,自动生命周期管理 |
| 190 | + |
| 191 | +### 变更 |
| 192 | + |
| 193 | +- 重构搜索逻辑,移除 rxjs 依赖 |
| 194 | +- 搜索 store 导出重构以匹配组件期望 |
| 195 | +- 升级前端依赖 |
| 196 | +- 断点系统从单一 1024px 扩展为 640px + 1024px 双层 |
| 197 | +- `useBreakpointQuery` 新增 `isTablet`、`isMobileOrTablet`、`isTabletOrPC` |
| 198 | +- `media-query.vue` 新增 `#tablet` 插槽(回退到 `#mobile`) |
| 199 | +- UnoCSS 新增 `sm: 640px` 断点 |
| 200 | +- `ab-input` 移动端全宽 + 增大触摸目标样式 |
| 201 | +- 布局使用 `dvh` 单位替代 `vh`,支持 safe-area-inset |
| 202 | +- 修复日历页面未知列宽度问题 |
| 203 | +- 统一下载器页面操作栏按钮尺寸 |
| 204 | +- 修复移动端设置页面水平溢出问题 |
| 205 | + - 输入框添加 `max-width: 100%` 防止超出容器 |
| 206 | + - 折叠面板添加宽度约束和溢出隐藏 |
| 207 | + - 设置栅格添加 `min-width: 0` 允许收缩 |
| 208 | +- 修复移动端顶栏布局 |
| 209 | + - 搜索按钮改为弹性布局,填充 Logo 和图标之间的空间 |
| 210 | + - 减小图标按钮尺寸和间距,优化紧凑型布局 |
| 211 | + - 添加「点击搜索」文字提示 |
| 212 | +- 修复移动端搜索弹窗关闭按钮被截断问题 |
| 213 | + - 减小弹窗头部内边距和元素尺寸 |
| 214 | + - 搜索源选择按钮缩小至适配移动端 |
| 215 | +- 修复设置页面保存/取消按钮缺少加载状态 |
| 216 | +- 修复侧边栏展开动画抖动(rotateY → rotate) |
| 217 | +- 移动端底部导航标签字号从 10px 增至 11px,提升可读性 |
| 218 | +- 登录页背景动画添加 `will-change: transform` 优化 GPU 性能 |
| 219 | + |
| 220 | +## CI/基础设施 |
| 221 | + |
| 222 | +- CI 新增 PR 打开时的构建测试(dev 分支 PR 到 main 自动触发构建) |
| 223 | +- CI 升级 `actions/upload-artifact` 和 `actions/download-artifact` 到 v4 |
| 224 | +- Docker 构建移除 `linux/arm/v7` 平台(uv 镜像不支持) |
| 225 | +- 新增 CLAUDE.md 开发指南 |
0 commit comments