ZOYKUHot Board

xiaoguan521/guoappДокументация

xiaoguan521/guoapp documentation on GitHub Hot

Содержание (55 разделов)▾
上游近期功能参考迁移(0.2.163+2176,未验证开发快照)应用内更新源编译期可配置(0.2.165+2178,未验证开发快照)issue #6 导航调整(0.2.166+2179,未验证开发快照)Windows 原生依赖修复(0.2.164+2177,未验证开发快照)Android 6 兼容版使用真果鉴 Android 安装图标修正(0.2.152+2165)iOS 依赖安装修正(0.2.162+2175)iOS 两个版本同时安装(0.2.161+2174)手动更新与安全收敛(0.2.160+2173)Android APK 签名兼容修正(0.2.153+2166)历史单条删除入口修正(0.2.159+2172)存储权限移除与红果注册取流(0.2.158+2171)红果六签名取流(0.2.157+2170,未验证开发快照)红果预加载历史(0.2.155 / 0.2.156)红果连续选集取流兼容(0.2.154+2167)红果在线播放解析修复(0.2.151+2164)启动问题与红果榜单(0.2.18)剧果站源野果与帝果站源十二个新增短剧站源(0.2.55)主题与导航缓存与播放恢复下一集预加载与缓冲反馈红果弹幕追剧、更新提醒与历史用户与权限下载、后台运行与空间网络与资源设置局域网互联:追剧同步与推送播放(已接入,待验证)合并与本地成品Emby 导出与海报Android TV视频画质增强与超分方案(2026-09-22 调研,0.2.18 已接入源码)本轮接入范围场景判断与效果边界已核实的播放器接入条件算法与成熟实现的取舍论文数字和社区经验应如何使用设备端架构与实施依据分档、性能控制与交互失败恢复与实际生效判定分批实施与集中验收调研来源与证据索引安装包与平台状态GitHub Actions开发与构建集中检查与真机回归源码同步与恢复功能 TODO:与旧短剧库对照优先修复:分页、资料与近期协议差异功能完善对照证据与验收边界历史已完成的功能当前检查与平台状态
Языковое уведомление:Перевод на данный язык отсутствует. Отображается официальный английский оригинал.
Быстрая установка
git clone https://github.com/xiaoguan521/guoapp.git

红果鉴 / 真果鉴

Flutter 多端独立短剧应用,原名“短剧库 APP”。站源请求、解析、下载和播放均在设备上完成,不依赖旧项目或自建服务。当前源码版本:0.2.166+2179(未验证开发快照)。应用内更新源改为编译期可配置,默认查 GitHub Releases API(行为不变),CNB 发行线可通过 --dart-define 注入 UPDATE_METADATA_URL、UPDATE_ALLOWED_HOSTS、UPDATE_DOWNLOAD_PATH_PREFIX、UPDATE_RELEASE_PAGE 切换更新源,解析格式保持 GitHub Releases API 同构;Android 安装前的签名、版本号、SHA-256 校验不变。0.2.164 参考 Xanerix/guoapp 的近期实现,新增分文件本地配置、电视原生表单输入和 Windows 普通窗口位置记忆。0.2.162 补齐 RunnerTests 的真果鉴三组构建配置和 Swift 5.0 设置,并为红果鉴 Profile 配置引用对应 CocoaPods 配置,修正用户准备安装时的依赖安装错误。本轮为 iOS 新增独立的真果鉴构建配置与 Xcode scheme,使红果鉴和真果鉴使用不同应用标识,可在同一台 iPhone 上同时安装。0.2.160 新增关于页手动检查更新与 Android 下载后交由系统安装;移除依赖附带的开机接收器和开机权限,并删除黄果 AI 媒体证书失败后跳过校验的回退。以上变更尚未设备验收。0.2.159 修正 issue #5 的历史卡片单条删除入口。0.2.158 移除 Android 广泛存储权限与启动授权提示,导出改用系统选择的文件夹;同步两个参考库的注册设备思路,优先采用匿名注册身份与直接片源模型,保留六签名兼容回退,并补充 TLS 协议协商重试。0.2.157 已完成 GitHub 多端打包,但用户仍反馈播放失败,本轮尚未进行本地构建或实机播放验证。0.2.156 在红果单集取流失败时增加批量预加载备用请求;0.2.154 补齐播放器签名与响应兼容,0.2.153 修正正式 APK 签名配置。完整主版本的直播、推荐与搜索缓存、剧库导入导出、播放器生命周期与玻璃界面、网络出口切换、屏幕常亮、观看统计、断点续传与新增站源解析等功能继续保留。

按用户 2026-09-21 的要求,继续暂停本地静态检查、构建、自动化测试与设备回归。0.2.161+2174 本轮补齐 iOS 双版本构建配置和脚本选择、格式整理及收尾同步,未执行新的构建或设备验证。此前 0.2.160+2173 仅完成源码修改、格式整理和收尾同步,另按用户要求诊断已发布 APK 的签名与权限。此前 0.2.158 已通过现有 GitHub Actions 工作流,并发布 0.2.158 安装包;自动检查和打包不代表播放、权限或本轮 iOS 双版本设备验收通过。

上游近期功能参考迁移(0.2.163+2176,未验证开发快照)

本轮参考 Xanerix/guoapp 的分文件存储、电视输入和窗口状态提交,按当前仓库结构重新实现:

  • LocalStore.open() 首次启动把旧 SharedPreferences 快照迁移到应用支持目录的 local_store/,用户元数据、全局设置和每个用户的历史 / 追剧 / 播放偏好等分类分别保存为 JSON;写入先落临时文件,保留上一版 .bak,单类文件损坏时隔离该类并继续打开其他数据。
  • Android TV 的搜索、用户、密码、管理员恢复和代理表单通过原生隐藏输入框唤起系统输入法,普通 Android 手机及其他平台继续使用 Flutter 表单。
  • Windows 启动恢复上次普通窗口的位置和大小;最大化、全屏或最小化期间不覆盖已保存的普通窗口状态,首次启动居中。

本轮没有运行静态检查、构建、自动化测试或设备回归。Android TV 输入法、Windows 多显示器边界、存储迁移和损坏恢复均属于开发快照,待集中验证后再更新为已验证状态。

应用内更新源编译期可配置(0.2.165+2178,未验证开发快照)

lib/app_build.dart 新增 4 个 String.fromEnvironment 编译期常量:UPDATE_METADATA_URL、UPDATE_ALLOWED_HOSTS(逗号分隔 host 白名单)、UPDATE_DOWNLOAD_PATH_PREFIX、UPDATE_RELEASE_PAGE。默认值精确等价于现有 GitHub Releases API 硬编码行为,不传任何 --dart-define 时完全不变。

lib/app_update.dart 的 _trusted() 从白名单常量读取允许的 host,metadata 请求只放行 metadata URL 的 host,download 请求按路径前缀校验 metadata host 上的路径、其余白名单 host 直接放行。_check() 使用 updateMetadataUrl 替代硬编码 URI,_openPage() 使用 updateReleasePage。Android AppUpdatePlugin.kt 的 openReleasePage 改为由 Dart 侧传入允许的 host,原生校验 scheme=https 且 host 等于该值。

CNB 发行线通过 --dart-define 注入 4 个常量即可切换更新源。两条发行线使用各自签名、各自更新源,verifyPackage() 的签名一致、versionCode 递增、SHA-256 校验不变。元数据 JSON 格式保持 GitHub Releases API 同构,客户端解析逻辑未改动。

本轮没有运行构建或设备验证。

issue #6 导航调整(0.2.166+2179,未验证开发快照)

对应 issue #6:查找历史观看记录有点不方便:历史记录移入首页下方主菜单,追剧入口移入首页右上角“更多”菜单;直播在红果鉴和真果鉴两个编译版本中都默认隐藏,在关于页输入 Shineyue 激活后才显示在主菜单。关于页激活输入使用电视原生表单输入,保持手机、Windows 和 Android TV 的入口一致。

本轮没有运行静态检查、构建、自动化测试或设备回归,仍属于未验证开发快照。

Windows 原生依赖修复(0.2.164+2177,未验证开发快照)

media_kit_libs_windows_video 原先固定的 mpv 20260921 发布包已返回 404;现改为 mpv-dev-x86_64-20261103-git-a687796d9d.7z,并同步官方发布的 SHA256 校验值。Windows 构建仍需在 Windows CI 或电脑上集中验证。

编译方式 应用名称 可用站源
默认,不加参数 红果鉴 仅红果
构建脚本加 --all-sources 真果鉴 红果、黄豆、剧果、野果、帝果、黄果视频、黄果 AI、黄果旧版、芽果、猫果、饭果、观果、河果、星果、花果、牛果、网果、发果、皮果、伍果

直播入口统一隐藏;在“关于红果鉴”或“关于真果鉴”输入 Shineyue 后激活,激活后出现在主菜单。

全站源版首页提供“全部站源 / 红果 / 黄豆 / 剧果 / 野果 / 帝果 / 黄果”及十二个新增短剧站源入口;全部站源只汇总当前用户获准的入口。剧果、野果、帝果作为独立站源;黄果统一汇总视频、AI 与旧 API 的分类和内容。0.2.26 起帝果入口恢复显示,保留 dsd 标识以兼容已有缓存、备份和同步记录。其余站源入口保留各自的权限、分页、独立更新和健康检测,可在站源管理中分别维护。已有受限用户不会自动获得新增站源权限,管理员可在用户管理中勾选。

这是编译选项,应用内不能切换版本。标题、Android 桌面名称与电视横幅、Windows 窗口与分发文件名、iOS 显示名随编译选项变化。界面、站源调用、原生下载调度同时限制可用站源;红果版不会访问或继续执行其他站源的旧任务。

红果鉴 Android 包名为 com.duanju.duanju_app,真果鉴 Android 包名为 com.duanju.duanju_app.zhenguojian,两者使用不同的固定发布签名,可以在同一台手机上同时安装;Android 6 兼容版继续使用 com.duanju.duanju_app.android6。iOS 红果鉴应用标识为 com.duanju.duanjuApp,真果鉴为 com.duanju.duanjuApp.zhenguojian,可在同一台 iPhone 上同时安装。首次从旧的同包名真果鉴安装包切换到新包名时需要先卸载旧真果鉴,红果鉴现有包名保持不变。Windows 沿用原内部产品标识与数据目录。两个应用标识拥有各自的本机数据目录;需要在版本间迁移记录时使用应用内备份与恢复。备份格式保持兼容。

Android 6 兼容版

兼容版通过独立的 android6-* Release 发布,包名为 com.duanju.duanju_app.android6,可与 Android 8+ 正式版并存。它使用旧版 Flutter / Gradle、API 23 原生核心和独立依赖解析,不改主版本的最低系统要求,也不会触发现有正式版工作流。

兼容版定位为低版本电视和手机的在线播放版,保留浏览、搜索、详情、选集和在线播放;下载、后台下载、本地合并、媒体导出、HEIC 海报转换及局域网自动发现不提供。应用名称带“兼容版”后缀,避免与正式版混淆。该版本只作为未验证开发快照,需待 GitHub Actions 构建完成后再进行 Android 6 实机验收。

使用

功能 操作
浏览 标题栏依次提供排序与筛选、榜单图标、多选下载和展开搜索;榜单紧跟排序,窄屏常显。分类保持独立一行,内容区左右滑动切类;支持默认、名称、自然季号、上线日期、热度、播放量排序及连载状态筛选。排序作用于已加载内容,未知值置后;“更新剧库”或下拉执行查新、历史续载与资料补齐,窄屏的更新入口位于“更多”;已有内容时不在分类下显示异常提示;列表下滑接近底部自动加载下一页,底部“加载更多”保留为兜底
搜索 红果合并官网与名称索引,补齐可识别的缺漏季;输入停顿 300 毫秒显示最多 10 条红果联想,正式名称查询独立使用 50 条索引记录。剧果、野果及已实现在线搜索的新增站源调用各自接口或网页分页;单独搜索这些站源不调用红果联想。部分失败保留有效结果;最近 20 次搜索按用户保存并可清空。其余站源只筛选已加载短剧
推荐 仅红果站源的分类栏在“全部”后显示“推荐”,点选后直接在当前页浏览;可切换真人剧、漫剧、AI 剧,分别记住推荐位置,可刷新或继续推荐。其他站源与“全部站源”不显示此入口。公开推荐不连接官方账号
详情 普通点剧直接进入播放;下载和兜底入口仍保留详情页。详情页上方浏览封面、资料、追剧状态与可展开简介;底部固定“立即播放 / 继续播放”和下载入口。选集默认折叠,展开后每组 50 集,可切换范围、定位当前或输入集数跳转;红果同系列季显示为“相关推荐”;宽屏与电视采用资料、选集分栏
追剧与历史 按想看 / 在看 / 已看 / 有更新筛选追剧;红果已追剧发现新季后也进入“有更新”。追剧和历史均可搜索。卡片菜单设置状态、标记更新已读或删除单条历史;历史页每张卡片的“更多操作”提供“删除这条观看记录”,顶部垃圾桶为清空全部记录并二次确认;“继续观看”直达续播。每个用户独立保存,每 5 秒及退出播放时记录真实进度
卡片与批量下载 发现、追剧和历史卡片的“更多”提供收藏、状态和下载选集;电脑也可右键,电视可用菜单键。发现页长按卡片或点标题栏“多选下载”,进入后顶部显示“选择短剧”及文字“清空 / 取消”,底部显示已选数量与“下一步”,进入分集和画质预览后加入下载;一次最多 50 部,首页不再提供全选按钮
VIP 全站源版浏览黄豆或全部站源时显示 VIP 图标,仅过滤黄豆;默认隐藏已确认的 VIP,隐藏时斜线划过 VIP。封面左上角显示 VIP 标记,右上角保留菜单 / 多选。未知、免费、VIP 分别保存,未知不会覆盖已知状态;VIP 视频可能只有试看
手机播放 普通点剧直接进入播放。画面上滑下一集、下滑上一集;长按 350 毫秒临时 3 倍速,松开恢复。竖屏轻点播放 / 暂停,横屏轻点控制条,双击播放 / 暂停;返回、旋转、倍速、清晰度、推送、弹幕和画中画在播放器画面控制层;上一集 / 播放暂停 / 下一集只保留居中一组;非全屏选集使用视频下方 Tab,不在播放器层重复显示。视频下方为轻量的选集 / 简介 / 下载 Tab,选集和下载分集默认显示连续滚动紧凑网格;追剧放在简介内,下载放在下载 Tab;进度条和菜单操作独立于画面手势
画中画 0.2.20 在 Android 手机 / 平板播放器接入画中画按钮;0.2.37 起进入画中画前先隐藏 App 自绘控制层和弹幕覆盖并等待一帧,小窗只保留视频画面,转场使用视频区域 sourceRectHint,播放 / 暂停 / 返回应用 / 关闭交给系统 PiP 控件。0.2.38 修正非全屏进入 PiP 时下方 Tab 内容也被缩进小窗的问题,PiP 请求期间整页只渲染播放器。进入画中画后保持当前播放和进度保存,退出后恢复常规生命周期处理。Android TV、Windows 与 iOS 暂未接入系统级画中画,真实设备行为待集中验证
画质增强 仅 Windows 桌面端显示入口并运行增强链路;播放器“清晰度”面板可操作画质增强,支持关闭 / 自动 / 省电增强 / 清晰优先,开启后显示通用/真人、动漫/AI 动漫与跟随分类。增强应用后可点“原画对比”,再次点击恢复。Android 手机、Android TV 与 iOS 隐藏该功能,不初始化增强后端,避免移动端和电视端卡死
弹幕 红果在线播放默认开启;播放器侧边圆形“弹”字按钮可关闭、查看状态及失败重试,电视仍可在播放设置中操作。开关按本地用户保存并进入备份,本地播放不加载弹幕
横竖屏 电视模式统一保持横屏,竖屏视频按原比例居中;手机竖屏播放页不再显示额外标题栏,视频下方紧贴 Tab 内容区,选集和下载在视频下方用连续滚动紧凑方格显示,不遮挡画面;横屏采用视频与选集分栏。横屏视频随手机旋转进入全屏,也可手动全屏;退出后恢复方向跟随。全屏顶部只放返回和标题并避让状态栏,底部统一提供播放、进度、选集、倍速 / 画质、推送、弹幕、画中画和全屏,桌面端额外提供音量,底部控件整体避让虚拟导航栏;全屏设置与选集弹窗保持播放器暗色
Windows 播放画面获焦时,空格播放 / 暂停,左方向键后退 5 秒,右方向键轻按前进 5 秒、长按临时 3 倍速,上下方向键调音量 5%,M 静音,F / F11 / Ctrl+F 全屏,Esc 退出全屏或返回;按钮、菜单和列表保留自身键盘操作
外观 “更多 → 设置与备份 → 外观主题”选择浅色、深色或跟随系统;默认跟随系统,记住本机手动选择,配置备份也包含主题
下载 播放页“下载”Tab 和详情页下载入口均可选择分集与画质;按剧分组搜索、筛选,标题栏进入多选 / 全选;支持批量暂停、继续、重试、删除及清理任务但保留视频。“更新本剧”补新增或缺失分集
更多 站源管理、用户管理、设置与备份、界面模式、关于;设置中提供下载偏好及管理员“网络与资源”
站源 浏览与播放 搜索
红果 真人剧、漫剧、AI 剧及分集 联网搜索与官网搜索联想
黄豆(全站源版) 列表、VIP 标记及分集 筛选已加载短剧
剧果(全站源版) 热门、最新、接口分类、详情及可播放分集;签名 Cookie 接入在线播放、预加载和下载,待验证 站源在线搜索,支持继续加载
野果(全站源版) 接口实际分类、目录、详情及真实分集;默认从 analyze.buxefaex.cc 进入,支持 ygdj7.com 线路发现页和备用线路域名;按分集重新取流,保留接口提供的 H.264 / H.265 地址,待验证 站源在线分页搜索
帝果(全站源版) 网页分类、目录、详情及分集;参考 dsd-video-parser 接入 vplayer 签名解析,待验证 站源在线分页搜索
黄果视频(全站源版) 列表、详情及分集 筛选已加载短剧
黄果 AI(全站源版) 已接入列表、分类、详情及分集;0.2.12 目录和入口连接超时,历史密钥连接也未通过,播放尚未恢复验收 筛选已加载短剧
黄果旧版(全站源版) API 分类、列表、详情及分集 筛选已加载短剧
芽果、猫果、饭果、观果、河果、星果、花果、牛果、网果、发果、皮果、伍果(全站源版) 已接入设备端目录、详情、分集与播放解析;部分站源使用网页解析、登录令牌或签名接口,均待集中验证 按各站源实际接口接入;河果、星果等无稳定服务端搜索的站源保留已加载内容筛选

站源可用性、清晰度和区域限制取决于源站及网络;应用不解除源站 VIP 或其他授权限制。

真果鉴 Android 安装图标修正(0.2.152+2165)

Android 应用级图标原先固定指向通用播放图形。真果鉴的彩色果实图标只用于启动器别名,因此安装器展示应用信息时仍显示通用图形。现在全站源版将应用级 icon 与 roundIcon 都指向真果鉴图标,默认红果鉴仍使用现有图标。

本轮只完成源码与 README 更新,没有构建或运行测试;修正后的安装界面和桌面图标仍待 Android 实机确认。

iOS 依赖安装修正(0.2.162+2175)

用户执行真果鉴配置准备时,CocoaPods 报 RunnerTests: Swift 与 RunnerTests: Swift 5.0 并存。前一轮仅为项目及 Runner 添加真果鉴配置,测试 Target 仍只有原三组,CocoaPods 在解析项目新增配置时得到空 Swift 版本。本轮为 RunnerTests 补齐 Debug / Profile / Release-Zhenguojian,统一 Swift 5.0、测试宿主及独立测试包标识,并引用对应生成的 Pods 配置;红果鉴 Profile 改用独立 Flutter/Profile.xcconfig 引入 Pods profile 设置,避免引用 Release 配置导致的集成警告。

本轮对这个阻塞重新执行 pod install --project-directory=ios,已成功完成 12 个 Pods 的安装与集成,未再出现 Swift 版本冲突或 Profile 引用警告;没有运行测试、完整应用构建或设备回归。原生核心生成成功无需因该错误重复编译;修复后重新运行真果鉴 flutter build ios --config-only --no-codesign --flavor zhenguojian --dart-define=ALL_SOURCES=true 和 pod install --project-directory=ios,再在 Xcode 选择 Zhenguojian 安装。依赖版本更新提示及 --no-codesign 提示与此次 Swift 版本错误无关。

iOS 两个版本同时安装(0.2.161+2174)

沿用已有的独立配置:Runner Scheme 使用 com.duanju.duanjuApp,Zhenguojian Scheme 使用 com.duanju.duanjuApp.zhenguojian。两者的显示名称、站源范围与原生核心仍须一致。新增配置覆盖 Debug / Profile / Release,并在 Podfile 中映射对应构建模式;本轮补齐 build_ios.py --all-sources 对真果鉴 Scheme 的选择,避免自动打包时仍使用红果鉴标识。

在 macOS 项目目录为真果鉴准备原生核心与 Flutter 配置:

python3 scripts/build_ios.py --core-only --all-sources
flutter build ios --config-only --no-codesign --flavor zhenguojian --dart-define=ALL_SOURCES=true
pod install --project-directory=ios
open ios/Runner.xcworkspace

Xcode 顶部选择 Zhenguojian 和自己的 iPhone,在 Runner 的 Signing & Capabilities 中为该配置选开发者 Team 并启用自动签名,再清理构建文件夹并运行。使用新的标识安装会保留原红果鉴;记录分别存储,需要迁移时使用应用内备份与恢复,不需卸载原应用。新标识须能由自己的 Apple 开发者账号签名。

切回编译红果鉴时,先运行 python3 scripts/build_ios.py --core-only,再运行 flutter build ios --config-only --no-codesign --dart-define=ALL_SOURCES=false,并在 Xcode 选择 Runner。两个版本共用工作区内的原生核心产物,切换 Scheme 不会自动重编 Go 核心,不能省略这一步。直接运行完整 python3 scripts/build_ios.py --all-sources 则由脚本完成核心、依赖和真果鉴打包。源码配置已补齐,同机共存、签名和升级行为仍待实机验证。

手动更新与安全收敛(0.2.160+2173)

在“关于 → 检查更新”手动查询本项目 GitHub Releases,展示当前版本、可用版本、安装包大小及纯文本更新说明;启动应用不自动查询。Android 按编译版本、正式 / Android 6 兼容渠道、当前进程架构选择更高版本的正式发布资产,不跟随界面模式切换安装另一版。未发布、预发布、缺少可用 SHA-256 或架构不匹配的资产不用于应用内安装;检查失败可重试或打开官方发布页。

Android 支持带进度下载、取消及重试,安装包保存在应用缓存,无需共享存储权限。下载时限制 HTTPS 域名、重定向、文件大小和连接等待时间,下载结束核对发布资产的 SHA-256;安装前再次核对 SHA-256、包名、更高版本号和当前安装的签名证书。校验通过后由系统安装器询问用户确认,不静默安装。缺少同源安装授权时,说明用途并由用户点击打开设置;返回后仍需手动点击“继续安装”。安装前暂停本应用下载及合并队列并等待设置落盘,本地媒体处理进行中则暂缓安装;取消系统安装后可在原任务页手动继续。

