# Changelog ## 4.9.19 - 2026-07-31 - 修复 Docker / Node 自托管下 `/api/user/sync` 与 `/api/user/config` 无法从 `process.env` 读取 Upstash 凭据、持续返回 500 的问题;Redis 客户端改为按请求环境惰性创建,未配置同步时明确返回 503(#226 / PR #227)。 - 云端恢复和历史/收藏列表渲染会过滤缺少 `videoId`、`source`、`title` 或有效 `episodeIndex` 的损坏记录;全部记录无效时正常显示空状态,不再让账户首页因渲染异常永久崩溃(#228 / PR #229)。 - 豆瓣图片代理在 `imgN.doubanio.com` 线路不可达时按 `img9`、`img3`、`img2` 镜像回退,并保留最后一次上游响应状态,修复境外部署海报批量 500(PR #230)。 - 新增同步记录和豆瓣镜像回退回归测试;真实 Next.js standalone + Upstash REST 兼容环境下的托管登录、同步读写与配置读写均验证通过。 ## 4.9.18 - 2026-07-29 - 修复移动端播放器控制栏在窄屏下被裁切、最右侧“系统全屏”按钮不可见的问题(#224)。 - 控制栏现在根据播放器自身宽度进入紧凑布局:隐藏窄屏音量入口、压缩间距,并在极窄播放器中只显示当前播放时间;画中画、AirPlay、Cast、网页全屏与系统全屏按钮继续保留。 - 新增移动端播放器控制栏回归测试,锁定两个全屏入口在窄屏下不会再次被可选播放按钮挤出可视区。 ## 4.9.17 - 2026-07-29 - 新增基于主内容时长残差的组合式 M3U8 插播检测;残差只作为辅助证据,单个 `.033/.333/.867` 等合法分片不再被直接删除。 - 重复时长指纹恢复大内容块保护并限制出现比例,避免固定 GOP、等长章节或重复正片结构被整块误删。 - 跨源同路径检测同时比较来源域名与文件名模式,在增强 Multi-CDN 插播识别的同时保留合法 CDN 切换的保护条件。 - 安全审查后未启用基于 `new Function` 的动态 JS/TS 执行和公开脚本 API;该实现不是沙盒,且无法防止任意代码执行或主线程死循环。 - 广告检测器拆分为解析、主模式、重复指纹、时长网格与评分模块,并补充误删回归测试。 - Next.js 与配套 ESLint 配置升级至最新稳定版 16.2.12,消除 16.2.10 的多项框架级高风险公告;上游固定的 PostCSS/sharp 审计项仍等待官方稳定修复。 ## 4.9.16 - 2026-07-27 - 修复窗口宽度变化后右侧“历史播放记录”浮动按钮停留在原位置、无法继续贴靠右边缘的问题。 - 收藏与历史浮动按钮现在会在窗口尺寸变化时保持各自的左右锚点;已拖拽的按钮按可拖拽区域比例保留位置。 - 新增浮动按钮定位与窗口缩放回归测试。 ## 4.9.15 - 2026-07-25 - 修复播放页点击选集“排序”导致播放器闪烁/重播:`usePlayerSettings` 在非播放器核心设置变化时复用快照引用,避免 HLS 实例被销毁重建。 - 播放页布局对齐:视口控制移到内容区顶部,播放器与选集列顶部对齐;网页全屏按钮改用更贴合的框式图标。 - 选集支持网格排版 + 分段翻页(每页 50 集),长剧集可快速跳转;仍可切回列表模式。 - 源列表、视频详情与搜索卡片在封面缺失或加载失败时使用 `/placeholder-poster.svg` 占位图。 - 合并并加固 PR #219 广告检测升级:新增 M3U8 分片时长指纹去重,同时保留代理 URL 解包、interstitial 元数据剥离与关键词归一化。 - 修复 Android TV 9 / 旧 WebView 白屏:客户端静态资源目标从 `chrome83` 降到 `chrome69`,彻底去掉 `??` / `?.` / 逻辑赋值,兼容 Amlogic 等 Android 9 系统 WebView。 - 新增广告检测、播放器设置快照与 WebView 69 回归测试。 ## 4.9.13 - 2026-07-13 - 修复慢视频源超过 3 秒未返回时,前端提前结束搜索并错误显示“未找到结果”的问题;搜索现在等待服务端明确完成或响应流真正关闭。 - 实时延迟探测现在使用视频源的真实 `baseUrl`,不再把源 ID 当成 URL;`HEAD` 失败后的 `GET` 探测独立计时,避免把前一次失败耗时叠加为虚高延迟。 - 延迟探测改为最多 4 路并发并在上一轮结束后再调度下一轮,避免 Docker 自托管实例因慢源产生重叠探测请求。 - 搜索请求取消或超时后不再继续重试,并清理级联 AbortSignal 监听器;新增慢源、探测回退、并发上限和取消重试回归测试。 ## 4.9.12 - 2026-07-12 - 修复窄屏导航栏隐藏整个用户区域、导致登录用户无法退出的问题;退出按钮现在在所有视口宽度下保持可见,用户身份详情仍在桌面端显示。 - 高级模式设置页复用统一的账户管理组件,恢复当前账户信息、退出登录以及超级管理员的账户新增、编辑和删除入口。 - 新增账户入口回归测试,防止响应式样式或高级模式设置页再次移除关键认证操作。 ## 4.9.11 - 2026-07-09 - 修复登录成功后仍停留在登录页、刷新后又要求登录的循环问题。 - `PasswordGate` 登录成功后会直接解除客户端锁定,不再依赖整页刷新;服务端 session 存在但本地镜像缺失时也会直接补齐会话并进入应用。 - 服务端 session cookie 的 `Secure` 属性改为按实际请求协议和 `x-forwarded-proto` 判断,避免 Docker / HTTP 自托管生产模式下浏览器拒收登录 cookie。 - 新增登录 gate 状态决策和 session cookie 协议判断回归测试。 ## 4.9.10 - 2026-07-09 - 从首页移除硬编码的快捷搜索区,不再显示“内容分类”“电影类型”“年份”三组按钮。 - 标签管理入口和首页推荐区现在直接从内容类型切换与后端标签列表开始,避免顶部快捷搜索继续占用空间。 - 更新标签管理视图回归测试,锁定首页不再引用 `CategoryQuickSearch`。 ## 4.9.9 - 2026-07-09 - 修复首页管理标签入口混入快捷搜索流程的问题,打开管理模式后不再显示“内容分类”“电影类型”“年份”等搜索快捷项。 - 管理标签时隐藏电影/电视剧切换和推荐内容网格,让“完成 / 恢复默认 / 添加标签 / 标签列表”成为当前视图主体。 - 标签管理列表改为可换行 chip 布局,并在管理模式下使用矩形拖拽排序策略,避免标签区域被横向滚动行挤压。 - 新增标签管理视图回归测试,防止管理入口再次退化为搜索筛选界面。 ## 4.9.8 - 2026-07-09 - 修复登录完成跳转后 Network 面板出现 `/api/user/config` 和 `/api/user/sync` 两个 400 请求的问题。 - `AutoSync` 改为在 `PasswordGate` 确认服务端 session 并放行页面内容后再挂载,避免本地旧 session 早于服务端 cookie 校验触发云同步。 - 用户配置和云同步 API 在未认证时返回 `401 Authentication required`,不再使用 `400 Missing profileId` 表达会话缺失。 - 新增未认证响应回归测试,锁定受保护同步接口的状态码语义。 ## 4.9.7 - 2026-07-09 - 修复 Android TV / 小米电视旧 WebView 83 打开站点后白屏的问题。 - Next.js 构建后的浏览器静态 JS 会额外转译到 `chrome83`,避免 `??=`、`||=`、`&&=` 等逻辑赋值语法让旧 WebView 在解析阶段直接失败。 - Cloudflare Pages 输出目录同样会执行兼容性转译,确保 Docker/Node 自托管和 Cloudflare Pages 部署的浏览器资产一致。 - 新增 WebView 83 静态资源回归测试,防止不兼容语法重新进入构建产物。 ## 4.9.6 - 2026-07-09 - 修复移动端 Safari 网页横屏时弹幕字体被异常拉伸或压缩的问题。 - 弹幕画布改为优先读取未受 CSS transform 影响的布局尺寸,避免强制横屏旋转时使用横竖互换的 bounding box。 - 横竖屏、窗口尺寸和 `visualViewport` 变化后会重新同步画布 backing store,并按新尺寸重排活跃弹幕。 - 新增弹幕画布尺寸工具测试,覆盖 CSS transform 造成视觉尺寸与布局尺寸不一致的场景。 ## 4.9.5 - 2026-07-09 - Vercel Analytics 现在只会在真实 Vercel 部署中注入,Docker、自托管和 Cloudflare Pages 不再请求 `/_vercel/insights/script.js`。 - Cloudflare 部署环境判定优先于 Vercel 风格环境变量,避免适配器环境被误判为 Vercel。 - 新增部署环境单元测试,覆盖自托管、Vercel、Cloudflare 和混合环境变量场景。 ## 4.9.4 - 2026-07-08 - 设置页的代理播放区域显示内置 `/api/proxy` 端点和部署限制,明确该功能不是第三方 HTTP/SOCKS 代理服务器配置。 - 新增 `ALLOW_LAN_ACCESS` 环境变量:开启后 `npm run dev` / `npm run start` 会绑定 `0.0.0.0`,开发模式会放行常见内网 IPv4 来源。 - 新增 `LAN_ALLOWED_DEV_ORIGINS`,允许自定义 Next.js 开发模式的额外来源主机。 - README 补充局域网访问和内置媒体代理说明,并同步修正 Docker hostname 注释。 ## 4.9.3 - 2026-04-15 - 新增 Redis 托管账户模式:支持用户名密码登录、超级管理员账户 CRUD、权限编辑和密码重置。 - 认证改为服务端签名 HTTP-only 会话 Cookie,`/api/user/config` 与 `/api/user/sync` 不再信任客户端自报 `profileId`。 - 播放页线路列表补齐剩余问题:分辨率探测会按当前集数探测并缓存,打开线路列表时会自动定位当前线路,必要时自动展开隐藏项。 - 仓库补充了与新认证和线路列表逻辑对应的单元测试,并修正了本地 `eslint` 版本与 Next.js 规则链不兼容的问题。 ## 4.9.2 - 2026-04-12 - 设置页首次自动检查更新时不再让“检查更新”按钮自己持续转圈。 - 移除会反复闪烁的“正在整理结果”提示,避免用户误以为页面异常。 - 手动点击“检查更新”时才显示按钮转圈,状态反馈与用户操作保持一致。 ## 4.9.1 - 2026-04-12 - 移除仅支持 Node.js 的 `/api/site-icon` 路由,避免 `next-on-pages` 因非 Edge 路由中止构建。 - 站点图标改为由服务端布局直接解析,导航栏和播放器页继续显示运行时配置的图标。 - PWA manifest 回退为静态图标,确保 Cloudflare Pages、Docker 和本地构建链路一致可用。 ## 4.9.0 - 2026-04-12 - 设置页新增“版本与更新”卡片,直接显示当前版本、最近更新内容和检查结果。 - 新增手动“检查更新”按钮,会对比 GitHub `main` 分支上的最新版本元数据。 - 仓库新增更新日志文件,方便在项目内查看当前版本和更新说明。 ## 4.8.3 - 2026-04-12 - 站点图标改为支持运行时配置,Docker 镜像无需重新构建即可替换。 - 扩展播放器默认视口,减少桌面端播放器黑边。 - 修复 Android WebView 中 Cast SDK 判定以及全屏和画中画相关兼容性问题。