苹果 CMS V10 影视站点的 Android 客户端,配套一个 PHP 插件提供接口层。
本项目只提供技术实现,不提供任何视频内容、内容源或可运营的服务端。 使用前请先读 DISCLAIMER.md。
两个可以独立部署、通过固定契约通信的部分:
| 部分 | 技术栈 | 位置 | 规模 |
|---|---|---|---|
| Android 客户端 | Kotlin / Compose / Media3 / Retrofit | app/ core/ feature/ |
约 14,700 行 Kotlin,15 个 Gradle 模块 |
| 苹果 CMS 插件 | PHP 8.1+ / ThinkPHP 5.0.24 | server/starveilapi/ |
约 11,200 行 PHP,26 张 cuican_* 表 |
插件不改苹果 CMS 核心文件,全部数据表独立前缀,随核心升级不受影响。客户端按 {code,msg,data} 响应壳调用 /icciu_api.php/v1.* 接口。
这一点比功能列表重要,因为它决定你拿过去能做什么、不能做什么:
- 不含任何影片数据、分类数据、播放地址。 内容由你自己的苹果 CMS 内容库提供。
- 不含采集功能。 插件代码里没有任何抓取第三方站点的逻辑(唯一的对外请求是拉 m3u / txt 直播列表和发短信验证码)。采集是苹果 CMS V10 自带的后台功能,与本仓库无关。
- 不含任何服务端地址。 客户端要连哪个站,由构建时的配置决定,仓库里没有内置默认域名。
- 不含任何密钥。 支付商户号、短信网关、广告 SDK key、SSV 密钥全部走后台配置或环境变量。
- 不含广告位。 广告平台账号、广告位 ID 需要你自己申请并在后台填写。
- 不含用户数据。 没有任何种子账号、测试凭据或导出数据。
如果你打算接手或二次开发,这几条不读会踩坑:
-
双端同时演进,契约是唯一纽带。 客户端与插件不在同一个进程里,也没有共享 schema。改字段名、改响应结构必须两端同时改,否则运行时静默降级(
@JsonNames只覆盖少数字段)。接口契约见server/starveilapi/README.md§3 与docs/api-usage.md。 -
apikey/keytime不是安全机制。 后端不校验这两个参数,客户端仍按契约携带只是为了兼容其它实现。真正的鉴权靠服务端 cookie 会话与Kernel::ROUTES路由白名单。不要把它当成防刷/防盗链手段。 -
插件跑在 ThinkPHP 5.0.24 上,这是一个 2017 年的内核。
think\Error::appError会把超过error_reporting阈值的警告直接抛成ErrorException——PHP 8.2+ 的动态属性弃用会让插件白页而不是写日志。升级 PHP 前必须屏蔽E_DEPRECATED。 -
count()和select()必须用两个独立构建的 Query。 ThinkPHP 5.0 的clone一个 Query 再count()会污染参数绑定,之后的主查询必报Invalid parameter number。分页统计要抽个 helper 重建对象。 -
mac_user.group_id是 varchar 逗号串("1,3"),不是整型。会员判定必须按逗号列表处理,(int)强转会漏。 -
后台设置项互相影响。
trysee_status、member_enabled、bottom_tabs之类加开关时,要同步考虑底栏与 Tab 的自动隐藏和恢复;多选类字段必须在Actions.php的SELECT_SETTINGS/MULTI_SETTINGS里登记,否则会渲染成文本框、存成空串、客户端回落到默认值——"后台选了没生效"多半是这个。 -
客户端的配置有进程内缓存(
DefaultStartupRepository.cachedDto)。改完后台必须强杀进程重启才生效,切后台再回来不会重拉。
需要 JDK 17、Android Studio 最新稳定版。
本项目不发布预编译 APK。 站点地址在编译期注入,每个人的后端不一样,所以必须自己打包——release workflow 也是因此不做。打包方法见下。
git clone <repo>
cd starveil-android
./gradlew :app:assembleDebug构建前必须配置你的站点地址(见下面的已知阻塞项)。提交前跑闸门:
./gradlew check它聚合编译、单元测试、Android Lint、detekt 和四道规范闸门(文件行数、颜色令牌、依赖方向、安全基线)。Windows 上内存吃紧可加 --max-workers=1。
需要 PHP 8.1+、MySQL 5.7+(utf8mb4,8.0 未实测)、苹果 CMS V10。
server/starveilapi/整个放进站点addons/starveilapi/server/icciu_api.php放到站点根(与index.php同级)- 后台「应用 → 插件」启用,自动建 26 张表、写默认配置、生成会话密钥
- 配置项、路由、Nginx/Apache 的
PATH_INFO重写、后台菜单挂载、升级与卸载方式,全部在server/starveilapi/README.md
插件目录名必须是 starveilapi,与 info.ini 的 name 和类名 Starveilapi 三者一致,否则自动加载找不到类。
这些是真实的未完成项,不要以为克隆下来就能上线:
- 站点地址靠
local.properties的starveil.apiHost注入(app/build.gradle.kts的resValue)。没配这个键时用占位地址https://api.example.com,构建能过但连不上任何后端——第一次构建前先填自己的域名。 apikey未在服务端校验,见上文特殊性第 2 条。- 支付只实测了易支付(Epay),微信/支付宝原生参数未接。
- 数据库只在 MySQL 5.7.40 上跑过,8.0 未测;也没有压测与并发下单测试。
- 短剧广告 SSV 接口已就绪,但客户端
AdGateway仍是 Noop,需要你接入真实广告平台后才能真正解锁。
- Telegram 群组:https://t.me/+vLgkzhHZ9c44YzA1
- 问题反馈:GitHub Issues
除上面这个链接外,本项目没有其它 Telegram 群、微信群或 QQ 群。 任何以本项目名义建立的其它群组都与作者无关。
| 文件 | 内容 |
|---|---|
| DISCLAIMER.md | 使用限制与免责声明,部署前必读 |
| AGENTS.md | 工程硬约束(模块依赖、文件规模、颜色令牌、禁止清单) |
| docs/api-usage.md | 客户端接口清单:插件接口 / macCMS 原生接口 / 未接的路径 |
| docs/security.md | 安全基线,含必须服务端整改的 6 项 |
| docs/testing.md | 测试策略 |
| docs/design-system.md | 设计令牌 |
| docs/code-standards.md | 代码规范 |
| server/starveilapi/README.md | 插件安装、接口清单、表结构、部署 |
本项目以 PolyForm Noncommercial License 1.0.0 发布。
- 允许:任何非商业目的的使用、修改与分发,包括个人学习、研究、实验、业余项目,以及慈善机构、教育机构、公共研究机构、公共安全与卫生机构、环保组织、政府机构的使用(不论其经费来源)。
- 需要单独授权:任何商业用途。包括但不限于以本项目或其修改版对外提供付费、带广告或代运营的服务,销售,随商业产品分发,企业内部经营性使用。
- 必须保留:分发时须一并提供本许可证全文或其 URL,以及
Required Notice版权行。见 LICENSE 的 Notices 一节。
这不是 OSI 认证的开源许可证,属于 source-available(源码公开)。 GitHub 等平台的 "Open Source" 标签不适用,请按 "Source Available" 描述本项目。
商业授权、定制与技术支持:通过仓库 issue 联系,标题注明 [commercial]。
许可证只约束代码本身的著作权,不构成对任何内容、数据或运营行为的授权,用途与责任边界见 DISCLAIMER.md。
完整条款见 DISCLAIMER.md。摘要不替代全文。
- 本项目是技术工具,不附带任何内容授权。用它搭站播放什么,由你决定,也由你负责。
- 采集他人影视内容并公开传播,属于实施信息网络传播行为,未获权利人许可即侵权,与是否使用本项目无关。本项目不提供采集功能,也不为这类用途提供支持。
- 在中国大陆以影视点播对外提供服务,需要 ICP 备案、《信息网络传播视听节目许可证》等资质。这些资质对个人与普通民营主体基本不可得,请先确认自己具备再谈技术部署。
- 免责声明不能免除使用者自身的侵权责任。它划清的是作者与使用者之间的责任边界,不是使用者的护身符。
- 作者不对任何人使用本项目的后果承担责任,也不对任何特定用途作出适用性担保。
如你代表权利人认为本仓库内容侵犯权益,见 DISCLAIMER.md 末尾的联系方式。