此功能新增 REQUEST_INSTALL_PACKAGES 声明,只用于用户主动安装更新。它与此前移除的存储权限不同,系统安装来源授权也不在启动时申请。Windows 可在应用内比较版本,再打开发布页手动下载安装;本轮尚未实现 Windows 自动覆盖文件和重启。iOS 提供发布页入口并沿用既有签名安装流程,不在应用内安装 IPA。关于页读取 Android / Windows / iOS 的实际安装版本。以上更新流程、安装来源设置、电视系统安装器兼容性及更新后数据保留均未集中验证。

按用户反馈诊断 GitHub 已发布的 hongguojian-0.2.159+2172-arm64-v8a.apk:文件 SHA-256 为 7448757d2eef8c5dc913bcc89a1148a04beee17bfe8bb7bf8cfd85bf5e146436,与 Release 资产记录一致;Google apksig 校验 V1 / V2 均通过,证书 SHA-256 为 c560007b6b0c0bb07dc905e57a8e3559a045f5828a1c42d0172bb58e2ba837ab,与 0.2.158 同版同架构包一致。该诊断不等同于对用户手机上那个文件的鉴定,也不构成恶意行为或依赖完整审计。

该发布 APK 已无共享存储、所有文件访问、媒体读取、通讯录、短信、定位或无障碍服务权限,也未包含本轮新增的安装更新权限;因此不能把截图中的风险判定直接归因于这些权限或“没有签名”。但下载依赖合并了 RECEIVE_BOOT_COMPLETED 和导出的 RebootReceiver,虽然应用已关闭开机 / 升级后自动运行,本轮仍从清单中移除这些多余声明。保留下载通知、前台服务、屏幕常亮和局域网发现实际需要的权限。

代码审阅另发现黄果 AI 媒体请求在证书校验失败后自动改用跳过校验的连接,现删除该回退,证书错误直接失败;这会使证书无效的片源不可播放,不能通过降低连接安全性掩盖。局域网互联的自签名证书配对与指纹校验保留;现有 HTTP 直播 / 站源兼容仍有明文传输限制。Android 官方证书校验说明说明了跳过校验的中间人攻击风险,但不代表 vivo 一定据此判定。无具体检测名称或厂商复核结果,无法确定风险来自权限、组件、网络行为还是云端识别;不将其宣称为误报,也不承诺改包后风险提示消失。

Android APK 签名兼容修正(0.2.153+2166)

对比 Release 实际 APK 后确认:0.2.150+2163 与 0.2.151+2164 使用同一张固定发布证书,均通过 V2 签名校验;0.2.150+2161 与 +2162 则由各自 CI 运行器的临时 Android Debug 证书签名。后两种预览证书不可用于稳定升级。正式 APK 现在同时启用 V1 / V2;正式发布缺少固定签名 Secrets 时会失败,PR 仍可生成 Debug 预览 APK,但不上传 Release。

若设备已安装由 +2161 或 +2162 临时证书签名的同包名 APK,Android 不允许用另一证书直接覆盖;需要先备份应用内数据并卸载旧包,再安装固定证书版本。当前版本签名修改尚未构建或在 Vivo 设备上验证。

历史单条删除入口修正(0.2.159+2172)

对应 issue #5:历史观看记录的小建议。首页以追剧模式创建 SavedLibrary,在内部切换到历史后,菜单原先仍读取初始 widget.history,导致单条删除选项被隐藏。现改为读取当前 _history,让历史卡片“更多操作”正常显示“删除这条观看记录”;追剧卡片不显示该项。

复用既有按用户隔离的删除方法,移除该剧观看进度及对应同步进度,追剧状态和下载文件保留。入口为“追剧 → 历史 → 卡片右上角更多操作 → 删除这条观看记录”。本轮没有执行本地分析、测试、构建或设备验证;Android 手机、Windows、Android TV、iOS 的菜单与删除持久化行为待集中确认。

存储权限移除与红果注册取流(0.2.158+2171)

Android 清单移除读写共享存储、所有文件访问和媒体库读取权限,并在清单合并时排除依赖中同名权限;删除旧共享存储兼容开关。应用不再在启动、设置或导出前跳转“所有文件访问”授权页,也不调用旧版存储运行时授权。旧备份中的提示标记继续兼容读取,但已不参与启动逻辑。

下载与媒体处理继续使用应用自身目录。导出已下载分集时,Android 使用系统文件夹选择器,只持有用户所选目录的访问许可;文件复制在后台执行,同名文件跳过,复制异常尝试清理新建目标,源文件保留。旧版记住的共享存储路径需要重新通过选择器选定;目录访问许可被系统收回或来自其他设备的备份时,也需重新选择。没有系统文件夹选择器的电视设备可继续下载至应用目录,但不能导出到其他文件夹。Windows / iOS 原有选择和复制方式保留。本轮尚未实机核对权限列表或安全软件提示,移除源码权限不代表旧安装包的风险标记会自动消失。

本轮对照的源码快照:

首先使用官方 HTTPS 注册端点,以 gzip、SHA-512 与 AES-128-CBC 编码匿名注册请求;播放、下载与预取共享当前核心实例内的一次注册。注册身份只保留在内存,注册失败也缓存,不因每集取流重复注册。没有读取真实设备标识、账号或电话信息,也不保存注册响应中的令牌、Cookie 或完整响应。字符串设备号精确保留,拒绝零值与异常 ID。

注册后优先按参考库的当前请求配置调用批量播放接口。优先解析当前集直接返回的 video_list,只有没有直接列表时才使用 fallback_api。加密片源缺少有效密钥时停止该候选,不当作明文播放。若当前请求仍空响应,再用同一注册身份尝试六签名;旧单集与预加载兼容线路也优先复用该身份,必要时使用既有的兼容设备注册。主流程最多 20 秒,单次请求最多 8 秒,兼容流程共用 12 秒预算;仍保留官网与备用线路。

对截图中的 tls: no application protocol,只在红果相关域名出现该握手错误且请求可重放时,分别尝试 HTTP/1.1 和 HTTP/2 的 ALPN 配置;保持原代理路由与证书校验。此处是协议兼容处理,不等于已证明备用服务可用。

注册与直接模型适配沿用 GPL-3.0-only;新增来源为 tsukiyo-zero/hongguoTV 388931852ddc614db8b00775a3dc54c5ede6307f 的 DeviceRegister.kt,其原来源为 charlie901208/HGTV 的 feat/phone-login。来源和修改说明已纳入“关于 → 开源许可”,完整许可文本继续随源码和安装资源提供。

本轮没有执行本地静态分析、构建、自动化、线上取流、站源图片请求或设备回归。Android 权限 / 文件夹导出、Windows 播放以及 Android TV / iOS 行为均保持待验证;推送后的自动构建结果另行记录。

红果六签名取流(0.2.157+2170,未验证开发快照)

针对 App 接口空响应、网页与备用线路也无法取得地址的错误,优先请求 /novel/player/multi_video_model/v1/,在设备端生成 X-Gorgon、X-Khronos、X-Ladon、X-Argus、X-Helios、X-Medusa 六种签名。请求体、最终查询串、设备号和时间戳保持一致;签名在网络限流等待结束后生成,并按参考实现选择可用的签名分支。对照 JavaScript 参考实现补上 F13 分支中递推状态的更新。

只读取响应中当前分集 ID 对应的 video_model,兼容对象、JSON 与 Base64 JSON;若返回 fallback_api,二次请求 video_info.data。使用 key_seed 派生 AES-128-CBC 密钥解码媒体地址,spade_a 保留原有媒体密钥解析,并兼容参考实现的长度边界与初始解码状态。支持主、备地址及数组形式的播放列表,优先 H.264,再选择 HEVC,保留画质与备用地址。接口地址及每次 GET 跳转均限制在允许的 HTTPS 域名,签名 POST 不跟随跳转;应用媒体使用对应 User-Agent,不附空 Referer。

六签名取流总等待上限 16 秒,单次 JSON 请求包含限流等待在内最多 8 秒;失败后兼容线路共用 12 秒预算,其中旧单集接口最多 5 秒,再尝试批量预加载。之后继续原有官网与备用线路。取消请求会终止当前取流,重试会重新生成设备参数和签名。诊断记录区分六签名取流成功与失败,不记录签名头或媒体密钥。

本轮本地仅整理源码格式和执行收尾同步,没有启动本地静态分析、构建、测试、真实接口或设备验证。推送后现有 GitHub Actions 的 checks、两版 Android / Windows / iOS 打包均成功,并发布 0.2.157+2170。Android 手机、Windows、Android TV、iOS 的实际运行及播放仍保留未验证状态,不能据此宣称所有红果剧已恢复播放。

参考与来源:

  • zhoufuweigg/guoapp PR #14,Go 签名移植参考固定到 limbia/guoapp 96d3a6407ade99be5b8fd2ce18206c66bda2d69a。本项目另行适配请求签名时机、ID 生成、取消与超时、地址限制、媒体变体及诊断。
  • jackotom/hongguo-drama 的 app-source.js,固定提交 74a8c7523790df69fbde721ea4dc8194b6412475,按 GPL-3.0-only 发布。原来源声明:Signing and Spade algorithms adapted from woshishiq1/drpys commit 22261adfa31435e3b3ef5a730b8a2a75bcaf1715, spider/js/红果果[短].js, via N3urda/hongguoTV eea73e6a45569a2cbbb9440f7cd5290c459b0b70。
  • 六签名模块保留 GPL-3.0-only 标识,相关移植逻辑沿用该许可;完整许可文本随源码及两种 Android 构建配置打包,位于 native/licenses/hongguo-GPL-3.0.txt,应用内可从“关于 → 开源许可”查看。分发时保留来源、修改说明、许可文本及对应源码。

红果预加载历史(0.2.155 / 0.2.156)

0.2.155 开发过程中曾接入批量取流、二次取址及解密,随后发布标签对应的提交 0a16919 移除了其中部分实现,实际保留单集接口。旧文档所列的播放模式切换、完整批量取流及 Playlist 规范化不代表该 Release 的功能。0.2.156 增加了单集失败后的预加载备用请求;0.2.157 在此基础上补全上述新线路,仍需集中验证。

红果连续选集取流兼容(0.2.154+2167)

参考 Xanerix/guoapp 的红果取流修复,播放器接口在既有 X-Gorgon / X-Khronos 签名之外还需要 X-Argus / X-Ladon;缺失时可能返回空数据或错误码。当前设备端请求为每次普通红果 App 接口请求生成随机签名参数,并保留原有评论接口的独立签名。

播放响应现在同时兼容 JSON 或 Base64 JSON 编码的 video_model,以及直接返回的扁平 video_list。选集仍按每集自己的视频 ID 重新请求播放信息,再按现有规则筛选可播放媒体和密钥;官网与备用线路继续作为回退。参考仓库采用了相同的签名和响应结构兼容方式,适用于截图中 App 接口没有有效数据、网页返回 404、备用接口未取到媒体的失败路径。

本轮只完成源码和 README 更新,没有构建、运行测试或进行连续播放设备验证;红果手机、Android TV、Windows 与 iOS 均待集中验证。

红果在线播放解析修复(0.2.151+2164)

参考 guoapp3 的红果修复记录,红果 App 取流接口会返回空体或未知异常,而官网播放页已从旧的 video_player_info 结构迁到 protectedPlayback;网页公开媒体地址现在位于 JSON-LD TVEpisode.contentUrl,并采用 /video/public/{vid}/{quality}p.mp4 路径。此前本项目网页回退只读取旧字段,因而 App 取流失败后仍无法得到媒体地址。

现有取流顺序保留为 App 接口、官网网页、第三方备用接口。网页解析保留旧字段兼容;旧字段没有地址时,从 JSON-LD 与页面公开地址中提取与当前视频 ID 匹配的 MP4 地址,按画质从高到低选择,读取 durationSeconds,没有发现地址时构造 360p 公共地址作为最后回退。Android、Windows、Android TV 与 iOS 共用 Go 原生核心,因此一处解析更新覆盖这些平台的红果播放链路。

本轮只完成源码与 README 更新,没有构建、联网端到端播放或运行测试;所有平台仍标记为未验证开发快照,也未请求或处理站源图片、真实播放列表或媒体文件。

启动问题与红果榜单(0.2.18)

0.2.17 的野果解析在包初始化时调用 regexp.MustCompile,使用了 Go 不支持的 {1,2400} 重复上限,导致加载原生核心时直接 panic,与当前选择哪一个站源无关。0.2.18 改用无上限量词,并在匹配后保留 2400 字节的导入内容限制。设备原有日志记录了 libduanju_core.so 内的重复 SIGABRT,与源码问题吻合;日志没有直接打印出该 Go panic 文本,修复后启动尚未在设备上复验。

红果榜单当前读取官网 /rank/hot-drama 等榜单页面,优先解析页面携带的结构化 JSON。它与红果目录、搜索、播放所用接口是不同链路。已取得的官网响应中,真实榜单条目已渲染,但 content 仍为空、异步 Promise 没有后续结果;旧代码只认该数据块,因而用户反复重试才可能得到完整响应。这个情形不需要页面布局变化也会触发。

新增结构化数据、JSON-LD 与语义化榜单条目的兼容解析,读取官方实际名次,以路由、规范网址、当前页、分页链接和剧目 ID 核对身份;不依赖带哈希的 CSS 类名,不将推荐顺序当作榜单。首页使用规范路径,避免多余的 page=1 重定向。数据不完整时最多请求 3 次,总时限 18 秒,重试间隔 300 / 1200 毫秒并请求重新验证缓存;网络层自身的重试不再叠加外层重试。完整成功结果沿用 5 分钟缓存、相同请求合并和最长 24 小时的旧榜单回退,失败刷新保留已有列表。

同时追踪了官网前端的 Modern.js __loader 请求;调研时该入口返回 204 空响应,尚未找到稳定返回相同榜单的独立 JSON API,因此本轮仍保留网页数据依赖并明确记录。榜单冷启动、不同分类、续页、超时与缓存回退等待集中验证。

剧果站源

0.2.16 依据用户提供的原站源脚本接入 https://huangju.net 与 https://api.huangju.net;0.2.19 将用户可见名称统一改为“剧果”,内部 huangju 标识、接口域名和数据兼容边界不变。默认“全部”使用热门目录,另提供“最新”及接口实际返回的分类;目录和在线搜索使用响应中的分页信息,失败保留已有结果。详情按真实分集编号排序,跳过明确标为不可播放的分集,保留源站总集数与连载状态;剧目身份沿用脚本的 slug-id,标题、简介、地区、年份和评分按返回资料展示。

原生核心通过 /auth/guest 建立匿名访客会话,并发请求共用一次授权;接口返回有效 JSON 的 401 / 403 时刷新一次,浏览器验证或限流错误仍遵循退避。/play/<分集 ID> 返回的 CloudFront Policy / Signature / Key-Pair-Id 三枚 Cookie 留在当前设备的媒体会话中,仅发送给该播放地址的来源;同来源的播放列表、分片、密钥、预加载及下载请求共用凭证,跨来源重定向不携带这些 Cookie。缺失凭证明确报错;已知到期时间会缩短预加载计划寿命,播放重试与下载继续重新解析地址。

剧果复用详情回写、站源更新、下载合集、追剧与备份权限。访客令牌和媒体 Cookie 不进入追剧记录、配置备份或局域网同步;推送播放由接收设备自行取流。局域网连接不再限制为五个站源,新版用扩展能力字段交换完整范围,同时保留旧版认识的站源字段;与旧版连接时只同步双方共有的站源,剧果记录保留在支持它的设备上。上述接口与双端行为尚未集中验证,本轮没有请求站源图片或真实媒体。

野果与帝果站源

0.2.17 接入用户指定的野果与帝果;野果当前默认入口为 https://analyze.buxefaex.cc/,线路发现页为 https://ygdj7.com/,旧的 delta.ygrwdsgt.cc、yeguodj.com 以及 *.buxefaex.cc / *.fzchosdi.cc 线路仍按野果识别。帝果规则参考用户提供的 Richy-17.txt。两者均由 Go 原生核心在设备内请求和解析,复用现有详情回写、追剧、观看记录、站源更新、健康检测、预加载、下载与局域网共同站源协商。0.2.25 起帝果曾因 VIP 视频播放问题暂停显示入口;0.2.26 参考 dsd-video-parser 重做 vplayer 签名解析并恢复入口。旧缓存、备份和同步记录继续识别 dsd 标识。野果和帝果受限用户需由管理员分配新增站源权限。

野果从页面取得实际 API 入口,读取当次前端发布的公开接口配置,在内存中完成响应签名校验和 AES-CBC 解码;配置并发共用、定时刷新,校验失败只重新取得一次。不把接口解码参数写入源码、用户备份或同步记录。分类按接口返回的主题、设定、背景、时间和推荐选项生成;目录及搜索核对页码、条数、总数与续页标记。详情保留真实分集 ID、序号、总集数和连载状态,跳过广告条目;播放时重新调用分集接口并核对剧集与分集身份,优先使用 H.264,保留返回的 H.265 备用地址。带时效参数的媒体地址不写入分集目录。

帝果从网页取得分类,“全部”交错汇总各分类的同一页;依据分页控件记录各分类末页,停止已结束分类的续载,部分失败保留有效结果。搜索使用源站搜索页面并核对返回页码。详情解析 player_aaaa、分集链接和当前视频资料;兼容普通、URL 编码及 Base64 编码的播放器地址。未提供播放器参数时,按参考脚本将当前页面同站 /video…/…/1.jpg 等媒体目录地址转换为 1000k/index.m3u8 候选,仅用于首线路的第一段;这个过程只读取文本地址,不请求或处理图片内容。0.2.26 参考 dsd-video-parser 的 /addons/vplayer/?url=... 链路,原生实现受限 aaencode 解码,从页面脚本提取签名 vPath,签名成功后媒体播放、预加载和下载使用 vplayer 来源头。源站拒绝请求、返回试看或无效播放列表时明确报错,播放重试和下载继续均重新解析。

本轮只进行了参考项目源码分析、文本入口核对和设备端解析改造,没有请求站源图片、真实播放列表、密钥或媒体文件。Android 手机、Windows、Android TV 与 iOS 的两站行为全部待集中验收;0.2.26 起帝果入口已恢复到全站源版。

十二个新增短剧站源(0.2.55)

本轮在 Go 原生核心内接入芽果、猫果、饭果、观果、河果、星果、花果、牛果、网果、发果、皮果和伍果,复用现有权限、站源管理、目录缓存、详情回写、追剧、下载、预加载及局域网站源协商。不同站源分别适配 JSON 接口、Next.js 页面、Maccms 网页、登录令牌、签名请求和 AES 响应;站源标识与既有红果、黄豆、剧果、野果、帝果、黄果互不冲突。

站源 已接入范围 当前状态
芽果、猫果、饭果、观果、河果、星果 分类 / 目录、详情、分集和取流适配 源码已接入,待集中验证
花果、牛果、网果、发果、皮果、伍果 网页或接口目录、详情、分集和取流适配 源码已接入,待集中验证;皮果仍受 Cloudflare 校验限制

本轮没有请求或处理任何站源图片、真实播放列表、密钥或媒体文件;所有新增站源、弹幕表情和电视遥控焦点实现均属于未验证开发快照。

主题与导航

浅色主题使用暖白背景、深色文字,首页、追剧、详情、下载、用户、设置和播放器页面外壳同步切换;视频画布、加载 / 错误遮罩和视频覆盖控制保持深色,避免影响画面可读性。切换主题保留当前页面、站源及导航位置。

发现、追剧和最近观看使用一致的海报网格:封面固定 2:3,标题统一预留两行,分类或进度统一预留一行;长文字省略,系统大字同步增加文字区域高度,保持同一行卡片对齐。首页及详情页更新期间刷新图标持续旋转并禁止重复点击,完成或失败后恢复。

手机底部导航使用图标、常显文字和细线标记选中项;系统虚拟按键 / 手势区域延续当前背景,系统图标随主题调整明暗。导航支持系统大字设置、键盘焦点和无障碍选中状态。

0.2.12 将排序 / 筛选和下载多选 / 全选移入对应页面标题栏。详情将追剧与观看状态合为资料区的菜单,主要播放动作固定在底部安全区;简介默认收起,避免长资料挤占选集。详情、下载选集和播放器共用每组 50 集的范围选择、精确跳转与当前集定位,播放页集中提供上一集、选集、下一集,画质 / 倍速在空间不足时从播放设置操作。紧凑视频区域减少重复控制,实际显示和遥控操作尚待平台验证。

0.2.15 按界面反馈移除首页受 50 部上限限制的全选按钮,多选标题栏改用文字“清空 / 取消”。手机多选时以底部操作栏替换底部导航,选中数量靠左、“下一步”靠右,取消后恢复导航;电脑与电视将操作栏固定在内容区底部。空选时显示点选提示,窄屏大字改为上下排列。红果推荐作为“全部”后的专属分类在当前页切换。0.2.16 将榜单改为顶部标题栏图标,紧接“排序与筛选”,移出分类行;窄屏常显榜单,更新可下拉或从“更多”操作。

设计参考 Android 系统栏与边到边布局、Flutter 系统栏适配和 NN/g 图标可用性:处理系统安全区,保留文字标签,并提供颜色之外的选中标记。

缓存与播放恢复

目录条目及页码缓存 15 分钟;过期后先显示缓存再更新,失败保留原列表,手动刷新立即联网。红果总目录和各分类分别保存真实 offset、会话、设备标识及分页签名,续页按保存的位置请求;刷新查新保留历史续载位置。已移除 6000 条和 500 页的静默截断。目录达到 32 MiB 保存上限或写入失败时保留当前内存内容并显示未保存,先重试保存再继续加载,不把未落盘结果标为新鲜缓存。以上为 0.2.9 实现,重启等行为尚待集中验证。搜索联想失败不影响手动搜索;关闭搜索、换词、切换分类或离开页面会取消过期请求。正式搜索设 40 秒总时限,补漏季最多 32 次查询,前台目录 / 搜索等在途请求最多 16 个;不使用网页 totalCount 虚构下一页。

海报在设备内处理和缓存,首页、详情、榜单和追剧共用;有效期 30 天,上限 256 MB / 2000 张,单张上限 20 MB,超限清理较久未使用的图片。过期更新失败时继续显示缓存,失败海报可手动重试。保留 AES / XOR 解码,HEIC 主图片在本地提取后由随包媒体库转成 JPEG,兼容缓存单独限制为 64 MB / 128 张,转换串行执行并清理临时文件。缺失或失效地址会从详情补齐,重复请求合并并设置重试间隔;显式打开详情或播放会通知同一剧集的失败海报重试,后台资料更新按 ID 通知首页、分类、榜单、收藏和历史;新图床无需登记,HTTPS 连接失败可尝试可信 DNS 返回的备用地址。

倍速、源画质、画质增强模式与画面类型、弹幕开关按本地用户保存,并纳入配置备份;移动端和电视端会保留但不使用画质增强偏好。新开播放器沿用偏好。自动连播和下一集预加载默认始终开启,旧偏好中的关闭值会被忽略。临时 3 倍速不会改写偏好,切集、弹出菜单、失去焦点、转入后台或退出页面时结束临时倍速;保存失败会提示重试。

正常播放与下载不转码、不降低清晰度。随包的 media_kit / libmpv 在设备解码;0.2.12 将远程 MP4 与 HLS 统一接入设备内流服务,处理请求头、密钥、预取缓存及应用代理,不经远程中转。本地已下载视频继续读取设备文件。

播放失败或前台连续 20 秒无进度时,优先尝试备用地址。自动画质先试同画质备用地址及兼容编码,再试较低画质;手选画质只切同画质线路。备用地址耗尽后最多重新解析一次,每轮最多自动恢复 3 次,之后提供手动重试。切线保留进度和倍速;暂停、后台不会触发卡顿切线。

