![]()
一个基于 Next.js 16 构建的现代化视频聚合播放平台。采用独特的 "Liquid Glass" 设计语言,提供流畅的视觉体验和强大的视频搜索功能。
在线体验:https://kvideo.pages.dev/
KVideo 是一个高性能、现代化的视频聚合与播放应用,专注于提供极致的用户体验和视觉设计。本项目利用 Next.js 16 的最新特性,结合 React 19 和 Tailwind CSS v4,打造了一个既美观又强大的视频浏览平台。
说明:仓库默认不内置任何视频源、高级源或 IPTV 源。部署者必须自行配置已获授权、可合法使用且允许当前部署方式访问的内容来源。
项目的视觉设计基于 "Liquid Glass" 设计系统,这是一套融合了以下特性的现代化 UI 设计语言:
backdrop-filter 实现的磨砂半透明效果,让 UI 元素如同真实的玻璃材质rounded-2xl 和 rounded-full 两种圆角半径,创造和谐的视觉体验cubic-bezier 曲线,实现自然的加速和减速过渡http-user-agent 和 http-referrer 属性,通过代理传递iptv_access 权限控制谁可以访问 IPTV 功能useTransition 非阻塞渲染,避免大列表卡顿DANMAKU_API_URL 或 NEXT_PUBLIC_DANMAKU_API_URL 为所有用户预设弹幕 API 地址解决 iOS Safari「添加到主屏幕」后 PWA 与浏览器之间 localStorage 不共享的问题(#119),同时实现多设备配置共享(#115)。
工作原理:
/api/user/config API 存储在 Upstash Redis 中,使用 user:config:{profileId} 作为 key。Edge Runtime 兼容,Cloudflare Pages / Vercel 均可部署。useConfigSync hook 从服务端拉取配置,与本地 updatedAt 时间戳比较——服务端更新时自动合并到本地。sources)、高级源 (premiumSources)、订阅列表 (subscriptions)、屏蔽分类 (blockedCategories)、排序偏好 (sortBy)、语言 (locale)。profileId(SHA-256 哈希)隔离,不同账户互不影响。使用前提:
UPSTASH_REDIS_REST_URL 和 UPSTASH_REDIS_REST_TOKEN),与观看历史/收藏同步共用同一 Redis 实例。典型场景:
/premium 即可进入独立的高级视频专区MainActivity.kt 中修改 KVIDEO_URL 常量指向你的部署实例tv-mode CSS 类,激活大屏优化样式ContentView.swift 中修改 kvideoURL 常量指向你的部署实例本应用注重用户隐私:
KVideo 现在支持两套认证模式:
AUTH_SECRET + Upstash Redis 后,登录改为 用户名 + 密码,超级管理员可直接在设置页创建、修改、重置和删除账户。ADMIN_PASSWORD / ACCESS_PASSWORD / ACCOUNTS 进行密码登录。启用条件:
AUTH_SECRETUPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKEN启用后:
首次启用时,如果 Redis 里还没有账户,会自动使用 ADMIN_PASSWORD 和 ACCOUNTS 作为引导种子创建首批托管账户。
通过 ADMIN_PASSWORD 环境变量设置管理员密码:
# Docker
docker run -d -p 3000:3000 -e ADMIN_PASSWORD=your_password --name kvideo kuekhaoyang/kvideo:latest
登录后自动获得超级管理员权限,可管理所有设置。
向后兼容:
ACCESS_PASSWORD环境变量仍然有效,当ADMIN_PASSWORD未设置时,ACCESS_PASSWORD将作为管理员密码使用。
通过 ACCOUNTS 环境变量配置多个账户,每个账户拥有独立的数据空间(收藏、历史、设置、个人源等)。
兼容格式:
密码:名称[:角色[:权限1|权限2|...]]用户名:密码:名称[:角色[:权限1|权限2|...]]多个账户之间用逗号分隔。
super_admin(超级管理员)、admin(管理员)或 viewer(观众,默认)| 分隔,为该账户添加其角色之外的额外权限# 基本用法
docker run -d -p 3000:3000 \
-e ACCOUNTS="pass1:张三:admin,pass2:李四:viewer,pass3:王五" \
--name kvideo kuekhaoyang/kvideo:latest
# 为观众添加额外权限(如 IPTV 访问和源管理)
docker run -d -p 3000:3000 \
-e ACCOUNTS="pass1:张三:admin,pass2:李四:viewer:iptv_access|source_management" \
--name kvideo kuekhaoyang/kvideo:latest
特点:
- 每个账户拥有独立的收藏、历史、设置和个人视频源数据
- 可同时配置 ADMIN_PASSWORD(作为超级管理员入口)
- 支持为任何角色添加额外的自定义权限
| 权限 | 说明 | super_admin | admin | viewer |
|---|---|---|---|---|
source_management |
管理系统视频源 | ✓ | - | - |
account_management |
查看账户列表 | ✓ | - | - |
danmaku_api |
配置系统弹幕 API | ✓ | - | - |
data_management |
导出/导入/重置数据 | ✓ | - | - |
player_settings |
播放器设置 | ✓ | ✓ | - |
danmaku_appearance |
弹幕外观设置 | ✓ | ✓ | - |
view_settings |
显示设置 | ✓ | ✓ | ✓ |
iptv_access |
访问 IPTV 功能 | ✓ | ✓ | - |
通过 ACCOUNTS 的第 4 个字段,可以为任何角色添加上表中的额外权限。例如让观众也能访问 IPTV:
password:name:viewer:iptv_access
所有已登录的用户(包括观众)都可以:
这些数据按用户 profileId 隔离存储,切换账户后自动加载对应的个人配置。
说明:旧环境变量模式下仍然支持“仅输入密码”登录;托管账户模式下则统一改为“用户名 + 密码”登录。
通过 PREMIUM_PASSWORD 环境变量为高级内容(/premium)设置独立的访问密码,实现与主密码的分离控制。
适合场景:给家人分享普通密码,但高级内容需要额外密码才能访问。
# Docker
docker run -d -p 3000:3000 \
-e ADMIN_PASSWORD="admin123" \
-e PREMIUM_PASSWORD="premium456" \
--name kvideo kuekhaoyang/kvideo:latest
特点:
- 访问 /premium 页面时需输入此专用密码
- 管理员密码和 admin/super_admin 账号也可以解锁高级内容
- 密码仅在当前浏览器会话有效,关闭浏览器后需重新输入
- 不设置此变量时,高级内容无额外密码保护
通过 PERSIST_SESSION 环境变量控制用户登录后是否在设备上记住会话:
| 变量名 | 选项 | 说明 | 默认值 |
|---|---|---|---|
PERSIST_SESSION |
true / false |
是否在本地浏览器持久化保存登录状态。设置为 true 时,用户只需登录一次,后续访问无需再次登录。 |
true |
[!NOTE] 此功能仅在设置了
ADMIN_PASSWORD、ACCESS_PASSWORD或ACCOUNTS时才会生效。
通过环境变量可以自定义站点名称、标题和描述,无需修改源代码。
| 变量名 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_SITE_TITLE |
浏览器标签页标题 | KVideo - 视频聚合平台 |
NEXT_PUBLIC_SITE_DESCRIPTION |
站点描述 | 视频聚合平台 |
NEXT_PUBLIC_SITE_NAME |
站点头部名称 | KVideo |
Vercel 部署: 在 Vercel 项目设置中添加环境变量:
NEXT_PUBLIC_SITE_NAME我的视频平台Cloudflare Pages 部署:
在 Cloudflare Pages 项目设置中添加环境变量:
- 变量名:NEXT_PUBLIC_SITE_NAME
- 变量值:我的视频平台
本地开发:
在项目根目录创建 .env.local 文件:
NEXT_PUBLIC_SITE_NAME=我的视频平台
NEXT_PUBLIC_SITE_TITLE=我的视频 - 聚合播放平台
NEXT_PUBLIC_SITE_DESCRIPTION=专属视频聚合播放平台
[!NOTE]
NEXT_PUBLIC_SITE_*属于构建时变量。直接运行 Docker Hub 的预构建镜像时,docker run -e NEXT_PUBLIC_SITE_* ...不会覆盖已经打包进前端的文案。
Docker 预构建镜像支持在运行时替换图标,无需重新构建镜像。该配置会作用于顶部 Logo 和浏览器 favicon;如果你还要同步替换安装后的 PWA 图标,请直接覆盖仓库中的 public/icon.png 后重新构建镜像。
| 变量名 | 说明 |
|---|---|
SITE_ICON_FILE |
从容器内文件路径读取图标,适合 Docker 挂载,优先级高于 SITE_ICON_URL |
SITE_ICON_URL |
直接使用外部 URL 或站内路径作为图标 |
Docker 挂载文件(推荐):
docker run -d -p 3000:3000 \
-v /path/to/icon.png:/app/custom/icon.png:ro \
-e SITE_ICON_FILE=/app/custom/icon.png \
--name kvideo kuekhaoyang/kvideo:latest
Docker 使用 URL:
docker run -d -p 3000:3000 \
-e SITE_ICON_URL="https://example.com/icon.png" \
--name kvideo kuekhaoyang/kvideo:latest
Docker 使用站内路径:
docker run -d -p 3000:3000 \
-e SITE_ICON_URL="/placeholder-poster.svg" \
--name kvideo kuekhaoyang/kvideo:latest
可以通过环境变量自动配置订阅源,应用启动时会自动加载并设置为自动更新。
支持两种环境变量名:SUBSCRIPTION_SOURCES(服务端) 和 NEXT_PUBLIC_SUBSCRIPTION_SOURCES(客户端构建时嵌入)。
格式: JSON 数组字符串,包含 name 和 url 字段;或直接提供订阅 URL(逗号分隔多个)。
示例:
# JSON 格式
SUBSCRIPTION_SOURCES='[{"name":"每日更新源","url":"https://example.com/api.json"},{"name":"备用源","url":"https://backup.com/api.json"}]'
# 简单 URL 格式
SUBSCRIPTION_SOURCES='https://example.com/api.json,https://backup.com/api.json'
Docker 部署:
docker run -d -p 3000:3000 -e SUBSCRIPTION_SOURCES='[{"name":"MySource","url":"..."}]' --name kvideo kuekhaoyang/kvideo:latest
Vercel 部署:
在 Vercel 项目设置中添加环境变量:
- 变量名:SUBSCRIPTION_SOURCES
- 变量值:[{"name":"...","url":"..."}]
Cloudflare Pages 部署:
在 Cloudflare Pages 项目设置中添加环境变量: - 变量名:`NEXT_PUBL
$ claude mcp add KVideo \
-- python -m otcore.mcp_server <graph>