iPTV-Docker
☕ 打赏支持 / Buy Me a Coffee
如果这个项目对你有帮助,欢迎支持一下 :)
| ❤️ GitHub Sponsors | ☕ Ko-fi | 💰 USDT (TRC20) |
|
|
|
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 直播源解决方案,主要功能包括:
-
📺 咪咕视频源抓取 - 自动获取咪咕视频的电视频道,包括 CCTV 和主要卫视频道(720P 高清画质)
-
🎫 VIP 会员增强 - 配置开通相应会员的咪咕账号信息后,可抓取体育直播等会员频道(支持 1080P、蓝光或更高画质)
-
🔗 外部源管理 - 支持添加外部 m3u8 直播链接、通过网页播放地址自动抓取直播源,或通过订阅模式导入 m3u/m3u8 播放列表批量添加频道
-
🖥️ 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 解码,只能解出音频、没有画面。解决办法:
- 进后台「系统配置」,取消勾选「启用 H.265 原画」,点保存;
- 点页面顶部「重启服务」让配置生效(旧的流地址有缓存,必须重启);
- 在播放端(飞牛影视等)重新打开频道(必要时重新订阅一次)。
环境变量部署等价于设 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归一到规范名(= 本项目 EPGplayback.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.m3u,built-in-sources.json仅保留需网页抓取的纬来体育;以后这些频道改IPTV.m3upush 即可。合并时按「同分组 名称+地址」去重,与未升级镜像并存也不会重复
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.js中delay未引入导致 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.json、package-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+ 环境
- 中国大陆网络环境(访问咪咕频道)
注意事项
- 登录后使用请注意账号安全
- 咪咕频道需要中国大陆网络环境才可正常访问
使用模式
🎯 游客模式(推荐,无需配置)
- ✅ 无需配置账号,开箱即用
- ✅ 支持所有普通频道(央视、卫视、地方台等)
- ✅ 支持回看功能
- ⚠️ 画质限制为 720p
🎫 VIP 会员模式
- ✅ 支持高清及以上画质(1080p、蓝光、4K)
- ✅ 支持体育赛事等会员内容
- ⚠️ 需要配置
muserId和mtoken - ⚠️ 需要咪咕视频 VIP 会员
提示:登录普通账号(无VIP)与游客模式效果相同,都是 720p 画质。只有 VIP 会员才能观看高清及以上画质。
📝 如何获取 userId 和 token
如需使用 VIP 会员功能,需要获取咪咕账号的 userId 和 token。
[!IMPORTANT] 获取步骤:
- 使用浏览器访问 咪咕视频官网
- 登录你的咪咕 VIP 账号
- 打开浏览器开发者工具(F12)
- 切换到"网络"(Network) 标签
- 刷新页面,在请求中找到包含认证信息的 API 请求
- 从请求头或响应中提取
userId和token参数
浏览器开发者工具获取 userId 和 token 示例
配置说明
🎮 游客模式开箱即用,下面这些全部留空也能跑。 大多数人最多动账号 / 画质 / 持久化几项即可,其余进阶项建议在管理后台直接设置,不必记环境变量。
🔹 常用配置(够大多数人用)
| 变量名 | 默认值 | 说明 |
|---|---|---|
| muserId | 咪咕账号 ID(仅 VIP 高画质需要,游客留空) | |
| mtoken | 咪咕登录 token(同上,网页端登录后获取) | |
| mhost | 公网 / NAS 访问地址,如 http://192.168.1.100:1905 | |
| mrateType | 3 | 画质:2 标清 / 3 高清 / 4 蓝光(需 VIP) |
| mpass | 访问密码(可选),设置后访问 http://ip:port/密码/... | |
| mdataDir | /migu/data | 数据持久化目录(镜像已默认此值并声明数据卷);建议再用 -v ./data:/migu/data 绑定到宿主机便于备份 |
💡 进阶项(管理页路径、HDR / H.265、更新间隔、token 刷新等)可在 管理后台 →「系统配置」 页里改,保存即时生效;完整环境变量见下方折叠表。
📋 完整配置表(全部环境变量)
| 变量名 | 默认值 | 类型 | 介绍 |
|---|---|---|---|
| muserId | string | 用户id(仅VIP用户需要配置) 可在网页端登录获取 | |
| mtoken | string | 用户token(仅VIP用户需要配置) 可在网页端登录获取 | |
| mport | 1905 | number | 本地运行端口号 |
| mhost | string | 公网/自定义访问地址 格式http://ip:port | |
| mrateType | 3 | number | 画质 2: 标清 (480p) 3: 高清 (720p) 4: 蓝光 (1080p,需VIP) 7: 原画 (1080p+,需VIP) 9: 4K (2160p,需VIP) |
| mpass | string | 访问密码 大小写字母和数字 添加后访问格式 http://ip:port/mpass/... | |
| madminPath | admin | string | 管理页面自定义路径,如填 console 则用 /console 访问后台(/admin 失效)保留字 api/player/favicon.ico 与非法值会回退 admin |
| menableHDR | true | boolean | 是否开启 HDR(vivid/4kvivid) 设 false 关闭 |
| menableH265 | true | boolean | 是否开启 H.265 原画 有兼容性问题(如浏览器无画面)时设 false 关闭 |
| mupdateInterval | 8 | number | 节目单 / 源更新间隔(小时),不建议过短 |
| mrefreshToken | true | boolean | 是否每月刷新咪咕 token 可能导致封号,可设 false 关闭 |
| mblank | false | boolean | 空白模式总开关,设 true 后下面三项内容开关默认翻转为关(一行得到空白部署)细粒度开关显式设值时优先于本项,如 mblank=true + menableMigu=true 可单独保留咪咕 |
| menableMigu | true | boolean | 是否启用咪咕源(CCTV/卫视抓取 + 体育赛事 + EPG + token 刷新) 设 false 后仅分发内置 / 外部源;体育赛事、回放、咪咕 EPG 随之不可用 |
| menableBuiltInSources | true | boolean | 是否启用内置单频道源(纬来体育 / Red Bull / 4K 卫视 等) 设 false 不加载也不抓取 |
| menableBuiltInSubscriptions | true | boolean | 是否启用内置订阅源(精选频道) 设 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 / menableBuiltInSubscriptions 设 false |
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-For或X-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.m3u | http://ip:port/密码/interface.m3u |
| 播放列表 (txt) | http://ip:port/txt | http://ip:port/密码/txt |
| 回放文件 | http://ip:port/playback.xml | http://ip:port/密码/playback.xml |
| 频道直播 | http://ip:port/608807420 | http://ip:port/密码/608807420 |
| 管理后台 | http://ip:port/admin | http://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. 管理外部源
添加外部源有三种方式:
方式一:自动抓取
- 点击"添加源"按钮
- 填写频道信息:
- 频道名称:自定义频道名称(如"纬来体育")
- 分组:选择或输入分组名称(如"体育")
- 网页地址:填写包含播放器的网页URL
- 等待时间:页面加载等待时间(毫秒,默认3000)
- 独立自动刷新:是否定期自动刷新该频道的播放地址
- 点击"保存并抓取"
- 系统会自动访问网页,抓取 m3u8 播放地址
- 抓取成功后,频道会自动添加到播放列表
优点:
- ✅ 自动获取播放地址,无需手动查找
- ✅ 支持自动刷新,保持链接有效性
- ✅ 智能选择最优播放链接(优先长链接)
适用场景:
- 网页中有在线播放器的直播源
- 需要定期更新播放地址的源
方式二:手动输入
- 点击"添加源"按钮
- 填写频道信息(同上)
- 直接填写 m3u8 地址:在"M3U8 地址"栏输入已知的播放地址
- 点击"保存"
- 频道立即添加到播放列表
优点:
- ✅ 无需等待抓取,立即生效
- ✅ 适用于已知播放地址的场景
- ✅ 不依赖网页结构
适用场景:
- 已知确切的 m3u8 播放地址
- 播放地址长期稳定不变的源
方式三:订阅 m3u 播放列表(批量导入)
- 点击"添加源"按钮
- 切换到"订阅模式"
- 填写订阅信息:
- 订阅名称:自定义名称(如"港澳地方频道")
- M3U 地址:填写 m3u/m3u8 播放列表的 URL
- 刷新间隔:自动刷新周期(分钟,默认1440即每天一次)
- 点击"📥 导入并保存"
- 系统会自动解析播放列表,批量导入所有频道
优点:
- ✅ 一次导入多个频道,无需逐个添加
- ✅ 自动解析频道名称、分组、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 文件。