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" ./...
红果鉴 / 真果鉴
Flutter 多端独立短剧 / 影视应用,原名「短剧库 APP」。站源请求、解析、下载和播放均在设备上完成,不依赖自建服务。当前源码版本:0.2.51+57。
本轮在 0.2.50 基线上新增两个原生站源:韩小圈(
hanxiaoquan,韩剧 / 韩国电影 / 韩国综艺 / 韩国动漫)与鬼片网(guipian,鬼片 / 电视剧 / 动漫)。默认可见站源顺序为:红果 → 韩小圈 → 鬼片 → 青空。--all-sources默认可见站源(红果、韩小圈、鬼片、青空)无需密码;其余站源默认隐藏,在站源管理里通过密码锁解锁后显示。已有受限用户不会自动获得新增站源权限,管理员可在用户管理中勾选。
这是编译选项,应用内不能切换版本。标题、Android 桌面名称与电视横幅、Windows 窗口与分发文件名、iOS 显示名随编译选项变化。界面、站源调用、原生下载调度同时限制可用站源;红果版不会访问或继续执行其他站源的旧任务。
两版保留原 Android / iOS 应用标识及数据目录;Android 使用同一签名可相互覆盖升级,不能作为两个独立正式应用并排安装。切换版本保留追剧、观看记录、用户权限和下载记录;备份格式保持兼容。
使用
站源可用性、清晰度和区域限制取决于源站及网络;应用不解除源站 VIP 或其他授权限制。
网络与资源设置
管理员从「设置与备份 → 网络与资源」选择自动、直连或手动代理,手动地址支持 HTTP、HTTPS、SOCKS5 / SOCKS5h。代理地址默认遮蔽、不进入备份;设备内播放服务始终绕过代理。自动模式读取系统静态代理与排除列表,恢复前台及每 30 秒更新;代理不会关闭 TLS 校验。
目录请求并发可设 1–6、间隔 0–5000 毫秒(默认 3 / 250ms);下载并发默认 2、可设 1–6。仍保留前台优先、后台让行、取消、退避及请求数量边界。
局域网互联:追剧同步与推送播放(已接入,待验证)
两台设备在同一局域网直连,自动同步追剧记录或接续播放,不依赖账号服务器。服务类型
_zgj-link._tcp(DNS-SD / mDNS),按设备 ID 合并多网卡地址,首次配对记录证书指纹,后续连接固定校验。入口:「追剧 → 标题栏同步」或「设置与备份 → 设备互联」。手动同步默认「双向合并」,可选覆盖对方 / 覆盖本机,先「查看预览」再执行;自动同步仅发送改动条目与删除标记,播放期间约每 10 秒发送进度。冲突记录保留候选,用户从同步页逐项处理。
安装包与平台状态
hongguojian.exe/zhenguojian.exe,保留所有 DLL 与data;局域网原生发现依赖 Windows 10 1903+INSTALL_FAILED_NO_MATCHING_ABIS表示 APK 与设备架构不匹配,请更换对应架构安装包。GitHub Actions
推送
main/master、v*标签、提交 PR,或手动运行 Build app packages,会先检查再构建两版(默认与--all-sources):*-android*-windows*-ios-unsigned.appZIP 和 SHA256,不能直接当已签名 IPA 安装推送
main且 android / ios / windows 全部构建成功时,自动创建 / 更新 GitHub Release(tagapp-v{version})。发布新版本前需先在pubspec.yaml提升version,否则会覆盖同名 tag 的 Release。Android 正式发布使用同一签名并递增构建号,在仓库 Secrets 配置:
ANDROID_KEYSTORE_BASE64、ANDROID_KEYSTORE_PASSWORD、ANDROID_KEY_ALIAS、ANDROID_KEY_PASSWORD。未配置时生成 debug 签名预览包。本地不入库的
android/key.properties:开发与构建
Flutter
3.47.4、Dart3.12+、Go1.24.1+、Python3.10+。Android 需要 JDK 17、SDK 36、NDK28.2.13676358;Windows 需要 Visual Studio C++ 桌面组件及 MinGW-w64 x64;iOS 需要 macOS、完整 Xcode 和 CocoaPods。构建脚本对子进程默认设置
GOPROXY=https://goproxy.cn,direct、GOSUMDB=off,同名环境变量可覆盖。产物在
dist/android、dist/windows、dist/ios,红果版以hongguojian-开头,全站源版以zhenguojian-开头。首次 Android 调试先编译对应架构核心,再运行:
调试全站源版:先给
build_native.py加--all-sources,再flutter run --dart-define=ALL_SOURCES=true;iOS 对应build_ios.py --core-only --all-sources。脚本会同步设置 Dart 常量和 Go 编译参数,应用启动时校验二者一致,避免混装原生库。播放器使用 media_kit / libmpv,合并和导出使用 FFmpegKit min-gpl(含 GPL 媒体组件)。FFmpegKit 不参与正常播放或下载的转码。
集中检查与真机回归
Android 设备回归(连接并授权 USB 调试、保持解锁):
结果在
build/device-test/results/;结束后停服务并adb reverse --remove tcp:38473。源码同步
脚本只同步纯源码到同级
../guoapp,并生成真果·鉴-YYYYMMDDHHMM.zip源码压缩包;不执行 Git 提交、分支或推送。目录结构
libnative/core、native/bridgeandroid、windows、iosassets/video_enhancement、packages/media_kit_libs_windows_videoscripts、.github/workflowstest、integration_test站源开发约定
站源是 Go 原生 provider(
native/core/provider_*.go),不是运行期加载的 Python 源。新增站源需接入:provider_huangguo.go(常量 / 白名单 /canonicalProviderSource/GetHuangguoChapters)、provider_media.go(baseURL / host 反查 / 播放分派)、app_categories.go、app_cover_metadata.go、app_runtime.go(Config 字段 + 目录 / 搜索 / 详情分派 + 空页放行),并在lib/models.dart登记SourceSite。注意:Go RE2 正则不支持 lookahead。解析多线路播放列表时不能用
(?=...)做分段,否则非捕获组会消耗下一段开头;应改用显式字符串截断(从容器标记之后查找下一段标记)。