🎬 nova-tv 是一个现代化、功能丰富的影视聚合播放器,基于 MoonTV 项目深度优化改进。它采用最新的 Next.js 15 + Tailwind CSS v4 + TypeScript 5 技术栈,提供流畅的用户体验、增强的 UI 组件和更完善的播放功能。
nova-tv 在原版 MoonTV 基础上进行了全面优化和增强,主要包括:
- 🛠 技术栈升级:升级到 Next.js 15、React 19、Tailwind CSS v4 等最新技术
- 🎯 现代化 UI/UX:重构了整个用户界面,提供更美观、更流畅的使用体验
- ⚡ 性能优化:图片懒加载、组件优化、加载状态改进,显著提升应用性能
- 📱 移动端优化:针对移动设备进行了专门的界面和交互优化
- 🔍 多源聚合搜索:内置数十个免费资源站点,一次搜索立刻返回全源结果
- 📄 丰富详情页:支持剧集列表、演员、年份、简介等完整信息展示
▶️ 流畅在线播放:集成 HLS.js & ArtPlayer,支持多种视频格式- ❤️ 收藏 + 继续观看:支持 Redis/D1/Upstash 存储,多端同步进度
- 📱 PWA 支持:离线缓存、安装到桌面/主屏,移动端原生体验
- 🌗 响应式布局:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸
- 👿 智能去广告:自动跳过视频中的切片广告(实验性)
- 🎨 现代化 UI 组件:全新设计的视频卡片、空状态页面和加载动画
- 📊 增强的视频信息展示:视频卡片显示年份、评分、集数等详细信息
- 🖼️ 图片懒加载优化:提升页面加载速度,减少带宽消耗
- 🎭 组件化架构重构:抽离封装播放面板、源选择器、收藏按钮等组件
- 🎪 优化搜索体验:搜索结果分组排序展示,支持搜索历史功能
- 📱 移动端体验优化:改进移动端布局和交互体验
- 🎯 加载状态优化:更友好的加载提示和骨架屏设计
- 🔧 代码质量提升:使用 @antfu/eslint-config,禁用显示的 any 类型,提升代码规范性
- 🚀 技术栈升级:升级到 Next.js 15、React 19、Tailwind CSS v4 等最新技术栈
| 分类 | 主要依赖 |
|---|---|
| 前端框架 | Next.js 15.5.5 · App Router · React 19.2.0 |
| UI & 样式 | Tailwind CSS v4 · Framer Motion · Lucide React |
| 语言 | TypeScript 5.9 |
| 播放器 | ArtPlayer · HLS.js · VidStack |
| 状态管理 | TanStack Query · Zod |
| 代码质量 | @antfu/eslint-config · ESLint · Husky · Lint-staged |
| 部署 | Docker · Vercel · CloudFlare pages |
本项目支持 Vercel、Docker 和 Cloudflare 部署。
存储支持矩阵
| Docker | Vercel | Cloudflare | |
|---|---|---|---|
| localstorage | ✅ | ✅ | ✅ |
| 原生 redis | ✅ | ||
| Cloudflare D1 | ✅ | ||
| Upstash Redis | ☑️ | ✅ | ☑️ |
✅:经测试支持
☑️:理论上支持,未测试
除 localstorage 方式外,其他方式都支持多账户、记录同步和管理页面
- Fork 本仓库到你的 GitHub 账户。
- 登陆 Vercel,点击 Add New → Project,选择 Fork 后的仓库。
- 设置 PASSWORD 环境变量。
- 保持默认设置完成首次部署。
- 如需自定义
config.json,请直接修改 Fork 后仓库中该文件。 - 每次 Push 到
main分支将自动触发重新构建。
部署完成后即可通过分配的域名访问,也可以绑定自定义域名。
- 完成普通部署并成功访问。
- 在 upstash 注册账号并新建一个 Redis 实例,名称任意。
- 复制新数据库的 HTTPS ENDPOINT 和 TOKEN
- 返回你的 Vercel 项目,新增环境变量 UPSTASH_URL 和 UPSTASH_TOKEN,值为第二步复制的 endpoint 和 token
- 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 upstash;设置 USERNAME 和 PASSWORD 作为站长账号
- 重试部署
Cloudflare Pages 的环境变量尽量设置为密钥而非文本
- Fork 本仓库到你的 GitHub 账户。
- 登陆 Cloudflare,点击 计算(Workers)-> Workers 和 Pages,点击创建
- 选择 Pages,导入现有的 Git 存储库,选择 Fork 后的仓库
- 构建命令填写 pnpm install --frozen-lockfile && pnpm run pages:build,预设框架为无,构建输出目录为
.vercel/output/static - 保持默认设置完成首次部署。进入设置,将兼容性标志设置为
nodejs_compat,无需选择,直接粘贴 - 首次部署完成后进入设置,新增 PASSWORD 密钥(变量和机密下),而后重试部署。
- 如需自定义
config.json,请直接修改 Fork 后仓库中该文件。 - 每次 Push 到
main分支将自动触发重新构建。
- 完成普通部署并成功访问
- 点击 存储和数据库 -> D1 SQL 数据库,创建一个新的数据库,名称随意
- 进入刚创建的数据库,点击左上角的 Explore Data,将D1 初始化 中的内容粘贴到 Query 窗口后点击 Run All,等待运行完成
- 返回你的 pages 项目,进入 设置 -> 绑定,添加绑定 D1 数据库,选择你刚创建的数据库,变量名称填 DB
- 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 d1;设置 USERNAME 和 PASSWORD 作为站长账号
- 重试部署
# 克隆项目
git clone <你的仓库地址> nova-tv
cd nova-tv
# 配置环境变量(可选)
cp .env.example .env
# 编辑 .env 文件设置你的密码
# 启动服务
docker-compose up -d访问 http://localhost:3000,默认密码:1234
详细部署指南请查看:DOCKER_DEPLOY.md
# 安装 PM2
npm install -g pm2
# 构建项目
pnpm build
# 设置环境变量
export PASSWORD=你的密码
# 启动应用
pm2 start ecosystem.config.cjs访问 http://localhost:3000,默认密码:1234
详细部署指南请查看:PM2_DEPLOY.md
# 拉取预构建镜像
docker pull ghcr.io/fxzer/nova-tv:latest
# 运行容器
# -d: 后台运行 -p: 映射端口 3000 -> 3000
docker run -d --name nova-tv -p 3000:3000 --env PASSWORD=your_password ghcr.io/fxzer/nova-tv:latest访问 http://服务器 IP:3000 即可。(需自行到服务器控制台放通 3000 端口)
若你使用 docker compose 部署,以下是一些 compose 示例
services:
nova-tv:
image: ghcr.io/fxzer/nova-tv:latest
container_name: nova-tv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- PASSWORD=your_password
# 如需自定义配置,可挂载文件
# volumes:
# - ./config.json:/app/config.json:roservices:
nova-tv-core:
image: ghcr.io/fxzer/nova-tv:latest
container_name: nova-tv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=redis
- REDIS_URL=redis://nova-tv-redis:6379
- NEXT_PUBLIC_ENABLE_REGISTER=true
networks:
- nova-tv-network
depends_on:
- nova-tv-redis
# 如需自定义配置,可挂载文件
# volumes:
# - ./config.json:/app/config.json:ro
nova-tv-redis:
image: redis
container_name: nova-tv-redis
restart: unless-stopped
networks:
- nova-tv-network
# 如需持久化
# volumes:
# - ./data:/data
networks:
nova-tv-network:
driver: bridge建议在 fork 的仓库中启用本仓库自带的 GitHub Actions 自动同步功能(见 .github/workflows/sync.yml)。
如需手动同步主仓库更新,也可以使用 GitHub 官方的 Sync fork 功能。
| 变量 | 说明 | 可选值 | 默认值 |
|---|---|---|---|
| PASSWORD | 访问密码(所有部署方式都需要) | 任意字符串 | 1234 |
| USERNAME | 非 localstorage 部署时的管理员账号 | 任意字符串 | (空) |
| SITE_NAME | 站点名称 | 任意字符串 | nova-tv |
| 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_IMAGE_PROXY | 默认的浏览器端图片代理 | url prefix | (空) |
| NEXT_PUBLIC_DOUBAN_PROXY | 默认的浏览器端豆瓣数据代理 | url prefix | (空) |
| NEXT_PUBLIC_DISABLE_YELLOW_FILTER | 关闭色情内容过滤 | true/false | false |
所有可自定义项集中在根目录的 config.json 中:
{
"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:资源站提供的vodJSON API 根地址。name:在人机界面中展示的名称。detail:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。
custom_category:自定义分类配置,用于在导航中添加个性化的影视分类。以 type + query 作为唯一标识。支持以下字段:name:分类显示名称(可选,如不提供则使用 query 作为显示名)type:分类类型,支持movie(电影)或tv(电视剧)query:搜索关键词,用于在豆瓣 API 中搜索相关内容
custom_category 支持的自定义分类已知如下:
- movie:热门、最新、经典、豆瓣高分、冷门佳片、华语、欧美、韩国、日本、动作、喜剧、爱情、科幻、悬疑、恐怖、治愈
- tv:热门、美剧、英剧、韩剧、日剧、国产剧、港剧、日本动画、综艺、纪录片
也可输入如 "哈利波特" 效果等同于豆瓣搜索
nova-tv 支持标准的苹果 CMS V10 API 格式。
修改后 无需重新构建,服务会在启动时读取一次。
该特性目前仅支持通过非 localstorage 存储的部署方式使用
支持在运行时动态变更服务配置
设置环境变量 USERNAME 和 PASSWORD 即为站长用户,站长可设置用户为管理员
站长或管理员访问 /admin 即可进行管理员配置
目前该项目可以配合 OrionTV 在 Android TV 上使用,可以直接作为 OrionTV 后端
暂时收藏夹与播放记录和网页端隔离,后续会支持同步用户数据
- 深色模式支持
- 持久化存储(本地/云端)
- 多账户系统
- 现代化 UI 重构
- 视频信息增强展示
- 图片懒加载优化
- 搜索功能优化
- 移动端体验改进
- 组件化架构重构
- 技术栈升级到最新版本
- 更多视频播放器选项
- 个性化推荐系统
- 字幕下载与支持
- 更多主题选择
- 批量操作功能
- 观影统计功能
为了您的安全和避免潜在的法律风险,我们要求在部署时设置密码保护并强烈建议关闭公网注册:
- 避免公开访问:不设置密码的实例任何人都可以访问,可能被恶意利用
- 防范版权风险:公开的视频搜索服务可能面临版权方的投诉举报
- 保护个人隐私:设置密码可以限制访问范围,保护您的使用记录
- 设置环境变量
PASSWORD:为您的实例设置一个强密码 - 仅供个人使用:请勿将您的实例链接公开分享或传播
- 遵守当地法律:请确保您的使用行为符合当地法律法规
- 本项目仅供学习和个人使用
- 请勿将部署的实例用于商业用途或公开服务
- 如因公开分享导致的任何法律问题,用户需自行承担责任
- 项目开发者不对用户的使用行为承担任何法律责任
MIT © 2025 nova-tv & Contributors
- ts-nextjs-tailwind-starter - 项目最初基于该脚手架
- Next.js - 强大的 React 全栈框架
- Tailwind CSS - 优秀的 CSS 框架
- ArtPlayer - 提供强大的网页视频播放器
- HLS.js - 实现 HLS 流媒体在浏览器中的播放支持
- VidStack - 现代化的媒体播放器框架
- 感谢所有提供免费影视接口的站点
- 感谢所有为开源社区做出贡献的开发者们
- 感谢 Anthony Fu 的优秀 ESLint 配置 (@antfu/eslint-config)