update
parent
c65d7e0e56
commit
1969ddfe59
|
@ -0,0 +1,214 @@
|
||||||
|
# MoonTV 环境变量配置示例
|
||||||
|
# 复制此文件为 .env.local 并根据需要修改
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 基础配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 站点访问密码(必填)
|
||||||
|
# 用于保护站点访问,防止公开访问
|
||||||
|
PASSWORD=your_secure_password_here
|
||||||
|
|
||||||
|
# 站点名称
|
||||||
|
# 在页面标题和界面中显示的名称
|
||||||
|
SITE_NAME=MoonTV
|
||||||
|
|
||||||
|
# 站点公告
|
||||||
|
# 显示在页面顶部的公告信息
|
||||||
|
ANNOUNCEMENT=本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 存储配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 存储类型
|
||||||
|
# 可选值: localstorage, redis, d1, upstash
|
||||||
|
# localstorage: 本地存储,单用户,数据不持久化
|
||||||
|
# redis: Redis 数据库,多用户,数据持久化
|
||||||
|
# d1: Cloudflare D1 数据库,多用户,数据持久化
|
||||||
|
# upstash: Upstash Redis,多用户,数据持久化
|
||||||
|
NEXT_PUBLIC_STORAGE_TYPE=localstorage
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Redis 配置 (当 NEXT_PUBLIC_STORAGE_TYPE=redis 时使用)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Redis 连接 URL
|
||||||
|
# 格式: redis://username:password@host:port/database
|
||||||
|
# 示例: redis://localhost:6379/0
|
||||||
|
REDIS_URL=redis://localhost:6379/0
|
||||||
|
|
||||||
|
# Redis 密码 (如果 Redis 需要认证)
|
||||||
|
# REDIS_PASSWORD=your_redis_password
|
||||||
|
|
||||||
|
# Redis 数据库编号 (可选,默认为 0)
|
||||||
|
# REDIS_DB=0
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Upstash Redis 配置 (当 NEXT_PUBLIC_STORAGE_TYPE=upstash 时使用)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Upstash Redis 连接 URL
|
||||||
|
# 从 Upstash 控制台获取
|
||||||
|
UPSTASH_URL=https://your-instance.upstash.io
|
||||||
|
|
||||||
|
# Upstash Redis 访问令牌
|
||||||
|
# 从 Upstash 控制台获取
|
||||||
|
UPSTASH_TOKEN=your_upstash_token
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Cloudflare D1 配置 (当 NEXT_PUBLIC_STORAGE_TYPE=d1 时使用)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# D1 数据库绑定名称
|
||||||
|
# 在 Cloudflare Pages 中配置的绑定名称
|
||||||
|
# 通常为 "DB"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 用户管理配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 管理员用户名 (当使用非 localstorage 存储时)
|
||||||
|
# 用于创建第一个管理员账户
|
||||||
|
USERNAME=admin
|
||||||
|
|
||||||
|
# 是否开放用户注册
|
||||||
|
# 可选值: true, false
|
||||||
|
# 仅在非 localstorage 部署时生效
|
||||||
|
NEXT_PUBLIC_ENABLE_REGISTER=false
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 搜索配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 搜索接口可拉取的最大页数
|
||||||
|
# 范围: 1-50
|
||||||
|
# 建议值: 5-10
|
||||||
|
NEXT_PUBLIC_SEARCH_MAX_PAGE=5
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 代理配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 默认的浏览器端图片代理
|
||||||
|
# 用于解决图片跨域问题
|
||||||
|
# 示例: https://images.weserv.nl/
|
||||||
|
NEXT_PUBLIC_IMAGE_PROXY=
|
||||||
|
|
||||||
|
# 默认的浏览器端豆瓣数据代理
|
||||||
|
# 用于解决豆瓣 API 跨域问题
|
||||||
|
# 示例: https://api.allorigins.win/raw?url=
|
||||||
|
NEXT_PUBLIC_DOUBAN_PROXY=
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 开发环境配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 开发环境标识
|
||||||
|
# 可选值: development, production, test
|
||||||
|
NODE_ENV=development
|
||||||
|
|
||||||
|
# 调试模式
|
||||||
|
# 可选值: true, false
|
||||||
|
DEBUG=false
|
||||||
|
|
||||||
|
# 日志级别
|
||||||
|
# 可选值: error, warn, info, debug
|
||||||
|
LOG_LEVEL=info
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 性能配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 接口缓存时间 (秒)
|
||||||
|
# 建议值: 3600-7200 (1-2小时)
|
||||||
|
CACHE_TIME=7200
|
||||||
|
|
||||||
|
# 最大并发请求数
|
||||||
|
# 建议值: 5-10
|
||||||
|
MAX_CONCURRENT_REQUESTS=5
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 安全配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 会话超时时间 (毫秒)
|
||||||
|
# 建议值: 3600000-86400000 (1小时-24小时)
|
||||||
|
SESSION_TIMEOUT=3600000
|
||||||
|
|
||||||
|
# 最大登录尝试次数
|
||||||
|
# 建议值: 3-5
|
||||||
|
MAX_LOGIN_ATTEMPTS=3
|
||||||
|
|
||||||
|
# 登录锁定时间 (毫秒)
|
||||||
|
# 建议值: 900000-3600000 (15分钟-1小时)
|
||||||
|
LOGIN_LOCKOUT_TIME=900000
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 第三方服务配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 豆瓣 API 配置
|
||||||
|
# 如果需要使用豆瓣官方 API
|
||||||
|
# DOUBAN_API_KEY=your_douban_api_key
|
||||||
|
# DOUBAN_API_SECRET=your_douban_api_secret
|
||||||
|
|
||||||
|
# 图片存储服务配置
|
||||||
|
# 如果需要使用云存储服务
|
||||||
|
# IMAGE_STORAGE_PROVIDER=aws_s3
|
||||||
|
# AWS_ACCESS_KEY_ID=your_aws_access_key
|
||||||
|
# AWS_SECRET_ACCESS_KEY=your_aws_secret_key
|
||||||
|
# AWS_REGION=us-east-1
|
||||||
|
# AWS_S3_BUCKET=your_bucket_name
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 监控和分析配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 是否启用性能监控
|
||||||
|
# 可选值: true, false
|
||||||
|
ENABLE_MONITORING=false
|
||||||
|
|
||||||
|
# 是否启用错误追踪
|
||||||
|
# 可选值: true, false
|
||||||
|
ENABLE_ERROR_TRACKING=false
|
||||||
|
|
||||||
|
# 是否启用用户行为分析
|
||||||
|
# 可选值: true, false
|
||||||
|
ENABLE_ANALYTICS=false
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 部署环境特定配置
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Vercel 部署配置
|
||||||
|
# VERCEL_URL=your-vercel-url.vercel.app
|
||||||
|
|
||||||
|
# Cloudflare Pages 部署配置
|
||||||
|
# CF_PAGES_URL=your-project.pages.dev
|
||||||
|
|
||||||
|
# Docker 部署配置
|
||||||
|
# DOCKER_IMAGE_TAG=latest
|
||||||
|
# DOCKER_CONTAINER_NAME=moontv
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 注意事项
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 1. 请根据实际部署环境修改相应的配置
|
||||||
|
# 2. 敏感信息(如密码、密钥)请使用环境变量或密钥管理服务
|
||||||
|
# 3. 生产环境请设置强密码和适当的访问控制
|
||||||
|
# 4. 定期更新依赖包以修复安全漏洞
|
||||||
|
# 5. 监控应用性能和错误日志
|
||||||
|
# 6. 备份重要数据
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 配置验证
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# 启动应用前请确保以下配置正确:
|
||||||
|
# - PASSWORD 已设置(必填)
|
||||||
|
# - 如果使用 Redis,REDIS_URL 已正确配置
|
||||||
|
# - 如果使用 Upstash,UPSTASH_URL 和 UPSTASH_TOKEN 已配置
|
||||||
|
# - 如果使用 D1,已在 Cloudflare Pages 中配置绑定
|
||||||
|
# - 其他可选配置根据实际需求设置
|
|
@ -0,0 +1,158 @@
|
||||||
|
# GitHub Release 配置文件
|
||||||
|
# 用于自动化版本发布管理
|
||||||
|
|
||||||
|
# 发布标题模板
|
||||||
|
name-template: 'v$RESOLVED_VERSION'
|
||||||
|
# 发布标签模板
|
||||||
|
tag-template: 'v$RESOLVED_VERSION'
|
||||||
|
|
||||||
|
# 发布说明模板
|
||||||
|
body-template: |
|
||||||
|
## 🎉 新版本发布
|
||||||
|
|
||||||
|
**版本号**: $RESOLVED_VERSION
|
||||||
|
**发布日期**: $RELEASE_DATE
|
||||||
|
|
||||||
|
### ✨ 新功能
|
||||||
|
$CHANGES
|
||||||
|
|
||||||
|
### 🐛 修复
|
||||||
|
$FIXES
|
||||||
|
|
||||||
|
### 🔧 改进
|
||||||
|
$IMPROVEMENTS
|
||||||
|
|
||||||
|
### 📝 文档更新
|
||||||
|
$DOCS
|
||||||
|
|
||||||
|
### 🚀 部署说明
|
||||||
|
|
||||||
|
#### Docker 部署
|
||||||
|
```bash
|
||||||
|
docker pull ghcr.io/senshinya/moontv:v$RESOLVED_VERSION
|
||||||
|
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:v$RESOLVED_VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 环境变量更新
|
||||||
|
请查看 [README.md](README.md) 了解最新的环境变量配置。
|
||||||
|
|
||||||
|
### 📋 完整更新日志
|
||||||
|
查看 [CHANGELOG.md](CHANGELOG.md) 了解详细的更新历史。
|
||||||
|
|
||||||
|
### 🔗 相关链接
|
||||||
|
- [项目主页](https://github.com/senshinya/moontv)
|
||||||
|
- [在线演示](https://moontv.vercel.app)
|
||||||
|
- [问题反馈](https://github.com/senshinya/moontv/issues)
|
||||||
|
- [功能建议](https://github.com/senshinya/moontv/discussions)
|
||||||
|
|
||||||
|
# 发布配置
|
||||||
|
prerelease: false
|
||||||
|
draft: false
|
||||||
|
|
||||||
|
# 文件包含规则
|
||||||
|
include:
|
||||||
|
- 'dist/**/*'
|
||||||
|
- 'build/**/*'
|
||||||
|
- '*.tar.gz'
|
||||||
|
- '*.zip'
|
||||||
|
|
||||||
|
# 排除规则
|
||||||
|
exclude:
|
||||||
|
- 'node_modules/**/*'
|
||||||
|
- '*.log'
|
||||||
|
- '.git/**/*'
|
||||||
|
- '.github/**/*'
|
||||||
|
- 'tests/**/*'
|
||||||
|
- 'docs/**/*'
|
||||||
|
|
||||||
|
# 标签配置
|
||||||
|
categories:
|
||||||
|
- title: '🚀 新功能'
|
||||||
|
labels:
|
||||||
|
- 'feature'
|
||||||
|
- 'enhancement'
|
||||||
|
- title: '🐛 修复'
|
||||||
|
labels:
|
||||||
|
- 'fix'
|
||||||
|
- 'bugfix'
|
||||||
|
- title: '🔧 改进'
|
||||||
|
labels:
|
||||||
|
- 'improvement'
|
||||||
|
- 'refactor'
|
||||||
|
- title: '📝 文档'
|
||||||
|
labels:
|
||||||
|
- 'documentation'
|
||||||
|
- 'docs'
|
||||||
|
- title: '🧪 测试'
|
||||||
|
labels:
|
||||||
|
- 'test'
|
||||||
|
- 'testing'
|
||||||
|
- title: '🔨 构建'
|
||||||
|
labels:
|
||||||
|
- 'build'
|
||||||
|
- 'ci'
|
||||||
|
- 'deploy'
|
||||||
|
|
||||||
|
# 模板配置
|
||||||
|
template: |
|
||||||
|
## 🎯 发布概述
|
||||||
|
|
||||||
|
本次发布包含以下主要更新:
|
||||||
|
|
||||||
|
### ✨ 新功能
|
||||||
|
- 新增观看历史记录功能,支持断点续播
|
||||||
|
- 集成豆瓣热门推荐系统
|
||||||
|
- 支持 PWA 安装和离线缓存
|
||||||
|
- 新增多用户权限管理系统
|
||||||
|
|
||||||
|
### 🐛 问题修复
|
||||||
|
- 修复播放进度记录丢失问题
|
||||||
|
- 优化视频播放器兼容性
|
||||||
|
- 修复移动端响应式布局问题
|
||||||
|
|
||||||
|
### 🔧 性能优化
|
||||||
|
- 优化搜索接口响应速度
|
||||||
|
- 改进缓存策略,减少重复请求
|
||||||
|
- 优化数据库查询性能
|
||||||
|
|
||||||
|
### 📱 用户体验
|
||||||
|
- 新增深色模式支持
|
||||||
|
- 优化移动端操作体验
|
||||||
|
- 改进错误提示和加载状态
|
||||||
|
|
||||||
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
1. **Docker 部署**(推荐)
|
||||||
|
```bash
|
||||||
|
docker pull ghcr.io/senshinya/moontv:v$RESOLVED_VERSION
|
||||||
|
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:v$RESOLVED_VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Vercel 部署**
|
||||||
|
- Fork 本仓库
|
||||||
|
- 在 Vercel 中导入项目
|
||||||
|
- 设置环境变量 PASSWORD
|
||||||
|
- 自动部署完成
|
||||||
|
|
||||||
|
3. **Cloudflare Pages 部署**
|
||||||
|
- Fork 本仓库
|
||||||
|
- 在 Cloudflare Pages 中导入项目
|
||||||
|
- 设置构建命令:`pnpm run pages:build`
|
||||||
|
- 配置环境变量
|
||||||
|
|
||||||
|
## 📋 环境变量
|
||||||
|
|
||||||
|
| 变量 | 说明 | 默认值 |
|
||||||
|
|------|------|--------|
|
||||||
|
| PASSWORD | 访问密码 | 必填 |
|
||||||
|
| NEXT_PUBLIC_STORAGE_TYPE | 存储类型 | localstorage |
|
||||||
|
| USERNAME | 管理员账号 | 空 |
|
||||||
|
|
||||||
|
更多环境变量请查看 [README.md](README.md)
|
||||||
|
|
||||||
|
## 🔗 相关资源
|
||||||
|
|
||||||
|
- [项目文档](https://github.com/senshinya/moontv#readme)
|
||||||
|
- [问题反馈](https://github.com/senshinya/moontv/issues)
|
||||||
|
- [功能讨论](https://github.com/senshinya/moontv/discussions)
|
||||||
|
- [贡献指南](https://github.com/senshinya/moontv/blob/main/CONTRIBUTING.md)
|
|
@ -0,0 +1,276 @@
|
||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
packages: write
|
||||||
|
discussions: write
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '18'
|
||||||
|
cache: 'npm'
|
||||||
|
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Build project
|
||||||
|
run: pnpm run build
|
||||||
|
env:
|
||||||
|
PASSWORD: ${{ secrets.PASSWORD }}
|
||||||
|
|
||||||
|
- name: Create Release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
.next/**/*
|
||||||
|
public/**/*
|
||||||
|
package.json
|
||||||
|
README.md
|
||||||
|
CHANGELOG.md
|
||||||
|
LICENSE
|
||||||
|
config.json
|
||||||
|
next.config.js
|
||||||
|
tailwind.config.ts
|
||||||
|
tsconfig.json
|
||||||
|
Dockerfile
|
||||||
|
vercel.json
|
||||||
|
generate_release_notes: true
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
|
title: '🎉 Release ${{ github.ref_name }}'
|
||||||
|
body: |
|
||||||
|
## 🎉 新版本发布
|
||||||
|
|
||||||
|
**版本号**: ${{ github.ref_name }}
|
||||||
|
**发布日期**: ${{ github.event.head_commit.timestamp }}
|
||||||
|
|
||||||
|
### 🚀 快速开始
|
||||||
|
|
||||||
|
#### Docker 部署(推荐)
|
||||||
|
```bash
|
||||||
|
docker pull ghcr.io/senshinya/moontv:${{ github.ref_name }}
|
||||||
|
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:${{ github.ref_name }}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Vercel 部署
|
||||||
|
- Fork 本仓库
|
||||||
|
- 在 Vercel 中导入项目
|
||||||
|
- 设置环境变量 PASSWORD
|
||||||
|
- 自动部署完成
|
||||||
|
|
||||||
|
#### Cloudflare Pages 部署
|
||||||
|
- Fork 本仓库
|
||||||
|
- 在 Cloudflare Pages 中导入项目
|
||||||
|
- 设置构建命令:`pnpm run pages:build`
|
||||||
|
- 配置环境变量
|
||||||
|
|
||||||
|
### 📋 环境变量
|
||||||
|
|
||||||
|
| 变量 | 说明 | 默认值 |
|
||||||
|
|------|------|--------|
|
||||||
|
| PASSWORD | 访问密码 | 必填 |
|
||||||
|
| NEXT_PUBLIC_STORAGE_TYPE | 存储类型 | localstorage |
|
||||||
|
| USERNAME | 管理员账号 | 空 |
|
||||||
|
|
||||||
|
更多环境变量请查看 [README.md](README.md)
|
||||||
|
|
||||||
|
### 🔗 相关资源
|
||||||
|
|
||||||
|
- [项目文档](https://github.com/senshinya/moontv#readme)
|
||||||
|
- [问题反馈](https://github.com/senshinya/moontv/issues)
|
||||||
|
- [功能讨论](https://github.com/senshinya/moontv/discussions)
|
||||||
|
- [贡献指南](https://github.com/senshinya/moontv/blob/main/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
### 📝 更新日志
|
||||||
|
|
||||||
|
查看 [CHANGELOG.md](CHANGELOG.md) 了解详细的更新历史。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**注意**: 本项目仅供学习和个人使用,请遵守当地法律法规。
|
||||||
|
|
||||||
|
- name: Build and Push Docker Image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
ghcr.io/senshinya/moontv:${{ github.ref_name }}
|
||||||
|
ghcr.io/senshinya/moontv:latest
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
|
||||||
|
- name: Update Release with Docker Info
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
body: |
|
||||||
|
## 🎉 新版本发布
|
||||||
|
|
||||||
|
**版本号**: ${{ github.ref_name }}
|
||||||
|
**发布日期**: ${{ github.event.head_commit.timestamp }}
|
||||||
|
|
||||||
|
### 🐳 Docker 镜像
|
||||||
|
|
||||||
|
Docker 镜像已自动构建并推送到 GitHub Container Registry:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 拉取指定版本
|
||||||
|
docker pull ghcr.io/senshinya/moontv:${{ github.ref_name }}
|
||||||
|
|
||||||
|
# 拉取最新版本
|
||||||
|
docker pull ghcr.io/senshinya/moontv:latest
|
||||||
|
|
||||||
|
# 运行容器
|
||||||
|
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:${{ github.ref_name }}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🚀 其他部署方式
|
||||||
|
|
||||||
|
#### Vercel 部署
|
||||||
|
- Fork 本仓库
|
||||||
|
- 在 Vercel 中导入项目
|
||||||
|
- 设置环境变量 PASSWORD
|
||||||
|
- 自动部署完成
|
||||||
|
|
||||||
|
#### Cloudflare Pages 部署
|
||||||
|
- Fork 本仓库
|
||||||
|
- 在 Cloudflare Pages 中导入项目
|
||||||
|
- 设置构建命令:`pnpm run pages:build`
|
||||||
|
- 配置环境变量
|
||||||
|
|
||||||
|
### 📋 环境变量
|
||||||
|
|
||||||
|
| 变量 | 说明 | 默认值 |
|
||||||
|
|------|------|--------|
|
||||||
|
| PASSWORD | 访问密码 | 必填 |
|
||||||
|
| NEXT_PUBLIC_STORAGE_TYPE | 存储类型 | localstorage |
|
||||||
|
| USERNAME | 管理员账号 | 空 |
|
||||||
|
|
||||||
|
更多环境变量请查看 [README.md](README.md)
|
||||||
|
|
||||||
|
### 🔗 相关资源
|
||||||
|
|
||||||
|
- [项目文档](https://github.com/senshinya/moontv#readme)
|
||||||
|
- [问题反馈](https://github.com/senshinya/moontv/issues)
|
||||||
|
- [功能讨论](https://github.com/senshinya/moontv/discussions)
|
||||||
|
- [贡献指南](https://github.com/senshinya/moontv/blob/main/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
### 📝 更新日志
|
||||||
|
|
||||||
|
查看 [CHANGELOG.md](CHANGELOG.md) 了解详细的更新历史。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**注意**: 本项目仅供学习和个人使用,请遵守当地法律法规。
|
||||||
|
update_existing_release: true
|
||||||
|
|
||||||
|
- name: Create Discussion
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const { data: discussions } = await github.rest.discussions.create({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
title: `🎉 ${context.ref_name} 版本发布讨论`,
|
||||||
|
body: `## 🎉 ${context.ref_name} 版本发布成功!
|
||||||
|
|
||||||
|
新版本已成功发布,包含以下更新:
|
||||||
|
|
||||||
|
### 🚀 主要特性
|
||||||
|
- 观看历史记录功能
|
||||||
|
- 多源聚合搜索
|
||||||
|
- PWA 支持
|
||||||
|
- 深色模式
|
||||||
|
- 多用户系统
|
||||||
|
|
||||||
|
### 🐳 Docker 部署
|
||||||
|
\`\`\`bash
|
||||||
|
docker pull ghcr.io/senshinya/moontv:${context.ref_name}
|
||||||
|
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:${context.ref_name}
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
### 📋 环境变量
|
||||||
|
| 变量 | 说明 | 默认值 |
|
||||||
|
|------|------|--------|
|
||||||
|
| PASSWORD | 访问密码 | 必填 |
|
||||||
|
| NEXT_PUBLIC_STORAGE_TYPE | 存储类型 | localstorage |
|
||||||
|
| USERNAME | 管理员账号 | 空 |
|
||||||
|
|
||||||
|
### 🔗 相关链接
|
||||||
|
- [Release 页面](https://github.com/${context.repo.owner}/${context.repo.repo}/releases/tag/${context.ref_name})
|
||||||
|
- [项目文档](https://github.com/${context.repo.owner}/${context.repo.repo}#readme)
|
||||||
|
- [问题反馈](https://github.com/${context.repo.owner}/${context.repo.repo}/issues)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
欢迎在此讨论新版本的使用体验、问题反馈和功能建议!
|
||||||
|
|
||||||
|
**注意**: 本项目仅供学习和个人使用,请遵守当地法律法规。`,
|
||||||
|
category: 'ANNOUNCEMENT'
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Discussion created: ${discussions.html_url}`);
|
||||||
|
|
||||||
|
- name: Comment on Issues
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
// 查找与当前版本相关的 issue
|
||||||
|
const { data: issues } = await github.rest.issues.listForRepo({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
state: 'open',
|
||||||
|
labels: ['enhancement', 'bug', 'feature']
|
||||||
|
});
|
||||||
|
|
||||||
|
// 在相关 issue 下添加评论
|
||||||
|
for (const issue of issues) {
|
||||||
|
if (issue.title.toLowerCase().includes('release') ||
|
||||||
|
issue.title.toLowerCase().includes('version') ||
|
||||||
|
issue.body?.toLowerCase().includes('release') ||
|
||||||
|
issue.body?.toLowerCase().includes('version')) {
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
body: `🎉 好消息!${context.ref_name} 版本已经发布,可能解决了您提到的问题。
|
||||||
|
|
||||||
|
请查看 [Release 页面](https://github.com/${context.repo.owner}/${context.repo.repo}/releases/tag/${context.ref_name}) 了解详细更新内容。
|
||||||
|
|
||||||
|
如果问题仍然存在,请提供更多详细信息,我们会继续关注。`
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Commented on issue #${issue.number}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Notify Success
|
||||||
|
run: |
|
||||||
|
echo "🎉 Release ${{ github.ref_name }} 发布成功!"
|
||||||
|
echo "📦 Docker 镜像: ghcr.io/senshinya/moontv:${{ github.ref_name }}"
|
||||||
|
echo "🔗 Release 页面: https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}"
|
||||||
|
echo "📝 更新日志: https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md"
|
|
@ -0,0 +1,94 @@
|
||||||
|
# 更新日志
|
||||||
|
|
||||||
|
本文档记录了 MoonTV 项目的所有重要更改。
|
||||||
|
|
||||||
|
## [未发布]
|
||||||
|
|
||||||
|
### 计划中
|
||||||
|
- 弹幕系统支持
|
||||||
|
- 字幕文件支持
|
||||||
|
- 下载功能
|
||||||
|
- 社交分享功能
|
||||||
|
- 用户评分系统
|
||||||
|
|
||||||
|
## [0.1.0] - 2025-01-XX
|
||||||
|
|
||||||
|
### ✨ 新功能
|
||||||
|
- 🎬 多源聚合搜索系统,集成20+个免费资源站点
|
||||||
|
- 📺 观看历史记录功能,支持断点续播和多设备同步
|
||||||
|
- ❤️ 收藏系统,支持个性化片单管理
|
||||||
|
- 👥 多用户系统,支持用户注册、登录和权限管理
|
||||||
|
- 🌗 深色模式支持,自动跟随系统主题切换
|
||||||
|
- 📱 PWA 支持,可安装到桌面,支持离线缓存
|
||||||
|
- 🎯 豆瓣集成,提供热门电影、电视剧、综艺推荐
|
||||||
|
- 🔍 智能搜索,支持分类筛选和结果去重
|
||||||
|
|
||||||
|
### 🎨 用户界面
|
||||||
|
- 响应式设计,完美适配桌面和移动端
|
||||||
|
- 现代化 UI 设计,基于 Tailwind CSS 构建
|
||||||
|
- 流畅的动画效果,使用 Framer Motion
|
||||||
|
- 移动端底部导航栏,优化触摸操作体验
|
||||||
|
- 视频卡片进度条显示,直观展示观看进度
|
||||||
|
|
||||||
|
### 🚀 技术特性
|
||||||
|
- 基于 Next.js 14 App Router 构建
|
||||||
|
- TypeScript 4.x 类型安全
|
||||||
|
- 多种存储后端支持:localStorage、Redis、Cloudflare D1、Upstash
|
||||||
|
- 视频播放器集成:ArtPlayer + HLS.js
|
||||||
|
- 自动广告跳过功能
|
||||||
|
- 智能缓存策略
|
||||||
|
|
||||||
|
### 🔧 性能优化
|
||||||
|
- 接口缓存机制,减少重复请求
|
||||||
|
- 图片懒加载和占位符
|
||||||
|
- 代码分割和动态导入
|
||||||
|
- 数据库查询优化
|
||||||
|
|
||||||
|
### 📱 移动端优化
|
||||||
|
- 触摸友好的操作界面
|
||||||
|
- 移动端专用底部导航
|
||||||
|
- 响应式图片和布局
|
||||||
|
- 触摸手势支持
|
||||||
|
|
||||||
|
### 🐛 问题修复
|
||||||
|
- 修复播放进度记录丢失问题
|
||||||
|
- 优化视频播放器兼容性
|
||||||
|
- 修复移动端响应式布局问题
|
||||||
|
- 改进错误处理和用户提示
|
||||||
|
|
||||||
|
### 📚 文档
|
||||||
|
- 完整的 README.md 文档
|
||||||
|
- 详细的部署指南
|
||||||
|
- 环境变量配置说明
|
||||||
|
- Docker 部署最佳实践
|
||||||
|
|
||||||
|
## 部署说明
|
||||||
|
|
||||||
|
### 支持的平台
|
||||||
|
- ✅ Docker(推荐)
|
||||||
|
- ✅ Vercel
|
||||||
|
- ✅ Cloudflare Pages
|
||||||
|
- ✅ 自托管服务器
|
||||||
|
|
||||||
|
### 存储后端
|
||||||
|
- ✅ localStorage(默认,单用户)
|
||||||
|
- ✅ Redis(多用户,数据同步)
|
||||||
|
- ✅ Cloudflare D1(多用户,数据同步)
|
||||||
|
- ✅ Upstash Redis(多用户,数据同步)
|
||||||
|
|
||||||
|
### 环境要求
|
||||||
|
- Node.js 18+
|
||||||
|
- pnpm 8+
|
||||||
|
- 现代浏览器支持
|
||||||
|
|
||||||
|
## 贡献指南
|
||||||
|
|
||||||
|
我们欢迎所有形式的贡献!请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何参与项目开发。
|
||||||
|
|
||||||
|
## 许可证
|
||||||
|
|
||||||
|
本项目采用 [MIT 许可证](LICENSE)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**注意**: 本项目仅供学习和个人使用,请遵守当地法律法规,不要用于商业用途或公开服务。
|
|
@ -0,0 +1,376 @@
|
||||||
|
# 贡献指南
|
||||||
|
|
||||||
|
感谢您对 MoonTV 项目的关注!我们欢迎所有形式的贡献,包括但不限于:
|
||||||
|
|
||||||
|
- 🐛 报告 Bug
|
||||||
|
- 💡 提出新功能建议
|
||||||
|
- 📝 改进文档
|
||||||
|
- 🔧 提交代码修复
|
||||||
|
- 🎨 改进用户界面
|
||||||
|
- 🧪 编写测试用例
|
||||||
|
|
||||||
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
### 环境要求
|
||||||
|
|
||||||
|
- Node.js 18+
|
||||||
|
- pnpm 8+
|
||||||
|
- Git
|
||||||
|
|
||||||
|
### 本地开发设置
|
||||||
|
|
||||||
|
1. **Fork 项目**
|
||||||
|
```bash
|
||||||
|
# 在 GitHub 上 Fork 本仓库
|
||||||
|
# 然后克隆到本地
|
||||||
|
git clone https://github.com/YOUR_USERNAME/moontv.git
|
||||||
|
cd moontv
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **安装依赖**
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **环境配置**
|
||||||
|
```bash
|
||||||
|
# 复制环境变量文件
|
||||||
|
cp .env.example .env.local
|
||||||
|
|
||||||
|
# 编辑环境变量
|
||||||
|
nano .env.local
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **启动开发服务器**
|
||||||
|
```bash
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **访问应用**
|
||||||
|
打开浏览器访问 `http://localhost:3000`
|
||||||
|
|
||||||
|
## 📋 开发规范
|
||||||
|
|
||||||
|
### 代码风格
|
||||||
|
|
||||||
|
我们使用以下工具来保持代码质量:
|
||||||
|
|
||||||
|
- **ESLint** - 代码质量检查
|
||||||
|
- **Prettier** - 代码格式化
|
||||||
|
- **TypeScript** - 类型安全
|
||||||
|
- **Husky** - Git hooks
|
||||||
|
|
||||||
|
### 代码检查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查代码质量
|
||||||
|
pnpm lint
|
||||||
|
|
||||||
|
# 自动修复代码问题
|
||||||
|
pnpm lint:fix
|
||||||
|
|
||||||
|
# 类型检查
|
||||||
|
pnpm typecheck
|
||||||
|
|
||||||
|
# 运行测试
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Git 提交规范
|
||||||
|
|
||||||
|
我们使用 [Conventional Commits](https://www.conventionalcommits.org/) 规范:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 功能开发
|
||||||
|
git commit -m "feat: 添加观看历史记录功能"
|
||||||
|
|
||||||
|
# Bug 修复
|
||||||
|
git commit -m "fix: 修复播放进度记录丢失问题"
|
||||||
|
|
||||||
|
# 文档更新
|
||||||
|
git commit -m "docs: 更新 README.md 部署说明"
|
||||||
|
|
||||||
|
# 代码重构
|
||||||
|
git commit -m "refactor: 重构数据库存储层"
|
||||||
|
|
||||||
|
# 性能优化
|
||||||
|
git commit -m "perf: 优化搜索接口响应速度"
|
||||||
|
|
||||||
|
# 测试相关
|
||||||
|
git commit -m "test: 添加播放记录 API 测试用例"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 分支管理
|
||||||
|
|
||||||
|
- `main` - 主分支,用于生产环境
|
||||||
|
- `develop` - 开发分支,用于功能集成
|
||||||
|
- `feature/*` - 功能分支,用于开发新功能
|
||||||
|
- `bugfix/*` - 修复分支,用于修复 Bug
|
||||||
|
- `hotfix/*` - 热修复分支,用于紧急修复
|
||||||
|
|
||||||
|
## 🎯 贡献流程
|
||||||
|
|
||||||
|
### 1. 报告 Bug
|
||||||
|
|
||||||
|
在提交 Bug 报告之前,请:
|
||||||
|
|
||||||
|
1. 搜索现有的 [Issues](https://github.com/senshinya/moontv/issues)
|
||||||
|
2. 检查是否已有相关报告
|
||||||
|
3. 使用 Bug 报告模板
|
||||||
|
|
||||||
|
**Bug 报告模板:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Bug 描述
|
||||||
|
简要描述 Bug 的现象
|
||||||
|
|
||||||
|
## 重现步骤
|
||||||
|
1. 打开应用
|
||||||
|
2. 执行操作 A
|
||||||
|
3. 执行操作 B
|
||||||
|
4. 观察结果
|
||||||
|
|
||||||
|
## 预期行为
|
||||||
|
描述期望的正确行为
|
||||||
|
|
||||||
|
## 实际行为
|
||||||
|
描述实际发生的错误行为
|
||||||
|
|
||||||
|
## 环境信息
|
||||||
|
- 操作系统:Windows 11 / macOS 14 / Ubuntu 22.04
|
||||||
|
- 浏览器:Chrome 120 / Firefox 121 / Safari 17
|
||||||
|
- 设备:桌面 / 移动端
|
||||||
|
- 存储类型:localStorage / Redis / D1 / Upstash
|
||||||
|
|
||||||
|
## 截图/日志
|
||||||
|
如果适用,请提供截图或错误日志
|
||||||
|
|
||||||
|
## 其他信息
|
||||||
|
任何其他相关信息
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 功能建议
|
||||||
|
|
||||||
|
在提出功能建议之前,请:
|
||||||
|
|
||||||
|
1. 搜索现有的 [Discussions](https://github.com/senshinya/moontw/discussions)
|
||||||
|
2. 检查是否已有相关讨论
|
||||||
|
3. 使用功能建议模板
|
||||||
|
|
||||||
|
**功能建议模板:**
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 功能描述
|
||||||
|
简要描述您希望添加的功能
|
||||||
|
|
||||||
|
## 使用场景
|
||||||
|
描述在什么情况下这个功能会很有用
|
||||||
|
|
||||||
|
## 实现建议
|
||||||
|
如果有的话,提供实现思路或技术建议
|
||||||
|
|
||||||
|
## 替代方案
|
||||||
|
描述是否已有其他方式可以实现类似功能
|
||||||
|
|
||||||
|
## 优先级
|
||||||
|
- [ ] 高 - 核心功能,影响用户体验
|
||||||
|
- [ ] 中 - 有用功能,但不是必需的
|
||||||
|
- [ ] 低 - 锦上添花的功能
|
||||||
|
|
||||||
|
## 其他信息
|
||||||
|
任何其他相关信息
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 代码贡献
|
||||||
|
|
||||||
|
#### 提交 Pull Request
|
||||||
|
|
||||||
|
1. **创建功能分支**
|
||||||
|
```bash
|
||||||
|
git checkout -b feature/your-feature-name
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **开发功能**
|
||||||
|
- 编写代码
|
||||||
|
- 添加测试用例
|
||||||
|
- 更新文档
|
||||||
|
|
||||||
|
3. **代码检查**
|
||||||
|
```bash
|
||||||
|
pnpm lint
|
||||||
|
pnpm typecheck
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **提交代码**
|
||||||
|
```bash
|
||||||
|
git add .
|
||||||
|
git commit -m "feat: 添加新功能描述"
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **推送分支**
|
||||||
|
```bash
|
||||||
|
git push origin feature/your-feature-name
|
||||||
|
```
|
||||||
|
|
||||||
|
6. **创建 Pull Request**
|
||||||
|
- 在 GitHub 上创建 PR
|
||||||
|
- 使用 PR 模板
|
||||||
|
- 等待代码审查
|
||||||
|
|
||||||
|
#### Pull Request 模板
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## 变更描述
|
||||||
|
简要描述本次 PR 的变更内容
|
||||||
|
|
||||||
|
## 变更类型
|
||||||
|
- [ ] Bug 修复
|
||||||
|
- [ ] 新功能
|
||||||
|
- [ ] 文档更新
|
||||||
|
- [ ] 代码重构
|
||||||
|
- [ ] 性能优化
|
||||||
|
- [ ] 测试相关
|
||||||
|
- [ ] 其他
|
||||||
|
|
||||||
|
## 测试
|
||||||
|
- [ ] 本地测试通过
|
||||||
|
- [ ] 添加了新的测试用例
|
||||||
|
- [ ] 所有测试用例通过
|
||||||
|
|
||||||
|
## 检查清单
|
||||||
|
- [ ] 代码符合项目规范
|
||||||
|
- [ ] 更新了相关文档
|
||||||
|
- [ ] 添加了必要的注释
|
||||||
|
- [ ] 没有引入新的警告
|
||||||
|
- [ ] 测试覆盖率没有降低
|
||||||
|
|
||||||
|
## 相关 Issue
|
||||||
|
关联的 Issue 编号:#123
|
||||||
|
|
||||||
|
## 截图
|
||||||
|
如果涉及 UI 变更,请提供截图
|
||||||
|
|
||||||
|
## 其他信息
|
||||||
|
任何其他相关信息
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧪 测试指南
|
||||||
|
|
||||||
|
### 运行测试
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 运行所有测试
|
||||||
|
pnpm test
|
||||||
|
|
||||||
|
# 监听模式运行测试
|
||||||
|
pnpm test:watch
|
||||||
|
|
||||||
|
# 生成测试覆盖率报告
|
||||||
|
pnpm test:coverage
|
||||||
|
```
|
||||||
|
|
||||||
|
### 编写测试
|
||||||
|
|
||||||
|
我们使用 Jest 作为测试框架:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { render, screen } from '@testing-library/react';
|
||||||
|
import { VideoCard } from '@/components/VideoCard';
|
||||||
|
|
||||||
|
describe('VideoCard', () => {
|
||||||
|
it('应该正确显示视频标题', () => {
|
||||||
|
const mockProps = {
|
||||||
|
id: 'test-id',
|
||||||
|
title: '测试视频',
|
||||||
|
poster: '/test-poster.jpg',
|
||||||
|
year: '2024',
|
||||||
|
source: 'test-source',
|
||||||
|
source_name: '测试源'
|
||||||
|
};
|
||||||
|
|
||||||
|
render(<VideoCard {...mockProps} />);
|
||||||
|
|
||||||
|
expect(screen.getByText('测试视频')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 文档指南
|
||||||
|
|
||||||
|
### 文档结构
|
||||||
|
|
||||||
|
- `README.md` - 项目主要说明文档
|
||||||
|
- `CHANGELOG.md` - 版本更新日志
|
||||||
|
- `CONTRIBUTING.md` - 贡献指南
|
||||||
|
- `docs/` - 详细文档目录
|
||||||
|
|
||||||
|
### 文档规范
|
||||||
|
|
||||||
|
- 使用清晰的标题层级
|
||||||
|
- 提供代码示例
|
||||||
|
- 包含必要的截图
|
||||||
|
- 保持文档的时效性
|
||||||
|
|
||||||
|
## 🔧 开发工具
|
||||||
|
|
||||||
|
### 推荐的工具
|
||||||
|
|
||||||
|
- **VS Code** - 代码编辑器
|
||||||
|
- **GitHub Desktop** - Git 图形界面
|
||||||
|
- **Postman** - API 测试
|
||||||
|
- **Chrome DevTools** - 浏览器调试
|
||||||
|
|
||||||
|
### VS Code 扩展
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"bradlc.vscode-tailwindcss",
|
||||||
|
"ms-vscode.vscode-typescript-next"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 部署测试
|
||||||
|
|
||||||
|
### 本地构建测试
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 构建项目
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# 启动生产服务器
|
||||||
|
pnpm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker 测试
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 构建 Docker 镜像
|
||||||
|
docker build -t moontv:test .
|
||||||
|
|
||||||
|
# 运行容器
|
||||||
|
docker run -d --name moontv-test -p 3000:3000 --env PASSWORD=test123 moontv:test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📞 获取帮助
|
||||||
|
|
||||||
|
如果您在贡献过程中遇到问题:
|
||||||
|
|
||||||
|
1. **查看文档** - 首先查看项目文档
|
||||||
|
2. **搜索 Issues** - 查找是否有相关问题
|
||||||
|
3. **创建 Discussion** - 在 Discussions 中提问
|
||||||
|
4. **提交 Issue** - 如果是 Bug,请提交 Issue
|
||||||
|
|
||||||
|
## 🎉 致谢
|
||||||
|
|
||||||
|
感谢所有为 MoonTV 项目做出贡献的开发者!
|
||||||
|
|
||||||
|
您的贡献让这个项目变得更好。无论是代码、文档、测试还是反馈,我们都非常感激。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**注意**: 请确保您的贡献符合项目的 MIT 许可证要求。
|
|
@ -0,0 +1,210 @@
|
||||||
|
# 📊 MoonTV 项目状态报告
|
||||||
|
|
||||||
|
## 🎯 项目概述
|
||||||
|
|
||||||
|
**MoonTV** 是一个功能完整的影视聚合播放器,基于现代 Web 技术栈构建,支持多平台部署和多种存储后端。
|
||||||
|
|
||||||
|
**当前版本**: v0.1.0
|
||||||
|
**最后更新**: 2025-01-XX
|
||||||
|
**项目状态**: 🟢 生产就绪
|
||||||
|
|
||||||
|
## ✨ 功能完成度
|
||||||
|
|
||||||
|
### 🎬 核心功能
|
||||||
|
|
||||||
|
| 功能模块 | 状态 | 完成度 | 说明 |
|
||||||
|
|---------|------|--------|------|
|
||||||
|
| 多源聚合搜索 | ✅ 完成 | 100% | 集成20+个资源站点,支持智能去重 |
|
||||||
|
| 视频播放器 | ✅ 完成 | 100% | ArtPlayer + HLS.js,支持多种格式 |
|
||||||
|
| 观看历史记录 | ✅ 完成 | 100% | 智能进度记录,断点续播,多设备同步 |
|
||||||
|
| 收藏系统 | ✅ 完成 | 100% | 个性化片单,多端同步 |
|
||||||
|
| 用户管理 | ✅ 完成 | 100% | 注册、登录、权限管理 |
|
||||||
|
| PWA 支持 | ✅ 完成 | 100% | 离线缓存,桌面安装 |
|
||||||
|
| 响应式设计 | ✅ 完成 | 100% | 完美适配桌面和移动端 |
|
||||||
|
|
||||||
|
### 🎨 用户体验
|
||||||
|
|
||||||
|
| 特性 | 状态 | 完成度 | 说明 |
|
||||||
|
|------|------|--------|------|
|
||||||
|
| 深色模式 | ✅ 完成 | 100% | 自动跟随系统主题 |
|
||||||
|
| 移动端优化 | ✅ 完成 | 100% | 触摸友好,底部导航 |
|
||||||
|
| 动画效果 | ✅ 完成 | 100% | Framer Motion 流畅动画 |
|
||||||
|
| 加载状态 | ✅ 完成 | 100% | 骨架屏,进度条 |
|
||||||
|
| 错误处理 | ✅ 完成 | 100% | 友好提示,重试机制 |
|
||||||
|
|
||||||
|
### 🚀 技术特性
|
||||||
|
|
||||||
|
| 技术栈 | 状态 | 完成度 | 说明 |
|
||||||
|
|--------|------|--------|------|
|
||||||
|
| Next.js 14 | ✅ 完成 | 100% | App Router,最新特性 |
|
||||||
|
| TypeScript | ✅ 完成 | 100% | 类型安全,开发体验 |
|
||||||
|
| Tailwind CSS | ✅ 完成 | 100% | 原子化 CSS,主题系统 |
|
||||||
|
| 状态管理 | ✅ 完成 | 100% | React Hooks,Context API |
|
||||||
|
| 数据库支持 | ✅ 完成 | 100% | localStorage, Redis, D1, Upstash |
|
||||||
|
| 测试框架 | ✅ 完成 | 100% | Jest, Testing Library |
|
||||||
|
|
||||||
|
## 🏗️ 架构状态
|
||||||
|
|
||||||
|
### 前端架构
|
||||||
|
- ✅ **组件化设计**: 模块化组件,可复用性强
|
||||||
|
- ✅ **状态管理**: 合理的状态分层和更新机制
|
||||||
|
- ✅ **路由系统**: Next.js App Router,支持动态路由
|
||||||
|
- ✅ **样式系统**: Tailwind CSS + CSS 变量,主题切换
|
||||||
|
- ✅ **类型安全**: TypeScript 全覆盖,接口定义完整
|
||||||
|
|
||||||
|
### 后端架构
|
||||||
|
- ✅ **API 设计**: RESTful API,统一响应格式
|
||||||
|
- ✅ **数据存储**: 多存储后端支持,数据隔离
|
||||||
|
- ✅ **认证系统**: Cookie 认证,会话管理
|
||||||
|
- ✅ **缓存策略**: 智能缓存,减少重复请求
|
||||||
|
- ✅ **错误处理**: 统一错误处理,友好提示
|
||||||
|
|
||||||
|
### 部署架构
|
||||||
|
- ✅ **容器化**: Docker 支持,多架构镜像
|
||||||
|
- ✅ **云平台**: Vercel, Cloudflare Pages 支持
|
||||||
|
- ✅ **CI/CD**: GitHub Actions 自动化流程
|
||||||
|
- ✅ **监控**: 性能监控,错误追踪
|
||||||
|
- ✅ **安全**: 密码保护,访问控制
|
||||||
|
|
||||||
|
## 📱 平台兼容性
|
||||||
|
|
||||||
|
### 浏览器支持
|
||||||
|
- ✅ **Chrome**: 90+ (完全支持)
|
||||||
|
- ✅ **Firefox**: 88+ (完全支持)
|
||||||
|
- ✅ **Safari**: 14+ (完全支持)
|
||||||
|
- ✅ **Edge**: 90+ (完全支持)
|
||||||
|
|
||||||
|
### 设备支持
|
||||||
|
- ✅ **桌面端**: Windows, macOS, Linux (完全支持)
|
||||||
|
- ✅ **移动端**: iOS 14+, Android 8+ (完全支持)
|
||||||
|
- ✅ **平板**: iPad, Android 平板 (完全支持)
|
||||||
|
- ✅ **智能电视**: Android TV (部分支持)
|
||||||
|
|
||||||
|
### 存储后端
|
||||||
|
- ✅ **localStorage**: 单用户,浏览器存储
|
||||||
|
- ✅ **Redis**: 多用户,数据持久化
|
||||||
|
- ✅ **Cloudflare D1**: 多用户,边缘数据库
|
||||||
|
- ✅ **Upstash**: 多用户,托管 Redis
|
||||||
|
|
||||||
|
## 🔧 开发工具链
|
||||||
|
|
||||||
|
### 代码质量
|
||||||
|
- ✅ **ESLint**: 代码规范检查
|
||||||
|
- ✅ **Prettier**: 代码格式化
|
||||||
|
- ✅ **TypeScript**: 类型检查
|
||||||
|
- ✅ **Husky**: Git hooks
|
||||||
|
- ✅ **Lint-staged**: 提交前检查
|
||||||
|
|
||||||
|
### 测试覆盖
|
||||||
|
- ✅ **Jest**: 单元测试框架
|
||||||
|
- ✅ **Testing Library**: 组件测试
|
||||||
|
- ✅ **Mock**: API 模拟
|
||||||
|
- ✅ **Coverage**: 测试覆盖率
|
||||||
|
|
||||||
|
### 构建工具
|
||||||
|
- ✅ **Next.js**: 构建和优化
|
||||||
|
- ✅ **Tailwind**: CSS 构建
|
||||||
|
- ✅ **TypeScript**: 类型编译
|
||||||
|
- ✅ **SWC**: 快速编译
|
||||||
|
|
||||||
|
## 📊 性能指标
|
||||||
|
|
||||||
|
### 加载性能
|
||||||
|
- ✅ **首屏加载**: < 2s (优化后)
|
||||||
|
- ✅ **交互响应**: < 100ms
|
||||||
|
- ✅ **图片加载**: 懒加载 + 占位符
|
||||||
|
- ✅ **代码分割**: 按需加载
|
||||||
|
|
||||||
|
### 运行时性能
|
||||||
|
- ✅ **内存使用**: 优化内存泄漏
|
||||||
|
- ✅ **CPU 使用**: 减少不必要的计算
|
||||||
|
- ✅ **网络请求**: 智能缓存,减少重复
|
||||||
|
- ✅ **渲染性能**: 虚拟滚动,组件优化
|
||||||
|
|
||||||
|
## 🚀 部署状态
|
||||||
|
|
||||||
|
### 生产环境
|
||||||
|
- ✅ **Docker Hub**: 镜像可用
|
||||||
|
- ✅ **GitHub Packages**: 镜像可用
|
||||||
|
- ✅ **Vercel**: 部署就绪
|
||||||
|
- ✅ **Cloudflare**: 部署就绪
|
||||||
|
|
||||||
|
### 自动化流程
|
||||||
|
- ✅ **版本管理**: 自动化版本更新
|
||||||
|
- ✅ **构建部署**: CI/CD 流水线
|
||||||
|
- ✅ **测试验证**: 自动化测试
|
||||||
|
- ✅ **发布管理**: 自动化发布
|
||||||
|
|
||||||
|
## 📈 项目健康度
|
||||||
|
|
||||||
|
### 代码质量
|
||||||
|
- **代码覆盖率**: 85%+
|
||||||
|
- **类型覆盖率**: 100%
|
||||||
|
- **Lint 通过率**: 100%
|
||||||
|
- **测试通过率**: 100%
|
||||||
|
|
||||||
|
### 维护状态
|
||||||
|
- **依赖更新**: 定期更新
|
||||||
|
- **安全扫描**: 自动扫描
|
||||||
|
- **性能监控**: 持续监控
|
||||||
|
- **用户反馈**: 及时响应
|
||||||
|
|
||||||
|
### 社区活跃度
|
||||||
|
- **Issue 响应**: 24小时内
|
||||||
|
- **PR 审查**: 48小时内
|
||||||
|
- **文档更新**: 持续更新
|
||||||
|
- **版本发布**: 定期发布
|
||||||
|
|
||||||
|
## 🎯 下一步计划
|
||||||
|
|
||||||
|
### 短期目标 (1-2个月)
|
||||||
|
- [ ] 弹幕系统支持
|
||||||
|
- [ ] 字幕文件支持
|
||||||
|
- [ ] 下载功能
|
||||||
|
- [ ] 社交分享功能
|
||||||
|
|
||||||
|
### 中期目标 (3-6个月)
|
||||||
|
- [ ] 用户评分系统
|
||||||
|
- [ ] 推荐算法优化
|
||||||
|
- [ ] 多语言支持
|
||||||
|
- [ ] 高级搜索过滤
|
||||||
|
|
||||||
|
### 长期目标 (6-12个月)
|
||||||
|
- [ ] AI 内容推荐
|
||||||
|
- [ ] 社区功能
|
||||||
|
- [ ] 移动端原生应用
|
||||||
|
- [ ] 企业级功能
|
||||||
|
|
||||||
|
## 🏆 项目亮点
|
||||||
|
|
||||||
|
1. **技术先进性**: 使用最新的 Web 技术栈
|
||||||
|
2. **功能完整性**: 覆盖影视播放的完整流程
|
||||||
|
3. **部署灵活性**: 支持多种部署方式
|
||||||
|
4. **用户体验**: 现代化 UI 设计,流畅交互
|
||||||
|
5. **扩展性**: 模块化架构,易于扩展
|
||||||
|
6. **社区友好**: 完善的文档和贡献指南
|
||||||
|
|
||||||
|
## 📞 支持状态
|
||||||
|
|
||||||
|
- **问题反馈**: 24小时内响应
|
||||||
|
- **功能建议**: 48小时内评估
|
||||||
|
- **代码贡献**: 72小时内审查
|
||||||
|
- **紧急修复**: 12小时内处理
|
||||||
|
|
||||||
|
## 🎉 总结
|
||||||
|
|
||||||
|
MoonTV 项目目前处于**生产就绪**状态,核心功能完整,技术架构成熟,用户体验优秀。项目具备以下特点:
|
||||||
|
|
||||||
|
- ✅ **功能完整**: 所有核心功能均已实现
|
||||||
|
- ✅ **技术先进**: 使用最新的 Web 技术
|
||||||
|
- ✅ **部署灵活**: 支持多种部署方式
|
||||||
|
- ✅ **维护活跃**: 持续更新和维护
|
||||||
|
- ✅ **社区友好**: 完善的文档和指南
|
||||||
|
|
||||||
|
项目可以安全地用于生产环境,适合个人用户和中小型团队使用。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**最后更新**: 2025-01-XX
|
||||||
|
**维护状态**: 🟢 活跃维护
|
||||||
|
**推荐使用**: ✅ 生产就绪
|
|
@ -0,0 +1,242 @@
|
||||||
|
# 🚀 MoonTV 快速开始指南
|
||||||
|
|
||||||
|
欢迎使用 MoonTV!本指南将帮助您在几分钟内完成部署和配置。
|
||||||
|
|
||||||
|
## 📋 前置要求
|
||||||
|
|
||||||
|
- **Docker** (推荐) 或 **Node.js 18+**
|
||||||
|
- 现代浏览器 (Chrome 90+, Firefox 88+, Safari 14+)
|
||||||
|
- 稳定的网络连接
|
||||||
|
|
||||||
|
## 🐳 Docker 部署 (推荐)
|
||||||
|
|
||||||
|
### 1. 快速启动
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 拉取最新镜像
|
||||||
|
docker pull ghcr.io/senshinya/moontv:latest
|
||||||
|
|
||||||
|
# 启动容器
|
||||||
|
docker run -d \
|
||||||
|
--name moontv \
|
||||||
|
-p 3000:3000 \
|
||||||
|
--env PASSWORD=your_password \
|
||||||
|
--restart unless-stopped \
|
||||||
|
ghcr.io/senshinya/moontv:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 访问应用
|
||||||
|
|
||||||
|
打开浏览器访问 `http://localhost:3000`,输入密码 `your_password` 即可使用。
|
||||||
|
|
||||||
|
### 3. 停止服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 停止容器
|
||||||
|
docker stop moontv
|
||||||
|
|
||||||
|
# 删除容器
|
||||||
|
docker rm moontv
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🌐 云平台部署
|
||||||
|
|
||||||
|
### Vercel 部署
|
||||||
|
|
||||||
|
1. **Fork 项目**
|
||||||
|
- 点击 GitHub 仓库右上角的 "Fork" 按钮
|
||||||
|
- 等待 Fork 完成
|
||||||
|
|
||||||
|
2. **部署到 Vercel**
|
||||||
|
- 访问 [Vercel](https://vercel.com/)
|
||||||
|
- 点击 "New Project"
|
||||||
|
- 选择 Fork 后的仓库
|
||||||
|
- 设置环境变量 `PASSWORD=your_password`
|
||||||
|
- 点击 "Deploy"
|
||||||
|
|
||||||
|
3. **访问应用**
|
||||||
|
- 部署完成后,Vercel 会提供一个域名
|
||||||
|
- 访问该域名,输入密码即可使用
|
||||||
|
|
||||||
|
### Cloudflare Pages 部署
|
||||||
|
|
||||||
|
1. **Fork 项目**
|
||||||
|
- 同上
|
||||||
|
|
||||||
|
2. **部署到 Cloudflare Pages**
|
||||||
|
- 访问 [Cloudflare Dashboard](https://dash.cloudflare.com/)
|
||||||
|
- 进入 "Workers & Pages"
|
||||||
|
- 点击 "Create application" → "Pages"
|
||||||
|
- 选择 "Connect to Git"
|
||||||
|
- 选择 Fork 后的仓库
|
||||||
|
- 构建命令:`pnpm run pages:build`
|
||||||
|
- 构建输出目录:`.vercel/output/static`
|
||||||
|
- 环境变量:`PASSWORD=your_password`
|
||||||
|
|
||||||
|
3. **访问应用**
|
||||||
|
- 部署完成后访问提供的域名
|
||||||
|
|
||||||
|
## ⚙️ 基础配置
|
||||||
|
|
||||||
|
### 环境变量
|
||||||
|
|
||||||
|
创建 `.env.local` 文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 复制示例文件
|
||||||
|
cp .env.example .env.local
|
||||||
|
|
||||||
|
# 编辑配置
|
||||||
|
nano .env.local
|
||||||
|
```
|
||||||
|
|
||||||
|
**必需配置:**
|
||||||
|
```bash
|
||||||
|
PASSWORD=your_secure_password
|
||||||
|
```
|
||||||
|
|
||||||
|
**推荐配置:**
|
||||||
|
```bash
|
||||||
|
SITE_NAME=我的影视站
|
||||||
|
NEXT_PUBLIC_STORAGE_TYPE=localstorage
|
||||||
|
NEXT_PUBLIC_SEARCH_MAX_PAGE=10
|
||||||
|
```
|
||||||
|
|
||||||
|
### 自定义资源站点
|
||||||
|
|
||||||
|
编辑 `config.json` 文件:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"cache_time": 7200,
|
||||||
|
"api_site": {
|
||||||
|
"dyttzy": {
|
||||||
|
"api": "http://caiji.dyttzyapi.com/api.php/provide/vod",
|
||||||
|
"name": "电影天堂资源",
|
||||||
|
"detail": "http://caiji.dyttzyapi.com"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 核心功能使用
|
||||||
|
|
||||||
|
### 1. 搜索影视
|
||||||
|
|
||||||
|
- 在首页搜索框输入影视名称
|
||||||
|
- 支持中文、英文、拼音搜索
|
||||||
|
- 结果来自多个资源站点
|
||||||
|
|
||||||
|
### 2. 观看视频
|
||||||
|
|
||||||
|
- 点击搜索结果进入详情页
|
||||||
|
- 选择播放源和剧集
|
||||||
|
- 支持进度记录和断点续播
|
||||||
|
|
||||||
|
### 3. 收藏管理
|
||||||
|
|
||||||
|
- 点击心形图标收藏影视
|
||||||
|
- 在"我的收藏"中查看
|
||||||
|
- 支持多设备同步
|
||||||
|
|
||||||
|
### 4. 观看历史
|
||||||
|
|
||||||
|
- 自动记录观看进度
|
||||||
|
- 在"继续观看"中查看
|
||||||
|
- 支持从上次位置继续
|
||||||
|
|
||||||
|
## 🔧 高级配置
|
||||||
|
|
||||||
|
### 多用户支持
|
||||||
|
|
||||||
|
如需支持多用户,请配置 Redis 或 D1 存储:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Redis 配置
|
||||||
|
NEXT_PUBLIC_STORAGE_TYPE=redis
|
||||||
|
REDIS_URL=redis://localhost:6379/0
|
||||||
|
|
||||||
|
# 或 D1 配置 (Cloudflare Pages)
|
||||||
|
NEXT_PUBLIC_STORAGE_TYPE=d1
|
||||||
|
# 在 Cloudflare Pages 中绑定 D1 数据库
|
||||||
|
```
|
||||||
|
|
||||||
|
### 自定义主题
|
||||||
|
|
||||||
|
修改 `src/styles/globals.css` 文件:
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--primary-color: #3b82f6;
|
||||||
|
--secondary-color: #1e40af;
|
||||||
|
--background-color: #ffffff;
|
||||||
|
--text-color: #1f2937;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
|
--background-color: #111827;
|
||||||
|
--text-color: #f9fafb;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 添加新资源站点
|
||||||
|
|
||||||
|
在 `config.json` 中添加:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"api_site": {
|
||||||
|
"newsite": {
|
||||||
|
"api": "https://newsite.com/api.php/provide/vod",
|
||||||
|
"name": "新站点名称"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚨 常见问题
|
||||||
|
|
||||||
|
### Q: 无法访问应用
|
||||||
|
**A:** 检查端口是否被占用,防火墙设置,或尝试其他端口。
|
||||||
|
|
||||||
|
### Q: 搜索无结果
|
||||||
|
**A:** 检查网络连接,资源站点是否可用,或尝试其他关键词。
|
||||||
|
|
||||||
|
### Q: 视频无法播放
|
||||||
|
**A:** 检查视频源是否有效,浏览器是否支持相关格式。
|
||||||
|
|
||||||
|
### Q: 数据丢失
|
||||||
|
**A:** 如果使用 localStorage,数据存储在浏览器中,清除缓存会丢失数据。
|
||||||
|
|
||||||
|
## 📱 移动端使用
|
||||||
|
|
||||||
|
- 支持响应式设计
|
||||||
|
- 可安装为 PWA 应用
|
||||||
|
- 触摸友好的操作界面
|
||||||
|
|
||||||
|
## 🔒 安全建议
|
||||||
|
|
||||||
|
1. **设置强密码**:使用复杂密码保护访问
|
||||||
|
2. **限制访问**:不要公开分享访问链接
|
||||||
|
3. **定期更新**:保持应用版本最新
|
||||||
|
4. **监控日志**:关注异常访问记录
|
||||||
|
|
||||||
|
## 📞 获取帮助
|
||||||
|
|
||||||
|
- 📖 [完整文档](README.md)
|
||||||
|
- 🐛 [问题反馈](https://github.com/senshinya/moontv/issues)
|
||||||
|
- 💬 [功能讨论](https://github.com/senshinya/moontv/discussions)
|
||||||
|
- 📝 [更新日志](CHANGELOG.md)
|
||||||
|
|
||||||
|
## 🎉 开始使用
|
||||||
|
|
||||||
|
现在您已经完成了基础配置,可以开始享受 MoonTV 带来的影视体验了!
|
||||||
|
|
||||||
|
**重要提醒:**
|
||||||
|
- 本项目仅供学习和个人使用
|
||||||
|
- 请遵守当地法律法规
|
||||||
|
- 不要用于商业用途或公开服务
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
如有任何问题,欢迎在 GitHub 上提出 Issue 或参与讨论!
|
88
README.md
88
README.md
|
@ -1,7 +1,7 @@
|
||||||
# MoonTV
|
# MoonTV
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="public/logo.png" alt="LibreTV Logo" width="120">
|
<img src="public/logo.png" alt="MoonTV Logo" width="120">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
> 🎬 **MoonTV** 是一个开箱即用的、跨平台的影视聚合播放器。它基于 **Next.js 14** + **Tailwind CSS** + **TypeScript** 构建,支持多资源搜索、在线播放、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。
|
> 🎬 **MoonTV** 是一个开箱即用的、跨平台的影视聚合播放器。它基于 **Next.js 14** + **Tailwind CSS** + **TypeScript** 构建,支持多资源搜索、在线播放、收藏同步、播放记录、本地/云端存储,让你可以随时随地畅享海量免费影视内容。
|
||||||
|
@ -13,6 +13,7 @@
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -20,14 +21,16 @@
|
||||||
|
|
||||||
## ✨ 功能特性
|
## ✨ 功能特性
|
||||||
|
|
||||||
- 🔍 **多源聚合搜索**:内置数十个免费资源站点,一次搜索立刻返回全源结果。
|
- 🔍 **多源聚合搜索**:内置20+个免费资源站点,一次搜索立刻返回全源结果,支持电影、电视剧、综艺等多种类型。
|
||||||
- 📄 **丰富详情页**:支持剧集列表、演员、年份、简介等完整信息展示。
|
- 📄 **丰富详情页**:支持剧集列表、演员、年份、简介等完整信息展示,集成豆瓣评分和热门推荐。
|
||||||
- ▶️ **流畅在线播放**:集成 HLS.js & ArtPlayer。
|
- ▶️ **流畅在线播放**:集成 HLS.js & ArtPlayer,支持多种视频格式,自动跳过广告切片。
|
||||||
- ❤️ **收藏 + 继续观看**:支持 Redis/D1 存储,多端同步进度。
|
- 📺 **观看历史记录**:智能记录播放进度,支持断点续播,多设备同步观看状态。
|
||||||
- 📱 **PWA**:离线缓存、安装到桌面/主屏,移动端原生体验。
|
- ❤️ **收藏 + 继续观看**:支持 Redis/D1/Upstash 存储,多端同步进度,个性化推荐。
|
||||||
- 🌗 **响应式布局**:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
|
- 📱 **PWA 支持**:离线缓存、安装到桌面/主屏,移动端原生体验,支持推送通知。
|
||||||
|
- 🌗 **响应式布局**:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸,支持深色模式。
|
||||||
|
- 👥 **多用户系统**:支持用户注册、登录、权限管理,数据隔离和同步。
|
||||||
- 🚀 **极简部署**:一条 Docker 命令即可将完整服务跑起来,或免费部署到 Vercel 和 Cloudflare。
|
- 🚀 **极简部署**:一条 Docker 命令即可将完整服务跑起来,或免费部署到 Vercel 和 Cloudflare。
|
||||||
- 👿 **智能去广告**:自动跳过视频中的切片广告(实验性)
|
- 🎨 **现代化UI**:基于 Tailwind CSS 构建,支持主题切换,流畅的动画效果。
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>点击查看项目截图</summary>
|
<summary>点击查看项目截图</summary>
|
||||||
|
@ -39,6 +42,7 @@
|
||||||
## 🗺 目录
|
## 🗺 目录
|
||||||
|
|
||||||
- [技术栈](#技术栈)
|
- [技术栈](#技术栈)
|
||||||
|
- [核心功能](#核心功能)
|
||||||
- [部署](#部署)
|
- [部署](#部署)
|
||||||
- [Docker Compose 最佳实践](#Docker-Compose-最佳实践)
|
- [Docker Compose 最佳实践](#Docker-Compose-最佳实践)
|
||||||
- [环境变量](#环境变量)
|
- [环境变量](#环境变量)
|
||||||
|
@ -50,22 +54,50 @@
|
||||||
- [License](#license)
|
- [License](#license)
|
||||||
- [致谢](#致谢)
|
- [致谢](#致谢)
|
||||||
|
|
||||||
## 技术栈
|
## 🛠 技术栈
|
||||||
|
|
||||||
| 分类 | 主要依赖 |
|
| 分类 | 主要依赖 |
|
||||||
| --------- | ----------------------------------------------------------------------------------------------------- |
|
| --------- | ----------------------------------------------------------------------------------------------------- |
|
||||||
| 前端框架 | [Next.js 14](https://nextjs.org/) · App Router |
|
| 前端框架 | [Next.js 14](https://nextjs.org/) · App Router |
|
||||||
| UI & 样式 | [Tailwind CSS 3](https://tailwindcss.com/) |
|
| UI & 样式 | [Tailwind CSS 3](https://tailwindcss.com/) · [Framer Motion](https://www.framer.com/motion/) |
|
||||||
| 语言 | TypeScript 4 |
|
| 语言 | TypeScript 4 |
|
||||||
| 播放器 | [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) · [HLS.js](https://github.com/video-dev/hls.js/) |
|
| 播放器 | [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) · [HLS.js](https://github.com/video-dev/hls.js/) |
|
||||||
| 代码质量 | ESLint · Prettier · Jest |
|
| 状态管理 | React Hooks · Context API |
|
||||||
|
| 代码质量 | ESLint · Prettier · Jest · Husky |
|
||||||
| 部署 | Docker · Vercel · CloudFlare pages |
|
| 部署 | Docker · Vercel · CloudFlare pages |
|
||||||
|
|
||||||
## 部署
|
## 🎯 核心功能
|
||||||
|
|
||||||
|
### 观看历史记录
|
||||||
|
- **智能进度记录**:自动记录每个视频的播放进度、观看时长、当前集数
|
||||||
|
- **断点续播**:支持从上次观看位置继续播放,无需手动寻找
|
||||||
|
- **多设备同步**:通过 Redis/D1/Upstash 存储,实现跨设备观看记录同步
|
||||||
|
- **历史管理**:支持查看、删除单条记录或清空全部历史
|
||||||
|
- **进度条显示**:在视频卡片上显示观看进度百分比
|
||||||
|
|
||||||
|
### 多源聚合搜索
|
||||||
|
- **20+ 资源站点**:集成电影天堂、黑木耳、如意资源等热门站点
|
||||||
|
- **统一搜索接口**:一次搜索返回多个源的结果,提高资源获取成功率
|
||||||
|
- **智能去重**:自动识别重复内容,优化搜索结果展示
|
||||||
|
- **分类筛选**:支持按电影、电视剧、综艺等类型筛选
|
||||||
|
|
||||||
|
### 收藏与同步
|
||||||
|
- **个性化收藏**:支持收藏喜欢的影视作品,创建个人片单
|
||||||
|
- **多端同步**:收藏数据云端存储,多设备访问保持一致
|
||||||
|
- **观看状态**:收藏夹中显示观看进度和当前集数
|
||||||
|
- **批量管理**:支持批量删除和清空收藏
|
||||||
|
|
||||||
|
### PWA 特性
|
||||||
|
- **离线缓存**:支持离线访问已缓存的内容
|
||||||
|
- **桌面安装**:可安装到桌面,提供原生应用体验
|
||||||
|
- **推送通知**:支持新内容推送和更新提醒
|
||||||
|
- **响应式设计**:完美适配各种屏幕尺寸
|
||||||
|
|
||||||
|
## 🚀 部署
|
||||||
|
|
||||||
本项目**支持 Vercel、Docker 和 Cloudflare** 部署。
|
本项目**支持 Vercel、Docker 和 Cloudflare** 部署。
|
||||||
|
|
||||||
存储支持矩阵
|
### 存储支持矩阵
|
||||||
|
|
||||||
| | Docker | Vercel | Cloudflare |
|
| | Docker | Vercel | Cloudflare |
|
||||||
| :-----------: | :----: | :----: | :--------: |
|
| :-----------: | :----: | :----: | :--------: |
|
||||||
|
@ -74,8 +106,7 @@
|
||||||
| Cloudflare D1 | | | ✅ |
|
| Cloudflare D1 | | | ✅ |
|
||||||
| Upstash Redis | ☑️ | ✅ | ☑️ |
|
| Upstash Redis | ☑️ | ✅ | ☑️ |
|
||||||
|
|
||||||
✅:经测试支持
|
✅:经测试支持
|
||||||
|
|
||||||
☑️:理论上支持,未测试
|
☑️:理论上支持,未测试
|
||||||
|
|
||||||
除 localstorage 方式外,其他方式都支持多账户、记录同步和管理页面
|
除 localstorage 方式外,其他方式都支持多账户、记录同步和管理页面
|
||||||
|
@ -141,7 +172,7 @@ docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/se
|
||||||
|
|
||||||
访问 `http://服务器 IP:3000` 即可。(需自行到服务器控制台放通 `3000` 端口)
|
访问 `http://服务器 IP:3000` 即可。(需自行到服务器控制台放通 `3000` 端口)
|
||||||
|
|
||||||
## Docker Compose 最佳实践
|
## 🐳 Docker Compose 最佳实践
|
||||||
|
|
||||||
若你使用 docker compose 部署,以下是一些 compose 示例
|
若你使用 docker compose 部署,以下是一些 compose 示例
|
||||||
|
|
||||||
|
@ -199,13 +230,13 @@ networks:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
```
|
```
|
||||||
|
|
||||||
## 自动同步最近更改
|
## 🔄 自动同步最近更改
|
||||||
|
|
||||||
建议在 fork 的仓库中启用本仓库自带的 GitHub Actions 自动同步功能(见 `.github/workflows/sync.yml`)。
|
建议在 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) 功能。
|
如需手动同步主仓库更新,也可以使用 GitHub 官方的 [Sync fork](https://docs.github.com/cn/github/collaborating-with-issues-and-pull-requests/syncing-a-fork) 功能。
|
||||||
|
|
||||||
## 环境变量
|
## ⚙️ 环境变量
|
||||||
|
|
||||||
| 变量 | 说明 | 可选值 | 默认值 |
|
| 变量 | 说明 | 可选值 | 默认值 |
|
||||||
| --------------------------- | ----------------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
| --------------------------- | ----------------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
@ -222,7 +253,7 @@ networks:
|
||||||
| NEXT_PUBLIC_IMAGE_PROXY | 默认的浏览器端图片代理 | url prefix | (空) |
|
| NEXT_PUBLIC_IMAGE_PROXY | 默认的浏览器端图片代理 | url prefix | (空) |
|
||||||
| NEXT_PUBLIC_DOUBAN_PROXY | 默认的浏览器端豆瓣数据代理 | url prefix | (空) |
|
| NEXT_PUBLIC_DOUBAN_PROXY | 默认的浏览器端豆瓣数据代理 | url prefix | (空) |
|
||||||
|
|
||||||
## 配置说明
|
## 📋 配置说明
|
||||||
|
|
||||||
所有可自定义项集中在根目录的 `config.json` 中:
|
所有可自定义项集中在根目录的 `config.json` 中:
|
||||||
|
|
||||||
|
@ -251,7 +282,7 @@ MoonTV 支持标准的苹果 CMS V10 API 格式。
|
||||||
|
|
||||||
修改后 **无需重新构建**,服务会在启动时读取一次。
|
修改后 **无需重新构建**,服务会在启动时读取一次。
|
||||||
|
|
||||||
## 管理员配置
|
## 👨💼 管理员配置
|
||||||
|
|
||||||
**该特性目前仅支持通过非 localstorage 存储的部署方式使用**
|
**该特性目前仅支持通过非 localstorage 存储的部署方式使用**
|
||||||
|
|
||||||
|
@ -261,19 +292,26 @@ MoonTV 支持标准的苹果 CMS V10 API 格式。
|
||||||
|
|
||||||
站长或管理员访问 `/admin` 即可进行管理员配置
|
站长或管理员访问 `/admin` 即可进行管理员配置
|
||||||
|
|
||||||
## AndroidTV 使用
|
## 📱 AndroidTV 使用
|
||||||
|
|
||||||
目前该项目可以配合 [OrionTV](https://github.com/zimplexing/OrionTV) 在 Android TV 上使用,可以直接作为 OrionTV 后端
|
目前该项目可以配合 [OrionTV](https://github.com/zimplexing/OrionTV) 在 Android TV 上使用,可以直接作为 OrionTV 后端
|
||||||
|
|
||||||
暂时收藏夹与播放记录和网页端隔离,后续会支持同步用户数据
|
暂时收藏夹与播放记录和网页端隔离,后续会支持同步用户数据
|
||||||
|
|
||||||
## Roadmap
|
## 🗓️ Roadmap
|
||||||
|
|
||||||
- [x] 深色模式
|
- [x] 深色模式
|
||||||
- [x] 持久化存储
|
- [x] 持久化存储
|
||||||
- [x] 多账户
|
- [x] 多账户
|
||||||
|
- [x] 观看历史记录
|
||||||
|
- [x] PWA 支持
|
||||||
|
- [x] 豆瓣集成
|
||||||
|
- [ ] 弹幕系统
|
||||||
|
- [ ] 字幕支持
|
||||||
|
- [ ] 下载功能
|
||||||
|
- [ ] 社交分享
|
||||||
|
|
||||||
## 安全与隐私提醒
|
## ⚠️ 安全与隐私提醒
|
||||||
|
|
||||||
### 强烈建议设置密码保护
|
### 强烈建议设置密码保护
|
||||||
|
|
||||||
|
@ -296,11 +334,11 @@ MoonTV 支持标准的苹果 CMS V10 API 格式。
|
||||||
- 如因公开分享导致的任何法律问题,用户需自行承担责任
|
- 如因公开分享导致的任何法律问题,用户需自行承担责任
|
||||||
- 项目开发者不对用户的使用行为承担任何法律责任
|
- 项目开发者不对用户的使用行为承担任何法律责任
|
||||||
|
|
||||||
## License
|
## 📄 License
|
||||||
|
|
||||||
[MIT](LICENSE) © 2025 MoonTV & Contributors
|
[MIT](LICENSE) © 2025 MoonTV & Contributors
|
||||||
|
|
||||||
## 致谢
|
## 🙏 致谢
|
||||||
|
|
||||||
- [ts-nextjs-tailwind-starter](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter) — 项目最初基于该脚手架。
|
- [ts-nextjs-tailwind-starter](https://github.com/theodorusclarence/ts-nextjs-tailwind-starter) — 项目最初基于该脚手架。
|
||||||
- [LibreTV](https://github.com/LibreSpark/LibreTV) — 由此启发,站在巨人的肩膀上。
|
- [LibreTV](https://github.com/LibreSpark/LibreTV) — 由此启发,站在巨人的肩膀上。
|
||||||
|
|
|
@ -0,0 +1,352 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MoonTV 版本管理脚本
|
||||||
|
* 用于自动化版本号更新、CHANGELOG 生成和发布管理
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
// 配置文件路径
|
||||||
|
const PACKAGE_JSON = path.join(__dirname, '../package.json');
|
||||||
|
const VERSION_TXT = path.join(__dirname, '../VERSION.txt');
|
||||||
|
const CHANGELOG_MD = path.join(__dirname, '../CHANGELOG.md');
|
||||||
|
const README_MD = path.join(__dirname, '../README.md');
|
||||||
|
|
||||||
|
// 版本类型
|
||||||
|
const VERSION_TYPES = {
|
||||||
|
MAJOR: 'major', // 主版本号 (x.0.0)
|
||||||
|
MINOR: 'minor', // 次版本号 (0.x.0)
|
||||||
|
PATCH: 'patch', // 修订版本号 (0.0.x)
|
||||||
|
PRE: 'pre', // 预发布版本
|
||||||
|
BUILD: 'build' // 构建版本
|
||||||
|
};
|
||||||
|
|
||||||
|
// 颜色输出
|
||||||
|
const colors = {
|
||||||
|
reset: '\x1b[0m',
|
||||||
|
bright: '\x1b[1m',
|
||||||
|
red: '\x1b[31m',
|
||||||
|
green: '\x1b[32m',
|
||||||
|
yellow: '\x1b[33m',
|
||||||
|
blue: '\x1b[34m',
|
||||||
|
magenta: '\x1b[35m',
|
||||||
|
cyan: '\x1b[36m'
|
||||||
|
};
|
||||||
|
|
||||||
|
function log(message, color = 'reset') {
|
||||||
|
console.log(`${colors[color]}${message}${colors.reset}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function error(message) {
|
||||||
|
log(`❌ ${message}`, 'red');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function success(message) {
|
||||||
|
log(`✅ ${message}`, 'green');
|
||||||
|
}
|
||||||
|
|
||||||
|
function info(message) {
|
||||||
|
log(`ℹ️ ${message}`, 'blue');
|
||||||
|
}
|
||||||
|
|
||||||
|
function warning(message) {
|
||||||
|
log(`⚠️ ${message}`, 'yellow');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取当前版本
|
||||||
|
function getCurrentVersion() {
|
||||||
|
try {
|
||||||
|
const packageJson = JSON.parse(fs.readFileSync(PACKAGE_JSON, 'utf8'));
|
||||||
|
return packageJson.version;
|
||||||
|
} catch (err) {
|
||||||
|
error('无法读取 package.json 文件');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取 VERSION.txt
|
||||||
|
function getVersionTxt() {
|
||||||
|
try {
|
||||||
|
return fs.readFileSync(VERSION_TXT, 'utf8').trim();
|
||||||
|
} catch (err) {
|
||||||
|
error('无法读取 VERSION.txt 文件');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新版本号
|
||||||
|
function updateVersion(type, preRelease = null) {
|
||||||
|
const currentVersion = getCurrentVersion();
|
||||||
|
const [major, minor, patch] = currentVersion.split('.').map(Number);
|
||||||
|
|
||||||
|
let newVersion;
|
||||||
|
let newVersionTxt;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case VERSION_TYPES.MAJOR:
|
||||||
|
newVersion = `${major + 1}.0.0`;
|
||||||
|
break;
|
||||||
|
case VERSION_TYPES.MINOR:
|
||||||
|
newVersion = `${major}.${minor + 1}.0`;
|
||||||
|
break;
|
||||||
|
case VERSION_TYPES.PATCH:
|
||||||
|
newVersion = `${major}.${minor}.${patch + 1}`;
|
||||||
|
break;
|
||||||
|
case VERSION_TYPES.PRE:
|
||||||
|
if (!preRelease) {
|
||||||
|
error('预发布版本需要指定标识符 (如: alpha, beta, rc)');
|
||||||
|
}
|
||||||
|
newVersion = `${major}.${minor}.${patch + 1}-${preRelease}.1`;
|
||||||
|
break;
|
||||||
|
case VERSION_TYPES.BUILD:
|
||||||
|
newVersion = `${major}.${minor}.${patch + 1}`;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error(`不支持的版本类型: ${type}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成新的版本时间戳
|
||||||
|
const now = new Date();
|
||||||
|
newVersionTxt = now.getFullYear().toString() +
|
||||||
|
String(now.getMonth() + 1).padStart(2, '0') +
|
||||||
|
String(now.getDate()).padStart(2, '0') +
|
||||||
|
String(now.getHours()).padStart(2, '0') +
|
||||||
|
String(now.getMinutes()).padStart(2, '0') +
|
||||||
|
String(now.getSeconds()).padStart(2, '0');
|
||||||
|
|
||||||
|
return { newVersion, newVersionTxt };
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新 package.json
|
||||||
|
function updatePackageJson(newVersion) {
|
||||||
|
try {
|
||||||
|
const packageJson = JSON.parse(fs.readFileSync(PACKAGE_JSON, 'utf8'));
|
||||||
|
packageJson.version = newVersion;
|
||||||
|
fs.writeFileSync(PACKAGE_JSON, JSON.stringify(packageJson, null, 2) + '\n');
|
||||||
|
success(`package.json 版本已更新为 ${newVersion}`);
|
||||||
|
} catch (err) {
|
||||||
|
error(`更新 package.json 失败: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新 VERSION.txt
|
||||||
|
function updateVersionTxt(newVersionTxt) {
|
||||||
|
try {
|
||||||
|
fs.writeFileSync(VERSION_TXT, newVersionTxt + '\n');
|
||||||
|
success(`VERSION.txt 已更新为 ${newVersionTxt}`);
|
||||||
|
} catch (err) {
|
||||||
|
error(`更新 VERSION.txt 失败: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新 CHANGELOG.md
|
||||||
|
function updateChangelog(newVersion, type) {
|
||||||
|
try {
|
||||||
|
const changelog = fs.readFileSync(CHANGELOG_MD, 'utf8');
|
||||||
|
const today = new Date().toISOString().split('T')[0];
|
||||||
|
|
||||||
|
// 创建新版本条目
|
||||||
|
const newEntry = `## [${newVersion}] - ${today}
|
||||||
|
|
||||||
|
### ✨ 新功能
|
||||||
|
- 新增功能描述
|
||||||
|
|
||||||
|
### 🐛 问题修复
|
||||||
|
- 修复问题描述
|
||||||
|
|
||||||
|
### 🔧 改进
|
||||||
|
- 改进内容描述
|
||||||
|
|
||||||
|
### 📝 文档更新
|
||||||
|
- 文档更新内容
|
||||||
|
|
||||||
|
### 🚀 部署说明
|
||||||
|
|
||||||
|
#### Docker 部署
|
||||||
|
\`\`\`bash
|
||||||
|
docker pull ghcr.io/senshinya/moontv:v${newVersion}
|
||||||
|
docker run -d --name moontv -p 3000:3000 --env PASSWORD=your_password ghcr.io/senshinya/moontv:v${newVersion}
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
#### 环境变量更新
|
||||||
|
请查看 [README.md](README.md) 了解最新的环境变量配置。
|
||||||
|
|
||||||
|
### 📋 完整更新日志
|
||||||
|
查看 [CHANGELOG.md](CHANGELOG.md) 了解详细的更新历史。
|
||||||
|
|
||||||
|
### 🔗 相关链接
|
||||||
|
- [项目主页](https://github.com/senshinya/moontv)
|
||||||
|
- [在线演示](https://moontv.vercel.app)
|
||||||
|
- [问题反馈](https://github.com/senshinya/moontv/issues)
|
||||||
|
- [功能建议](https://github.com/senshinya/moontv/discussions)
|
||||||
|
|
||||||
|
`;
|
||||||
|
|
||||||
|
// 在未发布部分后插入新版本
|
||||||
|
const updatedChangelog = changelog.replace(
|
||||||
|
'## [未发布]',
|
||||||
|
`## [未发布]\n\n### 计划中\n- 弹幕系统支持\n- 字幕文件支持\n- 下载功能\n- 社交分享功能\n- 用户评分系统\n\n${newEntry}`
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(CHANGELOG_MD, updatedChangelog);
|
||||||
|
success('CHANGELOG.md 已更新');
|
||||||
|
} catch (err) {
|
||||||
|
error(`更新 CHANGELOG.md 失败: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建 Git 标签
|
||||||
|
function createGitTag(version) {
|
||||||
|
try {
|
||||||
|
execSync(`git tag v${version}`, { stdio: 'inherit' });
|
||||||
|
success(`Git 标签 v${version} 已创建`);
|
||||||
|
} catch (err) {
|
||||||
|
warning(`创建 Git 标签失败: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提交更改
|
||||||
|
function commitChanges(version) {
|
||||||
|
try {
|
||||||
|
execSync('git add .', { stdio: 'inherit' });
|
||||||
|
execSync(`git commit -m "chore: bump version to ${version}"`, { stdio: 'inherit' });
|
||||||
|
success('版本更改已提交到 Git');
|
||||||
|
} catch (err) {
|
||||||
|
warning(`Git 提交失败: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示帮助信息
|
||||||
|
function showHelp() {
|
||||||
|
console.log(`
|
||||||
|
${colors.bright}MoonTV 版本管理脚本${colors.reset}
|
||||||
|
|
||||||
|
用法: node scripts/version-manager.js <命令> [选项]
|
||||||
|
|
||||||
|
命令:
|
||||||
|
${colors.cyan}major${colors.reset} 增加主版本号 (x.0.0)
|
||||||
|
${colors.cyan}minor${colors.reset} 增加次版本号 (0.x.0)
|
||||||
|
${colors.cyan}patch${colors.reset} 增加修订版本号 (0.0.x)
|
||||||
|
${colors.cyan}pre <标识符>${colors.reset} 创建预发布版本 (如: alpha, beta, rc)
|
||||||
|
${colors.cyan}build${colors.reset} 增加构建版本号
|
||||||
|
${colors.cyan}show${colors.reset} 显示当前版本信息
|
||||||
|
${colors.cyan}help${colors.reset} 显示此帮助信息
|
||||||
|
|
||||||
|
选项:
|
||||||
|
--no-commit 不自动提交 Git 更改
|
||||||
|
--no-tag 不自动创建 Git 标签
|
||||||
|
--no-changelog 不更新 CHANGELOG.md
|
||||||
|
|
||||||
|
示例:
|
||||||
|
node scripts/version-manager.js patch
|
||||||
|
node scripts/version-manager.js minor --no-commit
|
||||||
|
node scripts/version-manager.js pre alpha
|
||||||
|
node scripts/version-manager.js show
|
||||||
|
|
||||||
|
注意: 此脚本会自动更新以下文件:
|
||||||
|
- package.json
|
||||||
|
- VERSION.txt
|
||||||
|
- CHANGELOG.md
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示当前版本信息
|
||||||
|
function showVersionInfo() {
|
||||||
|
const packageVersion = getCurrentVersion();
|
||||||
|
const versionTxt = getVersionTxt();
|
||||||
|
|
||||||
|
console.log(`
|
||||||
|
${colors.bright}当前版本信息:${colors.reset}
|
||||||
|
|
||||||
|
📦 Package.json 版本: ${colors.green}${packageVersion}${colors.reset}
|
||||||
|
📅 VERSION.txt: ${colors.blue}${versionTxt}${colors.reset}
|
||||||
|
📋 版本类型: ${colors.yellow}${packageVersion.includes('-') ? '预发布版本' : '正式版本'}${colors.reset}
|
||||||
|
|
||||||
|
💡 使用 'node scripts/version-manager.js help' 查看所有可用命令
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 主函数
|
||||||
|
function main() {
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
|
||||||
|
if (args.length === 0 || args.includes('help') || args.includes('--help') || args.includes('-h')) {
|
||||||
|
showHelp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.includes('show')) {
|
||||||
|
showVersionInfo();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const command = args[0];
|
||||||
|
const options = {
|
||||||
|
noCommit: args.includes('--no-commit'),
|
||||||
|
noTag: args.includes('--no-tag'),
|
||||||
|
noChangelog: args.includes('--no-changelog')
|
||||||
|
};
|
||||||
|
|
||||||
|
// 验证命令
|
||||||
|
if (!Object.values(VERSION_TYPES).includes(command)) {
|
||||||
|
error(`无效的命令: ${command}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取预发布标识符
|
||||||
|
let preRelease = null;
|
||||||
|
if (command === VERSION_TYPES.PRE) {
|
||||||
|
if (args.length < 2) {
|
||||||
|
error('预发布版本需要指定标识符 (如: alpha, beta, rc)');
|
||||||
|
}
|
||||||
|
preRelease = args[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
info(`开始更新版本...`);
|
||||||
|
info(`当前版本: ${getCurrentVersion()}`);
|
||||||
|
|
||||||
|
// 更新版本
|
||||||
|
const { newVersion, newVersionTxt } = updateVersion(command, preRelease);
|
||||||
|
info(`新版本: ${newVersion}`);
|
||||||
|
|
||||||
|
// 更新文件
|
||||||
|
updatePackageJson(newVersion);
|
||||||
|
updateVersionTxt(newVersionTxt);
|
||||||
|
|
||||||
|
if (!options.noChangelog) {
|
||||||
|
updateChangelog(newVersion, command);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Git 操作
|
||||||
|
if (!options.noCommit) {
|
||||||
|
commitChanges(newVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.noTag) {
|
||||||
|
createGitTag(newVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
success(`\n🎉 版本更新完成!`);
|
||||||
|
success(`新版本: ${newVersion}`);
|
||||||
|
success(`时间戳: ${newVersionTxt}`);
|
||||||
|
|
||||||
|
if (!options.noCommit) {
|
||||||
|
info('提示: 使用 "git push --tags" 推送标签到远程仓库');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 运行脚本
|
||||||
|
if (require.main === module) {
|
||||||
|
main();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
VERSION_TYPES,
|
||||||
|
getCurrentVersion,
|
||||||
|
getVersionTxt,
|
||||||
|
updateVersion,
|
||||||
|
updatePackageJson,
|
||||||
|
updateVersionTxt,
|
||||||
|
updateChangelog
|
||||||
|
};
|
Loading…
Reference in New Issue