🎉 Release KatelyaTV v2.0.0 - Major Update with IPTV Support

 New Features:
- 📺 IPTV Live TV support with M3U playlist import
- 🎮 Advanced channel management and favorites
- �� Mobile-optimized IPTV player
- 🔄 Multiple import methods (URL/File upload)

🛠️ Technical Improvements:
- 🚀 Cloudflare Pages optimization (removed Docker)
- 📱 iOS Safari compatibility fixes
- 🎨 Modern UI/UX enhancements
-  Performance optimizations

🔧 Development:
- 📦 Updated to v2.0.0
- 📚 Comprehensive documentation update
- 🛡️ Enhanced security and error handling
- 🌐 Better responsive design

Breaking Changes:
- Removed Docker deployment support
- Focus on Cloudflare Pages deployment
- Updated environment variables

This release transforms KatelyaTV into a comprehensive
streaming platform with both VOD and live TV capabilities.
This commit is contained in:
Cursor Agent
2025-08-29 04:39:36 +00:00
parent 303263d513
commit d811fb5aa6
13 changed files with 1212 additions and 491 deletions
+182 -171
View File
@@ -1,10 +1,10 @@
# MoonTV
# KatelyaTV
<div align="center">
<img src="public/logo.png" alt="LibreTV Logo" width="120">
<img src="public/logo.png" alt="KatelyaTV Logo" width="120">
</div>
> 🎬 **MoonTV** 是一个开箱即用的、跨平台的影视聚合播放器。它基于 **Next.js 14** + **Tailwind&nbsp;CSS** + **TypeScript** 构建,支持多资源搜索、在线播放、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。
> 🎬 **KatelyaTV** 是一个开箱即用的、跨平台的影视聚合播放器。它基于 **Next.js 14** + **Tailwind CSS** + **TypeScript** 构建,支持多资源搜索、在线播放、IPTV直播、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。
<div align="center">
@@ -12,7 +12,7 @@
![TailwindCSS](https://img.shields.io/badge/TailwindCSS-3-38bdf8?logo=tailwindcss)
![TypeScript](https://img.shields.io/badge/TypeScript-4.x-3178c6?logo=typescript)
![License](https://img.shields.io/badge/License-MIT-green)
![Docker Ready](https://img.shields.io/badge/Docker-ready-blue?logo=docker)
![Cloudflare Ready](https://img.shields.io/badge/Cloudflare-ready-orange?logo=cloudflare)
</div>
@@ -20,14 +20,16 @@
## ✨ 功能特性
- 🔍 **多源聚合搜索**:内置数十个免费资源站点,一次搜索立刻返回全源结果
- 📄 **丰富详情页**:支持剧集列表、演员、年份、简介等完整信息展示
- ▶️ **流畅在线播放**:集成 HLS.js & ArtPlayer
- ❤️ **收藏 + 继续观看**:支持 Redis/D1 存储,多端同步进度。
- 📱 **PWA**:离线缓存、安装到桌面/主屏,移动端原生体验。
- 🌗 **响应式布局**桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
- 🚀 **极简部署**一条 Docker 命令即可将完整服务跑起来,或免费部署到 Vercel 和 Cloudflare。
- 👿 **智能去广告**自动跳过视频中的切片广告(实验性)
- 🔍 **多源聚合搜索**:内置数十个免费资源站点,一次搜索立刻返回全源结果
- 📄 **丰富详情页**:支持剧集列表、演员、年份、简介等完整信息展示
- ▶️ **流畅在线播放**:集成 HLS.js & ArtPlayer,支持多种视频格式
- 📺 **IPTV直播功能**:支持M3U播放列表,观看电视直播频道
- ❤️ **收藏 + 继续观看**:支持 Cloudflare D1/Upstash Redis 存储,多端同步进度
- 📱 **PWA支持**离线缓存、安装到桌面/主屏,移动端原生体验
- 🌗 **响应式布局**桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸
- 🚀 **极简部署**专为Cloudflare Pages优化,免费部署到全球CDN
- 🎨 **精美UI设计**:酷炫特效、iOS Safari兼容,现代化界面设计
- 🌍 **多平台支持**Web、移动端、AndroidTV完美适配
<details>
<summary>点击查看项目截图</summary>
@@ -39,14 +41,15 @@
## 🗺 目录
- [技术栈](#技术栈)
- [部署](#部署)
- [Docker Compose 最佳实践](#Docker-Compose-最佳实践)
- [快速部署](#快速部署)
- [Cloudflare Pages 部署](#cloudflare-pages-部署)
- [环境变量](#环境变量)
- [配置说明](#配置说明)
- [IPTV功能](#iptv功能)
- [管理员配置](#管理员配置)
- [AndroidTV 使用](#AndroidTV-使用)
- [Roadmap](#roadmap)
- [AndroidTV 使用](#androidtv-使用)
- [安全与隐私提醒](#安全与隐私提醒)
- [更新日志](#更新日志)
- [License](#license)
- [致谢](#致谢)
@@ -55,172 +58,128 @@
| 分类 | 主要依赖 |
| --------- | ----------------------------------------------------------------------------------------------------- |
| 前端框架 | [Next.js 14](https://nextjs.org/) · App Router |
| UI & 样式 | [Tailwind&nbsp;CSS 3](https://tailwindcss.com/) |
| UI & 样式 | [Tailwind CSS 3](https://tailwindcss.com/) |
| 语言 | TypeScript 4 |
| 播放器 | [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) · [HLS.js](https://github.com/video-dev/hls.js/) |
| 代码质量 | ESLint · Prettier · Jest |
| 部署 | Docker · Vercel · CloudFlare pages |
| 部署 | Cloudflare Pages · Vercel |
## 部署
## 快速部署
本项目**支持 Vercel、Docker 和 Cloudflare** 部署。
本项目专为 **Cloudflare Pages** 优化,推荐使用Cloudflare部署以获得最佳性能
存储支持矩阵
### 一键部署到Cloudflare Pages
| | Docker | Vercel | Cloudflare |
| :-----------: | :----: | :----: | :--------: |
| localstorage | ✅ | ✅ | ✅ |
| 原生 redis | ✅ | | |
| Cloudflare D1 | | | ✅ |
| Upstash Redis | ☑️ | ✅ | ☑️ |
[![Deploy to Cloudflare Pages](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/katelya77/KatelyaTV)
✅:经测试支持
## Cloudflare Pages 部署
☑️:理论上支持,未测试
**Cloudflare Pages 的环境变量建议设置为密钥而非文本**
localstorage 方式外,其他方式都支持多账户、记录同步和管理页面
### 基础部署(localstorage
### Vercel 部署
1. **Fork** 本仓库到你的 GitHub 账户
2. 登陆 [Cloudflare](https://cloudflare.com),点击 **Workers 和 Pages****创建应用程序****Pages**
3. 选择 **连接到 Git**,选择 Fork 后的仓库
4. 构建设置:
- **构建命令**: `pnpm install --frozen-lockfile && pnpm run pages:build`
- **构建输出目录**: `.vercel/output/static`
- **Root目录**: `/` (留空)
5. 点击 **保存并部署**
6. 部署完成后,进入 **设置****环境变量**,添加 `PASSWORD` 变量(设置为密钥)
7.**设置****函数** 中,将兼容性标志设置为 `nodejs_compat`
8. **重新部署**
#### 普通部署(localstorage
### D1 数据库支持(推荐
1. **Fork** 本仓库到你的 GitHub 账户。
2. 登陆 [Vercel](https://vercel.com/),点击 **Add New → Project**,选择 Fork 后的仓库。
3. 设置 PASSWORD 环境变量。
4. 保持默认设置完成首次部署。
5. 如需自定义 `config.json`,请直接修改 Fork 后仓库中该文件。
6. 每次 Push 到 `main` 分支将自动触发重新构建。
0. 完成基础部署并成功访问
1. 在Cloudflare控制台,点击 **Workers 和 Pages****D1 SQL 数据库****创建数据库**
2. 数据库名称可任意设置,点击创建
3. 进入数据库,点击 **控制台**,复制粘贴以下SQL并运行:
部署完成后即可通过分配的域名访问,也可以绑定自定义域名。
```sql
-- 用户表
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
isAdmin INTEGER DEFAULT 0,
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP
);
#### Upstash Redis 支持
-- 播放记录表
CREATE TABLE IF NOT EXISTS play_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
userId INTEGER NOT NULL,
vodId TEXT NOT NULL,
episodeIndex INTEGER DEFAULT 0,
currentTime REAL DEFAULT 0,
duration REAL DEFAULT 0,
title TEXT,
episodeTitle TEXT,
poster TEXT,
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (userId) REFERENCES users (id) ON DELETE CASCADE
);
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. 重试部署
-- 收藏表
CREATE TABLE IF NOT EXISTS favorites (
id INTEGER PRIMARY KEY AUTOINCREMENT,
userId INTEGER NOT NULL,
vodId TEXT NOT NULL,
title TEXT,
poster TEXT,
year TEXT,
type TEXT,
rating TEXT,
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (userId) REFERENCES users (id) ON DELETE CASCADE,
UNIQUE(userId, vodId)
);
### 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 部署
#### 1. 直接运行(最简单)
```bash
# 拉取预构建镜像
docker pull ghcr.io/senshinya/moontv:latest
# 运行容器
# -d: 后台运行 -p: 映射端口 3000 -> 3000
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:latest
-- 创建索引提高查询性能
CREATE INDEX IF NOT EXISTS idx_play_records_user_vod ON play_records(userId, vodId);
CREATE INDEX IF NOT EXISTS idx_favorites_user ON favorites(userId);
CREATE INDEX IF NOT EXISTS idx_play_records_updated ON play_records(updatedAt);
```
访问 `http://服务器 IP:3000` 即可。(需自行到服务器控制台放通 `3000` 端口)
4. 返回Pages项目,进入 **设置****函数****D1 数据库绑定****添加绑定**
5. 变量名称填 `DB`,选择刚创建的数据库
6. 设置环境变量:
- `NEXT_PUBLIC_STORAGE_TYPE`: `d1`
- `USERNAME`: 管理员用户名
- `PASSWORD`: 管理员密码
7. **重新部署**
## Docker Compose 最佳实践
### Upstash Redis 支持
若你使用 docker compose 部署,以下是一些 compose 示例
如果你更喜欢使用Redis
### local storage 版本
```yaml
services:
moontv:
image: ghcr.io/senshinya/moontv:latest
container_name: moontv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- PASSWORD=your_password
# 如需自定义配置,可挂载文件
# volumes:
# - ./config.json:/app/config.json:ro
```
### Redis 版本(推荐,多账户数据隔离,跨设备同步)
```yaml
services:
moontv-core:
image: ghcr.io/senshinya/moontv:latest
container_name: moontv
restart: unless-stopped
ports:
- '3000:3000'
environment:
- USERNAME=admin
- PASSWORD=admin_password
- NEXT_PUBLIC_STORAGE_TYPE=redis
- REDIS_URL=redis://moontv-redis:6379
- NEXT_PUBLIC_ENABLE_REGISTER=true
networks:
- moontv-network
depends_on:
- moontv-redis
# 如需自定义配置,可挂载文件
# volumes:
# - ./config.json:/app/config.json:ro
moontv-redis:
image: redis
container_name: moontv-redis
restart: unless-stopped
networks:
- moontv-network
# 如需持久化
# volumes:
# - ./data:/data
networks:
moontv-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) 功能。
1. 在 [Upstash](https://upstash.com/) 注册并创建Redis实例
2. 复制 **HTTPS ENDPOINT****TOKEN**
3. 在Cloudflare Pages设置环境变量:
- `NEXT_PUBLIC_STORAGE_TYPE`: `upstash`
- `UPSTASH_URL`: Redis端点URL
- `UPSTASH_TOKEN`: Redis令牌
- `USERNAME`: 管理员用户名
- `PASSWORD`: 管理员密码
4. **重新部署**
## 环境变量
| 变量 | 说明 | 可选值 | 默认值 |
| --------------------------- | ----------------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| USERNAME | redis 部署时的管理员账号 | 任意字符串 | (空) |
| PASSWORD | 默认部署时为唯一访问密码,redis 部署时为管理员密码 | 任意字符串 | (空) |
| SITE_NAME | 站点名称 | 任意字符串 | MoonTV |
| USERNAME | 管理员账号(非localstorage存储时必填) | 任意字符串 | (空) |
| PASSWORD | 访问密码/管理员密码 | 任意字符串 | (空) |
| NEXT_PUBLIC_SITE_NAME | 站点名称 | 任意字符串 | KatelyaTV |
| ANNOUNCEMENT | 站点公告 | 任意字符串 | 本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。 |
| NEXT_PUBLIC_STORAGE_TYPE | 播放记录/收藏的存储方式 | localstorage、redis、d1、upstash | localstorage |
| REDIS_URL | redis 连接 url,若 NEXT_PUBLIC_STORAGE_TYPE 为 redis 则必填 | 连接 url | 空 |
| NEXT_PUBLIC_STORAGE_TYPE | 播放记录/收藏的存储方式 | localstorage、d1、upstash | localstorage |
| 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 | (空) |
## 配置说明
@@ -236,24 +195,57 @@ networks:
"detail": "http://caiji.dyttzyapi.com"
}
// ...更多站点
}
},
"custom_category": [
{
"name": "华语",
"type": "movie",
"query": "华语"
}
]
}
```
- `cache_time`:接口缓存时间(秒)
- `cache_time`:接口缓存时间(秒)
- `api_site`:你可以增删或替换任何资源站,字段说明:
- `key`:唯一标识,保持小写字母/数字
- `api`:资源站提供的 `vod` JSON API 根地址
- `name`:在人机界面中展示的名称
- `detail`:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取
- `key`:唯一标识,保持小写字母/数字
- `api`:资源站提供的 `vod` JSON API 根地址
- `name`:在人机界面中展示的名称
- `detail`:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取
- `custom_category`:自定义分类配置,用于在导航中添加个性化的影视分类
MoonTV 支持标准的苹果 CMS V10 API 格式。
KatelyaTV 支持标准的苹果 CMS V10 API 格式。
修改后 **无需重新构建**,服务会在启动时读取一次。
## IPTV功能
KatelyaTV 内置强大的IPTV直播功能,支持:
### 功能特性
- 📺 **M3U播放列表支持**:导入标准M3U/M3U8格式的频道列表
- 🔄 **多种导入方式**:支持URL加载、文件上传两种方式
- 💾 **频道管理**:分组显示、搜索过滤、收藏功能
- 🎮 **播放控制**:音量调节、全屏播放、频道切换
- 📱 **移动端优化**:响应式设计,移动设备完美适配
- 💫 **流畅播放**:基于HLS.js,支持各种直播流格式
### 使用方法
1. 访问 `/iptv` 页面
2. 通过以下方式导入频道:
- **URL导入**:粘贴M3U播放列表链接,点击"加载"
- **文件导入**:上传本地M3U文件
3. 从频道列表中选择要观看的频道
4. 享受高清直播内容
### 支持的频道源
- 免费的IPTV频道
- 公开的M3U播放列表
- 自建的直播源
## 管理员配置
**该特性目前仅支持通过非 localstorage 存储的部署方式使用**
**该特性仅支持通过非 localstorage 存储的部署方式使用**
支持在运行时动态变更服务配置
@@ -265,13 +257,7 @@ MoonTV 支持标准的苹果 CMS V10 API 格式。
目前该项目可以配合 [OrionTV](https://github.com/zimplexing/OrionTV) 在 Android TV 上使用,可以直接作为 OrionTV 后端
暂时收藏夹与播放记录和网页端隔离,后续会支持同步用户数据
## Roadmap
- [x] 深色模式
- [x] 持久化存储
- [x] 多账户
支持播放记录和网页端同步
## 安全与隐私提醒
@@ -296,14 +282,39 @@ MoonTV 支持标准的苹果 CMS V10 API 格式。
- 如因公开分享导致的任何法律问题,用户需自行承担责任
- 项目开发者不对用户的使用行为承担任何法律责任
## 更新日志
### v2.0.0 (最新)
- 🎉 **新增IPTV直播功能**:支持M3U播放列表,观看电视直播
- 🔧 **修复iOS Safari兼容性**:登录界面在iOS设备上完美显示
- 🚀 **优化Cloudflare部署**:专门为Cloudflare Pages优化
- 🎨 **UI界面升级**:更加现代化的设计,保留酷炫特效
- 📱 **移动端体验改进**:更好的响应式设计和触控体验
- 🛠️ **代码质量提升**:TypeScript严格模式,更好的错误处理
### v1.0.0
- 🔍 多源聚合搜索功能
- ▶️ 在线视频播放
- ❤️ 收藏和播放记录
- 📱 PWA支持
- 🌗 深色模式
## License
[MIT](LICENSE) © 2025 MoonTV & Contributors
[MIT](LICENSE) © 2025 KatelyaTV & Contributors
## 致谢
- [ts-nextjs-tailwind-starter](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter) — 项目最初基于该脚手架。
- [LibreTV](https://github.com/LibreSpark/LibreTV) — 由此启发,站在巨人的肩膀上。
- [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) — 提供强大的网页视频播放器。
- [HLS.js](https://github.com/video-dev/hls.js) — 实现 HLS 流媒体在浏览器中的播放支持。
- 感谢所有提供免费影视接口的站点。
- [LunaTV](https://github.com/MoonTechLab/LunaTV) — 功能参考和灵感来源
- [ts-nextjs-tailwind-starter](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter) — 项目最初基于该脚手架
- [LibreTV](https://github.com/LibreSpark/LibreTV) — 由此启发,站在巨人的肩膀上
- [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) — 提供强大的网页视频播放器
- [HLS.js](https://github.com/video-dev/hls.js) — 实现 HLS 流媒体在浏览器中的播放支持
- 感谢所有提供免费影视接口的站点
---
<div align="center">
<p>如果这个项目对你有帮助,请给一个 ⭐️ Star 支持一下!</p>
<p>Made with ❤️ by KatelyaTV Team</p>
</div>