Star 历史趋势
数据来源: GitHub API · 生成自 Stargazers.cn
README.md

iPTV-Docker

GitHub Docker Hub GitHub Sponsors

☕ 打赏支持 / Buy Me a Coffee

如果这个项目对你有帮助,欢迎支持一下 :)

❤️ GitHub Sponsors☕ Ko-fi💰 USDT (TRC20)
GitHub Sponsors Ko-fi USDT TRC20 QR Code
TArpwDgewYSFCYX6XoJ6drwpEU6UGBw5yq

⚠️ 仅支持 TRON (TRC20) 网络,请勿使用其他网络
Only via TRON (TRC20) network

当前版本:v3.9.0

一个基于 Docker 部署的 IPTV 直播源管理与分发系统:提供可视化管理后台,核心抓取咪咕视频源(含体育赛事 / EPG 节目单),并支持外部直播源管理与 m3u/m3u8 订阅导入。

  • 📺 免费频道支持标清/高清(480p/720p),1080P 蓝光画质需要咪咕 VIP 会员
  • 🏆 咪咕体育直播(昨天/今天/明天赛事)需开通对应咪咕体育会员方可播放
  • 🎁 已内置多个稳定可靠的免费频道,如纬来体育、Red Bull、4K 卫视、港澳台及 HBO / CNN / BBC 等海外频道,无需额外配置即可使用
  • 📡 内置精选频道订阅源(央视 / 港澳台 / 地方 / 国际),开箱即用
  • 🔗 支持订阅模式,可导入 m3u/m3u8 播放列表批量添加频道

