Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

【停止更新】本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源

License

Notifications You must be signed in to change notification settings

MoonTechLab/LunaTV

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

127 Commits

Repository files navigation

MoonTV

🎬 MoonTV 是一个开箱即用的、跨平台的影视聚合播放器。它基于 Next.js 14 + Tailwind CSS + TypeScript 构建,支持多资源搜索、在线播放、收藏同步、播放记录、云端存储,让你可以随时随地畅享海量免费影视内容。


✨ 功能特性

  • 🔍 多源聚合搜索:一次搜索立刻返回全源结果。
  • 📄 丰富详情页:支持剧集列表、演员、年份、简介等完整信息展示。
  • ▶️ 流畅在线播放:集成 HLS.js & ArtPlayer。
  • ❤️ 收藏 + 继续观看:支持 Kvrocks/Redis/Upstash 存储,多端同步进度。
  • 📱 PWA:离线缓存、安装到桌面/主屏,移动端原生体验。
  • 🌗 响应式布局:桌面侧边栏 + 移动底部导航,自适应各种屏幕尺寸。
  • 👿 智能去广告:自动跳过视频中的切片广告(实验性)。

注意:部署后项目为空壳项目,无内置播放源和直播源,需要自行收集

点击查看项目截图 项目截图 项目截图 项目截图

请不要在 B站、小红书、微信公众号、抖音、今日头条或其他中国大陆社交平台发布视频或文章宣传本项目,不授权任何"科技周刊/月刊"类项目或站点收录本项目。

🗺 目录

技术栈

分类 主要依赖
前端框架 Next.js 14 · App Router
UI & 样式 Tailwind CSS 3
语言 TypeScript 4
播放器 ArtPlayer · HLS.js
代码质量 ESLint · Prettier · Jest
部署 Docker

部署

本项目仅支持 Docker 或其他基于 Docker 的平台 部署。

zeabur 一键部署

点击下方按钮即可一键部署,自动配置 LunaTV + Kvrocks 数据库:

Deploy on Zeabur

优势:

  • ✅ 无需配置,一键启动(自动部署完整环境)
  • ✅ 自动 HTTPS 和全球 CDN 加速
  • ✅ 持久化存储,数据永不丢失
  • ✅ 免费额度足够个人使用

⚠️ 重要提示:部署完成后,需要在 Zeabur 中为 LunaTV 服务设置访问域名(Domain)才能在浏览器中访问。详见下方 设置访问域名 步骤。

Kvrocks 存储(推荐)

services:
 moontv-core:
 image: ghcr.io/moontechlab/lunatv:latest
 container_name: moontv-core
 restart: on-failure
 ports:
 - '3000:3000'
 environment:
 - USERNAME=admin
 - PASSWORD=admin_password
 - NEXT_PUBLIC_STORAGE_TYPE=kvrocks
 - KVROCKS_URL=redis://moontv-kvrocks:6666
 networks:
 - moontv-network
 depends_on:
 - moontv-kvrocks
 moontv-kvrocks:
 image: apache/kvrocks
 container_name: moontv-kvrocks
 restart: unless-stopped
 volumes:
 - kvrocks-data:/var/lib/kvrocks
 networks:
 - moontv-network
networks:
 moontv-network:
 driver: bridge
volumes:
 kvrocks-data:

Redis 存储(有一定的丢数据风险)

services:
 moontv-core:
 image: ghcr.io/moontechlab/lunatv:latest
 container_name: moontv-core
 restart: on-failure
 ports:
 - '3000:3000'
 environment:
 - USERNAME=admin
 - PASSWORD=admin_password
 - NEXT_PUBLIC_STORAGE_TYPE=redis
 - REDIS_URL=redis://moontv-redis:6379
 networks:
 - moontv-network
 depends_on:
 - moontv-redis
 moontv-redis:
 image: redis:alpine
 container_name: moontv-redis
 restart: unless-stopped
 networks:
 - moontv-network
 # 请开启持久化,否则升级/重启后数据丢失
 volumes:
 - ./data:/data
networks:
 moontv-network:
 driver: bridge

Upstash 存储

  1. upstash 注册账号并新建一个 Redis 实例,名称任意。
  2. 复制新数据库的 HTTPS ENDPOINT 和 TOKEN
  3. 使用如下 docker compose
services:
 moontv-core:
 image: ghcr.io/moontechlab/lunatv:latest
 container_name: moontv-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

☁️ Zeabur 部署(推荐)

Thanks to @SzeMeng76

Zeabur 是一站式云端部署平台,使用预构建的 Docker 镜像可以快速部署,无需等待构建。

部署步骤:

  1. 添加 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 数据目录),这样配置文件保留在容器内,数据库文件持久化,重启后数据不会丢失!

  2. 添加 LunaTV 服务

    • 点击 "Add Service" > "Docker Images"
    • 输入镜像名称:ghcr.io/moontechlab/lunatv:latest
    • 配置端口:3000 (HTTP)
  3. 配置环境变量

    在 LunaTV 服务的环境变量中添加:

    # 必填:管理员账号
    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=LunaTV Enhanced
    ANNOUNCEMENT=欢迎使用 LunaTV Enhanced Edition
    # 可选:豆瓣代理配置(推荐)
    NEXT_PUBLIC_DOUBAN_PROXY_TYPE=cmliussss-cdn-tencent
    NEXT_PUBLIC_DOUBAN_IMAGE_PROXY_TYPE=cmliussss-cdn-tencent

    注意:

    • 使用服务名称作为主机名:redis://apachekvrocks:6666
    • 如果服务名称不同,请替换为实际名称
    • 两个服务必须在同一个 Project 中
  4. 部署完成

    • Zeabur 会自动拉取镜像并启动服务
    • 等待服务就绪后,需要手动设置访问域名(见下一步)

