Skip to content

fish2018/webhtv

Repository files navigation

WebHomeTV

WebHomeTV 是基于 FongMi / CatVod 生态二次开发的 Android 影音应用,保留原有点播、直播、Spider、解析、投屏、本地 HTTP 服务等能力,并重点增强了 WebHome 自定义首页App Native SDK管理页面远程托管WebHome 扩展登录态学习/同步网盘链接检测站点健康排序观影记录同步Nostr/TMDB 推荐首页

项目的核心目标不是替换 CSP/Spider 体系,而是让 CSP 站点首页变成一个真正可开发的网页应用:开发者用 HTML/CSS/JavaScript 定制首页,再通过 App 暴露的 Native 能力完成搜索、播放、跨域请求、资源代理、最近观看、网盘检测和状态同步。

增强功能

  • 网盘检测:内置网盘分享链接有效性检测,WebHome 和本地 HTTP API 均可调用。
  • 站点健康排序:自动学习站点搜索、详情和播放成功率,搜索与换源优先使用更可用的站点;站点弹窗默认保留用户配置顺序,可在弹窗内单独开启健康排序。
  • 管理页面:在 App 内启动局域网浏览器管理页 /m,可管理本机或远端设备文件、登录态、同步目录、站点注入、接口、壳代理、搜索和推送,运行期间通过前台服务保活。
  • 远程托管:通过自建 Cloudflare/Deno/Vercel/Go/Rust 中转服务绑定多台 WebHTV 设备,支持设备状态、远程搜索/推送、接口配置、主页设置、一键同步和最近日志;Go/Rust 版支持 WebSocket 实时通道,不支持时自动回退 HTTP 轮询。部署说明和二进制见 远程托管中转服务器文档及二进制
  • 一键同步:在同一局域网设备间同步配置、站源数据(Jar/脚本保存数据)、登录态、WebHome 数据、搜索记录、观看历史、收藏和应用设置,每项可单独勾选。
  • 站点注入:添加自定义 WebHome 或通用 CSP 站点,主列表显示核心摘要和快捷操作,新增/修改在独立表单中维护启用状态、插入位置、首页、搜索和换源行为;顶部“识别”可粘贴单个或多个松散站点 JSON 片段并自动归类追加;WebHome 站点级扩展可直接填写扩展 URL / JSON,也可选择本地 JS/CSS/JSON 自动生成配置。
  • WebHome 扩展:给真实网页注入用户脚本,主列表显示扩展摘要和状态,新增/修改在独立表单中配置本地文件、远程链接/manifest、直接代码、表单生成或 JSON;匹配范围默认从当前点播配置的 WebHome 站点弹窗多选,也可切换到 CSP key 正则;提供调试工作台用于 Web 预览、Console/Network/Elements 和代码保存预览。
  • 观影记录同步:增强功能中提供独立总览页,包含总开关、本机 API 修改开关、远端同步源和 Webhook 上报。爬虫可通过 /api/playback/current 读取当前播放记录,也可在用户开启修改后调用 /api/playback/progress/api/playback/progress/batch/api/playback/progress/delete 写入/清理本地进度;App 也可从用户配置的远端 API 拉取批量记录合并到本地历史。完整协议见 webhome-devkit/docs/应用完整开发文档.md 的“观影记录同步”章节。
  • 登录态学习:用户手动开启后学习 Cookie、Token、接口 Jar 网盘登录文件等登录态路径,待确认项可在管理页查看/编辑,并可参与一键同步。
  • APP 代理:配置代理地址和域名匹配规则,可按当前站点自动建议代理域名,用于改善特定站点、接口或播放链路的网络访问。
  • 调试日志:本机和局域网日志查看入口,便于排查播放、代理、站源和 WebHome 相关问题。

以上能力集中在设置页的"增强功能"入口,手机端和电视端均为独立设置页。

效果演示

home.mp4

演示视频对应的站点配置(Nostr/TMDB 推荐首页):

{
  "key": "Nostr",
  "name": "Nostr推荐",
  "type": 3,
  "api": "csp_Nostr",
  "homePage": "https://www.252035.xyz/xs/tvbox/nostr.html"
}

文档

完整开发说明见 应用完整开发文档.md,包含:

  • App 配置字段(点播、解析、直播、样式)
  • Spider 开发,JS/Python Spider 运行时
  • 本地 HTTP 服务端点总览
  • WebHome SDK 全部方法的参数和返回值
  • 透明背景、电视端遥控器 UX、性能最佳实践
  • 网盘检测 API 和站点健康排序
  • 观影记录同步、Webhook 上报和爬虫 HTTP API
  • 管理页面和局域网 HTTP 能力
  • 远程托管部署、绑定流程和能力边界
  • WebHome 扩展脚本开发
  • 登录态学习与同步
  • PanSou 集成、Nostr 首页实现要点
  • 隐藏功能和使用技巧
  • Android Intent、DLNA、MediaSession
  • CORS、Cookie 和网络策略

