Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/ MoonTV Public

🎬 MoonTV 是一个开箱即用的、跨平台的影视聚合播放器。本项目现基于2.0.1开始自行维护更新(提醒: cloudflare部署有封pages的风险)

License

Notifications You must be signed in to change notification settings

Stardm0/MoonTV

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

236 Commits

Repository files navigation

MoonTV(Branch)

原项目地址https://github.com/MoonTechLab/LunaTV

🎬 MoonTV 是一个开箱即用的、跨平台的影视聚合播放器。它基于 Next.js 14 + Tailwind CSS + TypeScript 构建,支持多资源搜索、在线播放、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。


✨ 功能特性

  • 🔍 多源聚合搜索:快速返回结果。
  • 📄 丰富详情页:支持剧集列表、演员、年份、简介等完整信息展示。
  • ▶️ 流畅在线播放:集成 HLS.js & ArtPlayer。
  • 📥 视频下载:支持 M3U8 视频下载,多线程并发加速,边下边存功能(Chrome/Edge)。
  • ❤️ 收藏 + 继续观看:支持 Redis/Upstash 存储,多端同步进度。
  • 📱 PWA:离线缓存、安装到桌面/主屏,移动端原生体验。
  • 🌗 响应式布局:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
  • 🚀 极简部署:一条 Docker 命令即可将完整服务跑起来,或免费部署到 Vercel、Netlify、cloudflare。
  • 👿 智能去广告:自动跳过视频中的切片广告(实验性)
  • 💬 弹幕支持:以danmu_api为后端, 需自行部署

注意:部署后项目为空壳项目,无内置播放源,需要自行收集,需要弹幕请自行部署后端

点击查看项目截图 项目截图

🗺 目录

技术栈

分类 主要依赖
前端框架 Next.js 14 · App Router
UI & 样式 Tailwind CSS 3
语言 TypeScript 4
播放器 ArtPlayer · HLS.js
代码质量 ESLint · Prettier · Jest
部署 Docker · Vercel · pages

部署

本项目支持 Vercel、Docker、Netlify、Cloudflare 部署。

存储支持矩阵

Docker Vercel Netlify Cloudflare
localstorage
原生 redis
Cloudflare D1
Upstash Redis ☑️

✅:经测试支持

☑️:理论上支持,未测试

Vercel 部署

普通部署(localstorage)

  1. Fork 本仓库到你的 GitHub 账户。
  2. 登陆 Vercel,点击 Add New → Project,选择 Fork 后的仓库。
  3. 设置 PASSWORD 环境变量。
  4. 保持默认设置完成首次部署。
  5. 如需自定义 config.json,请直接修改 Fork 后仓库中该文件。
  6. 每次 Push 到 main 分支将自动触发重新构建。

部署完成后即可通过分配的域名访问,也可以绑定自定义域名。

Upstash Redis 支持

  1. 完成普通部署并成功访问。
  2. upstash 注册账号并新建一个 Redis 实例,名称任意。
  3. 复制新数据库的 HTTPS ENDPOINT 和 TOKEN
  4. 返回你的 Vercel 项目,新增环境变量 UPSTASH_URL 和 UPSTASH_TOKEN,值为第二步复制的 endpoint 和 token
  5. 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 upstash;设置 USERNAME 和 PASSWORD 作为站长账号
  6. 重试部署

Netlify 部署(推荐)

普通部署(localstorage)

  1. Fork 本仓库到你的 GitHub 账户。
  2. 登陆 Netlify,点击 Add New project → Importing an existing project,授权 Github,选择 Fork 后的仓库。
  3. 设置 PASSWORD 环境变量。
  4. 保持默认设置完成首次部署。
  5. 每次 Push 到 main 分支将自动触发重新构建。

部署完成后即可通过分配的域名访问,也可以绑定自定义域名。

Upstash Redis 支持

  1. 完成普通部署并成功访问。
  2. upstash 注册账号并新建一个 Redis 实例,名称任意。
  3. 复制新数据库的 HTTPS ENDPOINT 和 TOKEN
  4. 返回你的 Netlify 项目,Project Configuration → Environment variables 新增环境变量 UPSTASH_URL 和 UPSTASH_TOKEN,值为第二步复制的 endpoint 和 token
  5. 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 upstash;设置 USERNAME 和 PASSWORD 作为站长账号
  6. 重试部署

Cloudflare 部署

Cloudflare Pages 的环境变量尽量设置为密钥而非文本

普通部署(localstorage)

  1. Fork 本仓库到你的 GitHub 账户。
  2. 登陆 Cloudflare,点击 计算(Workers)-> Workers 和 Pages,点击创建
  3. 选择 Pages,导入现有的 Git 存储库,选择 Fork 后的仓库
  4. 构建命令填写 pnpm run pages:build,预设框架为无,构建输出目录.vercel/output/static
  5. 保持默认设置完成首次部署。进入设置,将兼容性标志设置为 nodejs_compat,无需选择,直接粘贴
  6. 首次部署完成后进入设置,新增 PASSWORD 密钥(变量和机密下),而后重试部署。
  7. 如需自定义 config.json,请直接修改 Fork 后仓库中该文件。
  8. 每次 Push 到 main 分支将自动触发重新构建。

