# nova-tv **Repository Path**: fxzer/nova-tv ## Basic Information - **Project Name**: nova-tv - **Description**: 是一个现代化、功能丰富的影视聚合播放器,基于MoonTV - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-14 - **Last Updated**: 2025-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

nova-tv

nova-tv Logo
> 🎬 **nova-tv** 是一个现代化、功能丰富的影视聚合播放器,基于 [MoonTV](https://github.com/samqin123/MoonTV) 项目深度优化改进。它采用最新的 **Next.js 15** + **Tailwind CSS v4** + **TypeScript 5** 技术栈,提供流畅的用户体验、增强的 UI 组件和更完善的播放功能。
![Next.js](https://img.shields.io/badge/Next.js-15.5.5-000?logo=nextdotjs) ![TailwindCSS](https://img.shields.io/badge/TailwindCSS-v4-38bdf8?logo=tailwindcss) ![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178c6?logo=typescript) ![React](https://img.shields.io/badge/React-19.2.0-61dafb?logo=react) ![License](https://img.shields.io/badge/License-MIT-green) ![Docker Ready](https://img.shields.io/badge/Docker-ready-blue?logo=docker)
--- ## 🌟 nova-tv 改进亮点 nova-tv 在原版 MoonTV 基础上进行了全面优化和增强,主要包括: - **🛠 技术栈升级**:升级到 Next.js 15、React 19、Tailwind CSS v4 等最新技术 - **🎯 现代化 UI/UX**:重构了整个用户界面,提供更美观、更流畅的使用体验 - **⚡ 性能优化**:图片懒加载、组件优化、加载状态改进,显著提升应用性能 - **📱 移动端优化**:针对移动设备进行了专门的界面和交互优化 ## ✨ 功能特性 ### 🔥 核心功能 - 🔍 **多源聚合搜索**:内置数十个免费资源站点,一次搜索立刻返回全源结果 - 📄 **丰富详情页**:支持剧集列表、演员、年份、简介等完整信息展示 - ▶️ **流畅在线播放**:集成 HLS.js & ArtPlayer,支持多种视频格式 - ❤️ **收藏 + 继续观看**:支持 Redis/D1/Upstash 存储,多端同步进度 - 📱 **PWA 支持**:离线缓存、安装到桌面/主屏,移动端原生体验 - 🌗 **响应式布局**:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸 - 👿 **智能去广告**:自动跳过视频中的切片广告(实验性) ### 🆕 nova-tv 特色优化 - 🎨 **现代化 UI 组件**:全新设计的视频卡片、空状态页面和加载动画 - 📊 **增强的视频信息展示**:视频卡片显示年份、评分、集数等详细信息 - 🖼️ **图片懒加载优化**:提升页面加载速度,减少带宽消耗 - 🎭 **组件化架构重构**:抽离封装播放面板、源选择器、收藏按钮等组件 - 🎪 **优化搜索体验**:搜索结果分组排序展示,支持搜索历史功能 - 📱 **移动端体验优化**:改进移动端布局和交互体验 - 🎯 **加载状态优化**:更友好的加载提示和骨架屏设计 - 🔧 **代码质量提升**:使用 @antfu/eslint-config,禁用显示的 any 类型,提升代码规范性 - 🚀 **技术栈升级**:升级到 Next.js 15、React 19、Tailwind CSS v4 等最新技术栈
点击查看项目截图 项目截图 项目截图
## 🗺 目录 - [技术栈](#技术栈) - [部署](#部署) - [Docker Compose 最佳实践](#Docker-Compose-最佳实践) - [环境变量](#环境变量) - [配置说明](#配置说明) - [管理员配置](#管理员配置) - [AndroidTV 使用](#AndroidTV-使用) - [Roadmap](#roadmap) - [安全与隐私提醒](#安全与隐私提醒) - [License](#license) - [致谢](#致谢) ## 🛠 技术栈 | 分类 | 主要依赖 | | --------- | ---------------------------------------------------------------------------------------------------------------- | | 前端框架 | [Next.js 15.5.5](https://nextjs.org/) · App Router · React 19.2.0 | | UI & 样式 | [Tailwind CSS v4](https://tailwindcss.com/) · Framer Motion · Lucide React | | 语言 | TypeScript 5.9 | | 播放器 | [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) · [HLS.js](https://github.com/video-dev/hls.js/) · VidStack | | 状态管理 | [TanStack Query](https://tanstack.com/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 方式外,其他方式都支持多账户、记录同步和管理页面 ### Vercel 部署 #### 普通部署(localstorage) 1. **Fork** 本仓库到你的 GitHub 账户。 2. 登陆 [Vercel](https://vercel.com/),点击 **Add New → Project**,选择 Fork 后的仓库。 3. 设置 PASSWORD 环境变量。 4. 保持默认设置完成首次部署。 5. 如需自定义 `config.json`,请直接修改 Fork 后仓库中该文件。 6. 每次 Push 到 `main` 分支将自动触发重新构建。 部署完成后即可通过分配的域名访问,也可以绑定自定义域名。 #### Upstash Redis 支持 0. 完成普通部署并成功访问。 1. 在 [upstash](https://upstash.com/) 注册账号并新建一个 Redis 实例,名称任意。 2. 复制新数据库的 **HTTPS ENDPOINT 和 TOKEN** 3. 返回你的 Vercel 项目,新增环境变量 **UPSTASH_URL 和 UPSTASH_TOKEN**,值为第二步复制的 endpoint 和 token 4. 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 **upstash**;设置 USERNAME 和 PASSWORD 作为站长账号 5. 重试部署 ### Cloudflare 部署 **Cloudflare Pages 的环境变量尽量设置为密钥而非文本** #### 普通部署(localstorage) 1. **Fork** 本仓库到你的 GitHub 账户。 2. 登陆 [Cloudflare](https://cloudflare.com),点击 **计算(Workers)-> Workers 和 Pages**,点击创建 3. 选择 Pages,导入现有的 Git 存储库,选择 Fork 后的仓库 4. 构建命令填写 **pnpm install --frozen-lockfile && pnpm run pages:build**,预设框架为无,**构建输出目录**为 `.vercel/output/static` 5. 保持默认设置完成首次部署。进入设置,将兼容性标志设置为 `nodejs_compat`,无需选择,直接粘贴 6. 首次部署完成后进入设置,新增 PASSWORD 密钥(变量和机密下),而后重试部署。 7. 如需自定义 `config.json`,请直接修改 Fork 后仓库中该文件。 8. 每次 Push 到 `main` 分支将自动触发重新构建。 #### D1 支持 0. 完成普通部署并成功访问 1. 点击 **存储和数据库 -> D1 SQL 数据库**,创建一个新的数据库,名称随意 2. 进入刚创建的数据库,点击左上角的 Explore Data,将[D1 初始化](D1初始化.md) 中的内容粘贴到 Query 窗口后点击 **Run All**,等待运行完成 3. 返回你的 pages 项目,进入 **设置 -> 绑定**,添加绑定 D1 数据库,选择你刚创建的数据库,变量名称填 **DB** 4. 设置环境变量 NEXT_PUBLIC_STORAGE_TYPE,值为 **d1**;设置 USERNAME 和 PASSWORD 作为站长账号 5. 重试部署 ### Docker 部署 #### Docker 快速部署 #### 🐳 使用 Docker Compose(推荐) ```bash # 克隆项目 git clone <你的仓库地址> nova-tv cd nova-tv # 配置环境变量(可选) cp .env.example .env # 编辑 .env 文件设置你的密码 # 启动服务 docker-compose up -d ``` 访问 `http://localhost:3000`,默认密码:**1234** 详细部署指南请查看:[DOCKER_DEPLOY.md](./DOCKER_DEPLOY.md) #### 🔧 使用 PM2 部署 ```bash # 安装 PM2 npm install -g pm2 # 构建项目 pnpm build # 设置环境变量 export PASSWORD=你的密码 # 启动应用 pm2 start ecosystem.config.cjs ``` 访问 `http://localhost:3000`,默认密码:**1234** 详细部署指南请查看:[PM2_DEPLOY.md](./PM2_DEPLOY.md) ### 1. 直接运行(最简单,localstorage) ```bash # 拉取预构建镜像 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 最佳实践 若你使用 docker compose 部署,以下是一些 compose 示例 ### local storage 版本 ```yaml 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:ro ``` ### Redis 版本(推荐,多账户数据隔离,跨设备同步) ```yaml services: 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](https://docs.github.com/cn/github/collaborating-with-issues-and-pull-requests/syncing-a-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` 中: ```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`:资源站提供的 `vod` JSON 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` 即可进行管理员配置 ## AndroidTV 使用 目前该项目可以配合 [OrionTV](https://github.com/zimplexing/OrionTV) 在 Android TV 上使用,可以直接作为 OrionTV 后端 暂时收藏夹与播放记录和网页端隔离,后续会支持同步用户数据 ## 🗺️ Roadmap ### 已完成功能 ✅ - [x] 深色模式支持 - [x] 持久化存储(本地/云端) - [x] 多账户系统 - [x] 现代化 UI 重构 - [x] 视频信息增强展示 - [x] 图片懒加载优化 - [x] 搜索功能优化 - [x] 移动端体验改进 - [x] 组件化架构重构 - [x] 技术栈升级到最新版本 ### 计划功能 📋 - [ ] 更多视频播放器选项 - [ ] 个性化推荐系统 - [ ] 字幕下载与支持 - [ ] 更多主题选择 - [ ] 批量操作功能 - [ ] 观影统计功能 ## 安全与隐私提醒 ### 请设置密码保护并关闭公网注册 为了您的安全和避免潜在的法律风险,我们要求在部署时设置密码保护并**强烈建议关闭公网注册**: - **避免公开访问**:不设置密码的实例任何人都可以访问,可能被恶意利用 - **防范版权风险**:公开的视频搜索服务可能面临版权方的投诉举报 - **保护个人隐私**:设置密码可以限制访问范围,保护您的使用记录 ### 部署要求 1. **设置环境变量 `PASSWORD`**:为您的实例设置一个强密码 2. **仅供个人使用**:请勿将您的实例链接公开分享或传播 3. **遵守当地法律**:请确保您的使用行为符合当地法律法规 ### 重要声明 - 本项目仅供学习和个人使用 - 请勿将部署的实例用于商业用途或公开服务 - 如因公开分享导致的任何法律问题,用户需自行承担责任 - 项目开发者不对用户的使用行为承担任何法律责任 ## 📄 License [MIT](LICENSE) © 2025 nova-tv & Contributors ## 🙏 致谢 ### 原始项目 - [MoonTV](https://github.com/samqin123/MoonTV) - 本项目基于 MoonTV 进行深度优化改进 - [LibreTV](https://github.com/LibreSpark/LibreTV) - 提供了优秀的设计灵感和技术参考 ### 技术栈与工具 - [ts-nextjs-tailwind-starter](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter) - 项目最初基于该脚手架 - [Next.js](https://nextjs.org/) - 强大的 React 全栈框架 - [Tailwind CSS](https://tailwindcss.com/) - 优秀的 CSS 框架 - [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) - 提供强大的网页视频播放器 - [HLS.js](https://github.com/video-dev/hls.js) - 实现 HLS 流媒体在浏览器中的播放支持 - [VidStack](https://vidstack.dev/) - 现代化的媒体播放器框架 ### 特别感谢 - 感谢所有提供免费影视接口的站点 - 感谢所有为开源社区做出贡献的开发者们 - 感谢 Anthony Fu 的优秀 ESLint 配置 (@antfu/eslint-config)