🎬 KodakTV 是一个开箱即用的、跨平台的影视聚合播放器。它基于 Next.js 14 + Tailwind CSS + TypeScript 构建,支持多资源搜索、在线播放、收藏同步、播放记录、云端存储,让你可以随时随地畅享海量免费影视内容。
- 🔍 多源聚合搜索:一次搜索立刻返回全源结果。
- 📄 丰富详情页:支持剧集列表、演员、年份、简介等完整信息展示。
▶️ 流畅在线播放:集成 HLS.js & ArtPlayer。- ❤️ 收藏 + 继续观看:支持 Kvrocks/Redis/Upstash 存储,多端同步进度。
- 📱 PWA:离线缓存、安装到桌面/主屏,移动端原生体验。
- 🌗 响应式布局:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
- 👿 智能去广告:自动跳过视频中的切片广告(实验性)。
| 分类 | 主要依赖 |
|---|---|
| 前端框架 | Next.js 14 · App Router |
| UI & 样式 | Tailwind CSS 3 |
| 语言 | TypeScript 4 |
| 播放器 | ArtPlayer · HLS.js |
| 代码质量 | ESLint · Prettier · Jest |
| 部署 | Docker |
本项目仅支持 Docker 或其他基于 Docker 的平台 部署。
已提供完整模板说明文档,你可以在 Zeabur 中创建并发布模板,然后将模板链接写入 README 按钮:
创建完成后,将下方按钮链接中的 <TEMPLATE_ID> 替换为你发布后的实际 ID:
在模板发布前或不使用模板时,可按下方「☁️ Zeabur 部署(推荐)」的手动方式添加服务(KodakTV 镜像 + KVRocks),效果与一键部署一致:
优势:
- ✅ 无需配置,一键启动(自动部署完整环境)
- ✅ 自动 HTTPS 和全球 CDN 加速
- ✅ 持久化存储,数据永不丢失
- ✅ 免费额度足够个人使用
模板发布后,我们会把一键部署按钮固定为你的 KodakTV 模板链接,后续用户即可一键部署正确环境。
services: kodaktv-core: image: ghcr.io/korean032/kodaktv:latest container_name: kodaktv-core restart: on-failure ports: - '3000:3000' environment: - USERNAME=admin - PASSWORD=admin_password - NEXT_PUBLIC_STORAGE_TYPE=kvrocks - KVROCKS_URL=redis://kodaktv-kvrocks:6666 networks: - kodaktv-network depends_on: - kodaktv-kvrocks kodaktv-kvrocks: image: apache/kvrocks container_name: kodaktv-kvrocks restart: unless-stopped volumes: - kvrocks-data:/var/lib/kvrocks networks: - kodaktv-network networks: kodaktv-network: driver: bridge volumes: kvrocks-data:
services: kodaktv-core: image: ghcr.io/korean032/kodaktv:latest container_name: kodaktv-core restart: on-failure ports: - '3000:3000' environment: - USERNAME=admin - PASSWORD=admin_password - NEXT_PUBLIC_STORAGE_TYPE=redis - REDIS_URL=redis://kodaktv-redis:6379 networks: - kodaktv-network depends_on: - kodaktv-redis kodaktv-redis: image: redis:alpine container_name: kodaktv-redis restart: unless-stopped networks: - kodaktv-network # 请开启持久化,否则升级/重启后数据丢失 volumes: - ./data:/data networks: kodaktv-network: driver: bridge
- 在 upstash 注册账号并新建一个 Redis 实例,名称任意。
- 复制新数据库的 HTTPS ENDPOINT 和 TOKEN
- 使用如下 docker compose
services: kodaktv-core: image: ghcr.io/korean032/kodaktv:latest container_name: kodaktv-core restart: on-failure ports: - '3000:3000' environment: - USERNAME=admin - PASSWORD=admin_password - NEXT_PUBLIC_STORAGE_TYPE=upstash - UPSTASH_URL=上面 https 开头的 HTTPS ENDPOINT - UPSTASH_TOKEN=上面的 TOKEN
Thanks to @SzeMeng76
Zeabur 是一站式云端部署平台,使用预构建的 Docker 镜像可以快速部署,无需等待构建。
部署步骤:
-
添加 KVRocks 服务(先添加数据库)
- 点击 "Add Service" > "Docker Images"
- 输入镜像名称:
apache/kvrocks - 配置端口:
6666(TCP) - 记住服务名称(通常是
apachekvrocks) - 配置持久化卷(重要):
- 在服务设置中找到 "Volumes" 部分
- 点击 "Add Volume" 添加新卷
- Volume ID:
kvrocks-data(可自定义,仅支持字母、数字、连字符) - Path:
/var/lib/kvrocks/db - 保存配置
💡 重要提示:持久化卷路径必须设置为
/var/lib/kvrocks/db(KVRocks 数据目录),这样配置文件保留在容器内,数据库文件持久化,重启后数据不会丢失! -
添加 KodakTV 服务
- 点击 "Add Service" > "Docker Images"
- 输入镜像名称:
ghcr.io/korean032/kodaktv:latest - 配置端口:
3000(HTTP)
-
配置环境变量
在 KodakTV 服务的环境变量中添加:
# 必填:管理员账号 USERNAME=admin PASSWORD=your_secure_password # 必填:存储配置 NEXT_PUBLIC_STORAGE_TYPE=kvrocks KVROCKS_URL=redis://apachekvrocks:6666 # 可选:站点配置 SITE_BASE=https://your-domain.zeabur.app NEXT_PUBLIC_SITE_NAME=KodakTV Enhanced ANNOUNCEMENT=欢迎使用 KodakTV Enhanced Edition # 可选:豆瓣代理配置(推荐) NEXT_PUBLIC_DOUBAN_PROXY_TYPE=cmliussss-cdn-tencent NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE=cmliussss-cdn-tencent
注意:
- 使用服务名称作为主机名:
redis://apachekvrocks:6666 - 如果服务名称不同,请替换为实际名称
- 两个服务必须在同一个 Project 中
- 使用服务名称作为主机名:
-
部署完成
- Zeabur 会自动拉取镜像并启动服务
- 等待服务就绪后,需要手动设置访问域名(见下一步)
- 在 KodakTV 服务页面,点击 "Networking" 或 "网络" 标签
- 点击 "Generate Domain" 生成 Zeabur 提供的免费域名(如
xxx.zeabur.app) - 或者绑定自定义域名:
- 点击 "Add Domain" 添加你的域名
- 按照提示配置 DNS CNAME 记录指向 Zeabur 提供的目标地址
- 设置完域名后即可通过域名访问 KodakTV
- 绑定自定义域名(可选)
- 在服务设置中点击 "Domains"
- 添加你的自定义域名
- 配置 DNS CNAME 记录指向 Zeabur 提供的域名
当 Docker 镜像有新版本发布时,Zeabur 不会自动更新。需要手动触发更新。
更新步骤:
-
进入服务页面
- 点击需要更新的服务(KodakTV 或 KVRocks)
-
重启服务
- 点击 "服务状态" 页面,再点击 "重启当前版本" 按钮
- Zeabur 会自动拉取最新的
latest镜像并重新部署
💡 提示:
- 使用
latest标签时,Restart 会自动拉取最新镜像- 生产环境推荐使用固定版本标签(如
v5.5.6)避免意外更新
完成部署后为空壳应用,无播放源,需要站长在管理后台的配置文件设置中填写配置文件(后续会支持订阅)
配置文件示例如下:
{
"cache_time": 7200,
"api_site": {
"dyttzy": {
"api": "http://xxx.com/api.php/provide/vod",
"name": "示例资源",
"detail": "http://xxx.com"
}
// ...更多站点
},
"custom_category": [
{
"name": "华语",
"type": "movie",
"query": "华语"
}
]
}cache_time:接口缓存时间(秒)。api_site:你可以增删或替换任何资源站,字段说明:key:唯一标识,保持小写字母/数字。api:资源站提供的vodJSON API 根地址。name:在人机界面中展示的名称。detail:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。
custom_category:自定义分类配置,用于在导航中添加个性化的影视分类。以 type + query 作为唯一标识。支持以下字段:name:分类显示名称(可选,如不提供则使用 query 作为显示名)type:分类类型,支持movie(电影)或tv(电视剧)query:搜索关键词,用于在豆瓣 API 中搜索相关内容
custom_category 支持的自定义分类已知如下:
- movie:热门、最新、经典、豆瓣高分、冷门佳片、华语、欧美、韩国、日本、动作、喜剧、爱情、科幻、悬疑、恐怖、治愈
- tv:热门、美剧、英剧、韩剧、日剧、国产剧、港剧、日本动画、综艺、纪录片
也可输入如 "哈利波特" 效果等同于豆瓣搜索
KodakTV 支持标准的苹果 CMS V10 API 格式。
将完整的配置文件 base58 编码后提供 http 服务即为订阅链接,可在 KodakTV 后台/Helios 中使用。
可借助 watchtower 自动更新镜像容器
dockge/komodo 等 docker compose UI 也有自动更新功能
| 变量 | 说明 | 可选值 | 默认值 |
|---|---|---|---|
| USERNAME | 站长账号 | 任意字符串 | 无默认,必填字段 |
| PASSWORD | 站长密码 | 任意字符串 | 无默认,必填字段 |
| SITE_BASE | 站点 url | 形如 https://example.com | 空 |
| NEXT_PUBLIC_SITE_NAME | 站点名称 | 任意字符串 | KodakTV |
| ANNOUNCEMENT | 站点公告 | 任意字符串 | 本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。 |
| NEXT_PUBLIC_STORAGE_TYPE | 播放记录/收藏的存储方式 | redis、kvrocks、upstash | 无默认,必填字段 |
| KVROCKS_URL | kvrocks 连接 url | 连接 url | 空 |
| REDIS_URL | redis 连接 url | 连接 url | 空 |
| UPSTASH_URL | upstash redis 连接 url | 连接 url | 空 |
| UPSTASH_TOKEN | upstash redis 连接 token | 连接 token | 空 |
| NEXT_PUBLIC_SEARCH_MAX_PAGE | 搜索接口可拉取的最大页数 | 1-50 | 5 |
| NEXT_PUBLIC_DOUBAN_PROXY_TYPE | 豆瓣数据源请求方式 | 见下方 | direct |
| NEXT_PUBLIC_DOUBAN_PROXY | 自定义豆瓣数据代理 URL | url prefix | (空) |
| NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE | 豆瓣图片代理类型 | 见下方 | direct |
| NEXT_PUBLIC_DOUBAN_IMAGE_PROXY | 自定义豆瓣图片代理 URL | url prefix | (空) |
| NEXT_PUBLIC_DISABLE_YELLOW_FILTER | 关闭色情内容过滤 | true/false | false |
| NEXT_PUBLIC_FLUID_SEARCH | 是否开启搜索接口流式输出 | true/ false | true |
NEXT_PUBLIC_DOUBAN_PROXY_TYPE 选项解释:
- direct: 由服务器直接请求豆瓣源站
- cors-proxy-zwei: 浏览器向 cors proxy 请求豆瓣数据,该 cors proxy 由 Zwei 搭建
- cmliussss-cdn-tencent: 浏览器向豆瓣 CDN 请求数据,该 CDN 由 CMLiussss 搭建,并由腾讯云 cdn 提供加速
- cmliussss-cdn-ali: 浏览器向豆瓣 CDN 请求数据,该 CDN 由 CMLiussss 搭建,并由阿里云 cdn 提供加速
- custom: 用户自定义 proxy,由 NEXT_PUBLIC_DOUBAN_PROXY 定义
NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE 选项解释:
- direct:由浏览器直接请求豆瓣分配的默认图片域名
- server:由服务器代理请求豆瓣分配的默认图片域名
- img3:由浏览器请求豆瓣官方的精品 cdn(阿里云)
- cmliussss-cdn-tencent:由浏览器请求豆瓣 CDN,该 CDN 由 CMLiussss 搭建,并由腾讯云 cdn 提供加速
- cmliussss-cdn-ali:由浏览器请求豆瓣 CDN,该 CDN 由 CMLiussss 搭建,并由阿里云 cdn 提供加速
- custom: 用户自定义 proxy,由 NEXT_PUBLIC_DOUBAN_IMAGE_PROXY 定义
为后续的生态集成(YouTube、PanSou 网盘、短剧、IPTV、Bangumi)预留的环境变量与开关。未设置时,对应 Provider 将保持占位或禁用,不影响正常运行。
# 功能开关 NEXT_PUBLIC_ENABLE_YOUTUBE=true NEXT_PUBLIC_ENABLE_PANSOU=true NEXT_PUBLIC_ENABLE_SHORTDRAMA=true NEXT_PUBLIC_ENABLE_IPTV=true NEXT_PUBLIC_ENABLE_BANGUMI=true NEXT_PUBLIC_ENABLE_AI=true NEXT_PUBLIC_ENABLE_TMDB=true # YouTube(服务端搜索与无 Cookie 嵌入播放) YOUTUBE_API_KEY=xxxx YOUTUBE_EMBED_DOMAIN=www.youtube-nocookie.com # PanSou 网盘(占位,需接入合法 API 或自建爬虫) PANSOU_BASE_URL=https://www.pansou.com # 短剧(移动端 API 与代理) SHORTDRAMA_API_BASE=https://api.shortdrama.example MOBILE_PROXY_BASE=https://proxy.example/fetch?url= # IPTV(多源 EPG 与台标代理) IPTV_EPG_SOURCES=https://epg1.xml,https://epg2.xml IPTV_LOGO_PROXY=https://logo-proxy.example/logo?url= # AI 推荐(OpenAI API) OPENAI_API_KEY=sk-xxxx AI_MODEL=gpt-4o-mini AI_SYSTEM_PROMPT=你是一个影视推荐助手,只返回JSON数组。 # 可配置更多AI接口 # OpenAI 兼容接口(OpenAI / OpenRouter / Groq / Together 等) AI_PROVIDER=openai # 或 compatible AI_API_BASE=https://api.openai.com/v1 # 如 https://openrouter.ai/api/v1 或 https://api.groq.com/openai/v1 AI_API_PATH=/chat/completions # Azure OpenAI(与上面二选一) AZURE_OPENAI_ENDPOINT=https://<your-resource>.openai.azure.com AZURE_OPENAI_DEPLOYMENT=<deployment-name> AZURE_OPENAI_API_VERSION=2024年02月01日 # TMDB(演员搜索与发布日历) TMDB_API_KEY=xxxx TMDB_LANG=zh-CN TMDB_REGION=CN
说明:
NEXT_PUBLIC_ENABLE_*为前端开关,控制是否在界面/路由层启用 Provider。- 具体 Provider 的实现按需逐步完善;未提供必需变量时将使用占位实现或禁用该 Provider。
- AI 与 TMDB 需要对应密钥;发布日历支持
week=this|next查询,推荐页支持自定义提示词与类型(movie/youtube/link)。 - AI 接口说明:
- 默认走 OpenAI:
AI_PROVIDER=openai,使用OPENAI_API_KEY,请求https://api.openai.com/v1/chat/completions - 兼容接口:设置
AI_API_BASE/AI_API_PATH,例如 OpenRouter(https://openrouter.ai/api/v1)、Groq(https://api.groq.com/openai/v1),仍用Authorization: Bearer <key> - Azure OpenAI:设置
AI_PROVIDER=azure并提供AZURE_OPENAI_*,认证头为api-key,路径为.../openai/deployments/<dep>/chat/completions?api-version=...
- 默认走 OpenAI:
v100.0.0 以上版本可配合 Selene 使用,移动端体验更加友好,数据完全同步
目前该项目可以配合 OrionTV 在 Android TV 上使用,可以直接作为 OrionTV 后端
已实现播放记录和网页端同步
为了您的安全和避免潜在的法律风险,我们要求在部署时强烈建议关闭公网注册:
- 设置环境变量
PASSWORD:为您的实例设置一个强密码 - 仅供个人使用:请勿将您的实例链接公开分享或传播
- 遵守当地法律:请确保您的使用行为符合当地法律法规
- 本项目仅供学习和个人使用
- 请勿将部署的实例用于商业用途或公开服务
- 如因公开分享导致的任何法律问题,用户需自行承担责任
- 项目开发者不对用户的使用行为承担任何法律责任
- 本项目不在中国大陆地区提供服务。如有该项目在向中国大陆地区提供服务,属个人行为。在该地区使用所产生的法律风险及责任,属于用户个人行为,与本项目无关,须自行承担全部责任。特此声明
MIT © 2025 KodakTV & Contributors