LibreSpark/LibreTVPublic

一分钟搭建影视站,支持Docker等部署方式

AI summary: Next.js and TypeScript-based free online video aggregation platform using ArtPlayer and hls.js.

Stars
20.7K
+1.1K today
Forks
29.7K
Watchers
14
Open issues
3
Open PRs
2
Contributors
~30
Commits
848
Branches
4
Views (30d)
1

TypeScriptAGPL-3.0Created Apr 6, 2025Last push 2d ago+1.9K stars this week+1.9K this month

Quick answers

What is LibreTV?
Next.js and TypeScript-based free online video aggregation platform using ArtPlayer and hls.js.
What does LibreTV do?
LibreTV is an open-source video aggregation and viewing platform. It utilizes a Next.js App Router architecture alongside TypeScript and Tailwind CSS for the frontend. The system employs ArtPlayer and hls.js as the core playback engine to support various streaming formats. It aggregates search results from multiple server-side sources and merges identically named resources into a single interface. The application also supports live IPTV subscriptions and parsing, enabling users to browse and play live channels natively.
Who is LibreTV for?
Developers and home server enthusiasts looking for a customizable video aggregation platform. Users should be familiar with Next.js, Docker, and self-hosting web applications.
How do I get started with LibreTV?
docker compose pull && docker compose up -d
How popular is LibreTV on GitHub?
LibreSpark/LibreTV has 20,723 stars and 29,657 forks on GitHub, and gained 1,915 stars in the last 7 days.
What license does LibreTV use?
LibreSpark/LibreTV is released under the AGPL-3.0 license.

Star history

since Oct 16, 2026
010K20KOct 2026Oct 2026Oct 2026Oct 2026
20.7K stars as of Oct 21, 2026. Measured daily since Oct 16, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepOctMonWedFri2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 0 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 0 commits2026-08-31: 9 commits2026-09-01: 0 commits2026-09-02: 19 commits2026-09-03: 2 commits2026-09-04: 0 commits2026-09-05: 4 commits2026-09-06: 20 commits2026-09-07: 13 commits2026-09-08: 1 commit2026-09-09: 5 commits2026-09-10: 2 commits2026-09-11: 8 commits2026-09-12: 8 commits2026-09-13: 5 commits2026-09-14: 6 commits2026-09-15: 0 commits2026-09-16: 3 commits2026-09-17: 2 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 0 commits2026-09-22: 2 commits2026-09-23: 0 commits2026-09-24: 9 commits2026-09-25: 6 commits2026-09-26: 17 commits2026-09-27: 6 commits2026-09-28: 13 commits2026-09-29: 21 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 8 commits2026-10-03: 0 commits2026-10-04: 0 commits2026-10-05: 0 commits2026-10-06: 0 commits2026-10-07: 0 commits2026-10-08: 0 commits2026-10-09: 0 commits2026-10-10: 0 commits2026-10-11: 0 commits2026-10-12: 0 commits2026-10-13: 0 commits2026-10-14: 0 commits2026-10-15: 0 commits2026-10-16: 0 commits2026-10-17: 0 commits
189 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Widely adopted

    20,723 stars

  • Rising fast

    +1,915 stars this week

  • Continuous integration

    Automated checks passing

What LibreTV does

LibreTV is an open-source video aggregation and viewing platform. It utilizes a Next.js App Router architecture alongside TypeScript and Tailwind CSS for the frontend. The system employs ArtPlayer and hls.js as the core playback engine to support various streaming formats. It aggregates search results from multiple server-side sources and merges identically named resources into a single interface. The application also supports live IPTV subscriptions and parsing, enabling users to browse and play live channels natively.