WebHome 主页、扩展、模板、示例和 AI skills 统一放在 webhome-devkit/ (附 独立CNB仓库):

配置文件和示例 HTML 放在同一服务器目录时,homePage 可直接写相对路径。

社区内容:

构建

本节按“新机器 clone 后直接复制命令打包”为目标维护。当前分支使用较新的 Android/Gradle/Media3/MPV native 组合,环境不满足时最常见的失败点是 JDK、Android SDK 37、NDK 和依赖下载网络。

环境要求

  • JDK 21。不要使用 JDK 17;当前 sourceCompatibility / targetCompatibility 均为 Java 21。
  • Android SDK Platform 37 和 Build Tools 37.0.0。当前 compileSdk=37minSdk=24targetSdk=28
  • Android NDK 28.2.13676358。普通 Gradle 打包会直接使用仓库内置 libplayer.so,不需要每次重编 MPV JNI;修改 third_party/mpv-player-jni 或 MPV native 头文件后必须安装该 NDK 并运行重建脚本。
  • 使用仓库内置 Gradle Wrapper:Gradle 9.5.1,Android Gradle Plugin 9.2.1。
  • 能访问 Maven Central、Google Maven、Gradle Plugin Portal 和 JitPack。仓库内已带定制 Media3、nextlib 和本地 AAR,但普通 Android 依赖仍需要联网下载。

macOS/Linux 可用以下命令确认版本:

java -version
bash gradlew --version

如果依赖下载需要代理,先在当前终端设置:

export https_proxy=http://127.0.0.1:7897
export http_proxy=http://127.0.0.1:7897
export all_proxy=socks5://127.0.0.1:7897

从零 clone 到打包

先安装或确认 Android SDK。Android Studio 打开项目时通常会自动生成 local.properties;命令行构建需要进入仓库根目录后手动创建。macOS 默认 SDK 路径示例:

export ANDROID_HOME="$HOME/Library/Android/sdk"

Linux 常见路径是 $HOME/Android/Sdk,Windows 使用 Android Studio 打开项目或创建 local.properties,内容类似 sdk.dir=C\:\\Users\\你的用户名\\AppData\\Local\\Android\\Sdk

如 SDK 未安装 API 37/Build Tools/NDK,可用 Android Studio SDK Manager 安装,或使用命令行工具:

"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" \
  "platform-tools" \
  "platforms;android-37.0" \
  "build-tools;37.0.0" \
  "ndk;28.2.13676358"
yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --licenses

clone 仓库后直接打 debug 包:

git clone https://github.com/fish2018/webhtv.git
cd webhtv
printf 'sdk.dir=%s\n' "$ANDROID_HOME" > local.properties
bash gradlew :app:assembleMobileArm64_v8aDebug :app:assembleLeanbackArmeabi_v7aDebug :app:assembleLeanbackArm64_v8aDebug

如果构建指定开发分支,在 clone 后切换到对应分支再打包:

git fetch origin
git switch feature/android-mpv-player
bash gradlew clean
bash gradlew :app:assembleMobileArm64_v8aDebug

已 clone 仓库更新当前分支:

git fetch origin
git pull --ff-only
bash gradlew clean

常用本地打包命令

debug 包适合本地安装测试,构建速度更快:

bash gradlew :app:assembleMobileArm64_v8aDebug
bash gradlew :app:assembleMobileArmeabi_v7aDebug
bash gradlew :app:assembleLeanbackArm64_v8aDebug
bash gradlew :app:assembleLeanbackArmeabi_v7aDebug

release 包适合分发测试或正式发布:

bash gradlew :app:assembleMobileArm64_v8aRelease
bash gradlew :app:assembleMobileArmeabi_v7aRelease
bash gradlew :app:assembleLeanbackArm64_v8aRelease
bash gradlew :app:assembleLeanbackArmeabi_v7aRelease

也可以一次打常用三包:手机 64 位、电视 32 位、电视 64 位。

bash gradlew :app:assembleMobileArm64_v8aDebug :app:assembleLeanbackArmeabi_v7aDebug :app:assembleLeanbackArm64_v8aDebug

MPV native/JNI 重建

