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