Developers and home server enthusiasts looking for a customizable video aggregation platform. Users should be familiar with Next.js, Docker, and self-hosting web applications.

  • Aggregation search: Performs parallel searches across multiple server-side collection stations.
  • Cross-origin merging: Combines identically named videos from different sources into a single card for easy comparison.
  • HLS playback: Integrates ArtPlayer and hls.js to offer features like ad segment filtering, auto-play, and playback speed control.
  • Live IPTV: Parses M3U subscriptions to browse, search, and play live channels using HLS or HTTP-FLV.
  • Progress synchronization: Stores playback progress and history locally via IndexedDB for precise resumption.
  • Source testing: Provides tools to verify the health of on-demand and live sources, automatically disabling failing ones.

Where teams use it

Deploy video platform

Deploy a free online video aggregation platform with built-in search and playback capabilities.

Manage IPTV subscriptions

Organize and watch live IPTV channels by importing M3U subscriptions and XMLTV EPG data.

Compare video sources

Search for specific media across multiple integrated sources to find the best available stream.

Host local media server

Run a self-hosted media server via Docker to manage and stream content securely over HTTPS.

Getting started: docker compose pull && docker compose up -d

README

main branch

LibreTV

LibreTV Next.js 迁移版:免费在线视频聚合搜索与观看平台。基于 Next.js 15(App Router)+ TypeScript + Tailwind CSS,播放内核为 ArtPlayer + hls.js,支持亮暗双主题。

🏠 官网:LibreTV 官网

🌐 演示站:tv.bagiinlink.eu.org(访问密码:libretv)

📖 完整文档:文档首页 · 架构 · 部署 · 配置 · 数据源 · 直播 / IPTV · 首页推荐 · 播放器 · 代理与安全 · FAQ

LibreSpark%2FLibreTV | Trendshift LibreSpark%2FLibreTV | Trendshift

核心特性

  • 聚合搜索:多采集站服务端并行搜索
  • 跨源同名聚合:同名影片合并为一张卡片,展开即可比较和选择各来源
  • HLS 播放:ArtPlayer + hls.js,广告分片过滤、自动连播、倍速、快捷键、移动端长按 3 倍速
  • 直播 / IPTV:M3U 订阅解析,/live 页面按分组浏览、搜索频道并站内播放(HLS + HTTP-FLV),支持 XMLTV 节目单(EPG)与频道收藏;直播流经专用长连接代理(/api/live/stream)转发
  • 进度同步:播放进度与观看历史存于本机 IndexedDB,精确到秒的续播
  • 换源测速:跨源搜索同名资源并测速排序,一键切换保留集数位置
  • 源测试与订阅:一键探活点播源与直播源(支持批量测活);搜索时自动记录各源健康度,连续失败的源按阶梯时长自动停用(30 分钟 → 24 小时 → 长期),可一键恢复;订阅远程源列表(一份 LibreTV-SourceList JSON 可同时下发点播源与直播源,也可直接填 TVBOX 配置地址,自动导入其中可直接使用的接口),可导出分享
  • 首页推荐:豆瓣(电影/剧集分类浏览)、Bangumi 新番放送表或影视榜单(豆瓣周榜 + 百度热播,经 60s API),设置中切换;均服务端直连 + 缓存,Bangumi/榜单免 key 免配置(60S_API_BASE 可指向自部署 60s 实例)
  • PWA:可安装到桌面 / 主屏幕,亮暗双主题无首屏闪烁

部署

Docker(推荐)

# 在 .env 中设置 PASSWORD
echo "PASSWORD=your-password" > .env

# 方式一:拉取发布镜像(零构建)
docker compose pull && docker compose up -d

# 方式二:源码构建
docker compose up -d --build

Docker Compose

services:
  libretv:
    image: ghcr.io/librespark/libretv:latest
    container_name: libretv
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      - PASSWORD=change-me   # 必填:访问密码,务必修改
      # - PROXY_SECRET=your-secret          # 会话/代理签名密钥,多实例部署建议设置
      # - DEFAULT_SOURCES=[{"name":"示例源","url":"https://example.com/api.php/provide/vod"}]
      # - DEFAULT_LIVE_SOURCES=[{"name":"示例直播源","url":"https://example.com/list.m3u"}]
      # - DEFAULT_SUBSCRIPTIONS=["https://example.com/sources.json"]  # 预置订阅,自动导入点播源+直播源
      # - DEFAULT_RECOMMEND_SOURCE=douban  # 首页推荐数据源默认值(douban/bangumi/hot-list),仅对未主动选择过的用户生效
      # - LIVE_ALLOW_PRIVATE=1              # 自建内网 IPTV 源时开启