下一集预加载与缓冲反馈

0.2.12 接入下一集预加载;0.2.33 起预加载与自动连播默认始终开启。前台正常播放至少 2 秒、播放器报告缓冲余量至少 5 秒,且已进入本集后半段或最后 45 秒时,低优先级解析并预取下一集;不启动本地视频预取。主动切集、播放失败、进入后台或切换用户会取消在途工作并释放过期播放计划,正常连播可接用已就绪计划。

解析时限 15 秒,预取最多 6 秒、4 MiB、8 次请求;HLS 限制列表深度和前两段、约 8 秒媒体,MP4 只取开头并在有效范围及版本校验通过后复用。就绪计划最多保留 2 分钟,0.2.16 对剧果等返回有效期的计划提前 5 秒停止复用;失败至少间隔 30 秒再试,避免无限预取或反复解析。

播放器缓冲进度在视频进度条的二级轨道中展示,不再额外显示“已缓冲至”文字。底层仍保留 mpv 缓冲区间解析工具,供后续诊断或更细的可视化使用。0.2.12 的实现曾完成静态与核心编译检查,0.2.16 的凭证有效期处理仅完成源码接入与格式整理;预取复用、网络切换和各平台缓存反馈待集中验证。

2026-09-22 对“启动时限定格式,后续不再探测”的评估:设备与播放器的解码能力适合在启动后后台查询或首次播放时初始化并缓存,系统、播放器库或驱动变化时重新取得。应按 H.264 / HEVC、位深、分辨率和帧率等实际能力选择候选,并保留失败回退;不按 iOS / Android 固定为 HLS / MP4。两种系统均可通过适合的播放器处理 HLS 和 MP4,HLS 的分片本身也可以是 fMP4;交付格式不能代替编码兼容性判断。本 App 各平台的实际表现仍待验收。

当前应用层的普通在线播放没有额外调用 FFprobe,完整媒体探测主要用于本地媒体整理、合并与导出。每段视频仍需取得有效地址及授权、读取播放列表或文件头,由播放器完成解复用与解码器初始化,不能通过一次设备查询取消。现有设备内流服务会保留解析得到的根播放列表,下一集预加载可复用地址和开头数据。后续应在恢复集中验证后记录地址解析、列表、首段 / 文件头与首帧耗时,优先处理重复请求和预加载未命中,再决定是否增加能力缓存;耗时初始化不应阻塞首页。本段为代码层评估,尚未实施新的能力缓存或格式选择策略,也未作性能测量。

红果弹幕

0.2.11 为两版应用接入红果在线播放弹幕,默认开启。0.2.33 起手机和桌面播放器直接在画面控制层提供弹幕按钮,失败时同一按钮可重试;电视可在播放设置中操作。开关按用户保存、重启恢复并纳入备份,旧备份未包含开关时使用开启状态。

仅显示经过当前播放分集 ID、源站状态和原始毫秒时间戳校验的弹幕文字,过滤重复及无效内容;普通评论不进入弹幕。文字限定在实际视频画面内,暂停和缓冲时停止移动,倍速、跳转和切集按视频时间同步。关闭、切集、切换用户或离开播放器会清理旧内容并取消在途请求;后台隐藏弹幕并停止请求,本地播放不联网加载弹幕。

弹幕使用独立低优先级请求、短超时及有限缓存,按源站真实时间游标续载。失败只在弹幕设置中显示状态与重试入口,播放和下载可继续。Flutter 线性动画负责移动,普通播放进度回报不会重启动画,文字测量仅在内容或布局变化时执行。必要合成测试已通过,真实站源返回和各平台显示效果仍待集中验收。

追剧、更新提醒与历史

追剧可设为“想看 / 在看 / 已看”。开始实际观看后,“想看”自动变为“在看”;已知最后一集播放完后自动标为“已看”,发现更多分集时重新变为“在看”。手动“标记已看”独立保存,重看或新集更新不会覆盖该标记,也不会伪造分集和播放进度。

新集数量按已取得的目录或详情中的集数增长计算。加入追剧时记录已知集数,原先未知的集数首次补齐只建立基准;旧资料或临时变少的集数不会降低基准。卡片菜单或详情页可“标记更新已读”,手动标记已看也会将当前已知更新设为已读。进入详情、刷新目录和重启不会自行清除提醒;尚未取得的源站更新不会提前显示。

红果系列剧按标题末尾“第 N 季 / 第 N 部”识别,未带季号的同名剧可作为第一季参与本地匹配。刷新红果剧库时,如果已追剧在本地发现后续季,会在追剧卡片、详情和“有更新”筛选中显示“新季”提醒;点入对应新季或标记更新已读后清除提醒,不自动把新季加入追剧。该提醒进入本机备份;局域网同步暂不扩展新季提醒协议,同步旧追剧记录时保留本机已发现的提醒。

追剧与历史支持本地搜索剧名、简介和标签,不发起站源搜索。“继续观看”使用真实分集和进度,已看完的分集优先从后续可用集数开始;手动已看标记不影响续播。单条删除或清空历史会移除对应播放进度,追剧状态与更新已读基准保留。新增状态按用户隔离并进入配置备份,旧备份仍可导入。

用户与权限

“更多 → 用户管理”提供独立界面。初始用户为管理员;先设置至少 6 位管理员密码,才能创建其他用户。

管理员可勾选用户能访问的站源,设置“允许下载和本地媒体”。关闭后仅能在线观看,下载、目录、合并和导出入口隐藏,相关调用也检查权限。用户管理提供“启动时需要登录”开关;开启时有密码的当前用户在冷启动需要解锁,关闭后保留密码,仅在切换用户或手动锁定时验证。存在其他用户时不能取消管理员密码。

追剧和观看记录按用户隔离。下载文件在本机共享,有下载权限的用户只能在应用中访问获准站源的内容。这些用户属于当前设备,不是远程服务器账号。

“设置与备份”可导出和恢复用户、密码校验信息、追剧、观看记录和偏好设置。备份不含视频、原生下载密钥或其他插件私有配置;恢复前校验格式并确认覆盖,视频文件保留。密码使用随机盐和 PBKDF2-HMAC-SHA256 校验值,不保存明文。

0.2.9 将用户与记录、播放 / 排序偏好、最近搜索统一作为完整本地快照提交;写入返回 false 或抛错时重新读取并恢复原快照,无法确认恢复则锁定访问。损坏用户配置不会回退成无密码管理员,恢复界面支持导出原始配置、重新读取或使用含管理员密码的备份恢复;视频与插件私有配置不参与快照覆盖。这些失败恢复路径尚未验证。

下载、后台运行与空间

在详情底部点击下载图标,选择分集和画质。“设置与备份 → 下载偏好”按用户保存默认画质及是否包含 VIP,初始为自动高清、排除 VIP,也用于批量下载和“更新本剧”。选集每组 50 集,标题栏提供全选、清空及非 VIP 选择;单次最多选择 500 集,更多分集使用多剧批量下载。VIP 集可能仅有试看,指定画质缺失时使用源站可用版本。

发现页支持多选批量下载,每次最多选择 50 部。预览先逐部读取分集,选择共同画质以及是否包含 VIP,再点击“加入下载”;读取失败的剧可单独保留为待重试,其余剧可继续添加。长剧自动分批加入,不截断超过 500 集的已选内容。重试会跳过已确认加入的分集,已有任务保持去重;停止、退出页面或切换用户后不再添加后续分集,已经提交的批次及队列任务保留。需要指定单集时,使用卡片菜单的“下载选集”。

“下载”按剧分组,支持本地搜索、下载状态和连载状态筛选。标题栏提供筛选、多选、全选当前及本地媒体入口;可按整部剧或分集批量暂停、继续 / 重试、取消 / 删除,失败结果可单独重试。批次最多 500 个任务,停止或退出后不提交后续批次,已经完成的操作保留。

“清理任务,保留视频”只隐藏已完成任务,在“已保留视频”筛选中仍可查看、恢复任务或本地播放;不占用 5000 条未清理下载任务额度,下载索引仍受 32 MiB 保存上限约束。“更新本剧”重新读取分集并更新资料,只添加新增、失败或文件缺失的分集;保留有效已下载文件、进行中的任务及手动暂停状态。每次重新完成下载更新文件版本,供合并恢复与清理核对。

同时下载数量默认 2 集,管理员可在“网络与资源”设为 1–6 集,并选择新任务是否按站源分类保存;旧目录仍可读取,开关不会自动搬动已有视频。播放和切集不会取消下载。源站支持有效的 Range 校验时续传当前文件;文件变化或不支持续传时重新下载该文件,完整 HLS 分片可复用。

  • Android 使用前台服务持续下载,通知显示进度并提供“暂停下载”。系统终止进程、关机或后台服务达到系统时限后,保留任务与完整文件,重开应用可手动继续。
  • Windows 下载时保持应用运行。iOS 当前采用前台下载,进入后台暂停下载和本地媒体处理,回前台后可继续下载。
  • “设置与备份 → 下载目录与空间”查看占用、剩余空间,迁移视频、合并成品和导出内容。迁移前检查下载索引;损坏、超大、非普通文件或条目无效时拒绝迁移,保留原索引与视频。随后暂停下载,复制并保存新位置成功后才清理旧目录;失败保留原文件。
  • Android 可选应用内部目录及设备 / SD 卡上的应用专属目录,iOS 可迁移到“文件”App 可见目录,Windows 可选普通文件夹。Android 应用专属目录随卸载或清除应用数据删除。

“本地播放”读取设备文件,可断网、跳转和续播。详情播放也优先用已下载分集;本地损坏时只有手动选择“改为在线播放”才联网。

下载保存原始 MP4 / CENC MP4 及所需密钥;HLS 保存所选画质列表、分片、初始化片段、AES-128 密钥及关联默认音轨 / 字幕。暂不支持直播、未结束的 HLS 和需要额外授权的加密方式。列表缓存不等于已下载视频。

网络与资源设置

管理员从“设置与备份 → 网络与资源”选择自动、直连或手动代理,手动地址支持 HTTP、HTTPS、SOCKS5 / SOCKS5h。设置保存在本机并用于后续请求,代理地址默认遮蔽、不进入用户配置备份;设备内播放服务始终绕过代理。

自动模式读取 Windows 当前用户及 Android / iOS 系统静态代理与排除列表,未配置时使用环境代理或直连;恢复前台及每 30 秒更新。仅配置 PAC 自动脚本而没有可用静态代理时显示配置指引,本版不执行 PAC。代理不会关闭 TLS 校验。Android 桥接已随新版 ARM64 APK 编译,iOS 桥接尚未完成平台构建;实际网络行为仍待验证。

目录请求并发可设 1–6、间隔可设 0–5000 毫秒,默认 3 与 250 毫秒;下载并发默认 2、可设 1–6。设置写盘成功后生效,仍保留前台优先、后台让行、取消、退避及请求数量边界。

局域网互联:追剧同步与推送播放(已接入,待验证)

0.2.13 接入两台设备在同一局域网直连,自动同步追剧记录或接续播放,不依赖账号服务器。同步范围按用户选择确定为追剧列表、观看状态及对应剧目的续播进度。以下描述源码中的行为与使用入口;真实双端通信、系统权限和界面效果尚未验证。

发现与自动连接

“追剧 → 标题栏同步”或“设置与备份 → 设备互联”进入同步页。设备互联按本地用户保存,初始关闭;主动“选择设备”或播放器“推送”会开启本机互联,接收端先开启一次“设备互联”。两端 App 保持前台、当前用户已解锁后发布服务,接收端不弹确认、不要求选择发起端。关闭互联、锁定、切换用户或退到后台后停止发现与接收。

服务类型为 _zgj-link._tcp DNS-SD / mDNS,发现信息仅包含设备名称、稳定设备 ID、端口、协议版本、证书指纹和同步 / 播放能力;按设备 ID 合并多个网卡地址,同一身份出现不同证书时不合并。设备名称可在同步页修改。

开启设备互联后在前台自动发现;打开“同步”或点击播放器“推送”时,优先复用当前有效连接。首次发现留出短暂收集时间:仅有一台符合当前操作要求的设备时自动配对连接;多台时在设备面板显示列表供用户选择;未发现时保留重新搜索和手动地址连接入口。记住已选目标,前台恢复和网络重连后自动重连该设备;其他设备不会抢占现有连接。尚无目标且发现多台时,在用户打开同步 / 推送入口时显示列表,不在后台扫描期间打断播放。设备列表显示手机 / 电脑 / 电视图标、名称和连接状态,连接后提供“切换设备”。

首次配对按用户要求自动完成并记录设备证书,后续连接固定校验该指纹;证书改变不静默替换已记住的设备,可从设备卡片菜单明确“忘记配对”后重新连接。已有其他设备的连接不会被抢占。记录读写使用绑定当前用户与连接的会话令牌,锁定、切换用户或退出接收状态后失效。双方“自动同步”默认开启,连接成功后启动合并;任一端关闭自动同步即停止自动合并,仍可手动同步或推送。覆盖操作及播放交接由对应按钮触发,不因自动重连而再次执行。

入口与同步页面

追剧页标题栏提供“同步”图标,“设置与备份”提供“设备互联”入口。同步页显示本机与已连接设备、双方当前用户、自动同步开关、最近同步状态、各端增删数量和冲突入口。连接状态与同步状态分别呈现,可“立即同步”或取消当前批次;覆盖操作收进“手动同步”次级入口,切换设备、断开和忘记配对均有明确入口。

手动同步面板用纵向单选卡片排列,默认“双向合并”。底部先“查看预览”,再以“开始同步”或所选覆盖方式为主要按钮;覆盖确认只在发起端进行,对方直接接收。选项下代入实际设备名,同时用文字和箭头表达方向。

选项 行为
双向合并 合并双方追剧记录,将同一结果保存到两端
覆盖对方 用本机记录替换对方当前用户在本次范围内的记录
覆盖本机 用对方记录替换本机当前用户在本次范围内的记录

预览显示两端各自新增、更新、移除、冲突及范围外保留数量,覆盖时写明设备、当前用户及移除追剧数,空列表也需查看预览。同步中禁用重复提交并保留取消按钮;手动面板处理期间禁用外部点击 / 拖动 / 返回退出,避免关闭界面后悄悄提交。手机使用安全区底部面板并避让地址输入键盘;宽屏限制面板宽高,TV 使用可聚焦按钮,触控目标至少 48×48。长名称省略或换行,选项可随大字增高,实际布局待验证。

自动同步

自动同步使用双向合并,面向当前连接且用户已选择的设备。首次连接交换版本摘要并合并差异,之后仅发送改动条目与删除标记,不重复传输完整备份。追剧增删、手动状态和已读标记修改短暂合并后发送;正常播放期间约每 10 秒发送最新已保存进度,暂停、切集、退出播放器及推送交接时立即补发,发送失败保留待同步状态。实际时机以生命周期和可用连接为准,移动端退到后台后不承诺持续联网。

断线期间继续在本机记录,前台重新连接后按版本补齐;恢复流程核对双方当前用户和权限,不沿用已经失效的用户会话。接收远端变更不生成新的本地编辑版本,避免两端重复回传;重复请求按操作 ID 与条目版本去重。更换目标设备时重新协商,不将广播发现列表中的全部设备当作自动同步目标。

没有冲突的记录自动合并;无法判断先后的并发修改保留候选并显示待处理数量,其他记录继续同步,播放中不强制弹出冲突窗口。追剧与取消追剧冲突时暂不重新加入列表,其他字段使用稳定候选显示;用户从同步页逐项选择后生成包含全部候选版本的新修改。自动接收进度只更新记录,不跳转、切集或启动播放器。暂停后的播放器不重复把同一位置写成新版本,防止推送后静止的本机进度反复覆盖对方续播。手动覆盖先暂停自动批次,结束后恢复按新版本合并。

记录范围与合并规则

范围为追剧列表、想看 / 在看 / 已看及手动已看状态、新集已读基准,以及对应剧目的续播集数和时间。未追剧的全部观看历史不加入同步;推送播放可独立接续当前剧,不要求先加入追剧。同步仅针对两端当前已解锁用户与双方编译版本 / 用户权限共同允许的站源,范围外记录保留并计入跳过数量,不复制密码、账号权限、设备设置、下载索引、视频文件或密钥。

独立同步记录以站源和原始剧集 ID 定位;追剧成员关系、观看状态与续播进度分别记录版本向量,取消追剧及清空进度保留删除标记。每台设备、每个本地用户使用独立副本标识和递增计数,用版本关系判断先后,不依赖设备时钟或最大播放位置。旧追剧数据在首次使用时补齐同步格式;对应进度不会因普通历史的 300 条显示上限丢失。

  • 首次合并保留双方独有的追剧;已知的后续取消操作通过删除标记传播,避免取消过的剧下次又出现。
  • 同一字段存在明确先后时保留后一次修改;两端离线同时修改且互不包含时,进入冲突预览,由用户选择保留本机或对方的值。相同值直接合并版本。
  • 续播进度沿用这套版本规则,不简单取更大的集数或秒数,保留重看和主动回退的含义。
  • 已知集数与已读基准按既有增长规则合并;手动已看状态独立保留。剧名和海报地址等资料更新不当作用户重新修改追剧状态。
  • 覆盖操作同样生成包含双方已知版本的新修改;接收端在范围内多出的记录形成删除标记,避免之后双向合并恢复旧记录。

读写继续经过 LocalStore 的串行队列和完整快照提交,写入失败保留原记录。预览包含两端的基础版本,提交前重新核对,期间本地观看或追剧发生变化则重新计算,不覆盖后来产生的改动。每次操作具有唯一 ID 和可查询的保存结果,重复请求不重复应用;双向合并分别确认两端落盘,断线或一端失败时明确显示哪端已完成并可继续处理,不把两台设备的写入描述成一次不可分割的操作。

取消仅停止未提交部分,已经保存的记录保留;提交后丢失回执时先查询最近保存结果,仍无法确认则提示重连后合并补齐。每用户保留最近 64 次保存回执;同步记录含删除标记最多 25000 条、实际追剧最多 20000 部,单字段最多 64 个副本版本与 32 个冲突候选。差异按最多 16 条及字节大小分批,单条不超过 512 KiB,接收暂存总量不超过 12 MiB,超限保留原数据。

配置备份新增 followSync,包含追剧关联进度、历史版本、冲突与删除标记,兼容没有此字段的旧备份。恢复时生成新的本机副本标识,保留记录的历史版本;设备证书、已配对指纹、连接设置与当前副本身份不复制到另一台设备。导入和导出均限制 8 MiB,超限在写出前提示,避免生成自身无法恢复的备份。

播放器“推送”与接续播放

播放器在常规、全屏与 TV 控制区提供投放图标,提示文字为“推送”或“推送到[设备名]”。未连接时打开共用设备选择面板,已连接时直接开始准备;切换已连接目标可从同步页操作。手机和桌面直接在播放器画面控制层保留推送、倍速、清晰度、下载、追剧、弹幕和音量等常用项;独立推送面板显示接收设备、剧名、准备 / 定位 / 成功或失败状态,并提供取消。

推送内容为站源、剧集 ID、分集 ID / 集数、播放位置与播放意图。接收端先匹配并校验自己已下载的同一分集,可用时直接读取本地文件,选集显示接收端已下载分集;否则独立读取站源详情并解析,不使用发起端的临时媒体地址、密钥或路径。推送中的本地文件缺失可转为在线解析,普通本地播放仍保留原有的手动改在线规则。对方没有站源权限或无法播放时返回原因,本机保持播放。仅在本机存在的合并成品不提供推送。

交接分为准备与开始两步:对方准备完成后,本机补发最新位置;接收播放器定位后实际播放、没有缓冲、取得视频尺寸且位置继续前进,才发送开播回执,本机随后保存进度并暂停。失败、超时或取消时本机继续播放;重复请求复用交接 ID,迟到回执不能暂停本机后来切换的分集。接收端主动暂停、跳转或更换内容后,旧取消请求不再控制其后续操作。对方已有其他播放时,只在发起端提示将替换的内容,接收端始终不需要确认或配对码。

技术与平台边界

采用锁定的 Flutter nsd 5.0.1 进行原生服务发现 / 发布;Go 提供独立的局域网 HTTPS 端口,与仅绑定回环地址的媒体服务分开。设备身份保存于设备应用目录,使用 TLS 1.3、双端设备证书和精确指纹校验;只接受私有 / 链路本地地址,互联请求绕过应用代理、拒绝重定向,令牌不放入 URL。Flutter 通过 FFI 处理事件、用户范围、预览、同步和播放器交接,实际写入仍由 LocalStore 完成;没有改动源站 TLS 校验。

Android 手机和 Windows 共用同步协议与界面,TV 接入可聚焦推送控件,iOS 补入 Bonjour 服务声明与局域网用途说明。所有平台仅在前台接收;系统可能要求局域网权限,Windows 需允许应用通过专用网络防火墙。自动发现失败保留私有 IP 与端口的手动连接、本机地址复制和重新搜索,不扫描整个网段。系统权限、原生插件、网络切换与真实双端操作均未验证。

方案阶段参考的开源实现与文档:

  • LocalSend 与协议:参考发现、HTTPS 直连、会话和取消流程;本 App 使用 DNS-SD / mDNS 与独立协议,不兼容 LocalSend 文件传输协议。
  • nsd:MIT,提供 Flutter 服务发现与发布,支持 Android、Windows 10 1903+、iOS 13+ 的原生接口。
  • Syncthing 协议:参考版本向量、删除标记与重复同步的处理思路,不引入完整文件同步引擎。

合并与本地成品

“下载 → 本地媒体 → 合并成品”可一次选择最多 50 部已下载的剧加入合并队列,每部需有 2–10000 集不重复且连续的分集;允许合并连续的部分集数,存在中间缺集时明确提示,成品记录实际范围。队列逐部处理,支持暂停、继续、失败重试、取消及清理已结束记录,最多保留 500 条任务。

  1. 先在本地解密或换封装,保留码流。
  2. 相同格式直接合并;音轨签名包含 AAC profile 与 extradata,AAC 目标下音轨不一致或有缺失时统一为 AAC LC,仅处理音频。
  3. 视频确需统一时,以数量最多的格式为目标,仅转换不一致分集;数量相同时优先保留总时长较长的格式。
  4. 无音轨分集按需补静音,不丢掉其他分集的声音;不能可靠转换的编码或混合 HDR 色彩格式会明确失败并保留原文件。

视频转换目标支持 H.264 / HEVC,不会自动把全部视频重新转码。一次处理一个媒体任务,编码线程限制为 2;成品需通过时长检查及从头到尾的解码校验,处理期间禁止迁移目录或删除输入分集。

完整完成的分集准备与转换步骤保存恢复记录;重开应用后任务暂停,手动继续时核对下载版本、文件大小 / 修改时间和媒体签名,复用有效步骤,未完成的单个步骤重新处理。暂停保留中间文件,取消或成功结束清理中间文件;处理中可能同时保留原下载、准备文件、转换文件和合并输出,应预留相应存储空间。

默认保留原分集。“成品校验成功后清理原分集”为可选项,只有完整解码通过且成品索引成功保存后才执行;清理前锁定媒体操作,并在原生队列锁内逐项核对文件版本。清理失败时保留成品和可重试任务;重试可直接继续清理,不必重复合并。切换用户或平台暂停媒体任务后保留恢复进度。这些中断与清理行为仍待集中验证。

成品保存在下载目录的 library,可在“合并成品”播放、续播和删除;合并全部分集时显示“全集播放”。成品进度单独保存,不覆盖原分集进度。

Emby 导出与海报