5. 设置访问域名(必须)

  • 在 LunaTV 服务页面,点击 "Networking" 或 "网络" 标签
  • 点击 "Generate Domain" 生成 Zeabur 提供的免费域名(如 xxx.zeabur.app)
  • 或者绑定自定义域名:
    • 点击 "Add Domain" 添加你的域名
    • 按照提示配置 DNS CNAME 记录指向 Zeabur 提供的目标地址
  • 设置完域名后即可通过域名访问 LunaTV
  1. 绑定自定义域名(可选)
    • 在服务设置中点击 "Domains"
    • 添加你的自定义域名
    • 配置 DNS CNAME 记录指向 Zeabur 提供的域名

🔄 更新 Docker 镜像

当 Docker 镜像有新版本发布时,Zeabur 不会自动更新。需要手动触发更新。

更新步骤:

  1. 进入服务页面

    • 点击需要更新的服务(LunaTV 或 KVRocks)
  2. 重启服务

    • 点击 "服务状态" 页面,再点击 "重启当前版本" 按钮
    • 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:资源站提供的 vod JSON API 根地址。
    • name:在人机界面中展示的名称。
    • detail:(可选)部分无法通过 API 获取剧集详情的站点,需要提供网页详情根 URL,用于爬取。
  • custom_category:自定义分类配置,用于在导航中添加个性化的影视分类。以 type + query 作为唯一标识。支持以下字段:
    • name:分类显示名称(可选,如不提供则使用 query 作为显示名)
    • type:分类类型,支持 movie(电影)或 tv(电视剧)
    • query:搜索关键词,用于在豆瓣 API 中搜索相关内容

custom_category 支持的自定义分类已知如下:

  • movie:热门、最新、经典、豆瓣高分、冷门佳片、华语、欧美、韩国、日本、动作、喜剧、爱情、科幻、悬疑、恐怖、治愈
  • tv:热门、美剧、英剧、韩剧、日剧、国产剧、港剧、日本动画、综艺、纪录片

也可输入如 "哈利波特" 效果等同于豆瓣搜索

MoonTV 支持标准的苹果 CMS V10 API 格式。

订阅

将完整的配置文件 base58 编码后提供 http 服务即为订阅链接,可在 MoonTV 后台/Helios 中使用。

自动更新

可借助 watchtower 自动更新镜像容器

dockge/komodo 等 docker compose UI 也有自动更新功能

环境变量

变量 说明 可选值 默认值
USERNAME 站长账号 任意字符串 无默认,必填字段
PASSWORD 站长密码 任意字符串 无默认,必填字段
SITE_BASE 站点 url 形如 https://example.com
NEXT_PUBLIC_SITE_NAME 站点名称 任意字符串 MoonTV
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 定义

客户端

v100.0.0 以上版本可配合 Selene 使用,移动端体验更加友好,数据完全同步

AndroidTV 使用

目前该项目可以配合 OrionTV 在 Android TV 上使用,可以直接作为 OrionTV 后端

已实现播放记录和网页端同步

安全与隐私提醒

请设置密码保护并关闭公网注册

为了您的安全和避免潜在的法律风险,我们要求在部署时强烈建议关闭公网注册:

部署要求

  1. 设置环境变量 PASSWORD:为您的实例设置一个强密码
  2. 仅供个人使用:请勿将您的实例链接公开分享或传播
  3. 遵守当地法律:请确保您的使用行为符合当地法律法规

重要声明

  • 本项目仅供学习和个人使用
  • 请勿将部署的实例用于商业用途或公开服务
  • 如因公开分享导致的任何法律问题,用户需自行承担责任
  • 项目开发者不对用户的使用行为承担任何法律责任
  • 本项目不在中国大陆地区提供服务。如有该项目在向中国大陆地区提供服务,属个人行为。在该地区使用所产生的法律风险及责任,属于用户个人行为,与本项目无关,须自行承担全部责任。特此声明

License

MIT © 2025 MoonTV & Contributors

致谢

  • ts-nextjs-tailwind-starter — 项目最初基于该脚手架。
  • LibreTV — 由此启发,站在巨人的肩膀上。
  • ArtPlayer — 提供强大的网页视频播放器。
  • HLS.js — 实现 HLS 流媒体在浏览器中的播放支持。
  • Zwei — 提供获取豆瓣数据的 cors proxy
  • CMLiussss — 提供豆瓣 CDN 服务
  • 感谢所有提供免费影视接口的站点。

Star History

Star History Chart

About

【停止更新】本项目采用 CC BY-NC-SA 协议,禁止任何商业化行为,任何衍生项目必须保留本项目地址并以相同协议开源

Resources

License

Stars

Watchers

Forks

Packages

AltStyle によって変換されたページ (->オリジナル) /