其余可选变量见下方环境变量表;仓库内的 docker-compose.yml 含完整注释版本(含 build: . 源码构建分支)。

docker compose pull && docker compose up -d

⚠️ 生产部署必须通过 HTTPS 访问(localhost 除外):生产模式下会话 cookie 带 Secure 标记,浏览器只在 HTTPS(或 localhost)下保存它。因此用 http://服务器IP:端口 访问时,会出现"密码正确却无法登录"的现象——登录请求实际成功,但 cookie 被浏览器丢弃。请通过反向代理(Nginx / Caddy / Traefik)或 Cloudflare 等为站点套上 TLS 后再对外提供服务;本地开发用 localhost 不受影响。

镜像发布在 GHCR 与 Docker Hub:ghcr.io/librespark/libretv 与 docker.io/bestzwei/libretv (latest / 主.次 / 完整版本号三个 tag,linux/amd64 与 linux/arm64 双架构, 两个 registry 的镜像 digest 一致)。需要固定版本时在 .env 中设置 LIBRETV_IMAGE=ghcr.io/librespark/libretv:2.0.1。

版本号以 package.json 为单一来源,部署后可用 /api/status 返回的 version 字段核对。详见部署文档。

手动运行

npm install
PASSWORD=your-password npm run build
PASSWORD=your-password npm start   # 监听 8080

环境变量

变量 必填 说明
PASSWORD 是 访问密码;未设置时站点会提示管理员配置
PROXY_SECRET 否 会话/代理签名密钥;不设置时从 PASSWORD 派生(多实例部署建议显式设置)
DEFAULT_SOURCES 否 预置采集站(JSON 数组),用户端自动出现且默认勾选,详见配置文档
REQUEST_TIMEOUT 否 代理上游请求超时(毫秒),默认 8000
MAX_RETRIES 否 代理请求重试次数,默认 1
SEARCH_MAX_PAGES 否 每个搜索源最多抓取的页数(1-50,默认 5)。第一页会读取源站 pagecount,实际页数 = min(源站总页数,该值);页间并行请求,单页失败只丢该页
SEARCH_SOURCE_TIMEOUT_MS 否 单个搜索源的总死线(毫秒,3s-60s,默认 10000):该源所有分页请求须在时限内完成,到点中断并将其标记为「超时」;健康度自动停用也以此为超时判定依据
USER_AGENT 否 代理请求使用的 UA(豆瓣封面防盗链等场景),默认 Chrome UA
FALLBACK_CORS_PROXY 否 豆瓣推荐数据直连被拒时降级使用的 CORS 代理地址
COOKIE_SECURE 否 显式覆盖会话 cookie 的 Secure 标记(true / false);默认按请求协议自动推导。反向代理未正确传递 x-forwarded-proto 导致 HTTPS 下登录失效时,设为 true 可解
60S_API_BASE 否 影视榜单推荐源(60s API)实例地址,默认 https://60s.crystelf.top;有限流,高频使用可自部署
DEFAULT_LIVE_SOURCES 否 预置直播源(M3U 订阅),JSON 数组:[{"name":"源名","url":"https://.../list.m3u","epg":"https://.../epg.xml.gz"}],epg 为可选的 XMLTV 节目单地址
DEFAULT_SUBSCRIPTIONS 否 预置数据源订阅(LibreTV-SourceList JSON 链接,也接受 TVBOX 配置地址),JSON 数组:["https://.../sources.json", {"url":"https://.../list.json","name":"名称"}]。首次访问自动导入点播源与直播源,之后每 24h 静默刷新;用户删除后不再自动加回
DEFAULT_RECOMMEND_SOURCE 否 首页推荐数据源的默认值(douban / bangumi / hot-list,出厂默认 hot-list);仅对未在设置中主动选择过的用户生效,用户的选择始终优先
LIVE_ALLOW_PRIVATE 否 设为 1 时允许直播流代理访问内网/保留地址(自建 IPTV 场景),默认关闭以维持 SSRF 防护