🆕 v3.9.0 更新内容

  • 🆕 统一频道显示名(按规则批量合并不同源同台命名):不同订阅源里同一个台的不同写法(CCTV1 / CCTV-1 / CCTV1综合)可按规则批量统一成同一个显示名,同名后播放器能自动并为多线路。开关 enableDisplayNameUnify默认关、opt-in;环境变量 menableDisplayNameUnify=true 开启),后台「系统配置」可勾选、保存即时生效;手动重命名优先、不会被覆盖。另配套「🔤 频道别名」卡片,可视化维护 channel-aliases.json(规范名 ← 别名),补内置规则兜不住的写法(issue #56)
  • 🆕 后台直观看到每个频道的配对状态 + 内联订阅地址:「我的频道」每个频道卡片现在显示台标缩略图(没台标的显示占位)和节目单徽章(绿=已匹配 / 灰=未匹配),不用再逐个点开详情核对;「频道详情」新增「配对状态」一行,已匹配会显示归一后的规范名(如「央视1套高清 → CCTV1综合」),消除「显示名特殊、看着像没匹配」的误解;顶部新增订阅地址栏,当前档的 m3u 与 EPG 地址一键复制,免点「编辑」(issue #38)
  • 🐛 修复特殊命名的常见频道匹配不到台标:名字带信源 / 清晰度后缀的常见频道(如 CCTV1高清(电信)湖南卫视(电信))此前能匹配上节目单、却匹配不到台标——台标按「显示名」取图、EPG 按「归一名」匹配,两边口径不一致。现台标改为按归一名匹配(CCTV1高清(电信)CCTV1湖南卫视(电信)湖南卫视),频道显示名保持不变(电信) 等信源标识仍可见);同时频道名归一增加运营商 / 信源后缀剔除(电信 / 联通 / IPTV…),非 CCTV 频道的 EPG 匹配也一并受益(issue #40)
  • 🛠️ 放出「节目单更新间隔」配置项:之前此项在「系统配置」里被隐藏,现在显示出来可调整,并加红色提示——不建议设太短(频繁请求咪咕可能触发风控),填了咪咕 Token 时建议 ≥8 小时,修改后需重启生效
  • 🐛 修正 token 刷新请求的 Content-Type 拼写:请求头误写成 appsication/json,改回标准 application/json,提升咪咕 token 刷新的可靠性

完整更新历史见下方 更新日志

📖 项目简介

本项目提供完整的 IPTV 直播源解决方案,主要功能包括:

  1. 📺 咪咕视频源抓取 - 自动获取咪咕视频的电视频道,包括 CCTV 和主要卫视频道(720P 高清画质)

  2. 🎫 VIP 会员增强 - 配置开通相应会员的咪咕账号信息后,可抓取体育直播等会员频道(支持 1080P、蓝光或更高画质)

  3. 🔗 外部源管理 - 支持添加外部 m3u8 直播链接、通过网页播放地址自动抓取直播源,或通过订阅模式导入 m3u/m3u8 播放列表批量添加频道

  4. 🖥️ Web 管理后台 - 通过 http://your-ip:1905/admin 访问可视化管理平台,轻松管理所有直播源

📋 详细功能说明和配置方法请参考下方文档


🚀 快速开始 - Docker 部署(推荐)

使用 Docker Compose(最简单)

创建 docker-compose.yml 文件:

services:
  iptv:
    image: akiralereal/iptv:latest              # 使用最新版本镜像
    container_name: iptv                        # 自定义容器名称
    init: true                                  # 回收 Chromium 退出后的僵尸进程
    ports:
      - "1905:1905"                             # 宿主机:容器端口映射
    environment:
      - muserId=                                # 可选:咪咕账号ID(留空为游客模式)
      - mtoken=                                 # 可选:咪咕登录令牌(用于高画质/VIP)
      - mport=1905                              # 必须:容器监听端口,与 ports 对应
      - mrateType=4                             # 画质:2=标清,3=高清,4=蓝光(需VIP)
      - mdataDir=/migu/data                     # 配置/数据持久化目录(对应下方挂载的卷)
      # - mhost=                                  # 可选:外部访问地址(如 http://test.com:1905)
      # - mpass=                                  # 可选:访问密码(设置后访问: http://ip:port/密码/...)
    volumes:
      - ./data:/migu/data                       # 持久化配置与生成文件,容器重建/升级镜像后不丢失
    restart: always                             # 容器异常退出后自动重启

💾 数据持久化(强烈建议):上面的 volumes + mdataDir 会把系统配置、咪咕账号、外部订阅源、我的频道(分组顺序/隐藏/归类/排序)等都存到宿主机的 ./data 目录。不挂载的话,docker compose down、重建容器或 docker compose pull 升级镜像时这些配置会全部丢失、恢复默认。

若你之前已部署且容器里已有配置,升级前先备份出来再挂卷:

mkdir -p ./data
docker cp iptv:/migu/system-config.json ./data/ 2>/dev/null || true
docker cp iptv:/migu/my-playlist-config.json ./data/ 2>/dev/null || true
docker cp iptv:/migu/external-sources.json ./data/ 2>/dev/null || true
# 然后再用带 volumes 的 compose 重新 up -d

启动服务:

docker-compose up -d

常用命令:

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

# 更新镜像
docker-compose pull && docker-compose up -d

使用 Docker 命令直接运行

拉取镜像

docker pull akiralereal/iptv:latest
# 或指定版本
docker pull akiralereal/iptv:1.3.1

快速运行(游客模式)

docker run -d -p 1905:1905 --name iptv akiralereal/iptv:latest

自定义配置运行

docker run -d -p 1905:1905 \
  --init \
  -e muserId=你的ID \
  -e mtoken=你的token \
  -e mport=1905 \
  -e mhost="http://192.168.1.100:1905" \
  -e mrateType=4 \
  -e mpass=mypassword \
  -e mdataDir=/migu/data \
  -v "$(pwd)/data:/migu/data" \
  --name iptv \
  akiralereal/iptv:latest

--init 回收 Chromium 僵尸进程;-v ... -e mdataDir=/migu/data 持久化配置,升级镜像后不丢失(详见上方「数据持久化」说明)。

🎯 访问服务

部署成功后,可以通过以下地址访问:

📺 播放列表

  • M3U 格式: http://your-ip:1905/interface.m3u(推荐:带 .m3u 后缀,部分 App 按后缀校验订阅地址才认;裸 http://your-ip:1905/m3u 内容相同、同样有效)
  • TXT 格式: http://your-ip:1905/txt
  • 节目单(EPG): http://your-ip:1905/playback.xml

🖥️ Web 管理后台(重要)

[!TIP] 快速访问管理后台:

  • 无密码访问: http://your-ip:1905/admin
  • 有密码访问: http://your-ip:1905/密码/admin

💡 your-ip 替换为你的服务器IP地址,例如: http://192.168.1.100:1905/admin

通过管理后台可以:

  • ✅ 查看所有频道列表
  • ✅ 添加/编辑/删除外部直播源
  • ✅ 配置系统参数(画质、公网地址、访问密码等)
  • ✅ 一键更新播放列表

❓ 常见问题(FAQ)

Q:飞牛影视 / 某些播放器点开频道「只有声音、没有画面」(提示「仅支持音频直播」)?

A:这是 H.265(HEVC)编码兼容性问题——咪咕视频流默认是 H.265,而部分播放器(如飞牛影视内置播放器)不支持 H.265 解码,只能解出音频、没有画面。解决办法:

  1. 进后台「系统配置」,取消勾选「启用 H.265 原画」,点保存;
  2. 点页面顶部「重启服务」让配置生效(旧的流地址有缓存,必须重启);
  3. 在播放端(飞牛影视等)重新打开频道(必要时重新订阅一次)。

环境变量部署等价于设 menableH265=false 后重启容器。关闭后回落到兼容性最好的 H.264,清晰度基本无感。若个别频道仍只有声音,再加 menableHDR=false(少数频道为 HDR/Vivid 导致)。


📋 更新日志

v3.9.0 (2026-06-27)

  • 🆕 统一频道显示名(按规则批量合并不同源同台命名):不同订阅源里同一个台的不同写法(CCTV1 / CCTV-1 / CCTV1综合)可按规则批量统一成同一个显示名,同名后播放器能自动并为多线路。开关 enableDisplayNameUnify默认关、opt-in;环境变量 menableDisplayNameUnify=true 开启),后台「系统配置」可勾选、保存即时生效;手动重命名优先、不会被覆盖。另配套「🔤 频道别名」卡片,可视化维护 channel-aliases.json(规范名 ← 别名),补内置规则兜不住的写法(issue #56)
  • 🆕 后台直观看到每个频道的配对状态 + 内联订阅地址:「我的频道」每个频道卡片现在显示台标缩略图(没台标的显示占位)和节目单徽章(绿=已匹配 / 灰=未匹配),不用再逐个点开详情核对;「频道详情」新增「配对状态」一行,已匹配会显示归一后的规范名(如「央视1套高清 → CCTV1综合」),消除「显示名特殊、看着像没匹配」的误解;顶部新增订阅地址栏,当前档的 m3u 与 EPG 地址一键复制,免点「编辑」(issue #38)
  • 🐛 修复特殊命名的常见频道匹配不到台标:名字带信源 / 清晰度后缀的常见频道(如 CCTV1高清(电信)湖南卫视(电信))此前能匹配上节目单、却匹配不到台标——台标按「显示名」取图、EPG 按「归一名」匹配,两边口径不一致。现台标改为按归一名匹配(CCTV1高清(电信)CCTV1湖南卫视(电信)湖南卫视),频道显示名保持不变(电信) 等信源标识仍可见);同时频道名归一增加运营商 / 信源后缀剔除(电信 / 联通 / IPTV…),非 CCTV 频道的 EPG 匹配也一并受益(issue #40)
  • 🛠️ 放出「节目单更新间隔」配置项:之前此项在「系统配置」里被隐藏,现在显示出来可调整,并加红色提示——不建议设太短(频繁请求咪咕可能触发风控),填了咪咕 Token 时建议 ≥8 小时,修改后需重启生效
  • 🐛 修正 token 刷新请求的 Content-Type 拼写:请求头误写成 appsication/json,改回标准 application/json,提升咪咕 token 刷新的可靠性

v3.8.0 (2026-06-25)

  • 🧪 用户访问令牌 / 一人一源(测试阶段):可在后台「系统配置 → 👤 用户管理」给每个家人 / 朋友生成独立的源地址 /u/<令牌>/m3u,支持单独停用、重置令牌、绑定不同频道档(一人一内容),且令牌只能拉源、进不了管理后台——分享源地址不再连带暴露后台。泄露可追溯到具体某人、可单独吊销,其他人不受影响。本功能仍在测试中,建议先小范围试用、欢迎反馈;不新增用户则对现有部署与现有链接零影响。可用 enableUserTokens=false(或环境变量 menableUserTokens=false)关闭
  • 🐛 修复外部 EPG「加了源一个都匹配不上」:很多 EPG 源的频道 id 是数字 / 拼音代号、真实台名写在 <display-name> 里,旧逻辑只按 id 比对导致 0 命中;现改为优先按 display-name 归一配对(并保留 id 兜底)。另注意:外部 EPG 只给咪咕没覆盖的频道补节目单,咪咕已有 EPG 的频道显示匹配 0 属正常(issue #53)
  • 🛠️ 自定义分组「隐藏分组」按钮加说明:自定义分组本就只支持「删除分组」(不提供隐藏,因为它不随源刷新复活),现在鼠标悬停会提示「请用删除分组、或用批量管理隐藏其中频道」,避免误以为能整组隐藏(issue #42 追问)

v3.7.0 (2026-06-24)

  • 🆕 EPG 聚合:多个第三方节目单源自动合并成一份:后台「系统配置 → 📅 EPG 节目单源(聚合)」可添加多个 XMLTV/EPG 源(支持 .xml.xml.gz),程序定时拉取、把各源频道名归一到本项目规范名后合并进 /playback.xml——某频道只要任一源里有就能补上节目单,咪咕已覆盖的频道始终优先、不被外部覆盖。默认开启、内置默认源、开箱即用,无需手动配;每个源可看抓取时间 / 频道数 / 已匹配数,可调刷新间隔与优先级,并支持「立即刷新」。即使关闭咪咕(enableMigu=false),外部 EPG 也能独立产出节目单。可用 enableEpgAggregation(或环境变量 menableEpgAggregation=false)关闭(issue #38)
  • 🛠️ 网页抓取源启动浏览器更稳:抓取类源(如纬来体育)现在会优先使用系统已安装的 Google Chrome / Chromium / Edge,裸跑(非 Docker)只要装了 Chrome 就开箱即用,不必再手动 npx puppeteer browsers install chrome 或下载特定版本(该版本可能被部分系统的安全软件删除导致启动失败);也可用环境变量 PUPPETEER_EXECUTABLE_PATH 显式指定。Docker 部署不受影响(仍使用镜像内置 Chromium)
  • 🛠️ 频道详情布局优化:把「播放地址」与拉起播放器(IINA / VLC / PotPlayer)的按钮移到靠上位置(紧跟频道 ID、在移动 / 重命名 / 复制 / 台标等管理操作之前),并放大详情弹窗,常用的复制地址 / 拉起播放器不再被挤到底部
  • 🐛 修复纬来体育源抓取失败:内置源「纬来体育」旧域名 jrkan66.com 已失效,切换到 jrkan.com 的同名页面(该配置为远程下发,部署端会自动更新、无需重建镜像)

v3.6.0 (2026-06-23)

  • 🆕 频道可一键复制到多个分组:「频道详情」新增「复制到分组」,可把自己的频道(外部 / 直连 / 订阅)同时放进多个分组(如把 TVB 复制到「亚太」和「香港」),每个分组里是独立的一份、隐藏 / 排序 / 删除互不影响;复制的是固定地址的独立频道、可在「外部源管理」删除(咪咕频道地址为服务端跳转、暂不支持)(issue #37)
  • 🆕 支持导入本地 .m3u/.txt 文件批量加源:「添加源 → 订阅模式」新增「本地文件 / 粘贴」,可选本地 m3u/m3u8/txt 文件、或直接粘贴内容批量导入,自动识别格式与 GBK/UTF-8 编码,全程不发起网络请求(issue #43)
  • 🆕 后台上传 / 预览频道台标:「频道详情」可预览当前台标,并给没台标的频道直接上传图片(png/jpg/webp),存到 data/logos/、优先级最高、保存即生效,旁边可移除(issue #40)
  • 🐛 修复频道移动到其它分组后无法隐藏:从原分组移动到新分组的频道,之前在新分组里点隐藏会「提示已隐藏但实际仍显示」,再次批量移动 / 移回原组也会失效(隐藏 / 移动用错了分组标识);现统一按频道真实原始分组处理,已修正(issue #42)

v3.5.0 (2026-06-19)

  • 🆕 频道名称 / TVG 规整(EPG 别名归一):异构外部源里五花八门的频道名(CCTV-1 / CCTV1HD / CCTV-1综合 …)会自动把 tvg-id/tvg-name 归一到规范名(= 本项目 EPG playback.xml 里的频道名,即咪咕频道名),让外部源频道也能匹配上节目单(issue #39)。CCTV 系列规范名内置可用;卫视/港台等由运行时的 EPG 全集自动覆盖;可在数据目录放 channel-aliases.json(格式 {"规范名": ["别名1","别名2"]})自定义补充。只改 tvg、不动频道显示名。可用 enableTvgNormalize(或环境变量 menableTvgNormalize=false)关闭
  • 🐛 修复分组重命名/新建时误报「分组已存在」:当某分组的频道被全部移动到别处、或该分组被隐藏/删除而在「我的频道」列表里已不可见时,它的名字之前仍被占用,导致把别的分组改名成它、或新建同名分组时报「分组已存在」却在列表里找不到它(issue #35);现改为只按「当前可见分组」判重——看不到的分组不再占名,但同名分组若当前可见仍会被拦截(防止误合并)

v3.4.0 (2026-06-17)

  • 🆕 订阅源支持带账号密码的地址:添加订阅源时可直接填 http://用户名:密码@域名/x.m3u 形式的地址,系统会自动转成 HTTP Basic 认证去拉取,不再因地址里带 用户名:密码@ 而获取失败(注:仅认证「拉取播放列表」这一步;列表内各频道的流地址若也需认证,由播放器侧处理)
  • 🛠️ 后台默认给带 .m3u 后缀的订阅地址:「我的频道」配置档里复制的订阅地址改为 /interface.m3u(内容与 /m3u 完全相同),更适配「按后缀校验订阅链接」的 App(飞牛影视等),不用再手动改地址;裸 /m3u 仍然有效,已配好的地址无需更换
  • 🐛 修复飞牛影视等无法订阅播放列表/m3u/interface.m3u 之前以媒体类型 audio/x-mpegurl 返回,会被飞牛订阅 / 浏览器当成「一个视频」去播放、而非当订阅文本解析,导致订阅失败;现改为 text/plain 返回(与 GitHub raw 一致),普通播放器不受影响
  • 🐛 修复「分组内按名称排序」单独设置时不生效:当某配置档只设了某分组「📑 排序:名称」、且没有其它任何自定义(隐藏 / 分组 / 重命名等)时,该排序之前不会生效,现已修复

v3.3.0 (2026-06-14)

本次为「多套配置档(大分组)」大版本:一套服务可维护多套个性化播放列表,给家里不同电视(大厅老人 / 卧室年轻人 / 茶室)各用各的;同时补齐外部频道台标、修复多个 issue、优化若干体验。

  • 🆕 多套配置档(大分组):「我的频道」可新建多套配置档,每套独立保存隐藏 / 分组 / 排序 / 重命名,通过 /m3u?profile=<短名>(如 /m3u?profile=woshi)访问、互不影响——不同电视填各自地址即可各看各的。底层频道 / EPG / 回看多档共享,新增电视不增加抓取成本。完全向后兼容:默认档就是原来的「我的频道」、地址仍是裸 /m3u,老用户与已配好的电视零感知、无需改地址、无数据迁移
  • 🆕 配置档后台集中管理:「我的频道」首屏只留「当前档:xx + ✏️ 编辑」一个入口;点开弹窗统一切换 / 新建 / 改名 / 删除,每档显示各自访问地址可一键复制。新建即复制当前档(填中文显示名 + 选填英文地址短名),适合从一台派生另一台再微调。(⚠️「🔄 重置」按钮已从标题行移入此弹窗,且只重置当前档)
  • 🆕 分组内按名称自动排序:「我的频道」每个分组可切「📑 排序:手动 / 名称」;按名称时组内频道自动排序、新增台自动归位(中文按拼音、CCTV1/2/10 按数字),方便在电视上快速定位、找失效台
  • 🆕 隐藏分组里单独/批量移动频道:隐藏的整组可直接进「批量移动频道」,把个别或多个频道移到可见分组,不用再先恢复整组、移完再重新隐藏
  • 🆕 外部/精选频道台标:精选频道原本没图标,现按频道名自动补台标(默认用公共台标库 fanmingming,命中约 1/3);想补全的把 <频道名>.png 放进数据目录的 logos/ 文件夹即可,优先级高于公共库。可用环境变量 mexternalLogoBase 改地址或留空关闭
  • 🆕 新增 /interface.m3u 订阅地址:内容与 /m3u 完全相同、仅多 .m3u 后缀——解决飞牛影视等按后缀校验订阅地址、填 /m3u 报「链接不正确」的问题
  • 🛠️ 后台可调 H.265 +「只有声音」引导:「系统配置」露出 H.265 开关并加说明——部分频道「只有声音、没画面」多因播放器/设备不支持 H.265(HEVC),关闭即回落到兼容性最好的 H.264(个别频道仍只有声音可再用 menableHDR=false 关 HDR/Vivid)
  • 🐛 修复自建分组名中文乱码:保存「我的频道」配置时,中文名在网络分包边界可能被解码错(如「央视咪咕」→「央视??咕」),已改为按完整字节解码修复。⚠️ 已经乱掉的分组名不会自动复原,升级后重新改名一次即可
  • 🐛 修复「恢复所有频道」误报:之前点该按钮会弹「恢复失败: channelIds is not defined」(其实已恢复成功),现正确提示「已恢复 N 个频道」

v3.2.0 (2026-06-07)

  • 🛠️ 「我的频道」显示总频道数:管理后台「我的频道」标题后实时显示当前总频道数(共 X 个频道),随频道增删 / 移动自动更新

v3.1.0 (2026-06-07)

  • 🆕 内置源配置支持远程拉取built-in-sources.json 改为运行时优先从仓库 raw 链接拉取(GitHub 镜像 + 数据卷缓存 + 镜像内置 三重兜底,国内拉不到也和纯本地一样稳)。纬来体育等需网页抓取的源,其抓取网址 webUrl 现在 push 即更新、无需重建镜像(webUrl 变更会自动重抓);可用环境变量 mbuiltInSourcesUrl 改源地址或置空关闭
  • 🔄 内置单频道源并入「精选频道」统一管理:把 WildEarth / Red Bull / 4K 卫视等直链频道从 built-in-sources.json 移入 IPTV.m3ubuilt-in-sources.json 仅保留需网页抓取的纬来体育;以后这些频道改 IPTV.m3u push 即可。合并时按「同分组 名称+地址」去重,与未升级镜像并存也不会重复

v3.0.0 (2026-06-06)

本次将内置订阅源从依赖第三方链接切换为项目自维护,运行时不再依赖外部仓库的内容与可用性。

  • 🔄 内置订阅源改为自维护:移除第三方 YueChan 的「港澳地方频道 / 全球频道」两个内置订阅,替换为项目自带、可自行维护更新的「精选频道」(央视 / 港澳台 / 地方 / 国际,约 115 频道;源文件 IPTV.m3u 随仓库分发,走本仓库的 raw 链接定时刷新),不再依赖第三方仓库的内容与可用性
  • 🧹 老用户自动清理「僵尸源」:升级后启动时一次性移除已退役的旧 YueChan 订阅(含其缓存频道),避免「换源后旧源残留、且因不在内置列表里而连开关都关不掉」;只跑一次,尊重用户后续的手动增删

v2.2.1 (2026-06-05)

  • 🛠️ 核心内容开关独立成组:管理后台「系统配置」中的「启用咪咕源 / 内置单频道源 / 内置订阅源」三项从常规配置里独立出来,做成醒目的「🔑 核心内容开关」卡片(红色描边、标注默认开启并提示谨慎关闭),与端口 / 密码等普通配置项形成 UI 区分,降低误关导致频道大幅减少甚至空白的概率
  • 🗑️ 移除后台「🧹 一键空白」按钮:该按钮仅是一次性勾掉上述三个开关、易误触,且与单独勾选重复,本版移除;需要空白部署仍可用环境变量 mblank 或手动关闭三个开关实现

v2.2.0 (2026-06-05)

  • 🆕 订阅源支持 txt 格式:订阅模式现自动识别播放列表格式,除 m3u/m3u8 外也支持 txt(diyp/TVBox:分组,#genre# / 频道名,地址,一个频道用 # 连多个备用源时取首个),无需额外设置;兼容 GBK/GB2312 编码
  • 🆕 内容开关 / 空白部署:新增 mblank 空白模式总开关 + menableMigu / menableBuiltInSources / menableBuiltInSubscriptions 三个细粒度开关(环境变量或管理后台「系统配置」勾选;细粒度优先于 mblank默认全开,老用户无感)。一行 mblank=true 即得到纯频道管理的空白部署,或单独关掉自带的内置源 / 内置订阅源,避免与自建源同名分组撞车
  • 🆕 后台「🧹 一键空白」:系统配置页新增上述三个开关与一键空白按钮,保存后自动重新生成播放列表、无需重启即时生效
  • 🛠️ 内置订阅源可彻底删除:自带的「港澳地方频道 / 全球频道」订阅改为「只播种一次」,删除后重启不再自动复活(尊重用户删除);关闭内置订阅时抓取层与输出层一并跳过,不再无谓联网下载
  • 🐛 修复 Docker 主版本标签:发布镜像的主版本滚动标签此前一直错打成 :1(实际是 v2.x),现修正为 :2,并修 bump-version.js 使其今后自动更新该标签

v2.1.0 (2026-06-02)

  • 🆕 单频道重命名:频道详情弹窗可给任意频道自定义显示名(清空或改回原名即恢复);只改显示名、不动 tvg-name,不影响 EPG 匹配。适合统一不同订阅源对同一频道的不同命名
  • 🆕 批量移动到分组:「我的频道」批量管理模式新增「移动选中到〈分组〉」,可一次把多个选中频道移到指定分组
  • 🛡️ 空数据不覆盖播放列表:某次刷新获取到 0 个频道时(通常是咪咕/网络不可达)保留上一次的好播放列表,不再用空文件覆盖,避免「我的频道」被清空且不自愈
  • 🔧 管理页显示实际生效配置:系统配置接口改为返回「环境变量 + 配置文件 + 默认值」合并后的实际生效值——修复用环境变量(muserId/mtoken 等)配置时,换电脑/无浏览器自动填充的情况下表单显示为空的问题
  • 💡 环境变量覆盖提示:当某些配置由 docker-compose 环境变量设置时,系统配置页顶部醒目提示并列出受影响项(说明清空保存会回退到环境变量值、需改 compose)
  • 🔧 检查更新日志优化:镜像逐个回退时的失败改为黄色警告,仅全部镜像失败才标红,避免成功的检查更新看起来像报错

v2.0.1 (2026-05-31)

  • 🐛 分组上移/下移后选中跟随:之前移动分组后,左侧选中仍停在原位置(变成了被换上来的另一个分组),要重新点选才能继续移动;现在选中会跟随被移动的分组,可连续点上移/下移(例如把某分组一路移到最后)
  • 💾 配置持久化(升级不再丢配置):运行时数据(咪咕账号、外部订阅源、我的频道分组顺序/隐藏/归类/排序等)改为集中存放,并支持 mdataDir 自定义目录。镜像现默认写入 /migu/data 并声明为数据卷,因此即使不改 compose,常规 docker compose pull && up -d 升级也会自动复用卷、不再丢配置;仍推荐用 -v ./data:/migu/data 绑定到宿主机便于备份。⚠️ 从旧版(数据原在 /migu首次升级会迁移丢一次,升级前请先用 docker cp 备份 system-config.json / my-playlist-config.json / external-sources.json(详见部署说明)
  • 📝 README 配置说明优化:拆分为「常用配置」(新手够用)+ 折叠的「完整配置表」;补全此前未文档化的环境变量(madminPath / mrefreshToken / mdataDir / menableHDR / menableH265 / mupdateInterval);部署示例补上持久化卷与 init

v2.0.0 (2026-05-30)

本次为安全与稳定性大版本,并新增多项管理功能(自 v1.8.2 起的全部改动)。

  • 🆕 单频道单独归类:频道详情弹窗新增「移动到分组」,可把任意单个频道移动到其它分组(选回原分组即取消归类);移出后即使原分组被删除,该频道仍保留在新分组
  • 🆕 频道拖拽排序:「我的频道」频道行支持鼠标拖拽排序(原生实现、不引第三方库),替代反复点「上移/下移」,且不再丢失焦点
  • 🆕 管理页面路径可自定义:可将后台地址 /admin 改成任意名字(如 /console)以增强隐蔽性,默认仍为 admin;改名后裸 /admin 失效,api/player/favicon.ico 为保留字,保存后自动跳转新地址
  • 🔒 重构访问密码鉴权/api/* 由校验可伪造的 Referer 头改为与页面一致的路径密码校验(密码模式下经 /<密码>/api/... 访问);未授权统一返回 403、未知接口 404、非 GET/POST 405
  • 移除全局请求串行锁:旧实现用一个全局 loading 标志把所有 HTTP 请求逐个串行处理,一次慢抓取/拉取会阻塞包括频道跳转在内的全部请求;现各请求独立处理。POST 请求体读取加 try/catch,客户端中途断开连接返回 400 而非拖垮进程,并新增进程级异常兜底
  • 🛡️ 更新流程加单飞锁:定时刷新、启动初始化与后台保存外部源可能并发调用 update(),并发改写同一批临时文件会损坏 interface.txt / playback.xml;现串行化执行
  • 🧟 修复 Chromium 僵尸进程:网页抓取(fetch 模式)启动的 Chromium 在容器内不再堆积 <defunct> 僵尸进程——镜像引入 tini 作为 init 进程回收孤儿子进程(docker-compose.yml 增加 init: true),browser.close() 增加超时与强杀进程组兜底(⚠️ 需重建镜像/容器后生效)
  • 🐛 修复订阅分组乱码:订阅内容改为按原始字节解码,自动识别 GBK/GB2312(中文 IPTV 列表常见)、UTF-8 及 BOM,分组名与频道名不再乱码
  • 🐛 修复 HDR / H265 无法关闭:环境变量 menableHDR=false / menableH265=false 之前因布尔与字符串比较问题始终无效,现可正常关闭
  • 🔧 系统配置热更新:在管理后台保存系统配置后大部分项即时生效,无需重启(监听端口与节目更新间隔仍需重启)
  • ♻️ 可关闭 token 刷新:每月一次的咪咕 token 刷新(可能导致封号)现可通过 refreshToken 配置 / mrefreshToken 环境变量关闭
  • 💬 订阅导入报错优化:所有镜像均失败时聚合显示每条线路的真实失败原因(不再是空白 reason)并给出排查提示;新增 cdn.jsdelivr.net 备用镜像
  • 🧰 健壮性与清理:配置文件改为原子写入(临时文件 + rename),避免并发/写入中断损坏 JSON;修复 fileUtil 同步函数误传回调的问题;分组内频道按「名称 + 地址」去重;修复 androidURL.jsdelay 未引入导致 302 重试逻辑失效的隐藏问题;移除 ddCalcuURL 中无用的 WASM 死代码

v1.8.2 (2026-04-05)

  • 🆕 频道详情弹窗新增一键调起本地播放器按钮(VLC / IINA / PotPlayer),并按当前浏览器所在平台自动筛选可用按钮(Mac 显示 VLC+IINA,Windows 显示 VLC+PotPlayer,Linux 显示 VLC)
  • 🔧 播放器启动改为纯客户端实现:v1.8.0 的后端 open -a 方案仅在 Node 与客户端同机时有效,Docker/NAS 等远程部署场景完全失效;改为浏览器直接调用 URL scheme(IINA / PotPlayer)或下载 .m3u 文件(VLC,通过系统文件关联启动),与服务端所在平台彻底解耦
  • ⚠️ 频道详情弹窗补充 VLC 行为说明:VLC 桌面版未注册 URL scheme,点击后会先下载一个 .m3u 文件,需在浏览器下载栏手动点击打开,VLC 才会启动并播放
  • 🎨 播放按钮改为品牌配色 + 内联 SVG 图标(VLC 橙 / IINA 紫 / PotPlayer 金),替换渲染不一致的 emoji
  • 📺 新增内置订阅源「全球频道」(Global.m3u),与已有的「港澳地方频道」采用同一套处理方式;BUILT_IN_SUBSCRIPTIONS 常量化,新装默认写入,已有安装启动时自动补齐缺失内置源
  • 🐛 修复内置订阅源展开出的频道在详情弹窗被错误标记为"外部源":内置订阅的 subscriptionUrl 通过 /api/built-in-sources 暴露给前端,按 URL 命中判定归属,确保「全球频道」「港澳地方频道」下所有频道统一显示为"内置源"
  • 💡 管理后台"我的频道"新增点击可查看详情的提示:标题下方加入操作说明,频道名前增加 ⓘ 提示图标(hover 高亮),降低用户发现成本
  • 🗑️ 移除失效的内置频道 新加坡亚洲新闻(CNA)Bloomberg TV
  • 📝 README 重构:更名为 iPTV-Docker,将部署方式前置,新增 GitHub / Docker Hub 徽章与 Ko-fi / USDT 赞助入口

v1.7.2 (2026-03-25)

  • 🐛 修复频道数据缓存污染导致内置源/外部源频道重复累积的问题:getAllChannels 合并时使用浅拷贝,导致内置源和外部源频道被写入咪咕缓存,每次自动刷新触发 regenerateOnly 重新生成播放列表时重复叠加(如纬来体育出现多条)

v1.7.1 (2026-03-23)

  • 🐛 修复 Docker 环境下内置抓取源(如纬来体育)无法抓取的问题:Alpine Linux 的 Chromium 路径为 /usr/bin/chromium,而非 /usr/bin/chromium-browser,导致 Puppeteer 找不到浏览器,抓取静默失败
  • 🔒 修复安全问题:未授权访问 /admin/player 时,响应中会明文暴露访问密码;现改为返回 403 并仅提示密码路径格式
  • 🐛 修复设置访问密码后,使用 /密码/admin 路径无法访问管理后台的问题(路由匹配未覆盖带密码前缀的路径)

v1.7.0 (2026-03-18)

  • 🆕 新增手动分组功能:可在「我的频道」中创建空分组,并在自定义源中直接使用这些分组
  • 🗑️ 新增手动分组删除功能:删除后,该分组下的自定义直连/抓取频道会自动并入 未分组
  • 🔒 调整分组操作边界:内置咪咕分组、订阅源分组仅支持隐藏,未分组 不允许重命名、删除或隐藏
  • 🐛 修复自定义频道与分组管理问题:避免直连频道 ID 冲突导致“我的频道”丢失频道,并阻止重命名到已存在分组名

v1.6.0 (2026-03-16)

  • 🐛 修复频道去重逻辑:将全局按频道名去重改为分类内去重,允许同一频道出现在不同分组中,与咪咕 App 行为一致
  • 🐛 修复隐藏频道逻辑:hiddenChannels 改为按分组独立隐藏,避免跨分组误隐藏同名频道
  • 🔧 频道详情弹窗优化:清理冗余播放按钮,保留复制地址功能

v1.5.0 (2026-03-11)

  • 🔄 检查更新支持 GitHub 镜像回退:依次尝试原始地址、ghfast.top、gh-proxy.com、gcore.jsdelivr.net,解决国内 Docker 环境无法访问 GitHub 的问题
  • 🐛 修复 jsDelivr 镜像 URL 转换错误导致该镜像始终 404 的问题
  • 🔧 GitHub 镜像列表统一维护(GITHUB_RAW_MIRRORS),检查更新与订阅抓取共用,避免重复代码
  • 🐛 修复管理页面版本号显示与实际版本不一致的问题
  • 📦 新增 bump-version.js 版本号统一更新脚本,一条命令同步更新所有文件

v1.4.3 (2026-03-11)

  • 🌐 新增外网访问协议自动检测:通过 NAS 转发(绿联、群晖、威联通等)或自定义域名访问时,自动使用 HTTPS 协议生成频道地址,解决外网无法播放的问题
  • 🔀 内网/外网/自定义域名三条路径互不影响,内网访问不走外网,避免上行带宽浪费
  • 📺 根路径 / 默认返回 M3U 格式(audio/x-mpegurl),APTV 等客户端可直接用根地址导入

v1.4.1 (2026-03-11)

  • 🆕 新增分组重命名功能:可自定义分组名称,重命名后同名分组自动合并,支持重置恢复原名
  • 🆕 新增分组隐藏通配符支持:在配置中使用 体育-* 可一次性隐藏所有体育赛事分组
  • 🆕 新增检查更新功能:在「关于我们」页面可一键检查是否有新版本
  • 🔧 重置功能改为弹窗选项式,支持分项重置(重命名 / 隐藏 / 排序),避免误操作
  • 🐛 修复频道详情来源识别错误:正确区分咪咕源、内置源、外部源
  • 🐛 修复编辑按钮在非外部源频道上错误显示的问题
  • 🐛 修复订阅类型外部源编辑时无法定位到正确源的问题
  • 🐛 修复 /txt 端点未应用用户配置过滤的问题
  • 🗑️ 移除冗余的「保存配置」按钮(各操作已自动保存)

v1.3.3 (2026-03-10)

  • 🐛 修复 Docker 环境下播放列表文件写入不完整的问题:生成 interface.txt 时使用了异步文件写入(fire-and-forget),导致文件重命名时部分分组尚未写入完成,造成港澳台地方频道(浙江、河南、广东、宁夏、广西、云南等)分组缺失;现已改为同步写入,确保文件完整性
  • 🔧 优化日志输出:精简定时检查源更新、频道请求等高频日志,大幅减少 Docker 容器日志量
  • 🐛 修复订阅源(如港澳台频道)首次获取失败后无重试机制,导致频道缺失的问题;现在启动 60 秒后自动重试
  • 🐛 修复订阅源获取失败时不保留已有缓存数据的问题;失败时保留旧频道数据,引入指数退避重试机制
  • 🐛 修复外部源每小时定时检查时无条件写入配置文件的问题;现在仅在有源被实际更新时才保存
  • 🆕 启动时新增游客模式提示:未配置咪咕账号时提示最高画质为 720p
  • 📸 README 新增管理后台截图展示

v1.3.0 (2026-03-10)

  • 🆕 新增订阅模式(外部源第三种模式):支持导入 m3u/m3u8 播放列表 URL,一次性批量添加多个频道,支持自动定时刷新
  • 📺 新增内置港澳台及地方频道订阅源(港澳地方频道),默认启用,开箱即用
  • 🖥️ 管理后台新增订阅模式 UI:支持填写订阅名称、m3u 地址、刷新间隔,一键导入并保存
  • 📝 更新 external-sources.json.example 示例文件,新增订阅模式配置示例

v1.2.8 (2026-03-05)

  • 🔖 版本号升级到 1.2.8,同步更新 package.jsonpackage-lock.json、README 展示版本及 Docker workflow 镜像版本标签
  • ⚖️ 新增 GPL-3.0 开源许可(LICENSE),并在文档中补充 License 说明
  • 🧹 清理运行时缓存文件 pe-cache.json 出仓库,并加入 .gitignore 防止误提交

v1.2.7 (2026-02-28)

  • 🐛 修复内置抓取源 URL 刷新后重建播放列表(regenerateOnly 模式)会丢失体育-昨天/今天/明天频道的问题;现在 updatePE 运行时同步保存赛事缓存,快速模式下直接从缓存恢复,无需重新调用 API

v1.2.6 (2026-02-27)

  • 🐛 修复内置抓取源(如纬来体育)URL 刷新后未重新生成播放列表,导致 APTV 等客户端拿到的仍是过期链接的问题;现在每次抓取到新 URL 后会立即以快速模式重建 interface.txt
  • 📺 新增内置频道 Bloomberg TV(国际分组)
  • 📺 新增内置频道 Eurosport 4K(体育分组)
  • 📺 新增内置频道 Red Bull TV(体育分组)

v1.2.5 (2026-02-27)

  • 🐛 修复内置抓取源(如纬来体育)因 m3u8 链接过期导致无法播放的问题,将自动刷新间隔从 240 分钟缩短为 60 分钟
  • 🐛 修复内置抓取源抓取失败时不清除旧缓存的问题,抓取失败时现在会自动清除过期缓存,避免继续使用无效链接

v1.2.4

  • 内置源管理功能
  • Web 管理后台优化

📚 详细功能说明

核心功能

  • 多种直播源支持

    • 咪咕视频源(300+ 频道,含 CCTV、卫视、地方台)
    • 外部自定义直播源(m3u8 格式)
    • 订阅模式(m3u/m3u8 播放列表批量导入)
    • 内置精选频道订阅源(央视 / 港澳台 / 地方 / 国际)
  • 灵活的画质选择

    • 标清 (480p) - 游客可用
    • 高清 (720p) - 游客可用
    • 蓝光 (1080p) - 需要 VIP
    • 原画 (1080p+) - 需要 VIP
    • 4K (2160p) - 需要 VIP
  • 回看功能 - 支持当天节目回看

  • Web 管理后台

    • 📺 自动抓取网页中的 m3u8 播放地址
    • 🔧 手动添加已知的播放地址
    • 🔄 支持独立自动刷新功能
    • ⚡ 快速模式:删除/修改源 1-2 秒内生效
  • 自动更新节目单(EPG) - 定时同步最新节目信息


🔧 本地部署(进阶用户)

前置要求

  • Node.js 18+ 环境
  • 中国大陆网络环境(访问咪咕频道)

注意事项

  1. 登录后使用请注意账号安全
  2. 咪咕频道需要中国大陆网络环境才可正常访问

使用模式

🎯 游客模式(推荐,无需配置)

  • ✅ 无需配置账号,开箱即用
  • ✅ 支持所有普通频道(央视、卫视、地方台等)
  • ✅ 支持回看功能
  • ⚠️ 画质限制为 720p

🎫 VIP 会员模式

  • ✅ 支持高清及以上画质(1080p、蓝光、4K)
  • ✅ 支持体育赛事等会员内容
  • ⚠️ 需要配置 muserIdmtoken
  • ⚠️ 需要咪咕视频 VIP 会员

提示:登录普通账号(无VIP)与游客模式效果相同,都是 720p 画质。只有 VIP 会员才能观看高清及以上画质。

📝 如何获取 userId 和 token

如需使用 VIP 会员功能,需要获取咪咕账号的 userIdtoken

[!IMPORTANT] 获取步骤:

  1. 使用浏览器访问 咪咕视频官网
  2. 登录你的咪咕 VIP 账号
  3. 打开浏览器开发者工具(F12)
  4. 切换到"网络"(Network) 标签
  5. 刷新页面,在请求中找到包含认证信息的 API 请求
  6. 从请求头或响应中提取 userIdtoken 参数
获取userId和token示例

浏览器开发者工具获取 userId 和 token 示例

配置说明

🎮 游客模式开箱即用,下面这些全部留空也能跑。 大多数人最多动账号 / 画质 / 持久化几项即可,其余进阶项建议在管理后台直接设置,不必记环境变量。

🔹 常用配置(够大多数人用)

变量名默认值说明
muserId咪咕账号 ID(仅 VIP 高画质需要,游客留空)
mtoken咪咕登录 token(同上,网页端登录后获取)
mhost公网 / NAS 访问地址,如 http://192.168.1.100:1905
mrateType3画质:2 标清 / 3 高清 / 4 蓝光(需 VIP)
mpass访问密码(可选),设置后访问 http://ip:port/密码/...
mdataDir/migu/data数据持久化目录(镜像已默认此值并声明数据卷);建议再用 -v ./data:/migu/data 绑定到宿主机便于备份

💡 进阶项(管理页路径、HDR / H.265、更新间隔、token 刷新等)可在 管理后台 →「系统配置」 页里改,保存即时生效;完整环境变量见下方折叠表。

📋 完整配置表(全部环境变量)
变量名默认值类型介绍
muserIdstring用户id(仅VIP用户需要配置)
可在网页端登录获取
mtokenstring用户token(仅VIP用户需要配置)
可在网页端登录获取
mport1905number本地运行端口号
mhoststring公网/自定义访问地址
格式http://ip:port
mrateType3number画质
2: 标清 (480p)
3: 高清 (720p)
4: 蓝光 (1080p,需VIP)
7: 原画 (1080p+,需VIP)
9: 4K (2160p,需VIP)
mpassstring访问密码 大小写字母和数字
添加后访问格式 http://ip:port/mpass/...
madminPathadminstring管理页面自定义路径,如填 console 则用 /console 访问后台(/admin 失效)
保留字 api/player/favicon.ico 与非法值会回退 admin
menableHDRtrueboolean是否开启 HDR(vivid/4kvivid)
false 关闭
menableH265trueboolean是否开启 H.265 原画
有兼容性问题(如浏览器无画面)时设 false 关闭
mupdateInterval8number节目单 / 源更新间隔(小时),不建议过短
mrefreshTokentrueboolean是否每月刷新咪咕 token
可能导致封号,可设 false 关闭
mblankfalseboolean空白模式总开关,设 true 后下面三项内容开关默认翻转为关(一行得到空白部署)
细粒度开关显式设值时优先于本项,如 mblank=true + menableMigu=true 可单独保留咪咕
menableMigutrueboolean是否启用咪咕源(CCTV/卫视抓取 + 体育赛事 + EPG + token 刷新)
false 后仅分发内置 / 外部源;体育赛事、回放、咪咕 EPG 随之不可用
menableBuiltInSourcestrueboolean是否启用内置单频道源(纬来体育 / Red Bull / 4K 卫视 等)
false 不加载也不抓取
menableBuiltInSubscriptionstrueboolean是否启用内置订阅源(精选频道)
false 不加入;已添加的可在「源管理」删除,删后不再复活
mdataDir镜像内 /migu/data;node 直跑为当前目录string配置 / 数据持久化目录(仅环境变量可设
镜像已默认 /migu/data 并声明数据卷;建议 -v ./data:/migu/data 绑定宿主机便于备份

说明:除 mdataDir/mport 外,以上多数项也可在 system-config.json 或管理后台「系统配置」页修改;后台保存即时生效(端口与更新间隔需重启)。

高级功能详解

📺 多套配置档(大分组,给不同电视各一套)

家里多台电视各有偏好(大厅给老人、卧室给年轻人、茶室……),可以用「配置档」给每台电视维护一套独立的频道编排,互不影响。

怎么用: 管理后台 →「📺 我的频道」标题行右侧:

  • 配置档下拉:切换当前编辑 / 查看的档(默认档 = 原来的「我的频道」,地址不变)
  • ➕ 新建:复制当前档为新的一档(弹窗填显示名如「卧室」,可选填英文地址短名如 woshi,留空自动生成)
  • ✏️ 改名 / 🗑️ 删除:管理非默认档(默认档不可删 / 改名)

每台电视填各自的地址即可(每档底部会显示,可直接复制):

配置档M3U 地址
默认http://你的IP:1905/interface.m3u
卧室(woshi)http://你的IP:1905/interface.m3u?profile=woshi
茶室(chashi)http://你的IP:1905/interface.m3u?profile=chashi

💡 各档共享同一份底层频道与 EPG,只是「同一全集的不同视图」——隐藏 / 分组 / 排序 / 重命名各管各的,新增电视不增加抓取成本。

🔗 带 .m3u 后缀的 /interface.m3u 与裸 /m3u 内容完全相同、可互换;推荐用带后缀的(部分 App 按后缀校验才认),已用裸 /m3u 配好的地址无需更换。

🔐 设了访问密码时地址带上 /<密码> 前缀即可:http://你的IP:1905/<密码>/interface.m3u?profile=woshi。各档配置随 mdataDir 数据卷持久化,升级不丢。

🧹 空白部署 / 纯频道管理(内容开关)

默认会自带咪咕源、内置单频道源(纬来体育 / Red Bull / 4K 卫视等)和内置订阅源(精选频道)。如果你只想用自己的源、要一个干净的环境(也避免自建源与自带源同名分组撞车),可以用内容开关把它们关掉。

一个总开关 + 三个细粒度开关(细粒度显式设值时优先于总开关;全部默认开,老用户无需理会):

需求配置
彻底空白,自己加源mblank=true
空白但保留咪咕核心mblank=true + menableMigu=true
只去掉自带的额外源 / 订阅menableBuiltInSources=false + menableBuiltInSubscriptions=false
关掉其中某一项对应 menableMigu / menableBuiltInSources / menableBuiltInSubscriptionsfalse

compose 示例(彻底空白):

environment:
  - mblank=true

也可在 管理后台 →「系统配置」 勾选这三个开关,保存后自动重新生成播放列表、即时生效(无需重启)。

⚠️ 关闭咪咕(menableMigu=false)后,体育赛事、回放、咪咕 EPG(节目单)将不可用,历史播放列表里的咪咕频道直链也会失效——这是纯频道管理模式的预期表现。

💡 关掉内置订阅源后,「源管理」里已存在的精选频道订阅可手动删除,删除后重启不会再自动加回来

📡 公网地址配置 (mhost)

公网地址用于生成可分享的播放列表链接,支持内网和公网同时访问。

使用场景:

  • ✅ 使用反向代理(如 nginx)访问服务
  • ✅ 通过域名访问服务
  • ✅ 需要分享播放列表给他人使用
  • ❌ 仅本地/局域网使用(留空即可)

配置方式:

通过 Web 管理后台配置时:

  • 只需输入域名/IP(如 http://example.com),端口会自动使用服务端口
  • 也可手动指定端口(如 http://example.com:8080

通过环境变量配置:

mhost="http://yourdomain.com:1905"

智能路径选择:

  • 内网直接访问 → 播放列表使用内网地址(如 http://192.168.1.100:1905
  • 公网直接访问 → 播放列表使用访问时的地址
  • 反向代理访问 → 自动使用配置的公网地址(检测到 X-Forwarded-ForX-Real-IP 请求头)

示例:

# 场景1: 内网访问
访问: http://192.168.1.100:1905/m3u
结果: 播放列表中的链接为 http://192.168.1.100:1905/...

# 场景2: 通过 nginx 反向代理访问(已配置 mhost)
访问: http://yourdomain.com/m3u
结果: 播放列表中的链接为 http://yourdomain.com:1905/...

🔐 访问密码功能 (mpass)

设置访问密码后,所有服务(播放列表、管理后台、频道直播)都需要在 URL 中包含密码路径。

配置方式:

通过 Web 管理后台:

  • 在"系统配置"中设置访问密码(只支持字母和数字)
  • 保存并重启服务生效

通过环境变量:

mpass="yourpassword"

访问格式:

服务无密码访问有密码访问
播放列表 (m3u)http://ip:port/interface.m3uhttp://ip:port/密码/interface.m3u
播放列表 (txt)http://ip:port/txthttp://ip:port/密码/txt
回放文件http://ip:port/playback.xmlhttp://ip:port/密码/playback.xml
频道直播http://ip:port/608807420http://ip:port/密码/608807420
管理后台http://ip:port/adminhttp://ip:port/密码/admin

自动路径注入:

设置密码后,系统会自动处理:

  • ✅ 播放列表中的所有频道链接自动包含密码路径
  • ✅ 回放文件路径自动包含密码
  • ✅ 管理后台 API 自动鉴权
  • ✅ 未授权访问会返回友好提示信息

测试示例:

# 设置密码为 test123 后

# 场景1: 不带密码访问(失败)
curl http://localhost:1905/m3u
# 返回:身份认证失败

# 场景2: 带密码访问(成功)
curl http://localhost:1905/test123/m3u
# 返回:正常的播放列表
# 列表中的链接: http://localhost:1905/test123/608807420

# 场景3: 管理后台(无密码访问被拒绝)
访问: http://localhost:1905/admin
# 返回 403:访问需要密码,请使用正确的密码路径访问管理后台

安全建议:

  • 🔒 使用复杂密码(字母+数字组合)
  • 🔒 定期更换密码
  • 🔒 不要在公开场合分享带密码的链接
  • 🔒 如果只是内网使用,可以不设置密码

Web 管理后台

本项目提供可视化的 Web 管理界面,方便您管理外部直播源。

访问地址

  • 无密码: http://ip:port/admin
  • 有密码: http://ip:port/mpass/admin

功能说明

1. 查看所有频道

  • 左侧面板显示从直播源获取的所有频道,按分组展示(央视、体育、卫视、地方等)
  • 实时加载最新的频道列表

2. 搜索频道

  • 支持实时搜索,快速查找您想要的频道
  • 支持模糊匹配频道名称

3. 管理外部源

添加外部源有三种方式:

方式一:自动抓取
  1. 点击"添加源"按钮
  2. 填写频道信息:
    • 频道名称:自定义频道名称(如"纬来体育")
    • 分组:选择或输入分组名称(如"体育")
    • 网页地址:填写包含播放器的网页URL
    • 等待时间:页面加载等待时间(毫秒,默认3000)
    • 独立自动刷新:是否定期自动刷新该频道的播放地址
  3. 点击"保存并抓取"
  4. 系统会自动访问网页,抓取 m3u8 播放地址
  5. 抓取成功后,频道会自动添加到播放列表

优点

  • ✅ 自动获取播放地址,无需手动查找
  • ✅ 支持自动刷新,保持链接有效性
  • ✅ 智能选择最优播放链接(优先长链接)

适用场景

  • 网页中有在线播放器的直播源
  • 需要定期更新播放地址的源
方式二:手动输入
  1. 点击"添加源"按钮
  2. 填写频道信息(同上)
  3. 直接填写 m3u8 地址:在"M3U8 地址"栏输入已知的播放地址
  4. 点击"保存"
  5. 频道立即添加到播放列表

优点

  • ✅ 无需等待抓取,立即生效
  • ✅ 适用于已知播放地址的场景
  • ✅ 不依赖网页结构

适用场景

  • 已知确切的 m3u8 播放地址
  • 播放地址长期稳定不变的源
方式三:订阅 m3u 播放列表(批量导入)
  1. 点击"添加源"按钮
  2. 切换到"订阅模式"
  3. 填写订阅信息:
    • 订阅名称:自定义名称(如"港澳地方频道")
    • M3U 地址:填写 m3u/m3u8 播放列表的 URL
    • 刷新间隔:自动刷新周期(分钟,默认1440即每天一次)
  4. 点击"📥 导入并保存"
  5. 系统会自动解析播放列表,批量导入所有频道

优点

  • ✅ 一次导入多个频道,无需逐个添加
  • ✅ 自动解析频道名称、分组、Logo 等信息
  • ✅ 支持定时自动刷新,保持频道列表最新
  • ✅ 项目已内置精选频道订阅,开箱即用

适用场景

  • 拥有 m3u/m3u8 格式的频道列表 URL
  • 需要批量添加大量频道
  • 使用第三方维护的频道列表
管理现有外部源
  • 修改:点击频道旁的"编辑"按钮,修改后保存
  • 删除:点击"删除"按钮,确认后自动更新播放列表
  • 启用/禁用:通过开关快速控制频道的显示

智能更新机制:

  • 添加/修改/删除外部源后,系统会自动重新生成播放列表
  • 使用缓存机制加速更新(1-2秒内完成,无需重新抓取咪咕数据)
  • 新添加的源显示在列表顶部,方便查看

注意事项:

  • ⚠️ 自动抓取需要服务器能访问目标网页
  • ⚠️ 部分网页可能有反爬虫机制,导致抓取失败
  • ⚠️ 抓取失败时,系统会自动选择最长的候选链接作为备用
  • ✅ 外部源配置保存在 external-sources.json 文件中

###配置文件说明

项目提供了示例配置文件,首次使用时需要复制并修改:

使用示例

# 杀掉进程
pkill -f "node app.js"
# 启动服务
node app.js

# 访问管理后台
http://localhost:1905/admin

# 如果设置了密码 (mpass=mypass)
http://localhost:1905/mypass/admin

Node.js 本地运行

适合开发者和需要自定义修改的用户

环境要求

需要 NodeJS 18+ 环境

安装

git clone <your-repository-url>
cd iPTV

运行

node app.js
#lsof -ti:1905 | xargs kill -9 && node app.js
#node scripts/probe-m3u.mjs              # 只看报告、不改文件
#DRY_RUN=0 node scripts/probe-m3u.mjs    # 探活 + 直接删死链
# 然后 git add IPTV.m3u && git commit && git push

若需要修改配置,可以使用以下命令 Mac/Linux:

mport=1905 mhost="http://localhost:1905" node app.js

Windows下使用git-bash等终端:

set mport=1905 && set mhost="http://localhost:1905" && node app.js

Windows下使用PowerShell等终端:

$Env:mport=1905; $Env:mhost="http://localhost:1905"; node app.js

免责声明

本仓库仅供学习使用,请尊重版权,请勿利用此仓库从事商业行为及非法用途!


License

本项目采用 GNU General Public License v3.0(GPL-3.0)开源许可。 详情请查看仓库根目录下的 LICENSE 文件。

关于 About

基于 Docker 的 IPTV 直播源管理与分发系统:可视化后台、咪咕源抓取(含体育赛事/EPG),支持外部源管理与 m3u txt 订阅;内置纬来体育、Red Bull、4K 卫视及港澳台等,开箱即用。
iptviptv-channelsiptv-freeiptv-linksiptv-m3uiptv-m3u8iptv-playlistmigu

语言 Languages

HTML51.9%
JavaScript47.7%
Dockerfile0.3%

提交活跃度 Commit Activity

代码提交热力图
过去 52 周的开发活跃度
241
Total Commits
峰值: 39次/周
Less
More

核心贡献者 Contributors