guoapp README

The project's README from github.com/zhoufuweigg/guoapp. As one markdown file: README.md.

红果鉴 / 真果鉴

⚠️ 免责声明:本项目源码来自网上大名鼎鼎的鱼佬(原作者)。我只是把它拿来打包、测试着玩,方便自己用,不保证任何可用性,随时可能删库。

Flutter 多端独立短剧 / 影视应用,原名「短剧库 APP」。站源请求、解析、下载和播放均在设备上完成,不依赖自建服务。当前源码版本:0.2.51+57。

本轮在 0.2.50 基线上新增两个原生站源:韩小圈(hanxiaoquan,韩剧 / 韩国电影 / 韩国综艺 / 韩国动漫)与鬼片网(guipian,鬼片 / 电视剧 / 动漫)。默认可见站源顺序为:红果 → 韩小圈 → 鬼片 → 青空。

说明:应用长期按「只维护源码与定向测试,集中验证另行安排」的方式推进。未完成集中验证与真机验收的项目保持未验收状态;历史版本的检查记录不能作为后续新增功能的验收结论。

编译方式 应用名称 可用站源
默认(不加参数) 红果鉴 仅红果
加 --all-sources 真果鉴 红果、韩小圈、鬼片、青空,以及黄豆、剧果、野果、帝果、黄果视频、黄果 AI、黄果旧版

默认可见站源(红果、韩小圈、鬼片、青空)无需密码;其余站源默认隐藏,在站源管理里通过密码锁解锁后显示。已有受限用户不会自动获得新增站源权限,管理员可在用户管理中勾选。

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

两版保留原 Android / iOS 应用标识及数据目录;Android 使用同一签名可相互覆盖升级,不能作为两个独立正式应用并排安装。切换版本保留追剧、观看记录、用户权限和下载记录;备份格式保持兼容。

使用

功能 操作
浏览 标题栏依次提供排序与筛选、榜单、多选下载和展开搜索。分类保持独立一行,内容区左右滑动切类;支持默认、名称、自然季号、上线日期、热度、播放量排序及连载状态筛选。列表下滑接近底部自动加载下一页,底部「加载更多」为兜底
搜索 红果合并官网与名称索引,输入停顿 300 毫秒显示最多 10 条联想;韩小圈、剧果、野果、鬼片调用各自的在线搜索并按分页继续加载。部分失败保留有效结果;最近 20 次搜索按用户保存
推荐 仅红果分类栏在「全部」后显示「推荐」,可切换真人剧、漫剧、AI 剧并分别记住位置
详情 普通点剧直接进入播放;下载和兜底入口保留详情页。详情页浏览封面、资料、追剧状态与可展开简介;底部固定「立即播放 / 继续播放」和下载入口。选集默认折叠,展开后每组 50 集,可切换范围、定位当前或输入集数跳转;宽屏与电视采用资料、选集分栏
追剧与历史 按想看 / 在看 / 已看 / 有更新筛选;红果已追剧发现新季后进入「有更新」。追剧和历史均可搜索。每个用户独立保存,每 5 秒及退出播放时记录真实进度
卡片与批量下载 卡片「更多」提供收藏、状态和下载选集;电脑右键,电视菜单键。发现页长按卡片或点标题栏「多选下载」,一次最多 50 部
VIP 全站源版浏览黄豆或全部站源时显示 VIP 图标,仅过滤黄豆;默认隐藏已确认的 VIP。未知、免费、VIP 分别保存,未知不会覆盖已知状态
手机播放 上滑下一集、下滑上一集;长按 350 毫秒临时 3 倍速。竖屏轻点播放 / 暂停,横屏轻点控制条,双击播放 / 暂停。视频下方为「选集 / 简介 / 下载」Tab
画中画 Android 手机 / 平板播放器接入画中画按钮;进入前隐藏自绘控制层与弹幕,小窗只保留画面。Android TV、Windows、iOS 暂未接入
画质增强 仅 Windows 桌面端显示并运行增强链路(关闭 / 自动 / 省电增强 / 清晰优先);移动端与电视端隐藏
弹幕 红果在线播放默认开启;播放器侧边圆形「弹」字按钮可关闭、查看状态及失败重试。本地播放不加载弹幕
下载 播放页「下载」Tab 和详情页下载入口均可选择分集与画质;支持批量暂停、继续、重试、删除及清理任务但保留视频。「更新本剧」补新增或缺失分集
更多 站源管理、用户管理、设置与备份、界面模式、关于
站源 浏览与播放 搜索
红果 真人剧、漫剧、AI 剧及分集 联网搜索与官网搜索联想
韩小圈 MacCMS 模板:最新韩剧 / 韩国电影 / 韩国综艺 / 韩国动漫,多线路分集 站源在线搜索
鬼片 MacCMS 站点:鬼片 / 电视剧 / 动漫,多线路分集 RSS 最新条目标题匹配(站点搜索已停用)
青空 番剧、剧场动画、特摄及分集 站源在线搜索
黄豆 列表、VIP 标记及分集 筛选已加载短剧
剧果 热门、最新、接口分类、详情及可播放分集;签名 Cookie 接入在线播放、预加载和下载 站源在线搜索,支持继续加载
野果 接口实际分类、目录、详情及真实分集;按分集重新取流,保留 H.264 / H.265 地址 站源在线分页搜索
帝果 网页分类、目录、详情及分集;vplayer 签名解析 站源在线分页搜索
黄果视频 / 黄果 AI / 黄果旧版 列表、分类、详情及分集 筛选已加载短剧

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