使用说明

  1. 添加点播源:设置 → 源管理 → 点播源 → 添加 API,填入 Apple CMS 采集站地址(如 https://example.com/api.php/provide/vod),可选填详情页地址(部分源需要爬详情页提取播放地址)。
  2. 搜索:勾选点播源后输入片名;搜索通过服务端聚合,个别源失败不影响整体结果。
  3. 播放:详情弹窗选择剧集进入 /watch;支持快捷键(空格/←→/↑↓/F/Alt+←→)、移动端长按 3 倍速、自动连播、换源测速。观看/暂停时后续分片自动缓存到本地(设置可关),播放页可「下载本集」(TS/MP4)离线观看。
  4. 进度与历史:自动保存在本设备 IndexedDB,仅定位信息入库,播放时自动同步最新剧集。
  5. 配置迁移:设置 → 数据 → 配置导入导出(兼容旧版 LibreTV-Settings JSON 的历史记录迁移)。

直播 / IPTV

  1. 添加直播源:设置 → 源管理 → 直播源 → 填入 M3U/M3U8 地址(可选填 XMLTV 节目单地址),添加后自动探活并显示频道数量;也可在「源管理 → 数据源订阅」中与点播源一起订阅导入;部署者还可用 DEFAULT_LIVE_SOURCES 环境变量预置。
  2. 观看:进入「直播」页,按分组标签筛选或搜索频道,点击即播;支持 HLS(m3u8)与 HTTP-FLV 两种直播流,直连失败自动走代理通道重试。
  3. 节目单:频道带 tvg-id 且订阅配置了 EPG 地址时,展示当前/接下来节目与播放进度。
  4. 收藏与导出:频道可收藏;订阅可一键导出为标准 M3U 文件,供 PotPlayer / VLC 等外部播放器使用。

完整说明见 直播 / IPTV 文档。

⚠️ 项目不内置任何频道源,也不存储、不制作任何直播内容,仅提供第三方公开播放列表的解析与播放能力,内容的合法性由对应数据源负责。内网自建源默认被 SSRF 防护拦截,自部署者可显式设置 LIVE_ALLOW_PRIVATE=1 放行。

数据源订阅 / 分享

数据源(点播源 + 直播源)可以 导出为一份 JSON → 托管到公开 URL → 他人在「设置 → 源管理 → 数据源订阅」里填入该 URL 订阅。

托管地址没有特殊要求,可用 npoint.io 免费托管 JSON(粘贴内容即可得到一个公开 URL),Gist、对象存储、任意静态托管同样可用。

订阅格式(LibreTV-SourceList JSON)

{
  "name": "我的源列表",
  "version": 2,
  "sources": [
    {
      "name": "示例点播源",
      "url": "https://example.com/api.php/provide/vod",
      "detail": "https://example.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 否 点播源数组(Apple CMS 采集站),最多 100 个,超出部分截断
sources[].name 项 string 否 源显示名;缺省时使用 URL 主机名
sources[].url 项 string 是 Apple CMS 采集接口地址(公网 http/https),结尾 / 自动去除
sources[].detail 项 string 否 详情页根地址,用于列表接口拿不到播放地址、需要爬详情页提取 m3u8 的源
sources[].isAdult 项 boolean 否 成人内容标记,默认 false。标记为 true 的源名称旁显示 (18+) 徽章;设置中的「成人内容过滤」开启(默认开启)时该源不可勾选、不参与搜索,需先关闭过滤才能启用
liveSources 顶层 array 否 直播源数组(M3U 播放列表),最多 50 个,超出部分截断
liveSources[].name 项 string 否 源显示名;缺省时使用 URL 主机名
liveSources[].url 项 string 是 M3U 播放列表地址(http/https)
liveSources[].epg 项 string 否 XMLTV 节目单地址(xml / xml.gz),用于 /live 页展示节目单;地址非法时只丢弃该字段、保留整条源

兼容与限制:

  • 只写 sources 的老订阅照常可用(纯点播),只写 liveSources 则是纯直播订阅;两者都缺时提示「订阅内容格式不正确」;裸数组 [{ "name": "...", "url": "..." }] 视为点播源;
  • 按 url 去重(先到先得);非 http(s) 地址会被过滤;点播源另需为公网地址(内网/回环/保留地址会被静默过滤),直播源在部署者设置 LIVE_ALLOW_PRIVATE=1 时可使用内网自建源地址;
  • 订阅由服务端拉取(拉取前经过 SSRF 校验),因此订阅地址无需配置 CORS,Gist、对象存储、任意静态托管均可。

兼容 TVBOX 配置

订阅地址也可以直接填 TVBOX 配置(形如 {"sites": [...], "lives": [...], "parses": [...]}):服务端按内容结构自动识别格式,无需手动选择。

  • 点播源:导入 sites 中 type: 1 的 JSON 接口(即 Apple CMS 采集站);部分共享配置省略 type 或写成 0,但地址命中 api.php/provide/vod 时同样导入;站点自身标记 searchable: 0(不可搜索)时跳过;
  • 直播源:导入 lives 中 type: 0(或省略)的 M3U 播放列表,epg 字段一并带上;txt 频道列表与单仓 JSON 不支持;
  • Spider 类站点会跳过:type: 3 的 Spider(csp_* / .jar / .js / .py)需要 TVBOX 自身的 Spider 引擎才能运行,Node 侧无法执行;XML 接口、外链 JSON 同理。被跳过的条目不影响其余导入,导入结果会如实提示,如「已同步 8 个点播源、2 个直播源(TVBOX 配置);跳过 96 个不可用条目(Spider 引擎 92、XML 接口 4)」;
  • TVBOX 配置常含上百条站点且以 Spider 为主,只导入个位数到十几个属正常现象;
  • 格式容错:配置里的 // 注释、尾随逗号、字符串内未转义的换行会自动修正后再解析(共享配置中很常见,TVBOX 客户端用的 fastjson 同样容忍这些写法);
  • 其他限制:订阅地址需直接返回 JSON(Base64 / 压缩包装的分享链接不支持);TVBOX「多仓」配置(顶层为 urls 数组)不支持,请填单仓配置;地址公网校验、去重与数量上限与上方格式完全一致。

订阅行为

  • 订阅:设置 → 源管理 → 数据源订阅 → 填入订阅地址 → 「订阅」,导入的点播源自动勾选、直播源自动启用,均带「订阅」标识,条目上显示「点播 N · 直播 M」;
  • 同步:订阅条目上的 ⟳ 手动强制同步,整体替换该订阅名下的点播源与直播源;
  • 管理边界:订阅源以远端列表为准,单独编辑会在下次同步时被覆盖,单独移除会在重新同步时恢复;如需调整请改远端列表,或直接删除整个订阅。删除订阅时点播源全部移除;直播源为多归属共享——同一 M3U 可被多个订阅引用(名称/EPG 以首次导入为准),删除订阅或远端列表中移除该源后再同步,都只摘除本订阅的引用,仅当不再被任何订阅引用时才移除该源,手动添加的源不受同步影响,收藏的频道始终保留;
  • 导出分享:设置 → 源管理 → 数据源订阅 → 「导出数据源」,把当前全部点播源与直播源(预置 + 手动 + 订阅,按 URL 去重)导出为上述 JSON;也可用「发布为链接」,把当前已勾选启用的源一键上传到公开粘贴板(paste.rs,失败自动降级 0x0.st),直接返回可填入订阅框的 URL,无需自备托管。注意:发布的内容公开可读,且每次发布生成新链接、不支持覆盖更新,需长期稳定请用导出 + 自行托管。

订阅由服务端拉取(经过 SSRF 校验),因此订阅地址无需配置 CORS。完整说明见 数据源文档。

开发

npm install
PASSWORD=dev-password npm run dev   # http://localhost:8080
npm test                            # 核心库单元测试(cms-parser / m3u8 / ssrf)
npm run typecheck

测试范围、发布流程与文档结构见 开发文档。

发布新版本

版本号以 package.json 为单一来源,发布镜像由 GitHub Actions 自动完成:

npm version patch       # 或 minor / major;会更新 package.json 并打 git tag
git push && git push --tags

CI 校验通过后自动构建并推送 ghcr.io/librespark/libretv:<版本>(详见部署文档)。

安全说明

  • 密码只保存在服务端环境变量中,前端不持有任何可重放凭证。
  • 登录接口有 IP 速率限制(10 次 / 10 分钟)。
  • 代理内置 SSRF 防护:拒绝内网/保留地址(含 DNS 解析后校验),仅放行 http(s)。
  • 未登录会话仅允许代理图片类目标(豆瓣封面防盗链需要)。

衍生作品

项目 说明
OrionTV Apple TV / Android TV 客户端(React Native TVOS + Expo),配合 MoonTV 使用
LunaTV 影视聚合站(Next.js),支持 Redis / Upstash 等多存储后端
Selene-TV Android TV(Leanback)客户端,Kotlin + Compose,对接 MoonTV / Helios
EchoTV Flutter 全平台客户端(已归档)
WarHutTV Go + React 的自托管影视聚合站
DecoTV 聚合播放站(原 KatelyaTV)
Joyflix macOS 原生影视聚合客户端(Objective-C)
MoonCakeTV 影视聚合搜索站(Next.js),文件存储、一键脚本部署
OrangeTV 跨平台影视聚合播放器(Next.js),Kvrocks/Redis/Upstash 多存储与多端同步

旧版 LibreTV(静态 HTML + Express)完整代码见 backup-2025 分支。

免责声明

本项目不存储、不制作任何视频内容,仅提供第三方公开接口的聚合与播放能力,内容的合法性由对应数据源负责。

☕ 觉得有用的话,可以到 AFDIAN 请我喝杯咖啡。

View on GitHub

Recent activity

commits and pull requests

Commits per week

last 52 weeks
570Week of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 0 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 0 commitsWeek of 2026-08-02: 0 commitsWeek of 2026-08-09: 0 commitsWeek of 2026-08-16: 0 commitsWeek of 2026-08-23: 0 commitsWeek of 2026-08-30: 34 commitsWeek of 2026-09-06: 57 commitsWeek of 2026-09-13: 16 commitsWeek of 2026-09-20: 34 commitsWeek of 2026-09-27: 48 commitsWeek of 2026-10-04: 0 commitsWeek of 2026-10-11: 0 commitsOct 19, 2025Oct 11, 2026
189 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 3 commitsSun 1:00 — 6 commitsSun 2:00 — 6 commitsSun 3:00 — 3 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 0 commitsSun 9:00 — 1 commitsSun 10:00 — 4 commitsSun 11:00 — 9 commitsSun 12:00 — 4 commitsSun 13:00 — 3 commitsSun 14:00 — 1 commitsSun 15:00 — 6 commitsSun 16:00 — 1 commitsSun 17:00 — 4 commitsSun 18:00 — 3 commitsSun 19:00 — 11 commitsSun 20:00 — 9 commitsSun 21:00 — 3 commitsSun 22:00 — 4 commitsSun 23:00 — 4 commitsMon 0:00 — 7 commitsMon 1:00 — 2 commitsMon 2:00 — 0 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 1 commitsMon 10:00 — 3 commitsMon 11:00 — 0 commitsMon 12:00 — 2 commitsMon 13:00 — 1 commitsMon 14:00 — 2 commitsMon 15:00 — 1 commitsMon 16:00 — 10 commitsMon 17:00 — 14 commitsMon 18:00 — 8 commitsMon 19:00 — 15 commitsMon 20:00 — 18 commitsMon 21:00 — 11 commitsMon 22:00 — 12 commitsMon 23:00 — 3 commitsTue 0:00 — 5 commitsTue 1:00 — 2 commitsTue 2:00 — 5 commitsTue 3:00 — 4 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 0 commitsTue 8:00 — 0 commitsTue 9:00 — 1 commitsTue 10:00 — 7 commitsTue 11:00 — 9 commitsTue 12:00 — 12 commitsTue 13:00 — 2 commitsTue 14:00 — 9 commitsTue 15:00 — 2 commitsTue 16:00 — 2 commitsTue 17:00 — 9 commitsTue 18:00 — 8 commitsTue 19:00 — 7 commitsTue 20:00 — 7 commitsTue 21:00 — 2 commitsTue 22:00 — 16 commitsTue 23:00 — 9 commitsWed 0:00 — 11 commitsWed 1:00 — 3 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 1 commitsWed 10:00 — 5 commitsWed 11:00 — 0 commitsWed 12:00 — 5 commitsWed 13:00 — 10 commitsWed 14:00 — 7 commitsWed 15:00 — 7 commitsWed 16:00 — 7 commitsWed 17:00 — 2 commitsWed 18:00 — 2 commitsWed 19:00 — 7 commitsWed 20:00 — 10 commitsWed 21:00 — 7 commitsWed 22:00 — 4 commitsWed 23:00 — 11 commitsThu 0:00 — 10 commitsThu 1:00 — 0 commitsThu 2:00 — 2 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 0 commitsThu 8:00 — 0 commitsThu 9:00 — 2 commitsThu 10:00 — 2 commitsThu 11:00 — 1 commitsThu 12:00 — 0 commitsThu 13:00 — 2 commitsThu 14:00 — 5 commitsThu 15:00 — 4 commitsThu 16:00 — 3 commitsThu 17:00 — 2 commitsThu 18:00 — 1 commitsThu 19:00 — 3 commitsThu 20:00 — 11 commitsThu 21:00 — 6 commitsThu 22:00 — 4 commitsThu 23:00 — 8 commitsFri 0:00 — 9 commitsFri 1:00 — 4 commitsFri 2:00 — 0 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 0 commitsFri 9:00 — 0 commitsFri 10:00 — 4 commitsFri 11:00 — 1 commitsFri 12:00 — 6 commitsFri 13:00 — 5 commitsFri 14:00 — 9 commitsFri 15:00 — 5 commitsFri 16:00 — 9 commitsFri 17:00 — 2 commitsFri 18:00 — 2 commitsFri 19:00 — 0 commitsFri 20:00 — 6 commitsFri 21:00 — 13 commitsFri 22:00 — 3 commitsFri 23:00 — 6 commitsSat 0:00 — 2 commitsSat 1:00 — 2 commitsSat 2:00 — 1 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 7 commitsSat 12:00 — 15 commitsSat 13:00 — 8 commitsSat 14:00 — 7 commitsSat 15:00 — 9 commitsSat 16:00 — 11 commitsSat 17:00 — 6 commitsSat 18:00 — 7 commitsSat 19:00 — 3 commitsSat 20:00 — 7 commitsSat 21:00 — 4 commitsSat 22:00 — 4 commitsSat 23:00 — 8 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Oct 17, 2026daily#7+978
Oct 16, 2026daily#7+978
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    457.8K stars · TypeScript

  • openclaw/openclaw

    The AI that really does things. Any OS. Any Platform. The lobster way. 🦞

    392.8K stars · TypeScript

  • morluto/rea

    Reverse engineer anything with agents, from app behavior down to native binaries.

    370.6K stars · TypeScript

  • anomalyco/opencode

    The open source coding agent.

    220.5K stars · TypeScript

  • n8n-io/n8n

    Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

    208.4K stars · TypeScript

  • firecrawl/firecrawl

    Supercharge your AI agents with data from the web and beyond. Building the library for superintelligence. 🔥

    194.5K stars · TypeScript