“下载 → 本地媒体 → Emby 导出”按剧或批量导出已下载分集;“设置与备份 → 下载完成后自动导出 Emby”开启自动处理。

exports/
  剧名 [站源-标识]/
    tvshow.nfo
    Season 01/
      S01E001.mkv
      S01E001.nfo
      S01E002.mkv
      S01E002.nfo
    Season 00/
      S00E001.mkv
      S00E001.nfo

导出保存在下载目录的 exports,无损解密 / 换封装,不重新编码、不依赖临时播放地址。NFO 提供剧名、简介、季 / 集编号、唯一标识及海报 URL,减少对片名自动刮削的依赖。

0.2.12 按剧集 ID 登记并复用导出目录,补资料改名后新增分集继续写入原目录,旧导出可从记录恢复目录关联。本地合并成品的菜单提供“导出到 Emby 特别篇”,写入 Season 00,同一成品复用稳定的特别篇编号;NFO 记录实际合并范围与集数。导出先复制到临时文件并完成解码校验,源合并成品保留;删除最后一个导出条目也不会递归删除整个剧目目录。

默认只写海报 URL;源站海报需要解密或外部读取失败时,可开启“同时导出海报文件”,在后续导出时使用本地处理后的海报。已导出的剧再次手动导出会补齐海报与 NFO,不重复处理视频。

将 exports 加入 Emby 电视节目库并启用实时监控或定时扫描。Emby 在其他设备上时,需共享目录、NAS 或复制文件,手机私有路径不能直接用于另一台机器。本功能不运行媒体服务器,也不将过期站源地址写成长期订阅。

相同任务不重复处理。删除导出文件后该分集不再自动导出,可手动重新导出;导出文件和原下载分集独立,删除一份不影响另一份。

Android TV

手机与电视共用 APK,无需单独选择 TV 构建参数;电视桌面有启动入口。默认自动识别,也可在“更多 → 界面模式”选择“电视 / 遥控器”或“手机 / 电脑”,手选结果优先并保存在本机。聚焦按钮和海报显示亮色边框。

0.2.29 补充系统 TV 模式、Leanback / Leanback-only、旧版电视特征及 Fire TV 识别;对于未声明这些特征的盒子,结合无触屏、遥控方向导航或直播电视特征,并排除电话、加速度传感器、车载、手表、VR 与 PC 信号作保守判断。屏幕尺寸和横竖比例不参与识别,普通手机 / 平板接入遥控器不会仅因此变成电视。启动和返回前台时查询设备,查询失败保留上次结果;无法识别的盒子仍可手选。

自动识别或手选电视模式后,应用统一请求横屏,Android Activity 同时保护方向请求;首页、详情、播放、设置、返回和前后台恢复都沿用此规则。切集和播放竖屏短剧不会把整个界面转为竖屏。切回“手机 / 电脑”或在手机上恢复“自动识别设备”后,恢复方向跟随与手机全屏规则。

当前目标 SDK 为 36,Activity 按 Android 16 官方说明 声明保留方向请求的兼容属性;该属性是当前 SDK 的兼容方案,升级目标 SDK 37 时需重新处理大屏方向策略。

待集中验证:标准电视、旧盒子与 Fire TV 自动识别,手机 / 平板排除,手选模式保存与重启,进出播放器、前后台恢复,以及 Android 16 大屏横屏行为。本轮仅实现源码,未执行这些验证。

场景 遥控器操作
浏览、弹窗、下载队列 方向键移动、确认选择、返回关闭或返回
控制条隐藏 左右快退 / 快进 10 秒,上下或确认显示控制条
控制条显示 方向键选择播放、切集、选集、设置,确认执行
进度条 左右快退 / 快进,确认暂停 / 继续
选集 每组 50 集,可切换范围、定位当前及输入集数跳转,保留 VIP 标记
播放设置 TV 播放器保留倍速、画质、追剧、弹幕等设置;手机和桌面播放器改为画面控制层直达常用项。切画质保留进度和暂停状态,偏好按用户保存
首页返回 先返回发现,再清空搜索;发现且无搜索词时退出

支持专用播放 / 暂停、上一集、下一集按键。播放中无操作 5 秒后隐藏控制条,暂停和操作弹窗时保持可见。竖屏视频保持原比例,不裁剪填满电视。

0.2.55 补齐首页分类栏、站源侧栏、榜单、下载合集、设置、详情选集和批量操作之间的显式焦点出口;新增遥控列表、横向工具行、整行焦点条目和电视选项对话框。手机、电脑和 Windows 分支不改变原有布局。方向键串联、长按连续移动、返回后的焦点恢复仍待 Android TV 实机验证。

视频画质增强与超分方案(2026-09-22 调研,0.2.18 已接入源码)

0.2.18 曾在现有 media_kit / libmpv 播放器上接入实时画质增强源码,覆盖通用/真人短剧与动漫/AI 动漫;0.2.24 按手机和电视端卡死反馈,将实际入口和运行链路收窄为仅 Windows 桌面端。 Android 手机、Android TV 与 iOS 不再显示或初始化该功能,保留历史调研供后续重新评估轻量移动端方案。Windows 仍包含 FSRCNNX 与按实际运行条件选择的 NVIDIA / Intel VPP。

本节保留基于 0.2.15+21 播放链路的调研依据,并更新至 0.2.24 的源码实施状态。增强入口仅在 Windows 桌面端位于“播放设置”和“清晰度”面板,默认关闭;“源站清晰度”与增强后的输出尺寸分别显示。Android 手机、Android TV 与 iOS 隐藏入口并跳过后端初始化。没有运行本 App 的 Windows 画质、持续性能或完整回归,下文论文数字与工程阈值不能当作本 App 实测成绩。

本轮接入范围

项目 0.2.18 源码行为
档位与内容 关闭 / 自动 / 省电增强 / 清晰优先;跟随分类 / 通用/真人 / 动漫/AI 动漫。自动内容判断只使用明确动漫分类或标签,不把泛指“AI”的写实内容当作动漫
通用增强 spline36 缩放兜底;有效 LUMA 使用 RAVU-Lite-AR,硬解 RGB 使用 RAVU RGB。Windows 清晰优先可使用 FSRCNNX x2_8-0-4-1;同一时刻只装载一种主增强算法
动漫与 AI 动漫 选用 Anime4K Upscale+Denoise CNN x2 S,使用 MAIN / RGB,限制输入、倍率和中间纹理预算;不使用强 Restore 或人脸生成模块。写实 AI 内容可手动选通用档,实际压缩域效果待验收
输出与格式 以视频区域物理像素、源宽高比和旋转计算尺寸;Android / TV 输出最多 2073600 像素,Windows 最多 8294400 像素。未知色彩、HDR / 10-bit 保持原处理;MediaCodec 不公开像素格式时,只有明确 8-bit 的 H.264 / HEVC profile 且为 SDR 才尝试 RGB 增强
Android 适配 保持现有 GPU、硬解与 WID 生命周期;首次需要调整尺寸时接管固定版本插件的尺寸订阅,通过既有原生接口调整 Surface。关闭增强前未使用尺寸适配时,保留插件原有订阅
Windows 原生库 本项目 packages/media_kit_libs_windows_video 只维护原生库插件,保留上游 MIT 声明。固定通用 x64 20260921 / e76a35ec95 libmpv 与 ANGLE 1.0.1,下载时校验 SHA256,在配置期解包以保证头文件与链接库先就绪;未强制切换 gpu-next
硬件增强 仅清晰优先、通用内容、插电、实际 D3D11 硬解与对应 GL 渲染器、足够新的 mpv 和 8-bit 输入满足时尝试带独立标签的 VPP。滤镜与输出尺寸确认后仍提示驱动效果需看对比,未声称品牌相同就一定有效
生效与恢复 检查真实输出尺寸、mpv 渲染尺寸和 Shader 最后阶段;半浮点纹理失败、无渲染 Pass 或原生属性返回错误会撤回本功能配置并降级,重复失败后停止本次自动尝试。图形错误独立处理,避免直接触发站源切线
功耗与持续性能 Android 读取省电、供电、低内存和热状态,headroom 最多每 10 秒读一次;Windows 读取供电、节电与内存。2 秒采样渲染耗时与丢帧,排除切集、seek、缓冲及倍速调度后,持续过载降档;温控和性能降档在本集内保持
资源与交互 Shader、上游许可和 SHA256 清单随包提供,释放到应用私有目录;无需额外下载模型。设置按用户保存并兼容旧备份。菜单及播放控制条提供原画对比,TV 使用遥控按钮,保留长按 3 倍速;不改变下载文件或局域网进度协议

本轮取得的固定依赖摘要:libmpv 压缩包 SHA256 为 361392d64a231830ac79d1c0f91ddb68c6a709accd282b2c87b13889d382fdec;ANGLE 为 cc5911bb15d596fd5a2b362613ad35b7093b427117269a7359054a65746a5f9a。四份 Shader 的上游提交、大小和哈希在 assets/video_enhancement/manifest.json 中,RAVU 的固定提交内容已与随包文件核对。资源校验与源码接入不代表画面质量或驱动效果已通过验收。

场景判断与效果边界

首先保留最高可用源画质和正确解码。红果解析已有选择最高可用候选的逻辑;超分不能替代源站原生高码率版本,也不能把处理后的显示尺寸标成源站提供的 1080P。正常播放仍使用现有设备内流服务和 libmpv,增强发生在设备 GPU,不增加远程处理服务、不转码在线播放内容、不改写下载文件。

短剧的实际问题 优先处理 预期与边界
分辨率低,放大后轮廓和字边发软 高质量缩放、轻量学习型放大,必要时小型 CNN 可以改善边缘和局部细节;恢复的纹理不是可证明的原始细节
码率低,马赛克、蚊噪和重压缩明显 温和去伪影与匹配真实退化的模型 直接加大锐化容易放大噪声;保留皮肤、发丝、衣料,避免塑料感
快速运动、镜头切换、字幕频繁变化 优先时序稳定和播放期限 单张照片看着更锐不代表视频更好;重点防闪烁、拖影和字幕笔画跳动
AI 动漫、二维线条或风格化三维动画 独立动漫档、小型去噪 / 放大 CNN,并保留手动通用档 AI 不是单一画风;写实面孔仍优先通用策略,线条稳定性和字幕需单独验收
原片已经被美颜磨皮、失焦或严重压缩 保守增强,保留原画对比 不承诺还原真实面部细节,不默认附加人脸重建模型
实际显示尺寸小于原片,或设备已吃紧 正常缩放 / 自动降级 不为了“超分已开启”额外放大再缩小,浪费算力与电量

Real-ESRGAN 对复杂退化、振铃和过冲建模,RealBasicVSR 指出时序传播也可能放大压缩伪影,说明“先处理退化,再适度重建”比堆叠锐化更符合本场景。SR13、SR14 2026 年针对真实短视频的 UGC 修复挑战也纳入调研,但研究模型的质量成绩不能直接当作手机播放器的可部署性证明。SR20

已核实的播放器接入条件

已核实事实 对实施的要求
项目使用 media_kit 1.2.6、media_kit_video 2.0.1;原播放链路直接创建 VideoController 0.2.18 固定这两个版本,并从 lib/player_screen.dart 接入统一增强控制器、偏好与菜单
已安装的 media_kit 初始化时设置 scale=bilinear、dscale=bilinear、correct-downscaling=no,增强关闭时保持原设置 高质量缩放本身就是可实施的第一步,但应明确称为画质增强,不标成神经网络超分
media_kit_video 通常按视频 dw/dh 创建输出纹理;桌面提供 setSize,本版本 Android 的该方法直接抛出 UnsupportedError 先补齐输出尺寸管理。只换 Shader,可能仍然让 Flutter 把原尺寸纹理放大,甚至让按放大比例触发的 Shader 一次也不执行
Android 当前使用 vo=gpu、OpenGL ES 和 hwdec=auto-safe;mpv 的 AImageReader 硬解映射会产生 RGB0 / external OES 纹理 HOOK LUMA 不一定存在。优先提供作用于 MAIN 的 RGB 路线,不能以关闭硬解、逐帧读回 CPU 为代价强行启用亮度 Shader。SR04
Windows 当前是 vo=libmpv 的 OpenGL Render API,经 ANGLE 与 D3D11 纹理交互 它不是独立 mpv 的原生 D3D11 VO。不能直接把网上的 vo=gpu-next / gpu-api=d3d11 配置套进现有控件。SR03
原 media_kit_libs_windows_video 1.0.11 的构建配置指向 2023-09-24 / 652a1dd;该提交的 d3d11vpp 没有超分缩放参数 NVIDIA / Intel 缩放支持于 2024-08-20 的 PR #14698 合入。Windows 硬件超分必须更新并固定原生库,不能仅更新 Dart 参数。SR05、SR06
新版 mpv 存在 hwdec_d3d11egl,可从 ANGLE 获取 D3D11 设备并注册硬解上下文 Windows 优先验证复用这条互通路径。不能只因“使用 OpenGL”判定完全不可行,也不能据此承诺当前二进制必然可用。SR07

这些结论依据本机锁定依赖源码及 mpv 上游代码,不依赖启动 App 得到的假设。SR01 libmpv Render API 当前公开的后端是 OpenGL 与软件渲染;改成 Vulkan / libplacebo 全新输出涉及原生插件工程,不能作为一个低成本开关处理。SR03

算法与成熟实现的取舍

路线 与真人短剧的匹配程度 成本与限制 本项目建议
mpv 高质量缩放:spline36,有余量再比较 ewa_lanczossharp 适合通用放大,风格较保守 相对轻量,不会重建被抹掉的信息;锐利滤镜也可能振铃 首期基础档,并作为评判其他算法的对照
RAVU:ravu-lite-ar-r2、ravu-r2-rgb、ravu-zoom-ar-r2-rgb 学习型滤波放大,适合先做低成本提升 LUMA 与 RGB 版本入口不同;zoom 支持任意倍率但在目标尺寸计算,并非总比 2倍版本快 首期重点候选;按实际纹理格式、倍率、耗时选一个,不叠加运行。SR08
FSRCNNX x2_8-0-4-1 通用模型 真正的小型神经网络放大,发布说明包含轻度压缩退化训练 是单帧 CNN;默认只作用于 LUMA,需要处理硬解 RGB 路径,不能直接套到所有手机 Windows 神经超分候选;手机后续适配。排除 LineArt 变体作为真人默认。SR09、SR10
ArtCNN / Anime4K 面向动漫,与真人皮肤和发丝的目标不同,也需按 AI 动漫的实际风格选择 ArtCNN 区分实时 C 系列和较重的 R 系列;Anime4K 整套强预设不能直接套到低清重压缩视频 本轮独立动漫档接入小型 Upscale+Denoise CNN S,保留通用档,真实低清与字幕效果待验收。SR11、SR12
NVIDIA RTX / Intel VSR,mpv d3d11vpp Windows 上值得优先接入的专用视频增强路径 依赖显卡、驱动、D3D11 上下文、输入格式及系统设置,配置成功不等于推理实际启用 Windows 第二批重点;不满足条件立即回到通用增强。SR06、SR23
Real-ESRGAN 通用小模型 / RealBasicVSR 前者考虑真实退化,后者利用多帧信息,适合作为效果对照 全链路开销、显存、帧间闪烁 / 状态管理都高于简单缩放;公开图片工具不是实时播放器插件 后续 Windows 本地离线修复候选,首期不塞进手机每帧路径。SR13、SR14、SR26
2026 Mobile Real-World SR、PLKSR-Rep 等紧凑模型 研究方向贴近真实退化,优于只看动漫或双三次降采样榜单 竞赛测速是小图单帧;仍需模型转换、GPU / NPU 适配和视频稳定性验证 手机第二代神经超分候选,保留可替换后端,不先自训大模型。SR16、SR17
SeedVR2 / FlashVSR 等扩散式修复 能生成丰富细节,适合高算力修复研究 存在细节生成、时间窗口、显存和算力成本;“one-step / streaming”不等于普通设备实时 不纳入在线播放首期;如以后做离线修复,单独评估。SR18、SR19
AMD AMF HQScaler / VideoSR 是额外可研究的 Windows 原生增强路线 接口含 VideoSR1.0 / 1.1;不能把名称含 SR 等同于通用神经网络,多了一套 AMF 互通成本 首期 AMD 使用通用 Shader;后续按实测收益决定是否单独接入。SR35

推荐组合:高质量缩放兜底 → 适合当前纹理的轻量 RAVU → 已验收设备上的小型 CNN 或 Windows 硬件超分。 同一帧只选一套增强主算法,避免 RAVU、CNN、RTX 和强锐化连续叠加。锐化 / FSR1 类空间缩放与神经网络超分分别命名。FSR2 等游戏时序方案需要深度、运动矢量、相机抖动等输入,普通解码视频不能直接复用其接入方式。SR36

论文数字和社区经验应如何使用

已读资料 实际证据 不能据此推导的结论
Mobile AI 2021 手机视频超分挑战正文 OPPO Find X2 / 骁龙 865 / Adreno 650,REDS 双三次退化;320×180 → 1280×720,报告最高约 80 FPS 不能当作 720P 输入、真实重压缩短剧、Flutter 合成和持续发热条件下的播放帧率。SR15
NTIRE 2026 Mobile Real-World SR 正文与官方代码 天玑 8400、FP16,速度测 128×128 → 512×512;PLKSR-Rep 总分第一、质量分第八,113.85倍是相对 OSEDiff 的加速 不能把 113.85倍写成 FPS,也不能把综合冠军当作画质最好的模型或整帧实时承诺。SR16、SR17
NTIRE 2025 Efficient SR 正文 双三次退化的图像任务,报告使用 RTX A6000 测时 “高效”榜单不能代替手机实机与真实压缩域的评估。SR38
FlashVSR 正文 Table 2 与代码说明 单张 A100、768×1408,约 17 FPS、约 11.1 GB 峰值显存,仍有 8 帧 lookahead;消费级 GPU 兼容性另有说明 不满足普通手机或常见 25–30 FPS 短剧的通用实时要求;8 帧前视也不等于零延迟。SR18
Artoriuz 的 mpv 放大博文 明确说明使用单张动漫图和人工降采样比较,并讨论训练域、下采样与抗振铃 可以学习评测方法,不能把该排名当作真人短剧或所有 GPU 的排名。SR22
Microsoft Edge VSR 工程博文 按分辨率选择模型、对电池供电和设备能力做限制,讨论每帧计算期限 可以借鉴分档和功耗策略;Edge 自有模型不是可直接移植的开源播放器组件,文中的限制也不是所有 VSR 实现的通用限制。SR24
Kazumi 的实际播放器代码 Flutter 通过 NativePlayer.command 切换 Shader,先等待播放器 / 视频控制器初始化,并把资源放到应用目录;项目使用自己的 media-kit 分支 可以借鉴集成方式,不能认为使用相同包名就有相同渲染能力,也不能照抄动漫预设作为真人效果。SR21

设备端架构与实施依据

flowchart LR
    A[源站原画或本地文件] --> B[现有 libmpv 解码]
    B --> C[输入格式与显示尺寸判断]
    C --> D[通用 GPU 缩放或 Shader]
    C --> E[Windows 硬件超分]
    D --> F[输出尺寸与色彩处理]
    E --> F
    F --> G[Flutter 视频纹理]
    G --> H[控制界面与弹幕叠加]
Loading

d3d11vpp 位于 mpv 视频滤镜阶段,GLSL 位于渲染阶段,上图表示可选路径,不表示两者使用相同 API。保持 Go 的媒体请求、缓存、下载及局域网协议职责不变。每帧图像留在原生 GPU 路径,不经 Dart 字节数组、截图接口、PNG 临时文件或本地 HTTP 转码再回送播放器。

已接入的模块与修改位置:

模块 责任与边界
VideoEnhancementController,从 lib/player_screen.dart 接入 负责选档、输入变化、状态、错误恢复和释放;复用当前播放生命周期,操作携带播放器实例与分集代次,丢弃过期结果
VideoOutputSizeAdapter 分开保存原视频尺寸与目标纹理尺寸;处理设备像素比、横竖屏、窗口大小和 Surface 生命周期,避免输出尺寸反写为源视频尺寸
增强后端 基础缩放、GLSL、Windows VPP 分别实现能力查询、应用与恢复;每次仅一个后端拥有增强配置
PlaybackPreferences、LocalStore 保存用户选择并兼容旧备份;设备能力、实测档位、驱动失效记录留在本机,不随局域网进度同步到另一台设备
lib/player_menu.dart、lib/television_controls.dart 共用选项和当前状态;手机、桌面及 TV 均有可发现入口,不依赖手势才能操作
原生适配与资源 必要改动维护在本项目 packages/ / 平台源码,Shader 放 assets/;这些根目录已在同步脚本收录范围内,新增构建输入时继续核对导出清单

Shader 从随包资源释放到应用私有目录,以版本和 SHA256 校验后原子替换,不以“文件存在”判定永远不用更新。不要求访问下载目录或手动导入 Shader。初始化后通过 NativePlayer 的属性 / 命令接口应用完整、有序的受控配置,传参使用结构化参数,处理 Windows 盘符和路径分隔规则。SR02、SR21 不在 libmpv 渲染回调内阻塞调用普通播放器 API,避免线程互相等待。SR03

输出尺寸必须先做正确:

  1. 根据原始 w/h、dw/dh、SAR、旋转信息及实际视频绘制矩形,计算物理像素目标。Flutter 的逻辑像素先乘设备像素比;黑边、面板、整个桌面宽度都不算视频内容尺寸。
  2. 例如 720×1280 竖屏短剧在 1920×1080 横屏桌面上完整显示时,内容约 608×1080,属于缩小,无需超分;在 1080×1920 内容区域才是 1.5倍放大。
  3. 桌面通过尺寸适配器驱动 setSize;Android 补齐 Surface / Texture 的目标尺寸支持,保留原插件初始化顺序与硬解连接。窗口拖动、旋转和连续尺寸通知去抖,仅在目标改变时调整,不按每个 UI 帧重建 Surface。
  4. 单独预算 CNN 的 2倍中间纹理。最终只显示 1080P,不代表中间张量也只有 1080P;720×1280 的 2倍中间图已经是 1440×2560。倍率不足或资源不够时直接换任意倍率缩放 / 轻量档,不强行运行大中间图再缩回去。

Shader 的格式与触发条件:

  • 初始通用基线比较 scale=spline36、保守的色度缩放与合适的下采样;仅在基线通过后考虑更锐的 EWA 滤镜。不要套用可能一并改变其他渲染行为的整套 gpu-hq 配置。
  • 对 YUV / LUMA 路径,比较 ravu-lite-ar-r2.hook 与小型 FSRCNNX;对 Android RGB 硬解路径,优先比较作用于 MAIN 的 ravu-r2-rgb.hook / ravu-zoom-ar-r2-rgb.hook。后续移植 CNN 时,亮度提取与色彩重建单独实现、检查,不能只把 HOOK LUMA 改名为 MAIN。
  • 原版 RAVU 的部分 2倍 Shader 在两边放大比例超过约 √2 时才执行,FSRCNNX 发布版本的条件是两边超过 1.3倍。必须结合 WHEN 和实际输出尺寸判断生效,不能只看配置列表非空。SR08、SR10
  • 根目录普通 Shader、gather 和 compute 版本的图形能力要求不同。首期优先兼容路径;只有确认 OpenGL ES 版本、采样精度、半浮点纹理及所需扩展后才启用更高要求的实现。
  • 首期神经 / 专用超分限定经过验证的 SDR 路径。HDR、Dolby Vision、10-bit 或色彩信息不完整的内容维持原播放器处理,不为适配 nv12 强制截成 8-bit;不全局覆盖 BT.601 / BT.709、范围或传递函数。

