Repository: YanG-1989/m3u
Branch: main
Commit: 45f246c4b800
Files: 6
Total size: 103.3 KB
Directory structure:
gitextract_1yvdr9sm/
├── Gather.m3u
├── Migu.m3u
├── NoobIPTV.sh
├── README.md
├── Watchtower.sh
└── hosts.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: Gather.m3u
================================================
#EXTM3U x-tvg-url="https://epg-1.iill.top/epg.xml.gz"
#EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg-1.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",免费订阅:请勿贩卖...
https://epg-1.iill.top/v/302.mp4
#EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg-1.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",维护时间:2025-1-15#佛系维护...
https://epg-1.iill.top/v/301.mp4
#EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg-1.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",维护内容:维护 Gather「删除 •IPV6 源」
https://epg-1.iill.top/v/302.mp4
#EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg-1.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",公告说明:IPV6 暂无
https://epg-1.iill.top/v/301.mp4
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩广场舞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011523/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011523&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩少年「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011525/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011525&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩竞技「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011528/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011528&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩篮球「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011529/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011529&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜𝕂-𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000005180/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜𝕂-𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000015686/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015686&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000005308/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005308&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000005969/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005969&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000007218/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000007218&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000008001/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008001&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000008176/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008176&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000008379/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008379&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000010129/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010129&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000010948/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010948&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟡「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000028638/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000028638&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟘「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000031494/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000031494&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000000097/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000000097&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000002019/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002019&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000002809/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002809&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000003915/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000003915&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000004193/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000004193&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000005837/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005837&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000006077/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006077&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000006658/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006658&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟡「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000009788/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000009788&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟘「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000010833/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000010833&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000011297/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011297&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000011518/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011518&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000012558/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012558&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000012616/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012616&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000015470/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015470&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000015560/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015560&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000017678/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000017678&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000019839/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000019839&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟡「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000021904/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000021904&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟘「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000023434/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000023434&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000025380/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000025380&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000027691/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000027691&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000031669/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000031669&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011518/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011518&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011519/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011519&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011520/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011520&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011521/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011521&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011522/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011522&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」热门赛事
http://dns.yiandrive.com:15907/bilibili/10
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」CS 2
https://live.iill.top/bilibili/21622811
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」CS 2
https://live.iill.top/huya/483917
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」英雄联盟
https://live.iill.top/bilibili/6
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」英雄联盟 𝟙
https://live.iill.top/huya/660000
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」英雄联盟 𝟚
https://live.iill.top/huya/660001
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」英雄联盟 𝟙
https://live.iill.top/douyu/288016
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」英雄联盟 𝟚
https://live.iill.top/douyu/424559
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」英雄联盟•手游
https://live.iill.top/bilibili/23138275
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」王者荣耀 𝟙
https://live.iill.top/bilibili/55
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」王者荣耀 𝟚
https://live.iill.top/bilibili/21654762
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」王者荣耀 𝟙
https://live.iill.top/huya/660002
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」王者荣耀 𝟚
https://live.iill.top/huya/660164
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」王者荣耀 𝟙
https://live.iill.top/douyu/1863767
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」王者荣耀 𝟚
https://live.iill.top/douyu/1984839
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」绝地求生
https://live.iill.top/bilibili/98
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」绝地求生 𝟙
https://live.iill.top/huya/660004
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」绝地求生 𝟚
https://live.iill.top/huya/660005
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」绝地求生
https://live.iill.top/douyu/100
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」和平精英
https://live.iill.top/huya/660006
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」和平精英
https://live.iill.top/douyu/999
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」金铲铲之战
https://live.iill.top/huya/660579
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」金铲铲之战
https://live.iill.top/douyu/9715241
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」DOTA2
https://live.iill.top/huya/660118
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」DOTA2
https://live.iill.top/douyu/3811559
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」云顶之弈
https://live.iill.top/douyu/522423
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」永劫无间
https://live.iill.top/huya/660115
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」永劫无间
https://live.iill.top/huya/9662891
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」使命召唤•手游
https://live.iill.top/bilibili/22741849
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」使命召唤•手游
https://live.iill.top/huya/11718629
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」使命召唤•手游
https://live.iill.top/douyu/9223245
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」穿越火线
https://live.iill.top/huya/660101
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」穿越火线 𝟙
https://live.iill.top/douyu/605964
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」穿越火线 𝟚
https://live.iill.top/douyu/5388537
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」穿越火线•手游
https://live.iill.top/huya/660102
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」第五人格
https://live.iill.top/bilibili/5555
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」第五人格
https://live.iill.top/huya/idvesports
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」第五人格
https://live.iill.top/douyu/3226194
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」逆战
https://live.iill.top/huya/nsl2021
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」无畏契约
https://live.iill.top/bilibili/22908869
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」无畏契约
https://live.iill.top/huya/660679
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」无畏契约
https://live.iill.top/douyu/4585645
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」原神
https://live.iill.top/douyu/10853239
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」QQ飞车•手游
https://live.iill.top/bilibili/21743919
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」QQ飞车•手游
https://live.iill.top/douyu/5040227
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」梦幻西游·手游
https://live.iill.top/huya/9163712
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」街霸
https://live.iill.top/huya/11437
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」JJ斗地主
https://live.iill.top/bilibili/22021983
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」JJ斗地主
https://live.iill.top/douyu/488743
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」我的世界
https://live.iill.top/douyu/738878
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」FIFA
https://live.iill.top/douyu/7692166
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」火影忍者
https://live.iill.top/douyu/1997723
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」跑跑卡丁车
https://live.iill.top/douyu/7722576
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」跑跑卡丁车•手游
https://live.iill.top/douyu/6672862
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",音乐石榴「音乐」
https://live.iill.top/huya/17091681
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",音乐速递「音乐」
https://live.iill.top/huya/19439762
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",治愈•放松「音乐」
https://live.iill.top/huya/21241811
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",阅读•学习「音乐」
https://live.iill.top/huya/21241813
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电视剧•1「解说」
https://live.iill.top/huya/21277391
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电视剧•2「解说」
https://live.iill.top/huya/25018873
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电影•1「解说」
https://live.iill.top/huya/20289754
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电影•2「解说」
https://live.iill.top/huya/24983280
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电影•3「解说」
https://live.iill.top/huya/24396428
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",动漫•1「解说」
https://live.iill.top/huya/19757963
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",恐怖电影「解说」
https://live.iill.top/huya/23419131
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",漫威「解说」
https://live.iill.top/huya/17089779
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",美剧「解说」
https://live.iill.top/huya/20488841
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",七龙珠「解说」
https://live.iill.top/huya/25650806
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",止戈电影「解说」
https://live.iill.top/huya/19863777
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",挨饿德•1「其他」
https://live.iill.top/huya/20985858
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",挨饿德•2「其他」
https://live.iill.top/huya/17693860
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",互扇巴掌大赛「其他」
https://live.iill.top/huya/20072873
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",荒野求生「其他」
https://live.iill.top/huya/593667
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",野行者「其他」
https://live.iill.top/huya/20072663
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",跳舞「其他」
https://live.iill.top/huya/24634408
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",茶啊二中「动画」
https://live.iill.top/huya/11213191
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",哆啦A梦「动漫」
https://live.iill.top/huya/11601963
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",航海王「动漫」
https://live.iill.top/huya/16913382
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",七龙珠「动漫」
https://live.iill.top/huya/11601966
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",猫和老鼠「动漫」
https://live.iill.top/huya/11352879
#EXTINF:-1 tvg-logo="https://epg-1.iill.top/logo/虎牙.png" group-title="•影视「轮播」",中华小当家「动漫」
https://live.iill.top/huya/11342413
================================================
FILE: Migu.m3u
================================================
#EXTM3U x-tvg-url="https://epg-1.iill.top/epg.xml.gz"
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•其他「运营商」",Github「使用说明」
https://raw.githubusercontent.com/YanG-1989/m3u/refs/heads/main/hosts.txt
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩广场舞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011523/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011523&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩少年「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011525/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011525&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩竞技「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011528/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011528&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩篮球「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011529/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011529&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜𝕂-𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000005180/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜𝕂-𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000015686/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015686&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000005308/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005308&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000005969/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005969&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000007218/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000007218&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000008001/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008001&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000008176/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008176&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000008379/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008379&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000010129/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010129&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000010948/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010948&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟡「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000028638/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000028638&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟘「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000001000031494/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000031494&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000000097/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000000097&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000002019/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002019&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000002809/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002809&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000003915/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000003915&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000004193/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000004193&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000005837/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005837&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000006077/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006077&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000006658/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006658&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟡「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000009788/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000009788&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟘「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000010833/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000010833&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000011297/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011297&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000011518/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011518&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000012558/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012558&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000012616/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012616&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000015470/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015470&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000015560/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015560&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000017678/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000017678&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000019839/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000019839&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟡「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000021904/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000021904&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟘「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000023434/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000023434&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟙「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000025380/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000025380&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟚「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000027691/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000027691&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟛「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000010000031669/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000031669&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟜「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011518/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011518&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟝「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011519/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011519&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟞「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011520/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011520&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟟「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011521/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011521&livemode=1&stbId=YanG-1989
#EXTINF:-1 tvg-id="咪咕体育" tvg-name="咪咕体育" tvg-logo="https://epg-1.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟠「移动」
http://gslbserv.itv.cmvideo.cn:80/3000000020000011522/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011522&livemode=1&stbId=YanG-1989
================================================
FILE: NoobIPTV.sh
================================================
#!/bin/bash
###############################
# 名称: NoobIPTV (IPTV 项目相关脚本集合 @小白神器)
# 作者: YanG-1989
# 项目地址:https://github.com/YanG-1989
# 最新版本:2.1.2
###############################
# 设置路径
SCRIPT_PATH="$HOME/NoobIPTV.sh" # 定义脚本路径
CONFIG_FILE="$HOME/.NoobIPTV" # 配置文件路径
REVERSE_PROXY="docker.zhai.cm" # 设置反向代理地址
# 设置颜色变量
RED="\033[1;31m" # 红
GREEN="\033[1;32m" # 绿
YELLOW="\033[1;33m" # 黄
CYAN="\033[1;36m" # 青
RESET="\033[0m" # 重置
# echo -e "${GREEN}这是绿色粗体文本。${RESET}"
############# 菜单 #############
# 显示 菜单
show_menu() {
echo "-------------------"
echo " 请选择一个项目: "
echo "-------------------"
echo "1) Pixman 项目 "
echo "2) Fourgtv 项目 "
echo "3) Doubebly 项目 "
echo "~~~~~~~~~~~~~~~~~~~"
echo "4) Docker 管理助手 "
echo "~~~~~~~~~~~~~~~~~~~"
echo "5) -- 工具箱 -- "
echo "~~~~~~~~~~~~~~~~~~~"
echo "6) ~~ 脚本信息 ~~ "
echo "-------------------"
echo "0) 退出 "
echo " [ Ctrl+C ] "
echo "-------------------"
}
# Pixman 菜单
show_pixman_menu() {
echo "-------------------"
echo " Pixman 菜单: "
echo "-------------------"
echo "1) 安装 Pixman 项目"
echo "2) 卸载 Pixman 项目"
echo "3) 设置 反向代理 地址"
echo "-------------------"
echo "0) 返回主菜单 "
echo "-------------------"
}
# Fourgtv 菜单
show_fourgtv_menu() {
echo "---------------------"
echo " Fourgtv 菜单: "
echo "---------------------"
echo "1) 安装 Fourgtv 项目 "
echo "2) 卸载 Fourgtv 项目 "
echo "3) 设置 反向代理 地址 "
echo "---------------------"
echo "0) 返回主菜单 "
echo "---------------------"
}
# Doubebly 菜单
show_doubebly_menu() {
echo "---------------------"
echo " Doubebly 菜单: "
echo "---------------------"
echo "1) 安装 Doubebly 项目"
echo "2) 卸载 Doubebly 项目"
echo "3) 设置 反向代理 地址"
echo "---------------------"
echo "0) 返回主菜单 "
echo "---------------------"
}
# Watchtower 菜单
show_watchtower_menu() {
echo "----------------------"
echo " Watchtower 菜单: "
echo "----------------------"
echo "1) 一键更新 Docker 项目"
echo "2) 管理 Docker 项目更新"
echo "3) 一键清理 Docker 垃圾"
echo "4) 一键设置 Docker 日志"
echo "----------------------"
echo "0) 返回主菜单 "
echo "----------------------"
}
# 工具箱 菜单
show_toolbox_menu() {
echo "---------------------"
echo " 工具箱菜单: "
echo "---------------------"
echo "1) [Docker] 1Panel "
echo "2) [Docker] o11 "
echo "3) [Docker] 3X-UI "
echo "4) [Docker] Sub Store"
echo "5) [Docker] LibreTV "
echo "6) [233boy] Sing-box "
echo "7) [Jimmy ] Alice DNS"
echo "---------------------"
echo "0) 返回主菜单 "
echo "---------------------"
}
# 1Panel 菜单
show_1panel_menu() {
echo "-------------------"
echo " 1Panel 菜单: "
echo "-------------------"
echo "1) 安装 1Panel "
echo "2) 卸载 1Panel "
echo "3) 设置 1Panel "
echo "-------------------"
echo "0) 返回上级菜单 "
echo "-------------------"
}
# 3X-UI 菜单
show_3x_ui_menu() {
echo "-------------------"
echo " 3X-UI 菜单: "
echo "-------------------"
echo "1) 安装 3X-UI "
echo "2) 更新 3X-UI "
echo "3) 卸载 3X-UI "
echo "-------------------"
echo "0) 返回上级菜单 "
echo "-------------------"
}
# o11 菜单
show_o11_menu() {
echo "-------------------"
echo " o11 菜单: "
echo "-------------------"
echo "1) 安装 o11 "
echo "2) 卸载 o11 "
echo "-------------------"
echo "0) 返回上级菜单 "
echo "-------------------"
}
# subs 菜单
show_subs_menu() {
echo "-------------------"
echo " Sub Store 菜单: "
echo "-------------------"
echo "1) 安装 Sub Store "
echo "2) 卸载 Sub Store "
echo "-------------------"
echo "0) 返回上级菜单 "
echo "-------------------"
}
# libretv 菜单
show_libretv_menu() {
echo "-------------------"
echo " LibreTV 菜单: "
echo "-------------------"
echo "1) 安装 LibreTV "
echo "2) 卸载 LibreTV "
echo "-------------------"
echo "0) 返回上级菜单 "
echo "-------------------"
}
############# Pixman #############
# 判断 Pixman 容器
judge_Pixman() {
local NETWORK_MODE PORT env_vars
echo "正在安装 Pixman 项目 作者: @Pixman..."
if docker ps -a --format '{{.Names}}' | grep -q "^pixman$"; then
local MODE ENV_VARS
ENV_VARS=$(docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' pixman)
MYTVSUPER_TOKEN=$(echo "$ENV_VARS" | grep -oP 'MYTVSUPER_TOKEN=\K.*')
HAMI_SESSION_ID=$(echo "$ENV_VARS" | grep -oP 'HAMI_SESSION_ID=\K.*')
HAMI_SERIAL_NO=$(echo "$ENV_VARS" | grep -oP 'HAMI_SERIAL_NO=\K.*')
HAMI_SESSION_IP=$(echo "$ENV_VARS" | grep -oP 'HAMI_SESSION_IP=\K.*')
HTTP_PROXY=$(echo "$ENV_VARS" | grep -oP 'HTTP_PROXY=\K.*')
HTTPS_PROXY=$(echo "$ENV_VARS" | grep -oP 'HTTPS_PROXY=\K.*')
echo -e "${CYAN}检测到已存在的 Pixman 容器,将进行重新安装...${RESET}"
echo -e "当前 ${GREEN}Pixman${RESET} 配置参数:"
[ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN" || echo "MYTVSUPER_TOKEN: 未设置"
[ -n "$HAMI_SESSION_ID" ] && echo "HAMI_SESSION_ID: $HAMI_SESSION_ID" || echo "HAMI_SESSION_ID: 未设置"
[ -n "$HAMI_SERIAL_NO" ] && echo "HAMI_SERIAL_NO: $HAMI_SERIAL_NO" || echo "HAMI_SERIAL_NO: 未设置"
[ -n "$HAMI_SESSION_IP" ] && echo "HAMI_SESSION_IP: $HAMI_SESSION_IP" || echo "HAMI_SESSION_IP: 未设置"
[ -n "$HTTP_PROXY" ] && echo "HTTP_PROXY: $HTTP_PROXY" || echo "HTTP_PROXY: 未设置"
[ -n "$HTTPS_PROXY" ] && echo "HTTPS_PROXY: $HTTPS_PROXY" || echo "HTTPS_PROXY: 未设置"
docker rm -f pixman > /dev/null 2>&1
docker rmi -f "$IMAGE_SOURCE" > /dev/null 2>&1
install_Pixman "$MYTVSUPER_TOKEN" "$HAMI_SESSION_ID" "$HAMI_SERIAL_NO" "$HAMI_SESSION_IP" "$HTTP_PROXY" "$HTTPS_PROXY"
else
install_Pixman
fi
}
# 安装 Pixman 容器
install_Pixman() {
local PORT=$(check_and_allocate_port 5000)
local ARCH IMAGE_SOURCE PROXY_IMAGE_SOURCE
local MYTVSUPER_TOKEN="$1"
local HAMI_SESSION_ID="$2"
local HAMI_SERIAL_NO="$3"
local HAMI_SESSION_IP="$4"
local HTTP_PROXY="$5"
local HTTPS_PROXY="$6"
echo -e "${CYAN}开始配置 Pixman 参数...${RESET}"
echo "请选择 Pixman 部署方式(默认: 2):"
echo "1) 使用 host 网络模式 (建议:软路由)"
echo "2) 使用 bridge 网络模式 (建议:VPS)"
read -rp "输入选项 (1 或 2): " option_fourgtv
option_fourgtv=${option_fourgtv:-2}
case "$option_fourgtv" in
1) NETWORK_MODE="host" ;;
2) NETWORK_MODE="bridge" ;;
*)
echo -e "${RED}无效选项,使用默认的 bridge 模式。${RESET}"
NETWORK_MODE="bridge"
;;
esac
if [[ "$NETWORK_MODE" == "bridge" ]]; then
read -p "请输入 Pixman 容器端口 (当前值: $PORT 输入null清空): " input_port
if [ -n "$input_port" ]; then
[ "$input_port" = "null" ] && PORT="" || PORT=$(check_and_allocate_port "$input_port")
fi
else
PORT=""
fi
echo "是否需要设置其他环境变量?[y/n](默认:n)"
read -rp "输入选项: " configure_all_vars
configure_all_vars=${configure_all_vars:-n}
if [[ "$configure_all_vars" =~ ^[Yy]$ ]]; then
local env_vars=("MYTVSUPER_TOKEN" "HAMI_SESSION_ID" "HAMI_SERIAL_NO" "HAMI_SESSION_IP" "HTTP_PROXY" "HTTPS_PROXY")
for var in "${env_vars[@]}"; do
local current_value=$(eval echo \$$var)
read -p "请输入 ${var} (当前值: ${current_value:-未设置}, 输入null清空): " input_value
if [ -n "$input_value" ]; then
[ "$input_value" = "null" ] && eval $var="" || eval $var="$input_value"
fi
done
else
echo -e "${YELLOW}已跳过所有环境变量的设置。${RESET}"
fi
ARCH=$(uname -m)
if [[ "$ARCH" == "armv7"* ]]; then
IMAGE_SOURCE="pixman/pixman-armv7"
PROXY_IMAGE_SOURCE="$REVERSE_PROXY/pixman-armv7"
else
IMAGE_SOURCE="pixman/pixman"
PROXY_IMAGE_SOURCE="$REVERSE_PROXY/pixman/pixman"
fi
pull_image "$IMAGE_SOURCE" "$PROXY_IMAGE_SOURCE"
local docker_command="docker run -d --name pixman --restart always"
if [[ "$NETWORK_MODE" == "host" ]]; then
docker_command+=" --net=host"
else
docker_command+=" --net=bridge -p $PORT:5000"
fi
for var in MYTVSUPER_TOKEN HAMI_SESSION_ID HAMI_SERIAL_NO HAMI_SESSION_IP HTTP_PROXY HTTPS_PROXY; do
local value=$(eval echo \$$var)
[ -n "$value" ] && docker_command+=" -e $var=$value"
done
docker_command+=" $IMAGE_SOURCE"
echo -e "${CYAN}正在启动 Pixman 容器...${RESET}"
eval "$docker_command"
echo -e "${GREEN}Pixman 容器已成功启动!${RESET}"
if check_internet_connection; then
install_watchtower "pixman"
else
echo "---------------------------------------------------------"
fi
live_Pixman "$PORT"
}
# 生成 Pixman 订阅
live_Pixman() {
local public_ip=$(get_public_ip)
local port="$1"
echo "◆ 订阅地址:"
echo "■ 四季線上 4GTV : http://$public_ip:$port/4gtv.m3u (部分失效)"
echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u (需填写会员参数)"
echo "■ Hami Video : http://$public_ip:$port/hami.m3u (需填写会员参数)"
echo "---------------------------------------------------------"
echo "--- Pixman 详细使用说明: https://pixman.io/topics/17 ---"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
echo "---------------------------------------------------------"
read -p "按 回车键 返回 主菜单 ..."
}
# 卸载 Pixman 项目
uninstall_Pixman() {
echo "是否确定要卸载 Pixman 项目?[y/n](默认:n)"
read -r -t 10 input
input=${input:-n}
if [[ "$input" =~ ^[Yy]$ ]]; then
echo -e "${CYAN}正在卸载 Pixman 项目...${RESET}"
docker stop pixman > /dev/null 2>&1
docker rm -f pixman > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'pixman/pixman' | xargs -r docker rmi > /dev/null 2>&1
uninstall_watchtower "pixman"
echo -e "${RED}Pixman 项目 已成功卸载。${RESET}"
else
echo -e "${GREEN}取消卸载操作。${RESET}"
fi
}
############# Fourgtv #############
# 安装 Fourgtv
install_Fourgtv() {
local public_ip
local ENV_VARS
local public_ip=$(get_public_ip)
local port=$(check_and_allocate_port 8000)
IMAGE_SOURCE="ru2025/fourgtv:latest"
PROXY_IMAGE_SOURCE="$REVERSE_PROXY/ru2025/fourgtv:latest"
echo "正在安装 Fourgtv 项目 作者: @刘墉..."
if docker ps -a --format '{{.Names}}' | grep -q "^fourgtv$"; then
echo -e "${CYAN}检测到已存在的 Fourgtv 容器,将进行重新安装...${RESET}"
ENV_VARS=$(docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' fourgtv)
NOWSESSIONID=$(echo "$ENV_VARS" | grep -oP 'NOWSESSIONID=\K.*')
NOWUSERAGENT=$(echo "$ENV_VARS" | grep -oP 'NOWUSERAGENT=\K.*')
MYTVSUPER_TOKEN=$(echo "$ENV_VARS" | grep -oP 'MYTVSUPER_TOKEN=\K.*')
echo -e "当前 ${GREEN}Fourgtv${RESET} 配置参数:"
[ -n "$NOWSESSIONID" ] && echo "NOWSESSIONID: $NOWSESSIONID" || echo "NOWSESSIONID: 未设置"
[ -n "$NOWUSERAGENT" ] && echo "NOWUSERAGENT: $NOWUSERAGENT" || echo "NOWUSERAGENT: 未设置"
[ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN" || echo "MYTVSUPER_TOKEN: 未设置"
docker stop fourgtv > /dev/null 2>&1
docker rm -f fourgtv > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ru2025/fourgtv:latest' | xargs -r docker rmi > /dev/null 2>&1
fi
pull_image "$IMAGE_SOURCE" "$PROXY_IMAGE_SOURCE"
echo "请输入 Fourgtv 配置参数:"
echo "当前 Fourgtv 使用的端口是 $port,是否需要修改?[y/n](默认:n)"
read -r -t 10 input_port
input_port=${input_port:-n}
if [[ "$input_port" =~ ^[Yy]$ ]]; then
read -rp "请输入新的端口号: " port
fi
echo "是否需要修改其他环境变量?[y/n](默认:n)"
read -r -t 10 input_vars
input_vars=${input_vars:-n}
if [[ "$input_vars" =~ ^[Yy]$ ]]; then
read -rp "请输入 NOWSESSIONID: " NOWSESSIONID
read -rp "请输入 NOWUSERAGENT: " NOWUSERAGENT
read -rp "请输入 MYTVSUPER_TOKEN: " MYTVSUPER_TOKEN
fi
echo "请选择 Fourgtv 部署方式(默认: 2):"
echo "1) 使用 host 网络模式 (建议:软路由)"
echo "2) 使用 bridge 网络模式 (建议:VPS)"
read -rp "输入选项 (1 或 2): " option_fourgtv
option_fourgtv=${option_fourgtv:-2}
case $option_fourgtv in
1|host)
echo "正在使用 host 网络模式安装 Fourgtv..."
docker run -d --restart always --net=host -p $port:8000 --name fourgtv \
${NOWSESSIONID:+-e NOWSESSIONID=$NOWSESSIONID} \
${NOWUSERAGENT:+-e NOWUSERAGENT=$NOWUSERAGENT} \
${MYTVSUPER_TOKEN:+-e MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN} \
$IMAGE_SOURCE
;;
2|bridge)
echo "正在使用 bridge 网络模式安装 Fourgtv..."
docker run -d --restart always --net=bridge -p $port:8000 --name fourgtv \
${NOWSESSIONID:+-e NOWSESSIONID=$NOWSESSIONID} \
${NOWUSERAGENT:+-e NOWUSERAGENT=$NOWUSERAGENT} \
${MYTVSUPER_TOKEN:+-e MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN} \
$IMAGE_SOURCE
;;
esac
echo -e "${GREEN}Fourgtv 安装完成。${RESET}"
if check_internet_connection; then
install_watchtower "fourgtv"
else
echo "---------------------------------------------------------"
fi
live_Fourgtv "$public_ip" "$port"
}
# 生成 Fourgtv 订阅
live_Fourgtv() {
local public_ip="$1"
local port="$2"
echo "◆ 订阅地址:"
echo "■ iTV : http://$public_ip:$port/itv.m3u (需消耗服务器流量)"
echo "■ Beesport : http://$public_ip:$port/beesport.m3u (部分地区可直连)"
echo "■ 4GTV : http://$public_ip:$port/4gtv.m3u (部分节目需要解锁台湾IP)"
echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u(需填写会员参数)"
echo "■ Now : http://$public_ip:$port/now.m3u (收费频道,需填写会员参数、原生IP)"
echo "■ Now : http://$public_ip:$port/now-free.m3u (免费频道,需填写会员参数、原生IP)"
echo "■ YouTube : http://$public_ip:$port/youtube/{房间号} (支持列表 list/{列表号} )"
echo "---------------------------------------------------------"
echo "--- Fourgtv 详细使用说明: https://t.me/livednowgroup ---"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
echo "---------------------------------------------------------"
read -p "按 回车键 返回 主菜单 ..."
}
# 卸载 Fourgtv
uninstall_Fourgtv() {
echo "是否确定要卸载 Fourgtv 项目?[y/n](默认:n)"
read -r -t 10 input
input=${input:-n}
if [[ "$input" =~ ^[Yy]$ ]]; then
echo -e "${CYAN}正在卸载 Fourgtv 项目...${RESET}"
docker stop fourgtv > /dev/null 2>&1
docker rm -f fourgtv > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ru2025/fourgtv:latest' | xargs -r docker rmi > /dev/null 2>&1
uninstall_watchtower "fourgtv"
echo -e "${RED}Fourgtv 项目 已成功卸载。${RESET}"
else
echo -e "${GREEN}取消卸载操作。${RESET}"
fi
}
############# Doubebly #############
# 安装 Doubebly
install_Doubebly() {
local public_ip=$(get_public_ip)
local port_ofiii=$(check_and_allocate_port 50002)
echo -e "${YELLOW}==================================================${RESET}"
echo -e "${YELLOW}提示:如果你使用的是软路由,请移步 Telegram 查看安装教程${RESET}"
echo -e "${CYAN}👉 https://t.me/doubebly003${RESET}"
echo -e "${YELLOW}==================================================${RESET}"
read -rp "是否继续安装 Doubebly?[y/n](默认:n) " confirm_install
confirm_install=${confirm_install:-n}
if [[ ! "$confirm_install" =~ ^[Yy]$ ]]; then
echo -e "${RED}安装已取消。${RESET}"
return
fi
echo "请输入订阅使用的 Token(默认: Doubebly):"
read -rp "Token: " my_token
my_token=${my_token:-Doubebly}
echo "请输入 DNS 解锁 IP(例如 Alice 提供的):"
read -rp "DNS IP(默认: 8.8.8.8): " custom_dns
custom_dns=${custom_dns:-8.8.8.8}
if docker ps -a --format '{{.Names}}' | grep -q "^doube-ofiii$"; then
echo -e "${CYAN}检测到已存在的 doube-ofiii 容器,正在重新部署...${RESET}"
docker stop doube-ofiii >/dev/null 2>&1
docker rm doube-ofiii >/dev/null 2>&1
fi
docker pull doubebly/doube-ofiii:1.1.3
docker run -d --name=doube-ofiii \
-p ${port_ofiii}:5000 \
-e MY_OFIII_TOKEN="${my_token}" \
--restart=always \
--dns=${custom_dns} \
doubebly/doube-ofiii:1.1.3
echo -e "${GREEN}doube-ofiii 安装完成。${RESET}"
if check_internet_connection; then
install_watchtower "doube-ofiii"
else
echo "---------------------------------------------------------"
fi
echo "◆ 订阅地址:"
echo "◆ 直播TXT订阅地址: http://${public_ip}:${port_ofiii}/Sub.txt"
echo "◆ 直播M3U订阅地址: http://${public_ip}:${port_ofiii}/Sub.m3u"
echo "◆ 点播M3U订阅地址: http://${public_ip}:${port_ofiii}/Sub.vod.m3u?pids=ofiii75"
echo
echo "📌 加参数方式示例:"
echo "▶ http://${public_ip}:${port_ofiii}/Sub.m3u?token=${my_token}&sd=720&proxy=true"
echo "▶ http://${public_ip}:${port_ofiii}/Sub.vod.m3u?token=${my_token}&sd=720&proxy=true&pids=ofiii75,ofiii76"
echo "---------------------------------------------------------"
echo "--- Doubebly 详细使用说明: https://t.me/doubebly003 ----"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
echo "---------------------------------------------------------"
read -p "按 回车键 返回主菜单 ..."
}
# 卸载 Doubebly
uninstall_Doubebly() {
echo "是否卸载 doube-ofiii 容器?"
echo "1) 卸载 doube-ofiii"
echo "2) 取消操作"
read -rp "输入选项 (1 或 2): " option
option=${option:-1}
if [[ "$option" != "1" ]]; then
echo "已取消卸载操作。"
return
fi
if docker ps -a --format '{{.Names}}' | grep -q "^doube-ofiii$"; then
echo -e "${CYAN}正在卸载 doube-ofiii...${RESET}"
docker stop doube-ofiii > /dev/null 2>&1
docker rm -f doube-ofiii > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'doubebly/doube-ofiii' | xargs -r docker rmi > /dev/null 2>&1
uninstall_watchtower "doube-ofiii"
echo -e "${RED}doube-ofiii 已成功卸载。${RESET}"
else
echo -e "${YELLOW}未找到 doube-ofiii 容器,跳过卸载操作。${RESET}"
fi
}
############# watchtower #############
#一键 watchtower 更新
update_watchtower() {
echo "===== 目前运行中的容器 ====="
local running_containers=$(docker ps --format "{{.Names}}")
if [ -n "$running_containers" ]; then
echo "可选容器列表:"
local index=1
all_container_map=()
while IFS= read -r container; do
all_container_map[$index]=$container
echo "$index. $container"
((index++))
done <<< "$running_containers"
echo ""
echo "容器总数: $((index-1))"
read -p "请选择要更新的容器编号: " container_choice
if [[ $container_choice -ge 1 && $container_choice -lt $index ]]; then
local selected_container=${all_container_map[$container_choice]}
echo -e "${CYAN}正在检测容器: $selected_container${RESET}"
local watchtower_output
watchtower_output=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower "$selected_container" --run-once -c 2>&1)
local failed scanned updated
if [[ $watchtower_output =~ Failed=([0-9]+) ]]; then
failed="${BASH_REMATCH[1]}"
fi
if [[ $watchtower_output =~ Scanned=([0-9]+) ]]; then
scanned="${BASH_REMATCH[1]}"
fi
if [[ $watchtower_output =~ Updated=([0-9]+) ]]; then
updated="${BASH_REMATCH[1]}"
fi
if [[ $failed -eq 1 && $scanned -eq 1 && $updated -eq 0 ]]; then
echo -e "${RED}检测失败。${RESET}"
elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 0 ]]; then
echo -e "${YELLOW}无需更新。${RESET}"
elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 1 ]]; then
echo -e "${GREEN}更新成功!${RESET}"
else
echo "未知的检测结果。"
fi
else
echo "无效的选择。"
fi
else
echo "没有运行中的容器。"
fi
}
# 管理 Watchtower 监控容器
manage_watchtower() {
declare -A all_container_map
declare -A container_map
show_monitored_containers() {
existing_args=$(docker inspect --format '{{.Args}}' watchtower)
monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*")
echo "===== Watchtower 当前监控的容器 ====="
if [ -n "$monitored_containers" ]; then
echo "监控的容器列表:"
local index=1
container_map=()
for container in $monitored_containers; do
container_map[$index]=$container
if docker ps --format "{{.Names}}" | grep -q "^$container$"; then
echo -e "$index. $container (运行中)"
else
echo -e "$index. $container (未运行)"
fi
((index++))
done
echo ""
echo "容器总数: $((index-1))"
else
echo "当前没有监控任何容器。"
return 1
fi
}
show_all_containers() {
echo "===== 目前运行中的容器 ====="
local running_containers=$(docker ps --format "{{.Names}}" | grep -v "^watchtower$")
if [ -n "$running_containers" ]; then
echo "可选容器列表:"
local index=1
all_container_map=()
while IFS= read -r container; do
all_container_map[$index]=$container
echo "$index. $container"
((index++))
done <<< "$running_containers"
echo ""
echo "容器总数: $((index-1))"
return 0
else
echo "当前没有运行中的容器。"
return 1
fi
}
echo "Watchtower - 自动更新 Docker 镜像与容器"
echo -e "请选择操作类型:"
echo "1. 添加监控容器"
echo "2. 删除监控容器"
read -rp "请输入选项 [1/2]:" action
case "$action" in
1) # 添加容器
if show_all_containers; then
read -rp "请输入要添加到监控的容器编号:" number
if [[ $number =~ ^[0-9]+$ ]] && [ -n "${all_container_map[$number]}" ]; then
name=${all_container_map[$number]}
install_watchtower "$name"
else
echo "编号无效,请重试。"
fi
fi
;;
2) # 删除容器
if show_monitored_containers; then
read -rp "请输入要删除的监控容器编号:" number
if [[ $number =~ ^[0-9]+$ ]] && [ -n "${container_map[$number]}" ]; then
name=${container_map[$number]}
uninstall_watchtower "$name"
else
echo "编号无效,请重试。"
fi
fi
;;
*)
echo "无效选项,请选择 1 或 2。"
;;
esac
}
# 增加 watchtower 监控
install_watchtower() {
local name="$1"
if [ -z "$name" ]; then
echo -e "${RED}错误: 未指定要监控的容器名称${RESET}"
return 1
fi
local monitored_containers=""
if docker ps -q -f name=watchtower > /dev/null 2>&1; then
existing_args=$(docker inspect --format '{{.Args}}' watchtower)
monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*")
if echo "$monitored_containers" | grep -qw "$name"; then
echo "---------------------------------------------------------"
echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}"
echo "---------------------------------------------------------"
return 0
fi
monitored_containers="${monitored_containers:+$monitored_containers }$name"
docker stop watchtower > /dev/null 2>&1
docker rm watchtower > /dev/null 2>&1
else
monitored_containers="$name"
fi
echo "正在安装或配置 Watchtower 并监控 $name 镜像更新..."
IMAGE_SOURCE="containrrr/watchtower"
PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower"
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}"
return 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then
echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}"
return 1
fi
echo "---------------------------------------------------------"
echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}"
echo "---------------------------------------------------------"
return 0
}
# 删除 Watchtower 监控
uninstall_watchtower() {
local name="$1"
if docker ps -q -f name=watchtower > /dev/null 2>&1; then
existing_args=$(docker inspect --format '{{.Args}}' watchtower)
monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*")
if echo "$monitored_containers" | grep -qw "$name"; then
# 移除指定容器名称
monitored_containers=$(echo "$monitored_containers" | sed "s/\b$name\b//g" | xargs)
if [ -z "$monitored_containers" ]; then
echo "没有其他监控的容器,正在停止并删除 Watchtower..."
docker stop watchtower > /dev/null 2>&1
docker rm watchtower > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'containrrr/watchtower' | xargs -r docker rmi > /dev/null 2>&1
echo "Watchtower 已成功卸载。"
else
docker stop watchtower > /dev/null 2>&1
docker rm watchtower > /dev/null 2>&1
IMAGE_SOURCE="containrrr/watchtower"
PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower"
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}"
return 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then
echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}"
return 1
fi
echo -e "${GREEN}$name${RESET} 容器已从监控中删除。"
fi
else
echo "容器 $name 未被 Watchtower 监控。"
fi
else
echo "Watchtower 当前未安装。"
fi
}
############# 3X-UI #############
# 安装 3X-UI
install_3x_ui() {
local public_ip=$(get_public_ip)
echo "请选择部署方式:"
echo "1) 使用 host 网络模式 (添加节点方便)"
echo "2) 使用 bridge 网络模式 (添加节点,需映射端口)"
echo "3) 使用 sh 脚本 直接安装 (推荐)"
read -rp "输入选项 (1-3): " option
case $option in
1)
echo "正在使用 host 网络模式安装 3X-UI 面板..."
docker run -d \
-e XRAY_VMESS_AEAD_FORCED=false \
-v "$PWD/db/:/etc/x-ui/" \
-v "$PWD/cert/:/root/cert/" \
--network=host \
--restart=unless-stopped \
--name 3x-ui \
ghcr.io/mhsanaei/3x-ui:latest
echo -e "${GREEN}3X-UI 安装完成。${RESET}"
echo "访问信息:"
echo "URL: http://$public_ip:2053"
;;
2)
echo "正在使用 bridge 网络模式安装 3X-UI 面板..."
local default_port=17878
read -rp "请输入要映射的端口 (默认: $default_port): " port
port=${port:-$default_port}
if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1024 ] || [ "$port" -gt 65535 ]; then
echo "无效端口。请使用 1024 到 65535 之间的数字。"
return 1
fi
local node_port1=$(generate_random_port)
local node_port2=$(generate_random_port)
local node_port3=$(generate_random_port)
docker run -d \
-e XRAY_VMESS_AEAD_FORCED=false \
-p $port:2053 \
-p $node_port1:$node_port1 \
-p $node_port2:$node_port2 \
-v "$PWD/db/:/etc/x-ui/" \
-v "$PWD/cert/:/root/cert/" \
--restart=unless-stopped \
--name 3x-ui \
ghcr.io/mhsanaei/3x-ui:latest
echo -e "${GREEN}3X-UI 安装完成。${RESET}"
echo "访问信息:"
echo "URL: http://$public_ip:$port"
echo "随机生成两个节点端口,后续自行添加。"
echo "节点端口: $node_port1"
echo "节点端口: $node_port2"
echo "节点端口: $node_port3"
;;
3)
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
echo -e "${GREEN}3X-UI 安装完成。${RESET}"
echo "访问信息:"
echo "输入 x-ui 进行修改设置"
echo "URL: http://$public_ip:2053"
;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
echo "------------------"
echo "默认用户名: admin"
echo "默认密码: admin"
echo "------------------"
echo "请立即更改默认密码!"
echo "------------------"
echo "GIthub: https://github.com/MHSanaei/3x-ui"
echo "------------------"
read -p "按 回车键 返回 主菜单 ..."
}
# 更新 3X-UI
update_3x_ui() {
echo "正在更新 3X-UI 面板至最新版本..."
if docker ps -a | grep -q 3x-ui; then
docker stop 3x-ui > /dev/null 2>&1
docker rm 3x-ui > /dev/null 2>&1
install_3x_ui
echo "3X-UI 面板已更新至最新版本。"
else
echo "错误:未找到 3x-ui 容器。请先安装 3X-UI。"
return 1
fi
}
# 卸载 3X-UI
uninstall_3x_ui() {
read -p "您确定要卸载 3X-UI 面板吗?[y/n](默认:n)" confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "卸载操作已取消。"
return
fi
docker stop 3x-ui > /dev/null 2>&1
docker rm 3x-ui > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'mhsanaei/3x-ui' | xargs -r docker rmi > /dev/null 2>&1
[ -d "$PWD/db" ] && rm -rf "$PWD/db"
echo -e "${GREEN}3X-UI 卸载完成。${RESET}"
}
############# o11 #############
# 安装 o11
install_o11() {
if docker ps -a --format '{{.Names}}' | grep -q 'o11'; then
echo -e "${RED}o11 已经安装,请先卸载再重新安装。${RESET}"
return 1
fi
ARCH=$(uname -m)
if [[ "$ARCH" != "arm"* && "$ARCH" != "aarch64" ]]; then
echo "系统架构: $ARCH,支持安装 o11。"
echo "正在安装 o11 面板..."
local port=$(check_and_allocate_port 1234)
local public_ip=$(get_public_ip)
docker run -d --restart=always -p $port:1234 --name o11 wechatofficial/o11:latest
echo -e "${GREEN}o11 安装完成。${RESET}"
echo "访问信息:"
echo "URL: http://$public_ip:$port"
echo "小白教程: https://pixman.io/topics/118"
echo "请根据 o11 的文档进行配置和管理。"
read -p "按 回车键 返回 主菜单 ..."
else
echo "不支持的系统架构: $ARCH,o11 安装失败..."
return
fi
}
# 卸载 o11
uninstall_o11() {
local public_ip=$(get_public_ip)
read -p "您确定要卸载 o11 面板吗?[y/n](默认:n)" confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "卸载操作已取消。"
return
fi
docker stop o11 > /dev/null 2>&1
docker rm o11 > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'wechatofficial/o11' | xargs -r docker rmi > /dev/null 2>&1
echo -e "${GREEN}o11 卸载完成。${RESET}"
}
############# 1Panel #############
# 安装 1Panel
install_1panel() {
echo "正在安装 1Panel 面板..."
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
echo "GIthub: https://github.com/1Panel-dev/1Panel"
echo -e "${GREEN}1Panel 安装完成。${RESET}"
}
# 设置 1Panel
set_1panel() {
1pctl user-info
1pctl update password
}
# 卸载 1Panel
uninstall_1panel() {
read -p "您确定要卸载 1Panel 吗?[y/n](默认:n)" confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "卸载操作已取消。"
return
fi
if command -v 1pctl > /dev/null 2>&1; then
1pctl uninstall
fi
echo -e "${GREEN}1Panel 卸载完成。${RESET}"
}
############# Sub Store #############
# 安装 Sub Store
install_sub_store() {
local public_ip=$(get_public_ip)
if docker ps -a --format '{{.Names}}' | grep -q 'sub-store'; then
echo -e "${RED}Sub Store 已经安装,请先卸载再重新安装。${RESET}"
return 1
fi
echo "Sub Store 节点订阅管理工具,是否决定安装? (y/n)"
read -r confirmation
if [[ ! "$confirmation" =~ ^[Yy]$ ]]; then
echo "安装已取消。"
return 0
fi
echo "开始安装 Sub Store..."
local IMAGE_SOURCE="xream/sub-store"
local PROXY_IMAGE_SOURCE="$REVERSE_PROXY/xream/sub-store"
local frontend_backend_key=$(openssl rand -base64 15 | tr -dc 'a-zA-Z0-9' | head -c 20)
echo "拉取 Sub Store 镜像中..."
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 Sub Store 失败,请检查反向代理或网络连接。${RESET}"
exit 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
echo "正在启动 Sub Store 容器..."
if ! docker run -d --restart=always -e "SUB_STORE_CRON=50 23 * * *" -e "SUB_STORE_FRONTEND_BACKEND_PATH=/$frontend_backend_key" -p 3001:3001 -v /etc/sub-store:/opt/app/data --name sub-store "$IMAGE_SOURCE"; then
echo "错误: 容器启动失败" >&2
return 1
fi
echo "Sub Store 安装成功!"
echo "访问地址: http://${public_ip}:3001?api=http://${public_ip}:3001/$frontend_backend_key"
}
# 卸载 Sub Store
uninstall_sub_store() {
read -p "是否卸载 Sub Store?[y/n](默认:n)" confirm
if [[ $confirm == "y" || $confirm == "Y" ]]; then
echo "正在卸载 Sub Store..."
docker stop sub-store > /dev/null 2>&1
docker rm -f sub-store > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'xream/sub-store' | xargs -r docker rmi > /dev/null 2>&1
echo -e "${RED}Sub Store 卸载完成。${RESET}"
else
echo -e "${GREEN}取消卸载操作。${RESET}"
fi
}
############# LibreTV #############
install_libretv() {
local public_ip=$(get_public_ip)
if docker ps -a --format '{{.Names}}' | grep -q 'libretv'; then
echo -e "${RED}LibreTV 已经安装,请先卸载再重新安装。${RESET}"
return 1
fi
echo "LibreTV 视频搜索引擎,是否决定安装? (y/n)"
read -r confirmation
if [[ ! "$confirmation" =~ ^[Yy]$ ]]; then
echo "安装已取消。"
return 0
fi
echo "请输入访问密码(可留空,默认无密码):"
read -r password
echo "开始安装 LibreTV..."
local IMAGE_SOURCE="bestzwei/libretv:latest"
local PROXY_IMAGE_SOURCE="$REVERSE_PROXY/bestzwei/libretv:latest"
echo "拉取 LibreTV 镜像中..."
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 LibreTV 失败,请检查反向代理或网络连接。${RESET}"
return 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
echo "正在启动 LibreTV 容器..."
if ! docker run -d --name libretv --restart=always -p 8899:80 -e PASSWORD="${password}" "$IMAGE_SOURCE"; then
echo "错误: 容器启动失败" >&2
return 1
fi
echo "---------------------------------------------------------"
echo "LibreTV 安装成功!"
echo "访问地址: http://${public_ip}:8899"
if [[ -n "$password" ]]; then
echo "登录密码: ${password}"
else
echo "当前无访问密码保护。"
fi
echo "---------------------------------------------------------"
echo " LibreTV 详细使用说明: https://github.com/LibreSpark/LibreTV"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
echo "---------------------------------------------------------"
}
uninstall_libretv() {
read -p "是否卸载 LibreTV?[y/n](默认:n)" confirm
if [[ $confirm == "y" || $confirm == "Y" ]]; then
echo "正在卸载 LibreTV..."
docker stop libretv > /dev/null 2>&1
docker rm -f libretv > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'bestzwei/libretv' | xargs -r docker rmi > /dev/null 2>&1
echo -e "${RED}LibreTV 卸载完成。${RESET}"
else
echo -e "${GREEN}取消卸载操作。${RESET}"
fi
}
############# sing-box #############
# 一键搭建节点
install_233boy() {
echo "欢迎使用一键搭建节点脚本!"
echo "此脚本将从 233boy 仓库安装 sing-box,请确保您信任此来源。"
read -p "继续安装?(y/n): " confirm
if [[ $confirm == "y" || $confirm == "Y" ]]; then
echo "正在下载并运行安装脚本..."
bash <(wget -qO- https://github.com/233boy/sing-box/raw/main/install.sh)
else
echo "安装已取消。"
fi
}
############# Alice 解锁 #############
# 一键搭建 Alice DNS解锁
install_Jimmy() {
echo "欢迎使用一键 Alice DNS解锁 脚本!"
echo "此脚本将从 Jimmyzxk 仓库安装 Alice 解锁,请确保您信任此来源。"
read -p "继续安装?(y/n): " confirm
if [[ $confirm == "y" || $confirm == "Y" ]]; then
echo "正在下载并运行安装脚本..."
wget https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dns-unlock.sh && bash dns-unlock.sh
echo "详细使用说明: https://www.nodeseek.com/post-202393-1"
else
echo "安装已取消。"
fi
}
############# 辅助函数 #############
# 拉取镜像
pull_image() {
local image=$1
local proxy_image=$2
if ! docker pull "$image" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$proxy_image" > /dev/null 2>&1; then
echo -e "${RED}安装失败,请检查反向代理或网络连接。${RESET}"
exit 1
fi
docker tag "$proxy_image" "$image"
docker rmi "$proxy_image"
fi
}
# 检查 访问境外 是否受限
check_internet_connection() {
if curl -s --connect-timeout 5 --max-time 10 --retry 2 google.com > /dev/null 2>&1; then
return 0 # 无受限
else
return 1 # 受限
fi
}
# 获取公网 IP / 失败返回 {路由IP}
get_public_ip() {
# IPv4
ip=$(curl -s --max-time 3 https://ipv4.icanhazip.com | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}')
if [[ -n "$ip" ]]; then
echo "$ip"
return 0
fi
# IPv6
ip=$(curl -s --max-time 3 https://ipv6.icanhazip.com | grep -oE '([0-9a-fA-F:]+:+)+[0-9a-fA-F]+')
if [[ -n "$ip" ]]; then
echo "$ip"
return 0
fi
echo "{路由IP}"
return 1
}
# 检查 IP 归属地
check_if_in_china() {
local ip="$1"
local response
response=$(curl -s --max-time 3 "http://ip-api.com/json/$ip")
if echo "$response" | grep -qiE '"country"[[:space:]]*:[[:space:]]*"?(CN|China)"?|中国'; then
return 0
fi
return 1
}
# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
echo -e "${CYAN}Docker 未安装,正在进行安装...${RESET}"
install_docker
else
echo -e "${GREEN}Docker 已安装。${RESET}"
fi
}
# 选择 Docker 版本
install_docker() {
OS=$(lsb_release -is 2>/dev/null || cat /etc/os-release | grep '^ID=' | cut -d= -f2 | tr -d '"')
ARCH=$(uname -m)
case "$OS" in
Ubuntu)
echo "检测到系统为 Ubuntu,正在安装 Docker..."
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
;;
Debian|Armbian)
echo "检测到系统为 Debian 或 Armbian,正在安装 Docker..."
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
;;
centos|rhel|fedora)
echo "检测到系统为 CentOS,正在安装 Docker..."
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
;;
openwrt|lede)
echo "检测到系统为 OpenWRT/LEDE,正在安装 Docker..."
opkg update
opkg install dockerd docker-compose luci-app-dockerman
/etc/init.d/dockerd start
/etc/init.d/dockerd enable
;;
*)
echo "不支持的操作系统: $OS"
exit 1
;;
esac
# 如果不是 OpenWRT/LEDE,则启动和启用 Docker
if [[ "$OS" != "openwrt" && "$OS" != "lede" ]]; then
sudo systemctl start docker
sudo systemctl enable docker
fi
echo -e "${GREEN}Docker 安装完成。${RESET}"
}
# 检查 jq 工具 是否安装
check_and_install_jq() {
if ! command -v jq &> /dev/null; then
echo "jq 工具未安装,正在安装..."
if check_if_in_china; then
INSTALL_CMD="sudo apt-get update && sudo apt-get install -y jq --allow-releaseinfo-change"
elif command -v apt-get &> /dev/null; then
INSTALL_CMD="sudo apt-get update && sudo apt-get install -y jq"
elif command -v yum &> /dev/null; then
INSTALL_CMD="sudo yum install -y jq"
elif command -v apk &> /dev/null; then
INSTALL_CMD="sudo apk add --no-cache jq"
elif command -v opkg &> /dev/null; then # OpenWrt, Entware 环境
INSTALL_CMD="opkg update && opkg install jq"
else
echo "无法识别该系统的包管理器,jq 安装失败。"
return 1 # 无法识别包管理器,安装失败
fi
if ! eval "$INSTALL_CMD"; then
echo "安装 jq 失败,请检查系统配置,将影响 参数 功能。"
return 1 # 安装失败
fi
else
return 0 # jq 已安装
fi
}
# 检查 grep 工具 是否安装
check_and_install_grep() {
if ! command -v grep &> /dev/null; then
echo "grep 工具未安装,正在安装..."
if check_if_in_china; then
INSTALL_CMD="apt-get update && sudo apt-get install -y grep --allow-releaseinfo-change"
elif command -v apt-get &> /dev/null; then
INSTALL_CMD="sudo apt-get update && sudo apt-get install -y grep"
elif command -v yum &> /dev/null; then
INSTALL_CMD="sudo yum install -y grep"
elif command -v apk &> /dev/null; then
INSTALL_CMD="sudo apk add --no-cache grep"
elif command -v opkg &> /dev/null; then # OpenWrt, Entware 环境
INSTALL_CMD="opkg update && opkg install grep"
else
echo "安装 grep 失败,请检查系统配置,将影响 Watchtower 功能。"
return 1 # 安装失败
fi
# 执行安装命令
if ! eval "$INSTALL_CMD"; then
echo "安装 grep 失败,请检查系统配置,将影响 Watchtower 功能。"
return 1 # 安装失败
fi
else
return 0 # grep 已安装
fi
}
# 设置反向代理参数
proxy() {
source "$CONFIG_FILE"
read -p "请输入反向代理地址 (当前值: ${REVERSE_PROXY:-未设置}, 输入null清空): " input_reverse_proxy
if [ -n "$input_reverse_proxy" ]; then
[ "$input_reverse_proxy" = "null" ] && REVERSE_PROXY="" || REVERSE_PROXY="$input_reverse_proxy"
fi
echo "反向代理地址已更新为: ${REVERSE_PROXY:-<空>}"
echo "REVERSE_PROXY=${REVERSE_PROXY:-}" > "$CONFIG_FILE"
}
# 清理 Docker 工具
cleanup_docker() {
echo -e "\n${YELLOW}┌─────────────────── Docker 完全清理 ───────────────────┐${RESET}"
echo -e "${YELLOW}│${RESET} 此操作将执行: ${YELLOW}│${RESET}"
echo -e "${YELLOW}│${RESET} • 删除所有已停止的容器 ${YELLOW}│${RESET}"
echo -e "${YELLOW}│${RESET} • 删除所有未使用的镜像和构建缓存 ${YELLOW}│${RESET}"
echo -e "${YELLOW}│${RESET} • 删除所有未使用的卷和网络 ${YELLOW}│${RESET}"
echo -e "${YELLOW}│${RESET} • 清空所有容器的日志文件 ${YELLOW}│${RESET}"
echo -e "${YELLOW}└───────────────────────────────────────────────────────┘${RESET}"
echo -e "\n${RED}⚠️ 警告:此操作将删除大量数据,且无法恢复!${RESET}"
read -p "$(echo -e "${CYAN}确认执行完全清理? (y/n,默认n): ${RESET}")" confirm
confirm=${confirm:-n}
if [[ "$confirm" != "y" ]]; then
echo -e "\n${YELLOW}清理操作已取消${RESET}"
read -p "$(echo -e "${CYAN}按回车键返回主菜单...${RESET}")"
return
fi
# 统计数据
container_count=0
cleaned_logs=0
total_freed=0
# 第1步:清理容器日志
echo -e "\n${YELLOW}[1/2] 正在清理容器日志...${RESET}"
for container_id in $(docker ps -aq); do
container_count=$((container_count+1))
container_name=$(docker inspect --format '{{.Name}}' $container_id | sed 's/\///')
log_path=$(docker inspect --format='{{.LogPath}}' $container_id)
if [ -f "$log_path" ]; then
log_size=$(du -b "$log_path" | awk '{print $1}')
total_freed=$((total_freed + log_size))
if [ $log_size -ge 1073741824 ]; then
log_size_h=$(echo "scale=2; $log_size/1073741824" | bc)
log_size_h="${log_size_h} GB"
elif [ $log_size -ge 1048576 ]; then
log_size_h=$(echo "scale=2; $log_size/1048576" | bc)
log_size_h="${log_size_h} MB"
elif [ $log_size -ge 1024 ]; then
log_size_h=$(echo "scale=2; $log_size/1024" | bc)
log_size_h="${log_size_h} KB"
else
log_size_h="${log_size} bytes"
fi
echo -e "${GREEN}✓${RESET} 清理容器 ${CYAN}${container_name}${RESET} 日志 (${log_size_h})"
echo "" > "$log_path"
cleaned_logs=$((cleaned_logs+1))
fi
done
if [ $total_freed -ge 1073741824 ]; then
total_freed_h=$(echo "scale=2; $total_freed/1073741824" | bc)
total_freed_h="${total_freed_h} GB"
elif [ $total_freed -ge 1048576 ]; then
total_freed_h=$(echo "scale=2; $total_freed/1048576" | bc)
total_freed_h="${total_freed_h} MB"
elif [ $total_freed -ge 1024 ]; then
total_freed_h=$(echo "scale=2; $total_freed/1024" | bc)
total_freed_h="${total_freed_h} KB"
else
total_freed_h="${total_freed} bytes"
fi
# 第2步:执行Docker系统清理
echo -e "\n${YELLOW}[2/2] 正在执行Docker系统清理...${RESET}"
docker_prune_output=$(docker system prune -a --volumes -f)
# 总结结果
echo -e "\n${GREEN}══════════════ 清理完成 ══════════════${RESET}"
echo -e "${GREEN}• 检查了 ${container_count} 个容器${RESET}"
echo -e "${GREEN}• 清理了 ${cleaned_logs} 个日志文件 (释放约 ${total_freed_h})${RESET}"
echo -e "${GREEN}• 执行了Docker系统完全清理${RESET}"
echo -e "${GREEN}══════════════════════════════════════${RESET}"
echo
read -p "$(echo -e "${CYAN}按回车键返回主菜单...${RESET}")"
}
# 生成随机端口
generate_random_port() {
local port
while :; do
port=$(shuf -i 10000-65535 -n 1)
if ! ss -tuln | grep -q ":$port "; then
echo "$port"
break
fi
done
}
# 检查端口
check_and_allocate_port() {
local port=$1
if ss -tuln | grep -q ":$port "; then
echo "端口 $port 已被占用,正在分配新的端口..."
port=$(generate_random_port)
fi
echo "$port"
}
# # 检查并更新 SH 脚本
download_NoobIPTV() {
REMOTE_VERSION=$(curl -s "https://yang-1989.eu.org/NoobIPTV_version.txt")
if [ $? -ne 0 ]; then
echo -e "${RED}无法检测版本,请检查网络连接。${RESET}"
return
fi
if [ -f "$SCRIPT_PATH" ]; then
LOCAL_VERSION=$(grep -oP '(?<=^# 最新版本:).*' "$SCRIPT_PATH")
else
LOCAL_VERSION=""
fi
if [ "$REMOTE_VERSION" != "$LOCAL_VERSION" ]; then
echo "${GREEN}正在下载最新版本的 NoobIPTV 脚本...${RESET}"
curl -o "$SCRIPT_PATH" "https://yang-1989.eu.org/NoobIPTV.sh"
chmod +x "$SCRIPT_PATH"
echo -e "${GREEN}最新 $REMOTE_VERSION 版本下载已完成。${RESET}"
fi
}
# 设置快捷键
setup_shortcut() {
local script_path="$HOME/NoobIPTV.sh"
echo "脚本路径: $script_path"
curl -sL https://yang-1989.eu.org/NoobIPTV.sh -o "$script_path"
chmod +x "$script_path"
local shell_rc="$HOME/.bashrc"
echo "配置文件: $shell_rc"
if [ -n "$shell_rc" ] && ! grep -q "alias y='bash $script_path'" "$shell_rc"; then
echo "alias y='bash $script_path'" >> "$shell_rc"
echo -e "${GREEN}已设置快捷键 'y'。${RESET}"
source "$shell_rc" 2>/dev/null || true
echo -e "${GREEN}快捷键已生效!现在可以使用 'y' 命令启动脚本。${RESET}"
fi
}
# 展示广告
show_NoobIPTV() {
echo -e "${CYAN}───────────────────────────────────────────────────────────────────────${RESET}
${RED} ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██╗██████╗ ████████╗██╗ ██╗${RESET}
${RED} ████╗ ██║██╔═══██╗██╔═══██╗██╔══██╗██║██╔══██╗╚══██╔══╝██║ ██║${RESET}
${RED} ██╔██╗ ██║██║ ██║██║ ██║██████╔╝██║██████╔╝ ██║ ██║ ██║${RESET}
${RED} ██║╚██╗██║██║ ██║██║ ██║██╔══██╗██║██╔═══╝ ██║ ╚██╗ ██╔╝${RESET}
${RED} ██║ ╚████║╚██████╔╝╚██████╔╝██████╔╝██║██║ ██║ ╚████╔╝ ${RESET}
${RED} ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ${RESET}
${GREEN} 欢迎关注我们的 ${YELLOW}Telegram ${GREEN}频道: ${CYAN}@Y_anGGGGGG${RESET}
${CYAN}───────────────────────────────────────────────────────────────────────${RESET}
${YELLOW} IPTV项目小白必备的搭建脚本和便捷工具箱,输入 ${GREEN}y${YELLOW} 快捷启动!${RESET}"
}
# 检查是否是第一次运行
check_first_run() {
local config_dir="$HOME/.config/NoobIPTV"
local first_run_flag="$config_dir/initialized"
if [ ! -d "$config_dir" ]; then
mkdir -p "$config_dir"
fi
if [ ! -f "$first_run_flag" ]; then
echo -e "${CYAN}首次运行,正在进行初始化设置...${RESET}"
[ ! -f "$CONFIG_FILE" ] && echo "REVERSE_PROXY=$REVERSE_PROXY" > "$CONFIG_FILE" # 设置配置文件
setup_shortcut # 设置快捷键
touch "$first_run_flag"
fi
}
# 脚本信息
script_log() {
show_NoobIPTV
echo "------------------------------------------------"
echo "项目名称:NoobIPTV"
echo "项目地址:https://github.com/YanG-1989"
echo "脚本日志: https://pixman.io/topics/142"
echo "作者: YanG-1989"
echo "当前版本号: $(grep -oP '(?<=^# 最新版本:).*' "$SCRIPT_PATH")"
echo "最后更新时间: 2024.5.15"
echo "1) 优化 Docker 管理助手 "
echo "2) 新增 LibreTV 快捷部署"
echo "3) 修复 Fourgtv 项目 作者: @刘墉 "
echo "4) 更新 Doubebly 项目 作者: @沐辰 "
echo "------------------------------------------------"
read -p "按 回车键 返回 主菜单 ..."
}
############# 主程序逻辑 #############
show_NoobIPTV
check_first_run # 检查是否是第一次运行
download_NoobIPTV # 检查并更新 SH 脚本
[ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE" # 加载配置文件中的参数
# 主循环
while true; do
show_menu
read -p "请选择操作: " choice
case "$choice" in
1) # 部署 pixman
while true; do
show_pixman_menu
read -p "请输入选项 (0-3): " pixman_choice
case "$pixman_choice" in
1) check_docker ; judge_Pixman ;;
2) uninstall_Pixman ;;
3) proxy ;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
done
;;
2) # 部署 Fourgtv
while true; do
show_fourgtv_menu
read -p "请输入选项 (0-3): " fourgtv_choice
case "$fourgtv_choice" in
1) check_docker ; install_Fourgtv ;;
2) uninstall_Fourgtv ;;
3) proxy ;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
done
;;
3) # 部署 Doubebly
while true; do
show_doubebly_menu
read -p "请输入选项 (0-3): " doubebly_choice
case "$doubebly_choice" in
1) check_docker ; install_Doubebly ;;
2) uninstall_Doubebly ;;
3) proxy ;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
done
;;
4) # 管理 Docker
while true; do
show_watchtower_menu
read -p "请输入选项 (0-4): " watchtower_choice
case "$watchtower_choice" in
1) # 手动 watchtower
if check_internet_connection; then
update_watchtower
else
echo -e "\n${RED}⚠️ 网络连接异常,无法执行更新操作${RESET}"
echo -e "${YELLOW}请检查网络连接后再尝试此功能${RESET}"
echo -e "按任意键继续..."
read -n 1
fi
;;
2) # 管理 watchtower
if check_internet_connection; then
manage_watchtower
else
echo -e "\n${RED}⚠️ 网络连接异常,无法执行管理操作${RESET}"
echo -e "${YELLOW}请检查网络连接后再尝试此功能${RESET}"
echo -e "按任意键继续..."
read -n 1
fi
;;
3) cleanup_docker ;; # 清理 Docker 垃圾
4) # 设置 Docker 全局日志大小
curl -L -s https://yang-1989.eu.org/docker.sh | sudo bash
echo -e "\n配置完成! 按任意键继续..."
read -n 1
;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-4。" ;;
esac
done
;;
5) # 工具箱
while true; do
show_toolbox_menu
read -p "请输入选项 (0-7): " toolbox_choice
case "$toolbox_choice" in
1) # 1Panel
while true; do
show_1panel_menu
read -p "请输入选项 (0-3): " panel_choice
case "$panel_choice" in
1) install_1panel ;;
2) uninstall_1panel ;;
3) set_1panel ;;
0) echo "返回上级菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
done
;;
2) # o11
while true; do
show_o11_menu
read -p "请输入选项 (0-2): " o_choice
case "$o_choice" in
1) check_docker ; install_o11 ;;
2) uninstall_o11 ;;
0) echo "返回上级菜单。" ; break ;;
*) echo "无效的选项,请输入 0-2。" ;;
esac
done
;;
3) # 3X-UI
while true; do
show_3x_ui_menu
read -p "请输入选项 (0-3): " ui_choice
case "$ui_choice" in
1) check_docker ; install_3x_ui ;;
2) update_3x_ui ;;
3) uninstall_3x_ui ;;
0) echo "返回上级菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
done
;;
4) # Sub Store
while true; do
show_subs_menu
read -p "请输入选项 (0-2): " Sub_choice
case "$Sub_choice" in
1) echo check_docker ; install_sub_store ;;
2) echo uninstall_sub_store ;;
0) echo "返回上级菜单。" ; break ;;
*) echo "无效的选项,请输入 0-2。" ;;
esac
done
;;
5) # LibreTV
while true; do
show_libretv_menu
read -p "请输入选项 (0-2): " LibreTV_choice
case "$LibreTV_choice" in
1) check_docker ; install_libretv ;;
2) echo uninstall_libretv ;;
0) echo "返回上级菜单。" ; break ;;
*) echo "无效的选项,请输入 0-2。" ;;
esac
done
;;
6) install_233boy ;; # sing-box
7) install_Jimmy ;; # Alice DNS
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-7。" ;;
esac
done
;;
6) script_log ;;
0) echo "退出脚本。" ; exit 0 ;;
*) echo "无效的选项,请输入 0-6。" ;;
esac
done
================================================
FILE: README.md
================================================
# 仓库简介
#### 个人爱好,收集整合!佛系更新…
* [Telegram 群「传送门」](https://t.me/Y_anGGGGGG)
>软件下载,资源集合,没其他东西 (后期可能会分享喜欢的东西)...
* [疑难杂症「传送门」](https://github.com/YanG-1989/m3u/issues)
>有问题请留言,基本上置顶已经解答了所有的问题...
---
### 推荐软件「你说了算」
* IOS系统
>APTV「多端」
* 安卓系统
>OK影视「双端」
>天光云影「电视端」
>TiviMate「电视端」
>OTT「电视端」
>Televizo「手机端」
* Win系统
>VideoPlayer「浏览器」
>SFVIP-Player「电脑端」
>PotPlayer「电脑端」
>QMPlay2「电脑端」
>ZyPlayer「电脑端」
---
### 订阅地址「懒人必备」
* [Gather.m3u「精简版」](https://bit.ly/IPTV-Gather)
> 订阅地址「GitHub版」,IPV6·源为主...
* [Gather.m3u「完整版」](https://tv.iill.top/m3u/Gather)
> 订阅地址「VPS版」,请勿直接打开...
---
### 直播集合「一切随缘」
* [Live.m3u「多平台」](https://m.iill.top/Live.m3u)
>直播平台 订阅地址「收集网友喜欢的直播间...」
* [个性化 M3U 定制](https://m.iill.top)
>定制自己的直播 M3U 列表「分享自己喜欢的主播..」
---
### 垃圾话语录「历史记录」
* 2025.8.9
>维护 Gather「•咪咕「TV」支持回看」
* 2025.8.8
>维护 Gather「删除 日/韩分组」
>维护 "广告"「兼容性 BUG」
* 2025.8.3
>维护 Gather「增加 备用地址」
>维护 Live「增加 备用地址」
>维护 Sport「增加 备用地址」
>增加 "广告"「时效 6–24 小时」
* 2025.7.24
>维护 Sport「修复 部分播放器 失效BUG / 兼容更多播放器」
* 2025.7.22
>维护 Live「优化 YouTube/Twitch 代理」
>维护 Gather「增加 翡翠/無綫新聞-随时拉闸」
* 2025.6.23
>维护 Live「新增 故障转移机制」
>维护 Live「更新 周期改为 20 分钟」
* 2025.6.4
>维护 Gather「增加 •咪咕「TV」FHD/HD 频道」
>维护 Live「替换 国内VPS 解析」
>维护 Sport「增加 两个频道」
>维护 myTV「替换 部分频道 LOGO」
>增加 [格式转换](https://yang-1989.eu.org/Conversion.php) 「偶尔可能有用」
* 2025.5.20
>恢复 Sport「请使用 APTV / TiviMate / 影视 」
* 2025.5.8
>维护 Live「优化 直播间在线 / 准确率 」
>维护 Live「修复 Youtube ID 识别 BUG 」
* 2025.4.30
>维护 Gather「修复 •咪咕源」
* 2025.4.29
>增加 Json 格式订阅「其他问题·待定」
>维护 Live「更新周期改为 15 分钟」
* 2025.4.1
>维护 Gather「删除 •咪咕源 / 当作节目表吧」
>维护 Live「修复 斗鱼部分直播间 不显示BUG」
* 2025.2.8
>维护 Gather「修复 •部分源」
>维护 Live「修复生成错误 BUG」
* 2025.2.4
>重启 Gather「删除 •IPV6 源 / •國際「匯集」」
>重启 Live「备份文件为1月1号 / 更新周期改为 30 分钟」
* 2025.1.10
>维护 Gather「修复 •IPV6 源 / 删除 埋堆堆」
>新增 Migu「提取 咪咕·IPV4」---([修改 hosts 方法](https://raw.githubusercontent.com/YanG-1989/m3u/refs/heads/main/hosts.txt))
---
### 声明「佛曰需要」
* 本资料中的所有资源均来自网络,仅作为爱好者的收集和分享之用,版权归原作者或原版权方所有。如有侵权,请联系本人删除。本资料仅供学习与交流使用,请勿用于商业用途。
================================================
FILE: Watchtower.sh
================================================
#!/bin/bash
###############################
# Watchtower 管理工具
# 作者: YanG-1989
# 项目地址:https://github.com/YanG-1989
# 最新版本:1.0.0
###############################
REVERSE_PROXY="docker.zhai.cm" # 设置反向代理地址
# 设置颜色变量
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
CYAN="\033[1;36m"
RESET="\033[0m"
# 显示主菜单
show_watchtower_menu() {
echo "----------------------"
echo " Watchtower 菜单: "
echo "----------------------"
echo "1) 一键更新 Docker 项目"
echo "2) 管理 Docker 项目更新"
echo "3) 一键清理 Docker 垃圾"
echo "----------------------"
echo "0) 退出脚本 "
echo "----------------------"
}
# 一键更新指定容器
update_watchtower() {
echo "===== 目前运行中的容器 ====="
local running_containers=$(docker ps --format "{{.Names}}")
if [ -n "$running_containers" ]; then
echo "可选容器列表:"
local index=1
declare -A all_container_map
while IFS= read -r container; do
all_container_map[$index]=$container
echo "$index. $container"
((index++))
done <<< "$running_containers"
echo ""
echo "容器总数: $((index-1))"
read -p "请选择要更新的容器编号: " container_choice
if [[ $container_choice -ge 1 && $container_choice -lt $index ]]; then
local selected_container=${all_container_map[$container_choice]}
echo -e "${CYAN}正在检测容器: $selected_container${RESET}"
local watchtower_output
watchtower_output=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower "$selected_container" --run-once -c 2>&1)
local failed scanned updated
if [[ $watchtower_output =~ Failed=([0-9]+) ]]; then
failed="${BASH_REMATCH[1]}"
fi
if [[ $watchtower_output =~ Scanned=([0-9]+) ]]; then
scanned="${BASH_REMATCH[1]}"
fi
if [[ $watchtower_output =~ Updated=([0-9]+) ]]; then
updated="${BASH_REMATCH[1]}"
fi
if [[ $failed -eq 1 && $scanned -eq 1 && $updated -eq 0 ]]; then
echo -e "${RED}检测失败。${RESET}"
elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 0 ]]; then
echo -e "${YELLOW}无需更新。${RESET}"
elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 1 ]]; then
echo -e "${GREEN}更新成功!${RESET}"
else
echo "未知的检测结果。"
fi
else
echo "无效的选择。"
fi
else
echo "没有运行中的容器。"
fi
}
# 管理 Watchtower 监控容器
manage_watchtower() {
declare -A all_container_map
declare -A container_map
show_monitored_containers() {
existing_args=$(docker inspect --format '{{.Args}}' watchtower)
monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*")
echo "===== Watchtower 当前监控的容器 ====="
if [ -n "$monitored_containers" ]; then
echo "监控的容器列表:"
local index=1
container_map=()
for container in $monitored_containers; do
container_map[$index]=$container
if docker ps --format "{{.Names}}" | grep -q "^$container$"; then
echo -e "$index. $container (运行中)"
else
echo -e "$index. $container (未运行)"
fi
((index++))
done
echo ""
echo "容器总数: $((index-1))"
else
echo "当前没有监控任何容器。"
return 1
fi
}
show_all_containers() {
echo "===== 目前运行中的容器 ====="
local running_containers=$(docker ps --format "{{.Names}}" | grep -v "^watchtower$")
if [ -n "$running_containers" ]; then
echo "可选容器列表:"
local index=1
all_container_map=()
while IFS= read -r container; do
all_container_map[$index]=$container
echo "$index. $container"
((index++))
done <<< "$running_containers"
echo ""
echo "容器总数: $((index-1))"
return 0
else
echo "当前没有运行中的容器。"
return 1
fi
}
echo "Watchtower - 自动更新 Docker 镜像与容器"
echo -e "请选择操作类型:"
echo "1. 添加监控容器"
echo "2. 删除监控容器"
read -rp "请输入选项 [1/2]:" action
case "$action" in
1) # 添加容器
if show_all_containers; then
read -rp "请输入要添加到监控的容器编号:" number
if [[ $number =~ ^[0-9]+$ ]] && [ -n "${all_container_map[$number]}" ]; then
name=${all_container_map[$number]}
install_watchtower "$name"
else
echo "编号无效,请重试。"
fi
fi
;;
2) # 删除容器
if show_monitored_containers; then
read -rp "请输入要删除的监控容器编号:" number
if [[ $number =~ ^[0-9]+$ ]] && [ -n "${container_map[$number]}" ]; then
name=${container_map[$number]}
uninstall_watchtower "$name"
else
echo "编号无效,请重试。"
fi
fi
;;
*)
echo "无效选项,请选择 1 或 2。"
;;
esac
}
# 安装/配置 Watchtower
install_watchtower() {
local name="$1"
if [ -z "$name" ]; then
echo -e "${RED}错误: 未指定要监控的容器名称${RESET}"
return 1
fi
local monitored_containers=""
if docker ps -q -f name=watchtower > /dev/null 2>&1; then
existing_args=$(docker inspect --format '{{.Args}}' watchtower)
monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*")
if echo "$monitored_containers" | grep -qw "$name"; then
echo "---------------------------------------------------------"
echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}"
echo "---------------------------------------------------------"
return 0
fi
monitored_containers="${monitored_containers:+$monitored_containers }$name"
docker stop watchtower > /dev/null 2>&1
docker rm watchtower > /dev/null 2>&1
else
monitored_containers="$name"
fi
echo "正在安装或配置 Watchtower 并监控 $name 镜像更新..."
IMAGE_SOURCE="containrrr/watchtower"
PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower"
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}"
return 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then
echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}"
return 1
fi
echo "---------------------------------------------------------"
echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}"
echo "---------------------------------------------------------"
return 0
}
# 删除 Watchtower 监控
uninstall_watchtower() {
local name="$1"
if docker ps -q -f name=watchtower > /dev/null 2>&1; then
existing_args=$(docker inspect --format '{{.Args}}' watchtower)
monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*")
if echo "$monitored_containers" | grep -qw "$name"; then
# 移除指定容器名称
monitored_containers=$(echo "$monitored_containers" | sed "s/\b$name\b//g" | xargs)
if [ -z "$monitored_containers" ]; then
echo "没有其他监控的容器,正在停止并删除 Watchtower..."
docker stop watchtower > /dev/null 2>&1
docker rm watchtower > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'containrrr/watchtower' | xargs -r docker rmi > /dev/null 2>&1
echo "Watchtower 已成功卸载。"
else
docker stop watchtower > /dev/null 2>&1
docker rm watchtower > /dev/null 2>&1
IMAGE_SOURCE="containrrr/watchtower"
PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower"
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}"
return 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then
echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}"
return 1
fi
echo -e "${GREEN}$name${RESET} 容器已从监控中删除。"
fi
else
echo "容器 $name 未被 Watchtower 监控。"
fi
else
echo "Watchtower 当前未安装。"
fi
}
# 清理 Docker 工具
cleanup_docker() {
echo -e "🚨 警告:此操作将删除所有已停止的容器、未使用的镜像和卷。"
read -p "你确认要继续吗?(y/n,默认n): " confirm
confirm=${confirm:-n}
if [[ "$confirm" != "y" ]]; then
echo -e "${RED}清理已取消。${RESET}"
return
fi
docker system prune -a --volumes -f
echo -e "${GREEN}🎉 清理完成。${RESET}"
}
# 设置快捷键
setup_shortcut() {
local script_path="$HOME/watchtower.sh"
echo "脚本路径: $script_path"
curl -sL https://yang-1989.eu.org/watchtower.sh -o "$script_path"
chmod +x "$script_path"
local shell_rc="$HOME/.bashrc" # root 用户的情况下要确保是 /root/.bashrc
echo "配置文件: $shell_rc"
if [ -n "$shell_rc" ] && ! grep -q "alias wt='bash $script_path'" "$shell_rc"; then
echo "alias wt='bash $script_path'" >> "$shell_rc"
echo -e "${GREEN}已设置快捷键 'wt'。${RESET}"
source "$shell_rc" 2>/dev/null || true
echo -e "${GREEN}快捷键已生效!现在可以使用 'wt' 命令启动脚本。${RESET}"
fi
}
# 检查是否是第一次运行
check_first_run() {
local config_dir="$HOME/.config/watchtower"
local first_run_flag="$config_dir/initialized"
if [ ! -d "$config_dir" ]; then
mkdir -p "$config_dir"
fi
if [ ! -f "$first_run_flag" ]; then
echo -e "${CYAN}首次运行,正在进行初始化设置...${RESET}"
setup_shortcut
# 创建标记文件
touch "$first_run_flag"
fi
}
# 主程序入口
main() {
# 添加首次运行检查
check_first_run
while true; do
show_watchtower_menu
read -p "请选择操作 [0-4]: " choice
case $choice in
0)
echo "退出脚本..."
exit 0
;;
1)
update_watchtower
;;
2)
manage_watchtower
;;
3)
cleanup_docker
;;
*)
echo "无效的选择,请重试。"
;;
esac
echo ""
read -p "按 Enter 键继续..."
done
}
# 执行主程序
main
================================================
FILE: hosts.txt
================================================
咪咕全网-解决方案 ( 应该还能用吧?)
--------------------------------------------------------------------------------------------
解决方法一映射DNS:
(QX的映射dns写法,其他代理软件同理.)
[DNS]
alias = /cache.ott.fifalive.itv.cmvideo.cn/base-v4v6-cm-miguvideo.e.cdn.chinamobile.com
--------------------------------------------------------------------------------------------
解决方法二修改hosts:
(IP具有时效性,需自行替换.)
通过 ping「IP域名」选取一个 IP 地址 (https://www.itdog.cn/dns/),然后将该 IP 地址用于 hosts 文件中 (建议修改路由器hosts文件) 。
39.136.156.38 cache.ott.fifalive.itv.cmvideo.cn
「每个设备的hosts文件位置,不一样自行寻找..」
-----------------------------------「IP域名」-----------------------------------
base-v4v6-cm-miguvideo.e.cdn.chinamobile.com
gitextract_1yvdr9sm/ ├── Gather.m3u ├── Migu.m3u ├── NoobIPTV.sh ├── README.md ├── Watchtower.sh └── hosts.txt
Condensed preview — 6 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (112K chars).
[
{
"path": "Gather.m3u",
"chars": 22503,
"preview": "#EXTM3U x-tvg-url=\"https://epg-1.iill.top/epg.xml.gz\"\n\n#EXTINF:-1 tvg-id=\"免费订阅\" tvg-name=\"免费订阅\" tvg-logo=\"https://epg-1."
},
{
"path": "Migu.m3u",
"chars": 11940,
"preview": "#EXTM3U x-tvg-url=\"https://epg-1.iill.top/epg.xml.gz\"\n\n#EXTINF:-1 tvg-id=\"咪咕体育\" tvg-name=\"咪咕体育\" tvg-logo=\"https://epg-1."
},
{
"path": "NoobIPTV.sh",
"chars": 57174,
"preview": "#!/bin/bash\n###############################\n# 名称: NoobIPTV (IPTV 项目相关脚本集合 @小白神器) \n# 作者: YanG-1989\n# 项目地址:https://github."
},
{
"path": "README.md",
"chars": 2060,
"preview": "\n# 仓库简介\n#### 个人爱好,收集整合!佛系更新…\n* [Telegram 群「传送门」](https://t.me/Y_anGGGGGG)\n>软件下载,资源集合,没其他东西 (后期可能会分享喜欢的东西)...\n* [疑难杂症「传送门"
},
{
"path": "Watchtower.sh",
"chars": 11434,
"preview": "#!/bin/bash\n###############################\n# Watchtower 管理工具\n# 作者: YanG-1989\n# 项目地址:https://github.com/YanG-1989\n# 最新版本"
},
{
"path": "hosts.txt",
"chars": 666,
"preview": "咪咕全网-解决方案 ( 应该还能用吧?)\n\n--------------------------------------------------------------------------------------------\n\n解决方法"
}
]
About this extraction
This page contains the full source code of the YanG-1989/m3u GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 6 files (103.3 KB), approximately 38.9k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.