D1 支持

  1. 完成普通部署并成功访问
  2. 点击 存储和数据库 -> D1 SQL 数据库,创建一个新的数据库,名称随意
  3. 进入刚创建的数据库,点击左上角的 Explore Data,将d1-init 中的内容粘贴到 Query 窗口后点击 Run All,等待运行完成
  4. 返回你的 pages 项目,进入 设置 -> 绑定,添加绑定 D1 数据库,选择你刚创建的数据库,变量名称填 DB
  5. 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 d1;设置 USERNAME 和 PASSWORD 作为站长账号
  6. 重试部署

Docker 部署

直接运行(最简单,localstorage)

# 拉取预构建镜像
# 或拉取最新版本
docker pull ghcr.io/stardm0/moontv:latest
# 运行容器
# -d: 后台运行 -p: 映射端口 3000 -> 3000
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/stardm0/moontv:latest

Docker Compose

local storage 存储
services:
 startv-core:
 image: ghcr.io/stardm0/moontv:latest
 container_name: startv-core
 restart: on-failure
 ports:
 - '3000:3000'
 environment:
 - PASSWORD=password
Kvrocks 存储(推荐)
services:
 moontv-core:
 image: ghcr.io/stardm0/moontv:latest
 container_name: moontv-core
 restart: on-failure
 ports:
 - '3000:3000'
 environment:
 - USERNAME=admin
 - PASSWORD=admin_password
 - NEXT_PUBLIC_STORAGE_TYPE=kvrocks
 - KVROCKS_URL=redis://moontv-kvrocks:6666
 networks:
 - moontv-network
 depends_on:
 - moontv-kvrocks
 moontv-kvrocks:
 image: apache/kvrocks
 container_name: moontv-kvrocks
 restart: unless-stopped
 volumes:
 - kvrocks-data:/var/lib/kvrocks
 networks:
 - moontv-network
networks:
 moontv-network:
 driver: bridge
volumes:
 kvrocks-data:
Redis 存储(有一定的丢数据风险)
services:
 moontv-core:
 image: ghcr.io/stardm0/moontv:latest
 container_name: moontv-core
 restart: on-failure
 ports:
 - '3000:3000'
 environment:
 - USERNAME=admin
 - PASSWORD=admin_password
 - NEXT_PUBLIC_STORAGE_TYPE=redis
 - REDIS_URL=redis://moontv-redis:6379
 networks:
 - moontv-network
 depends_on:
 - moontv-redis
 moontv-redis:
 image: redis:alpine
 container_name: moontv-redis
 restart: unless-stopped
 networks:
 - moontv-network
 # 请开启持久化,否则升级/重启后数据丢失
 volumes:
 - ./data:/data
networks:
 moontv-network:
 driver: bridge
Upstash 存储
services:
 startv-core:
 image: ghcr.io/stardm0/moontv:latest
 container_name: startv-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= TOKEN

环境变量

变量 说明 可选值 默认值
USERNAME 非 localstorage 部署时的管理员账号 任意字符串 (空)
PASSWORD 非 localstorage 部署时为管理员密码 任意字符串 (空)
NEXT_PUBLIC_SITE_NAME 站点名称 任意字符串 MoonTV
ANNOUNCEMENT 站点公告 任意字符串 本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。
NEXT_PUBLIC_STORAGE_TYPE 播放记录/收藏的存储方式 localstorage、redis、d1、upstash localstorage
REDIS_URL redis 连接 url 连接 url
UPSTASH_URL upstash redis 连接 url 连接 url
UPSTASH_TOKEN upstash redis 连接 token 连接 token
NEXT_PUBLIC_ENABLE_REGISTER 是否开放注册,仅在非 localstorage 部署时生效 true / false false
NEXT_PUBLIC_SEARCH_MAX_PAGE 搜索接口可拉取的最大页数 1-50 5
NEXT_PUBLIC_DOUBAN_PROXY_TYPE 豆瓣数据源请求方式 见下方 direct
NEXT_PUBLIC_DOUBAN_PROXY 自定义豆瓣数据代理 URL url prefix (空)
NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE 豆瓣图片代理类型 见下方 direct
NEXT_PUBLIC_DOUBAN_IMAGE_PROXY 自定义豆瓣图片代理 URL url prefix (空)
NEXT_PUBLIC_DISABLE_YELLOW_FILTER 关闭色情内容过滤 true/false false
NEXT_PUBLIC_DANMU_API_BASE_URL 弹幕接口地址 接口地址 (空)

NEXT_PUBLIC_DOUBAN_PROXY_TYPE 选项解释:

  • direct: 由服务器直接请求豆瓣源站

  • cors-proxy-zwei: 浏览器向 cors proxy 请求豆瓣数据,该 cors proxy 由 Zwei 搭建

  • cmliussss-cdn-tencent: 浏览器向豆瓣 CDN 请求数据,该 CDN 由 CMLiussss 搭建,并由腾讯云 cdn 提供加速

  • cmliussss-cdn-ali: 浏览器向豆瓣 CDN 请求数据,该 CDN 由 CMLiussss 搭建,并由阿里云 cdn 提供加速

  • custom: 用户自定义 proxy,由 NEXT_PUBLIC_DOUBAN_PROXY 定义

NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE 选项解释:

  • direct:由浏览器直接请求豆瓣分配的默认图片域名
  • server:由服务器代理请求豆瓣分配的默认图片域名
  • img3:由浏览器请求豆瓣官方的精品 cdn(阿里云)
  • cmliussss-cdn-tencent:由浏览器请求豆瓣 CDN,该 CDN 由 CMLiussss 搭建,并由腾讯云 cdn 提供加速
  • cmliussss-cdn-ali:由浏览器请求豆瓣 CDN,该 CDN 由 CMLiussss 搭建,并由阿里云 cdn 提供加速
  • custom: 用户自定义 proxy,由 NEXT_PUBLIC_DOUBAN_IMAGE_PROXY 定义

配置说明

如果为 localstorage 模式所有可自定义项集中在根目录的 config.json 中(localstorage 模式) 非 localstorage 可在部署好的网页中直接配置

{
 "cache_time": 7200,
 "api_site": {
 "dyttzy": {
 "api": "http://caiji.dyttzyapi.com/api.php/provide/vod",
 "name": "电影天堂资源",
 "detail": "http://caiji.dyttzyapi.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 支持的自定义分类已知如下:

  • movie:热门、最新、经典、豆瓣高分、冷门佳片、华语、欧美、韩国、日本、动作、喜剧、爱情、科幻、悬疑、恐怖、治愈
  • tv:热门、美剧、英剧、韩剧、日剧、国产剧、港剧、日本动画、综艺、纪录片

也可输入如 "哈利波特" 效果等同于豆瓣搜索

MoonTV 支持标准的苹果 CMS V10 API 格式。

修改后 无需重新构建,服务会在启动时读取一次。

管理员配置

该特性目前仅支持通过非 localstorage 存储的部署方式使用

支持在运行时动态变更服务配置

设置环境变量 USERNAME 和 PASSWORD 即为站长用户,站长可设置用户为管理员

站长或管理员访问 /admin 即可进行管理员配置

AndroidTV 使用

目前该项目可以配合 OrionTV 在 Android TV 上使用,可以直接作为 OrionTV 后端

TVBox 对接

  • 在首页右上角的"设置"中,开启"启用 TVBox 接口"。
  • 可选择"随机"生成访问密码,或自定义后点击"保存"。
  • 系统会生成可直接复制的接口地址,形式为:https://你的域名/api/tvbox/config?pwd=你的口令
  • 将该地址填入 TVBox 的订阅/配置接口即可使用。
  • 如需关闭对接,关闭开关即可。

本地存储(localstorage)模式

  • 开关由环境变量控制:TVBOX_ENABLED=true|false(默认 true,未设置即开启)
  • 接口访问口令使用登录密码:PASSWORD
  • 生成的订阅地址示例:https://你的域名/api/tvbox/config?pwd=$PASSWORD
  • 设置面板中的开关与保存在本地模式下仅用于展示(被禁用),请通过环境变量控制。

Selene 使用

该项目已兼容 Selene 在移动端上使用,可以直接作为 Selene 后端(本地存储不支持)

安全与隐私提醒

请设置密码保护并关闭公网注册

为了您的安全和避免潜在的法律风险,我们要求在部署时设置密码保护并强烈建议关闭公网注册:

  • 避免公开访问:不设置密码的实例任何人都可以访问,可能被恶意利用
  • 防范版权风险:公开的视频搜索服务可能面临版权方的投诉举报
  • 保护个人隐私:设置密码可以限制访问范围,保护您的使用记录

部署要求

  1. 设置环境变量 PASSWORD:为您的实例设置一个强密码
  2. 仅供个人使用:请勿将您的实例链接公开分享或传播
  3. 遵守当地法律:请确保您的使用行为符合当地法律法规

重要声明

  • 本项目仅供学习和个人使用
  • 请勿将部署的实例用于商业用途或公开服务
  • 如因公开分享导致的任何法律问题,用户需自行承担责任
  • 项目开发者不对用户的使用行为承担任何法律责任

License

MIT © 2025 MoonTV & Contributors

致谢

  • ts-nextjs-tailwind-starter — 项目最初基于该脚手架。
  • LibreTV — 由此启发,站在巨人的肩膀上。
  • ArtPlayer — 提供强大的网页视频播放器。
  • HLS.js — 实现 HLS 流媒体在浏览器中的播放支持。
  • Zwei — 提供获取豆瓣数据的 cors proxy
  • CMLiussss — 提供豆瓣 CDN 服务
  • 感谢所有提供免费影视接口的站点。

⭐ Star 趋势

Stargazers over time

About

🎬 MoonTV 是一个开箱即用的、跨平台的影视聚合播放器。本项目现基于2.0.1开始自行维护更新(提醒: cloudflare部署有封pages的风险)

Resources

License

Stars

Watchers

Forks

Packages

AltStyle によって変換されたページ (->オリジナル) /