如果这个项目对你有帮助,欢迎支持一下 :)
| ❤️ GitHub Sponsors | ☕ Ko-fi | 💰 USDT (TRC20) |
|
|
|
TArpwDgewYSFCYX6XoJ6drwpEU6UGBw5yqOnly via TRON (TRC20) network |
当前版本:v3.14.0
一个基于 Docker 部署的 IPTV 直播源管理与分发系统:提供可视化管理后台,核心抓取咪咕视频源(含体育赛事 / EPG 节目单),并支持外部直播源管理与 m3u/m3u8 订阅导入。
- 📺 免费频道支持标清/高清(480p/720p),1080P 蓝光画质需要咪咕 VIP 会员
- 🏆 咪咕体育直播(昨天/今天/明天赛事)需开通对应咪咕体育会员方可播放
- 🎁 已内置多个稳定可靠的免费频道,如纬来体育、Red Bull、4K 卫视、港澳台及 HBO / CNN / BBC 等海外频道,无需额外配置即可使用
- 📡 内置精选频道订阅源(央视 / 港澳台 / 地方 / 国际),开箱即用
- 🔗 支持订阅模式,可导入 m3u/m3u8 播放列表批量添加频道
- 🆕 批量把频道整块移到分组最前/最后:进入「批量管理」勾选频道后,工具栏新增「移到最前 / 移到最后」,把选中的一批频道作为整块挪到当前分组的组首或组尾(其余频道保持原顺序)——整源频道一次排到分组前面/后面,不用再逐个拖拽调整。若该分组当前为「名称自动排序」,需先切回「手动」排序(issue #83)
- 🐛 修复订阅源频道名/播放异常:部分订阅把
group-title写在#EXTINF逗号之后(如tvg-logo="…",group-title="央视",CCTV1综合),旧解析按「第一个逗号之后」取名,会把group-title="央视"一并当成频道名;脏名字回填进tvg-id="…"后破坏整行 EXTINF 语法,导致该频道显示错乱、播放异常。改为取「最后一个属性引号之后的逗号」后的部分,名字不再吞属性。已加入的源刷新一次即修正(issue #84) - 🐛 修复网页提取源播放地址被写坏:「网页提取」模式的源,若页面文本里的地址含
×tamp=、¬in=这类参数,浏览器解析网页时会把×、¬等不带分号的旧式 HTML 实体误解成×、¬等字符,坏地址随后被保存导致一直播不了;现已自动还原。已坏的地址无需手动处理,下次刷新该源即修正。仅影响网页提取(填「网页地址」抓取)的源,订阅源不受影响(issue #84) - 🛠️ 后台「播放地址」显示修正:频道详情弹窗里带
×tamp=的地址此前会被浏览器渲染成×tamp=(仅显示层,复制按钮与对外播放列表始终是正确地址);现已转义,显示与实际一致(issue #84)
完整更新历史见下方 更新日志
本项目提供完整的 IPTV 直播源解决方案,核心能力:
- 📺 咪咕视频源抓取 — 自动获取 CCTV、卫视等频道(720P 高清;配置咪咕 VIP 账号可解锁体育直播及 1080P / 蓝光更高画质)
- 🔗 外部源管理 — 外部 m3u8 直链、网页播放页自动抓取、m3u/m3u8 订阅批量导入
- 🖥️ Web 管理后台 — 访问
http://你的IP:1905/admin,可视化管理直播源、分组、台标、EPG 等
📋 详细功能与配置见下方文档。
创建 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升级镜像时这些配置会全部丢失、恢复默认。若你之前已部署且容器里已有配置,升级前先备份出来再挂卷。建议直接备份整个数据目录(包含系统配置、外部订阅源、我的频道、多配置档
my-playlist-config.*.json、账号、EPG 源、台标缓存等全部文件,单拷个别 json 容易漏):mkdir -p ./data # 较新版本镜像(数据在 /migu/data):整目录拷出,一步到位 docker cp iptv:/migu/data/. ./data/ 2>/dev/null || true # 旧版本镜像(数据在 /migu 根目录):逐个拷贝配置文件 for f in system-config.json my-playlist-config.json my-playlist-profiles.json external-sources.json epg-sources.json users.json; do \ docker cp "iptv:/migu/$f" ./data/ 2>/dev/null || true; done # 然后再用带 volumes 的 compose 重新 up -d
启动服务:
docker-compose up -d常用命令:
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
# 更新镜像
docker-compose pull && docker-compose up -ddocker pull akiralereal/iptv:latest
# 或指定版本
docker pull akiralereal/iptv:1.3.1docker run -d -p 1905:1905 -v "$(pwd)/data:/migu/data" --name iptv akiralereal/iptv:latest
-v把配置持久化到宿主机./data,删除/重建容器、升级镜像都不丢配置;省略它则配置只存在容器的匿名卷里,换容器即丢。
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
Tip
快速访问管理后台:
- 无密码访问:
http://your-ip:1905/admin - 有密码访问:
http://your-ip:1905/密码/admin
💡 将 your-ip 替换为你的服务器IP地址,例如: http://192.168.1.100:1905/admin
通过管理后台可以:
- ✅ 查看所有频道列表
- ✅ 添加/编辑/删除外部直播源
- ✅ 配置系统参数(画质、公网地址、访问密码等)
- ✅ 一键更新播放列表
Q:飞牛影视 / 某些播放器点开频道「只有声音、没有画面」(提示「仅支持音频直播」)?
A:这是 H.265(HEVC)编码兼容性问题——咪咕视频流默认是 H.265,而部分播放器(如飞牛影视内置播放器)不支持 H.265 解码,只能解出音频、没有画面。解决办法:
- 进后台「系统配置」,取消勾选「启用 H.265 原画」,点保存——保存即清掉旧的流地址缓存、即时生效,无需重启;
- 在播放端(飞牛影视等)重新打开频道(必要时重新订阅一次)即可。
若仍未生效,重启一次容器即可;用环境变量 menableH265=false 部署的,则必须重启容器才生效。关闭后回落到兼容性最好的 H.264,清晰度基本无感。若个别频道仍只有声音,再加 menableHDR=false(少数频道为 HDR/Vivid 导致)。
-
✅ 多种直播源支持
- 咪咕视频源(300+ 频道,含 CCTV、卫视、地方台)
- 外部自定义直播源(m3u8 格式)
- 订阅模式(m3u/m3u8 播放列表批量导入)
- 内置精选频道订阅源(央视 / 港澳台 / 地方 / 国际)
-
✅ 灵活的画质选择
- 标清 (480p) - 游客可用
- 高清 (720p) - 游客可用
- 蓝光 (1080p) - 需要 VIP
- 原画 (1080p+) - 需要 VIP
- 4K (2160p) - 需要 VIP
-
✅ 回看功能 - 支持当天节目回看
-
✅ Web 管理后台
- 📺 自动抓取网页中的 m3u8 播放地址
- 🔧 手动添加已知的播放地址
- 🔄 支持独立自动刷新功能
- ⚡ 快速模式:删除/修改源 1-2 秒内生效
-
✅ 自动更新节目单(EPG) - 定时同步最新节目信息
- Node.js 18+ 环境
- 中国大陆网络环境(访问咪咕频道)
- 登录后使用请注意账号安全
- 咪咕频道需要中国大陆网络环境才可正常访问
- ✅ 无需配置账号,开箱即用
- ✅ 支持所有普通频道(央视、卫视、地方台等)
- ✅ 支持回看功能
⚠️ 画质限制为 720p
- ✅ 支持高清及以上画质(1080p、蓝光、4K)
- ✅ 支持体育赛事等会员内容
⚠️ 需要配置muserId和mtoken⚠️ 需要咪咕视频 VIP 会员
提示:登录普通账号(无VIP)与游客模式效果相同,都是 720p 画质。只有 VIP 会员才能观看高清及以上画质。
如需使用 VIP 会员功能,需要获取咪咕账号的 userId 和 token。
Important
获取步骤:
- 使用浏览器访问 咪咕视频官网
- 登录你的咪咕 VIP 账号
- 打开浏览器开发者工具(F12)
- 切换到"网络"(Network) 标签
- 刷新页面,在请求中找到包含认证信息的 API 请求
- 从请求头或响应中提取
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(节目单)将不可用,历史播放列表里的咪咕频道直链也会失效——这是纯频道管理模式的预期表现。💡 关掉内置订阅源后,「源管理」里已存在的精选频道订阅可手动删除,删除后重启不会再自动加回来。
公网地址用于生成可分享的播放列表链接,支持内网和公网同时访问。
使用场景:
- ✅ 使用反向代理(如 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/...设置访问密码后,所有服务(播放列表、管理后台、频道直播)都需要在 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 管理界面,方便您管理外部直播源。
- 无密码:
http://ip:port/admin - 有密码:
http://ip:port/mpass/admin
- 左侧面板显示从直播源获取的所有频道,按分组展示(央视、体育、卫视、地方等)
- 实时加载最新的频道列表
- 支持实时搜索,快速查找您想要的频道
- 支持模糊匹配频道名称
添加外部源有三种方式:
- 点击"添加源"按钮
- 填写频道信息:
- 频道名称:自定义频道名称(如"纬来体育")
- 分组:选择或输入分组名称(如"体育")
- 网页地址:填写包含播放器的网页URL
- 等待时间:页面加载等待时间(毫秒,默认3000)
- 独立自动刷新:是否定期自动刷新该频道的播放地址
- 点击"保存并抓取"
- 系统会自动访问网页,抓取 m3u8 播放地址
- 抓取成功后,频道会自动添加到播放列表
优点:
- ✅ 自动获取播放地址,无需手动查找
- ✅ 支持自动刷新,保持链接有效性
- ✅ 智能选择最优播放链接(优先长链接)
适用场景:
- 网页中有在线播放器的直播源
- 需要定期更新播放地址的源
- 点击"添加源"按钮
- 填写频道信息(同上)
- 直接填写 m3u8 地址:在"M3U8 地址"栏输入已知的播放地址
- 点击"保存"
- 频道立即添加到播放列表
优点:
- ✅ 无需等待抓取,立即生效
- ✅ 适用于已知播放地址的场景
- ✅ 不依赖网页结构
适用场景:
- 已知确切的 m3u8 播放地址
- 播放地址长期稳定不变的源
- 点击"添加源"按钮
- 切换到"订阅模式"
- 填写订阅信息:
- 订阅名称:自定义名称(如"港澳地方频道")
- 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适合开发者和需要自定义修改的用户
需要 NodeJS 18+ 环境
git clone <your-repository-url>
cd iPTVnode 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.jsWindows下使用git-bash等终端:
set mport=1905 && set mhost="http://localhost:1905" && node app.jsWindows下使用PowerShell等终端:
$Env:mport=1905; $Env:mhost="http://localhost:1905"; node app.js- 🆕 批量把频道整块移到分组最前/最后:进入「批量管理」勾选频道后,工具栏新增「移到最前 / 移到最后」,把选中的一批频道作为整块挪到当前分组的组首或组尾(其余频道保持原顺序)——整源频道一次排到分组前面/后面,不用再逐个拖拽调整。若该分组当前为「名称自动排序」,需先切回「手动」排序(issue #83)
- 🐛 修复订阅源频道名/播放异常:部分订阅把
group-title写在#EXTINF逗号之后(如tvg-logo="…",group-title="央视",CCTV1综合),旧解析按「第一个逗号之后」取名,会把group-title="央视"一并当成频道名;脏名字回填进tvg-id="…"后破坏整行 EXTINF 语法,导致该频道显示错乱、播放异常。改为取「最后一个属性引号之后的逗号」后的部分,名字不再吞属性。已加入的源刷新一次即修正(issue #84) - 🐛 修复网页提取源播放地址被写坏:「网页提取」模式的源,若页面文本里的地址含
×tamp=、¬in=这类参数,浏览器解析网页时会把×、¬等不带分号的旧式 HTML 实体误解成×、¬等字符,坏地址随后被保存导致一直播不了;现已自动还原。已坏的地址无需手动处理,下次刷新该源即修正。仅影响网页提取(填「网页地址」抓取)的源,订阅源不受影响(issue #84) - 🛠️ 后台「播放地址」显示修正:频道详情弹窗里带
×tamp=的地址此前会被浏览器渲染成×tamp=(仅显示层,复制按钮与对外播放列表始终是正确地址);现已转义,显示与实际一致(issue #84)
- 🆕 按配置档选择源:每套配置档可勾选「启用哪些源」(咪咕 / 各内置源 / 各自定义源)——档管理弹窗每档新增「📡 源」按钮批量勾选;添加/编辑自定义源时也可直接选「在哪些配置档显示」。多源同频道只要有一个来源启用就保留;先按源粗筛、再细化隐藏,多源上千频道不用再逐个隐藏(issue #29 / #68)
- 🆕 设置页拆二级标签:原「系统配置」页更名「设置」,内部拆为 系统配置 / 频道别名 / 自动分组 / EPG 聚合 / 用户管理 五个二级标签,不再一页到底;系统配置新增「保存并重启」按钮,需重启的配置一步生效(issue #72)
- 🆕 关键字分组规则支持上移/下移:多条规则「首条命中胜」,现可直接调序改优先级,不用删了重加(issue #69)
- 🐛 自动刷新间隔更准时:外部源「自动刷新间隔」此前每小时才检查一次,导致设定的间隔不精确(如设 60 分钟最坏要近 2 小时才刷);改为每 5 分钟检查、到点即刷(间隔最小仍为 60 分钟)(issue #73)
- 🛠️ 画质提示更清楚:后台「咪咕账号 / 画质」提示改为明确说明——游客(不填账号)最高 540p、填免费咪咕账号可到 720p、蓝光 1080p 及以上需 VIP,避免「游客上不去 720p」的误解(issue #76)
- 🆕 关键字自动分组:后台新增「关键字自动分组」规则——按频道名关键字(如
央视 ← CCTV)把「未分组」频道自动归到对应分组。自定义订阅源里没写分组、每次刷新又回到未分组的频道,配一次以后自动归位,不用再天天手动整理;只对「未分组」生效、不动源已分好的组,手动移动优先(issue #69) - 🆕 添加订阅源可设「默认分组」:订阅源表单新增「默认分组」,订阅里没自带分组的频道整体归到这个分组(频道自带分组的保持不变),适合整源单主题的情况;与上面的关键字规则互补、按需选用(issue #69)
- 🛠️ 设置布局优化:把「频道别名」「关键字自动分组」两张规则卡片从系统配置最底上移、与「统一频道显示名」聚在一起,更好找
- 🆕 频道列表显示「配对状态」+ 详情可直接设别名:「我的频道」列表每个频道用两个小圆点显示节目单 / 台标是否匹配(绿=已匹配 / 红=未匹配,上方有常驻图例说明);没匹配上的点开「频道详情」可直接填规范名给它设别名(追加、不覆盖已有),保存即时重算、不用去配置页;详情台标预览也放大了(issue #62)
- 🆕 订阅地址栏支持复制公网地址:在「系统配置 → 公网地址」填好公网域名:端口后,订阅栏新增「复制公网订阅 / 公网 EPG」按钮——分享给外网用户时,m3u 里的节目单地址(
x-tvg-url)也会是公网地址,不用再手动替换内网 IP(issue #62) - 🆕 频道别名支持「编辑」+ 归一支持繁体转简体:别名规则可直接编辑(不必先删再重输)、规则多了列表可滚动不撑长页面;EPG / 台标归一时会把常见繁体频道名(鳳凰衛視 / 緯來體育 等)转成简体再匹配,繁体源也能对上(issue #56 / #62)
- 🐛 修复 CCTV 4K / 8K 被错并进 CCTV4 / CCTV8:CCTV-4K / CCTV-8K 是独立的超高清频道,之前归一时丢掉了数字后的「K」、导致和 CCTV-4 / CCTV-8 撞成同一台互相合并,现已正确区分(issue #56)
- 🛠️ 内置「精选频道」增加本地兜底:远程(GitHub raw + 各镜像)全部拉不到时,回退读镜像里自带的频道列表,保证「无外网、镜像也挂」的环境下精选频道仍能加载(能联网的照常拿最新)
- 🆕 内置「精选频道」新增一批频道:体育(beIN SPORTS XTRA / ESPN / FIFA+ / NBC Sports NOW / NHL Network / Tennis Channel 等)、新闻(Reuters / Sky News / NHK World / France24)、纪实(National Geographic / Love Nature 4K)、影视(HBO / Cinemax / LMN 系列)、卫视(苏州4K)及央视付费频道等,开箱即用(「精选频道」为远程下发,已有部署无需重建镜像即可获得)
- 🛠️ 「我的频道」列表显示优化:频道名加宽页面与卡片后完整显示(不再被截断成两三个字);台标去掉背景框、非方形图自然显示、无台标则留空对齐;移除列表里不易懂的「节目单」配对图标,配对状态改到「频道详情」里以文字展示(issue #62)
- 🐛 修复关闭 H.265 / HDR 后不生效:咪咕流地址按频道缓存、且缓存键不含 H.265 / HDR,改了开关旧缓存仍发旧编码的流。现在后台「系统配置」保存后会即时清掉该缓存、无需等缓存过期或重启容器(issue #60)
- 🛠️ 内置「纬来体育」切换播放源:原
jrkan.com走 Cloudflare、国内不翻墙打不开,切到国内可达的jrs03.com(远程下发,已有部署自动切换、无需重建镜像)
- 🆕 统一频道显示名(按规则批量合并不同源同台命名):不同订阅源里同一个台的不同写法(
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 刷新的可靠性
- 🧪 用户访问令牌 / 一人一源(测试阶段):可在后台「系统配置 → 👤 用户管理」给每个家人 / 朋友生成独立的源地址
/u/<令牌>/m3u,支持单独停用、重置令牌、绑定不同频道档(一人一内容),且令牌只能拉源、进不了管理后台——分享源地址不再连带暴露后台。泄露可追溯到具体某人、可单独吊销,其他人不受影响。本功能仍在测试中,建议先小范围试用、欢迎反馈;不新增用户则对现有部署与现有链接零影响。可用enableUserTokens=false(或环境变量menableUserTokens=false)关闭 - 🐛 修复外部 EPG「加了源一个都匹配不上」:很多 EPG 源的频道 id 是数字 / 拼音代号、真实台名写在
<display-name>里,旧逻辑只按 id 比对导致 0 命中;现改为优先按 display-name 归一配对(并保留 id 兜底)。另注意:外部 EPG 只给咪咕没覆盖的频道补节目单,咪咕已有 EPG 的频道显示匹配 0 属正常(issue #53) - 🛠️ 自定义分组「隐藏分组」按钮加说明:自定义分组本就只支持「删除分组」(不提供隐藏,因为它不随源刷新复活),现在鼠标悬停会提示「请用删除分组、或用批量管理隐藏其中频道」,避免误以为能整组隐藏(issue #42 追问)
- 🆕 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 → v1.2.4)
- 🆕 频道可一键复制到多个分组:「频道详情」新增「复制到分组」,可把自己的频道(外部 / 直连 / 订阅)同时放进多个分组(如把 TVB 复制到「亚太」和「香港」),每个分组里是独立的一份、隐藏 / 排序 / 删除互不影响;复制的是固定地址的独立频道、可在「外部源管理」删除(咪咕频道地址为服务端跳转、暂不支持)(issue #37)
- 🆕 支持导入本地 .m3u/.txt 文件批量加源:「添加源 → 订阅模式」新增「本地文件 / 粘贴」,可选本地 m3u/m3u8/txt 文件、或直接粘贴内容批量导入,自动识别格式与 GBK/UTF-8 编码,全程不发起网络请求(issue #43)
- 🆕 后台上传 / 预览频道台标:「频道详情」可预览当前台标,并给没台标的频道直接上传图片(png/jpg/webp),存到
data/logos/、优先级最高、保存即生效,旁边可移除(issue #40) - 🐛 修复频道移动到其它分组后无法隐藏:从原分组移动到新分组的频道,之前在新分组里点隐藏会「提示已隐藏但实际仍显示」,再次批量移动 / 移回原组也会失效(隐藏 / 移动用错了分组标识);现统一按频道真实原始分组处理,已修正(issue #42)
- 🆕 频道名称 / 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);现改为只按「当前可见分组」判重——看不到的分组不再占名,但同名分组若当前可见仍会被拦截(防止误合并)
- 🆕 订阅源支持带账号密码的地址:添加订阅源时可直接填
http://用户名:密码@域名/x.m3u形式的地址,系统会自动转成 HTTP Basic 认证去拉取,不再因地址里带用户名:密码@而获取失败(注:仅认证「拉取播放列表」这一步;列表内各频道的流地址若也需认证,由播放器侧处理) - 🛠️ 后台默认给带
.m3u后缀的订阅地址:「我的频道」配置档里复制的订阅地址改为/interface.m3u(内容与/m3u完全相同),更适配「按后缀校验订阅链接」的 App(飞牛影视等),不用再手动改地址;裸/m3u仍然有效,已配好的地址无需更换 - 🐛 修复飞牛影视等无法订阅播放列表:
/m3u、/interface.m3u之前以媒体类型audio/x-mpegurl返回,会被飞牛订阅 / 浏览器当成「一个视频」去播放、而非当订阅文本解析,导致订阅失败;现改为text/plain返回(与 GitHub raw 一致),普通播放器不受影响 - 🐛 修复「分组内按名称排序」单独设置时不生效:当某配置档只设了某分组「📑 排序:名称」、且没有其它任何自定义(隐藏 / 分组 / 重命名等)时,该排序之前不会生效,现已修复
本次为「多套配置档(大分组)」大版本:一套服务可维护多套个性化播放列表,给家里不同电视(大厅老人 / 卧室年轻人 / 茶室)各用各的;同时补齐外部频道台标、修复多个 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 个频道」
- 🛠️ 「我的频道」显示总频道数:管理后台「我的频道」标题后实时显示当前总频道数(共 X 个频道),随频道增删 / 移动自动更新
- 🆕 内置源配置支持远程拉取:
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 即可。合并时按「同分组 名称+地址」去重,与未升级镜像并存也不会重复
本次将内置订阅源从依赖第三方链接切换为项目自维护,运行时不再依赖外部仓库的内容与可用性。
- 🔄 内置订阅源改为自维护:移除第三方 YueChan 的「港澳地方频道 / 全球频道」两个内置订阅,替换为项目自带、可自行维护更新的「精选频道」(央视 / 港澳台 / 地方 / 国际,约 115 频道;源文件
IPTV.m3u随仓库分发,走本仓库的 raw 链接定时刷新),不再依赖第三方仓库的内容与可用性 - 🧹 老用户自动清理「僵尸源」:升级后启动时一次性移除已退役的旧 YueChan 订阅(含其缓存频道),避免「换源后旧源残留、且因不在内置列表里而连开关都关不掉」;只跑一次,尊重用户后续的手动增删
- 🛠️ 核心内容开关独立成组:管理后台「系统配置」中的「启用咪咕源 / 内置单频道源 / 内置订阅源」三项从常规配置里独立出来,做成醒目的「🔑 核心内容开关」卡片(红色描边、标注默认开启并提示谨慎关闭),与端口 / 密码等普通配置项形成 UI 区分,降低误关导致频道大幅减少甚至空白的概率
- 🗑️ 移除后台「🧹 一键空白」按钮:该按钮仅是一次性勾掉上述三个开关、易误触,且与单独勾选重复,本版移除;需要空白部署仍可用环境变量
mblank或手动关闭三个开关实现
- 🆕 订阅源支持 txt 格式:订阅模式现自动识别播放列表格式,除 m3u/m3u8 外也支持 txt(diyp/TVBox:
分组,#genre#/频道名,地址,一个频道用#连多个备用源时取首个),无需额外设置;兼容 GBK/GB2312 编码 - 🆕 内容开关 / 空白部署:新增
mblank空白模式总开关 +menableMigu/menableBuiltInSources/menableBuiltInSubscriptions三个细粒度开关(环境变量或管理后台「系统配置」勾选;细粒度优先于mblank;默认全开,老用户无感)。一行mblank=true即得到纯频道管理的空白部署,或单独关掉自带的内置源 / 内置订阅源,避免与自建源同名分组撞车 - 🆕 后台「🧹 一键空白」:系统配置页新增上述三个开关与一键空白按钮,保存后自动重新生成播放列表、无需重启即时生效
- 🛠️ 内置订阅源可彻底删除:自带的「港澳地方频道 / 全球频道」订阅改为「只播种一次」,删除后重启不再自动复活(尊重用户删除);关闭内置订阅时抓取层与输出层一并跳过,不再无谓联网下载
- 🐛 修复 Docker 主版本标签:发布镜像的主版本滚动标签此前一直错打成
:1(实际是 v2.x),现修正为:2,并修bump-version.js使其今后自动更新该标签
- 🆕 单频道重命名:频道详情弹窗可给任意频道自定义显示名(清空或改回原名即恢复);只改显示名、不动
tvg-name,不影响 EPG 匹配。适合统一不同订阅源对同一频道的不同命名 - 🆕 批量移动到分组:「我的频道」批量管理模式新增「移动选中到〈分组〉」,可一次把多个选中频道移到指定分组
- 🛡️ 空数据不覆盖播放列表:某次刷新获取到 0 个频道时(通常是咪咕/网络不可达)保留上一次的好播放列表,不再用空文件覆盖,避免「我的频道」被清空且不自愈
- 🔧 管理页显示实际生效配置:系统配置接口改为返回「环境变量 + 配置文件 + 默认值」合并后的实际生效值——修复用环境变量(
muserId/mtoken等)配置时,换电脑/无浏览器自动填充的情况下表单显示为空的问题 - 💡 环境变量覆盖提示:当某些配置由 docker-compose 环境变量设置时,系统配置页顶部醒目提示并列出受影响项(说明清空保存会回退到环境变量值、需改 compose)
- 🔧 检查更新日志优化:镜像逐个回退时的失败改为黄色警告,仅全部镜像失败才标红,避免成功的检查更新看起来像报错
- 🐛 分组上移/下移后选中跟随:之前移动分组后,左侧选中仍停在原位置(变成了被换上来的另一个分组),要重新点选才能继续移动;现在选中会跟随被移动的分组,可连续点上移/下移(例如把某分组一路移到最后)
- 💾 配置持久化(升级不再丢配置):运行时数据(咪咕账号、外部订阅源、我的频道分组顺序/隐藏/归类/排序等)改为集中存放,并支持
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
本次为安全与稳定性大版本,并新增多项管理功能(自 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 死代码
- 🆕 频道详情弹窗新增一键调起本地播放器按钮(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 赞助入口
- 🐛 修复频道数据缓存污染导致内置源/外部源频道重复累积的问题:
getAllChannels合并时使用浅拷贝,导致内置源和外部源频道被写入咪咕缓存,每次自动刷新触发regenerateOnly重新生成播放列表时重复叠加(如纬来体育出现多条)
- 🐛 修复 Docker 环境下内置抓取源(如纬来体育)无法抓取的问题:Alpine Linux 的 Chromium 路径为
/usr/bin/chromium,而非/usr/bin/chromium-browser,导致 Puppeteer 找不到浏览器,抓取静默失败 - 🔒 修复安全问题:未授权访问
/admin或/player时,响应中会明文暴露访问密码;现改为返回 403 并仅提示密码路径格式 - 🐛 修复设置访问密码后,使用
/密码/admin路径无法访问管理后台的问题(路由匹配未覆盖带密码前缀的路径)
- 🆕 新增手动分组功能:可在「我的频道」中创建空分组,并在自定义源中直接使用这些分组
- 🗑️ 新增手动分组删除功能:删除后,该分组下的自定义直连/抓取频道会自动并入
未分组 - 🔒 调整分组操作边界:内置咪咕分组、订阅源分组仅支持隐藏,
未分组不允许重命名、删除或隐藏 - 🐛 修复自定义频道与分组管理问题:避免直连频道 ID 冲突导致“我的频道”丢失频道,并阻止重命名到已存在分组名
- 🐛 修复频道去重逻辑:将全局按频道名去重改为分类内去重,允许同一频道出现在不同分组中,与咪咕 App 行为一致
- 🐛 修复隐藏频道逻辑:
hiddenChannels改为按分组独立隐藏,避免跨分组误隐藏同名频道 - 🔧 频道详情弹窗优化:清理冗余播放按钮,保留复制地址功能
- 🔄 检查更新支持 GitHub 镜像回退:依次尝试原始地址、ghfast.top、gh-proxy.com、gcore.jsdelivr.net,解决国内 Docker 环境无法访问 GitHub 的问题
- 🐛 修复 jsDelivr 镜像 URL 转换错误导致该镜像始终 404 的问题
- 🔧 GitHub 镜像列表统一维护(
GITHUB_RAW_MIRRORS),检查更新与订阅抓取共用,避免重复代码 - 🐛 修复管理页面版本号显示与实际版本不一致的问题
- 📦 新增
bump-version.js版本号统一更新脚本,一条命令同步更新所有文件
- 🌐 新增外网访问协议自动检测:通过 NAS 转发(绿联、群晖、威联通等)或自定义域名访问时,自动使用 HTTPS 协议生成频道地址,解决外网无法播放的问题
- 🔀 内网/外网/自定义域名三条路径互不影响,内网访问不走外网,避免上行带宽浪费
- 📺 根路径
/默认返回 M3U 格式(audio/x-mpegurl),APTV 等客户端可直接用根地址导入
- 🆕 新增分组重命名功能:可自定义分组名称,重命名后同名分组自动合并,支持重置恢复原名
- 🆕 新增分组隐藏通配符支持:在配置中使用
体育-*可一次性隐藏所有体育赛事分组 - 🆕 新增检查更新功能:在「关于我们」页面可一键检查是否有新版本
- 🔧 重置功能改为弹窗选项式,支持分项重置(重命名 / 隐藏 / 排序),避免误操作
- 🐛 修复频道详情来源识别错误:正确区分咪咕源、内置源、外部源
- 🐛 修复编辑按钮在非外部源频道上错误显示的问题
- 🐛 修复订阅类型外部源编辑时无法定位到正确源的问题
- 🐛 修复
/txt端点未应用用户配置过滤的问题 - 🗑️ 移除冗余的「保存配置」按钮(各操作已自动保存)
- 🐛 修复 Docker 环境下播放列表文件写入不完整的问题:生成
interface.txt时使用了异步文件写入(fire-and-forget),导致文件重命名时部分分组尚未写入完成,造成港澳台地方频道(浙江、河南、广东、宁夏、广西、云南等)分组缺失;现已改为同步写入,确保文件完整性 - 🔧 优化日志输出:精简定时检查源更新、频道请求等高频日志,大幅减少 Docker 容器日志量
- 🐛 修复订阅源(如港澳台频道)首次获取失败后无重试机制,导致频道缺失的问题;现在启动 60 秒后自动重试
- 🐛 修复订阅源获取失败时不保留已有缓存数据的问题;失败时保留旧频道数据,引入指数退避重试机制
- 🐛 修复外部源每小时定时检查时无条件写入配置文件的问题;现在仅在有源被实际更新时才保存
- 🆕 启动时新增游客模式提示:未配置咪咕账号时提示最高画质为 720p
- 📸 README 新增管理后台截图展示
- 🆕 新增订阅模式(外部源第三种模式):支持导入 m3u/m3u8 播放列表 URL,一次性批量添加多个频道,支持自动定时刷新
- 📺 新增内置港澳台及地方频道订阅源(港澳地方频道),默认启用,开箱即用
- 🖥️ 管理后台新增订阅模式 UI:支持填写订阅名称、m3u 地址、刷新间隔,一键导入并保存
- 📝 更新
external-sources.json.example示例文件,新增订阅模式配置示例
- 🔖 版本号升级到
1.2.8,同步更新package.json、package-lock.json、README 展示版本及 Docker workflow 镜像版本标签 - ⚖️ 新增 GPL-3.0 开源许可(
LICENSE),并在文档中补充 License 说明 - 🧹 清理运行时缓存文件
pe-cache.json出仓库,并加入.gitignore防止误提交
- 🐛 修复内置抓取源 URL 刷新后重建播放列表(regenerateOnly 模式)会丢失体育-昨天/今天/明天频道的问题;现在
updatePE运行时同步保存赛事缓存,快速模式下直接从缓存恢复,无需重新调用 API
- 🐛 修复内置抓取源(如纬来体育)URL 刷新后未重新生成播放列表,导致 APTV 等客户端拿到的仍是过期链接的问题;现在每次抓取到新 URL 后会立即以快速模式重建
interface.txt - 📺 新增内置频道 Bloomberg TV(国际分组)
- 📺 新增内置频道 Eurosport 4K(体育分组)
- 📺 新增内置频道 Red Bull TV(体育分组)
- 🐛 修复内置抓取源(如纬来体育)因 m3u8 链接过期导致无法播放的问题,将自动刷新间隔从 240 分钟缩短为 60 分钟
- 🐛 修复内置抓取源抓取失败时不清除旧缓存的问题,抓取失败时现在会自动清除过期缓存,避免继续使用无效链接
- 内置源管理功能
- Web 管理后台优化
本仓库仅供学习使用,请尊重版权,请勿利用此仓库从事商业行为及非法用途!
本项目采用 GNU General Public License v3.0(GPL-3.0)开源许可。
详情请查看仓库根目录下的 LICENSE 文件。


