一个白嫖型播放器的配置心法:ApiSourceRepository 里的秘密

79 阅读3分钟

“既然大家都爱白嫖,那就把源管理这件事做得像小型 CDN。”

公开源多,但配置像噩梦

Telegram、GitHub、各种论坛里有人天天分享接口,可普通用户要么不知道怎么配,要么下了一个“聚合播放器”还是得手动贴 URL。更糟糕的是,源质量参差不齐:有的带成人内容、有的晚上直接当机。没有一个“GR 管理中心”来帮忙筛选和调度,免费资源反而成了噪音。


让用户开箱就能播放

我给 ApiSourceRepository 定了三件事:

  1. 自动加载和初始化:无论有没有网络,都能先把内置 JSON 导入数据库;
  2. 动态筛选 / 开关:禁用的源不要参与搜索;
  3. 缓存与热更新:常用源放本地,新增源可以通过设置页导入,不需要发新版本。

简而言之:“免费资源我来管,用户只负责点播放。”


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 配置即可。

想和你讨论的三个问题

  1. 你觉得“源过滤”应该多严格?要按稳定性评分?
  2. 如果把源列表开放给用户编辑,你希望有哪些安全阈值(比如最大请求数、超时时间)?
  3. 下一步更期待“自动测速排序”,还是“用户自定义权重”?

欢迎在评论区分享你的配置心得或踩过的坑,尤其是那些让你放弃某个播放器的瞬间。我们一起把“白嫖体验”打磨得更稳一点。