Windows 专用超分:

先固定包含缩放接口和后续格式修复的 libmpv / FFmpeg / ANGLE 组合,再确认 d3d11vpp 能力和共享的 D3D11 设备。优先复用 hwdec_d3d11egl,检查混合显卡笔记本上解码、处理、显示的适配器是否一致,避免帧经过 CPU 下载 / 再上传。SR07

d3d11vpp=scale=1.5:scaling-mode=nvidia:format=nv12 仅是 SDR、相应上下文已就绪时 的参数示例;Intel 使用相应的 intel 模式。倍率由显示目标计算,滤镜需要自己的标签,卸载只移除本功能拥有的配置。不会向旧的 2023 年内核发送这组参数;新固定内核仍需运行条件与输出确认。mpv 文档明确指出,这些模式只启用相应驱动扩展,实际效果依赖硬件与驱动设置。SR06

第一选择是 mpv / 驱动现有路径。若改用独立 NVIDIA SDK,需要另行核对运行库、支持平台和再分发条件;调研时原 RTX Video SDK 入口已转向 NVIDIA AI for Media,不能假设旧教程中的下载与授权条件仍然成立。SR39 不把独立 MPC、浏览器或商业离线软件作为本 App 的运行依赖。

分档、性能控制与交互

首批未验证开发快照默认关闭增强,用户可手动选择自动或其他档位试用。自动策略仍受格式、尺寸、资源、实际渲染结果和温控限制;是否调整默认值等待集中验证。判断设备时使用实际渲染后端与能力,不只根据 Android 版本、显卡品牌或旗舰机名称判断。

2026-09-22 追加核对 mpv / libplacebo hook 文档、Qualcomm Snapdragon GSR 和 Edge VSR 工程说明后,0.2.24 不再在 Android 手机或 Android TV 暴露当前 mpv 增强链路。移动端后续优先评估单 pass、低带宽的空间上采样 / 锐化路线,例如 SGSR / FSR1 类思路,再看是否值得接入紧凑 CNN 或原生推理后端。LUMA hook 在 MediaCodec 外部 RGB / OES 纹理路径上不一定触发,不能直接把桌面 LUMA shader 当作手机最佳实践。SR02、SR04、SR41、SR42

平台 / 条件 初始自动策略
Android 手机 0.2.24 隐藏入口并不初始化增强链路;后续按 SGSR / FSR1 类单 pass 移动端 shader、RGB / LUMA hook 覆盖和设备耗时重新评估
Windows 核显、AMD 或不支持专用接口的显卡 同一套基础缩放与通用 Shader;具备 LUMA、算力和显存余量时可用小型 CNN
Windows 已验收 NVIDIA / Intel 组合 可选专用超分,按目标倍率与资源余量启用;驱动升级、上下文变化或异常后重新判定
电池节省模式、发热、2倍 / 3倍播放、多个高负载任务 降低算法或输出上限,必要时关闭;插电不代表可以忽略发热
Android TV 0.2.24 隐藏入口并不初始化增强链路;电视端单独验收前不启用当前方案
iOS 最后实施;单独评估 Metal / Core ML 和现有原生输出,当前不宣称支持

按 帧预算 = 1000 /(源帧率 × 播放倍速) 毫秒做保守估算:30 FPS 原速约 33.3 ms,2倍约 16.7 ms,3倍约 11.1 ms;实际还需区别按解码帧执行的滤镜与按显示帧执行的渲染 Pass。初始目标为增强新增耗时 P95 不超过该预算的约 25%,给解码、同步和 Flutter 合成留出余量;不是允许整个 App 每帧都用满这个时间。

自动降级采用持续窗口与回差:过滤切集、seek、网络缓冲及正常倍速调度后,连续约 10 秒出现明显超时 / 新增丢帧(初始候选阈值 1%),或温控恶化,就逐级降低;首期同一播放会话只自动降级,避免反复升降导致画面风格跳动。新分集或用户主动重选时才重新评估升档。异常状态和用户手动关闭立即生效。

Android 使用可用的 Thermal API、供电与省电状态辅助决策;getThermalHeadroom 不超过每 10 秒一次,处理 NaN / 不支持,不能把始终返回“无发热”的设备当作无限预算。SR29 Windows 优先根据实际渲染耗时、掉帧和供电状态判定,不依赖所有机器都能取得 GPU 温度。

显存预算包括中间特征图、纹理池和重复缓冲,不用模型文件大小代替峰值显存。例如 1080×1920 的一张 RGBA16F 纹理约 15.8 MiB,8 张已约 126.6 MiB。手机可从“新增纹理 / 张量预算约 128 MiB”作为待校准上限起步,超过预算先换档;不把该数字当作所有手机都应分配的额度。

Windows 已接入入口:播放器 → 播放设置 → 画质增强,在“清晰度”面板也能操作。选项采用“关闭 / 自动 / 省电增强 / 清晰优先”,由设备选择具体后端;不在普通用户流程堆放模型名、Shader 路径和图形 API 名称。Android 手机、Android TV 与 iOS 不显示入口。实际信息显示“轻量增强”“神经超分”或“已因发热降低增强”等,与用户选择的偏好分开。

提供独立“原画对比”按钮,切换同一播放器的增强状态,保持位置、倍速、音量、源画质和相同的显示尺寸,不新建第二个播放器。不要占用已有的画面长按 3倍速手势。字幕控件和 Flutter 弹幕在增强后叠加;片源本身烧录的字幕无法单独排除,需纳入质量验收。0.2.24 起 TV 入口和对比按钮已隐藏。

失败恢复与实际生效判定

已知问题 / 上游经验 应落实的行为
Shader 编译失败、缺少扩展、精度或半浮点格式不兼容 撤回本功能的配置,恢复基础播放并给出一次轻提示;不能把增强错误一律送入现有网络解析重试流程
glsl-shaders 已写入,但没有可用的 LUMA 或未满足 WHEN 状态标为未生效 / 当前无需增强,不显示“AI 超分正在运行”;有条件时通过实际 render pass 及新帧样本确认
GLES 精度导致偏色 media-kit #1438 是 Linux GLES 的实际报告,不是本 App Android 已复现的结论;用来建立跨后端颜色检查项,不盲目全局改精度。SR30
驱动超分日志提示 enabled,画面却没变化 mpv #15700 说明配置 / 日志不能单独证明实际效果;核对目标尺寸、输入格式、驱动活动与受控对比。SR32
d3d11vpp 因输入格式或上下文不兼容被禁用 #14758 涉及上传格式与 nv12 修正;2026 年 #18301 关于缺少 D3D11 上下文的补丁仍为 open,不能按已发布能力设计。失败及时撤回,不允许留下“只有声音没有画面”。SR31、SR33
Android TV / GPU 后端差异 mpv-android #824 的 Shield TV gpu-next 紫屏报告说明不能把统一升级 Vulkan 当作普适解决方法。SR40
seek、切集、旋转、后台、用户切换、局域网交接、播放器销毁 取消过期配置任务并释放资源;保持原有播放意图与进度,接收端按自身能力增强。增强失败不能再次推送或改写播放记录

日志以有界的版本、GPU / 后端、输入与目标尺寸、实际档位、失败阶段和耗时为主,不保存媒体地址、访问令牌或视频帧。使用 current-vo、hwdec-current、video-params / video-out-params、avsync、掉帧计数,以及支持时的 vo-passes。后者区分 fresh / redraw、单位为纳秒,并需按 mpv 的结构化 Node 接口读取;不是所有 VO 都实现,缺失不能解释为“耗时为 0”。Flutter 自身帧率不等于视频增强的 GPU 耗时。SR37

分批实施与集中验收

SR-1、SR-2 与 SR-4 已接入源码,小型动漫 CNN 也包含在本轮;SR-3 的通用手机第二代模型、离线修复和 iOS 仍待实施。以下是集中验收标准,当前均未通过平台验收,本轮不启动画质与持续性能测试。

顺序 完整交付范围 完成条件
SR-1:Android / Windows 共用基础 输出尺寸适配、保守高质量缩放、RGB / LUMA 轻量 Shader、偏好与备份、菜单 / 对比、状态、温控降级及错误隔离 两个平台都能明确判断实际生效;关闭和失败恢复正常播放;开发快照继续标 unverified
SR-2:Windows 专用与神经档 固定原生库、检查 ANGLE / D3D11 互通,接入 NVIDIA / Intel VPP 与小型 FSRCNNX 候选、设备与版本失效处理 不依赖外置播放器;分别验收支持、不支持和混合显卡设备,不按品牌直接放行
SR-3:手机第二代 CNN 依据首批实测挑选 FSRCNN 系或 2026 紧凑真实退化模型,完成 RGB Shader 或原生推理后端、模型资源和持续负载控制 同时胜过高质量缩放基线并满足持续播放预算,才替换自动档;ncnn / LiteRT 支持 GPU 不代表已经打通解码纹理零 CPU 往返路径。SR27、SR28
SR-4:Android TV 电视尺寸上限、遥控入口与对比、低功耗 SoC 和实际显示效果 与手机分别记录设备结论,避免电视模式默认重负载
后续可选:Windows 本地离线修复 借鉴 Video2X 的原生队列管线,输出独立增强副本,保留原文件、音轨、时序和失败恢复 单独列入后续开发范围;不改变当前下载和合并语义,不是本次实时增强的前置条件。SR25
最后:iOS 原生媒体输出和 Metal / Core ML 专项 在 iOS 独立验收后才标支持

恢复验证后的集中验收矩阵:

维度 必须覆盖
图像与内容 合成的分辨率、渐变、斜线、运动和字幕夹具;需要评价真人皮肤 / 发丝时另用用户明确提供或授权的非站源素材。本轮及后续默认验证不下载或分析站源图片
退化与时序 双三次缩小与实际编码压缩分别测;轻度 / 重度压缩、运动、切镜、暗部、硬字幕。不要仅测一张静态动漫图
尺寸与格式 360 / 480 / 720P,9:16 与 16:9,旋转 / SAR / 非整数设备像素比;显示小于源尺寸、1.25倍、1.5倍、2倍;H.264 / HEVC、RGB / YUV,以及 HDR / 10-bit 的安全回退
性能与播放 24 / 25 / 30 / 60 FPS、1 / 2 / 3倍速;首帧、切集、seek、全屏、窗口连续缩放、预加载、弹幕和同步交接;比较开启 / 关闭后的耗时 P50 / P95、峰值显存、额外丢帧和 A/V 偏差
持续负载 固定亮度、供电和环境条件,运行约 20–30 分钟,记录热稳定后的行为,不能以冷机最初几秒作为性能结论
设备 Android 至少覆盖 Adreno / Mali 和较低性能档;Windows 覆盖 Intel 核显、NVIDIA RTX、AMD、混合显卡 / 软件渲染回退;TV / iOS 独立记录
生命周期与失败 Shader 缺失 / 版本过期、编译失败、VPP 不支持、设备重置、显存不足、后台 / 恢复、锁定 / 切换用户、快速开关、已排队任务过期、偏好保存失败
质量判定 与原画及高质量缩放基线做同尺寸、同帧率对比;配对夹具可用 PSNR / SSIM,感知与视频稳定性另外评估。面部改变、塑料感、重边、字幕破坏或新增闪烁即为失败,不能只凭无参考评分或模型排名通过

分发时逐项记录代码、Shader、权重和运行库许可,固定版本 / 哈希并携带必要声明。已核对 RAVU Shader 为 LGPLv3,FSRCNNX 1.1 发布 Shader 的文件头为 LGPLv3+(其训练仓库的根许可证并不相同),ArtCNN / Anime4K 为 MIT;Kazumi 代码为 GPL-3.0。参考架构不意味着直接搬入整个项目,权重与 SDK 的再分发条件也不能从仓库代码许可证自动推导。

调研来源与证据索引

检索日期为 2026-09-22。查阅了论文摘要及相关正文、官方文档、公开项目源码、工程博文和 issue 讨论;没有访问站源图片或视频。部分通用搜索入口触发验证码 / 限流,以下结论以直接读到的公开资料为依据。单个 issue 只作为回归场景来源,不推断所有设备都有同一缺陷。

来源 类型与本方案采用的证据
SR01 media-kit 已安装锁定版本的 NativePlayer、Android / NativeVideoController、Windows VideoOutput / ANGLE 源码;对应项目上游入口
SR02 mpv GLSL 文档 Hook 阶段、格式依赖、WHEN、路径列表与自定义渲染 Pass
SR03 libmpv Render API 支持后端、OpenGL 上下文与线程约束
SR04 mpv AImageReader 源码 MediaCodec 映射为 RGB0 / external OES,解释 LUMA Shader 兼容问题
SR05 mpv 652a1dd 滤镜文档 对照本项目 Windows 2023 构建,确认当时没有 VPP 超分缩放参数
SR06 mpv PR #14698 / 滤镜文档快照 缩放扩展于 2024 年合入;实际启用依赖硬件和驱动
SR07 mpv hwdec_d3d11egl ANGLE 设备取得、NV12 / P010 与 D3D11 硬解上下文注册
SR08 mpv-prescalers / RAVU RGB / LUMA、2倍 / 任意倍率、抗振铃、图形能力与许可证
SR09 FSRCNN,ECCV 2016 在低分辨率特征域计算、小网络及后置放大的设计依据
SR10 FSRCNNX 1.1 发布说明与 Shader 通用 / LineArt 区别、轻度压缩训练、实际 Hook / WHEN 和文件许可
SR11 ArtCNN 明确的动漫目标、实时 C 系列与离线 R 系列区别
SR12 Anime4K 主要优化原生 1080P 动漫;低清重退化与真人并非默认目标
SR13 Real-ESRGAN,ICCVW 2021 高阶退化、振铃 / 过冲与真实图像修复
SR14 RealBasicVSR,CVPR 2022 清理模块、传播伪影和视频训练 / 推理取舍
SR15 Mobile AI 2021 视频超分挑战 手机 GPU 推理可行性与 180P → 720P 测试条件
SR16 NTIRE 2026 Mobile Real-World SR / 官方代码 天玑 8400、小图速度测试、质量 / 速度综合排名与公开代码
SR17 PLKSR-Rep,CVPRW 2026 紧凑 CNN、真实退化训练及竞赛加速比的实际含义
SR18 FlashVSR 论文 / 项目 A100 上约 17 FPS、显存和前视延迟,区分 streaming 与零延迟
SR19 SeedVR2 项目 3B / 7B 一步扩散修复与实际依赖,作为高算力路线对照
SR20 NTIRE 2026 Short-form UGC Video Restoration 与真实短视频更接近的修复研究范围
SR21 Kazumi 播放控制源码 已有 Flutter 应用如何管理 Shader、初始化和播放器生命周期
SR22 Artoriuz mpv upscaling 博文 训练域、下采样、抗振铃和单图评测边界
SR23 MPC Video Renderer D3D11VP 源码 已有播放器中 NVIDIA / Intel 驱动扩展的实际接入
SR24 Microsoft Edge VSR 工程博文 分辨率分档、供电限制、模型耗时与帧预算
SR25 Video2X 原生 C/C++ 视频修复、队列与离线处理路线
SR26 Real-ESRGAN-ncnn-vulkan 源码 公开实现包含上传、分块、同步等待和输出,不能等同解码纹理直接推理
SR27 ncnn Vulkan notes GPU 能力、统一内存映射与 CPU / GPU 边界
SR28 LiteRT Android GPU 文档 GPU delegate 的线程和运行方式;独立于播放器纹理接入问题
SR29 Android Thermal API 热状态、headroom、采样频率与设备差异
SR30 media-kit #1438 Linux GLES 复杂 Shader 的采样精度 / 偏色报告
SR31 mpv #14758 VPP 上传格式失败、NV12 处理与只剩声音的后续报告
SR32 mpv #15700 “已启用”日志不足以证明 RTX VSR 实际生效
SR33 mpv PR #18301 缺少 D3D11 设备时的滤镜失败;调研时仍未合入
SR34 mpv #8137 多帧 / 持久纹理需求;普通 GLSL 配置不等于已有时序 VSR 框架
SR35 AMD AMF HQScaler VideoSR / FSR 枚举与额外原生处理路线
SR36 FidelityFX FSR2 文档 游戏时序重建所需深度、运动矢量和抖动等输入
SR37 mpv 属性文档 render pass 统计、计时单位、掉帧和音画同步属性的边界
SR38 NTIRE 2025 Efficient SR 正文 A6000 图像基准与双三次退化,说明性能数据需带上下文
SR39 NVIDIA AI for Media RTX Video SDK 旧入口的当前目标,独立 SDK 选型与授权需重新核对
SR40 mpv-android #824 Shield TV 切换 gpu-next 后紫屏的设备兼容报告
SR41 Snapdragon GSR 移动端单 pass 空间上采样 / 锐化路线,说明替代方案在移动 GPU 上可能慢和耗电
SR42 libplacebo custom shaders LUMA / CHROMA / RGB hook 触发边界,作为手机硬解纹理路径不能直接套 LUMA shader 的依据

安装包与平台状态

0.2.159+2172 本轮尚未构建或验收。此前 0.2.158+2171 已由 GitHub Actions 完成两版 Android、Windows 和 iOS 打包,并发布至 v0.2.158 Release。本轮未进行设备安装、实际播放、权限或历史删除验收。以下 0.2.15 数据为历史构建记录。

0.2.15+21 已完成两版 Android ARM64 打包与安装包检查,签名与 0.2.10+16、0.2.14+20 一致,ARM64 分包版本码递增至 2021,可直接覆盖升级。此版本包含启动导航修复与首页多选、推荐、榜单的布局调整。Windows / iOS 完整应用仍待相应平台构建,本轮没有进行设备运行确认。

平台 包与状态
Android 8.0+ 手机 0.2.158+2171 两版 ARMv7 / ARM64 / x86_64 APK 已由 Actions 构建并发布,真实安装与运行仍待验收
Android 6.0+ 兼容版 当前源码 0.2.159+2172 的独立红果鉴 APK 待兼容工作流构建;在线播放保留,下载与本地媒体处理不提供,Android 6 实机验收待完成
Windows 10/11 x64 0.2.158+2171 两版完整 ZIP 已由 Actions 构建并发布;解压后分别运行 hongguojian.exe 或 zhenguojian.exe,保留所有 DLL 和 data;局域网原生发现依赖 Windows 10 1903+,包启动与设备互联仍待验证
Android TV 与手机共用 0.2.158+2171 Android 包;已补强自动识别与电视模式横屏,待电视 / 盒子实机验收;0.2.12 选集 / 设置及 0.2.13 同步仍待集中验证
iOS 15.1+ 0.2.158+2171 两版未签名 IPA 已由 Actions 构建并发布;0.2.40 起播放页禁用 media_kit_video 硬件纹理加速以规避 libmpv OpenGL ES 渲染上下文失败直接退出;仍待签名安装与真机验收
历史版本 0.2.15 安装包 大小
红果鉴,仅红果 dist/android/hongguojian-0.2.15+21-arm64-v8a.apk 30.9 MB
真果鉴,全部站源 dist/android/zhenguojian-0.2.15+21-arm64-v8a.apk 30.9 MB

两份安装包的 SHA256 校验值保存在 dist/android/SHA256SUMS.txt。应用名称、包名、版本、签名、包 CRC、ZIP 对齐和对应原生核心均已核对;实际运行行为仍待安装验收。

从 0.2.6 起,Android APK 默认压缩原生 .so 库,对红果版和全站源版同时生效。系统在安装时解压原生库后加载,缩小安装包下载体积;安装后仍需保留解压后的原生库空间。

INSTALL_FAILED_NO_MATCHING_ABIS 表示 APK 与设备架构不匹配,请更换对应架构安装包。

GitHub Actions

将 guoapp 源码发布到仓库根目录,保留 .github、锁文件、native 和平台工程;不用上传 SDK、依赖目录、SO、DLL 或缓存。

推送 main / master、v* 标签、提交 PR,或手动运行 Build app packages,会先检查再构建:

红果版 Artifact 全站源版 Artifact 内容
hongguojian-android zhenguojian-android 三种架构 APK 和 SHA256
hongguojian-windows zhenguojian-windows 完整 ZIP 和 SHA256;从解压包检查原生核心、FFprobe、换封装及播放器启动
hongguojian-ios-unsigned zhenguojian-ios-unsigned 未签名 .app ZIP 和 SHA256,不能直接当已签名 IPA 安装

Actions 分别传入默认参数与 --all-sources 构建两版,Flutter 和 Go 回归也覆盖两种编译配置。产物保留 14 天,不自动创建 GitHub Release。首次平台构建结果以实际 Actions 输出为准。

Build Android 6 compatibility package 仅在手动运行或推送 android6-* 标签时执行。它使用 pubspec.android6.yaml、Flutter 3.35.7 和 Android API 23 原生编译,产物为 hongguojian-android6-版本-ABI.apk,上传到 android6-版本 Release 和 hongguojian-android6 Artifact;现有 Build app packages 工作流及其 Release 规则不变。

Android 正式发布按版本使用固定独立签名并递增构建号,在仓库 Secrets 配置:

Secret 内容
ANDROID_HONGGUOJIAN_KEYSTORE_BASE64 / ANDROID_ZHENGUOJIAN_KEYSTORE_BASE64 对应版本 JKS 文件 Base64
ANDROID_HONGGUOJIAN_KEYSTORE_PASSWORD / ANDROID_ZHENGUOJIAN_KEYSTORE_PASSWORD 对应版本签名文件密码
ANDROID_HONGGUOJIAN_KEY_ALIAS / ANDROID_ZHENGUOJIAN_KEY_ALIAS 对应版本密钥别名
ANDROID_HONGGUOJIAN_KEY_PASSWORD / ANDROID_ZHENGUOJIAN_KEY_PASSWORD 对应版本密钥密码

Android 6 兼容工作流继续读取 ANDROID_KEYSTORE_BASE64、ANDROID_KEYSTORE_PASSWORD、ANDROID_KEY_ALIAS 和 ANDROID_KEY_PASSWORD;它们应与红果鉴签名保持一致。

Pull Request 缺少 Secrets 时生成仅用于预览的 Debug 签名 APK,不发布到 GitHub Release;正式 push、tag 与手动发布必须配置固定签名 Secrets。预览 APK 不能保证覆盖已安装的正式版。创建签名文件并保存到项目外:

keytool -genkeypair -v -keystore hongguojian-release.jks -storetype JKS -alias hongguojian -keyalg RSA -keysize 2048 -validity 10000
keytool -genkeypair -v -keystore zhenguojian-release.jks -storetype JKS -alias zhenguojian -keyalg RSA -keysize 2048 -validity 10000

本地不入库的 android/key.properties:

storeFile=/absolute/path/hongguojian-release.jks
storePassword=你的密码
keyAlias=hongguojian
keyPassword=你的密码

开发与构建

正式版使用 Flutter 3.47.4、Dart 3.12+、Go 1.24.1+、Python 3.10+。Android 正式版需要 JDK 17、SDK 36、NDK 28.2.13676358;Windows 需要 Visual Studio 的 C++ 桌面组件及 MinGW-w64 x64;iOS 需要 macOS、完整 Xcode 和 CocoaPods。Android 6 兼容版仅由 GitHub Actions 使用 Flutter 3.35.7、Android API 23 和 scripts/build_android6.py 构建,不纳入本地正式版构建命令。

将 Flutter、Go、Python 加入 PATH,Android 设置 ANDROID_HOME。构建脚本对子进程默认设置 GOPROXY=https://goproxy.cn,direct、GOSUMDB=off,不改全局配置;同名环境变量可覆盖。

