一分钟搭建影视站,支持Docker等部署方式
13,858
stars
489
commits
TypeScript
primary language
Sep 10, 2026
updated
LibreTV Next.js 迁移版:免费在线视频聚合搜索与观看平台。基于 Next.js 15(App Router)+ TypeScript + Tailwind CSS,播放内核为 ArtPlayer + hls.js,支持亮暗双主题。
📖 完整文档:GitHub Wiki · 架构 · 部署 · 配置 · 数据源 · 首页推荐 · 播放器 · 代理与安全 · FAQ
/live 页面按分组浏览、搜索频道并站内播放(HLS + HTTP-FLV),支持 XMLTV 节目单(EPG)与频道收藏;直播流经专用长连接代理(/api/live/stream)转发60S_API_BASE 可指向自部署 60s 实例)# 在 .env 中设置 PASSWORD
echo "PASSWORD=your-password" > .env
# 方式一:拉取发布镜像(零构建)
docker compose pull && docker compose up -d
# 方式二:源码构建
docker compose up -d --build
services:
libretv:
image: ghcr.io/librespark/libretv:latest
container_name: libretv
restart: unless-stopped
ports:
- "8080:8080"
environment:
- PASSWORD=change-me # 必填:访问密码,务必修改
docker compose pull && docker compose up -d
⚠️ 生产部署必须通过 HTTPS 访问(localhost 除外):生产模式下会话 cookie 带
Secure标记,浏览器只在 HTTPS(或 localhost)下保存它。因此用http://服务器IP:端口访问时,会出现"密码正确却无法登录"的现象——登录请求实际成功,但 cookie 被浏览器丢弃。请通过反向代理(Nginx / Caddy / Traefik)或 Cloudflare 等为站点套上 TLS 后再对外提供服务;本地开发用localhost不受影响。
镜像发布在 GHCR:ghcr.io/librespark/libretv(latest / 主.次 / 完整版本号三个 tag,
linux/amd64 与 linux/arm64 双架构)。需要固定版本时在 .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(源站总页数,该值);页间并行请求,单页失败只丢该页 |
60S_API_BASE | 否 | 影视榜单推荐源(60s API)实例地址,默认官方公共实例 https://60s.viki.moe;有限流,高频使用可自部署 |
DEFAULT_LIVE_SOURCES | 否 | 预置直播源(M3U 订阅),JSON 数组:[{"name":"源名","url":"https://.../list.m3u","epg":"https://.../epg.xml.gz"}],epg 为可选的 XMLTV 节目单地址 |
LIVE_ALLOW_PRIVATE | 否 | 设为 1 时允许直播流代理访问内网/保留地址(自建 IPTV 场景),默认关闭以维持 SSRF 防护 |
DEBUG | 否 | 调试日志 |
https://example.com/api.php/provide/vod),可选填详情页地址(部分源需要爬详情页提取播放地址)。/watch;支持快捷键(空格/←→/↑↓/F/Alt+←→)、移动端长按 3 倍速、自动连播、换源测速。DEFAULT_LIVE_SOURCES 环境变量预置。tvg-id 且订阅配置了 EPG 地址时,展示当前/接下来节目与播放进度。⚠️ 项目不内置任何频道源,也不存储、不制作任何直播内容,仅提供第三方公开播放列表的解析与播放能力,内容的合法性由对应数据源负责。内网自建源默认被 SSRF 防护拦截,自部署者可显式设置
LIVE_ALLOW_PRIVATE=1放行。
源列表可以 导出为 JSON → 托管到公开 URL → 他人在「设置」里填入该 URL 订阅。
托管地址没有特殊要求,可用 npoint.io 免费托管 JSON(粘贴内容即可得到一个公开 URL),Gist、对象存储、任意静态托管同样可用。
{
"name": "我的源列表",
"version": 1,
"sources": [
{ "name": "示例源", "url": "https://example.com/api.php/provide/vod" }
]
}
sources[].url;detail 为详情页根地址,isAdult 为成人内容标记;[{ "name": "...", "url": "..." }];url 去重,最多 100 个源;非公网 http(s) 地址会被静默过滤。订阅由服务端拉取(经过 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:<版本>(详见部署文档)。
| 项目 | 说明 |
|---|---|
| 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 请我喝杯咖啡。
TypeScript
98.3%
CSS
1.3%
一分钟搭建影视站,支持Docker等部署方式
13,858
stars
489
commits
TypeScript
primary language
Sep 10, 2026
updated
LibreTV Next.js 迁移版:免费在线视频聚合搜索与观看平台。基于 Next.js 15(App Router)+ TypeScript + Tailwind CSS,播放内核为 ArtPlayer + hls.js,支持亮暗双主题。
📖 完整文档:GitHub Wiki · 架构 · 部署 · 配置 · 数据源 · 首页推荐 · 播放器 · 代理与安全 · FAQ
/live 页面按分组浏览、搜索频道并站内播放(HLS + HTTP-FLV),支持 XMLTV 节目单(EPG)与频道收藏;直播流经专用长连接代理(/api/live/stream)转发60S_API_BASE 可指向自部署 60s 实例)# 在 .env 中设置 PASSWORD
echo "PASSWORD=your-password" > .env
# 方式一:拉取发布镜像(零构建)
docker compose pull && docker compose up -d
# 方式二:源码构建
docker compose up -d --build
services:
libretv:
image: ghcr.io/librespark/libretv:latest
container_name: libretv
restart: unless-stopped
ports:
- "8080:8080"
environment:
- PASSWORD=change-me # 必填:访问密码,务必修改
docker compose pull && docker compose up -d
⚠️ 生产部署必须通过 HTTPS 访问(localhost 除外):生产模式下会话 cookie 带
Secure标记,浏览器只在 HTTPS(或 localhost)下保存它。因此用http://服务器IP:端口访问时,会出现"密码正确却无法登录"的现象——登录请求实际成功,但 cookie 被浏览器丢弃。请通过反向代理(Nginx / Caddy / Traefik)或 Cloudflare 等为站点套上 TLS 后再对外提供服务;本地开发用localhost不受影响。
镜像发布在 GHCR:ghcr.io/librespark/libretv(latest / 主.次 / 完整版本号三个 tag,
linux/amd64 与 linux/arm64 双架构)。需要固定版本时在 .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(源站总页数,该值);页间并行请求,单页失败只丢该页 |
60S_API_BASE | 否 | 影视榜单推荐源(60s API)实例地址,默认官方公共实例 https://60s.viki.moe;有限流,高频使用可自部署 |
DEFAULT_LIVE_SOURCES | 否 | 预置直播源(M3U 订阅),JSON 数组:[{"name":"源名","url":"https://.../list.m3u","epg":"https://.../epg.xml.gz"}],epg 为可选的 XMLTV 节目单地址 |
LIVE_ALLOW_PRIVATE | 否 | 设为 1 时允许直播流代理访问内网/保留地址(自建 IPTV 场景),默认关闭以维持 SSRF 防护 |
DEBUG | 否 | 调试日志 |
https://example.com/api.php/provide/vod),可选填详情页地址(部分源需要爬详情页提取播放地址)。/watch;支持快捷键(空格/←→/↑↓/F/Alt+←→)、移动端长按 3 倍速、自动连播、换源测速。DEFAULT_LIVE_SOURCES 环境变量预置。tvg-id 且订阅配置了 EPG 地址时,展示当前/接下来节目与播放进度。⚠️ 项目不内置任何频道源,也不存储、不制作任何直播内容,仅提供第三方公开播放列表的解析与播放能力,内容的合法性由对应数据源负责。内网自建源默认被 SSRF 防护拦截,自部署者可显式设置
LIVE_ALLOW_PRIVATE=1放行。
源列表可以 导出为 JSON → 托管到公开 URL → 他人在「设置」里填入该 URL 订阅。
托管地址没有特殊要求,可用 npoint.io 免费托管 JSON(粘贴内容即可得到一个公开 URL),Gist、对象存储、任意静态托管同样可用。
{
"name": "我的源列表",
"version": 1,
"sources": [
{ "name": "示例源", "url": "https://example.com/api.php/provide/vod" }
]
}
sources[].url;detail 为详情页根地址,isAdult 为成人内容标记;[{ "name": "...", "url": "..." }];url 去重,最多 100 个源;非公网 http(s) 地址会被静默过滤。订阅由服务端拉取(经过 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:<版本>(详见部署文档)。
| 项目 | 说明 |
|---|---|
| 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 请我喝杯咖啡。
TypeScript
98.3%
CSS
1.3%