MoonTVPlus 是基于 MoonTV v100 二次开发的增强版影视聚合播放器。它在原版基础上新增了外部播放器支持、视频超分、弹幕系统、评论抓取等实用功能,提供更强大的观影体验。
MoonTVPlus 是基于 MoonTV v100 二次开发的增强版影视聚合播放器。它在原版基础上新增了外部播放器支持、视频超分、弹幕系统、评论抓取等实用功能,提供更强大的观影体验。
MoonTVPlus 是基于 MoonTV v100 二次开发的增强版影视聚合播放器。它在原版基础上新增了外部播放器支持、视频超分、弹幕系统、评论抓取等实用功能,提供更强大的观影体验。
| 分类 | 主要依赖 |
|---|---|
| 前端框架 | Next.js 14 · App Router |
| UI & 样式 | Tailwind CSS 3 |
| 语言 | TypeScript 4 |
| 播放器 | ArtPlayer · HLS.js |
| 代码质量 | ESLint · Prettier · Jest |
| 部署 | Docker · Vercel · Netlify · Cloudflare Workers · EdgeOne Pages |
本项目支持 Docker、Vercel、Netlify、Cloudflare Workers 和 EdgeOne Pages 平台 部署。 一键部署到 Zeabur 一键部署到 Render
Cloudflare Workers 提供免费的边缘计算服务,通过 GitHub Actions 可以实现自动化部署。
1. 获取 Cloudflare API Token 和 Account ID
2. 配置 GitHub Secrets
进入你 Fork 的仓库,点击 Settings > Secrets and variables > Actions > New repository secret,添加以下必需的 Secrets:
必需配置:
| Secret 名称 | 说明 | 示例值 |
|---|---|---|
CLOUDFLARE_API_TOKEN |
Cloudflare API Token | your_api_token_here |
CLOUDFLARE_ACCOUNT_ID |
Cloudflare Account ID | abc123def456 |
USERNAME |
站长账号 | admin |
PASSWORD |
站长密码 | your_secure_password |
NEXT_PUBLIC_STORAGE_TYPE |
存储类型 | upstash |
UPSTASH_URL |
Upstash Redis URL | https://xxx.upstash.io |
UPSTASH_TOKEN |
Upstash Redis Token | your_upstash_token |
3. 触发部署
配置完成后,有两种方式触发部署:
方式一:手动触发
方式二:自动触发(可选)
如果想要在推送代码时自动部署,可以修改 .github/workflows/cloudflare-deploy.yml 文件:
on:
push:
branches:
- main # 或你的主分支名称
workflow_dispatch:4. 查看部署状态
https://your-project-name.your-account.workers.dev5. 绑定自定义域名(可选)
6. 使用 D1 数据库(可选)
如果想使用 Cloudflare D1 数据库代替 Upstash Redis,需要进行以下配置:
NEXT_PUBLIC_STORAGE_TYPE 设置为 d1D1_DATABASE_ID 并填入你的数据库 IDUPSTASH_URL 和 UPSTASH_TOKEN7. 配置外部定时任务(可选)
可使用外部定时请求/api/cron/mtvpls端点以触发定时任务,或新建一个workers请求触发,推荐每小时请求一次。
EdgeOne Pages/Makers 支持通过 API Token 在 GitHub Actions 中自动构建并部署,本项目已内置 .github/workflows/edgeone-deploy.yml。
1. 获取 EdgeOne API Token
2. 配置 GitHub Secrets
进入你 Fork 的仓库,点击 Settings > Secrets and variables > Actions > New repository secret,添加以下必需的 Secrets:
| Secret 名称 | 说明 | 示例值 |
|---|---|---|
EDGEONE_API_TOKEN |
EdgeOne API Token | your_edgeone_token |
USERNAME |
站长账号 | admin |
PASSWORD |
站长密码 | your_secure_password |
NEXT_PUBLIC_STORAGE_TYPE |
存储类型 | turso 或 upstash |
使用 Turso(推荐):
在 Turso 注册账号并创建数据库,然后运行 pnpm init:turso 初始化表结构(需设置 TURSO_URL 和 TURSO_TOKEN 环境变量)。
| Secret 名称 | 说明 | 示例值 |
|---|---|---|
TURSO_URL |
Turso 数据库 URL | libsql://your-db.turso.io |
TURSO_TOKEN |
Turso 访问令牌 | your_turso_token |
使用 Upstash Redis:
| Secret 名称 | 说明 | 示例值 |
|---|---|---|
UPSTASH_URL |
Upstash Redis URL | https://xxx.upstash.io |
UPSTASH_TOKEN |
Upstash Redis Token | your_upstash_token |
其他可选环境变量可按需继续添加到 GitHub Secrets,工作流会自动同步已配置且非空的变量到 EdgeOne 项目环境变量中。
3. 触发部署
project_name 默认为 moontvplusarea 默认为 overseas,即全球可用区(不含中国大陆);如需全球可用区可选择 globalsync_environment 默认开启,会在部署后同步环境变量并再次部署以确保新建项目也能读取环境变量…(若指定kvrocks-data目录,需要将所挂载的数据目录权限调整为777否则会导致创建数据库失败)
services:
moontv-core:
image: ghcr.io/mtvpls/moontvplus:latest
container_name: moontv-core
restart: on-failure
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=d1
- SQLITE_DB_PATH=/app/.data/moontv.db
volumes:
- ./data:/app/.data…services:
moontv-core:
image: ghcr.io/mtvpls/moontvplus:latest
container_name: moontv-core
restart: on-failure
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=upstash
- UPSTASH_URL=上面 https 开头的 HTTPS ENDPOINT
- UPSTASH_TOKEN=上面的 TOKENghcr.io/mtvpls/moontvplus-lite:latest 为更小的镜像,但不支持启动内置观影室服务,也不支持 SQLite(NEXT_PUBLIC_STORAGE_TYPE=d1)自动初始化方案。
示例:
…(若指定kvrocks-data目录,需要将所挂载的数据目录权限调整为777否则会导致创建数据库失败)
指定运行 UID/GID:容器默认以
1001:1001(nextjs用户)运行。可通过PUID/PGID环境变量指定容器进程运行时使用的用户/组 ID。挂载宿主机目录时建议将其设为宿主机目录的属主 UID/GID,容器启动时会自动调整进程属主并修正/data、/app/.data等数据目录的属主,避免权限问题。
完成部署后为空壳应用,无播放源,需要站长在管理后台的配置文件设置中填写配置文件,本版本已不支持无数据库运行。
配置文件示例如下:
{
"cache_time": 7200,
"api_site": {
"dyttzy": {
"api": "http://xxx.com/api.php/provide/vod",
"name": "示例资源",
"detail": "http://xxx.com"
}
// ...更多站点
},
"custom_category": [
{
"name": "华语",
"type": "movie",
"query": "华语"
}
]
}cache_time:接口缓存时间(秒)。api_site:你可以增删或替换任何资源站,字段说明:key:唯一标识,保持小写字母/数字。api:资源站提供的 vod JSON API 根地址。name:在人机界面中展示的名称。detail:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。custom_category:自定义分类配置,用于在导航中添加个性化的影视分类。以 type + query 作为唯一标识。支持以下字段:name:分类显示名称(可选,如不提供则使用 query 作为显示名)type:分类类型,支持 movie(电影)或 tv(电视剧)query:搜索关键词,用于在豆瓣 API 中搜索相关内容custom_category 支持的自定义分类已知如下:
也可输入如 "哈利波特" 效果等同于豆瓣搜索
MoonTV 支持标准的苹果 CMS V10 API 格式。
可借助 watchtower 自动更新镜像容器
dockge/komodo 等 docker compose UI 也有自动更新功能
| 变量 | 说明 | 可选值 | 默认值 |
|---|---|---|---|
| USERNAME | 站长账号 | 任意字符串 | 无默认,必填字段 |
| PASSWORD | 站长密码 | 任意字符串 | 无默认,必填字段 |
| CRON_PASSWORD | 定时任务 API 访问密码(用于保护 /api/cron 端点) | 任意字符串 | mtvpls |
| CRON_WAIT_FOR_COMPLETION | 定时任务接口是否等待任务完全结束后再返回响应(true 时返回 200,false 时立即返回 202)。部署在 serverless 平台(如 Vercel)时建议设置为 true,否则响应返回后异步执行可能会被平台杀后台导致任务中断 | true/false | false |
| CRON_USER_BATCH_SIZE | 定时任务用户批处理大小(控制并发处理的用户数量,影响播放记录和收藏更新任务的并发性能) | 正整数 | 3 |
| SITE_BASE | 站点 url | 形如 https://example.com | 空 |
| NEXT_PUBLIC_SITE_NAME | 站点名称 | 任意字符串 | MoonTV |
| ANNOUNCEMENT | 站点公告 | 任意字符串 | 本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。 |
| ANNOUNCEMENT_DISPLAY_MODE | 公告显示模式 | once、every | once |
| NEXT_PUBLIC_STORAGE_TYPE | 播放记录/收藏的存储方式 | redis、kvrocks、upstash、d1、turso、postgres | 无默认,必填字段 |
| KVROCKS_URL | kvrocks 连接 url | 连接 url | 空 |
| REDIS_URL | redis 连接 url | 连接 url | 空 |
暂无开放 Issues,或尚未同步最近议题。