python3 scripts/build_android.py
python3 scripts/build_android.py --all-sources
python3 scripts/build_android.py --abi arm64-v8a
python3 scripts/build_android.py --cn-mirrors

首条默认生成红果鉴,第二条生成含全部站源的真果鉴。--all-sources 可以与 --abi、--cn-mirrors 组合,例如 python3 scripts/build_android.py --all-sources --abi arm64-v8a --cn-mirrors。

Windows PowerShell:

.\scripts\build_windows.ps1
.\scripts\build_windows.ps1 -AllSources
.\scripts\build_windows.ps1 -ChinaMirrors

Windows 也可运行 python scripts/build_windows.py --all-sources;省略参数为红果版。

国内构建可使用以上镜像开关:Flutter/pub 使用 storage.flutter-io.cn / pub.flutter-io.cn,Android 的 Google、Maven Central 和 Gradle 插件依赖优先使用阿里云镜像,同时保留官方仓库。已有环境变量优先;镜像配置仅作用于本次构建,保留锁定的依赖版本与 SHA256 校验值;结束后恢复原锁文件并清理临时 Gradle 配置,不改全局代理。GitHub Actions 默认使用官方源。镜像可能有同步延迟,遇到镜像缺失或异常可去掉开关重试;此开关不替代 Flutter SDK 和 Gradle 发行包的初次安装。

iOS 未签名构建、只生成核心、或额外生成模拟器核心(不会启动模拟器):

python3 scripts/build_ios.py
python3 scripts/build_ios.py --all-sources
python3 scripts/build_ios.py --core-only
python3 scripts/build_ios.py --core-only --simulator

签名 IPA 使用自己在 Xcode 配置的签名身份、描述文件与 ExportOptions:

python3 scripts/build_ios.py --export-options /path/to/ExportOptions.plist

产物在 dist/android、dist/windows、dist/ios,红果版以 hongguojian- 开头,全站源版以 zhenguojian- 开头。iOS 脚本将 Go 核心生成 XCFramework,再经 CocoaPods 链接并检查 FFI 导出符号;媒体库随应用打包。

首次 Android 调试先编译对应架构核心:

python3 scripts/build_native.py --platform android --abi arm64-v8a
flutter pub get --enforce-lockfile
flutter run

Windows 对应 --platform windows 和 flutter run -d windows。

直接使用 Flutter 命令调试全站源版时,先给 build_native.py 加 --all-sources,再运行 flutter run --dart-define=ALL_SOURCES=true;iOS 对应 build_ios.py --core-only --all-sources。切回默认版同样重新构建默认核心,Flutter 参数省略或设为 --dart-define=ALL_SOURCES=false。脚本会同步设置 Dart 常量和 Go 编译参数,应用启动时检查二者是否一致,避免混装原生库。

播放器使用 media_kit / libmpv,合并和导出使用 FFmpegKit min-gpl,含 FFmpeg、x264 / x265 等 GPL 媒体组件,各组件适用上游许可证。FFmpegKit 不参与正常播放或下载的转码;系统 FFmpeg 只用于开发验证,用户不用另装。

集中检查与真机回归

按用户最新要求,本轮只实施功能、整理源码格式并执行收尾同步;以下静态检查、构建、自动化及设备回归命令保留供以后集中安排,不表示当前快照已执行:

python3 -m unittest discover -s scripts -p 'test_*.py'
dart format --output=none --set-exit-if-changed lib test integration_test test_driver
dart analyze --fatal-infos lib test integration_test test_driver
flutter test --dart-define=DISABLE_REMOTE_IMAGES=true
flutter test --dart-define=DISABLE_REMOTE_IMAGES=true --dart-define=ALL_SOURCES=true
cd native
go test -race ./...
go test -race -ldflags="-X duanjuapp/native/core.buildAllSources=true" ./...

合成媒体验证需要开发机安装 ffmpeg / ffprobe。测试覆盖权限隔离、备份校验、搜索防抖与旧结果、仅少数分集转码、CENC 解密换封装、Emby 元数据及删除原文件后的完整解码,不请求站源图片。

Android 回归使用独立 .debug 包。连接并授权 USB 调试、保持设备解锁:

python3 scripts/create_test_media.py
python3 scripts/serve_test_media.py

另一终端运行:

adb reverse tcp:38473 tcp:38473
flutter drive --driver=test_driver/playback.dart --target=integration_test/playback_test.dart --dart-define=DISABLE_REMOTE_IMAGES=true --dart-define=FIXTURE_BASE_URL=http://127.0.0.1:38473

多设备时指定序列号,可加 --dart-define=CHECK_LIVE_CATALOG=true 检查红果目录元数据。用例覆盖 MP4 / AES HLS / CENC、切线、切集、横屏、离线下载、合并 / 导出及最小化后的后台下载。结果在 build/device-test/results/;结束后停服务并执行 adb reverse --remove tcp:38473。

源码同步与恢复

每次完成任务并通过必要检查后执行:

python3 scripts/finish_task.py --message "本次实际完成的变更"
python3 scripts/sync_source.py --check

尚未完成集中验证和平台验收时,当前版本 0.2.159+2172 仅作为未验证开发快照,不标为完成验收的正式版本。源码压缩包由收尾脚本按 真果·鉴-YYYYMMDDHHMM.zip 生成。此前版本的历史记录仍保留在正式源码仓库中;本项目的 guoapp 镜像不创建或维护本地 Git 提交、分支和 tag。源码同步一致性确认仍执行。

局域网自动连接、记录自动同步与推送播放的早期方案文档快照 v0.2.12-unverified-lan-design 保留;该历史快照仅有设计,0.2.13 才接入实现。

脚本只同步纯源码到同级 ../guoapp,不要求目标存在 .git,不执行提交、tag、分支、推送或其他 Git 操作,并在同级生成 真果·鉴-YYYYMMDDHHMM.zip 源码压缩包;同一分钟内的重复收尾会追加序号,不覆盖已有压缩包。目标若已有 .git,同步时原样保留但不触碰。

只同步用 python3 scripts/sync_source.py;在 guoapp 内工作时跳过向自身同步。保留必要源码、资源、锁文件、测试、平台工程和 Actions,排除依赖、SDK、缓存、产物、签名及个人配置。

从源码压缩包恢复示例:

mkdir -p ../restore
unzip ../真果·鉴-YYYYMMDDHHMM.zip -d ../restore

恢复目录中的 guoapp 子目录为纯源码恢复点;安装包和个人配置不属于源码恢复点。

目录 内容
lib 页面、播放器、本地用户、FFI、下载和媒体处理
native/core、native/bridge 独立站源核心、缓存、下载、目录迁移及 C ABI
android、windows、ios 平台工程与必要资源
assets/video_enhancement、packages/media_kit_libs_windows_video 增强 Shader 与许可、固定 Windows 媒体依赖插件
scripts、.github/workflows 构建、签名、验证、同步和版本快照
test、integration_test 自动化与设备回归

功能 TODO:与旧短剧库对照

以下对照 ../短剧库 与红果专用版 ../果果剧库 的功能和近期修复,基于 2026-09-21 的 0.2.6 审查,并补充至 App 0.2.159+2172 的源码实施状态。已有解析辅助代码不代表 App 已接入功能;未完成集中验证与平台验收的项目保持未勾选,标明实际实施与检查范围。同时记录 App 自身的数据与恢复边界缺陷。Android 手机和 Windows 同为首要平台,设备验收单独记录。

原有 34 项功能仍按旧清单记录:3 项沿用历史已完成标记,30 项已实现但待集中验证,1 项为黄果 AI 播放恢复的外部连接阻塞。0.2.12 已补入原清单最后六项可独立实施的功能及界面调整;0.2.13 接入新增 P3-2 / P3-3,2026-09-22 新增 P3-4 调研方案;0.2.16 接入 P1-9 剧果站源,0.2.17 接入 P1-10 野果和 P1-11 帝果,0.2.18 接入 P3-4 实时画质增强与动漫档,0.2.19 统一该站源的用户可见名称为剧果,0.2.20 接入 Android 播放器画中画,0.2.21 修正播放器主题跟随、画质增强配置显示和 Android 自动档策略,0.2.22 修正手机竖屏播放页选集默认折叠,0.2.23 调整全屏播放器控制栏和暗色弹窗,0.2.24 在移动端和电视端隐藏并禁用画质增强,0.2.25 暂停显示帝果入口并保留旧数据兼容,0.2.26 参考 dsd-video-parser 重做帝果 vplayer 签名解析并恢复入口,0.2.27 去掉帝果 VIP 标记分集的播放确认弹窗,0.2.28 增加收尾源码压缩包,0.2.29 补强电视自动识别与统一横屏方向管理,0.2.30 优化全屏自动连播的控制栏显示,0.2.31 接入红果系列剧与本机新季提醒,0.2.32 调整普通点剧直达播放、播放器 Tab 内容区、详情选集折叠、首页更新提示和下载选择按钮,0.2.33 二次收紧播放器控制层、连续选集网格、简介/相关和下载选择,0.2.34 修复移动选集分段、播放器控件对齐/避让和红果相关推荐候选,0.2.35 统一播放器按钮尺寸与分组并将音量改为竖向小面板,0.2.36 将弹幕从底部中间工具组移到播放器侧边并取消横向滑动,0.2.37 在画中画小窗隐藏 App 覆盖层并交给系统 PiP 控件,0.2.38 修正非全屏 PiP 纯视频布局和全屏系统栏避让,0.2.39 将播放页相关改为下载、追剧移入简介、播放器按钮减负并接入首页自动续页,0.2.40 为 iOS 播放页禁用 media_kit_video 硬件纹理加速以规避播放入口 native 退出,0.2.41 固定追剧在简介内容区、移除首页已有内容时的异常提示并补强首页自动续页测试,0.2.42 将播放器底部工具按钮改为优先靠右成组、超量后再两侧均衡,0.2.43 将多站源版站源更新默认批量页数调到 50 页,并修正野果目录 / 搜索 POST 分页及剧果、野果、帝果榜单入口,0.2.44 更新野果默认线路与域名识别,补充剧果签名 Cookie、帝果签名错误传播及三站源定向回归测试。0.2.55 另接入十二个短剧站源、弹幕表情转换和电视遥控焦点串联;新增功能均保留未验证状态,功能范围与验收状态分别记录。

旧项目的“黄果”包含多个独立入口,需逐个对照:

旧项目入口 App 对应入口 当前状态
红果 hongguo 红果 已接入;默认版唯一开放站源
黄豆 huangdou 黄豆 已接入,仅全站源版开放
黄果网页 huangguoai 黄果 AI 已接入候选域名切换、逐站更新和健康检测
黄果备用网页 huangguo-video 黄果视频 已接入浏览器会话、网页 / 媒体请求区分、真实播放页 Referer、预览令牌、逐站更新和分阶段健康检测
黄果旧 API cloudfront 黄果旧版 已接入候选域名探测 / 自动发现 / 失效重选、独立访客会话、分页目录、分集、播放和下载;仅全站源版开放
十二个短剧站源 芽果、猫果、饭果、观果、河果、星果、花果、牛果、网果、发果、皮果、伍果 已接入原生核心目录、详情、分集和取流适配;待集中验证

从首页“更多 → 站源管理”或设置进入独立管理页。每个入口显示缓存数量、分页位置、最近更新时间、任务阶段和错误,可分别更新、继续一页、补齐资料、停止任务和检测;检测结果持久保存。更新合并新增内容并保留目录页码和其他站源缓存,每轮补齐最多 8 部资料;已完成的条目留在缓存,重复点击不启动重复任务。0.2.7 已修复补齐后的分类副本与菜单持久化;0.2.9 已补齐红果游标持久化并移除静默截断,待以后集中验证,见 P1-R1~P1-R2。Android 使用现有前台服务维持后台任务;进程终止后显示中断状态,可再次继续。站源任务只面向编译版本和当前用户获准的入口。

0.2.10 将首页刷新统一为“更新剧库”,复用上述 update 任务:更新当前站源组,“全部站源”更新本版本与当前用户获准的所有入口。保留当前分类、搜索和列表,紧凑提示栏显示阶段、失败和停止入口,离开首页后原生任务继续;重复点击不重复提交。任务结束后读取本地目录与真实分页位置,更新列表、追剧资料和新集数量,不再额外请求一次首页。每轮查新、继续一页历史内容并补齐最多 8 部待补资料,可再次更新继续推进。

“检测连接与播放”依次检查目录解析、分集、播放地址 / 播放列表、密钥和媒体连接;“仅检测目录”明确标注播放未检测。默认抽取当前站源一部免费剧集,从播放 / 详情错误页进入则检测当前剧集;媒体探测最多读取开头 1 KB,不下载整集、不请求海报。面板显示失败阶段、HTTP 状态、检测时间、重试倒计时,支持复制不含凭证的诊断结果。检测通过代表抽样连接正常,不代表所有剧集均可播放。

0.2.8 为检测详情增加展开 / 收起箭头,点击检测摘要即可切换;收起后仍显示检测结论、时间及复制入口。进入站源管理时历史详情默认收起,主动发起连接或目录检测时展开当前站源。各站源独立记录本次页面中的展开状态,手动收起后,轮询、检测完成及其他更新不会将详情重新展开。

0.2.4 修复黄果视频把 M3U8 当作网页导航发送、丢失真实播放页 Referer 的问题。播放列表、分片、密钥和下载共用媒体请求链路;媒体 URL 的签名参数及最终重定向地址保留。源站 /api/hls_key/ 使用独立预览令牌和浏览器 Cookie 会话,令牌到期可刷新一次,不向其他域名发送。CF 拒绝和 HTTP 200 验证页仍按失败处理,倒计时不再受原生核心时区影响。若网络或源站策略仍要求交互验证,诊断会显示失败;本版没有交互式浏览器验证器,不承诺任意网络均可通过 CF。

海报加载没有手工维护的图床域名白名单,合法 HTTP / HTTPS 地址按站源权限访问,新图床无需登记。黄果浏览器兼容请求保留图片 Accept、请求类型和 Referer;开发验证不请求站源图片。

0.2.7 将站源、榜单与搜索按钮收进标题栏;搜索默认收起,下方只有一行横向分类。黄果只显示一个站源,汇总视频、AI 与旧 API 的内容和分类,同名分类合并;各接口独立保存分页,部分失败时保留其他成功结果并重试失败页。分类合并站源菜单与本机已缓存剧库中的细分类,补读 category_name、typeName / type_name、sortName / sort_name,真人剧 / 漫剧 / AI 剧不再遮蔽都市等细分类。细分类范围与 Go 版一样取决于已更新资料;初装尚未更新完整剧库时,分类数量不会等同于已经长期更新的 Go 剧库。资料补齐及详情回写会同步已有分类副本,写盘保留分类菜单。

黄果 AI 密钥与媒体连接遇到 EOF 时,设备端会尝试可信 DNS 返回的备用公网地址,保留原 Host、TLS 主机校验、签名参数、Referer 和代理路径,成功地址按 DNS 有效期复用。旧版相对封面路径改用图片 CDN,已缓存和收藏中的旧错误地址会在加载时修正;继续兼容 XOR 与黄果 AES 封面格式。旧版单个剧集返回 404 不再将整个 API 域名停用。

上述 DNS 回退已通过合成用例,但 0.2.5 对截图同剧的线上检查仍在密钥 CDN 的 TLS 握手阶段失败;目录、分集和播放列表正常。不能据此认定 AI 已恢复播放,也不能认定源站在所有网络均不可用。此问题继续保留在待办中。

0.2.12 的只读连接诊断中,AI 目录请求超时,huangguoai.com、ttvoij.ediayikma.cc、thu.agdkczeyx.cc 的入口连接也超时,尚未进入密钥和媒体检查。当前开发环境缺少可通的入口,P1-4 保持阻塞;这不代表所有用户网络均不可用,也没有降低 TLS 校验来绕过连接失败。

优先修复:分页、资料与近期协议差异

“两版”指默认红果鉴与全站源真果鉴;黄豆、黄果专项仅用于全站源版。保留原有功能编号,资料模型与搜索问题分别归入 P1-7 / P2-8、P1-8,不另建重复待办。

编号 范围 已确认问题与代码依据 修复验收
P1-R1 [ ] 已实现,待验证;两版 0.2.9 按总目录与分类保存实际 offset、会话、设备标识、分页签名及最后 ID;与目录在同一快照落盘。保留查新与历史续载位置,会话过期重新申请,重复 / 不前进的页保留旧位置 待集中覆盖重启 offset=18、会话过期、重叠页和分类独立续载
P1-R2 [ ] 已实现,待验证;两版 0.2.9 移除 6000 条和 500 页静默上限,按 ID 合并并持久保存;真实 32 MiB 保存限制会明确报错并暂停继续请求,保留待保存数据 待集中覆盖第 6001 条、第 501 页、重启和跨分类去重
P1-R3 [x] 0.2.7 两版 详情及资料补齐按 ID 更新已有目录和分类副本,补齐写盘保留 Categories;分类菜单与本机细分类合并 使用合成资料检查字段别名、详情回写和重启恢复;设备操作由用户安装验证
P1-R4 [ ] 已实现,待验证;两版 0.2.9 补齐黄果网页与旧 API 详情字段,贯通 Go / Dart 资料;详情与播放动作通知同 ID 的列表及失败海报,按 ID 合并收藏 / 历史。红果日期、黄豆缺失热度等资料独立低优先级补充,不阻塞播放 待集中覆盖跨页面回写、同 URL 失败重试、附加资料失败和旧缓存
P1-R5 [ ] 已实现,待验证;全站源版黄豆 0.2.9 优先识别合法明文 JSON,再走 AES 解码,保留 gzip 兼容;使用 UseNumber 保留长 ID 待使用纯文字夹具集中覆盖明文、密文、异常载荷
P1-R6 [x] 0.2.7 全站源版,黄豆 海报 Referer 跟随 API 当前实际入口,保留站点自身图片的来源规则 合成地址检查备用入口来源头;没有请求真实图片
P1-R7 [ ] 已实现,待验证;两版 0.2.9 索引加载失败时禁止迁移与重写;先检查普通文件、大小、条目、重复 ID 和状态,拒绝 null 索引,保留原文件;复制及提交前检查取消 待集中覆盖损坏 / 超大索引、写盘失败、迁移中断及重启
P1-R8 [ ] 已实现,待验证;两版 0.2.9 将目录及站源记录的写入失败传回页面 / 任务,标明尚未保存,保留可用内存数据;提供重试保存,未保存前不继续推进游标。推荐内容与位置共用同一持久化边界 待集中覆盖文件冲突、空间 / 权限失败、32 MiB 限制和重启
P1-R9 [ ] 已实现,待验证;两版 0.2.9 区分首次启动与配置损坏;异常用户记录、丢失用户配置或不完整快照锁定访问。提供原始配置导出、重新读取及管理员密码验证后的备份恢复,不降级管理员保护 待集中覆盖访客 / 管理员损坏、冷启动及恢复流程
P1-R10 [ ] 已实现,待验证;两版 0.2.9 所有用户设置与记录检查保存结果,串行提交完整快照;失败重读并回滚原快照,无法确认时锁定。备份一次替换完整用户快照,视频和插件私有键保持独立 待集中覆盖 false、异常写入、恢复中断、用户隔离和重启一致性

功能完善

