更新线路

整体线路:v0916
This commit is contained in:
Liu
2025-09-16 13:16:27 +08:00
parent db62a2dd32
commit 28b144b0ac
21 changed files with 2452 additions and 5385 deletions

View File

@@ -1,5 +1,5 @@
# tvboxtg
#
整体更新25.09.12
整体更新25.09.16
#
The resources are sourced from the internet and are only used for learning purposes. Please delete them yourself 24 hours after using them for learning.

View File

@@ -134,7 +134,7 @@
"type": "rect",
"ratio": 1.333
},
"ext": "https://ka1dfj.slsw6.com"
"ext": "https://ev2089.zxbwv.com"
},
{
"key": "AppQi1",
@@ -215,16 +215,6 @@
"api": "csp_AppRJ",
"ext": "vxw35/hHSj07Q+maxQzOVMq1rjRCOTXpUCx8iKu5jIg="
},
{
"key": "csp_nongmin",
"name": "💯农民┃极速",
"type": 3,
"api": "csp_Wwys",
"searchable": 1,
"quickSearch": 0,
"filterable": 1,
"ext": "https://www.wwgz.cn"
},
{
"key": "csp_FreeOk",
"name": "👌Frek┃影视",
@@ -247,7 +237,7 @@
"searchable": 1,
"quickSearch": 0,
"api": "csp_AppRJ",
"ext": "jsSMEuhTZIAHjnUoLBzKdlRu5exzno6M4efF8LzwjWM="
"ext": "Z2MNziRBwjQxqaBuUxNkDRyvTntIkN1cOXhjyWgjCTc="
},
{
"key": "云速",
@@ -281,14 +271,26 @@
"apisignkey": "lvdoutv-1.0.0"
}
},
{
"key": "csp_SaoHuo",
"name": "🔥火火┃影视",
"type": 3,
"api": "csp_SaoHuo"
},
{
"key": "csp_Qiyou",
"name": "🥝奇优┃影视",
"type": 3,
"api": "csp_Qiyou"
},
{
"key": "大豆",
"name": "✅大豆┃影视",
"type": 3,
"quickSearch": 0,
"searchable": 1,
"api": "csp_AppGet",
"ext": "7PKaTzLgpGLqYV7cUF+dCEw/YtRQnWFqGURdQoZnM3s5khy5fqX3yGD7gACetGMWTQJv81SoDNcZI5UkNNLGqA=="
"api": "csp_AppQi",
"ext": "Ruh/okyt5lxEpcdQOao0NkSkj8M9vdB0soaZbGJldzA3817rfAzlvyWHCewZEFD4+BBCXxVVHkmAtv6gi+JRQlKwhK1WjuT8blTygReol77ICMmtZZPsmzfgjOtOXiEJ"
},
{
"key": "巧技",
@@ -318,15 +320,6 @@
"api": "csp_AppXY",
"ext": "https://xvapp.xingya.com.cn"
},
{
"key": "csp_baibai",
"name": "💯白白┃影视",
"type": 3,
"searchable": 1,
"quickSearch": 0,
"api": "csp_SuBaiBai",
"ext": "https://www.subaibai.com"
},
{
"key": "csp_LiteApple",
"name": "🍎苹果┃影视",

View File

@@ -1,313 +0,0 @@
#EXTM3U x-tvg-url="https://11.112114.xyz/pp.xml"
#EXTINF:-1 tvg-name="4K60PSDR-H264-AAC测试" tvg-logo="https://cdn.jsdelivr.net/gh/feiyang666999/testvideo/tg.jpg" group-title="4K频道",4K60PSDR-H264-AAC测试
https://cdn.jsdelivr.net/gh/feiyang666999/testvideo/sdr4kvideo/playlist.m3u8
#EXTINF:-1 tvg-name="4K60PHLG-HEVC-EAC3测试" tvg-logo="https://cdn.jsdelivr.net/gh/feiyang666999/testvideo/tg.jpg" group-title="4K频道",4K60PHLG-HEVC-EAC3测试
https://cdn.jsdelivr.net/gh/feiyang666999/testvideo/hlg4kvideo/playlist.m3u8
#EXTINF:-1,tvg-id="重温经典" tvg-name="重温经典" tvg-logo="https://11.112114.xyz/logo/重温经典.png" group-title="其他",重温经典
https://gdcucc.v1.mk/gdcucc/cwjd.m3u8
#EXTINF:-1,tvg-id="五星体育" tvg-name="五星体育" tvg-logo="https://11.112114.xyz/logo/五星体育.png" group-title="其他",五星体育
https://gdcucc.v1.mk/gdcucc/wxty.m3u8
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2201/057/821/202204010054_1626677502161_H169_1080.jpg" group-title="央视", CCTV1综合
https://mgtv.ottiptv.cc/mg/608807420.m3u8?token=873f9e9283a57cb20cc3454d664576c7cee149303670ed4bd2f7f6658774f7a495d1ea65f72c5f7ef3bfdaa59cc15c3841e1cd68801476d31982b6ea258968dc028bdbc318e28f16b537172411&tm=1757387428&sign=42f26e7f61b35f3b2beb6132117d35af
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/346/945/202205311432_1653977575541_H169_1080.jpg" group-title="央视", CCTV2财经
https://mgtv.ottiptv.cc/mg/631780532.m3u8?token=782622488420d058e771dc9f9ff4c4232e75b0b7506f4526e81bffd4e242d4735e7583d4af19a9140511ac6dffe9cfda872429af3c53636f3a4d5c80f0750b7c95b974a8c0632ff6e4d6473636&tm=1757387428&sign=98b036e589ba5e0908dedb8e40356e76
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/864/202204010055_1626679292691_H169_1080.jpg" group-title="央视", CCTV3综艺
https://mgtv.ottiptv.cc/mg/624878271.m3u8?token=c2f4e3b7fd41cbc7ca351daab9483f744dae90899de5c04536d8ee1859655cda7cf0727b8417eb1597a2a9bb4b89256e5146219aae0154b13a92aa7db76cd9cf8fdea25875a9d83bd45cb6d07f&tm=1757387428&sign=1ad60accd460f7db1b067d1c1e6f6d8e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/346/947/202204010054_1626679457281_H169_1080.jpg" group-title="央视", CCTV4中文国际
https://mgtv.ottiptv.cc/mg/631780421.m3u8?token=f1eb6fd00c24898b309e9a0edf4a3ea0f3eb2352ecb88740df440cd3ac9202c58a59bfe33e827cf048977397c053b330f7e2c705c1e530156f4cc8349e1526e7c39c0b3eca1f2dcd0ef2f4c799&tm=1757387428&sign=842ea63e29c6f44221b44812afe594f3
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/516/171/202204010048_1626679645474_H169_1080.jpg" group-title="央视", CCTV5体育
https://mgtv.ottiptv.cc/mg/641886683.m3u8?token=6c49c50cdf8aa0eda0a00c38f95517f40d327f07d308d09aa820421c26b14024bae965495fdb9762668b4e8cc42f1809466015650dfe7d50bc0de4db09d8c3f952f68584699eef30b9f01bf17c&tm=1757387428&sign=4075eef6b0c4cfa748df7ba38739ade7
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/516/288/202204010048_1626679726956_H169_1080.jpg" group-title="央视", CCTV5+体育赛事
https://mgtv.ottiptv.cc/mg/641886773.m3u8?token=0e47a58aee0c766cee42433ccc0df0f9dbaeb31233f0916a27c52231a008789243906c494256b43df6a92b0c6c47ec4b82b6d5800dad591ff808b64c6561983b4011b4a2d7f6d4b9bb499e989b&tm=1757387428&sign=909a01f044c6d44bc8e7dd339fa47d49
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/872/202204010054_1626679942827_H169_1080.jpg" group-title="央视", CCTV6电影
https://mgtv.ottiptv.cc/mg/624878396.m3u8?token=8f5994def3d9d3d1e42bf78bc636109851d74e4e86ad4dd7f30d3ff7b89e51ecc777ffcd40f1cebd9ae4f61469dc41b2b9b896de6d402ac81a18eb8a2c4f3b761eae1eb6a6625c7fd770d59235&tm=1757387428&sign=05d4c798efcd2288232b7c374480e071
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5501/083/622/202204010054_1626680072401_H169_1080.jpg" group-title="央视", CCTV7国防军事
https://mgtv.ottiptv.cc/mg/673168121.m3u8?token=57b2840dc9bde770b26f3ab2e0eff3a3653af6c4c3881f04c92e99a25cf5e6c2ac61b11846dd056517365844b855a51c9ca9da7d0c538280833fda4cb128ee3d4bc0452ff36784b667adf498c1&tm=1757387428&sign=63e8b03e9c6eb2135d88c27458ba13d5
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/868/202204010049_1626677144094_H169_1080.jpg" group-title="央视", CCTV8电视剧
https://mgtv.ottiptv.cc/mg/624878356.m3u8?token=afe48916b07b879975b99aef80c447d0b867e9e720473054b3c13ababa253922c099a02c093e76e2f86d838fc89789b259edbaa2df42da6e23ed1b7e7b65267f2ebd02b3d7465a7f18af5925c9&tm=1757387428&sign=24939c774ad7694e7fbf24e9ae47f642
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5501/083/624/202204010054_1626677492322_H169_1080.jpg" group-title="央视", CCTV9纪录
https://mgtv.ottiptv.cc/mg/673168140.m3u8?token=60e8ab435821bdfe6b921cf2eb6d9ff66b3c26f1588eb85aa005422e783722555f9e86e4662579a1ad132733c06fcc0322435b6748325ae6bc100a53f2e00d4a9091c6ff43762b4a669bc27417&tm=1757387428&sign=b9489a92706faead9cfd1be36f43a701
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/874/202204010054_1626677759168_H169_1080.jpg" group-title="央视", CCTV10科教
https://mgtv.ottiptv.cc/mg/624878405.m3u8?token=caa170b7cab721ce49bc50b69eaaf8cacf19071d92f8f4e6e93fa12c53a549c9c9067a5d501cf41811a575dad3cab6117bb732ac303198449d059d6c22da3a4631d2ede535c75ffe0522082268&tm=1757387428&sign=724c99ea6d84a5be2b0a5adf3b20467c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/988/610/202204010054_1626677917611_H169_1080.jpg" group-title="央视", CCTV11戏曲
https://mgtv.ottiptv.cc/mg/667987558.m3u8?token=7a1da4e323a4ed0a026645a00d5e8f2a08a83735a49b876da9e94ebd63d47d9104ed9858aa9e1b2f081ed8682f7219414fff9cbe49b10583d7fa588b0ca41d0c2f03d66d60d44427abea7affa6&tm=1757387428&sign=34ac256c99465c90cf5590c6e22ec2e1
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5501/083/627/202204010053_1626678104342_H169_1080.jpg" group-title="央视", CCTV12社会与法
https://mgtv.ottiptv.cc/mg/673168185.m3u8?token=09e9387e7585c6c9a2f3b5820f1e5ddc581a34b5f44b397bf39663aaa3b00f37a76c0b9b6073c600e1ff62661257b84df45188bb929555b34ecfae800261beb9bf56c74a88453a51e323e16ba5&tm=1757387428&sign=855951a793508743a7bb50e47a8595a6
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2202/208/864/202204010051_2202208864_H169_1080.jpg" group-title="央视", CCTV13新闻
https://mgtv.ottiptv.cc/mg/608807423.m3u8?token=b7b7a1eee882f2820196334a329c3e21a6a1d368f92f0ec29a2a0ae14bdc52e9833a705e6cd1c392ebe554f7fb42d9b76be0999e7643920eeb703309ee58f6715ef2ea5bf34d98b300a1604f54&tm=1757387428&sign=f43935283ccf3bb2471780af9fec937f
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/875/202204010054_1626678143105_H169_1080.jpg" group-title="央视", CCTV14少儿
https://mgtv.ottiptv.cc/mg/624878440.m3u8?token=953330a5dc7cea7b8658e35233c251992ecc99f332b16dc02d445791f114e86e2bf3ddbdaa177ab5b2a848372c8419ffb9172b65c80896ecf39ebe9fdec75927ebb00b23b23220e5bdbbec45c0&tm=1757387428&sign=21ccc92916417627e8a29b611e6918be
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5501/083/628/202204010054_1626678239769_H169_1080.jpg" group-title="央视", CCTV15音乐
https://mgtv.ottiptv.cc/mg/673168223.m3u8?token=cdf17d551a742294a4e284c6b9185da0e12443cfe9f1f19827a20895be47aa99a254a7e284cd1e3aeea39294fed2990c4daaeab16ca2822f1fdbcfa5d8f4becbc53c2a374279fe633c27d12b7a&tm=1757387428&sign=88a13ab1e00d5bbef980eca1f24793b7
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5501/083/631/202204010052_1626678423944_H169_1080.jpg" group-title="央视", CCTV17农业农村
https://mgtv.ottiptv.cc/mg/673168256.m3u8?token=234fb1ae2a8c7b386da9142054d2f4332ec18bdaee62808f92a4efed1523ce11e31b966e5659f4753619f3c3f3462d55f3abe1770933084da192bf52799d33ed4216ac577e41ccac4a48cff367&tm=1757387428&sign=7623e273adda38d351a47f4684431b87
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/315/202204010055_1626831001078_H169_1080.jpg" group-title="央视", CCTV4欧洲
https://mgtv.ottiptv.cc/mg/608807419.m3u8?token=0c40eee0536dfefba1f882dcb31da21588eb6b410f85661942709671de0c0015124a6f93571e19fee323a524a10a000f9ad2bf308dec3775fbdeeaed0b5dc9bcba076bb87cd4cef385daaf8e26&tm=1757387428&sign=096c9e853f3a3b0f8e94674c679b0f82
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/344/202204010055_1626830735444_H169_1080.jpg" group-title="央视", CCTV4美洲
https://mgtv.ottiptv.cc/mg/608807416.m3u8?token=fc2ccaa9e528fcd2af0fa31ec25c87d00e500422b6b1c982ef88277887ea14bd4e087f8fb5d8ff8a4c7cb750b9aaa8e0c371a22eaff32c1384f81e0d0f37e62d36569c96943d724158b0918d04&tm=1757387428&sign=4ab241826ac3528922b83d7795f2aa96
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/356/202502251602_1740470533820_H169_1080.jpg" group-title="央视", CGTN外语纪录
https://mgtv.ottiptv.cc/mg/609006487.m3u8?token=e6bb6a50bf14eb0c2b8a50065e026d1d9685b217b866150f611bdae75528bbaf30460910994dd6d450d1d9762406be80bdf1edd3459a1884ecb8b5c8753e1a1af2067ca16ea334d47ab75376b4&tm=1757387428&sign=b58e8d3771b74d1a08687e7c14e15b50
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/303/202502251557_1740470224929_H169_1080.jpg" group-title="央视", CGTN阿拉伯语
https://mgtv.ottiptv.cc/mg/609154345.m3u8?token=0d4f8ec49501eb6bdabd7ae27b7949ecd8f361e57b4d9e58dadc625c52ceec691481eb6c448904a86e72e8071d9085e7a96fbc91f97911dd47a481f948cdb445bc13383d24bae46704bcb4b953&tm=1757387428&sign=82a733b6cbc779b020b490828c501873
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/337/202502251600_1740470429939_H169_1080.jpg" group-title="央视", CGTN西班牙语
https://mgtv.ottiptv.cc/mg/609006450.m3u8?token=e36834050da008104d7f1278b6167c245dcf4d2526d043f43947dcd823657e0984830fe41d335b4023453b74fa21260f28571cf057ee7f95f4d9cd1389130925fa800abe69d36fce564da30d1e&tm=1757387428&sign=7bbd52daf285b3716f462168363b0f72
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/324/202502251559_1740470364968_H169_1080.jpg" group-title="央视", CGTN法语
https://mgtv.ottiptv.cc/mg/609006476.m3u8?token=795ae5f5a67c037f9ec809fbb743ace0d4208d05a5a816211c3b890f6655cb9c940d4945fe783e16fc98a13cd2ee3dff63927e3e00521ed16e1c27b255cc95ea6e23d844f5efff75d854305178&tm=1757387428&sign=2e9d7e2ed4fd7840d0dd775f2fcf40c3
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/179/332/202502251558_1740470310039_H169_1080.jpg" group-title="央视", CGTN俄语
https://mgtv.ottiptv.cc/mg/609006446.m3u8?token=4a3c1ad27f62bedc5e25a44dda961e53eca0099bc7aa0fa11835cd394e8eab0a5888b1f66a1a916a69185275ef7c82c7f9ea87d9ee0435a68148049768a11ca58f81750d9846560a1631e3862b&tm=1757387428&sign=236e6949419ece4e588d37a449043b17
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/002/202405081702_1715158642984_H169_1080.jpg" group-title="央视", 老故事
https://mgtv.ottiptv.cc/mg/884121956.m3u8?token=b7fd1d22ea197b5b0e3599a8a28a43baacbd56cd898da9f8e8f4545702215535c7f57df5dc172e2ef8df54ccb4d91eef8461260e5069484f66600b5dcce9ee4ce6c04d3d5886a135581e83f5a1&tm=1757387428&sign=79f2867169db8ebf3185bf3e25846ad8
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/893/202405081702_1715158824845_H169_1080.jpg" group-title="央视", 发现之旅
https://mgtv.ottiptv.cc/mg/624878970.m3u8?token=34a14472045f9b8abb52f7fb79d3552782ae22388f6832d72b831936d5bac7378b7e43bdd7dffd48e5585d6be5dd7fc1f5fbb89f12f262da37e007b6ab5c84e6e275d6ce75fb6d2e824219264d&tm=1757387428&sign=60106078866481b14e4b4e6c949ddae3
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/019/355/202405081702_1715158104256_H169_1080.jpg" group-title="央视", 中学生
https://mgtv.ottiptv.cc/mg/708869532.m3u8?token=4e7008fdcfd7199179a183b4bc60b98f771f772e7fcbc8597c18a71237b6200cadf11e44449392273728804176e3d5dfae36985b6c0e53522888d79c14a81c64ebd0f45eb5a4ca03457e5945db&tm=1757387428&sign=fe5342824393c70b85adcd736eff06a9
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2202/196/407/202204010052_1642124762081_H169_1080.jpg" group-title="央视", CGTN
https://mgtv.ottiptv.cc/mg/609017205.m3u8?token=70f84f00ed80d8b09557660c3c63d68d0453c75f2137351ed31ab355f46650b8b473c379aad9679ed0e994ca9fe2746f8b7f078e19c67975ff5e9b64351ca387aa2ddb55b1dc22ed2414f2d0e3&tm=1757387428&sign=70adde971db92e03e4bfd4064f58a688
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/185/202508040856_5100043384_H169_1080.jpg" group-title="卫视", 东方卫视
https://mgtv.ottiptv.cc/mg/651632648.m3u8?token=776b8048f4bc8d513ab3ea0df3e59c585a3d11e2da00b6c956d09ca4a7283393ff6e1fa169c8d229729ee5f394f0d9625c7ad18933383d6ec04e405a69d5b249c8ffc844644bc54d649917148d&tm=1757387428&sign=25dd6191b2e0068705c5e7bfb4dbb000
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/199/408/202104022140_5100156802_H169_1080.jpg" group-title="卫视", 江苏卫视
https://mgtv.ottiptv.cc/mg/623899368.m3u8?token=4443ac772119e3e875936d83d5e9a6d8b74ba8344fe3dc5be342709bdc778a1dbd3311408a92c569c2ae3f21503a27ec30518f5bce205a735b6e890e9b7d80750bf4198aee1812d071d3af5357&tm=1757387428&sign=be62ff9aa32b0a11ec19a7e15c8d5fbe
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2202/428/795/202107191524_2202428795_H169_1080.jpg" group-title="卫视", 广东卫视
https://mgtv.ottiptv.cc/mg/608831231.m3u8?token=bb3cb427f3f279e54e1ba53ba9cc467066329cebfd3f611cd024f214d5b0897d26f8439fc4e52a2d82dd7ed9e42cef243ffdc90b277e0cc03a1469afa27447a5657312dc40eaca47e4fbc36eed&tm=1757387428&sign=b275b8e30dc5da9d45cb06c6bf7e439c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/021/492/202303201551_1658134112236_H169_1080.jpg" group-title="卫视", 江西卫视
https://mgtv.ottiptv.cc/mg/783847495.m3u8?token=4303b002a5522c1b5a352769e9533620bd6ec76f6c6c0086f7827c13666aa358ad0233710fb2e1ae818beae9a8e9207ccdeccbc3ba33b6f8011fed00eba0859e2b564f11cacdfbb93612e9ea85&tm=1757387428&sign=dbb6e56362eae8782784542ace8c5d7e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/021/585/202304031400_1679994685582_H169_1080.jpg" group-title="卫视", 河南卫视
https://mgtv.ottiptv.cc/mg/790187291.m3u8?token=d6816f3decc685832bea8e09db0613060a89a851735e009e2baf75da1e831d49c36ad2786adc46c0ba45cc3fb39f01dad804222c726ac2e562462a711c715a0a0df69b542e7504d990defe1824&tm=1757387428&sign=8e15d19b97dab281d948ad925ccd77d2
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/020/475/202207191732_1658131375175_H169_1080.jpg" group-title="卫视", 陕西卫视
https://mgtv.ottiptv.cc/mg/738910838.m3u8?token=7aee8e09b304a4c3ff785d09530dfff725f4443f34798b61ed3dbe7f386b62ead48c2fccda5e45cffd25745758813327619ce0abaff3ecae9e29c565f1c1ce503293fef5696c37e129bce83b65&tm=1757387428&sign=2844652bbe341e52b5b77c7dfe312327
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/322/852/202304081513_1677570732561_H169_1080.jpg" group-title="卫视", 大湾区卫视
https://mgtv.ottiptv.cc/mg/608917627.m3u8?token=3a813443ba986bfde96ff2644a1fe74e75fc69a772073d48654a0439d1a49b73887caaab9d28cc2ae8864f37ac8b3766dacf02dfbaebc1ab7d2c2e151594f2ffd4d19260c270c8ad1e2db5ef26&tm=1757387428&sign=c4877d73ebda26334e8dd7cac6b9d49d
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/163/202501231715_1658138621263_H169_1080.jpg" group-title="卫视", 湖北卫视
https://mgtv.ottiptv.cc/mg/947472496.m3u8?token=e5a0b28e8ae82ad7b9381cefef3a9eeb629d5e452c2dc04ada0083a25525da8d6ae2615dc16cb283b2a4c47e76684dbbf06e9c08e50df6644e468dd757b9fa97fc340e13578f15a444d79895f9&tm=1757387428&sign=856798395c984a5627b9d46e6ee51940
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/164/202501231715_1658138745288_H169_1080.jpg" group-title="卫视", 吉林卫视
https://mgtv.ottiptv.cc/mg/947472500.m3u8?token=176717400bf21181717e254c66e6c126a79691d0a41dd7baf569ff92a0d91e6b2f345c54e0222f1557ff297997d7b80b42112cb2a27d6c0c7a6293316aeff4e90431965293ab0c0f07a5ebce48&tm=1757387428&sign=29112399d4c94b1b73e936713bd1ac76
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/166/202501231715_1658138568499_H169_1080.jpg" group-title="卫视", 青海卫视
https://mgtv.ottiptv.cc/mg/947472506.m3u8?token=279ac63bad56939adeca1a8e429ca2e1b2612bd6b4bc770210b49c9db6aea5ec2b74ec4960cc69f8f62ba44e60951a05299c76483ee338cac54a582d4ecb574fd669f40c3c38525f913eda1bf1&tm=1757387428&sign=b00edce4c5ea5cf69c64426720a80868
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/182/202507151427_1744624877831_H169_1080.jpg" group-title="卫视", 东南卫视
https://mgtv.ottiptv.cc/mg/849116810.m3u8?token=a643ff23af93f589560ac459f25c6195eeaea3afd743d1544a33db6953509bcdf2eab8de77b42c65fca34f59c600d0b4b36a103393a5b0d10b77ccee85b3157687bef690b25961fd700d4f56d2&tm=1757387428&sign=14ee721d31c97ab861423edd42edf6d9
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/165/202501231715_1658138887282_H169_1080.jpg" group-title="卫视", 海南卫视
https://mgtv.ottiptv.cc/mg/947472502.m3u8?token=fa6b867c9d3bbe7ddcb8b148eee510b620bb98cc174d5020f4440865dc01f30aa058d88d56e29882e91f66d4974ff231a50f5455a2660540a5b85868e4580559d3b70a84b0f83cf02b15ea4793&tm=1757387428&sign=ac026c3b287e05f7969b64e06f06693e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/183/202507151427_1690875414853_H169_1080.jpg" group-title="卫视", 海峡卫视
https://mgtv.ottiptv.cc/mg/849119120.m3u8?token=c5b8d026a82c573227d85f4701b8b972f32c8a16a4d0f9605d398bdbe0fe14d0fec2c8e67e43f66c3f3142485447d4a48110149f069e310a5fef1f84daa124cefec325a6dfaa4d11b80f2a3a8b&tm=1757387428&sign=0718af87d2bb52db08b1ca3a3b47e572
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/186/202508051621_1754370268870_H169_1080.jpg" group-title="卫视", 中国农林卫视
https://mgtv.ottiptv.cc/mg/956904896.m3u8?token=6d9685690242d4943db3d0cbcba0d9cafbc4fed3a7970e2f9956c3fec0c12bc17614e2cfd534b36022e7b3615740f0d617633cc7fd9e921058225396896eddea80cd551940a235b70d0a91d551&tm=1757387428&sign=234bac315e947dffbadcab1c1eed2aa7
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/192/202508061552_1754385897430_H169_1080.jpg" group-title="卫视", 兵团卫视
https://mgtv.ottiptv.cc/mg/956923145.m3u8?token=bab0b35b322385924a6a6da944fa42ee3987558d200c9fc62bd5726f5dfc76279f1b5c5ed7d19f29d3e3066165422c9bb7782b6b8a0672ebd2babfc38759243ba2b33ff59877790fe1e8050f59&tm=1757387428&sign=2e9b0ad3257166c2fbb35db7aa2609db
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/002/275/202107191641_5100001716_H169_1080.jpg" group-title="地方", 上海新闻综合
https://mgtv.ottiptv.cc/mg/651632657.m3u8?token=a475dd15ae83ef12fbbc639e381cb6fd71f0798d0d364a5af75755bc1b74d8a6c33a5de1527a2cde23566b3786b0493d6d8ec3ee5d0246dce942b5c54a0487235fc299ee8c0aed4140fa037836&tm=1757387428&sign=b6751eae3fe75172ddb4a9cb3c9c386c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/002/274/202105271333_5100001715_2_HSJ720H.jpg" group-title="地方", 上视东方影视
https://mgtv.ottiptv.cc/mg/617290047.m3u8?token=4c59ee5355269d5c5b344beebee5f2243e6f97e3a8ac49d24179ac7ad61aabe4d429830ea44589a452b9337ef0ca37143ff25c0362424a6e052d819f5aa7f7b605dbc57aff03b9381468b7c467&tm=1757387428&sign=f4b6aa3dcceb104ad8de82f28ad3f170
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2201/008/312/202209271630_2201008312_H169_1080.jpg" group-title="地方", 上海第一财经
https://mgtv.ottiptv.cc/mg/608780988.m3u8?token=0981447956485a7d88f4b8d9655eca5e61bc2d91b1cd3a008789aeacbf227b20e6116cf78096b61b53863cbc8c46a5e64ab9037625f393e0c14efb021445da7dc6f53a92f1a035aa4f5edcaf40&tm=1757387428&sign=dea3debc3c3da85fa6d3596b579b37ab
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/021/863/202307121521_1689144286039_H169_1080.jpg" group-title="地方", 南京新闻综合频道
https://mgtv.ottiptv.cc/mg/838109047.m3u8?token=695409bc4bbc0fac9c2e93fafb10358e8807f71d510876460167890d6517fbef025504e5353df8b8f2cbbc1a5e865926c76797c0b143296a230d6a28b951cc9765e8440f2025e50f4ad2f79d40&tm=1757387428&sign=7e58109b5457fe8f325c1ea8a45492a8
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/021/865/202307121700_1689146721503_H169_1080.jpg" group-title="地方", 南京教科频道
https://mgtv.ottiptv.cc/mg/838153729.m3u8?token=5f55a257f2c595ac2fe012213fad6372efed0595ed4c58994b580a432db06caffb93b3fccc0e8eafb742b33165790262b954a4284e566b62d13c0e1687e43b4e406265f15e651f3461ba2ba9b0&tm=1757387428&sign=6dd66e8dd8d0789f676652fa6ab6c009
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/021/864/202307121658_1689146982273_H169_1080.jpg" group-title="地方", 南京十八频道
https://mgtv.ottiptv.cc/mg/838151753.m3u8?token=ab9fbf627f52d77ae7c57d30c55e8b11b6067e5d549666146342ba40e99f7f7f5fa85e322b39913b8941da9258c812b4cd820760cf56c633bc3139d7905b9e158d2d685dec66fe3018fc73a744&tm=1757387428&sign=8c17fe6433aa77df97551616e546c834
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/554/202104022139_5100186459_H169_1080.jpg" group-title="地方", 体育休闲频道
https://mgtv.ottiptv.cc/mg/626064707.m3u8?token=14c0a131c96cc2085d99ee13d16115ab1be368144caa598a820d55aa92ab5e8bb56b78a878657944e61a9810a967b8a150965d92bed94b43f66a6d9709fdcb4c13128e2fab51e99a9f5b5f138c&tm=1757387428&sign=4176ea8f00af1ce39ae39c90f0d14879
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/508/202104022138_5100186409_H169_1080.jpg" group-title="地方", 江苏城市频道
https://mgtv.ottiptv.cc/mg/626064714.m3u8?token=f0ecc5c1e25dbe4dc8283ae22bf03aed6cf12384fc5c2dc446b7aa7cf667331929e5f881ebd35db33c802f48cfbf567d417d669db130a62a0cec7f53164a3818fb3996cd882254d7e4a4940f7d&tm=1757387428&sign=c4711cdbde337c90246aaf6ad0668a80
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/577/202104022139_5100186482_HSJ720H.jpg" group-title="地方", 江苏国际
https://mgtv.ottiptv.cc/mg/626064674.m3u8?token=5d6f29e45f25ca1659aa5db7bbd54dd3a89c31a4e52aed55b40ad8ba882f0a65437abb9574653c6f1b1a36697ebcae604d9cc3e9a66847cb88b646fab8ac417daac705ac778dfb3c00e888704e&tm=1757387428&sign=e6dfc46c76a0fd4d97a16488ff515c91
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/287/493/202104022139_5101012819_HSJ720H.jpg" group-title="地方", 江苏教育
https://mgtv.ottiptv.cc/mg/628008321.m3u8?token=8def702e0b9d4f34ca237bce0b10b3b501f7c2730386b879bba5aba216a8148069797ae341800abbafe0ba03170c5e544944f1433cace4129ac4314c693a1e8ad6c2379d0496640b95699f70b2&tm=1757387428&sign=2f4bf5cd458d5e3009a32f4569ad7082
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/517/202104022138_5100186424_H169_1080.jpg" group-title="地方", 江苏影视频道
https://mgtv.ottiptv.cc/mg/626064697.m3u8?token=abe0976af290a83c6d6288ce5e7fb43c072de6aeb2f415380e61626f30f45bf20c720c629d9b5d2517264ac9f69393aebdcab62cd47e2e35eebbc23a16b0fbef653310a19ce9778f2a1b95c2cb&tm=1757387428&sign=55215cf5b5551ef58310d20274127039
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/513/202104022039_5100186420_H169_1080.jpg" group-title="地方", 江苏综艺频道
https://mgtv.ottiptv.cc/mg/626065193.m3u8?token=6ab8934889852b36080355ee194f1cc9d02d2b4530411f26e04322963768aaccd92624ed69078cc04db5c7d8ab535cde4c6cb7cb09a9943b924400d81ffb6b79a54f64cd40a80cd940295b569b&tm=1757387428&sign=3b907e0ed6354e53497c7b2772816c16
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/520/202104022138_5100186429_H169_1080.jpg" group-title="地方", 公共新闻频道
https://mgtv.ottiptv.cc/mg/626064693.m3u8?token=2fc85bd6f155104984791d735c42aec706ccd06dea49076ba86345a82c02e53b72ff3d432c81a810123766785fcc29206c403fe029c0be2f0b3022a0cfe6352a007523e11227bc7c1d8b4ed9e2&tm=1757387428&sign=f0bf1a3d09a4ed875fb1532e0e1b4111
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/360/202212301654_5102012617_H169_1080.jpg" group-title="地方", 盐城新闻综合
https://mgtv.ottiptv.cc/mg/639731825.m3u8?token=9012f76bbee138afe3c5f13f0e104918c7057307b2068e28fd77f4c71164a05fa1dd42ef94bfe52fbe8d7548bb4fca92ffcacb767d69b915104ab1f8c800acceec2490f4e6d72abbd175c036a9&tm=1757387428&sign=b2a22122198505353794a9b0246d6356
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/363/202104022141_5102012618_H169_1080.jpg" group-title="地方", 淮安新闻综合
https://mgtv.ottiptv.cc/mg/639731826.m3u8?token=853bb6a3eab0edc2721bea3fa75794ec7be1c245ae31339c2a9810ab02e7f0275dc777b0012e65cb4a8c0d1709bebd03d35b215deac7328910c0fd664bf0473f7e76e40d22ec73a4078a586009&tm=1757387428&sign=3b59dedf324e87559999a24375001b1c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/354/202104071213_5102012615_H169_1080.jpg" group-title="地方", 泰州新闻综合
https://mgtv.ottiptv.cc/mg/639731818.m3u8?token=a2f1046c25e8e0a2250d88fbcd6cd3a07f9549ca955febaff03ebb69a8c08ad7aa768351df7b6ef7e0b01b613cb064c38e44dd4ef2aac65d6e59e0c5d4f412ed1efa1ddc08f0ef871f76bd263f&tm=1757387428&sign=0a51043cff55ff6caae98256f31bf659
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/369/202104022140_5102012621_H169_1080.jpg" group-title="地方", 连云港新闻综合
https://mgtv.ottiptv.cc/mg/639731715.m3u8?token=c0114fd9c6cdabde9c35b55a0ba1c18b2f227c692b6703a13cd7b7f1fe1f4c42aa58de5af202854b465072a513feaf8d25f6ed79a3fbbd96488c5a8dd23ab49b1862bb981894b87b0afb7226c3&tm=1757387428&sign=cf279f98846cb2f3d1d5557c58d5de46
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/357/202104022141_5102012616_H169_1080.jpg" group-title="地方", 宿迁新闻综合
https://mgtv.ottiptv.cc/mg/639731832.m3u8?token=ce10bb0a7b67d27d32959436d7fa319e1b67b20a82189e2215f50b585e461a62ae3ccc3705e3b944877b1f8b60e3426accd6700785992cd870ee0b30313f0a833eed8bae27daf5a7c8e237cfeb&tm=1757387428&sign=f3904f643c7a11adb74a00659e8713b8
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/368/202104022141_5102012620_H169_1080.jpg" group-title="地方", 徐州新闻综合
https://mgtv.ottiptv.cc/mg/639731747.m3u8?token=7505c43e75b03ab512822c62ae667e6fabc75d21a1476c7f115aac8c92fba7bdbe8e6a8a1dee0e2fe65501440a4089e7d6685a3d96ee3de722c0d1568d7a78c7b14163dcd8b76bfcad4afd8c15&tm=1757387428&sign=a9fd5a209acfcfe09473bbd8109aa2b5
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/260/553/202104022139_5100186455_H169_1080.jpg" group-title="地方", 优漫卡通频道
https://mgtv.ottiptv.cc/mg/626064703.m3u8?token=8941573e2f1c8eec02af4fb007fd21d3727b067c0eb3071bb5ad96f59d39f3295743c9d44a45285d3f824d77134640b2e532cb50a64af65d8f8ca236485dd9c87dac8b2aef9858ecdb6a1e5013&tm=1757387428&sign=4a5c97a5d5e2b60142a97c5bcce2d625
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/177/202506121842_1749616924879_H169_1080.jpg" group-title="地方", 江阴新闻综合
https://mgtv.ottiptv.cc/mg/955227979.m3u8?token=04749738c255c393e5e1d47d136c79409a02ed19edc6c49063d1e2e548b837cfcc404bb59f20843685e128d452e7136f471b2d816bc3bda0028a266a1e31660b0612abea8e47bab923b13724f1&tm=1757387428&sign=22ab7b54b6a6b464d9fd59c7ecdd1380
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/178/202506121842_1749617021865_H169_1080.jpg" group-title="地方", 南通新闻综合
https://mgtv.ottiptv.cc/mg/955227985.m3u8?token=a528b3e93981e9437b87b484a78b779e686054b6d2a436d071713f45207c26622d86eb017d7c5f636891fafe862fa90fbad2bdda30a7e437ac5ef8889b7a8e7d107f80e7c0257845de86f53af7&tm=1757387428&sign=7d9c602549c2f1101540f97d2d6eda19
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/179/202506121843_1749617115515_H169_1080.jpg" group-title="地方", 宜兴新闻综合
https://mgtv.ottiptv.cc/mg/955227996.m3u8?token=b09930f14ead7dda19fd2f5c3fe5fad6007c1632b1cdbaa428e340e213cd7b74e06a4316178437292e89c3fa3919fe2099e0f087b63fe15cac9466de6b5d81a2175584b6bfea4cff5ab9441a4f&tm=1757387428&sign=8b0f1136f57f41f72db9b14317d63093
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/469/349/202506201638_1750408508110_H169_1080.jpg" group-title="地方", 溧水新闻综合
https://mgtv.ottiptv.cc/mg/639737327.m3u8?token=9424dbe458645bdb46386f7b792bf45cd30746b46715d0c4c24b3ce14abac0b9ba31b818a1f34ae5484eb79dd60ee63004ee3adc03ea9fac82808ea2a49b9e324c65b73153c57f5e5fda36f8ac&tm=1757387428&sign=fa2e654a35ac22bed566df03ee34529d
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/191/202508051746_1754371391139_H169_1080.jpg" group-title="地方", 陕西银龄频道
https://mgtv.ottiptv.cc/mg/956909362.m3u8?token=daa212abbf640091e555c0ddbbadf6e26179d2e38b6e044919fb6d539062cbee5da7771cddb49aca190d6a5161b30973c7a2e7eeb04b2a73e884956119fa7cad3414069dc784ad58775b3de6eb&tm=1757387428&sign=acf362ec6da50f079a08e60137d06d9b
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/190/202508051746_1754371281201_H169_1080.jpg" group-title="地方", 陕西都市青春频道
https://mgtv.ottiptv.cc/mg/956909358.m3u8?token=486dac0586da55668eed086a3f0f5e59a67369275f67a46f3ab1591a0e2f799ddb3c940dc2bf2cacf5fb2803ab9fb2a75d67d406dfa43fda543e76bc3a8780a81dbbb24b08b8cd51aa1d5fc4d4&tm=1757387428&sign=f7a786c698978984e311e64045d0674e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/189/202508051745_1754370651700_H169_1080.jpg" group-title="地方", 陕西体育休闲频道
https://mgtv.ottiptv.cc/mg/956909356.m3u8?token=279180be65982efede037f36709259a22429c72b8a4632131ff805496f288f2447d6f75a220bdc286f3e78aac83d54d31c61e8f48459bfd6c1a035ceaf8d830088ba3653daab726b8a063343ca&tm=1757387428&sign=a13de8d3a08441f9f8a702199762d73b
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/188/202508051741_1754370551778_H169_1080.jpg" group-title="地方", 陕西秦腔频道
https://mgtv.ottiptv.cc/mg/956909303.m3u8?token=26e9b1bf33ddcc5ac1489d0cf795c8229ec8e1db3fa52b5b87f271f923b33ee0ed543ee47c73f273b0cbcac3d86b187f98d84e2e9e34683e475349aacd1b3ac895580ba3ef7e5d29a3bf438e23&tm=1757387428&sign=f72c46547d44fd5bd2102bd772d02a2e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/187/202508051740_1754370413748_H169_1080.jpg" group-title="地方", 陕西新闻资讯频道
https://mgtv.ottiptv.cc/mg/956909289.m3u8?token=a58e17f812a32f741952e64b58cab754a509108091afefa9abb6f1169d6f41a59394e0d4ca26ec562ba6c01ee381ff351b963486e204e750a719d5d0927ae014e168d0b4bf003f7a9903515fd7&tm=1757387428&sign=ed4b9aaf36f6be87d1b549dfb198b11e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/193/202508061552_1754385775557_H169_1080.jpg" group-title="地方", 财富天下
https://mgtv.ottiptv.cc/mg/956923159.m3u8?token=3f780a7e5f2e5423bdbce85091f12c5812ee6fbe5a42706753b4e18827f238aaaf94e73f3523463324b27878d9088283c2a7e4d9293783792246327a569e19d85115b8a67e857b7973934ba4e6&tm=1757387428&sign=1fb9abcb3ea4958e17d7d807f20c06d2
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/242/089/202508211805_1755769495190_H169_1080.jpg" group-title="影视", 经典香港电影
https://mgtv.ottiptv.cc/mg/625703337.m3u8?token=988ec3586caef422e0f3636ea83c43c673ca0daf84ea98904f2a5a0a8fd09410e127ae5376f5242585f9c1442fe85da484689f6f306736956009901ccfbba46f56a7554515d0858b0d5ce1091e&tm=1757387428&sign=ddb47c4ac6599f9959c56b9325ed30b0
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/230/666/202507181733_1752831177769_H169_1080.jpg" group-title="影视", 高能悬疑 推理时刻
https://mgtv.ottiptv.cc/mg/625133682.m3u8?token=d16961422e244bf50d9101675c05a56e893fef8a2804d2938403d2869135a5d31d65b7e1895c9b46aeaa589a1d4cb1ad1b0d59fa25f23deb26dda6e2f65edd3621b7fbd57b23f5bb5c643a4da5&tm=1757387428&sign=6ca5b625f9395b79c698ef90fefa8e47
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/002/717/202507241513_1753340542329_H169_1080.jpg" group-title="影视", 抗战经典影片
https://mgtv.ottiptv.cc/mg/617432318.m3u8?token=a47734525ad2c586bfe0e30d23f436080387eeddf3827c9a1991dad28ae9255d186a26934e5482806632b660316c13e774d48d5d40a41cf19ed31a3fa33a3b3f562d15bdcd3f018df14e660390&tm=1757387428&sign=e4359a2efbfa7dee9f711dfbc55bbfc7
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/035/175/202405061742_1714988181593_H169_1080.jpg" group-title="影视", 新片放映厅
https://mgtv.ottiptv.cc/mg/619495952.m3u8?token=266b6665b29682c0e9c987240845414eea3d61bcf94816f28513bfb2fb64a298a4bd96420b792adbdbbed816a170d3898f207f0057bb85ff409849e24c33684e45f0e96fe9ab7c4f3577826927&tm=1757387428&sign=7c632030d2382fc598f54273aadd0d1a
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/176/202504161629_1744788994468_H169_1080.jpg" group-title="影视", CHC影迷电影
https://mgtv.ottiptv.cc/mg/952383261.m3u8?token=fb19307c2f7c9e824061cfc7dc7ea4e3f149c1876b0d4e626aa7b3a0c8695de7e688e5f116b1cb0f92db2bc006b37a351f43d0066079a4f35b7351dd0173143c092358a3c8f8c85a0bb0aa40bd&tm=1757387428&sign=e69a7e86ec1783ac6d2539a349029300
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/554/795/202308221159_1692676692674_H169_1080.jpg" group-title="影视", CHC动作电影
https://mgtv.ottiptv.cc/mg/644368714.m3u8?token=ed28c3e0fb0d180e7f82122e4340dd05d976fd2bb07716b1b0e0f08ce063766b5bdd88d6e97905d25bb4655537b52b93fc00fc9e72ab5de3470d2c56caa077ceaaf7b41c304b2543f3863c7cf3&tm=1757387428&sign=1142ec7e336c179cdd541363afa3a78b
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/554/911/202308221200_1692676825616_H169_1080.jpg" group-title="影视", CHC家庭影院
https://mgtv.ottiptv.cc/mg/644368373.m3u8?token=b263c5d154508a1d5a5c41c3b8c5df1afbb832187befe527e8244af332655184ec0f6f788fc7bd252dbb7426aadb0a595de617079f3a22d82a273bb4c7be1f2c7fcda3566925858e6812d26778&tm=1757387428&sign=1e05f6607dc64105b2654b9944dd8b97
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/019/525/202504151721_1744708803016_H169_1080.jpg" group-title="影视", 和美乡途轮播台
https://mgtv.ottiptv.cc/mg/713591450.m3u8?token=9c25bd89d7a14adaadc8afca14cc578fbad402845bb6d32d7c211978f20abe2466ec80b91433be64d781d2ebdbf45306a1082a61a7944e502a73b01dc63e29814c8c967c19c5325de4f6c39bd1&tm=1757387428&sign=5820b959bbc545b0295a48604e744e7a
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2206/173/738/202304081513_2206173738_HSJ720H.jpg" group-title="影视", 南方影视
https://mgtv.ottiptv.cc/mg/614961829.m3u8?token=1ede98960967527f96cf63eace374b90fae8ff7dc1bfec7842ccd7e4da720c0eb8fcc2f8e2d5dde4c15a2b133f19776b227db03c9f124b4ee63453e29ecd74ae92d5cccfd4601ce5dd8a3939b9&tm=1757387428&sign=f71e5ed51dfe22d9d1f416e1c36d857e
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/019/527/202506181115_1750216473927_H169_1080.jpg" group-title="影视", 血色山河·抗日战争影像志
https://mgtv.ottiptv.cc/mg/713600957.m3u8?token=c95d0e5c494b0f0248d3e524e22cea1cdfe0e2b9e5603271f00627e3d1eda3e97bf22e351a30a8b60c94dbd1feb1a2ad9d52bcf4a119b549c3f307787c2fa45eb03da251250b33e96945793a3e&tm=1757387428&sign=53611c233a2afb1e41267e34e7abff29
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2202/634/723/202206081044_1654656251447_H169_1080.jpg" group-title="熊猫", 熊猫频道01高清
https://mgtv.ottiptv.cc/mg/609158151.m3u8?token=5dbca7fc9fcf8335ca5ecaf937ad986d40348fca130703b6946ae1d04ded643322f0b4fba8e0bd195d3490c27d23bfd77a2320946ac25a9aacc84a2a4ea0589d982e8d529a5c3e64da01000a7f&tm=1757387428&sign=aed4168be7f40af190ca739628b1eaf3
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/200/699/202209211759_2200200699_H169_1080.jpg" group-title="熊猫", 熊猫频道1
https://mgtv.ottiptv.cc/mg/608933610.m3u8?token=84d56b9f8712f3a04a49b6ba4a17948ac59253400ecebce95ebbe987c5da689494da87e23d760ef3d0324a7063fb11e4f6c3c956c6b1de7f2e6ca4787f0a0b76c9cf1dc2ff47af523a100ca616&tm=1757387428&sign=6aa2f1a41902d0a0ddbe65d19d6d9fb1
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/200/717/202209211759_2200200717_H169_1080.jpg" group-title="熊猫", 熊猫频道2
https://mgtv.ottiptv.cc/mg/608933640.m3u8?token=b48def16d76d031a3fd87f24266f2f3ddfb8dfb48e1b735442a5bbab639e07485f9ecb5904038295fda8830366e36eb58ac7d0577c37dada40ad9dacc4cd49f9a739f61a46d7e8d85dbbe3e088&tm=1757387428&sign=862248f7e88311454d9668b9869faf8c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/200/738/202209211759_2200200738_H169_1080.jpg" group-title="熊猫", 熊猫频道3
https://mgtv.ottiptv.cc/mg/608934619.m3u8?token=b40193f531c02e96354670c8a705e8767858dabfe034866ccd203055f1a7ae4f1a5af3318c70ca56e1d200e241cdb3fba5035cdc6666ff18a83b8a88a607e8b5c0e974d275189d94f2b8099c7b&tm=1757387428&sign=d1c0d315f16caab4c1d02b87d3ba00ba
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/200/771/202209211800_2200200771_H169_1080.jpg" group-title="熊猫", 熊猫频道4
https://mgtv.ottiptv.cc/mg/608934721.m3u8?token=2e56c74f66d8dcbb593192ba9caee85f41fd95ba2058821ca743a78e86808a90b8213dd8339d8e80310632dc8dccc03a49b30a351c47a703f6804291ecef9f2c671b691475f700d0b6d1a03b36&tm=1757387428&sign=0ebe1af3601ee4004e87049d763a7349
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/200/791/202209211800_2200200791_H169_1080.jpg" group-title="熊猫", 熊猫频道5
https://mgtv.ottiptv.cc/mg/608935104.m3u8?token=2b4b3d8c49a19f11a360959eb85f2cdc52aaa53abce4a667785d2e532034cdbb202c1ee566e972279e186c505697c2fcd5cb06b0d7f52a1ef6daf1f7347364e622ae2c0d39cae225e8ba62a73f&tm=1757387428&sign=4626db88676612e7b5731eac4acdeda0
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/200/817/202209211800_2200200817_H169_1080.jpg" group-title="熊猫", 熊猫频道6
https://mgtv.ottiptv.cc/mg/608935797.m3u8?token=0abb5cb5cf3ec1466127e83fdcc078f5ad1b101879ddec415b8422c3358ac5745a4d9937a2941810bdbd8770c97763adb0acd70858079a97c2b0c588ec44143c1c91918a912134a36b9509e2ed&tm=1757387428&sign=8865e1faa8908906b934a0c92fdfc7be
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/192/831/202209211800_2200192831_H169_1080.jpg" group-title="熊猫", 熊猫频道7
https://mgtv.ottiptv.cc/mg/609169286.m3u8?token=78be3d1d65da3cee7d312896b2b2ec4c317441d6a2c3b7284f6280b25eccb3f12bc1657ae45e5026127ebdbdc30fdcff397272ca66e9951112e35b0b577c369f304ec54422dece456eed9c00cf&tm=1757387428&sign=2c6d3826f55d505a22eb2022d7af5a74
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/192/881/202209211800_2200192881_H169_1080.jpg" group-title="熊猫", 熊猫频道8
https://mgtv.ottiptv.cc/mg/609169287.m3u8?token=a14a8e0c4da92f6e3bbd4bb690676f62ec8e27b3d2976a7ab2ed55914e049b663d8378c24c33bffeced32b3a8d4a8293537a3e99c456705ce2d357c9578d6112714004a13021d0d468d9d01bee&tm=1757387428&sign=0eca142bb4fd89d64e27f3c3b499aa97
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/192/899/202209211800_2200192899_H169_1080.jpg" group-title="熊猫", 熊猫频道9
https://mgtv.ottiptv.cc/mg/609169226.m3u8?token=d11209c6600f0fc3da949441af551b201140ab82c94170d27b8ba4581afb5e0185f09360e1f33b49f691b6975c32d65dc0fcef3cbba620c55f25df378220aa0420e0c227e70b04bb05e58e3008&tm=1757387428&sign=76d48d0fd35731321247b6ab32afa321
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2200/192/937/202209211800_2200192937_H169_1080.jpg" group-title="熊猫", 熊猫频道10
https://mgtv.ottiptv.cc/mg/609169285.m3u8?token=6c60d7a0716483350c9753730f7d40dc7fe6be51fd46e2c0e435b8ab5a4e702ed3b08278b0a4391c45926d897f18cfb5c58cd9f30397ab9a068d2705f7555215ec2de32771a82cb23a8aa14141&tm=1757387428&sign=e3610d9fc2fc1f3bd211205a8ea199b5
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2206/172/388/202304101530_2206172388_H169_1080.jpg" group-title="少儿", 嘉佳卡通
https://mgtv.ottiptv.cc/mg/614952364.m3u8?token=f3b3db6218bf4884081799c401b699848ba2324d37ed1fbdfb07beaaf0300e609d5c0c4a9da0f50fb86a0c6eaddb2943653821695505c2c54eff6f44989d7f57353577a811c5aff092a7847e9b&tm=1757387428&sign=2503a188ca500a4f85ee2a20a0fb7d7c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/019/523/202506060000_1749138932995_H169_1080.jpg" group-title="纪实", 新动力量创一流
https://mgtv.ottiptv.cc/mg/713589837.m3u8?token=5e69a21ae1e906905d618f4f5f9749ba54a4c459beb813bbe012ec2473836abf230fd732c07d0e12c87358581b992fce9d1b73b4debfcd9a77a6e6a40e831ee2d4e6a59a5435f2600c4fbfd5e3&tm=1757387428&sign=c6a66e24333b16a0b3a5138ce3762592
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/613/479/202210281603_5102115888_HSJ720H.jpg" group-title="印象天下", 钱塘江
https://mgtv.ottiptv.cc/mg/647370520.m3u8?token=f618f44696611490d7134444870f81d4d78e4d8e9bd2ca5e5a762374e1a31836fbdbac6ab5df26d0b333135ef4f8cde0e8d716fdb789fad8e9ee47122f2cd5b9b071b4de832d2e2086db9a246c&tm=1757387428&sign=266400ab4b0c4cd9b60c0a9ae5819c87
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/462/658/202506201045_1750387453057_H169_1080.jpg" group-title="体育", 五环传奇
https://mgtv.ottiptv.cc/mg/707671890.m3u8?token=fe59eb72ba9e06eef13dadca0acf81d4717baec4b997ed64be8123d2279160469893a58896f432e66de3ce6424112a142dc9c4776467b57d1e11c8232ba98cc257a6b3116c1dfe55a550881cb8&tm=1757387428&sign=7dd31f7408bb300e6d2f2bd49361cc51
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/341/085/202308221004_1692669748086_H169_1080.jpg" group-title="体育", 掼蛋精英赛
https://mgtv.ottiptv.cc/mg/631354620.m3u8?token=eac8abc04bbec022cea378748157804fb94bc795b68c9445d4bca6d42ad3c8591b7e678ce20005f0107401e8f5856c2b52d4e44933e94f6e90dc6336568f71c59a3166fe309ac9fec27707ef72&tm=1757387428&sign=cd1383d4de1e46e0c025fb3a2308aefc
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/184/202508040856_5100132656_H169_1080.jpg" group-title="体育", 四海钓鱼
https://mgtv.ottiptv.cc/mg/637444975.m3u8?token=c1f0f79b4fc98cd4388973a7a985a381fda972f15f3a5c1910de15f4635811e3300befc701680f2099217a7f3ef68f133bc87ca23995fb3a79738abc8e35d3085f8cca72213315bce0edb80704&tm=1757387428&sign=71575a305b0f8395537a99967eaedaa4
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/751/211/202106111236_5102223687_201903181136295010914_HSJ720H.jpg" group-title="体育", 咪咕24小时体育台
https://mgtv.ottiptv.cc/mg/654102378.m3u8?token=1684d0e2fd92ea70ee26bb84384b682a661192bfed7508b1bc609fbeb3917ca875ccc24357e45ab3f9248704b202d936f59fb46a3b8903727df99792f83a2b1f387aaeb16273eb85f172d846ad&tm=1757387428&sign=590055f35fcd5400d9d109aa35343c38
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/150/202407181432_1721283643483_H169_1080.jpg" group-title="教育", CETV1
https://mgtv.ottiptv.cc/mg/923287154.m3u8?token=b6cfeb92a88f3b5959b00f561ab644a953f02f0f6988d2a8ff709fa3f09d6ac0aed5a1fcedf5252eea9ff3570949c36367cf1300cc16b9ccf5e15751c2060c9835ea276fb417b503556f6eeffd&tm=1757387429&sign=37ec95a242e986d6f7ed7c9416eda29c
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/152/202407181432_1721283773509_H169_1080.jpg" group-title="教育", CETV2
https://mgtv.ottiptv.cc/mg/923287211.m3u8?token=3153b8e52f5aa0d33cdf2d331f6b9d43ab75e82da01959aca0ed0e2993be8301514b119d80b03903c942515d4263cdfcc07e45d18e8bb2de16c5e7afb8ad9ebfc297a5cc16812773f6eeeffb65&tm=1757387429&sign=1bb7601be8d4429e2d4b9eee9b3c7501
#EXTINF:-1 tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/022/154/202407181433_1721283860085_H169_1080.jpg" group-title="教育", CETV4
https://mgtv.ottiptv.cc/mg/923287339.m3u8?token=3994396348adab20efd64405ac49758a14080aa64792adf05d092bd70cb96f0de796bd4d6152e0487b2c45001ed424eb9bbf2a64152b091ced804ca666c7a30299db68c6804b9b62d25f26bd77&tm=1757387429&sign=a42adf2fa997cfec64bbb049faa4b35c
#EXTINF:-1,tvg-id="cctv16" tvg-name="cctv16" tvg-logo="https://11.112114.xyz/logo/cctv16.png" group-title="央视",cctv16-MCP
https://mursor.ottiptv.cc/mcp/cctv16.m3u8?tm=1757392777&sign=c4e59f2e010e07b48845e9f148b1c0bf
#EXTINF:-1,tvg-id="cctv16" tvg-name="cctv16" tvg-logo="https://11.112114.xyz/logo/cctv16.png" group-title="央视",cctv16-MST
https://mursor.ottiptv.cc/mst/cctv16-2.m3u8?tm=1757392777&sign=3ac7fa00e4714a2a1dc0e2cd2bb2c398
#EXTINF:-1,tvg-id="cctv4k" tvg-name="cctv4k" tvg-logo="https://11.112114.xyz/logo/cctv4k.png" group-title="央视",cctv4k-MCP
https://mursor.ottiptv.cc/mcp/cctv4k.m3u8?tm=1757392777&sign=f49064647c09d42e92cb8bfc14345bbb
#EXTINF:-1,tvg-id="cctv4k" tvg-name="cctv4k" tvg-logo="https://11.112114.xyz/logo/cctv4k.png" group-title="央视",cctv4k-MXW
https://mursor.ottiptv.cc/mxw/cctv4k-2.m3u8?tm=1757392777&sign=e8e0369871b184c665c6e58276deb823
#EXTINF:-1,tvg-id="cctv8k" tvg-name="cctv8k" tvg-logo="https://11.112114.xyz/logo/cctv8k.png" group-title="央视",cctv8k-MCP
https://mursor.ottiptv.cc/mcp/cctv8k.m3u8?tm=1757392777&sign=4dba17f50e2e2da7a67aab31ddf8e7af
#EXTINF:-1,tvg-id="第一剧场" tvg-name="第一剧场" tvg-logo="https://11.112114.xyz/logo/第一剧场.png" group-title="央视",第一剧场-MCP
https://mursor.ottiptv.cc/mcp/dyjc.m3u8?tm=1757392777&sign=a2bb96d2bd20623942eac02dc6f82e2e
#EXTINF:-1,tvg-id="cctv8k" tvg-name="风云剧场" tvg-logo="https://11.112114.xyz/logo/风云剧场.png" group-title="央视",风云剧场-MCP
https://mursor.ottiptv.cc/mcp/fyjc.m3u8?tm=1757392777&sign=2aa0e416414d819cdd310023d66af554
#EXTINF:-1,tvg-id="怀旧剧场" tvg-name="怀旧剧场" tvg-logo="https://11.112114.xyz/logo/怀旧剧场.png" group-title="央视",怀旧剧场-MCP
https://mursor.ottiptv.cc/mcp/hjjc.m3u8?tm=1757392777&sign=34962fc4a8ebca5e340ca4abc4e8df76
#EXTINF:-1,tvg-id="CGTNALBY" tvg-name="CGTNALBY" tvg-logo="https://11.112114.xyz/logo/CGTNALBY.png" group-title="央视",cgtnar-MCP
https://mursor.ottiptv.cc/mcp/cgtnar.m3u8?tm=1757392777&sign=63e4c7a876ec79b40e8cdb765fbdbfcd
#EXTINF:-1,tvg-id="cgtndocumentary" tvg-name="cgtndocumentary" tvg-logo="https://11.112114.xyz/logo/cgtndocumentary.png" group-title="央视",cgtndoc-MCP
https://mursor.ottiptv.cc/mcp/cgtndoc.m3u8?tm=1757392777&sign=4fbe2921483b7a90077ef11e221a2645
#EXTINF:-1,tvg-id="CGTNEN" tvg-name="CGTNEN" tvg-logo="https://11.112114.xyz/logo/CGTN.png" group-title="央视",cgtn-MCP
https://mursor.ottiptv.cc/mcp/cgtn.m3u8?tm=1757392777&sign=193dc0af616809052e4d6e365a24ee6c
#EXTINF:-1,tvg-id="cgtnfrench" tvg-name="cgtnfrench" tvg-logo="https://11.112114.xyz/logo/cgtnfrench.png" group-title="央视",cgtnfr-MCP
https://mursor.ottiptv.cc/mcp/cgtnfr.m3u8?tm=1757392777&sign=6751a935d62ddc4d47a407442ff953ee
#EXTINF:-1,tvg-id="cgtnru" tvg-name="cgtnru" tvg-logo="https://11.112114.xyz/logo/CGTN1.png" group-title="央视",cgtnru-MCP
https://mursor.ottiptv.cc/mcp/cgtnru.m3u8?tm=1757392777&sign=22396335d5d644d99f0eafcc0a768428
#EXTINF:-1,tvg-id="cgtnsp" tvg-name="cgtnsp" tvg-logo="https://11.112114.xyz/logo/CGTN1.png" group-title="央视",cgtnsp-MCP
https://mursor.ottiptv.cc/mcp/cgtnsp.m3u8?tm=1757392777&sign=c01aa8d7ffe3e9f0e9ac082a8d16eeef
#EXTINF:-1,tvg-id="中国教育1台" tvg-name="中国教育1台" tvg-logo="https://11.112114.xyz/logo/中国教育1台.png" group-title="其他",中国教育电视台-MCP
https://mursor.ottiptv.cc/mcp/cetv1.m3u8?tm=1757392777&sign=685faf8f75e7cd9d1fe1cb8eda00b1e1
#EXTINF:-1,tvg-id="北京卫视" tvg-name="北京卫视" tvg-logo="https://11.112114.xyz/logo/北京卫视.png" group-title="卫视",北京卫视-MCP
https://mursor.ottiptv.cc/mcp/beijing.m3u8?tm=1757392777&sign=7b46d61831412b1404e698226731d36c
#EXTINF:-1,tvg-id="湖南卫视" tvg-name="湖南卫视" tvg-logo="https://11.112114.xyz/logo/湖南卫视.png" group-title="卫视",湖南卫视-MCP
https://mursor.ottiptv.cc/mcp/hunan.m3u8?tm=1757392777&sign=f1cca3604bbbb48c7473dc3d879f87d2
#EXTINF:-1,tvg-id="江苏卫视" tvg-name="江苏卫视" tvg-logo="https://11.112114.xyz/logo/江苏卫视.png" group-title="卫视",江苏卫视-MCP
https://mursor.ottiptv.cc/mcp/jiangsu.m3u8?tm=1757392777&sign=78cead7d5411a918c97f1d657d7d223d
#EXTINF:-1,tvg-id="东方卫视" tvg-name="东方卫视" tvg-logo="https://11.112114.xyz/logo/东方卫视.png" group-title="卫视",东方卫视-MCP
https://mursor.ottiptv.cc/mcp/dongfang.m3u8?tm=1757392777&sign=d9ad38ab43b5f809b1ee2dad9c3a5ca6
#EXTINF:-1,tvg-id="浙江卫视" tvg-name="浙江卫视" tvg-logo="https://11.112114.xyz/logo/浙江卫视.png" group-title="卫视",浙江卫视-MCP
https://mursor.ottiptv.cc/mcp/zhejiang.m3u8?tm=1757392777&sign=38e209d3ebe34c669bb3b7fffa627e87
#EXTINF:-1,tvg-id="湖北卫视" tvg-name="湖北卫视" tvg-logo="https://11.112114.xyz/logo/湖北卫视.png" group-title="卫视",湖北卫视-MCP
https://mursor.ottiptv.cc/mcp/hubei.m3u8?tm=1757392777&sign=2766ec732ffbc031a93a458848fa72ea
#EXTINF:-1,tvg-id="天津卫视" tvg-name="天津卫视" tvg-logo="https://11.112114.xyz/logo/天津卫视.png" group-title="卫视",天津卫视-MCP
https://mursor.ottiptv.cc/mcp/tianjing.m3u8?tm=1757392777&sign=ff4e7ad957334e26b9e900f207e29eb9
#EXTINF:-1,tvg-id="山东卫视" tvg-name="山东卫视" tvg-logo="https://11.112114.xyz/logo/山东卫视.png" group-title="卫视",山东卫视-MCP
https://mursor.ottiptv.cc/mcp/shandong.m3u8?tm=1757392777&sign=9f120959b0bbf4fad174ced59b5625e0
#EXTINF:-1,tvg-id="辽宁卫视" tvg-name="辽宁卫视" tvg-logo="https://11.112114.xyz/logo/辽宁卫视.png" group-title="卫视",辽宁卫视-MCP
https://mursor.ottiptv.cc/mcp/liaoning.m3u8?tm=1757392777&sign=347059ad78ecb9b79452205e32b3a58f
#EXTINF:-1,tvg-id="安徽卫视" tvg-name="安徽卫视" tvg-logo="https://11.112114.xyz/logo/安徽卫视.png" group-title="卫视",安徽卫视-MCP
https://mursor.ottiptv.cc/mcp/anhui.m3u8?tm=1757392777&sign=29948b76ecc62007fc0b10518d2478ae
#EXTINF:-1,tvg-id="黑龙江卫视" tvg-name="黑龙江卫视" tvg-logo="https://11.112114.xyz/logo/黑龙江卫视.png" group-title="卫视",黑龙江卫视-MCP
https://mursor.ottiptv.cc/mcp/heilongjiang.m3u8?tm=1757392777&sign=c585af4740455b5f35d6a69bfa29ca81
#EXTINF:-1,tvg-id="贵州卫视" tvg-name="贵州卫视" tvg-logo="https://11.112114.xyz/logo/贵州卫视.png" group-title="卫视",贵州卫视-MCP
https://mursor.ottiptv.cc/mcp/guizhou.m3u8?tm=1757392777&sign=708456aab52275889b9dda0f38f2124d
#EXTINF:-1,tvg-id="东南卫视" tvg-name="东南卫视" tvg-logo="https://11.112114.xyz/logo/东南卫视.png" group-title="卫视",东南卫视-MCP
https://mursor.ottiptv.cc/mcp/dongnan.m3u8?tm=1757392777&sign=806c3e7086db971614b06255abb89fcc
#EXTINF:-1,tvg-id="重庆卫视" tvg-name="重庆卫视" tvg-logo="https://11.112114.xyz/logo/重庆卫视.png" group-title="卫视",重庆卫视-MCP
https://mursor.ottiptv.cc/mcp/chongqing.m3u8?tm=1757392777&sign=2066bf3e7b38d203424a40dad5e567c9
#EXTINF:-1,tvg-id="江西卫视" tvg-name="江西卫视" tvg-logo="https://11.112114.xyz/logo/江西卫视.png" group-title="卫视",江西卫视-MCP
https://mursor.ottiptv.cc/mcp/jiangxi.m3u8?tm=1757392777&sign=694d35296742bee9e246b6d71ffdab58
#EXTINF:-1,tvg-id="广东卫视" tvg-name="广东卫视" tvg-logo="https://11.112114.xyz/logo/广东卫视.png" group-title="卫视",广东卫视-MCP
https://mursor.ottiptv.cc/mcp/guangdong.m3u8?tm=1757392777&sign=d16bb6116f5ae3be8482653c95e6c058
#EXTINF:-1,tvg-id="河北卫视" tvg-name="河北卫视" tvg-logo="https://11.112114.xyz/logo/河北卫视.png" group-title="卫视",河北卫视-MCP
https://mursor.ottiptv.cc/mcp/hebei.m3u8?tm=1757392777&sign=db924b413cfb9e9c1269ceefd6692915
#EXTINF:-1,tvg-id="深圳卫视" tvg-name="深圳卫视" tvg-logo="https://11.112114.xyz/logo/深圳卫视.png" group-title="卫视",深圳卫视-MCP
https://mursor.ottiptv.cc/mcp/shenzheng.m3u8?tm=1757392777&sign=a0d7c23e9a4734cca109743e7589f9fd
#EXTINF:-1,tvg-id="吉林卫视" tvg-name="吉林卫视" tvg-logo="https://11.112114.xyz/logo/吉林卫视.png" group-title="卫视",吉林卫视-MCP
https://mursor.ottiptv.cc/mcp/jiling.m3u8?tm=1757392777&sign=ac3a0852dcd90c6894622a92913709a8
#EXTINF:-1,tvg-id="河南卫视" tvg-name="河南卫视" tvg-logo="https://11.112114.xyz/logo/河南卫视.png" group-title="卫视",河南卫视-MCP
https://mursor.ottiptv.cc/mcp/henan.m3u8?tm=1757392777&sign=c48fb49e4551f577f7d1f34db356d51d
#EXTINF:-1,tvg-id="四川卫视" tvg-name="四川卫视" tvg-logo="https://11.112114.xyz/logo/四川卫视.png" group-title="卫视",四川卫视-MCP
https://mursor.ottiptv.cc/mcp/sichuan.m3u8?tm=1757392777&sign=95deafa2f25ef787c9dae39c0e1a66cd
#EXTINF:-1,tvg-id="广西卫视" tvg-name="广西卫视" tvg-logo="https://11.112114.xyz/logo/广西卫视.png" group-title="卫视",广西卫视-MCP
https://mursor.ottiptv.cc/mcp/guangxi.m3u8?tm=1757392777&sign=fdc60dccd6a711f8f97091a5141e048c
#EXTINF:-1,tvg-id="陕西卫视" tvg-name="陕西卫视" tvg-logo="https://11.112114.xyz/logo/陕西卫视.png" group-title="卫视",陕西卫视-MCP
https://mursor.ottiptv.cc/mcp/shanxiws.m3u8?tm=1757392777&sign=877bd05473e7e99d574ebd2f57f358ff
#EXTINF:-1,tvg-id="山西卫视" tvg-name="山西卫视" tvg-logo="https://11.112114.xyz/logo/山西卫视.png" group-title="卫视",山西卫视-MCP
https://mursor.ottiptv.cc/mcp/shanxi.m3u8?tm=1757392777&sign=58fab0ef927bec086b35a6638f6d3061
#EXTINF:-1,tvg-id="内蒙古卫视" tvg-name="内蒙古卫视" tvg-logo="https://11.112114.xyz/logo/内蒙古卫视.png" group-title="卫视",内蒙古卫视-MCP
https://mursor.ottiptv.cc/mcp/neimenggu.m3u8?tm=1757392777&sign=a53404efbc6b298ac4301d1ab1f3e493
#EXTINF:-1,tvg-id="青海卫视" tvg-name="青海卫视" tvg-logo="https://11.112114.xyz/logo/青海卫视.png" group-title="卫视",青海卫视-MCP
https://mursor.ottiptv.cc/mcp/qinghai.m3u8?tm=1757392777&sign=f332e54d33c4bdefea8c63a788031ff8
#EXTINF:-1,tvg-id="海南卫视" tvg-name="海南卫视" tvg-logo="https://11.112114.xyz/logo/海南卫视.png" group-title="卫视",海南卫视-MCP
https://mursor.ottiptv.cc/mcp/hainan.m3u8?tm=1757392777&sign=0b4648dfefa5d31e93fd1fec84d2aabc
#EXTINF:-1,tvg-id="宁夏卫视" tvg-name="宁夏卫视" tvg-logo="https://11.112114.xyz/logo/宁夏卫视.png" group-title="卫视",宁夏卫视-MCP
https://mursor.ottiptv.cc/mcp/ningxia.m3u8?tm=1757392777&sign=8994283c8cd930ce829f6c7a8349aed9
#EXTINF:-1,tvg-id="西藏卫视" tvg-name="西藏卫视" tvg-logo="https://11.112114.xyz/logo/西藏卫视.png" group-title="卫视",西藏卫视-MCP
https://mursor.ottiptv.cc/mcp/xizang.m3u8?tm=1757392777&sign=ef77c9fd2f4e0b6c9b5aba5f2472347e
#EXTINF:-1,tvg-id="新疆卫视" tvg-name="新疆卫视" tvg-logo="https://11.112114.xyz/logo/新疆卫视.png" group-title="卫视",新疆卫视-MCP
https://mursor.ottiptv.cc/mcp/xinjiang.m3u8?tm=1757392777&sign=d9e1e5793573d920d44143233323abc6
#EXTINF:-1,tvg-id="甘肃卫视" tvg-name="甘肃卫视" tvg-logo="https://11.112114.xyz/logo/甘肃卫视.png" group-title="卫视",甘肃卫视-MCP
https://mursor.ottiptv.cc/mcp/gansu.m3u8?tm=1757392777&sign=9d6720853e1d390ba3b2f1655bb72a00
#EXTINF:-1,tvg-id="云南卫视" tvg-name="云南卫视" tvg-logo="https://11.112114.xyz/logo/云南卫视.png" group-title="卫视",云南卫视-MCP
https://mursor.ottiptv.cc/mcp/yunnan.m3u8?tm=1757392777&sign=06ec0c941192fe8649a7fae5f12b241b
#EXTINF:-1,tvg-id="兵团卫视" tvg-name="兵团卫视" tvg-logo="https://11.112114.xyz/logo/兵团卫视.png" group-title="卫视",兵团卫视-MCP
https://mursor.ottiptv.cc/mcp/bintuan.m3u8?tm=1757392777&sign=4eba54cb4c16ff7faa84a40bb912fff8

View File

@@ -70,6 +70,31 @@
"type": "list"
}
},
{
"key": "qingfeng",
"name": "♨醉挽清风┃4K纯净",
"type": 4,
"api": "http://我不是.摸鱼儿.com/api/yuyutx.php",
"searchable": 1,
"quickSearch": 1,
"changeable": 0
},
{
"key": "鲸鱼",
"name": "💯鲸鱼资源┃4K弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"jar": "./jars/config.jar",
"ext": {
"url": "",
"site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json",
"dataKey": "AAdgrdghjfgswerA",
"dataIv": "AAdgrdghjfgswerA",
"deviceId": "",
"version": ""
}
},
{
"key": "玩偶哥哥",
"name": "♨玩偶备用┃4K弹幕",

View File

@@ -1,5 +1,5 @@
{
"wallpaper": "https://tv.nxog.top/m/t/",
"wallpaper": "https://xn--tpo-mf3g9f.u.xn--dkw.xn--6qq986b3xl/m/t/",
"logo": "https://alicliimg.clewm.net/342/790/68790342/17369906896774bd3d1d8ba1877dea5d967a137aa23d91736990672.gif",
"spider": "./spider.jar",
"lives": [
@@ -8,12 +8,6 @@
"type": 0,
"url": "./lives/tv.txt",
"epg": "http://cdn.1678520.xyz/epg/?ch={name}&date={date}"
},
{
"name": "tv备",
"type": 0,
"url": "./lives/tv备.txt",
"epg": "http://cdn.1678520.xyz/epg/?ch={name}&date={date}"
}
],
"sites": [
@@ -26,13 +20,13 @@
},
{
"key": "豆瓣1",
"name": "📢公告❤更新:9/12❤",
"name": "📢公告❤更新:9/15❤",
"type": 3,
"api": "csp_Notice",
"searchable": 0,
"changeable": 0,
"jar": "./jars/豆瓣1.jar",
"ext": "https://tv.nxog.top/m/公告.php?b=tv"
"ext": "https://xn--tpo-mf3g9f.u.xn--dkw.xn--6qq986b3xl/m/公告.php?b=tv"
},
{
"key": "csp_woog",
@@ -49,7 +43,7 @@
],
"url_key": "woog",
"threadinfo": {
"chunksize": 281,
"chunksize": 231,
"threads": 16
}
}
@@ -77,7 +71,7 @@
],
"url_key": "UC",
"threadinfo": {
"chunksize": 261,
"chunksize": 282,
"threads": 60
}
}
@@ -93,21 +87,21 @@
"jar": "./jars/csp_欧歌123.jar"
},
{
"key": "csp_woog2",
"key": "欧哥",
"name": "❤欧歌4K弹幕",
"type": 3,
"changeable": "0",
"api": "csp_Duopan",
"filterable": 1,
"jar": "./jars/csp_woog2.jar",
"jar": "./jars/欧哥.jar",
"ext": {
"site_urls": [
"https://ogkk.nxog.fun",
"https://ogkk.nxog.eu.org"
],
"url_key": "woog2",
"url_key": "欧哥",
"threadinfo": {
"chunksize": 258,
"chunksize": 257,
"threads": 16
}
}
@@ -129,7 +123,7 @@
"name": "💡荐片|影视",
"api": "csp_Jianpian",
"type": 3,
"ext": "https://ij1men.slsw6.com"
"ext": "https://api.ztcgi.com"
},
{
"key": "移动",
@@ -213,10 +207,10 @@
"ext": "https://www.wwgz.cn"
},
{
"key": "鸭梨影视",
"name": "💡鸭梨|影视",
"key": "奇优影视",
"name": "💡奇优|影视",
"type": 3,
"api": "csp_KmeiJu"
"api": "csp_Qiyou"
},
{
"key": "骚火影视",
@@ -242,6 +236,33 @@
"quickSearch": 0,
"filterable": 0
},
{
"key": "柠檬",
"name": "💡柠檬|影视",
"type": 3,
"api": "csp_Nmvod",
"playerType": 2,
"jar": "./jars/柠檬.jar",
"ext": "7lj763gg402i7942503g839jg74h8h88highi40799jh6i6k454419l0l5184k0g549h0kg2i01i838i2h42g891lgg1"
},
{
"key": "云云",
"name": "💡云云|影视",
"type": 3,
"api": "csp_Qiji",
"playerType": 2,
"jar": "./jars/柠檬.jar",
"ext": "7lj763gg402i79425h2384j4g949j899hll9990i9kjl6l740h1342hjlg1848401g8610h9995i998j351gl38kklkj1hkhll757010k7hji6h377ih37k060g35161jhl3i5h0l2702g7299452l4297k5697g5390lk6935k2i9g48l8j2kh27l1g014k7j9475g8"
},
{
"key": "搜索",
"name": "🐢聚搜|影视",
"type": 3,
"api": "csp_qiao2",
"playerType": 2,
"jar": "./jars/柠檬.jar",
"ext": "7lj763gg402i79425739i7jghj118797l4hj840gi18633331l4708g2h7145403549g44l8ii56i187681hkjj3hhgh1ih3l32j250lk1k786lj20j468hk3hli4l46gig4i3g7g2722328j0136h01i7g5183k22k7gg3i72hk81gl8k9839kl7i0707"
},
{
"key": "爱看",
"name": "👑爱看|弹幕",
@@ -496,38 +517,6 @@
"ua": ""
}
},
{
"key": "狂人",
"name": "👑狂人丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.zjkrmv.vip",
"site": "",
"dataKey": "vXeyuJFqTKqWUtWU",
"dataIv": "vXeyuJFqTKqWUtWU",
"deviceId": "",
"version": "",
"ua": ""
}
},
{
"key": "追番",
"name": "👑追番丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "",
"site": "https://ysappapi.oss-cn-shenzhen.aliyuncs.com/getapi.txt",
"dataKey": "A1akVPQmnnE4Fz9Z",
"dataIv": "A1akVPQmnnE4Fz9Z",
"deviceId": "",
"version": "",
"ua": ""
}
},
{
"key": "五八",
"name": "👑五八丨弹幕",
@@ -545,19 +534,17 @@
}
},
{
"key": "万能",
"name": "👑万能丨弹幕",
"key": "光影",
"name": "👑光影丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://wnvod.cc",
"site": "",
"dataKey": "5uBvur6znNUmE3zb",
"dataIv": "5uBvur6znNUmE3zb",
"url": "https://www.guangyingmi.com",
"dataKey": "230fnsodfsdhfon2",
"dataIv": "230fnsodfsdhfon2",
"deviceId": "",
"version": "",
"ua": ""
"version": ""
}
},
{
@@ -1004,22 +991,6 @@
"分类url": "https://4k4k.live/;;!"
}
},
{
"key": "巧技",
"name": "🐢聚搜┃搜索",
"type": 3,
"api": "csp_qiao2",
"playerType": 2,
"jar": "./jars/巧技.jar",
"ext": "7lj763gg402i79425739i7jghj118797l4hj840gi18633331l4708g2h7145403549g44l8ii56i187681hkjj3hhgh1ih3l32j250lk1k786lj20j468hk3hli4l46gig4i3g7g2722328j0136h01i7g5183k22k7gg3i72hk81gl8k9839kl7i0707"
},
{
"key": "采集之王",
"name": "🐢采集┃搜索",
"type": 3,
"api": "./api/drpy2.min.js",
"ext": "./js/采集之王.js?type=url&params=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/json/采集静态.json$1$1"
},
{
"key": "哔️软件",
"name": "🅰️软件┃哔哩",
@@ -1486,42 +1457,6 @@
},
"ext": "./js/88看球.js"
},
{
"key": "猎手影视",
"name": "🧡猎手PY影视",
"type": 3,
"api": "./api/猎手影视.py",
"searchable": 1,
"changeable": 1,
"quickSearch": 1,
"filterable": 1,
"playerType": 2
},
{
"key": "金牌影视PY",
"name": "🧡金牌PY影视",
"type": 3,
"api": "./api/金牌.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"playerType": 2,
"ext": {
"site": "https://www.hkybqufgh.com,https://www.sizhengxt.com,https://0996zp.com,https://9zhoukj.com/,https://www.sizhengxt.com,https://www.tjrongze.com,https://www.jiabaide.cn,https://cqzuoer.com"
}
},
{
"key": "网络直播",
"name": "🧡网络|直播",
"type": 3,
"api": "./api/WLZB.py"
},
{
"key": "哔哩直播",
"name": "🧡哔哩|直播",
"type": 3,
"api": "./api/BLZB.py"
},
{
"key": "本地",
"name": "🌸本地|视频",
@@ -1557,7 +1492,7 @@
"key": "豆瓣3",
"name": "📢接口软件永远免费",
"type": 3,
"api": "csp_DouBan",
"api": "csp_Douban",
"searchable": 0
},
{
@@ -1774,8 +1709,6 @@
"imgo",
"芒果TV",
"芒果TV",
"qiqi",
"kuying-qq",
"bilibili",
"哔哩",
"哔哩哔哩"

View File

@@ -1,314 +0,0 @@
# coding=utf-8
# !/usr/bin/python
"""
作者 丢丢喵 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
====================Diudiumiao====================
"""
from Crypto.Util.Padding import unpad
from Crypto.Util.Padding import pad
from urllib.parse import unquote
from Crypto.Cipher import ARC4
from urllib.parse import quote
from base.spider import Spider
from Crypto.Cipher import AES
from datetime import datetime
from bs4 import BeautifulSoup
from base64 import b64decode
import urllib.request
import urllib.parse
import datetime
import binascii
import requests
import base64
import json
import time
import sys
import re
import os
sys.path.append('..')
xurl = "https://search.bilibili.com"
xurl1 = "https://api.live.bilibili.com"
headerx = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
}
class Spider(Spider):
global xurl
global xurl1
global headerx
def getName(self):
return "首页"
def init(self, extend):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
if pl == 3:
plx = []
while True:
start_index = text.find(start_str)
if start_index == -1:
break
end_index = text.find(end_str, start_index + len(start_str))
if end_index == -1:
break
middle_text = text[start_index + len(start_str):end_index]
plx.append(middle_text)
text = text.replace(start_str + middle_text + end_str, '')
if len(plx) > 0:
purl = ''
for i in range(len(plx)):
matches = re.findall(start_index1, plx[i])
output = ""
for match in matches:
match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
if match3:
number = match3.group(1)
else:
number = 0
if 'http' not in match[0]:
output += f"#{match[1]}${number}{xurl}{match[0]}"
else:
output += f"#{match[1]}${number}{match[0]}"
output = output[1:]
purl = purl + output + "$$$"
purl = purl[:-3]
return purl
else:
return ""
else:
start_index = text.find(start_str)
if start_index == -1:
return ""
end_index = text.find(end_str, start_index + len(start_str))
if end_index == -1:
return ""
if pl == 0:
middle_text = text[start_index + len(start_str):end_index]
return middle_text.replace("\\", "")
if pl == 1:
middle_text = text[start_index + len(start_str):end_index]
matches = re.findall(start_index1, middle_text)
if matches:
jg = ' '.join(matches)
return jg
if pl == 2:
middle_text = text[start_index + len(start_str):end_index]
matches = re.findall(start_index1, middle_text)
if matches:
new_list = [f'{item}' for item in matches]
jg = '$$$'.join(new_list)
return jg
def homeContent(self, filter):
result = {}
result = {"class": [{"type_id": "", "type_name": "舞蹈"},
{"type_id": "音乐", "type_name": "音乐"},
{"type_id": "手游", "type_name": "手游"},
{"type_id": "网游", "type_name": "网游"},
{"type_id": "单机游戏", "type_name": "单机游戏"},
{"type_id": "虚拟主播", "type_name": "虚拟主播"},
{"type_id": "电台", "type_name": "电台"},
{"type_id": "体育", "type_name": "体育"},
{"type_id": "聊天", "type_name": "聊天"},
{"type_id": "娱乐", "type_name": "娱乐"},
{"type_id": "电影", "type_name": "影视"},
{"type_id": "新闻", "type_name": "新闻"}]
}
return result
def homeVideoContent(self):
pass
def categoryContent(self, cid, pg, filter, ext):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/live?keyword={cid}&page={str(page)}'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('div', class_="video-list-item")
for vod in soups:
names = vod.find('h3', class_="bili-live-card__info--tit")
name = names.text.strip().replace('直播中', '')
id = names.find('a')['href']
id = self.extract_middle_text(id, 'bilibili.com/', '?', 0)
pic = vod.find('img')['src']
if 'http' not in pic:
pic = "https:" + pic
remarks = vod.find('a', class_="bili-live-card__info--uname")
remark = remarks.text.strip()
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": remark
}
videos.append(video)
result = {'list': videos}
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def detailContent(self, ids):
did = ids[0]
result = {}
videos = []
xianlu = ''
bofang = ''
url = f'{xurl1}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={did}&platform=web&protocol=0,1&format=0,1,2&codec=0,1'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
data = detail.json()
content = '欢迎观看哔哩直播'
setup = data['data']['playurl_info']['playurl']['stream']
nam = 0
for vod in setup:
try:
host = vod['format'][nam]['codec'][0]['url_info'][1]['host']
except (KeyError, IndexError):
continue
base = vod['format'][nam]['codec'][0]['base_url']
extra = vod['format'][nam]['codec'][0]['url_info'][1]['extra']
id = host + base + extra
nam = nam + 1
namc = f"{nam}号线路"
bofang = bofang + namc + '$' + id + '#'
bofang = bofang[:-1]
xianlu = '哔哩专线'
videos.append({
"vod_id": did,
"vod_content": content,
"vod_play_from": xianlu,
"vod_play_url": bofang
})
result['list'] = videos
return result
def playerContent(self, flag, id, vipFlags):
result = {}
result["parse"] = 0
result["playUrl"] = ''
result["url"] = id
result["header"] = headerx
return result
def searchContentPage(self, key, quick, pg):
result = {}
videos = []
if pg:
page = int(pg)
else:
page = 1
url = f'{xurl}/live?keyword={key}&page={str(page)}'
detail = requests.get(url=url, headers=headerx)
detail.encoding = "utf-8"
res = detail.text
doc = BeautifulSoup(res, "lxml")
soups = doc.find_all('div', class_="video-list-item")
for vod in soups:
names = vod.find('h3', class_="bili-live-card__info--tit")
name = names.text.strip().replace('直播中', '')
id = names.find('a')['href']
id = self.extract_middle_text(id, 'bilibili.com/', '?', 0)
pic = vod.find('img')['src']
if 'http' not in pic:
pic = "https:" + pic
remarks = vod.find('a', class_="bili-live-card__info--uname")
remark = remarks.text.strip()
video = {
"vod_id": id,
"vod_name": name,
"vod_pic": pic,
"vod_remarks": remark
}
videos.append(video)
result['list'] = videos
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def searchContent(self, key, quick, pg="1"):
return self.searchContentPage(key, quick, '1')
def localProxy(self, params):
if params['type'] == "m3u8":
return self.proxyM3u8(params)
elif params['type'] == "media":
return self.proxyMedia(params)
elif params['type'] == "ts":
return self.proxyTs(params)
return None