网络与资源设置

管理员从「设置与备份 → 网络与资源」选择自动、直连或手动代理,手动地址支持 HTTP、HTTPS、SOCKS5 / SOCKS5h。代理地址默认遮蔽、不进入备份;设备内播放服务始终绕过代理。自动模式读取系统静态代理与排除列表,恢复前台及每 30 秒更新;代理不会关闭 TLS 校验。

目录请求并发可设 1–6、间隔 0–5000 毫秒(默认 3 / 250ms);下载并发默认 2、可设 1–6。仍保留前台优先、后台让行、取消、退避及请求数量边界。

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

两台设备在同一局域网直连,自动同步追剧记录或接续播放,不依赖账号服务器。服务类型 _zgj-link._tcp(DNS-SD / mDNS),按设备 ID 合并多网卡地址,首次配对记录证书指纹,后续连接固定校验。

入口:「追剧 → 标题栏同步」或「设置与备份 → 设备互联」。手动同步默认「双向合并」,可选覆盖对方 / 覆盖本机,先「查看预览」再执行;自动同步仅发送改动条目与删除标记,播放期间约每 10 秒发送进度。冲突记录保留候选,用户从同步页逐项处理。

安装包与平台状态

平台 包与状态
Android 8.0+ 三架构(arm64-v8a / armeabi-v7a / x86_64)APK;同一签名可覆盖升级
Windows 10/11 x64 完整 ZIP 解压后运行 hongguojian.exe / zhenguojian.exe,保留所有 DLL 与 data;局域网原生发现依赖 Windows 10 1903+
Android TV 与手机共用源码,自动识别电视模式并保持横屏;待电视 / 盒子实机验收
iOS 15.1+ 已加入工程、Go 核心链接、媒体依赖、文件管理与构建脚本;iOS 播放页禁用 media_kit_video 硬件纹理加速以规避 libmpv 渲染崩溃;待 Xcode 构建与真机验收,无已签名 IPA

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

GitHub Actions

推送 main / master、v* 标签、提交 PR,或手动运行 Build app packages,会先检查再构建两版(默认与 --all-sources):

产物 内容
*-android 三种架构 APK 和 SHA256
*-windows 完整 ZIP 和 SHA256
*-ios-unsigned 未签名 .app ZIP 和 SHA256,不能直接当已签名 IPA 安装