普通打包不需要执行本节命令,Gradle 会把仓库内已提交的 MPV assets 和 libplayer.so 打进 APK。只有修改以下内容时才需要先重建 MPV JNI:

  • third_party/mpv-player-jni/src/**
  • third_party/mpv-player-jni/include/mpv/client.h
  • app/src/arm64_v8a/assets/mpv-libs/arm64-v8a/app/src/armeabi_v7a/assets/mpv-libs/armeabi-v7a/ 里的 MPV 相关 .so

当前 libmpv.so/FFmpeg assets 已使用启用 Vulkan 的 Android 构建;libplayer.so 仍由本仓库 third_party/mpv-player-jni 构建,用于保留 END_FILE reason/error 等本地桥接能力。替换外部 MPV native 包时,必须继续把 FFmpeg 依赖名从 libav*/libsw* 等长改为 libmv*/libmw*,否则会和 nextlib-media3ext 内置 FFmpeg 发生 Android linker 复用冲突。

重建命令:

export ANDROID_HOME="$HOME/Library/Android/sdk"
export ANDROID_NDK_HOME="$ANDROID_HOME/ndk/28.2.13676358"
scripts/build_mpv_player_jni.sh
bash gradlew :app:assembleMobileArm64_v8aDebug

脚本会替换:

app/src/arm64_v8a/assets/mpv-libs/arm64-v8a/libplayer.so
app/src/armeabi_v7a/assets/mpv-libs/armeabi-v7a/libplayer.so

APK 输出路径

debug 原始输出:

app/build/outputs/apk/mobileArm64_v8a/debug/app-mobile-arm64_v8a-debug.apk
app/build/outputs/apk/mobileArmeabi_v7a/debug/app-mobile-armeabi_v7a-debug.apk
app/build/outputs/apk/leanbackArm64_v8a/debug/app-leanback-arm64_v8a-debug.apk
app/build/outputs/apk/leanbackArmeabi_v7a/debug/app-leanback-armeabi_v7a-debug.apk

release 构建完成后会自动复制到 Release/apk/,Gradle 原始输出仍在 app/build/outputs/apk/<flavor>/release/

Release/apk/mobile-arm64_v8a.apk
Release/apk/mobile-armeabi_v7a.apk
Release/apk/leanback-arm64_v8a.apk
Release/apk/leanback-armeabi_v7a.apk

安装到已连接设备:

adb devices
adb install -r app/build/outputs/apk/mobileArm64_v8a/debug/app-mobile-arm64_v8a-debug.apk

GitHub 手动发布

仓库内置 .github/workflows/android-release.yml,只支持在 GitHub Actions 页面手动触发,不会在每次 push 代码时自动打包。默认 tag 会从 app/build.gradle 读取当前 versionName:稳定版生成 v<versionName>-yyyyMMddHHmm;在 fongmi-sync 分支选择 auto 通道时生成测试版 v<versionName>-beta-yyyyMMddHHmm,APK/JSON 文件名同步追加 -beta

工作流会构建 4 个 release APK,生成同名更新清单 JSON 并发布到 GitHub Release。启用 CNB 同步后,大 APK 会上传到同 tag 的 CNB Release 附件(单文件支持 64GB),代码仓库的 apk/ 目录只保存小型 JSON 清单,避免超过 100MB 时 Git 下载返回 413。正式发布前建议在 GitHub Secrets 配置:

RELEASE_KEYSTORE_BASE64  # release keystore 的 base64 内容
RELEASE_KEY_ALIAS        # key alias
RELEASE_STORE_PASSWORD   # store password,key password 复用该值
RELEASE_KEY_PASSWORD     # 可选,key password 与 store password 不同时配置
CNB_TOKEN                # CNB 访问令牌,需要 repo-contents 读写权限

CNB 默认同步到 https://cnb.cool/fish2018/webhtv.git,仓库标识为 fish2018/webhtv。如需修改,在 GitHub 仓库变量中同时设置 CNB_REPO_URLCNB_REPO_SLUG。更新 JSON 内的 APK 地址使用固定版本直链 https://cnb.cool/<slug>/-/releases/download/<tag>/<apk>,公开仓库可匿名下载并支持 Range/断点续传。

GitHub Actions 正式发布必须配置签名 secrets,否则会直接失败,避免使用 runner 临时 debug key 生成无法覆盖安装的 APK。

如果 CNB 同步失败,不需要重新打包。修正 CNB_TOKEN 或网络问题后,在 GitHub Actions 手动运行 CNB Release Sync,填写已有 release_tag 即可把该 GitHub Release 的 APK 上传到 CNB Release 附件,并把改写为 CNB 绝对下载地址的 JSON 补同步到代码仓库;release_tag 留空时同步最新 release。

签名

默认不需要配置 release 签名文件。未配置签名时,release 包使用 debug signing 兜底,方便 clone 后直接打包测试。

如需正式签名,在根目录的 local.properties 增加以下字段;keyPassword 可省略,省略时复用 storePassword

sdk.dir=/path/to/android/sdk
storeFile=/path/to/keystore.jks
keyAlias=your_alias
storePassword=your_password
keyPassword=your_key_password

