Skip to content

Data Sources

bestZwei edited this page Sep 9, 2026 · 5 revisions

数据源

数据源是上位概念,包含两类相互独立的体系:

类别 说明 管理入口
点播源 Apple CMS 采集站 API,决定"能搜到什么"(本文主体) 设置 → 点播源
直播源 M3U 播放列表,用于 /live 页看电视 设置 → 直播源(见 Live-IPTV

两者数据模型独立,但可以用一份订阅 JSON 同时下发(见数据源订阅 / 分享)。

LibreTV 采用空壳设计:不内置任何采集站与频道源,由部署者/用户自行添加,避免内置源失效与合规风险。

首页的推荐源(豆瓣 / Bangumi / 影视榜单)是另一套独立配置,只决定首页展示什么,与点播源无关,见 Recommendations

点播源有三种来源:

  • 部署者预置:通过 DEFAULT_SOURCES 环境变量下发(JSON 数组),所有用户开箱即搜,详见配置文档
  • 用户自建:设置 → 点播源 → 「+ 添加 API」手动添加,保存在浏览器 localStorage;
  • 订阅导入:设置 → 订阅与配置 → 数据源订阅,一次可同时导入点播源与直播源。

支持的点播源类型

Apple CMS(苹果CMS)标准采集接口,即提供以下接口的资源站:

搜索:{api}?ac=videolist&wd={关键词}
详情:{api}?ac=videolist&ids={vod_id}

添加点播源

设置 → 点播源 → 「+ 添加 API」:

字段 必填 说明
名称 显示用名称
API 地址 形如 https://example.com/api.php/provide/vod,结尾 / 会自动去除
详情页地址 形如 https://example.com;部分源列表接口不返回播放地址,需要爬取详情页 HTML 提取 m3u8
成人标记 标记后受「成人内容过滤」开关控制

添加后默认自动勾选参与搜索。

详情页爬取(特殊源)

当标准详情接口拿不到播放地址时,服务端自动降级:

  1. 请求 {detail}/index.php/vod/detail/id/{id}.html
  2. 通用正则提取 \$https://...m3u8
  3. 若无结果,尝试非凡影视特征路径模式(/日期/哈希/index.m3u8);
  4. 去重后作为剧集列表。

服务端聚合行为

  • 所有勾选的源并行搜索,单源 8 秒超时;
  • 任一源失败不影响整体,失败源在结果区顶部以名称列出;
  • 结果按「源内去重(sourceKey+vodId)→ 名称排序(zh-CN)」合并;
  • 成人过滤在服务端执行,关键词包括:伦理片、福利、里番动漫、无码、SWAG 等。

源可用性测试

设置 → 点播源,每个源右侧的 按钮触发服务端探活:

  • 以搜索 test 的完整往返衡量:返回响应耗时(ms)与结果条数;
  • 结果以徽章内联展示(✓ 610ms 绿色 / ✗ 超时 红色);
  • 探活请求与搜索一样经过 SSRF 校验,仅支持公网 http(s) 地址。

数据源订阅 / 分享

一份订阅可同时下发点播源直播源:导出为 JSON 文件 → 托管到任意公开 URL → 他人在「设置 → 订阅与配置 → 数据源订阅」里填入该 URL 订阅。

订阅格式(LibreTV-SourceList JSON)

{
  "name": "我的源列表",
  "version": 2,
  "sources": [
    {
      "name": "示例点播源",
      "url": "https://bfzyapi.com/api.php/provide/vod",
      "detail": "https://bfzyapi.com",
      "isAdult": false
    }
  ],
  "liveSources": [
    {
      "name": "示例直播源",
      "url": "https://example.com/list.m3u",
      "epg": "https://example.com/epg.xml.gz"
    }
  ]
}

字段说明

字段 位置 类型 必填 说明
name 顶层 string 列表名称,订阅后显示在订阅条目上;缺省时显示订阅地址主机名
version 顶层 number 格式版本,当前为 2(新增 liveSources);导入端目前忽略该字段
sources 顶层 array 点播源数组,最多 100 个,超出部分截断
sources[].name string 源显示名;缺省时使用 URL 主机名
sources[].url string Apple CMS 采集接口地址(公网 http/https),结尾 / 自动去除
sources[].detail string 详情页根地址,用于列表接口拿不到播放地址的源
sources[].isAdult boolean 成人内容标记,默认 false;受「成人内容过滤」开关控制
liveSources 顶层 array 直播源数组,最多 50 个,超出部分截断
liveSources[].name string 源显示名;缺省时使用 URL 主机名
liveSources[].url string M3U 播放列表地址(http/https)
liveSources[].epg string XMLTV 节目单地址(xml / xml.gz),用于 /live 页展示节目单

兼容与限制

  • 只写 sources 的老订阅(含 version: 1)照常可用,等同于纯点播订阅;只写 liveSources 则为纯直播订阅;两者都缺时提示"订阅内容格式不正确";
  • 也接受裸数组格式 [{ "name": "...", "url": "..." }, ...](视为点播源,列表名显示为主机名);
  • url 去重(先到先得);非 http(s) 地址会被过滤;点播源另需为公网地址(内网/回环/保留地址会被静默过滤),直播源在部署者设置 LIVE_ALLOW_PRIVATE=1 时可使用内网地址;
  • 直播源的 EPG 地址同样按上述规则校验,非法时只丢弃该字段、保留整条源;
  • 订阅由服务端拉取(拉取前经过 SSRF 校验),因此订阅地址无需配置 CORS,Gist、对象存储、任意静态托管均可。

订阅行为

  • 导入:设置 → 订阅与配置 → 数据源订阅 → 填入订阅地址 → 「订阅」;点播源自动勾选(成人过滤开启时跳过成人源)、直播源自动启用,两者都带「订阅」标识;订阅条目上显示「点播 N · 直播 M」计数与上次同步时间;
  • 部署者预置订阅:通过 DEFAULT_SUBSCRIPTIONS 环境变量填入订阅链接,用户首次访问自动完成导入,超 24 小时静默刷新,失败保留旧数据下次重试,详见 Configuration · 预置数据源订阅
  • 手动同步:订阅条目上的 随时强制同步——整体替换该订阅名下的点播源与直播源(与订阅 URL 相同的手动源会被去重合并),结果以提示反馈(如"已同步 8 个点播源、3 个直播源");
  • 订阅源的管理边界:订阅源以远端列表为准——单独编辑会在下次同步时被覆盖,单独移除会在重新同步时恢复;如需调整请修改远端列表后同步,或直接删除整个订阅;
  • 删除订阅:同时移除其导入的点播源与直播源(含启用状态与最近观看记录),但保留已收藏的频道——收藏是用户主动留存的数据,不随订阅删除而清空。

分享(导出)

设置 → 订阅与配置 → 「导出数据源」:把当前全部点播源与直播源(部署者预置 + 手动添加 + 订阅导入,按 URL 去重)导出为上述格式的 JSON 文件(version: 2)。托管后即可被他人一次订阅全部导入。

点播源配置的数据流

点播源配置只保存在用户浏览器(localStorage),服务端不存储。每次搜索/详情请求会把用到的源配置随请求上传,因此:

  • 同一部署的不同用户可以有不同的点播源集合;
  • 分享播放链接时 URL 会携带 sourceUrl 参数,接收者即使未配置同名的源也能播放(见 Player)。

常见问题

Q: 添加源后搜索无结果? 用浏览器直接访问 {api}?ac=videolist&wd=test 验证是否返回 JSON。部分源校验 Referer/UA 或已停更。

Q: 搜索成功但详情提示"未找到播放资源"? 该源的播放地址可能需要详情页爬取,请补填「详情页地址」;或该影片在源内本身无 m3u8 地址。

Q: 可以批量导入吗? 可以:把点播源(必要时连同直播源)写成一份 LibreTV-SourceList JSON 并托管,在「设置 → 订阅与配置 → 数据源订阅」中填入地址即可一次导入,之后还能一键同步。旧版逗号分隔 ?urls= 的入口未移植,也可用「导出/导入配置」整机迁移。

Clone this wiki locally