View File

@@ -1,768 +0,0 @@
# -*- coding: utf-8 -*-
# by @嗷呜
import json
import re
import sys
import time
from base64 import b64decode, b64encode
from urllib.parse import parse_qs
import requests
from pyquery import PyQuery as pq
sys.path.append('..')
from base.spider import Spider
from concurrent.futures import ThreadPoolExecutor
class Spider(Spider):
def init(self, extend=""):
tid = 'douyin'
headers = self.gethr(0, tid)
response = requests.head(self.hosts[tid], headers=headers)
ttwid = response.cookies.get('ttwid')
headers.update({
'authority': self.hosts[tid].split('//')[-1],
'cookie': f'ttwid={ttwid}' if ttwid else ''
})
self.dyheaders = headers
pass
def getName(self):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
headers = [
{
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"
},
{
"User-Agent": "Dart/3.4 (dart:io)"
}
]
excepturl = 'https://www.baidu.com'
hosts = {
"huya": ["https://www.huya.com","https://mp.huya.com"],
"douyin": "https://live.douyin.com",
"douyu": "https://www.douyu.com",
"wangyi": "https://cc.163.com",
"bili": ["https://api.live.bilibili.com", "https://api.bilibili.com"]
}
referers = {
"huya": "https://live.cdn.huya.com",
"douyin": "https://live.douyin.com",
"douyu": "https://m.douyu.com",
"bili": "https://live.bilibili.com"
}
playheaders = {
"wangyi": {
"User-Agent": "ExoPlayer",
"Connection": "Keep-Alive",
"Icy-MetaData": "1"
},
"bili": {
'Accept': '*/*',
'Icy-MetaData': '1',
'referer': referers['bili'],
'user-agent': headers[0]['User-Agent']
},
'douyin': {
'User-Agent': 'libmpv',
'Icy-MetaData': '1'
},
'huya': {
'User-Agent': 'ExoPlayer',
'Connection': 'Keep-Alive',
'Icy-MetaData': '1'
},
'douyu': {
'User-Agent': 'libmpv',
'Icy-MetaData': '1'
}
}
def process_bili(self):
try:
self.blfdata = self.fetch(
f'{self.hosts["bili"][0]}/room/v1/Area/getList?need_entrance=1&parent_id=0',
headers=self.gethr(0, 'bili')
).json()
return ('bili', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['name'], 'v': str(i['id'])}
for i in self.blfdata['data']]}])
except Exception as e:
print(f"bili处理错误: {e}")
return 'bili', None
def process_douyin(self):
try:
data = self.getpq(self.hosts['douyin'], headers=self.dyheaders)('script')
for i in data.items():
if 'categoryData' in i.text():
content = i.text()
start = content.find('{')
end = content.rfind('}') + 1
if start != -1 and end != -1:
json_str = content[start:end]
json_str = json_str.replace('\\"', '"')
try:
self.dyifdata = json.loads(json_str)
return ('douyin', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['partition']['title'],
'v': f"{i['partition']['id_str']}@@{i['partition']['title']}"}
for i in self.dyifdata['categoryData']]}])
except json.JSONDecodeError as e:
print(f"douyin解析错误: {e}")
return 'douyin', None
except Exception as e:
print(f"douyin请求或处理错误: {e}")
return 'douyin', None
def process_douyu(self):
try:
self.dyufdata = self.fetch(
f'{self.referers["douyu"]}/api/cate/list',
headers=self.headers[1]
).json()
return ('douyu', [{'key': 'cate', 'name': '分类',
'value': [{'n': i['cate1Name'], 'v': str(i['cate1Id'])}
for i in self.dyufdata['data']['cate1Info']]}])
except Exception as e:
print(f"douyu错误: {e}")
return 'douyu', None
def homeContent(self, filter):
result = {}
cateManual = {
"虎牙": "huya",
"哔哩": "bili",
"抖音": "douyin",
"斗鱼": "douyu",
"网易": "wangyi"
}
classes = []
filters = {
'huya': [{'key': 'cate', 'name': '分类',
'value': [{'n': '网游', 'v': '1'}, {'n': '单机', 'v': '2'},
{'n': '娱乐', 'v': '8'}, {'n': '手游', 'v': '3'}]}]
}
with ThreadPoolExecutor(max_workers=3) as executor:
futures = {
executor.submit(self.process_bili): 'bili',
executor.submit(self.process_douyin): 'douyin',
executor.submit(self.process_douyu): 'douyu'
}
for future in futures:
platform, filter_data = future.result()
if filter_data:
filters[platform] = filter_data
for k in cateManual:
classes.append({
'type_name': k,
'type_id': cateManual[k]
})
result['class'] = classes
result['filters'] = filters
return result
def homeVideoContent(self):
pass
def categoryContent(self, tid, pg, filter, extend):
vdata = []
result = {}
pagecount = 9999
result['page'] = pg
result['limit'] = 90
result['total'] = 999999
if tid == 'wangyi':
vdata, pagecount = self.wyccContent(tid, pg, filter, extend, vdata)
elif 'bili' in tid:
vdata, pagecount = self.biliContent(tid, pg, filter, extend, vdata)
elif 'huya' in tid:
vdata, pagecount = self.huyaContent(tid, pg, filter, extend, vdata)
elif 'douyin' in tid:
vdata, pagecount = self.douyinContent(tid, pg, filter, extend, vdata)
elif 'douyu' in tid:
vdata, pagecount = self.douyuContent(tid, pg, filter, extend, vdata)
result['list'] = vdata
result['pagecount'] = pagecount
return result
def wyccContent(self, tid, pg, filter, extend, vdata):
params = {
'format': 'json',
'start': (int(pg) - 1) * 20,
'size': '20',
}
response = self.fetch(f'{self.hosts[tid]}/api/category/live/', params=params, headers=self.headers[0]).json()
for i in response['lives']:
if i.get('cuteid'):
bvdata = self.buildvod(
vod_id=f"{tid}@@{i['cuteid']}",
vod_name=i.get('title'),
vod_pic=i.get('cover'),
vod_remarks=i.get('nickname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(bvdata)
return vdata, 9999
def biliContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
for i in self.blfdata['data']:
if str(i['id']) == extend['cate']:
for j in i['list']:
v = self.buildvod(
vod_id=f"click_{tid}@@{i['id']}@@{j['id']}",
vod_name=j.get('name'),
vod_pic=j.get('pic'),
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/xlive/web-interface/v1/second/getListByArea?platform=web&sort=online&page_size=30&page={pg}'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/xlive/web-interface/v1/second/getList?platform=web&parent_area_id={ids[1]}&area_id={ids[-1]}&sort_type=&page={pg}'
data = self.fetch(f'{self.hosts[tid][0]}{path}', headers=self.gethr(0, tid)).json()
for i in data['data']['list']:
if i.get('roomid'):
data = self.buildvod(
f"{tid}@@{i['roomid']}",
i.get('title'),
i.get('cover'),
i.get('watched_show', {}).get('text_large'),
0,
i.get('uname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(data)
return vdata, 9999
def huyaContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
id = extend.get('cate')
data = self.fetch(f'{self.referers[tid]}/liveconfig/game/bussLive?bussType={id}',
headers=self.headers[1]).json()
for i in data['data']:
v = self.buildvod(
vod_id=f"click_{tid}@@{int(i['gid'])}",
vod_name=i.get('gameFullName'),
vod_pic=f'https://huyaimg.msstatic.com/cdnimage/game/{int(i["gid"])}-MS.jpg',
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
gid = ''
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
gid = f'&gameId={ids[1]}'
data = self.fetch(f'{self.hosts[tid][0]}/cache.php?m=LiveList&do=getLiveListByPage&tagAll=0{gid}&page={pg}',
headers=self.headers[1]).json()
for i in data['data']['datas']:
if i.get('profileRoom'):
v = self.buildvod(
f"{tid}@@{i['profileRoom']}",
i.get('introduction'),
i.get('screenshot'),
str(int(i.get('totalCount', '1')) / 10000) + '',
0,
i.get('nick'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def douyinContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
ids = extend.get('cate').split('@@')
for i in self.dyifdata['categoryData']:
c = i['partition']
if c['id_str'] == ids[0] and c['title'] == ids[1]:
vlist = i['sub_partition'].copy()
vlist.insert(0, {'partition': c})
for j in vlist:
j = j['partition']
v = self.buildvod(
vod_id=f"click_{tid}@@{j['id_str']}@@{j['type']}",
vod_name=j.get('title'),
vod_pic='https://p3-pc-weboff.byteimg.com/tos-cn-i-9r5gewecjs/pwa_v3/512x512-1.png',
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/webcast/web/partition/detail/room/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&count=15&offset={(int(pg) - 1) * 15}&partition=720&partition_type=1'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/webcast/web/partition/detail/room/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&count=15&offset={(int(pg) - 1) * 15}&partition={ids[1]}&partition_type={ids[-1]}&req_from=2'
data = self.fetch(f'{self.hosts[tid]}{path}', headers=self.dyheaders).json()
for i in data['data']['data']:
v = self.buildvod(
vod_id=f"{tid}@@{i['web_rid']}",
vod_name=i['room'].get('title'),
vod_pic=i['room']['cover'].get('url_list')[0],
vod_year=i.get('user_count_str'),
vod_remarks=i['room']['owner'].get('nickname'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def douyuContent(self, tid, pg, filter, extend, vdata):
if extend.get('cate') and pg == '1' and 'click' not in tid:
for i in self.dyufdata['data']['cate2Info']:
if str(i['cate1Id']) == extend['cate']:
v = self.buildvod(
vod_id=f"click_{tid}@@{i['cate2Id']}",
vod_name=i.get('cate2Name'),
vod_pic=i.get('icon'),
vod_remarks=i.get('count'),
vod_tag=1,
style={"type": "oval", "ratio": 1}
)
vdata.append(v)
return vdata, 1
else:
path = f'/japi/weblist/apinc/allpage/6/{pg}'
if 'click' in tid:
ids = tid.split('_')[1].split('@@')
tid = ids[0]
path = f'/gapi/rkc/directory/mixList/2_{ids[1]}/{pg}'
url = f'{self.hosts[tid]}{path}'
data = self.fetch(url, headers=self.headers[1]).json()
for i in data['data']['rl']:
v = self.buildvod(
vod_id=f"{tid}@@{i['rid']}",
vod_name=i.get('rn'),
vod_pic=i.get('rs16'),
vod_year=str(int(i.get('ol', 1)) / 10000) + '',
vod_remarks=i.get('nn'),
style={"type": "rect", "ratio": 1.33}
)
vdata.append(v)
return vdata, 9999
def detailContent(self, ids):
ids = ids[0].split('@@')
if ids[0] == 'wangyi':
vod = self.wyccDetail(ids)
elif ids[0] == 'bili':
vod = self.biliDetail(ids)
elif ids[0] == 'huya':
vod = self.huyaDetail(ids)
elif ids[0] == 'douyin':
vod = self.douyinDetail(ids)
elif ids[0] == 'douyu':
vod = self.douyuDetail(ids)
return {'list': [vod]}
def wyccDetail(self, ids):
try:
vdata = self.getpq(f'{self.hosts[ids[0]]}/{ids[1]}', self.headers[0])('script').eq(-1).text()
def get_quality_name(vbr):
if vbr <= 600:
return "标清"
elif vbr <= 1000:
return "高清"
elif vbr <= 2000:
return "超清"
else:
return "蓝光"
data = json.loads(vdata)['props']['pageProps']['roomInfoInitData']
name = data['live'].get('title', ids[0])
vod = self.buildvod(vod_name=data.get('keywords_suffix'), vod_remarks=data['live'].get('title'),
vod_content=data.get('description_suffix'))
resolution_data = data['live']['quickplay']['resolution']
all_streams = {}
sorted_qualities = sorted(resolution_data.items(),
key=lambda x: x[1]['vbr'],
reverse=True)
for quality, data in sorted_qualities:
vbr = data['vbr']
quality_name = get_quality_name(vbr)
for cdn_name, url in data['cdn'].items():
if cdn_name not in all_streams and type(url) == str and url.startswith('http'):
all_streams[cdn_name] = []
if isinstance(url, str) and url.startswith('http'):
all_streams[cdn_name].extend([quality_name, url])
plists = []
names = []
for i, (cdn_name, stream_list) in enumerate(all_streams.items(), 1):
names.append(f'线路{i}')
pstr = f"{name}${ids[0]}@@{self.e64(json.dumps(stream_list))}"
plists.append(pstr)
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plists)
return vod
except Exception as e:
return self.handle_exception(e)
def biliDetail(self, ids):
try:
vdata = self.fetch(
f'{self.hosts[ids[0]][0]}/xlive/web-room/v1/index/getInfoByRoom?room_id={ids[1]}&wts={int(time.time())}',
headers=self.gethr(0, ids[0])).json()
v = vdata['data']['room_info']
vod = self.buildvod(
vod_name=v.get('title'),
type_name=v.get('parent_area_name') + '/' + v.get('area_name'),
vod_remarks=v.get('tags'),
vod_play_from=v.get('title'),
)
data = self.fetch(
f'{self.hosts[ids[0]][0]}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={ids[1]}&protocol=0%2C1&format=0%2C1%2C2&codec=0%2C1&platform=web',
headers=self.gethr(0, ids[0])).json()
vdnams = data['data']['playurl_info']['playurl']['g_qn_desc']
all_accept_qns = []
streams = data['data']['playurl_info']['playurl']['stream']
for stream in streams:
for format_item in stream['format']:
for codec in format_item['codec']:
if 'accept_qn' in codec:
all_accept_qns.append(codec['accept_qn'])
max_accept_qn = max(all_accept_qns, key=len) if all_accept_qns else []
quality_map = {
item['qn']: item['desc']
for item in vdnams
}
quality_names = [f"{quality_map.get(qn)}${ids[0]}@@{ids[1]}@@{qn}" for qn in max_accept_qn]
vod['vod_play_url'] = "#".join(quality_names)
return vod
except Exception as e:
return self.handle_exception(e)
def huyaDetail(self, ids):
try:
vdata = self.fetch(f'{self.hosts[ids[0]][1]}/cache.php?m=Live&do=profileRoom&roomid={ids[1]}',
headers=self.headers[0]).json()
v = vdata['data']['liveData']
vod = self.buildvod(
vod_name=v.get('introduction'),
type_name=v.get('gameFullName'),
vod_director=v.get('nick'),
vod_remarks=v.get('contentIntro'),
)
data = dict(reversed(list(vdata['data']['stream'].items())))
names = []
plist = []
for stream_type, stream_data in data.items():
if isinstance(stream_data, dict) and 'multiLine' in stream_data and 'rateArray' in stream_data:
names.append(f"线路{len(names) + 1}")
qualities = sorted(
stream_data['rateArray'],
key=lambda x: (x['iBitRate'], x['sDisplayName']),
reverse=True
)
cdn_urls = []
for cdn in stream_data['multiLine']:
quality_urls = []
for quality in qualities:
quality_name = quality['sDisplayName']
bit_rate = quality['iBitRate']
base_url = cdn['url']
if bit_rate > 0:
if '.m3u8' in base_url:
new_url = base_url.replace(
'ratio=2000',
f'ratio={bit_rate}'
)
else:
new_url = base_url.replace(
'imgplus.flv',
f'imgplus_{bit_rate}.flv'
)
else:
new_url = base_url
quality_urls.extend([quality_name, new_url])
encoded_urls = self.e64(json.dumps(quality_urls))
cdn_urls.append(f"{cdn['cdnType']}${ids[0]}@@{encoded_urls}")
if cdn_urls:
plist.append('#'.join(cdn_urls))
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plist)
return vod
except Exception as e:
return self.handle_exception(e)
def douyinDetail(self, ids):
url = f'{self.hosts[ids[0]]}/webcast/room/web/enter/?aid=6383&app_name=douyin_web&live_id=1&device_platform=web&enter_from=web_live&web_rid={ids[1]}&room_id_str=&enter_source=&Room-Enter-User-Login-Ab=0&is_need_double_stream=false&cookie_enabled=true&screen_width=1980&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=125.0.0.0'
data = self.fetch(url, headers=self.dyheaders).json()
try:
vdata = data['data']['data'][0]
vod = self.buildvod(
vod_name=vdata['title'],
vod_remarks=vdata['user_count_str'],
)
resolution_data = vdata['stream_url']['live_core_sdk_data']['pull_data']['options']['qualities']
stream_json = vdata['stream_url']['live_core_sdk_data']['pull_data']['stream_data']
stream_json = json.loads(stream_json)
available_types = []
if any(sdk_key in stream_json['data'] and 'main' in stream_json['data'][sdk_key] for sdk_key in
stream_json['data']):
available_types.append('main')
if any(sdk_key in stream_json['data'] and 'backup' in stream_json['data'][sdk_key] for sdk_key in
stream_json['data']):
available_types.append('backup')
plist = []
for line_type in available_types:
format_arrays = {'flv': [], 'hls': [], 'lls': []}
qualities = sorted(resolution_data, key=lambda x: x['level'], reverse=True)
for quality in qualities:
sdk_key = quality['sdk_key']
if sdk_key in stream_json['data'] and line_type in stream_json['data'][sdk_key]:
stream_info = stream_json['data'][sdk_key][line_type]
if stream_info.get('flv'):
format_arrays['flv'].extend([quality['name'], stream_info['flv']])
if stream_info.get('hls'):
format_arrays['hls'].extend([quality['name'], stream_info['hls']])
if stream_info.get('lls'):
format_arrays['lls'].extend([quality['name'], stream_info['lls']])
format_urls = []
for format_name, url_array in format_arrays.items():
if url_array:
encoded_urls = self.e64(json.dumps(url_array))
format_urls.append(f"{format_name}${ids[0]}@@{encoded_urls}")
if format_urls:
plist.append('#'.join(format_urls))
names = ['线路1', '线路2'][:len(plist)]
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plist)
return vod
except Exception as e:
return self.handle_exception(e)
def douyuDetail(self, ids):
headers = self.gethr(0, zr=f'{self.hosts[ids[0]]}/{ids[1]}')
try:
data = self.fetch(f'{self.hosts[ids[0]]}/betard/{ids[1]}', headers=headers).json()
vname = data['room']['room_name']
vod = self.buildvod(
vod_name=vname,
vod_remarks=data['room'].get('second_lvl_name'),
vod_director=data['room'].get('nickname'),
)
vdata = self.fetch(f'{self.hosts[ids[0]]}/swf_api/homeH5Enc?rids={ids[1]}', headers=headers).json()
json_body = vdata['data']
json_body = {"html": self.douyu_text(json_body[f'room{ids[1]}']), "rid": ids[1]}
sign = self.post('http://alive.nsapps.cn/api/AllLive/DouyuSign', json=json_body, headers=self.headers[1]).json()['data']
body = f'{sign}&cdn=&rate=-1&ver=Douyu_223061205&iar=1&ive=1&hevc=0&fa=0'
body=self.params_to_json(body)
nubdata = self.post(f'{self.hosts[ids[0]]}/lapi/live/getH5Play/{ids[1]}', data=body, headers=headers).json()
plist = []
names = []
for i,x in enumerate(nubdata['data']['cdnsWithName']):
names.append(f'线路{i+1}')
d = {'sign': sign, 'cdn': x['cdn'], 'id': ids[1]}
plist.append(
f'{vname}${ids[0]}@@{self.e64(json.dumps(d))}@@{self.e64(json.dumps(nubdata["data"]["multirates"]))}')
vod['vod_play_from'] = "$$$".join(names)
vod['vod_play_url'] = "$$$".join(plist)
return vod
except Exception as e:
return self.handle_exception(e)
def douyu_text(self, text):
function_positions = [m.start() for m in re.finditer('function', text)]
total_functions = len(function_positions)
if total_functions % 2 == 0:
target_index = total_functions // 2 + 1
else:
target_index = (total_functions - 1) // 2 + 1
if total_functions >= target_index:
cut_position = function_positions[target_index - 1]
ctext = text[4:cut_position]
return re.sub(r'eval\(strc\)\([\w\d,]+\)', 'strc', ctext)
return text
def searchContent(self, key, quick, pg="1"):
pass
def playerContent(self, flag, id, vipFlags):
try:
ids = id.split('@@')
p = 1
if ids[0] in ['wangyi', 'douyin','huya']:
p, url = 0, json.loads(self.d64(ids[1]))
elif ids[0] == 'bili':
p, url = self.biliplay(ids)
elif ids[0] == 'huya':
p, url = 0, json.loads(self.d64(ids[1]))
elif ids[0] == 'douyu':
p, url = self.douyuplay(ids)
return {'parse': p, 'url': url, 'header': self.playheaders[ids[0]]}
except Exception as e:
return {'parse': 1, 'url': self.excepturl, 'header': self.headers[0]}
def biliplay(self, ids):
try:
data = self.fetch(
f'{self.hosts[ids[0]][0]}/xlive/web-room/v2/index/getRoomPlayInfo?room_id={ids[1]}&protocol=0,1&format=0,2&codec=0&platform=web&qn={ids[2]}',
headers=self.gethr(0, ids[0])).json()
urls = []
line_index = 1
for stream in data['data']['playurl_info']['playurl']['stream']:
for format_item in stream['format']:
for codec in format_item['codec']:
for url_info in codec['url_info']:
full_url = f"{url_info['host']}/{codec['base_url'].lstrip('/')}{url_info['extra']}"
urls.extend([f"线路{line_index}", full_url])
line_index += 1
return 0, urls
except Exception as e:
return 1, self.excepturl
def douyuplay(self, ids):
try:
sdata = json.loads(self.d64(ids[1]))
headers = self.gethr(0, zr=f'{self.hosts[ids[0]]}/{sdata["id"]}')
ldata = json.loads(self.d64(ids[2]))
result_obj = {}
with ThreadPoolExecutor(max_workers=len(ldata)) as executor:
futures = [
executor.submit(
self.douyufp,
sdata,
quality,
headers,
self.hosts[ids[0]],
result_obj
) for quality in ldata
]
for future in futures:
future.result()
result = []
for bit in sorted(result_obj.keys(), reverse=True):
result.extend(result_obj[bit])
if result:
return 0, result
return 1, self.excepturl
except Exception as e:
return 1, self.excepturl
def douyufp(self, sdata, quality, headers, host, result_obj):
try:
body = f'{sdata["sign"]}&cdn={sdata["cdn"]}&rate={quality["rate"]}'
body=self.params_to_json(body)
data = self.post(f'{host}/lapi/live/getH5Play/{sdata["id"]}',
data=body, headers=headers).json()
if data.get('data'):
play_url = data['data']['rtmp_url'] + '/' + data['data']['rtmp_live']
bit = quality.get('bit', 0)
if bit not in result_obj:
result_obj[bit] = []
result_obj[bit].extend([quality['name'], play_url])
except Exception as e:
print(f"Error fetching {quality['name']}: {str(e)}")
def localProxy(self, param):
pass
def e64(self, text):
try:
text_bytes = text.encode('utf-8')
encoded_bytes = b64encode(text_bytes)
return encoded_bytes.decode('utf-8')
except Exception as e:
print(f"Base64编码错误: {str(e)}")
return ""
def d64(self, encoded_text):
try:
encoded_bytes = encoded_text.encode('utf-8')
decoded_bytes = b64decode(encoded_bytes)
return decoded_bytes.decode('utf-8')
except Exception as e:
print(f"Base64解码错误: {str(e)}")
return ""
def josn_to_params(self, params, skip_empty=False):
query = []
for k, v in params.items():
if skip_empty and not v:
continue
query.append(f"{k}={v}")
return "&".join(query)
def params_to_json(self, query_string):
parsed_data = parse_qs(query_string)
result = {key: value[0] for key, value in parsed_data.items()}
return result
def buildvod(self, vod_id='', vod_name='', vod_pic='', vod_year='', vod_tag='', vod_remarks='', style='',
type_name='', vod_area='', vod_actor='', vod_director='',
vod_content='', vod_play_from='', vod_play_url=''):
vod = {
'vod_id': vod_id,
'vod_name': vod_name,
'vod_pic': vod_pic,
'vod_year': vod_year,
'vod_tag': 'folder' if vod_tag else '',
'vod_remarks': vod_remarks,
'style': style,
'type_name': type_name,
'vod_area': vod_area,
'vod_actor': vod_actor,
'vod_director': vod_director,
'vod_content': vod_content,
'vod_play_from': vod_play_from,
'vod_play_url': vod_play_url
}
vod = {key: value for key, value in vod.items() if value}
return vod
def getpq(self, url, headers=None, cookies=None):
data = self.fetch(url, headers=headers, cookies=cookies).text
try:
return pq(data)
except Exception as e:
print(f"解析页面错误: {str(e)}")
return pq(data.encode('utf-8'))
def gethr(self, index, rf='', zr=''):
headers = self.headers[index]
if zr:
headers['referer'] = zr
else:
headers['referer'] = f"{self.referers[rf]}/"
return headers
def handle_exception(self, e):
print(f"报错: {str(e)}")
return {'vod_play_from': '哎呀翻车啦', 'vod_play_url': f'翻车啦${self.excepturl}'}

View File

@@ -1,279 +0,0 @@
# coding=utf-8
# !/usr/bin/python
# by嗷呜(finally)
import sys
import os
sys.path.append("..")
import re
import hashlib
import hmac
import random
import string
from Crypto.Util.Padding import unpad
from concurrent.futures import ThreadPoolExecutor
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5, AES
from base64 import b64encode, b64decode
import json
import time
from base.spider import Spider
class Spider(Spider):
def getName(self):
return "电影猎手"
def init(self, extend=""):
self.device = self.device_id()
self.host = self.gethost()
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def action(self, action):
pass
def destroy(self):
pass
t = str(int(time.time()))
def homeContent(self, filter):
result = {}
filters = {}
classes = []
bba = self.url()
data = self.fetch(f"{self.host}/api/v1/app/config?pack={bba[0]}&signature={bba[1]}", headers=self.header()).text
data1 = self.aes(data)
dy = {"class":"类型","area":"地区","lang":"语言","year":"年份","letter":"字母","by":"排序","sort":"排序"}
data1['data']['movie_screen']['sort'].pop(0)
for item in data1['data']['movie_screen']['sort']:
item['n'] = item.pop('name')
item['v'] = item.pop('value')
for item in data1['data']['movie_screen']['filter']:
has_non_empty_field = False
classes.append({"type_name": item["name"], "type_id": str(item["id"])})
for key in dy:
if key in item and item[key]:
has_non_empty_field = True
break
if has_non_empty_field:
filters[str(item["id"])] = []
filters[str(item["id"])].append(
{"key": 'sort', "name": '排序', "value": data1['data']['movie_screen']['sort']})
for dkey in item:
if dkey in dy and item[dkey]:
item[dkey].pop(0)
value_array = [
{"n": value.strip(), "v": value.strip()}
for value in item[dkey]
if value.strip() != ""
]
filters[str(item["id"])].append(
{"key": dkey, "name": dy[dkey], "value": value_array}
)
result["class"] = classes
result["filters"] = filters
return result
def homeVideoContent(self):
bba = self.url()
url = f'{self.host}/api/v1/movie/index_recommend?pack={bba[0]}&signature={bba[1]}'
data = self.fetch(url, headers=self.header()).json()
videos = []
for item in data['data']:
if len(item['list']) > 0:
for it in item['list']:
try:
videos.append(self.voides(it))
except Exception as e:
continue
result = {"list": videos}
return result
def categoryContent(self, tid, pg, filter, extend):
body = {"type_id": tid, "sort": extend.get("sort", "by_default"), "class": extend.get("class", "类型"),
"area": extend.get("area", "地区"), "year": extend.get("year", "年份"), "page": str(pg),
"pageSize": "21"}
result = {}
list = []
bba = self.url(body)
url = f"{self.host}/api/v1/movie/screen/list?pack={bba[0]}&signature={bba[1]}"
data = self.fetch(url, headers=self.header()).json()['data']['list']
for item in data:
list.append(self.voides(item))
result["list"] = list
result["page"] = pg
result["pagecount"] = 9999
result["limit"] = 90
result["total"] = 999999
return result
def detailContent(self, ids):
body = {"id": ids[0]}
bba = self.url(body)
url = f'{self.host}/api/v1/movie/detail?pack={bba[0]}&signature={bba[1]}'
data = self.fetch(url, headers=self.header()).json()['data']
video = {'vod_name': data.get('name'),'type_name': data.get('type_name'),'vod_year': data.get('year'),'vod_area': data.get('area'),'vod_remarks': data.get('dynami'),'vod_content': data.get('content')}
play = []
names = []
tasks = []
for itt in data["play_from"]:
name = itt["name"]
a = []
if len(itt["list"]) > 0:
names.append(name)
play.append(self.playeach(itt['list']))
else:
tasks.append({"movie_id": ids[0], "from_code": itt["code"]})
names.append(name)
if tasks:
with ThreadPoolExecutor(max_workers=len(tasks)) as executor:
results = executor.map(self.playlist, tasks)
for result in results:
if result:
play.append(result)
else:
play.append("")
video["vod_play_from"] = "$$$".join(names)
video["vod_play_url"] = "$$$".join(play)
result = {"list": [video]}
return result
def searchContent(self, key, quick, pg=1):
body = {"keyword": key, "sort": "", "type_id": "0", "page": str(pg), "pageSize": "10",
"res_type": "by_movie_name"}
bba = self.url(body)
url = f"{self.host}/api/v1/movie/search?pack={bba[0]}&signature={bba[1]}"
data = self.fetch(url, headers=self.header()).json()['data'].get('list')
videos = []
for it in data:
try:
videos.append(self.voides(it))
except Exception as e:
continue
result = {"list": videos, "page": pg}
return result
def playerContent(self, flag, id, vipFlags):
url = id
if "m3u8" not in url and "mp4" not in url:
try:
add = id.split('|||')
data = {"from_code": add[0], "play_url": add[1], "episode_id": add[2], "type": "play"}
bba = self.url(data)
data2 = self.fetch(f"{self.host}/api/v1/movie_addr/parse_url?pack={bba[0]}&signature={bba[1]}",
headers=self.header()).json()['data']
url = data2.get('play_url') or data2.get('download_url')
try:
url1 = self.fetch(url, headers=self.header(), allow_redirects=False).headers['Location']
if url1 and "http" in url1:
url = url1
except:
pass
except Exception as e:
pass
if '.jpg' in url or '.jpeg' in url or '.png' in url:
url = self.getProxyUrl() + "&url=" + b64encode(url.encode('utf-8')).decode('utf-8') + "&type=m3u8"
result = {}
result["parse"] = 0
result["url"] = url
result["header"] = {'user-agent': 'okhttp/4.9.2'}
return result
def localProxy(self, param):
url = b64decode(param["url"]).decode('utf-8')
durl = url[:url.rfind('/')]
data = self.fetch(url, headers=self.header()).content.decode("utf-8")
lines = data.strip().split('\n')
for index, string in enumerate(lines):
# if 'URI="' in string and 'http' not in string:
# lines[index] = index
# 暂时预留,貌似用不到
if '#EXT' not in string and 'http' not in string:
lines[index] = durl + ('' if string.startswith('/') else '/') + string
data = '\n'.join(lines)
return [200, "application/vnd.apple.mpegur", data]
def device_id(self):
characters = string.ascii_lowercase + string.digits
random_string = ''.join(random.choices(characters, k=32))
return random_string
def gethost(self):
headers = {
'User-Agent': 'okhttp/4.9.2',
'Connection': 'Keep-Alive',
}
response = self.fetch('https://app-site.ecoliving168.com/domain_v5.json', headers=headers).json()
url = response['api_service'].replace('/api/', '')
return url
def header(self):
headers = {
'User-Agent': 'Android',
'Accept': 'application/prs.55App.v2+json',
'timestamp': self.t,
'x-client-setting': '{"pure-mode":1}',
'x-client-uuid': '{"device_id":' + self.device + '}, "type":1,"brand":"Redmi", "model":"M2012K10C", "system_version":30, "sdk_version":"3.1.0.7"}',
'x-client-version': '3096 '
}
return headers
def url(self, id=None):
if not id:
id = {}
id["timestamp"] = self.t
public_key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA02F/kPg5A2NX4qZ5JSns+bjhVMCC6JbTiTKpbgNgiXU+Kkorg6Dj76gS68gB8llhbUKCXjIdygnHPrxVHWfzmzisq9P9awmXBkCk74Skglx2LKHa/mNz9ivg6YzQ5pQFUEWS0DfomGBXVtqvBlOXMCRxp69oWaMsnfjnBV+0J7vHbXzUIkqBLdXSNfM9Ag5qdRDrJC3CqB65EJ3ARWVzZTTcXSdMW9i3qzEZPawPNPe5yPYbMZIoXLcrqvEZnRK1oak67/ihf7iwPJqdc+68ZYEmmdqwunOvRdjq89fQMVelmqcRD9RYe08v+xDxG9Co9z7hcXGTsUquMxkh29uNawIDAQAB'
encrypted_text = json.dumps(id)
public_key = RSA.import_key(b64decode(public_key))
cipher = PKCS1_v1_5.new(public_key)
encrypted_message = cipher.encrypt(encrypted_text.encode('utf-8'))
encrypted_message_base64 = b64encode(encrypted_message).decode('utf-8')
result = encrypted_message_base64.replace('+', '-').replace('/', '_').replace('=', '')
key = '635a580fcb5dc6e60caa39c31a7bde48'
sign = hmac.new(key.encode(), result.encode(), hashlib.md5).hexdigest()
return result, sign
def playlist(self, body):
try:
bba = self.url(body)
url = f'{self.host}/api/v1/movie_addr/list?pack={bba[0]}&signature={bba[1]}'
data = self.fetch(url, headers=self.header()).json()['data']
return self.playeach(data)
except Exception:
return []
def playeach(self,data):
play_urls = []
for it in data:
if re.search(r"mp4|m3u8", it["play_url"]):
play_urls.append(f"{it['episode_name']}${it['play_url']}")
else:
play_urls.append(
f"{it['episode_name']}${it['from_code']}|||{it['play_url']}|||{it['episode_id']}"
)
return '#'.join(play_urls)
def voides(self, item):
if item['name'] or item['title']:
voide = {
"vod_id": item.get('id') or item.get('click'),
'vod_name': item.get('name') or item.get('title'),
'vod_pic': item.get('cover') or item.get('image'),
'vod_year': item.get('year') or item.get('label'),
'vod_remarks': item.get('dynamic') or item.get('sub_title')
}
return voide
def aes(self, text):
text = text.replace('-', '+').replace('_', '/') + '=='
key = b"e6d5de5fcc51f53d"
iv = b"2f13eef7dfc6c613"
cipher = AES.new(key, AES.MODE_CBC, iv)
pt = unpad(cipher.decrypt(b64decode(text)), AES.block_size).decode("utf-8")
return json.loads(pt)

View File

@@ -1,225 +0,0 @@
# -*- coding: utf-8 -*-
# by @嗷呜
import json
import sys
import threading
import uuid
import requests
sys.path.append('..')
from base.spider import Spider
import time
from Crypto.Hash import MD5, SHA1
class Spider(Spider):
'''
配置示例:
{
"key": "xxxx",
"name": "xxxx",
"type": 3,
"api": ".所在路径/金牌.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1,
"ext": {
"site": "https://www.jiabaide.cn,域名2,域名3"
}
},
'''
def init(self, extend=""):
if extend:
hosts=json.loads(extend)['site']
self.host = self.host_late(hosts)
pass
def getName(self):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
def homeContent(self, filter):
cdata = self.fetch(f"{self.host}/api/mw-movie/anonymous/get/filer/type", headers=self.getheaders()).json()
fdata = self.fetch(f"{self.host}/api/mw-movie/anonymous/v1/get/filer/list", headers=self.getheaders()).json()
result = {}
classes = []
filters={}
for k in cdata['data']:
classes.append({
'type_name': k['typeName'],
'type_id': str(k['typeId']),
})
sort_values = [{"n": "最近更新", "v": "2"},{"n": "人气高低", "v": "3"}, {"n": "评分高低", "v": "4"}]
for tid, d in fdata['data'].items():
current_sort_values = sort_values.copy()
if tid == '1':
del current_sort_values[0]
filters[tid] = [
{"key": "type", "name": "类型",
"value": [{"n": i["itemText"], "v": i["itemValue"]} for i in d["typeList"]]},
*([] if not d["plotList"] else [{"key": "v_class", "name": "剧情",
"value": [{"n": i["itemText"], "v": i["itemText"]}
for i in d["plotList"]]}]),
{"key": "area", "name": "地区",
"value": [{"n": i["itemText"], "v": i["itemText"]} for i in d["districtList"]]},
{"key": "year", "name": "年份",
"value": [{"n": i["itemText"], "v": i["itemText"]} for i in d["yearList"]]},
{"key": "lang", "name": "语言",
"value": [{"n": i["itemText"], "v": i["itemText"]} for i in d["languageList"]]},
{"key": "sort", "name": "排序", "value": current_sort_values}
]
result['class'] = classes
result['filters'] = filters
return result
def homeVideoContent(self):
data1 = self.fetch(f"{self.host}/api/mw-movie/anonymous/v1/home/all/list", headers=self.getheaders()).json()
data2=self.fetch(f"{self.host}/api/mw-movie/anonymous/home/hotSearch",headers=self.getheaders()).json()
data=[]
for i in data1['data'].values():
data.extend(i['list'])
data.extend(data2['data'])
vods=self.getvod(data)
return {'list':vods}
def categoryContent(self, tid, pg, filter, extend):
params = {
"area": extend.get('area', ''),
"filterStatus": "1",
"lang": extend.get('lang', ''),
"pageNum": pg,
"pageSize": "30",
"sort": extend.get('sort', '1'),
"sortBy": "1",
"type": extend.get('type', ''),
"type1": tid,
"v_class": extend.get('v_class', ''),
"year": extend.get('year', '')
}
data = self.fetch(f"{self.host}/api/mw-movie/anonymous/video/list?{self.js(params)}", headers=self.getheaders(params)).json()
result = {}
result['list'] = self.getvod(data['data']['list'])
result['page'] = pg
result['pagecount'] = 9999
result['limit'] = 90
result['total'] = 999999
return result
def detailContent(self, ids):
data=self.fetch(f"{self.host}/api/mw-movie/anonymous/video/detail?id={ids[0]}",headers=self.getheaders({'id':ids[0]})).json()
vod=self.getvod([data['data']])[0]
vod['vod_play_from']='嗷呜有金牌'
vod['vod_play_url'] = '#'.join(
f"{i['name'] if len(vod['episodelist']) > 1 else vod['vod_name']}${ids[0]}@@{i['nid']}" for i in
vod['episodelist'])
vod.pop('episodelist', None)
return {'list':[vod]}
def searchContent(self, key, quick, pg="1"):
params = {
"keyword": key,
"pageNum": pg,
"pageSize": "8",
"sourceCode": "1"
}
data=self.fetch(f"{self.host}/api/mw-movie/anonymous/video/searchByWord?{self.js(params)}",headers=self.getheaders(params)).json()
vods=self.getvod(data['data']['result']['list'])
return {'list':vods,'page':pg}
def playerContent(self, flag, id, vipFlags):
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36',
'sec-ch-ua-platform': '"Windows"',
'DNT': '1',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'Origin': self.host,
'Referer': f'{self.host}/'
}
ids=id.split('@@')
pdata = self.fetch(f"{self.host}/api/mw-movie/anonymous/v2/video/episode/url?clientType=1&id={ids[0]}&nid={ids[1]}",headers=self.getheaders({'clientType':'1','id': ids[0], 'nid': ids[1]})).json()
vlist=[]
for i in pdata['data']['list']:vlist.extend([i['resolutionName'],i['url']])
return {'parse':0,'url':vlist,'header':self.header}
def localProxy(self, param):
pass
def host_late(self, url_list):
if isinstance(url_list, str):
urls = [u.strip() for u in url_list.split(',')]
else:
urls = url_list
if len(urls) <= 1:
return urls[0] if urls else ''
results = {}
threads = []
def test_host(url):
try:
start_time = time.time()
response = requests.head(url, timeout=1.0, allow_redirects=False)
delay = (time.time() - start_time) * 1000
results[url] = delay
except Exception as e:
results[url] = float('inf')
for url in urls:
t = threading.Thread(target=test_host, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
return min(results.items(), key=lambda x: x[1])[0]
def md5(self, sign_key):
md5_hash = MD5.new()
md5_hash.update(sign_key.encode('utf-8'))
md5_result = md5_hash.hexdigest()
return md5_result
def js(self, param):
return '&'.join(f"{k}={v}" for k, v in param.items())
def getheaders(self, param=None):
if param is None:param = {}
t=str(int(time.time()*1000))
param['key']='cb808529bae6b6be45ecfab29a4889bc'
param['t']=t
sha1_hash = SHA1.new()
sha1_hash.update(self.md5(self.js(param)).encode('utf-8'))
sign = sha1_hash.hexdigest()
deviceid = str(uuid.uuid4())
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.61 Chrome/126.0.6478.61 Not/A)Brand/8 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'sign': sign,
't': t,
'deviceid':deviceid
}
return headers
def convert_field_name(self, field):
field = field.lower()
if field.startswith('vod') and len(field) > 3:
field = field.replace('vod', 'vod_')
if field.startswith('type') and len(field) > 4:
field = field.replace('type', 'type_')
return field
def getvod(self, array):
return [{self.convert_field_name(k): v for k, v in item.items()} for item in array]

Binary file not shown.

Binary file not shown.

BIN
欧歌/jars/柠檬.jar Normal file

Binary file not shown.

View File

@@ -1,378 +0,0 @@
globalThis.getRandomItem = function(items) {
return items[Math.random() * items.length | 0];
}
var rule = {
title: '采集之王[合]',
author: '道长',
version: '20240706 beta17',
update_info: ``.trim(),
host: '',
homeTid: '',
homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
searchUrl: '/api.php/provide/vod/?wd=**&pg=#TruePage##page=fypage',
classUrl: '/api.php/provide/vod/',
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyfilter',
filter_url: '{{fl.类型}}',
headers: {
'User-Agent': 'MOBILE_UA'
},
timeout: 5000,
limit: 20,
search_limit: 10,
searchable: 1,
quickSearch: 0,
filterable: 1,
play_parse: true,
parse_url: '',
search_match: false,
search_pic: true,
预处理: $js.toString(() => {
function getClasses(item) {
let classes = [];
if (item.class_name && item.class_url) {
if (!/&|电影|电视剧|综艺|动漫[\u4E00-\u9FA5]+/.test(item.class_name)) {
try {
item.class_name = ungzip(item.class_name)
} catch (e) {
log(`不识别的class_name导致gzip解码失败:${e}`)
return classes
}
}
let names = item.class_name.split('&');
let urls = item.class_url.split('&');
let cnt = Math.min(names.length, urls.length);
for (let i = 0; i < cnt; i++) {
classes.push({
'type_id': urls[i],
'type_name': names[i]
});
}
}
return classes
}
if (typeof(batchFetch) === 'function') {
rule.search_limit = 16;
log('当前程序支持批量请求[batchFetch],搜索限制已设置为16');
}
let _url = rule.params;
log(`传入参数:${_url}`);
if (_url && typeof(_url) === 'string' && /^(http|file)/.test(_url)) {
if (_url.includes('$')) {
let _url_params = _url.split('$');
_url = _url_params[0];
rule.search_match = !!(_url_params[1]);
if (_url_params.length > 2) {
rule.search_pic = !!(_url_params[2]);
}
}
let html = request(_url);
let json = JSON.parse(html);
let _classes = [];
rule.filter = {};
rule.filter_def = {};
json.forEach(it => {
let _obj = {
type_name: it.name,
type_id: it.url,
parse_url: it.parse_url || '',
searchable: it.searchable !== 0,
api: it.api || '',
cate_exclude: it.cate_exclude || '',
cate_excludes: it.cate_excludes || [],
};
_classes.push(_obj);
try {
let json1 = [];
if (it.class_name && it.class_url) {
json1 = getClasses(it);
} else {
json1 = JSON.parse(request(urljoin(_obj.type_id, _obj.api || rule.classUrl))).class;
}
if (_obj.cate_excludes && Array.isArray(_obj.cate_excludes) && _obj.cate_excludes.length > 0) {
json1 = json1.filter(cl => !_obj.cate_excludes.includes(cl.type_name));
} else if (_obj.cate_exclude) {
json1 = json1.filter(cl => !new RegExp(_obj.cate_exclude, 'i').test(cl.type_name));
}
rule.filter[_obj.type_id] = [{
"key": "类型",
"name": "类型",
"value": json1.map(i => {
return {
"n": i.type_name,
'v': i.type_id
}
})
}];
if (json1.length > 0) {
rule.filter_def[it.url] = {
"类型": json1[0].type_id
};
}
} catch (e) {
rule.filter[it.url] = [{
"key": "类型",
"name": "类型",
"value": [{
"n": "全部",
"v": ""
}]
}];
}
});
rule.classes = _classes;
}
}),
class_parse: $js.toString(() => {
input = rule.classes;
}),
推荐: $js.toString(() => {
VODS = [];
if (rule.classes) {
let randomClass = getRandomItem(rule.classes);
let _url = urljoin(randomClass.type_id, input);
if (randomClass.api) {
_url = _url.replace('/api.php/provide/vod/', randomClass.api)
}
try {
let html = request(_url, {
timeout: rule.timeout
});
let json = JSON.parse(html);
VODS = json.list;
VODS.forEach(it => {
it.vod_id = randomClass.type_id + '$' + it.vod_id;
it.vod_remarks = it.vod_remarks + '|' + randomClass.type_name;
});
} catch (e) {}
}
}),
一级: $js.toString(() => {
VODS = [];
if (rule.classes) {
let _url = urljoin(MY_CATE, input);
let current_vod = rule.classes.find(item => item.type_id === MY_CATE);
if (current_vod && current_vod.api) {
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
}
let html = request(_url);
let json = JSON.parse(html);
VODS = json.list;
VODS.forEach(it => {
it.vod_id = MY_CATE + '$' + it.vod_id
});
}
}),
二级: $js.toString(() => {
VOD = {};
if (orId === 'update_info') {
VOD = {
vod_content: rule.update_info.trim(),
vod_name: '更新日志',
type_name: '更新日志',
vod_pic: 'https://resource-cdn.tuxiaobei.com/video/FtWhs2mewX_7nEuE51_k6zvg6awl.png',
vod_remarks: `版本:${rule.version}`,
vod_play_from: '道长在线',
vod_play_url: '随机小视频$http://api.yujn.cn/api/zzxjj.php',
};
} else {
if (rule.classes) {
let _url = urljoin(fyclass, input);
let current_vod = rule.classes.find(item => item.type_id === fyclass);
if (current_vod && current_vod.api) {
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
}
let html = request(_url);
let json = JSON.parse(html);
let data = json.list;
VOD = data[0];
if (current_vod && current_vod.type_name) {
VOD.vod_play_from = VOD.vod_play_from.split('$$$').map(it => current_vod.type_name + '|' + it).join('$$$')
}
}
}
}),
搜索: $js.toString(() => {
VODS = [];
if (rule.classes) {
let canSearch = rule.classes.filter(it => it.searchable);
let page = Number(MY_PAGE);
page = (MY_PAGE - 1) % Math.ceil(canSearch.length / rule.search_limit) + 1;
let truePage = Math.ceil(MY_PAGE / Math.ceil(canSearch.length / rule.search_limit));
if (rule.search_limit) {
let start = (page - 1) * rule.search_limit;
let end = page * rule.search_limit;
let t1 = new Date().getTime();
let searchMode = typeof(batchFetch) === 'function' ? '批量' : '单个';
log('start:' + start);
log('end:' + end);
log('搜索模式:' + searchMode);
log('精准搜索:' + rule.search_match);
log('强制获取图片:' + rule.search_pic);
if (start < canSearch.length) {
let search_classes = canSearch.slice(start, end);
let urls = [];
search_classes.forEach(it => {
let _url = urljoin(it.type_id, input);
if (it.api) {
_url = _url.replace('/api.php/provide/vod/', it.api)
}
_url = _url.replace("#TruePage#", "" + truePage);
urls.push(_url);
});
let results_list = [];
let results = [];
if (typeof(batchFetch) === 'function') {
let reqUrls = urls.map(it => {
return {
url: it,
options: {
timeout: rule.timeout
}
}
});
let rets = batchFetch(reqUrls);
let detailUrls = [];
let detailUrlCount = 0;
rets.forEach((ret, idx) => {
let it = search_classes[idx];
if (ret) {
try {
let json = JSON.parse(ret);
let data = json.list;
data.forEach(i => {
i.site_name = it.type_name;
i.vod_id = it.type_id + '$' + i.vod_id;
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
});
if (rule.search_match) {
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
}
if (data.length > 0) {
if (rule.search_pic && !data[0].vod_pic) {
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
detailUrls.push(detailUrl);
results_list.push({
data: data,
has_pic: false,
detailUrlCount: detailUrlCount
});
detailUrlCount++;
} else {
results_list.push({
data: data,
has_pic: true
});
}
}
} catch (e) {
log(`请求:${it.type_id}发生错误:${e.message}`)
}
}
});
let reqUrls2 = detailUrls.map(it => {
return {
url: it,
options: {
timeout: rule.timeout
}
}
});
let rets2 = reqUrls2.length > 0 ? batchFetch(reqUrls2) : [];
for (let k = 0; k < results_list.length; k++) {
let result_data = results_list[k].data;
if (!results_list[k].has_pic) {
try {
let detailJson = JSON.parse(rets2[results_list[k].detailUrlCount]);
log('二级数据列表元素数:' + detailJson.list.length);
result_data.forEach((d, _seq) => {
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
if (detailVodPic) {
Object.assign(d, {
vod_pic: detailVodPic.vod_pic
});
}
});
} catch (e) {
log(`强制获取网站${result_data[0].site_name}的搜索图片失败:${e.message}`);
}
}
results = results.concat(result_data);
}
} else {
urls.forEach((_url, idx) => {
let it = search_classes[idx];
try {
let html = request(_url);
let json = JSON.parse(html);
let data = json.list;
data.forEach(i => {
i.vod_id = it.type_id + '$' + i.vod_id;
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
});
if (rule.search_match) {
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
}
if (data.length > 0) {
if (rule.search_pic && !data[0].vod_pic) {
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
try {
let detailJson = JSON.parse(request(detailUrl));
log('二级数据列表元素数:' + detailJson.list.length);
data.forEach((d, _seq) => {
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
if (detailVodPic) {
Object.assign(d, {
vod_pic: detailVodPic.vod_pic
});
}
});
} catch (e) {
log(`强制获取网站${it.type_id}的搜索图片失败:${e.message}`);
}
}
results = results.concat(data);
}
results = results.concat(data);
} catch (e) {
log(`请求:${it.type_id}发生错误:${e.message}`)
}
});
}
VODS = results;
let t2 = new Date().getTime();
log(`${searchMode}搜索:${urls.length}个站耗时:${(Number(t2) - Number(t1))}ms`)
}
}
}
}),
lazy: $js.toString(() => {
let parse_url = '';
if (flag && flag.includes('|')) {
let type_name = flag.split('|')[0];
let current_vod = rule.classes.find(item => item.type_name === type_name);
if (current_vod && current_vod.parse_url) {
parse_url = current_vod.parse_url
}
}
if (/\.(m3u8|mp4)/.test(input)) {
input = {
parse: 0,
url: input
}
} else {
if (parse_url.startsWith('json:')) {
let purl = parse_url.replace('json:', '') + input;
let html = request(purl);
input = {
parse: 0,
url: JSON.parse(html).url
}
} else {
input = parse_url + input;
}
}
}),
}

View File

@@ -1,9 +1,9 @@
{
"SiteUrl": "",
"Domains": [
"https://woog.nxog.eu.org",
"https://woog.nxog.fun",
"https://woog.欧.我爱你"
"https://woog.nxog.eu.org"
],
"SiteWord": "wogg",
"SiteName": "玩偶",

View File

@@ -5,6 +5,6 @@
"线路数组": "javascript:;\">&&</a>",
"数组": "<li>&&</li>",
"图片": "data-echo=\"&&\"",
"分类url": "https://vip.wwgz.cn:5200/vod-list-id-{cateId}-pg-{catePg}-order--by-time-class-0-year-{year}-letter--area-{area}-lang-.html",
"分类url": "https://vip.wwgz.cn:5200/vod-list-id-{cateId}-pg-{catePg}-order--by-time-class-0-year-{year}-letter--area-{area}-lang-.html;;d",
"分类": "电影$1#电视剧$2#动漫$4#综艺$3#短剧$26"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@
},
{
"key": "Doubana",
"name": "🐮【更新日期:20250902】🐮",
"name": "🐮【更新日期:20250914】🐮",
"type": 3,
"api": "csp_DoubanGuard",
"searchable": 0,

Binary file not shown.

File diff suppressed because it is too large Load Diff