“既然大家都爱白嫖,那就把源管理这件事做得像小型 CDN。”
公开源多,但配置像噩梦
Telegram、GitHub、各种论坛里有人天天分享接口,可普通用户要么不知道怎么配,要么下了一个“聚合播放器”还是得手动贴 URL。更糟糕的是,源质量参差不齐:有的带成人内容、有的晚上直接当机。没有一个“GR 管理中心”来帮忙筛选和调度,免费资源反而成了噪音。
让用户开箱就能播放
我给 ApiSourceRepository 定了三件事:
- 自动加载和初始化:无论有没有网络,都能先把内置 JSON 导入数据库;
- 动态筛选 / 开关:禁用的源不要参与搜索;
- 缓存与热更新:常用源放本地,新增源可以通过设置页导入,不需要发新版本。
简而言之:“免费资源我来管,用户只负责点播放。”
Repository 里的几件小手术
1. 启动即初始化
ApiSourceRepository.initializeDefaultSources() 会在 App 冷启动时检查数据库:没有记录就把 raw/api_sources.json 导进去。流程是 IO 线程完成,确保 UI 不被拖慢。
suspend fun initializeDefaultSources() = withContext(Dispatchers.IO) {
if (dao.countSources() == 0) {
val json = context.resources.openRawResource(R.raw.api_sources).bufferedReader().use { it.readText() }
val defaults = parseJson(json)
dao.insert(defaults)
}
}
2. 成人过滤与开关
AppSettings 里有 adultContentFilterEnabled。每次调用 getEnabledSources() 时都会查一遍设置,如果开启过滤,就直接 filter { !it.isAdult }。这样用户只要在设置里点一下,不用动数据库。禁用的源同理,在 VideoRepository.searchVideos() 时只会请求启用且符合策略的源。
3. 缓存热点 & 热更新
- 缓存:常用源会被写到
SearchResultCache(按照关键词),详情数据写到VideoDetailCache。即使源端出问题,用户依然可以看到旧结果。 - 热更新:设置页可以导入自定义 JSON,
ApiSourceRepository会统一校验字段、补齐默认值,再插入数据库。用户不用等发版,只要手动添加即可。
4. 夜间调度
并发搜索的逻辑也依赖 ApiSourceRepository:它提供的源列表已经根据启用状态、过滤条件排序,VideoRepository 再对这些源发并发请求。一旦其中某个源挂掉,就不会因为“坏源”拖死整个流程。
“白嫖体验”终于像样了
- 开箱可用:第一次启动就能看到几十个可用源,不用写配置文件。
- 过滤生效:成人过滤、禁用源这些操作即刻生效,用户不必再翻数据库。
- 夜间抗压:并发搜索 + 缓存让晚高峰也能及时反馈组别,卡顿体验大幅下降。
- 迭代轻量:热更新机制让我不必频繁发版,只要提供新的 JSON 配置即可。
想和你讨论的三个问题
- 你觉得“源过滤”应该多严格?要按稳定性评分?
- 如果把源列表开放给用户编辑,你希望有哪些安全阈值(比如最大请求数、超时时间)?
- 下一步更期待“自动测速排序”,还是“用户自定义权重”?
欢迎在评论区分享你的配置心得或踩过的坑,尤其是那些让你放弃某个播放器的瞬间。我们一起把“白嫖体验”打磨得更稳一点。