播放层依赖

  • app/libs/*.aar:内置 Hook、TVBus、Thunder、ForceTech、JianPian 播放能力依赖。
  • third_party/maven:已生成的 androidx.media3:*:1.11.0-alpha01-fongmi 本地 Maven 产物,以及定制 nextlib-media3ext
  • third_party/media-lock.json:记录 Media3 锁定版本,升级 Media3 时使用(配套脚本 scripts/build_media_deps.sh)。
  • third_party/mpv-player-jni:MPV libplayer.so JNI 桥接源码,修改后用 scripts/build_mpv_player_jni.sh 重建。
  • app/src/*/assets/mpv-libs/*:随 APK 打包的 MPV native 库和 JNI 桥接库。
  • nextlib-media3ext:io.github.anilbeesetti:nextlib-media3ext:1.10.0-0.12.1-fongmi-softload,提供 FFmpeg renderer。

settings.gradle 中的依赖顺序是仓库本地 third_party/maven、Maven Central、Google Maven、app/libs 和 JitPack。app/build.gradle 会强制所有 androidx.media3 依赖使用 1.11.0-alpha01-fongmi,避免传递依赖拉回官方版本。

常见构建失败

  • Unsupported class file major versioninvalid source release: 21:当前终端没有使用 JDK 21。
  • SDK location not found:缺少 local.properties,或 sdk.dir 指向错误。
  • failed to find target with hash string 'android-37':未安装 Android SDK Platform 37。
  • NDK clang++ not found under .../ndk/28.2.13676358:未安装 NDK 28.2.13676358,或 ANDROID_NDK_HOME 指向错误。
  • Missing MPV asset directory:MPV assets 缺失或 ABI 目录名不匹配,确认 app/src/arm64_v8a/assets/mpv-libs/arm64-v8aapp/src/armeabi_v7a/assets/mpv-libs/armeabi-v7a 存在。
  • 运行后提示 dlopen failedlibplayer.solibmpv.so 相关错误:先确认 MPV .so 是否随对应 ABI 打包;如果改过 JNI 或 MPV native 库,重新执行 scripts/build_mpv_player_jni.sh 后再打包。
  • Could not resolve ...:依赖下载失败,检查网络或设置代理后重新执行 Gradle。
  • Permission denied: ./gradlew:本仓库文档统一使用 bash gradlew,不依赖可执行位。

目录结构

app/          Android 主应用(mobile/leanback 双 flavor)
catvod/       CatVod 抽象层、Spider 接口、网络和代理工具
quickjs/      JavaScript Spider 运行时
chaquo/       Python Spider 运行时
webhome-devkit/ WebHome 开发套件(文档、主页/扩展示例、模板、AI skills)
scripts/      Media3 和 MPV JNI 本地依赖构建脚本
third_party/  Media3 本地 Maven、nextlib 源码、MPV JNI 源码和版本锁定文件
Release/      release 构建的 APK 输出
other/        Logo 图片和辅助工具

上游基线

本项目二开起始于原版影视 commit bec0f1d2fc22f394ba05f8e63a9ef2ba7ecbba0e,当前已同步合并到原版影视 commit 5fdff00a602dc56e8ba756174daef20edab024f2

免费声明与社区分享

WebHomeTV 是基于开源生态二次开发的技术学习与研究项目,软件本体完全免费,不提供任何付费服务、影视内容、直播源、接口源、资源存储或内容分发能力。

本软件仅供技术学习、研究和个人测试使用,请在下载、安装或试用后 24 小时内自行卸载。继续使用本软件所产生的一切行为及后果,由使用者自行承担。

本软件不内置、不售卖、不传播任何影视资源,不对用户自行添加的接口、站源、插件、脚本、链接、网盘资源或第三方服务内容负责。使用者应遵守所在地法律法规,尊重版权方和内容提供方的合法权益,不得将本软件用于任何侵权、盗版、传播非法内容或其他违法违规用途。

严禁任何个人或组织以本软件名义进行售卖、引流、收费维护、会员服务、广告变现、盒子预装、电视盒子捆绑销售或其他任何形式的获益行为。对于将本软件内置于电视盒子、机顶盒、付费套餐或商业服务中进行销售、推广的行为,项目方明确反对并予以谴责。

友情链接

Linux.do

About

WebHomeTV 基于FongMi二次开发,增强了 WebHome 自定义首页、App Native SDK、网盘链接检测 和 Nostr推荐首页。 这个项目的核心目标是让 CSP 站点首页可以变成一个真正可开发的网页应用:开发者可以用 HTML/CSS/JavaScript 定制首页,再通过 App 暴露的 Native 能力完成搜索、播放、跨域请求、资源代理、最近观看、网盘检测和状态同步。

Resources

License

Stars

854 stars

Watchers

6 watching

Forks

Contributors