顺序 功能 实施状态与待验证内容
P0-1 [ ] 已实现,待验证:红果注册身份在线播放 0.2.158 同步匿名设备注册和直接片源模型,六签名保留为兼容回退,补充 ALPN 协议重试;0.2.157 仍有用户空响应反馈,本轮未确认恢复,Android 手机和 Windows 优先验证
P0-2 [ ] 已实现,待验证:移除广泛存储权限 0.2.158 删除权限声明、启动提示及原生申请入口,导出改用系统所选文件夹;待核对合并后的 APK 权限、设备风险提示、目录选择 / 记忆 / 撤销和分集导出
P1-4 [ ] 外部连接阻塞:黄果 AI 播放恢复 0.2.12 目录及三个已知入口在当前开发网络超时;此前截图同剧的密钥连接仍为 TLS 握手断开。需可通的入口与密钥 / 媒体链路后再检查真实播放,不能以目录或 M3U8 成功代替播放成功
P1-5 [x] 0.2.7 榜单 红果总热播 / 真人剧 / 漫剧 / AI 剧四榜;全站源版另有黄豆总榜 / 魔改 / 搜索 / 收藏 / 完结榜和黄果热播 / 推荐 / 潜力榜。保留源站名次与顺序,支持分页、刷新、详情播放;缓存持久化,5 分钟内复用,请求失败可回退 24 小时内的旧榜单,明确提示未更新。编译版本及当前用户权限同时生效;0.2.16 榜单图标位于顶部标题栏“排序与筛选”后面,窄屏常显,移出分类行,新布局待验证
P1-6 [ ] 已实现,待验证:红果分类推荐 0.2.9 接入真人剧 / 漫剧 / AI 剧推荐,独立保存推荐游标、会话、近 540 条请求去重记录及完整已取得条目。刷新开启新一轮,继续推荐恢复位置;编译版本及用户权限生效,失败保留当前内容,不含官方账号个性化同步。0.2.15 入口移至红果分类“全部”后的“推荐”,内嵌当前页显示,其他站源不显示;推荐选择不会作为站源分类 ID 发往目录接口
P1-7 [ ] 已实现,待验证:排序与完整资料 0.2.9 透传、持久保存热度、播放量、日期、标签和连载状态;首页增加名称、自然季号、日期、热度、播放量排序及状态筛选,未知置后;全站源版加入“全部站源”。排序 / 筛选偏好按用户保存并进入备份;附加资料独立异步补齐。0.2.12 排序 / 筛选移至标题栏,详情资料和主要操作重新布局
P1-8 [ ] 已实现,待验证:搜索完整性 0.2.9 红果合并官网及名称索引,按 ID 去重并保留同名不同 ID,补识别到的漏季;加入归一化、分词匹配、相关度和自然季号排序、最近 20 次搜索。联想 10 条与正式索引 50 条独立;总时限 40 秒、补漏季最多 32 次,保留部分成功结果,不虚构下一页。目录 / 搜索取消贯通 FFI,前台在途上限 16;0.2.16 新增剧果、0.2.17 新增野果和帝果在线分页搜索,0.2.26 恢复帝果入口,其余站源仅筛选已加载内容
P1-9 [ ] 已实现,待验证:剧果站源 0.2.16 依据用户提供的剧果脚本接入访客授权、热门 / 最新 / 实际分类、分页目录与在线搜索、详情及真实分集;CloudFront 签名 Cookie 限定媒体来源,贯通播放、预加载、下载和健康检测。复用用户权限、资料回写与局域网共同站源协商。未进行真实接口、播放、下载、双端或平台验证,仅全站源版开放
P1-10 [ ] 已实现,待验证:野果站源 0.2.17 接入动态 API 入口与公开接口配置、响应签名校验和解码、实际分类、分页目录与在线搜索、详情和真实分集。按分集重新取流并保留 H.265 备用地址,复用播放、下载、权限和局域网记录;仅全站源版开放。已读取协议文本,源码执行、真实播放、下载与各平台行为待集中验证
P1-11 [ ] 已实现,待验证:帝果站源 0.2.17 参考 Richy-17.txt 接入网页分类汇总、各分类独立末页、分页搜索、详情和选集、播放器地址解码与同站媒体路径规则;0.2.26 参考 dsd-video-parser 重新实现 /addons/vplayer/ aaencode 签名解析,媒体请求使用 vplayer 来源头,恢复全站源版入口;0.2.27 帝果 VIP 标记分集点击播放不再弹确认,直接进入解析播放。复用播放、下载、权限和局域网记录。源码执行、真实播放、下载与各平台行为待集中验证
P2-1 [ ] 已实现,待集中验证:追剧与历史完善 0.2.166 按 issue #6 将历史移入首页主菜单、追剧移入右上角“更多”;直播统一改为隐藏码激活;0.2.159 修正切换到历史后单条删除菜单未显示的问题(issue #5); 0.2.10 接入想看 / 在看 / 已看筛选、独立手动已看、新集数量与已读基准、直接续播、本地追剧 / 历史搜索和单条删除;状态按用户保存并纳入兼容旧格式的备份。针对性检查覆盖进度独立、旧记录读取、增长 / 回退 / 未知集数、重启、备份、写入失败和用户隔离;平台行为待验收
P2-2 [ ] 已实现,待集中验证:剧库管理与统一更新 0.2.10 首页复用站源 update 任务,接通查新、历史续载、最多 8 部资料补齐、阶段提示与停止;结束后只读取缓存并保留分页。卡片加入收藏 / 状态 / 下载操作,发现页支持最多 50 部多选、分集预览、画质 / VIP 选择、分批加入及部分失败重试。0.2.15 移除首页全选,顶部使用文字清空 / 取消,底部固定选择提示和下一步。历史针对性检查覆盖任务去重、编译范围、停止、用户切换、重复任务、第 501 集后继续添加与窄屏大字;新布局、P1-R1~P1-R4 和平台完整行为仍待集中验证
P2-3 [ ] 已实现,待集中验证:红果弹幕 0.2.11 接入设备端独立请求、分集与原始毫秒时间校验、有界分页缓存及 Flutter 线性渲染;同步暂停、缓冲、倍速、跳转、切集和后台状态。0.2.33 手机 / 电脑播放器改为画面控制层直达开关和失败重试,TV 设置仍提供开关、状态和重试;开关按用户保存并进入备份。普通进度回报不重启动画,布局变化时才测量文字。两版针对性检查覆盖取消、迟到结果、失败隔离、动画、备份、用户切换和大字界面,真实源站及平台效果仍待验收
P2-4 [ ] 已实现,待验证:下一集预加载与缓冲反馈 0.2.12 接入低优先级解析、最多 6 秒 / 4 MiB / 8 次请求的预取、HLS 前两段和 MP4 前缀复用;计划超时、失败退避、切集 / 后台取消已接通。0.2.33 起自动连播和预加载默认始终开启,播放器缓冲进度改为进度条二级轨道展示,不再显示缓冲文字;待验证取消、版本 / Range 校验、连播复用和平台反馈
P2-5 [ ] 已实现,待验证:下载合集与批量操作 0.2.12 按剧分组、搜索及任务 / 连载状态筛选,支持合集或分集多选暂停、继续、删除、重试及部分失败重试。更新本剧补新增 / 缺失分集,保留有效文件与暂停状态;可清理已完成任务但保留视频,恢复或本地播放。任务状态先保存再取消 / 删除;待验证批次中断、文件缺失、索引失败和用户切换
P2-6 [ ] 已实现,待验证:下载偏好与目录组织 0.2.12 按用户保存默认画质 / VIP 选择并纳入备份,接入单剧、多剧及合集更新;管理员可设下载并发 1–6、按站源保存新任务,兼容原扁平目录。待验证重启、备份、目录迁移和并发调整
P2-7 [ ] 已实现,待验证:合并流程完善 0.2.12 音轨签名加入 AAC profile / extradata,不兼容的 AAC 音轨统一到 LC,成品完整解码通过后才登记。接入连续集数检查、多剧串行队列、分集处理检查点与中断恢复、可选校验后清理原分集;清理锁定媒体操作并原子核对下载版本,失败保留成品。待合成媒体、混合 AAC、取消恢复、空间不足和原文件保护验证
P2-8 [ ] 已实现,待验证:黄豆 VIP 资料补齐 0.2.9 贯通未知 / 免费 / VIP 三态,未知不覆盖已知;旧缓存无法区分的 false 恢复为未知,避免当作已确认免费。站源管理显示待识别数量并支持每批最多 8 部补齐,未知返回有重试间隔;隐藏 VIP 只排除已确认 VIP。0.2.12 开关使用 VIP / 划线 VIP 图标,封面 VIP 移至左上角避开菜单
P2-9 [ ] 已实现,待验证:Emby 导出完善 0.2.12 按剧集 ID 持久保存稳定目录,兼容旧导出;合并成品导出到 Season 00,稳定编号及 NFO 记录实际范围,复制后完整解码,保留源成品。删除最后一个导出条目不递归删除剧目目录;待验证改名后补集、重复导出、编号恢复和 Emby 扫描
P2-10 [ ] 已实现,待验证:播放偏好与全屏交互 0.2.9 保存画质、倍速和自动连播,按用户隔离并纳入备份;补全全屏选集 / 倍速 / 画质 / 设置及 Go 版长按和键盘规则,临时倍速在松手、切集、菜单、后台和失焦时复原。0.2.12 统一每组 50 集、范围切换 / 精确跳转 / 当前定位,紧凑布局整合切集和播放控制;0.2.33 将手机 / 桌面常用项移到播放器画面控制层,自动连播和预加载固定开启,移动选集改为连续滚动紧凑网格;待集中覆盖重开、重启、备份、布局及输入边界
P2-11 [ ] 已实现,待验证:资料失败后继续推进 0.2.9 保存失败重试时间和扫描位置;单剧 404 冷却 24 小时、其他失败 5 分钟,保留整站退避。每批最多 8 部,连续失败停止当前批后,后续批次从后面的条目推进;待集中覆盖前两部失败而第三部有效的情况
P3-1 [ ] 已实现,待验证:应用网络与资源设置 0.2.12 增加管理员设置面板、本机原子保存、直连 / 自动 / 手动代理、目录并发 1–6 与间隔 0–5000 毫秒。系统静态代理支持 Windows / Android / iOS 桥接及定时刷新,PAC 需手动配置;远程播放通过本机流服务应用代理,保持 TLS 校验与本地绕过。待验证各平台代理、下载 / 播放在途切换及原生平台构建
P3-2 [ ] 已实现,待验证:局域网追剧与续播同步 0.2.13 接入 DNS-SD / mDNS、固定证书的 HTTPS 直连、单设备自动连接及多设备选择,接收端无需确认。按用户同步追剧 / 状态 / 对应进度,默认自动增量合并,手动提供双向合并 / 覆盖对方 / 覆盖本机及预览;版本向量、删除标记、冲突选择、原子保存、回执及断线补齐已接入。Android / Windows / TV / iOS 的发现、权限、取消、备份和真实双端同步均待验证
P3-3 [ ] 已实现,待验证:局域网推送播放 0.2.13 在常规、全屏及 TV 播放控件接入推送,复用设备连接;对方优先使用自己的完整下载,否则独立读取详情 / 解析,准备完成后接收最新位置,实际定位并播放后发起端暂停。取消 / 超时 / 失败保留本机播放,处理重复请求、迟到回执、用户切换和接收端后续操作;不传媒体地址、密钥或文件。真实双端接续与各平台布局未验证
P3-4 [ ] 已实现,待验证:视频画质增强与超分 0.2.18 接入物理输出尺寸适配、高质量缩放、RAVU、动漫/AI 动漫 CNN、Windows FSRCNNX 与有条件的 VPP;固定资源和 Windows 原生库,接入偏好、原画对比、生效判定、过载 / 温控降级和失败撤回。0.2.24 因手机和电视端实测卡死反馈,将入口与运行链路收窄为仅 Windows 桌面端,移动端、电视端和 iOS 不显示不初始化;Windows 效果与持续性能仍待集中验证
P3-5 [ ] 已实现,待验证:Android 播放器画中画 0.2.20 在 Android Activity 声明 PiP 能力,播放器通过原生 MethodChannel 查询系统支持并进入画中画;Android 手机 / 平板显示入口,进入 PiP 后不按普通后台暂停,退出后恢复常规生命周期暂停和进度保存。0.2.37 进入 PiP 前隐藏 Flutter 自绘播放器控件、弹幕和加载 / 错误覆盖层,并传入视频区域 sourceRectHint 优化转场;0.2.38 修正非全屏进入 PiP 时整页只保留视频,避免 Tab 内容进入小窗。Android TV、Windows 与 iOS 暂未接入系统级画中画,真实设备入口、系统权限、返回恢复、系统小窗控件和媒体持续播放待集中验证

旧项目的 Docker / HTTP 服务、浏览器注册与远程账号、跨设备服务端记录、在线 STRM 签名网关和远程 Emby 定时同步依赖常驻服务器,不直接照搬为本 App 的缺失功能。当前对应能力是设备内用户与备份、原生播放器、本地媒体和 Emby 文件导出;0.2.13 另接入不依赖服务器的局域网设备直连、追剧同步与播放接续。普通评论在旧项目中也未接入,不列为遗漏的已完成功能。

对照证据与验收边界

以下是修改前的历史问题证据,0.2.9 没有重新执行这些检查。对应修复是否通过,以将来集中验证结果为准。

2026-09-21 对真实 App Go 核心做了 9 项定向行为对照,通过临时 overlay 注入检查、内存文字响应隔离网络,均复现预期行为尚未实现;这是用于定位差距的 9 项预期失败检查,不代表全量回归有 9 项失败。未将这些失败检查加入正式测试集;实施修复时应将对应夹具整理为能通过的回归。

对应待办 文字夹具或函数检查结果
P1-R1 推进到 offset=18 后重建客户端,实际请求序列为 [0, 0],预期为 [0, 18]
P1-R2 第 201 页返回第 6001 条,重启后页码仍为 201,但新 ID 不在缓存中;500 页上限另外由代码确认
P1-R3 总目录资料更新后分类仍旧,写盘后 Categories 消失;两项现象由同一检查覆盖
P1-R4 详情返回新标题,再读目录仍是旧标题;跨页面海报重试缺口另由代码确认
P1-R5 合法明文配合固定文字密钥向量进入 AES 分支,最终 JSON 解析失败
P1-R6 实际 API 备用入口与构造的海报 Referer 主机不同;没有发送图片请求
P1-7 / P2-8 两项独立检查:五类资料字段在原生接口丢失;未知 VIP 覆盖已知 true
P1-8 官网返回第一季、名称索引提供第二季,正式搜索只返回第一季

续核另用 3 项 Go 文字 / 文件夹具与 3 项 Flutter 内存偏好夹具,复现以下 5 类边界问题。连同首轮共 15 项定向行为对照,均只用于确认待修复行为;没有运行全量回归,没有使用真实用户数据或真实媒体。

对应待办 续核操作与结果
P1-R7 放入无法解析的下载索引再迁移:调用返回成功,索引变为 [],原目录删除,loadErr 清空
P1-R8 用临时同名目录阻止 catalogs.json 写入:返回 Fresh=true、无警告;内存有 1 条,重启后为 0 条
P1-R9 密码管理员旁加入一个无效访客条目再初始化:管理员 protected=false、未锁定、可下载,原收藏仍可见
P1-R10:写入失败 模拟偏好平台保存收藏返回 false:操作正常结束,内存有 1 条,重新读取持久数据后为 0 条
P1-R10:恢复中断 恢复备份时在写收藏处抛错:历史已是新备份,收藏仍是旧数据,重启后混合状态保留
P2-11 前两部详情固定返回 404,第 3 部有效;连续补齐 3 轮,请求次数分别为 3、3、0

近期 Go 修复同步情况:9 月 18 日红果搜索补漏季已在 0.2.9 接入,待验证;9 月 20 日黄果 Salted__ / 非整分组 AES 和旧 XOR 兼容在 App 已有实现,不能列为整项缺失;详情 / 播放触发失败海报重试已在 0.2.9 贯通,待验证;9 月 21 日黄豆明文 JSON 优先识别已在 0.2.9 同步,待验证;备用入口海报来源头已在 0.2.7 同步。App 通过 FFI 返回设备文件,没有旧 Go 的 /api/ui/image 地址登记网关,应按 P1-R4 处理资料回写,不能照搬服务端 403 路由修复。

0.2.7 已迁移 Go 版 HEIC 容器解析与方向处理,通过随包 FFmpeg 转成 JPEG 后再交给 Flutter;AVIF 仍使用平台图片解码。使用合成容器与本地合成 JPEG 检查边界、串行转换、去重、缓存和失败清理;未请求站源图片,也未验证各平台真实设备的图片解码效果。本轮不启动设备、模拟器或远程 Actions。

后续每次移植在本 README 更新对应编号、Go 修复日期、App 状态及实际验证范围;分别覆盖默认 / 全站源构建。保留设备本地文件、FFI 和原生播放器的实现方式,不整目录覆盖旧项目,也不改动两份旧 Go 项目。

历史已完成的功能

本表保留 0.2.8 及此前状态;0.2.9 及之后新增内容以上方“已实现,待验证”的项目为准。

功能 当前实现
站源管理与完整黄果入口 0.2.4 加入逐站任务、健康检测、CF 诊断和黄果旧 API;修复黄果视频取流请求与密钥凭证;0.2.8 检测详情可独立展开 / 收起,后台刷新保留手动选择
站源分组与内容分类 0.2.7 首页黄果统一展示,合并接口分类与已缓存细分类,各接口独立续页;补齐分类字段和资料回写;AI 实际播放仍待恢复
榜单与封面兼容 0.2.7 接入三站 12 个真实榜单;HEIC 本地转 JPEG,封面地址补齐及新图床 DNS 回退
版本编译开关 0.2.3 加入默认红果鉴 / --all-sources 真果鉴,贯通原生核心、Flutter、平台名称、分发文件与 Actions
在线播放闭环 独立站源浏览、搜索、详情、选集、播放、错误重试;0.2.26 全站源版首页显示红果 / 黄豆 / 剧果 / 野果 / 帝果 / 黄果六个站源组,新增站源待验证
播放与记录 画质、倍速、切集、横竖屏、自动连播、自动切线、收藏和本地续播
界面与主题 默认跟随系统,浅色 / 深色选择;旋转刷新按钮、统一海报尺寸、黄豆专属 VIP 筛选、下载页布局调整
离线与媒体 下载与续传、Android 后台服务、离线播放、目录迁移、合并、本地成品及分集 Emby 导出
本地用户 站源 / 下载权限、独立记录、密码校验与备份恢复
平台工程 Android 三架构、Windows / iOS 构建脚本、TV 布局与遥控;0.2.29 补强电视自动识别与统一横屏,待集中验证;国内依赖镜像、源码版本快照

当前检查与平台状态

0.2.44+50 更新野果默认入口为 https://analyze.buxefaex.cc/,并把 https://ygdj7.com/ 作为线路发现页;新旧 buxefaex / fzchosdi 线路、delta.ygrwdsgt.cc 和 yeguodj.com 均归一为野果站源。0.2.47 起旧域名仅用于识别已有缓存和数据,不再作为运行时接口回退地址。0.2.48 将首页和推荐卡片普通点击改为无中间页直达播放:详情仍先读取,但不再 push “正在进入播放”页面,读取成功后直接打开播放器。剧果保留 /play/<episode> 返回的 CloudFront 三枚签名 Cookie,并让播放列表、分片、预加载和下载继续使用同来源凭证;帝果 vplayer 签名请求失败直接返回错误,不再静默交给播放器一个未签名地址。新增 Go 定向测试覆盖新域名识别、野果 50 页 POST 更新、目录页大小、三站源榜单、剧果签名 Cookie 和帝果签名错误传播;仅运行源码定向测试,未打包、未安装设备、未请求真实媒体或做真实播放验收。

0.2.42+48 继续按播放页与首页反馈收紧:追剧确认固定在播放页“简介”内容区,不作为 Tab;播放页下方 Tab 保持“选集 / 简介 / 下载”,下载选择器嵌入下载 Tab;播放器底部工具按钮改为少量靠右连续成组,超过阈值再拆成左右两组,避免平均分散在整行;首页在已有内容时不再于分类下显示异常提醒,目录滚动接近底部自动续页并保留“加载更多”兜底。已执行 dart analyze lib/home_screen.dart lib/player_controls.dart lib/player_screen.dart lib/download_picker.dart lib/television_controls.dart test/player_screen_test.dart test/downloads_test.dart test/widget_test.dart test/danmaku_widget_test.dart,仅剩既有 info 级 lint;flutter analyze ... 仍在中文路径下触发 analysis server LSP JSON 解析异常,未作为有效检查。已执行 flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart、test/downloads_test.dart --plain-name "mobile player moves download and follow into tabs"、test/widget_test.dart --plain-name "fresh disk catalog skips the network and resumes pagination"、test/widget_test.dart --plain-name "stale disk catalog remains usable when refresh fails"、test/danmaku_widget_test.dart 均通过;新增 compact player tools stay clustered instead of evenly spread 覆盖播放器底部按钮不再平均分散。完整 test/downloads_test.dart 仍有既有下载合集默认折叠 / 遥控导航断言未通过,未作为本轮验收结论。已执行默认红果版 flutter build apk --debug --no-pub,生成 build/app/outputs/flutter-apk/app-debug.apk,大小 162 MB,版本 0.2.42+48,SHA-256 为 eeaea66b8df3fd4658e29b33d947f92ae41bc5551d7aed8adc72f7f8a8325205。本轮未生成 Release APK、未安装设备、未执行真实播放视觉验收。

0.2.40+46 针对用户反馈的 iOS IPA 播放闪退做源码排查与兜底:应用能启动、浏览和进入详情,说明 Flutter 壳与原生 Go 核心大概率已加载;崩溃发生在点击任意剧集进入播放后,最可疑点是 iOS 播放页创建 media_kit_video 的 libmpv 纹理输出。上游 iOS 插件在 mpv_render_context_create 失败时调用 exit(1),不会回到 Flutter 错误页,因此外观看起来是点播放后 App 直接退出。已将 iOS VideoController 配置为禁用硬件纹理加速,改走软件纹理兜底;Android 和 Windows 保持原路径。本轮按要求未生成 IPA、未执行真机播放复验,需用 Xcode 设备日志确认是否仍有 MPVHelpers、mpv_render_context_create 或 Mpv.framework 相关崩溃。

0.2.39+45 继续按播放页 UI/UX 反馈优化:播放页下方 Tab 改为“选集 / 简介 / 下载”,原“相关”不再放在播放页;红果同系列相关推荐仍保留在详情页,避免播放页出现经常为空的内容区。追剧入口从播放器覆盖层移到简介内容区;下载入口从播放器覆盖层移到播放页下载 Tab,下载选择器支持嵌入式紧凑布局并复用连续选集网格。播放器覆盖层移除移动端音量、下载和追剧按钮,桌面端保留音量,电视端不再显示推送按钮;弹幕按钮改为圆形“弹”字样。首页目录滚动接近底部自动加载下一页,底部“加载更多”保留为兜底入口。已执行 dart analyze lib/home_screen.dart lib/player_controls.dart lib/player_screen.dart lib/download_picker.dart test/player_screen_test.dart test/downloads_test.dart test/danmaku_widget_test.dart,仅剩既有 info 级 lint;待执行播放器、下载、首页分页定向测试和 Android Debug 构建。未生成 Release APK,真实设备视觉验收仍待集中执行。

0.2.38+44 继续修正播放器实机截图反馈:非全屏点击画中画后,整个播放页在 PiP requested / active 状态下只渲染视频 Pane,不再把选集 / 简介 / 相关 Tab 内容缩进系统小窗;sourceRectHint 改为在纯视频布局重绘后一帧再计算,和实际进入小窗的画面一致。全屏播放器顶部显式使用 viewPadding.top + 16 且至少 40dp 避让,避免返回 / 标题与状态栏网络、电量、时间重叠;底部显式使用 viewPadding.bottom + 24 且至少 64dp,把进度条和底部工具整体抬高,避开虚拟导航栏;PiP 请求和激活期间连保存进度告警也不再绘制。已执行 dart analyze lib/player_controls.dart lib/player_screen.dart test/player_screen_test.dart,仅剩既有 info 级 lint;已执行 flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart、flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/danmaku_widget_test.dart;已执行 ./gradlew :app:assembleDebug 成功。未生成 Release APK,真实 Android 播放小窗和全屏控件截图仍待集中设备验收。

0.2.37+43 优化 Android 画中画小窗:参考 Android PiP 和 Apple 小窗播放最佳实践,进入画中画后 Flutter 自绘播放器控件、弹幕覆盖、进度条、标题、加载和错误覆盖层均不再绘制,小窗只保留视频画面,播放 / 暂停 / 返回应用 / 关闭等交互交给系统 PiP 控件;进入前先隐藏覆盖层并等待一帧,再调用原生 enterPictureInPictureMode,同时传入视频区域 sourceRectHint,避免系统截取到带按钮的旧界面并优化转场动画。已新增 test/player_screen_test.dart 用例覆盖“画中画隐藏 App 覆盖控制层”。已执行 dart analyze lib/player_controls.dart lib/player_screen.dart test/player_screen_test.dart,仅剩既有 info 级 lint;已执行 flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart、flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/danmaku_widget_test.dart;已执行 ./gradlew :app:assembleDebug 成功生成 162 MB Debug APK,并通过安装辅助脚本安装到 Android 15 / API 35 真机 V2453A,启动到首页且 logcat 未见 App 崩溃。自动点播进入真实 PiP 时设备会话被 vivo 系统 single-cleaner 强停,未完成真实小窗截图验收;Release APK 也未在本轮生成。

0.2.36+42 微调播放器布局:移除底部中间工具区的横向滚动容器,保留左侧倍速 / 清晰度、中间推送 / 下载 / 追剧、右侧音量 / 画中画 / 全屏或选集的稳定分布;红果弹幕按钮移到播放器右侧中段独立悬浮,避开中央播放按钮和底部进度条,弹幕开关和失败重试回调保持不变。已执行 dart analyze lib/player_controls.dart、flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart、flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/danmaku_widget_test.dart。本轮未打包 APK、未安装设备,真实站源和平台行为仍待集中验证。

0.2.35+41 修正播放器按钮布局继续反馈:按 Material / Android 触控目标规范和 Apple 自定义视频播放控件建议,把倍速、清晰度、推送、下载、追剧、弹幕、音量、画中画等入口统一为 36 高视觉工具按钮,外层保留更大的可点区域;移动和桌面底部控制层改为左侧倍速 / 清晰度、中间内容动作、右侧音量 / 画中画 / 全屏或选集分组,宽度不足时中间动作区可横向容纳,避免所有按钮堆到中间。音量不再打开居中大弹窗,改为右下角小型竖向滑动面板,支持拖动和一键静音 / 恢复。已执行 dart analyze lib/player_controls.dart、flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart、flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/danmaku_widget_test.dart。flutter analyze lib/player_controls.dart lib/player_screen.dart lib/lan_controller.dart 在中文项目路径下再次触发 analysis server LSP JSON 解析异常,未得到有效报告;本轮未打包 APK、未安装设备,真实站源和平台行为仍待集中验证。