推送 main 且 android / ios / windows 全部构建成功时,自动创建 / 更新 GitHub Release(tag app-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:

storeFile=/absolute/path/zhenguojian-release.jks
storePassword=你的密码
keyAlias=zhenguojian
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。

构建脚本对子进程默认设置 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    # 国内镜像
.\scripts\build_windows.ps1
.\scripts\build_windows.ps1 -AllSources
.\scripts\build_windows.ps1 -ChinaMirrors
python3 scripts/build_ios.py
python3 scripts/build_ios.py --all-sources
python3 scripts/build_ios.py --core-only [--simulator]
python3 scripts/build_ios.py --export-options /path/to/ExportOptions.plist

产物在 dist/android、dist/windows、dist/ios,红果版以 hongguojian- 开头,全站源版以 zhenguojian- 开头。

首次 Android 调试先编译对应架构核心,再运行:

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

调试全站源版:先给 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 不参与正常播放或下载的转码。

集中检查与真机回归

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" ./...

Android 设备回归(连接并授权 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

结果在 build/device-test/results/;结束后停服务并 adb reverse --remove tcp:38473。

源码同步

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

脚本只同步纯源码到同级 ../guoapp,并生成 真果·鉴-YYYYMMDDHHMM.zip 源码压缩包;不执行 Git 提交、分支或推送。

目录结构

目录 内容
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 自动化与设备回归

站源开发约定

站源是 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。解析多线路播放列表时不能用 (?=...) 做分段,否则非捕获组会消耗下一段开头;应改用显式字符串截断(从容器标记之后查找下一段标记)。

guoapp (zhoufuweigg/guoapp)

video-player
Searching Database…

1.2K ·GitHub
What is this?It is a Flutter cross-platform short-drama/video client (originally '短剧库APP') that fetches, parses, downloads and plays Chinese short-drama and film sites directly on the device without needing a self-hosted backend.
Are 红果鉴 and 真果鉴 two different apps?They are the same codebase compiled with different flags: the default build ('红果鉴') only includes the 红果 source, while compiling with --all-sources produces '真果鉴' with access to 红果, 韩小圈, 鬼片, 青空 plus extra password-locked sources. You cannot switch between them inside the app, it is a build-time choice.
How do I get the app running?Grab a pre-built package from GitHub Releases or Actions artifacts: Android ships a signed multi-arch APK, Windows ships a ZIP you unpack and run as hongguojian.exe or zhenguojian.exe. Android TV shares the same code and auto-detects TV mode; iOS exists in the project but has no signed release yet.
Is this a stable, officially maintained app?No — the author states it is just a personal repackage of someone else's original source code for private testing with no availability guarantee and the repo could disappear anytime. The iOS build also has no signed IPA yet and is awaiting real-device testing, and features like Picture-in-Picture and quality enhancement are not available on every platform.
What video sources does the all-sources build unlock?Besides 红果, it adds 韩小圈 (Korean dramas/films/variety/anime), 鬼片 (horror/TV/anime), 青空 (anime/tokusatsu), plus password-gated extras like 黄豆, 剧果, 野果, 帝果 and the 黄果 video/AI/legacy sites.
Can I download episodes to watch offline?Yes — the player's Download tab and the detail page let you pick episodes and quality, with batch pause/resume/retry/delete, plus an 'update this drama' option to fetch newly added episodes.
Can two phones sync watch progress without a server?An unvalidated LAN feature lets two devices on the same network discover each other via mDNS and merge watch history/progress directly, with no account server involved.
Is the picture-quality enhancement available on mobile?No, the enhancement pipeline (off/auto/power-saving/sharpness modes) only runs on the Windows desktop build; it is hidden on mobile and TV.
Size
1.1 MB
Stars
1.2K
Age
23d
Commits · 90 Days