0.2.34+40 修复移动播放器继续反馈:选集 Tab 的连续网格顶部恢复区间选择器,可快速定位每 50 集开头;播放器底部改为工具按钮一行、时间与进度条同一行,移动端去掉底部重复旋转按钮,顶部返回 / 旋转按钮增加安全间距,音量按钮在手机播放器始终显示;局域网投屏按钮尺寸与其他播放器工具按钮统一。红果相关推荐新增本地剧库系列候选缓存,详情和播放页相关不再只依赖追剧 / 历史 / 新季提醒,支持聚宝仙盆这类多季剧展示同系列。已执行 dart analyze lib/player_controls.dart lib/episode_browser.dart lib/local_store.dart lib/local_snapshot.dart lib/player_screen.dart lib/detail_screen.dart lib/lan_screen.dart test/follow_state_test.dart test/library_features_widget_test.dart test/player_screen_test.dart test/danmaku_widget_test.dart,仅剩既有 info 级 lint;已执行 flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/follow_state_test.dart、test/library_features_widget_test.dart --plain-name "detail related series can use refreshed catalog candidates"、test/player_screen_test.dart、test/danmaku_widget_test.dart、test/downloads_test.dart --plain-name "detail download picker handles VIP, quality and added=2"。本轮未打包 APK、未安装设备,真实站源和平台行为仍待集中验证。

0.2.33+39 继续优化播放器控制层与移动播放页:手机和桌面播放器覆盖层移除“播放设置”按钮,倍速、清晰度、推送、下载、追剧、弹幕、音量、画中画和旋转直接可用;自动连播和下一集预加载默认始终开启;上一集 / 播放暂停 / 下一集只保留居中一组,非全屏不再在播放器层重复显示选集按钮。移动端 Tab 增大点击区域,选集改为带边框的连续滚动紧凑网格,简介保留封面,相关列表显示红果同系列封面;选集按钮区分焦点和当前集,避免看起来多集同时激活。播放器缓冲进度改用进度条二级轨道,不再显示“已缓冲至”文字;下载选集页提供“取消全选”。已执行 dart analyze lib/player_controls.dart lib/player_screen.dart lib/episode_browser.dart lib/remote_widgets.dart lib/download_picker.dart lib/playback_buffer.dart test/danmaku_widget_test.dart test/player_screen_test.dart test/downloads_test.dart,仅剩既有 info 级 lint;已执行 flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart、test/danmaku_widget_test.dart、test/downloads_test.dart --plain-name "detail download picker handles VIP, quality and added=2" 和 added=0。本轮未打包 APK、未安装设备,真实站源和平台行为仍待集中验证。

0.2.32+38 优化播放入口与移动播放页:普通点剧先读取详情后直接进入播放器,下载入口仍走详情页;手机播放器下方用“选集 / 简介 / 相关”Tab 承接原详情内容,红果同系列剧在相关 Tab 中打开;手机播放页移除额外顶部标题栏,返回和旋转放入视频控制层,倍速、清晰度、推送、上一集、下一集、选集和设置不再在视频下方重复出现;移动端选集改为 30 集一组紧凑方格,分组、当前集和跳转合并在同一行;首页移除分类下方的更新状态提示,保留刷新任务;详情页选集默认折叠且只高亮当前播放集;下载选集页显式提供“全选 / 清空 / 仅非 VIP”与已选数量。已执行 dart analyze lib/player_screen.dart lib/player_controls.dart lib/episode_browser.dart lib/remote_widgets.dart lib/player_menu.dart test/player_screen_test.dart test/theme_test.dart,仅剩既有 info 级 lint;已执行 flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/player_screen_test.dart 和 test/theme_test.dart --plain-name "player shell follows light theme while video controls stay dark"。此前本轮还执行过 test/library_features_widget.dart 和下载选择定向测试。未打包 APK、未安装设备,真实站源和平台行为仍待集中验证;完整 test/downloads_test.dart 仍有既有下载合集默认折叠导致的旧断言失败,未作为本轮通过项。

0.2.31+37 仅针对红果接入系列剧与本机新季提醒:详情选集区显示本地已知同系列季;追剧刷新发现后续季时显示“新季”提醒并进入“有更新”筛选;点入新季或标记更新已读后清除提醒,不自动加入追剧。系统级通知因 Android 13+ 需要运行时通知权限且打扰等级更高,暂不接入。已执行 flutter test test/follow_state_test.dart test/library_features_widget_test.dart,覆盖红果季号识别、无后缀第一季、非红果忽略、提醒持久化 / 已读、追剧筛选和详情切换。dart analyze 可运行,仅报告既有 info 级 lint;flutter analyze 在中文项目路径下触发 analysis server LSP JSON 解析异常,未得到有效静态分析报告。本轮未打包 APK、未安装设备,真实站源和平台行为仍待集中验证。

0.2.30+36 优化全屏自动连播的控制栏显示:自动切换到下一集时不把播放开始事件当作用户操作,控制栏保持隐藏;首次进入、手动切集、暂停、缓冲和用户点击 / 键盘 / 遥控操作仍可显示控制栏。手机、Windows 与 Android TV 共用该状态边界。随后生成全站源版 Android ARM64 Release 包 dist/android/zhenguojian-0.2.30+36-arm64-v8a.apk,SHA-256 为 272f344a2d7976811c214180414965ed316a3bcdbd4b7335ec9ce8220c436f15;已完成 ARM64 原生库、版本信息和 APK v2 签名检查,未安装到设备,播放行为仍待实机验收。

0.2.29+35 完成电视自动识别与横屏方向管理源码:启动前识别设备,返回前台重新查询,失败保留既有结果;应用统一处理电视模式、手机全屏和播放器退出时的方向归还,Android Activity 对电视模式拦截竖屏请求并在恢复时重申横屏。随后生成全站源版 Android ARM64 Release 包 dist/android/zhenguojian-0.2.29+35-arm64-v8a.apk,SHA-256 为 ef8f971afc6119b8573c1adc2b64d736d27c9b400304bec75926dadd24a35ffc;包签名为本机 Android Debug 签名,已完成 ARM64 原生库、版本信息和 APK v2 签名检查,未安装到设备,Android 手机、电视 / 盒子及其它平台行为仍未完成本轮验收。

以下保留历史版本的实施与检查记录。

0.2.24+30 按移动端和电视端画质增强卡死反馈,将画质增强功能收窄为仅 Windows 桌面端可见和可运行;Android 手机、Android TV 与 iOS 均不再显示画质增强、画面类型和原画对比入口,也不初始化 mpv 增强后端,已保存偏好保留给 Windows 使用。本轮已生成全站源版 Android arm64 release 包 dist/android/zhenguojian-0.2.24+30-arm64-v8a.apk,SHA-256 为 c0a7d3c4469042d9a0cfcf0d6b01ed865db5e7580d552b7e3a27b1f582dfe9b7;未安装到设备,未执行完整回归。

以下保留历史版本的实施与检查记录。

0.2.23+29 修正全屏播放器控制层级:顶部只保留返回与标题,中央只保留大播放控制,底部统一承载播放、进度、时间、选集、倍速 / 画质、推送、原画对比、设置、画中画和全屏切换;普通小视频控制层也不再把设置、画中画和原画对比堆到顶部。全屏播放器的设置与选集弹窗、电视播放器的设置与分集弹窗均强制使用播放器暗色主题,不受浅色应用主题影响。随后使用 Flutter SDK 完成全站源版 Android arm64 release 构建,产物为 dist/android/zhenguojian-0.2.23+29-arm64-v8a.apk,SHA-256 为 81c673ecac5526dd46a517ced32bbf8d2b298125f80b7eaca7fa330075958778;未安装到设备,未执行完整回归。

以下保留历史版本的实施与检查记录。

0.2.22+28 修正手机竖屏播放页结构:视频下方只保留紧凑播放面板,当前集、上一集 / 下一集、倍速、画质、推送与“选集”入口可直接操作;完整选集仍通过折叠入口打开原选集面板,不再常驻铺满页面。本轮仅做源码实现、格式整理、窄范围静态检查与收尾同步;未生成新 APK,未做设备安装复验、平台构建或完整回归。

以下保留历史版本的实施与检查记录。

0.2.21+27 修正播放器页面外壳跟随浅色 / 深色主题,视频画布与覆盖控制保持深色;画质增强关闭时隐藏画面类型和原画对比,开启后展开配置;原画对比不再等待渲染确认成功才可用;Android 自动档先保流畅使用高质量缩放,清晰优先才尝试更高负载增强。本轮通过 ADB 确认当前前台 App 为 com.duanju.duanju_app/.MainActivity、进程 29688,并按 logcat --pid=29688 定位当前 App 日志;当时该进程没有可读历史日志行。清理本项目可再生成的 build / .dart_tool 缓存后,窄范围 dart analyze lib/player_screen.dart lib/player_menu.dart lib/video_enhancement_settings.dart lib/video_enhancement.dart lib/video_enhancement_policy.dart test/theme_test.dart 完成,仅剩既有 info 级 lint;新增播放器主题用例 flutter test test/theme_test.dart --plain-name "player shell follows light theme while video controls stay dark" 通过。整份 test/theme_test.dart 仍有既有导航断言 settings changes open routes without losing the active tab 未通过,未作为本轮验收结论;本轮没有平台构建、设备复验、新 APK、Windows 完整包或 iOS 应用。30 项已实现待验证仍保持未勾选。

以下保留历史版本的实施与检查记录。

0.2.20+26 接入 Android 手机 / 平板播放器画中画源码:Activity 声明 PiP 能力,播放器查询系统支持后显示入口,并在进入画中画时保持播放生命周期;未执行静态分析、自动化、平台构建或设备复验,也没有该轮新 APK、Windows 完整包或 iOS 应用。0.2.19+25 统一该站源的用户可见名称为剧果,保留内部 huangju 标识以兼容已有数据。启动诊断只读取了设备已有崩溃日志,启动修复、榜单、画质增强和画中画尚未执行平台验收;帝果公开播放路径检查另行记录,仍不实现绕过 VIP / 试看限制。

以下保留历史版本的实施与检查记录。

0.2.17+23 接入野果与帝果,包含分类、目录与搜索分页、详情、真实分集、媒体解析和来源请求头;新增站源纳入既有权限、下载、资料回写及局域网互联范围。野果的接口配置在设备内动态取得;帝果兼容用户参考脚本的同站媒体路径规则。

本轮为实现需要读取了两站的 HTML、JavaScript 和 JSON 接口文本,完成变更 Dart / Go 源码格式整理与源码镜像同步;未执行新增源码、静态分析、构建、自动化测试、回归、设备 / 模拟器、播放、下载或双端验证,未请求站源图片、播放列表、密钥或媒体文件。该轮记录的两份 Android APK 为 0.2.15+21,后来已有用户使用 0.2.17+23 并报告启动问题。该轮 28 项已实现待验证的状态保持未勾选,Android 手机、Windows、Android TV 与 iOS 的实际运行结论等待集中验证。

以下保留历史版本的实施与检查记录。

0.2.16+22 接入剧果访客授权、动态分类、热门 / 最新、目录与搜索分页、详情和签名 Cookie 媒体链路;榜单移至顶部标题栏“排序与筛选”后面。该轮仅整理源码格式并同步,没有运行静态分析、构建、自动化、设备、真实站源或双端验证。

0.2.15+21 根据首页截图调整多选与导航入口:移除首页全选,展开后显示文字“清空 / 取消”,底部固定已选数量及“下一步”;仅红果分类在“全部”后提供内嵌推荐,当时将“榜单”放在分类栏右侧,位置已在 0.2.16 调整。

变更 Dart / Go 源码完成格式整理,两版 Android ARM64 Release 构建与包检查通过。版本码为 2021,签名与 0.2.10 / 0.2.14 一致;每份 17 个 ARM64 原生库采用 ZIP DEFLATE,安装时解压、CRC、ZIP 对齐、应用名称 / 包名、对应原生核心及两份 APK 的 SHA256 均已核对。构建与包检查记录保存在 build/packages-0215/。

0.2.15 未执行静态分析、自动化测试、回归、设备 / 模拟器或真实局域网验证,也未请求站源图片;该版布局、切换推荐与多选操作的实际运行效果待用户安装确认。

0.2.14+20 根据用户提供的“正在打开红果鉴”截图修复启动导航。0.2.13 为接收播放加入固定导航 key 后,初始化前后改变了 MaterialApp 的父节点层级,保留下来的根路由继续引用旧应用状态。现在初始化前后都使用同一层 AnimatedBuilder,保持应用与导航状态连续,使首页能够接替初始化页,并保留推送接收导航。定位依据为截图与源码,尚未在设备上确认启动效果。

打包同时补齐 lan_screen.dart 对 LocalStoreSync 扩展的导入,解决 Release 编译失败。0.2.14 执行结果:

检查 结果与范围
源码格式 变更 Dart / Go 文件完成格式整理
Android Release 构建 默认红果版、--all-sources 全站源版均通过,ARM64,版本 0.2.14+20
安装与升级信息 应用名称、包名、版本码 2020、最低 Android 8.0 和非调试标记正确;签名有效,且与 0.2.10 / 0.2.13 一致
包完整性 每份 17 个原生库均为 ARM64 ELF、ZIP DEFLATE;包 CRC、ZIP 对齐和安装时解压配置通过
编译配置与校验值 两版各自的原生核心与构建记录一致,Dart 与原生二进制分别区分两版;两份 APK 与 SHA256SUMS.txt 一致

构建和包检查记录在 build/packages-0214/,包括两版 release-*-arm64.log、apk-*-verification.log 和 apk-verification.json。0.2.14 没有运行静态分析、自动化测试、回归、设备 / 模拟器或真实局域网验证,没有请求站源图片;包检查不代表启动、同步、推送或其他运行行为已经验收。

0.2.13+19 接入 P3-2 / P3-3:局域网自动连接、追剧与对应续播进度的增量同步 / 手动覆盖、冲突处理和播放推送。功能实施阶段暂停验证,当时只执行:

  • flutter pub get:取得 nsd 5.0.1 及平台依赖,更新 pubspec.lock。
  • Dart / Go 源码格式整理。
  • 收尾同步、创建本地 v0.2.13-unverified 快照及源码镜像一致性确认。

该功能实施阶段没有运行 Dart 静态分析、Go 编译、自动化测试、回归、完整平台构建、真实局域网通信或设备 / 模拟器操作,也没有请求站源图片。后续按用户要求打包,并在收到启动问题反馈后交付上述 0.2.14 修复包。Android / Windows / TV / iOS 的设备发现、权限、并发同步、取消与回执恢复、推送定位和控件布局仍待集中验证。

以下历史版本的检查结果不能作为后续新增功能的验证结论。

0.2.12+18 完成界面调整及 P2-4 / P2-5 / P2-6 / P2-7 / P2-9 / P3-1 的源码接入,当时的检查结果:

检查 结果与范围
源码格式 Dart lib 与变更 Go 文件完成格式整理
Dart 静态分析 dart analyze --fatal-infos lib 通过,无问题
本机 Go 核心编译 在 native 执行 go build ./core 通过
Android ARM64 核心编译 GOOS=android GOARCH=arm64 CGO_ENABLED=0 go build ./core 通过
Windows x64 核心编译 GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build ./core 通过

0.2.12 没有执行自动化测试、回归、真实媒体播放或设备 / 模拟器验证,也没有构建新 APK、Windows 完整包或 iOS 应用。上述 Go 检查只覆盖核心源码编译,不代表平台桥接、随包媒体库、界面或合并输出已验收。当时黄果 AI 仅做入口与目录的只读连接诊断,结果超时;未请求站源图片。

以下 0.2.11 及更早版本的检查和安装包记录,也不作为后续新增功能的验证结论。

0.2.11+17 完成 P2-3 红果弹幕的源码接入,Go / Dart 格式与 Dart 静态检查通过。默认红果版和全站源版各通过 6 项 Go 定向测试(含竞态检测)及 18 项 Flutter 定向测试。原生检查使用内存文字响应,覆盖原始时间戳、分集身份、异常时间窗口、缓存去重、取消和播放会话隔离;Flutter 使用合成数据,覆盖分页与有界缓存、失败重试、迟到结果、暂停 / 缓冲 / 倍速 / 跳转、连续动画、开关持久化与备份兼容、用户切换、窄屏大字及 TV 设置。

0.2.11 只运行以下弹幕测试,Go 命令在 native 目录执行,Flutter 命令在项目根目录执行:

go test -race ./core -run '^(TestHongguoDanmaku|TestNativeDanmaku)' -count=1 -timeout=60s
go test -race ./core -ldflags='-X duanjuapp/native/core.buildAllSources=true' -run '^(TestHongguoDanmaku|TestNativeDanmaku)' -count=1 -timeout=60s
flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/danmaku_test.dart test/danmaku_widget_test.dart
flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true --dart-define=ALL_SOURCES=true test/danmaku_test.dart test/danmaku_widget_test.dart

Flutter 记录在 build/danmaku-0211/flutter-default.log 与 flutter-all-sources.log。0.2.11 未进行回归、真实站源弹幕请求、设备或模拟器验证,也未请求站源图片;Android、Windows 与 TV 的实际播放效果待平台验收。0.2.11 当时未单独打包,弹幕实现已包含在新版 APK 中。

0.2.10+16 完成 P2-1 与 P2-2 的源码接入,Dart 格式与静态检查通过。默认红果版和全站源版各通过 26 项新增功能针对性测试,使用合成文字与分集数据,禁用远程图片;覆盖追剧记录与实际播放进度分离、已读基准、备份兼容与失败保留、用户隔离、共享更新任务与缓存续页、批量下载重试 / 停止,以及 360×640 和 1100×720 的大字布局。

0.2.10 功能实施阶段执行了以下三份测试文件:

flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true test/follow_state_test.dart test/library_workflow_test.dart test/library_features_widget_test.dart
flutter test --no-pub --dart-define=DISABLE_REMOTE_IMAGES=true --dart-define=ALL_SOURCES=true test/follow_state_test.dart test/library_workflow_test.dart test/library_features_widget_test.dart

0.2.10 打包时移除了 app_cover_metadata.go 中遗留的 parseHuangguoSortDetail 重复定义,统一复用详情元数据解析实现;Go 格式整理和 TestNativeCoverMetadataRejectsOtherDramaAndKeepsCurrentHost 定向测试通过,测试只解析合成元数据,不请求图片。

0.2.10 的红果鉴 / 真果鉴两份 ARM64 Release 构建和安装包检查已通过。每份 APK 的 17 个原生库均为 ARM64 ELF 并使用 ZIP DEFLATE 压缩,清单启用安装时解压;签名与 0.2.8 一致,包 CRC、ZIP 对齐、应用名称、包名、版本 0.2.10、ARM64 分包版本码 2016 和对应原生核心均正确。两份包及 SHA256SUMS.txt 已校验,构建与检查记录在 build/packages-0210/,对应 release-default-arm64.log、release-all-sources-arm64.log、apk-default-verification.log 和 apk-all-sources-verification.log。

0.2.10 打包没有执行全量 Flutter / Go 回归、设备或模拟器测试,也没有请求站源图片。构建成功不代表新增功能已经完成平台验收。

0.2.9 接入的播放器交互、分页 / 保存 / 本地用户恢复、红果推荐、资料模型、排序、全部站源和完整搜索等,仍按各待办行保留原有验收状态。0.2.10 / 0.2.11 的针对性测试不代表这些功能已完成集中验证;Android、Windows 原生行为与新增 TV 操作仍待平台验收。

黄果 AI 的实际密钥连接与播放仍未恢复。0.2.13 已接入原清单中可独立实施的功能以及新增 P3-2 / P3-3;AI 待可通的入口后继续处理连接与播放问题,集中验证继续按用户安排执行。

0.2.8 已通过 Dart 格式与静态检查,默认红果版和全站源版各通过 5 项站源界面定向检查。使用合成数据覆盖历史详情默认收起、两种主动检测展开、手动收起后跨请求返回 / 轮询 / 检测完成保持状态、完成后再次展开与收起,以及窄屏大字的失败诊断。记录在 build/sources-028/。

0.2.7 已通过 Dart 格式与静态检查、相关 Go 定向检查(含竞态检测),另验证默认红果版的权限、分类和合成 HEIC。Flutter 定向检查默认版通过 14 项、全站源版通过 15 项;覆盖紧凑布局、大字体、展开搜索、黄果聚合 / 分类去重、独立分页与失败页重试、过期响应隔离、真实榜单名次、VIP 筛选及海报尺寸。合成 HEIC 还经过真实原生准备接口与开发机 FFmpeg 转成 JPEG,验证旋转后尺寸由 64×96 变为 96×64;此项不等同于 Android 原生插件实机验收。检查记录在 build/sources-027/。

0.2.7 / 0.2.8 按当时要求没有运行整套回归、启动设备或模拟器,也未请求任何站源图片;各平台实际显示与播放效果仍需安装验证。0.2.6 的待办审查与边界问题证据保留在上文,以下保留历史版本验证结论。

0.2.6 已完成红果鉴 / 真果鉴两份 ARM64 Release 构建。每份 APK 的 17 个原生库均采用 ZIP DEFLATE 压缩,最终清单已启用安装时解压;包 CRC、ZIP 对齐、应用名称、版本、签名和内置核心对比均通过。两份签名与 0.2.5 一致。全站源包由 67.4 MB 缩小到 30.1 MB,减少约 55.3%;第三方原生库解压后的内容与 0.2.5 一致。记录在 build/sources-026/。

0.2.5 已通过 Dart 格式与静态检查、5 项定向 Go 检查(含竞态检测)和 1 项分类界面检查,覆盖分类分页 / 缓存隔离、旧 API 单剧 404、封面地址与合成解码、密钥 EOF 后备用 DNS 连接,以及分组切换和过期分类响应隔离。按用户要求不运行整套回归,记录在 build/sources-025/。

0.2.5 线上文本检查取得黄果视频和旧版的实际分类;旧版独立更新成功,返回 100 部剧,全部封面 URL 已避免误用视频 CDN。仅核对地址元数据,封面解码只用合成图片,未请求站源图片。记录在 build/sources-025/live-fixes.log。

黄果 AI 截图同剧《神瞳觉醒 第一季》的目录、21 集分集与 M3U8 均正常,但密钥请求仍在 TLS 握手时断开;换用备用公网地址及浏览器兼容连接后仍失败,没有证明媒体可播放。诊断记录在 build/sources-025/key-probe.log、asset-probe.log 和 alias-probe.log。此前 0.2.4 黄果视频“母女日常”的目录、分集、播放列表、密钥和媒体连接抽样通过,记录在 build/sources-024/live-huangguo.log;该结果不能代表黄果 AI 或 Android 实机播放。

0.2.8 已生成两份 ARM64 Release 安装包,可覆盖升级。每份的 17 个原生库均使用 ZIP DEFLATE,清单启用安装时解压;签名与 0.2.7 一致,包 CRC、ZIP 对齐、应用名称、版本和内置核心对比均通过,记录在 build/sources-028/apk-verification.log 与 apk-default-verification.log:

版本 安装包 大小
红果鉴,仅红果 dist/android/hongguojian-0.2.8+14-arm64-v8a.apk 30.2 MB
真果鉴,全部站源 dist/android/zhenguojian-0.2.8+14-arm64-v8a.apk 30.2 MB

构建日志为 build/sources-028/release-default-arm64.log 和 release-arm64.log,包校验记录为同目录的 apk-default-verification.log 和 apk-verification.log。其他架构的构建开关和脚本保留,0.2.8 未生成其他架构安装包。

按用户要求,由用户自行安装体验,不执行手机 / 电视实机测试或启动模拟器。Windows 完整包需 Windows / Actions;本机缺少 iPhoneOS SDK,iOS 尚未完成 Xcode 构建,也没有已签名 IPA。本轮不运行远程 Actions,不请求或处理站源图片。

此前的合成 CENC 换封装、少数分集合并转码和 Emby 成品独立解码检查已通过。平台状态单独记录,不将待验收项目混入上面的功能移植顺序。

Зеркало документации архивировано из официального репозитория GitHub · Перейти на GitHub
Дата снимка: 2026-11-13