mirror of
https://github.com/ls125781003/tvboxtg.git
synced 2025-12-16 17:22:19 +00:00
3.26
up
This commit is contained in:
38
南风/live.txt
38
南风/live.txt
@@ -1,15 +1,11 @@
|
||||
央视,#genre#
|
||||
CCTV1,http://home.kuaidi521.com:35455/gaoma/cctv1.m3u8
|
||||
CCTV1,http://nas.suntao.online:35455/gaoma/cctv1.m3u8
|
||||
CCTV1,http://58.243.224.244:9901/tsfile/live/1031_1.m3u8?key=txiptv&playlive=0&authid=0
|
||||
CCTV1,http://119.123.178.255:8086/hls/2/index.m3u8
|
||||
CCTV1,http://xiaoya.crccxw.top:35455/gaoma/cctv1.m3u8
|
||||
CCTV1,http://58.220.219.14:9901/tsfile/live/0001_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV1,http://175.31.21.146:4480/hls/1/index.m3u8
|
||||
CCTV1,http://183.215.134.239:19901/tsfile/live/0001_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV1,http://1752e145z8.vicp.fun:35455/gaoma/cctv1.m3u8
|
||||
CCTV1,http://1.itv.nctv.top:7777/gaoma/cctv1.m3u8
|
||||
CCTV1,http://tv.20191209.xyz:37377/migu/608807420.m3u8?migutoken=004b385f879c68b1898b3b528c53ce2cc69a05fc6ccef397d5ff725950f98cc37983a6c0565ab535a964de0b80663b3a394fd8a43c51d0547d2e232162525de45bdb07292d1fc1944aea97f0
|
||||
CCTV1,http://58.220.211.90:352/tsfile/live/0001_1.m3u8?key=txiptv&playlive=1&authid$LR•IPV4『线路274』
|
||||
CCTV1,http://58.220.211.90:352/tsfile/live/0001_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4『线路275』
|
||||
CCTV1,http://36.105.100.208:35455/gaoma/cctv1.m3u8
|
||||
@@ -23,17 +19,14 @@ CCTV1,http://222.219.183.103:8089/hls/1/index.m3u8
|
||||
CCTV1,http://58.210.168.86:10800/newlive/live/hls/1/live.m3u8
|
||||
CCTV1,http://zjzcf.synology.me:35455/gaoma/cctv1.m3u8
|
||||
CCTV2,http://222.169.85.8:9901/tsfile/live/0002_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4『线路251』
|
||||
CCTV2,http://nas.suntao.online:35455/gaoma/cctv2.m3u8
|
||||
CCTV2,http://huashetou.fun:35455/gaoma/cctv2.m3u8
|
||||
CCTV2,http://58.243.224.244:9901/tsfile/live/1000_1.m3u8?key=txiptv&playlive=0&authid=0
|
||||
CCTV2,http://yc.myds.me:35455/gaoma/cctv2.m3u8
|
||||
CCTV2,http://39.164.160.249:9901/tsfile/live/0002_1.m3u8
|
||||
CCTV2,http://175.31.21.146:4480/hls/2/index.m3u8
|
||||
CCTV2,http://183.215.134.239:19901/tsfile/live/0002_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV2,http://116.128.243.121:85/tsfile/live/0002_1.m3u8?key=txiptv&playlive=0&authid=0
|
||||
CCTV2,http://1752e145z8.vicp.fun:35455/gaoma/cctv2.m3u8
|
||||
CCTV2,http://1.itv.nctv.top:7777/gaoma/cctv2.m3u8
|
||||
CCTV2,http://tv.20191209.xyz:37377/migu/631780532.m3u8?migutoken=862217ff2cffee0a741039e700509cb8f9a8b1920fe6cee55afb89ef1551eba3ecc744e93cf8e52cd8b4bf1a27c7a074745b640058072bfa4ad145917cdeb959261218d7b78174684a74ae78
|
||||
CCTV2,http://36.105.100.208:35455/gaoma/cctv2.m3u8
|
||||
CCTV2,http://3501776.xyz:35455/gaoma/cctv2.m3u8
|
||||
CCTV2,http://222.134.245.16:9901/tsfile/live/0002_1.m3u8
|
||||
@@ -45,15 +38,12 @@ CCTV2,http://zjzcf.synology.me:35455/gaoma/cctv2.m3u8
|
||||
CCTV3,http://222.134.19.31:352/tsfile/live/0003_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4『线路247』
|
||||
CCTV3,http://1.24.39.180:9003/hls/3/index.m3u8
|
||||
CCTV3,http://124.93.18.238:9003//hls/3/index.m3u8
|
||||
CCTV3,http://nas.suntao.online:35455/gaoma/cctv3.m3u8
|
||||
CCTV3,http://183.215.134.239:19901/tsfile/live/0003_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV3,http://yc.myds.me:35455/gaoma/cctv3.m3u8
|
||||
CCTV3,http://222.134.19.31:352/tsfile/live/0003_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV3,http://60.223.224.176:8888/newlive/live/hls/4/live.m3u8
|
||||
CCTV3,http://113.140.12.230:8888/newlive/live/hls/4/live.m3u8
|
||||
CCTV3,http://1752e145z8.vicp.fun:35455/gaoma/cctv3.m3u8
|
||||
CCTV3,http://1.itv.nctv.top:7777/gaoma/cctv3.m3u8
|
||||
CCTV3,http://tv.20191209.xyz:37377/migu/624878271.m3u8?migutoken=6bf1444e1fd674ffdba5c57e719cecb87358abd9dfd0059ccfaceb24503ca14f393ec4b44fc2a4b2b5eded13d1f30a2052d85600414a1274345fcd95bd9848cf13bffeef1945f996928f0095
|
||||
CCTV3,http://221.2.148.205:8154/tsfile/live/0003_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4『线路34』
|
||||
CCTV3,http://36.105.100.208:35455/gaoma/cctv3.m3u8
|
||||
CCTV3,http://39.77.34.83:35455/gaoma/cctv3.m3u8
|
||||
@@ -66,11 +56,8 @@ CCTV3,http://183.184.228.183:9003//hls/3/index.m3u8
|
||||
CCTV3,http://218.29.168.146:352/tsfile/live/0003_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV3,http://58.220.219.14:9901/tsfile/live/0003_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV3,http://zjzcf.synology.me:35455/gaoma/cctv3.m3u8
|
||||
CCTV4,http://tv.20191209.xyz:37377/migu/608807419.m3u8?migutoken=f623911f12100eda47f646cc2a14f2c4563e5d65f3e99dd30284493de9b5ff8389ee51ba62d51bb0a92235ccb1109e54ab6b1b5fe401fe4f60d18b1ccc51f92aa29b70fba7a400ff9058fdf8
|
||||
CCTV4,http://124.93.18.238:9003//hls/4/index.m3u8
|
||||
CCTV4,http://58.243.224.244:9901/tsfile/live/1002_1.m3u8?key=txiptv&playlive=0&authid=0
|
||||
CCTV4,http://nas.suntao.online:35455/gaoma/cctv4.m3u8
|
||||
CCTV4,http://tv.20191209.xyz:37377/migu/608807416.m3u8?migutoken=3e58d508ab4bf069dc535fdfc6330dfccfc52c3bb391b5b5602cff12f0acbb883fa9280c7422a00e84eba6fd1e2ddb27dc888d6e63e914595ce9fb917d9462307140d2558dac1fb322c2a85b
|
||||
CCTV4,http://huashetou.fun:35455/gaoma/cctv4.m3u8
|
||||
CCTV4,http://1752e145z8.vicp.fun:35455/gaoma/cctv4.m3u8
|
||||
CCTV4,http://1.itv.nctv.top:7777/gaoma/cctv4.m3u8
|
||||
@@ -86,14 +73,12 @@ CCTV4,http://36.105.100.208:35455/gaoma/cctv4.m3u8
|
||||
CCTV4,http://zjzcf.synology.me:35455/gaoma/cctv4.m3u8
|
||||
CCTV5,http://1.24.39.180:9003/hls/5/index.m3u8
|
||||
CCTV5,http://42.225.117.174:11199/tsfile/live/0005_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV5,http://nas.suntao.online:35455/gaoma/cctv5.m3u8
|
||||
CCTV5,http://112.81.218.254:35455/gaoma/cctv5.m3u8
|
||||
CCTV5,http://222.134.19.31:352/tsfile/live/0005_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV5,http://huashetou.fun:35455/gaoma/cctv5.m3u8
|
||||
CCTV5,http://60.223.224.176:8888/newlive/live/hls/6/live.m3u8
|
||||
CCTV5,http://113.140.12.230:8888/newlive/live/hls/6/live.m3u8
|
||||
CCTV5,http://1.itv.nctv.top:7777/gaoma/cctv5.m3u8
|
||||
CCTV5,http://tv.20191209.xyz:37377/migu/641886683.m3u8?migutoken=81d12cec2983a402e950068a320720875c9b84d86ead50b7ee5cc3d407f55f3d85a8e298762710bc211027e047162ea27025e20dda4ac4921a6c1d8b950dbe297e15174889d5122c0e3462d0
|
||||
CCTV5,http://116.9.204.242:9901/tsfile/live/0005_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4『线路177』
|
||||
CCTV5,http://61.133.10.250:352/tsfile/live/0005_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4『线路269』
|
||||
CCTV5,http://36.105.100.208:35455/gaoma/cctv5.m3u8
|
||||
@@ -107,9 +92,7 @@ CCTV5,http://39.77.34.83:35455/gaoma/cctv5.m3u8
|
||||
CCTV5,http://xiaoya.crccxw.top:35455/gaoma/cctv5.m3u8
|
||||
CCTV5,http://zjzcf.synology.me:35455/gaoma/cctv5.m3u8
|
||||
CCTV5+,http://cssbyd.imwork.net:8082/hls/6/index.m3u8
|
||||
CCTV5+,http://nas.suntao.online:35455/gaoma/cctv5p.m3u8
|
||||
CCTV5+,http://home.kuaidi521.com:35455/gaoma/cctv5p.m3u8
|
||||
CCTV5+,http://183.215.134.239:19901/tsfile/live/0005_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV5+,http://xiaoya.crccxw.top:35455/gaoma/cctv5p.m3u8
|
||||
CCTV5+,http://1.itv.nctv.top:7777/gaoma/cctv5p.m3u8
|
||||
CCTV5+,http://1752e145z8.vicp.fun:35455/gaoma/cctv5p.m3u8
|
||||
@@ -129,7 +112,6 @@ CCTV6,http://124.93.18.238:9003//hls/6/index.m3u8
|
||||
CCTV6,http://101.19.84.8:9901/tsfile/live/0006_1.m3u8
|
||||
CCTV6,http://183.184.228.183:9003//hls/7/index.m3u8
|
||||
CCTV7,http://8.138.7.223/tv/cctv7.m3u8
|
||||
CCTV7,http://nas.suntao.online:35455/gaoma/cctv7.m3u8
|
||||
CCTV7,http://60.223.224.176:8888/newlive/live/hls/9/live.m3u8
|
||||
CCTV7,https://live.junhao.mil.cn/rmt9502/3e6e7c5477314ec38f5e58e2a5c70024.m3u8?txSecret=57978fafb9c19880afa5c8687e8241d8&txTime=7A42BAFF
|
||||
CCTV7,http://live.junhao.mil.cn/rmt9502/3e6e7c5477314ec38f5e58e2a5c70024.m3u8?txSecret=57978fafb9c19880afa5c8687e8241d8&txTime=7A42BAFF
|
||||
@@ -147,12 +129,8 @@ CCTV7,http://39.77.34.83:35455/gaoma/cctv7.m3u8
|
||||
CCTV7,http://112.81.218.254:35455/gaoma/cctv7.m3u8
|
||||
CCTV7,http://124.93.18.238:9003//hls/7/index.m3u8
|
||||
CCTV7,http://222.219.183.103:8089/hls/7/index.m3u8
|
||||
CCTV8,http://tv.20191209.xyz:37377/migu/624878356.m3u8?migutoken=9d347588ab808559db972d3c94b0d970ec130153e4a6dde98c4466f1d3f85f58de23d16994f2f0ed903aa6727a7282cb17103e67b69c8e3f31d253bb78039a4df119e2cfeba6916d123a8003
|
||||
CCTV8,http://1.24.39.180:9003/hls/8/index.m3u8
|
||||
CCTV8,http://112.81.218.254:35455/gaoma/cctv8.m3u8
|
||||
CCTV8,http://nas.suntao.online:35455/gaoma/cctv8.m3u8
|
||||
CCTV8,http://nas.suntao.online:35455/gaoma/cctv8k_36m.m3u8
|
||||
CCTV8,http://183.215.134.239:19901/tsfile/live/0008_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV8,http://yc.myds.me:35455/gaoma/cctv8.m3u8
|
||||
CCTV8,http://114.105.98.95:37377/migu/624878356.m3u8?migutoken=9d347588ab808559db972d3c94b0d970ec130153e4a6dde98c4466f1d3f85f58de23d16994f2f0ed903aa6727a7282cb17103e67b69c8e3f31d253bb78039a4df119e2cfeba6916d123a8003
|
||||
CCTV8,http://222.134.19.31:352/tsfile/live/0008_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
@@ -179,7 +157,6 @@ CCTV9,http://180.213.174.225:9901/tsfile/live/0009_1.m3u8?key=txiptv&playlive=1&
|
||||
CCTV9,http://1.itv.nctv.top:7777/gaoma/cctv9.m3u8
|
||||
CCTV9,http://3501776.xyz:35455/gaoma/cctv9.m3u8
|
||||
CCTV9,http://xiaoya.crccxw.top:35455/gaoma/cctv9.m3u8
|
||||
CCTV9,http://nas.suntao.online:35455/gaoma/cctv9.m3u8
|
||||
CCTV9,http://home.kuaidi521.com:35455/gaoma/cctv9.m3u8
|
||||
CCTV9,http://183.184.228.183:9003//hls/10/index.m3u8
|
||||
CCTV9,http://58.243.224.244:9901/tsfile/live/1007_1.m3u8?key=txiptv&playlive=0&authid=0
|
||||
@@ -187,8 +164,6 @@ CCTV9,http://60.223.224.176:8888/newlive/live/hls/11/live.m3u8?
|
||||
CCTV9,http://504099760.qicp.vip:9901/tsfile/live/0009_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV9,http://222.219.183.103:8089/hls/9/index.m3u8
|
||||
CCTV9,http://zjzcf.synology.me:35455/gaoma/cctv9.m3u8
|
||||
CCTV10,http://tv.20191209.xyz:37377/migu/624878405.m3u8?migutoken=06cf776d6a6cbe5cb707174dfad937c2164030bf7ce5f589493870891966f9cdaa5f56bad6e7874d683d5b1e3d9a6e59d0f7c78276d5ec47d979ae42b67833e261a2dda0118f3edcabd6a85b
|
||||
CCTV10,http://nas.suntao.online:35455/gaoma/cctv10.m3u8
|
||||
CCTV10,http://1752e145z8.vicp.fun:35455/gaoma/cctv10.m3u8
|
||||
CCTV10,http://42.225.117.174:11199/tsfile/live/0010_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV10,http://112.81.218.254:35455/gaoma/cctv10.m3u8
|
||||
@@ -206,8 +181,6 @@ CCTV10,http://39.77.34.83:35455/gaoma/cctv10.m3u8
|
||||
CCTV10,http://60.223.224.176:8888/newlive/live/hls/12/live.m3u8
|
||||
CCTV10,http://182.37.169.94:352/tsfile/live/0010_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV10,http://180.213.174.225:9901/tsfile/live/0010_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV11,http://tv.20191209.xyz:37377/migu/667987558.m3u8?migutoken=d3962834d5d359e6f7f25a8880b73dac381a999ef87ba6b7f0f985bb5308a73061bbf5a9abdf873debb3b83b31eb7eff72f410c853c86f404b3f3ef269aeb631982e338f1400adcaf902fff7
|
||||
CCTV11,http://nas.suntao.online:35455/gaoma/cctv11.m3u8
|
||||
CCTV11,http://112.81.218.254:35455/gaoma/cctv11.m3u8
|
||||
CCTV11,http://huashetou.fun:35455/gaoma/cctv11.m3u8
|
||||
CCTV11,http://1.itv.nctv.top:7777/gaoma/cctv11.m3u8
|
||||
@@ -215,7 +188,6 @@ CCTV11,http://36.105.100.208:35455/gaoma/cctv11.m3u8
|
||||
CCTV11,http://yc.myds.me:35455/gaoma/cctv11.m3u8
|
||||
CCTV11,http://39.164.160.249:9901/tsfile/live/0011_1.m3u8
|
||||
CCTV11,http://home.kuaidi521.com:35455/gaoma/cctv11.m3u8
|
||||
CCTV12,http://nas.suntao.online:35455/gaoma/cctv12.m3u8
|
||||
CCTV12,http://112.81.218.254:35455/gaoma/cctv12.m3u8
|
||||
CCTV12,http://home.kuaidi521.com:35455/gaoma/cctv12.m3u8
|
||||
CCTV12,http://39.164.160.249:9901/tsfile/live/0012_1.m3u8
|
||||
@@ -225,11 +197,9 @@ CCTV12,http://124.93.18.238:9003//hls/12/index.m3u8
|
||||
CCTV12,http://huashetou.fun:35455/gaoma/cctv12.m3u8
|
||||
CCTV12,http://183.184.228.183:9003//hls/13/index.m3u8
|
||||
CCTV12,http://39.77.34.83:35455/gaoma/cctv12.m3u8
|
||||
CCTV13,http://tv.20191209.xyz:37377/migu/608807423.m3u8?migutoken=948b8b51df7e776bcf238bb9088879a2b71a25a424b0d80d5e71375315cda109c5aab5c79693c4324d45ad012e70208234f659abbe606a595a03d29e06ce931ed56f129fbc95a505ab84f72c
|
||||
CCTV13,http://61.163.181.78:9901/tsfile/live/0013_1.m3u8
|
||||
CCTV13,https://event.pull.hebtv.com/jishi/cp1.m3u8
|
||||
CCTV13,http://ali-m-l.cztv.com/channels/lantian/channel21/1080p.m3u8
|
||||
CCTV13,http://nas.suntao.online:35455/gaoma/cctv13.m3u8
|
||||
CCTV13,http://183.215.134.239:19901/tsfile/live/0013_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV13,http://1.itv.nctv.top:7777/gaoma/cctv13.m3u8
|
||||
CCTV13,http://36.105.100.208:35455/gaoma/cctv13.m3u8
|
||||
@@ -238,8 +208,6 @@ CCTV13,http://huashetou.fun:35455/gaoma/cctv13.m3u8
|
||||
CCTV13,http://112.81.218.254:35455/gaoma/cctv13.m3u8
|
||||
CCTV13,http://yc.myds.me:35455/gaoma/cctv13.m3u8
|
||||
CCTV13,http://183.184.228.183:9003//hls/14/index.m3u8
|
||||
CCTV14,http://tv.20191209.xyz:37377/migu/624878440.m3u8?migutoken=d84c14c00275d7fa951be2b0a959b0c1af15c62e7f86732fa2306e3a92f447f5b841e0cc26645dc89e70e970812e2c07c2fe24ae5c02b854544ed8c99d6c6d668a402d58cf351e77b5311afd
|
||||
CCTV14,http://nas.suntao.online:35455/gaoma/cctv14.m3u8
|
||||
CCTV14,http://112.81.218.254:35455/gaoma/cctv14.m3u8
|
||||
CCTV14,https://event.pull.hebtv.com/jishi/cp2.m3u8
|
||||
CCTV14,http://42.225.117.174:11199/tsfile/live/0014_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
@@ -253,14 +221,11 @@ CCTV14,http://36.105.100.208:35455/gaoma/cctv14.m3u8
|
||||
CCTV14,http://39.77.34.83:35455/gaoma/cctv14.m3u8
|
||||
CCTV14,http://124.93.18.238:9003//hls/14/index.m3u8
|
||||
CCTV14,http://183.184.228.183:9003//hls/15/index.m3u8
|
||||
CCTV15,http://tv.20191209.xyz:37377/migu/673168223.m3u8?migutoken=91bfd27ec54e6b68df329e3a36e211ea78e34558edc20ae3d76e0cbf89e6012d4e33c760dd200a4a41b2587c50dee210ca66da4ff8be48c4a97a2c7ab22d824ea440cc9c06961aa846be65a0
|
||||
CCTV15,http://nas.suntao.online:35455/gaoma/cctv15.m3u8
|
||||
CCTV15,http://39.164.160.249:9901/tsfile/live/0015_1.m3u8
|
||||
CCTV15,http://1.itv.nctv.top:7777/gaoma/cctv15.m3u8
|
||||
CCTV15,http://home.kuaidi521.com:35455/gaoma/cctv15.m3u8
|
||||
CCTV15,http://yc.myds.me:35455/gaoma/cctv15.m3u8
|
||||
CCTV15,http://124.93.18.238:9003//hls/15/index.m3u8
|
||||
CCTV16,http://nas.suntao.online:35455/gaoma/cctv16.m3u8
|
||||
CCTV16,http://1.24.39.180:9003/hls/60/index.m3u8
|
||||
CCTV16,http://124.93.18.238:9003//hls/16/index.m3u8
|
||||
CCTV16,http://xiaoya.crccxw.top:35455/gaoma/cctv16.m3u8
|
||||
@@ -271,7 +236,6 @@ CCTV16,http://huashetou.fun:35455/gaoma/cctv16.m3u8
|
||||
CCTV16,http://39.77.34.83:35455/gaoma/cctv16.m3u8
|
||||
CCTV16,http://yc.myds.me:35455/gaoma/cctv16.m3u8
|
||||
CCTV16,http://183.184.228.183:9003//hls/17/index.m3u8
|
||||
CCTV17,http://tv.20191209.xyz:37377/migu/673168256.m3u8?migutoken=eb3fbda758006d66837b5b6ef1b7ab6847a99f05f6b3303861d81e6e1335349499a40c8479d9a801327519db10547f9870398da6796159db51812e236c1b6c07d2c0f7e5bc32101c9cc222dc
|
||||
CCTV17,http://112.81.218.254:35455/gaoma/cctv17.m3u8
|
||||
CCTV17,http://yc.myds.me:35455/gaoma/cctv17.m3u8
|
||||
CCTV17,http://1.itv.nctv.top:7777/gaoma/cctv17.m3u8
|
||||
@@ -327,7 +291,6 @@ CCTV15,http://61.156.228.12:8154/tsfile/live/0015_1.m3u8
|
||||
大湾区卫视,http://222.128.55.152:9080/live/dwq.m3u8
|
||||
东方卫视,http://183.215.134.239:19901/tsfile/live/0107_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
东方卫视,http://39.164.160.249:9901/tsfile/live/0107_1.m3u8
|
||||
东方卫视,http://tv.20191209.xyz:37377/migu/651632648.m3u8?migutoken=a9a2b71c87ef01a1f546b80d3776d4e2ab5a03525b06b379f6d3ebca3a7a40f732115ab805783c8a8a73e5580900755cdfb3b6d3c2b9308a46141d56b6b629038613c381a9027a60e527e1c8
|
||||
东南卫视,http://120.76.248.139/live/bfgd/4200000483.m3u8
|
||||
东南卫视,http://115.149.139.141:10001/tsfile/live/1035_1.m3u8?blog.ntnas.top
|
||||
东南卫视,http://live.nctv.top/IDOPEpiryt/fjtv.php?id=5
|
||||
@@ -363,7 +326,6 @@ CCTV15,http://61.156.228.12:8154/tsfile/live/0015_1.m3u8
|
||||
吉林卫视,http://220.164.192.48:50085/tsfile/live/0118_1.m3u8
|
||||
江苏卫视,http://42.225.117.174:11199/tsfile/live/0127_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
江苏卫视,http://114.105.98.95:37377/migu/623899368.m3u8?migutoken=0c1255f44cf0460d401afd9fdc722c6398b97c5880dc9c45f00ae3faa4d208ecd6942cc08a2f3f09bac00b520297cc93d1b83c17d52ade00620508eae303d397c58e8b1deb59c8ac4158cd7d
|
||||
江苏卫视,http://tv.20191209.xyz:37377/migu/623899368.m3u8?migutoken=0c1255f44cf0460d401afd9fdc722c6398b97c5880dc9c45f00ae3faa4d208ecd6942cc08a2f3f09bac00b520297cc93d1b83c17d52ade00620508eae303d397c58e8b1deb59c8ac4158cd7d
|
||||
江苏卫视,http://live.nctv.top/IDOPEpiryt/jstv5.php?id=jsws
|
||||
江苏卫视,http://live.nctv.top/IDOPEpiryt/jstv.php?id=jsws
|
||||
江西卫视,http://120.76.248.139/live/bfgd/4200000098.m3u8
|
||||
|
||||
@@ -121,70 +121,104 @@ https://tv.iill.top/migu/dds
|
||||
https://tv.iill.top/migu/mgty
|
||||
|
||||
#INSERT_HERE
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」06:55 常规赛 湖人VS魔术 王晓晨 孔德昕
|
||||
https://tv.iill.top/NBA/CbWNev
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」06:55 常规赛 湖人VS魔术 郑泽鹏
|
||||
https://tv.iill.top/NBA/RA1Z7Z
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」06:55 常规赛 森林狼VS步行者 邢晨
|
||||
https://tv.iill.top/NBA/HGLdH7
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」06:55 常规赛 猛龙VS奇才 董倡硕
|
||||
https://tv.iill.top/NBA/CpzmxH
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:25 常规赛 独行侠VS篮网 陈鑫隆
|
||||
https://tv.iill.top/NBA/dZZqHs
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:55 常规赛 76人VS鹈鹕 姜帆 贾磊
|
||||
https://tv.iill.top/NBA/itOtVZ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」08:55 常规赛 公牛VS掘金 邵化谦 周赫
|
||||
https://tv.iill.top/NBA/7Ld8AD
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」09:45 常规赛 雄鹿VS太阳 张浩岳 徐咏 王羽希
|
||||
https://tv.iill.top/NBA/TftHAK
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」09:45 常规赛 凯尔特人VS国王 季孟年 李根 拜月宁
|
||||
https://tv.iill.top/NBA/2cslkV
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 陈垣宇/蒯曼、黄友政/孙晨晋级 陈垣宇/蒯曼、黄友政/孙晨晋级 2号桌
|
||||
https://tv.iill.top/Migu/0ugFPi
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「LPL」15:40 2025LPL第二赛段小组赛Day4 2025LPL第二赛段小组赛Day4 官方解说
|
||||
https://tv.iill.top/Migu/fwUW9g
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」17:30 姚钧涛领衔港乒众将冲正赛 姚钧涛领衔港乒众将冲正赛 2号桌
|
||||
https://tv.iill.top/Migu/qKu0V8
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」17:30 姚钧涛领衔港乒众将冲正赛 姚钧涛领衔港乒众将冲正赛 3号桌
|
||||
https://tv.iill.top/Migu/75DWEd
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」17:30 姚钧涛领衔港乒众将冲正赛 姚钧涛领衔港乒众将冲正赛 4号桌
|
||||
https://tv.iill.top/Migu/GLPXBV
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 周泽昊
|
||||
https://tv.iill.top/Migu/fVFZNp
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 1号桌
|
||||
https://tv.iill.top/Migu/cIr2o9
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 2号桌
|
||||
https://tv.iill.top/Migu/5jwsFC
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 3号桌
|
||||
https://tv.iill.top/Migu/2GhqAu
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 4号桌
|
||||
https://tv.iill.top/Migu/SR7bfi
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 5号桌
|
||||
https://tv.iill.top/Migu/QVDq1y
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 徐海东/陈幸同、诗和远方出战 徐海东/陈幸同、诗和远方出战 狂欢Yeah
|
||||
https://tv.iill.top/Migu/eGKpAT
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「咪咕体育日报」18:00 咪咕体育日报-场外直击国足世预赛 咪咕体育日报-场外直击国足世预赛 咪咕体育日报: 咪咕体育日报-在现场
|
||||
https://tv.iill.top/Migu/7MoZnp
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WCBA」19:20 半决赛 内蒙古农信 VS 东莞新彤盛 吕程
|
||||
https://tv.iill.top/Migu/jQ3fhV
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WCBA」19:20 半决赛 内蒙古农信 VS 东莞新彤盛 解说
|
||||
https://tv.iill.top/Migu/ojKo7S
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WCBA」19:15 半决赛 四川蜀道远达 VS 山西竹叶青酒 解说
|
||||
https://tv.iill.top/Migu/MrvBY3
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:00 常规赛第44轮 南京头排苏酒vs北京北汽 杨健 李根 秋童
|
||||
https://tv.iill.top/Migu/W5GNzf
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第44轮 南京头排苏酒vs北京北汽 王港
|
||||
https://tv.iill.top/Migu/bmqbV2
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第44轮 南京头排苏酒vs北京北汽 刘芳宇
|
||||
https://tv.iill.top/Migu/uX4pNw
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第44轮 南京头排苏酒vs北京北汽 现场原声
|
||||
https://tv.iill.top/Migu/0erVhX
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:00 常规赛第44轮 宁波町渥vs天津先行者 寇逸豪
|
||||
https://tv.iill.top/Migu/xTva5t
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第44轮 宁波町渥vs天津先行者 现场原声
|
||||
https://tv.iill.top/Migu/uf8faZ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「盐城国际足球邀请赛」19:35 盐城国际足球邀请赛 中国U22 vs 越南U22 2025中国之队国际足球邀请赛-中国U22-越南U22
|
||||
https://tv.iill.top/Migu/gOWq8w
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」06:55 常规赛 魔术VS黄蜂 周赫
|
||||
https://tv.iill.top/NBA/SjOKO0
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」06:55 常规赛 马刺VS活塞 王晓晨
|
||||
https://tv.iill.top/NBA/CBnDms
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:15 常规赛 勇士VS热火 杨健 李根 小七
|
||||
https://tv.iill.top/NBA/mOYwZG
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:25 常规赛 勇士VS热火 拜月宁
|
||||
https://tv.iill.top/NBA/xkxny2
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:25 常规赛 勇士VS热火 莫俊祺
|
||||
https://tv.iill.top/NBA/p5ZYge
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:25 常规赛 勇士VS热火 洪荒
|
||||
https://tv.iill.top/NBA/eVTb2F
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:25 常规赛 独行侠VS尼克斯 刘芳宇
|
||||
https://tv.iill.top/NBA/pgWuT6
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」07:55 常规赛 老鹰VS火箭 陈鑫隆
|
||||
https://tv.iill.top/NBA/2xUwaM
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」08:55 常规赛 灰熊VS爵士 邵化谦
|
||||
https://tv.iill.top/NBA/moRfuI
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」09:55 常规赛 骑士VS开拓者 姜帆
|
||||
https://tv.iill.top/NBA/FlbdFU
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/NBA.png" group-title="•咪咕「NBA」", 「NBA」09:45 常规赛 雷霆VS国王 庄宁宇 陈正昊 魏欣怡
|
||||
https://tv.iill.top/NBA/2ocC55
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTA」02:00 郑钦文0-2萨巴伦卡 郑钦文0-2萨巴伦卡 清流播出
|
||||
https://tv.iill.top/Migu/9LpQXJ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 周泽昊
|
||||
https://tv.iill.top/Migu/l8OdmG
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 2号桌
|
||||
https://tv.iill.top/Migu/8n4dqT
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 3号桌
|
||||
https://tv.iill.top/Migu/nn7lBG
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 4号桌
|
||||
https://tv.iill.top/Migu/HOaXJJ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 5号桌
|
||||
https://tv.iill.top/Migu/wB3HDA
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 1号桌
|
||||
https://tv.iill.top/Migu/t49ghE
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」10:00 钱天一晋级16强 刘炜珊3-4王添艺 钱天一晋级16强 刘炜珊3-4王添艺 狂欢Yeah
|
||||
https://tv.iill.top/Migu/AhlTKq
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「LPL」15:40 2025LPL第二赛段小组赛Day5 2025LPL第二赛段小组赛Day5 官方解说
|
||||
https://tv.iill.top/Migu/CaWWbk
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「KPL」16:40 长沙TES.A vs 深圳KLG 长沙TES.A vs 深圳KLG 官方解说
|
||||
https://tv.iill.top/Migu/ihROzt
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」17:30 申裕斌/柳韩娜女双出战冲正赛 申裕斌/柳韩娜女双出战冲正赛 1号桌
|
||||
https://tv.iill.top/Migu/mVZR6F
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」17:30 申裕斌/柳韩娜女双出战冲正赛 申裕斌/柳韩娜女双出战冲正赛 2号桌
|
||||
https://tv.iill.top/Migu/vwysIL
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」18:40 申裕斌/柳韩娜女双出战冲正赛 申裕斌/柳韩娜女双出战冲正赛 3号桌
|
||||
https://tv.iill.top/Migu/KVnIvZ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「WTT」18:40 申裕斌/柳韩娜女双出战冲正赛 申裕斌/柳韩娜女双出战冲正赛 4号桌
|
||||
https://tv.iill.top/Migu/fs2zxg
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 周冠达
|
||||
https://tv.iill.top/Migu/qBX9Xm
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 1号桌
|
||||
https://tv.iill.top/Migu/tDFNPJ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 2号桌
|
||||
https://tv.iill.top/Migu/ugDcec
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 3号桌
|
||||
https://tv.iill.top/Migu/ncf0a0
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 4号桌
|
||||
https://tv.iill.top/Migu/y9mTW1
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 5号桌
|
||||
https://tv.iill.top/Migu/2gO5o3
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「十五运乒乓球项目资格赛」18:00 混双、男女单打17至32名附加赛 混双、男女单打17至32名附加赛 狂欢Yeah
|
||||
https://tv.iill.top/Migu/F64sWN
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」18:30 北控vs辽宁赛前训练 北控vs辽宁赛前训练 周赫
|
||||
https://tv.iill.top/Migu/1ilKbK
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」18:30 北控vs辽宁赛前训练 北控vs辽宁赛前训练 哈秋
|
||||
https://tv.iill.top/Migu/Pii6G9
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:00 常规赛第45轮 山东高速vs新疆伊力特 邵化谦 曾令旭 拜月宁
|
||||
https://tv.iill.top/Migu/vXpfQ3
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 山东高速vs新疆伊力特 罗森
|
||||
https://tv.iill.top/Migu/c8N85B
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 山东高速vs新疆伊力特 盛哲
|
||||
https://tv.iill.top/Migu/NAAKfZ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 山东高速vs新疆伊力特 现场原声
|
||||
https://tv.iill.top/Migu/d6YAed
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:10 常规赛第45轮 青岛国信制药vs上海久事 连睿 周鹏 张兆旭
|
||||
https://tv.iill.top/Migu/4TI1Sb
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 青岛国信制药vs上海久事 刘沛元
|
||||
https://tv.iill.top/Migu/VDpSaQ
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 青岛国信制药vs上海久事 陈渤胄
|
||||
https://tv.iill.top/Migu/DDln5n
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 青岛国信制药vs上海久事 现场原声
|
||||
https://tv.iill.top/Migu/4S6vBd
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:10 常规赛第45轮 北京控股vs辽宁本钢 孔德昕 霍楠
|
||||
https://tv.iill.top/Migu/5CQ1Wh
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 北京控股vs辽宁本钢 周赫
|
||||
https://tv.iill.top/Migu/yNtdij
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 北京控股vs辽宁本钢 哈秋
|
||||
https://tv.iill.top/Migu/Xsp6K9
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 北京控股vs辽宁本钢 现场原声
|
||||
https://tv.iill.top/Migu/LfFT1t
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 北京控股vs辽宁本钢 明星机位1
|
||||
https://tv.iill.top/Migu/gGboBD
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「CBA」19:25 常规赛第45轮 北京控股vs辽宁本钢 明星机位2
|
||||
https://tv.iill.top/Migu/RAeFLD
|
||||
#EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「体育」", 「KPL」20:00 济南RW侠 vs 西安WE 济南RW侠 vs 西安WE 官方解说
|
||||
https://tv.iill.top/Migu/jk8AQM
|
||||
|
||||
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" tvg-logo="https://epg.iill.top/logo/凤凰中文.png" http-user-agent="FengWatch/5.4.14" group-title="•港澳「限制」",鳳凰衛視·中文「限UA」
|
||||
http://dns.yiandrive.com:15907/phenix/fhzw
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -27,8 +27,6 @@
|
||||
"site_urls": [
|
||||
"https://mihdr.top",
|
||||
"http://www.miqk.cc",
|
||||
"http://www.xhww.net",
|
||||
"http://xhww.net",
|
||||
"https://xiaomiai.site"
|
||||
],
|
||||
"url_key": "Netfixtv",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
2772
小米/lives/平台直播.txt
2772
小米/lives/平台直播.txt
File diff suppressed because it is too large
Load Diff
133
欧歌/api.json
133
欧歌/api.json
@@ -4,9 +4,9 @@
|
||||
"spider": "./spider.jar",
|
||||
"lives": [
|
||||
{
|
||||
"name": "【网络收集,免费分享】请勿演示贩卖,接口即将关闭",
|
||||
"name": "【公众号欧歌APP网络收集】接口即将关闭,请勿演示",
|
||||
"type": 0,
|
||||
"url": "./lives/【网络收集,免费分享】请勿演示贩卖,接口即将关闭.txt",
|
||||
"url": "./lives/【公众号欧歌APP网络收集】接口即将关闭,请勿演示.txt",
|
||||
"epg": "http://cdn.1678520.xyz/epg/?ch={name}&date={date}"
|
||||
},
|
||||
{
|
||||
@@ -31,20 +31,20 @@
|
||||
"sites": [
|
||||
{
|
||||
"key": "豆瓣2",
|
||||
"name": "📢【网络收集,免费分享】请勿演示贩卖,接口即将关闭",
|
||||
"name": "📢【公众号欧歌APP网络收集】接口即将关闭,请勿演示",
|
||||
"type": 3,
|
||||
"api": "csp_Douban",
|
||||
"searchable": 0
|
||||
},
|
||||
{
|
||||
"key": "豆瓣1",
|
||||
"name": "📢【网络收集,免费分享】请勿演示贩卖,接口即将关闭公告❤更新:3/11❤",
|
||||
"name": "📢【公众号欧歌APP网络收集】接口即将关闭,请勿演示公告❤更新:3/26❤",
|
||||
"type": 3,
|
||||
"api": "csp_Notice",
|
||||
"searchable": 0,
|
||||
"changeable": 0,
|
||||
"jar": "./jars/豆瓣1.jar",
|
||||
"ext": "https://nxog.top/%E5%85%AC%E4%BC%97%E5%8F%B7%E6%AC%A7%E6%AD%8CAPP/ts/?b=【网络收集,免费分享】请勿演示贩卖,接口即将关闭"
|
||||
"ext": "https://欧歌.yy.nxog.top/公告.php?b=【公众号欧歌APP网络收集】接口即将关闭,请勿演示"
|
||||
},
|
||||
{
|
||||
"key": "欧歌弹幕",
|
||||
@@ -158,16 +158,6 @@
|
||||
"playerType": 2,
|
||||
"ext": "eaHR0cHM6Ly9kLmRjbW92aWUudG9w"
|
||||
},
|
||||
{
|
||||
"key": "全网",
|
||||
"name": "💡全网|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Quanwk",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "https://www.91qkw.com"
|
||||
},
|
||||
{
|
||||
"key": "低端",
|
||||
"name": "💡低端|影视",
|
||||
@@ -186,23 +176,6 @@
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "厂长",
|
||||
"name": "💡厂长|资源",
|
||||
"type": 3,
|
||||
"api": "csp_Czzy",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "米兔",
|
||||
"name": "💡米兔|影视",
|
||||
"type": 3,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_MiTuApp"
|
||||
},
|
||||
{
|
||||
"key": "洽洽影视",
|
||||
"name": "💡洽洽|影视",
|
||||
@@ -221,14 +194,6 @@
|
||||
"quickSearch": 1,
|
||||
"api": "csp_MovieApp"
|
||||
},
|
||||
{
|
||||
"key": "小米兄弟",
|
||||
"name": "💡兄弟|影视",
|
||||
"type": 3,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"api": "csp_XiongDiApp"
|
||||
},
|
||||
{
|
||||
"key": "金牌影视",
|
||||
"name": "💡金牌|影视",
|
||||
@@ -248,20 +213,52 @@
|
||||
"ext": "caHR0cHM6Ly8xMjN5c3cuY29tfDIz5b2x6KeGfDQuMS44"
|
||||
},
|
||||
{
|
||||
"key": "时常",
|
||||
"name": "💡时常|影视",
|
||||
"key": "起点",
|
||||
"name": "💡起点|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xdai",
|
||||
"playerType": 1,
|
||||
"ext": "jaHR0cHM6Ly9zYzEwODAudG9wfGU1OWQ0NGIyZWVmMDNiYTJ8ZTU5ZDQ0YjJlZWYwM2JhMnwxMzQ="
|
||||
"ext": "jaHR0cDovL2NhaWppLm8wYS5jbnw3MGZkNjFkOTkxZjQzMjU3fDcwZmQ2MWQ5OTFmNDMyNTd8MTAw"
|
||||
},
|
||||
{
|
||||
"key": "现代",
|
||||
"name": "💡现代|影视",
|
||||
"key": "光速",
|
||||
"name": "💡光速|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xdai",
|
||||
"playerType": 1,
|
||||
"ext": "caHR0cHM6Ly94ZHlzLnZpcC9nZXRhcHAudHh0fHN6ZGp3ZGFwcHdjbm1kaGJ8c3pkandkYXBwd2NubWRoYnwxMTQ="
|
||||
"ext": "jaHR0cDovLzU5LjE1My4xNjcuMTM3Ojg4OTl8NGQ4M2I4N2M0YzVlYTExMXw0ZDgzYjg3YzRjNWVhMTExfDQ2Mg=="
|
||||
},
|
||||
{
|
||||
"key": "优秀",
|
||||
"name": "💡优秀|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xdai",
|
||||
"playerType": 1,
|
||||
"ext": "jaHR0cDovL2FpLnhpYW95dW4uaW5rfEtMckZxU2ptYzRPSWo3NkJ8S0xyRnFTam1jNE9Jajc2QnwzMDA="
|
||||
},
|
||||
{
|
||||
"key": "莉莉",
|
||||
"name": "💡莉莉|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xdai",
|
||||
"playerType": 1,
|
||||
"ext": "jaHR0cDovLzExMS4xODAuMTk4LjQwOjExMTB8NDk0ODA4MDgwbGdneXNjb3w0OTQ4MDgwODBsZ2d5c2NvfDY2Ng=="
|
||||
},
|
||||
{
|
||||
"key": "雨滴",
|
||||
"name": "💡雨滴|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xdai",
|
||||
"playerType": 1,
|
||||
"ext": "jaHR0cHM6Ly95ZHlzZHluYW1pY2RvbWFpbm5hbWUuNjguZ3k6MTA2NzgvYzltMmpzMjk4eDgyaDYvbDltOGJ4MjNqMm8ycDlxL2R5bmFtaWNkb21haW5uYW1lLnR4dHxrOW8zcDJjOGI3bTN6MG84fGs5bzNwMmM4YjdtM3owbzh8MTAw"
|
||||
},
|
||||
{
|
||||
"key": "优质",
|
||||
"name": "💡优质|影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xdai",
|
||||
"playerType": 1,
|
||||
"ext": "jaHR0cHM6Ly9keXl6dHZhcHBhcGlnb29kZ3guNjguZ3k6MTI2ODkvY2l3azI4dnUzOGlvOC9hcGl1cmwudHh0fGR5eXp0dmFwaWFwcHl5ZHN8ZHl5enR2YXBpYXBweXlkc3wxMDA="
|
||||
},
|
||||
{
|
||||
"key": "来看影视",
|
||||
@@ -279,6 +276,50 @@
|
||||
"api": "csp_YGP",
|
||||
"searchable": 0
|
||||
},
|
||||
{
|
||||
"key": "猎手影视",
|
||||
"name": "💡猎手|影视",
|
||||
"type": 3,
|
||||
"api": "./api/猎手影视.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"key": "火车影视",
|
||||
"name": "💡火车|影视",
|
||||
"type": 3,
|
||||
"api": "./api/火车影视.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"key": "美帕影视",
|
||||
"name": "💡美帕|影视",
|
||||
"type": 3,
|
||||
"api": "./api/美帕影视.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"key": "嗨皮影视",
|
||||
"name": "💡嗨皮|影视",
|
||||
"type": 3,
|
||||
"api": "./api/嗨皮影视.py",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"key": "厂长弹幕",
|
||||
"name": "💘厂长|弹幕",
|
||||
|
||||
3055
欧歌/api/drpy2.min.js
vendored
3055
欧歌/api/drpy2.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
194
欧歌/api/jinja.js
194
欧歌/api/jinja.js
@@ -20,11 +20,11 @@
|
||||
*/
|
||||
/*global require, exports, module, define */
|
||||
|
||||
(function (global, factory) {
|
||||
(function(global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jinja = {}));
|
||||
})(this, (function (jinja) {
|
||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jinja = {}));
|
||||
})(this, (function(jinja) {
|
||||
"use strict";
|
||||
var STRINGS = /'(\\.|[^'])*'|"(\\.|[^"'"])*"/g;
|
||||
var IDENTS_AND_NUMS = /([$_a-z][$\w]*)|([+-]?\d+(\.\d+)?)/g;
|
||||
@@ -77,20 +77,22 @@
|
||||
this.isSilent = false;
|
||||
}
|
||||
|
||||
Parser.prototype.push = function (line) {
|
||||
Parser.prototype.push = function(line) {
|
||||
if (!this.isSilent) {
|
||||
this.compiled.push(line);
|
||||
}
|
||||
};
|
||||
|
||||
Parser.prototype.parse = function (src) {
|
||||
Parser.prototype.parse = function(src) {
|
||||
this.tokenize(src);
|
||||
return this.compiled;
|
||||
};
|
||||
|
||||
Parser.prototype.tokenize = function (src) {
|
||||
var lastEnd = 0, parser = this, trimLeading = false;
|
||||
matchAll(src, START_TOKEN, function (open, index, src) {
|
||||
Parser.prototype.tokenize = function(src) {
|
||||
var lastEnd = 0,
|
||||
parser = this,
|
||||
trimLeading = false;
|
||||
matchAll(src, START_TOKEN, function(open, index, src) {
|
||||
//here we match the rest of the src against a regex for this tag
|
||||
var match = src.slice(index + open.length).match(TAGS[open]);
|
||||
match = (match ? match[0] : '');
|
||||
@@ -127,11 +129,11 @@
|
||||
this.textHandler(text);
|
||||
};
|
||||
|
||||
Parser.prototype.textHandler = function (text) {
|
||||
Parser.prototype.textHandler = function(text) {
|
||||
this.push('write(' + JSON.stringify(text) + ');');
|
||||
};
|
||||
|
||||
Parser.prototype.tokenHandler = function (open, inner) {
|
||||
Parser.prototype.tokenHandler = function(open, inner) {
|
||||
var type = delimeters[open];
|
||||
if (type === 'directive') {
|
||||
this.compileTag(inner);
|
||||
@@ -140,7 +142,7 @@
|
||||
//replace || operators with ~
|
||||
extracted.src = extracted.src.replace(/\|\|/g, '~').split('|');
|
||||
//put back || operators
|
||||
extracted.src = extracted.src.map(function (part) {
|
||||
extracted.src = extracted.src.map(function(part) {
|
||||
return part.split('~').join('||');
|
||||
});
|
||||
var parts = this.injectEnt(extracted, '@');
|
||||
@@ -153,7 +155,7 @@
|
||||
}
|
||||
};
|
||||
|
||||
Parser.prototype.compileTag = function (str) {
|
||||
Parser.prototype.compileTag = function(str) {
|
||||
var directive = str.split(' ')[0];
|
||||
var handler = tagHandlers[directive];
|
||||
if (!handler) {
|
||||
@@ -162,20 +164,23 @@
|
||||
handler.call(this, str.slice(directive.length).trim());
|
||||
};
|
||||
|
||||
Parser.prototype.parseFilter = function (src) {
|
||||
Parser.prototype.parseFilter = function(src) {
|
||||
src = src.trim();
|
||||
var match = src.match(/[:(]/);
|
||||
var i = match ? match.index : -1;
|
||||
if (i < 0) return JSON.stringify([src]);
|
||||
var name = src.slice(0, i);
|
||||
var args = src.charAt(i) === ':' ? src.slice(i + 1) : src.slice(i + 1, -1);
|
||||
args = this.parseExpr(args, {terms: true});
|
||||
args = this.parseExpr(args, {
|
||||
terms: true
|
||||
});
|
||||
return '[' + JSON.stringify(name) + ',' + args + ']';
|
||||
};
|
||||
|
||||
Parser.prototype.extractEnt = function (src, regex, placeholder) {
|
||||
var subs = [], isFunc = typeof placeholder == 'function';
|
||||
src = src.replace(regex, function (str) {
|
||||
Parser.prototype.extractEnt = function(src, regex, placeholder) {
|
||||
var subs = [],
|
||||
isFunc = typeof placeholder == 'function';
|
||||
src = src.replace(regex, function(str) {
|
||||
var replacement = isFunc ? placeholder(str) : placeholder;
|
||||
if (replacement) {
|
||||
subs.push(str);
|
||||
@@ -183,15 +188,21 @@
|
||||
}
|
||||
return str;
|
||||
});
|
||||
return {src: src, subs: subs};
|
||||
return {
|
||||
src: src,
|
||||
subs: subs
|
||||
};
|
||||
};
|
||||
|
||||
Parser.prototype.injectEnt = function (extracted, placeholder) {
|
||||
var src = extracted.src, subs = extracted.subs, isArr = Array.isArray(src);
|
||||
Parser.prototype.injectEnt = function(extracted, placeholder) {
|
||||
var src = extracted.src,
|
||||
subs = extracted.subs,
|
||||
isArr = Array.isArray(src);
|
||||
var arr = (isArr) ? src : [src];
|
||||
var re = new RegExp('[' + placeholder + ']', 'g'), i = 0;
|
||||
arr.forEach(function (src, index) {
|
||||
arr[index] = src.replace(re, function () {
|
||||
var re = new RegExp('[' + placeholder + ']', 'g'),
|
||||
i = 0;
|
||||
arr.forEach(function(src, index) {
|
||||
arr[index] = src.replace(re, function() {
|
||||
return subs[i++];
|
||||
});
|
||||
});
|
||||
@@ -199,7 +210,7 @@
|
||||
};
|
||||
|
||||
//replace complex literals without mistaking subscript notation with array literals
|
||||
Parser.prototype.replaceComplex = function (s) {
|
||||
Parser.prototype.replaceComplex = function(s) {
|
||||
var parsed = this.extractEnt(s, /i(\.i|\[[@#i]\])+/g, 'v');
|
||||
parsed.src = parsed.src.replace(NON_PRIMITIVES, '~');
|
||||
return this.injectEnt(parsed, 'v');
|
||||
@@ -207,17 +218,17 @@
|
||||
|
||||
//parse expression containing literals (including objects/arrays) and variables (including dot and subscript notation)
|
||||
//valid expressions: `a + 1 > b.c or c == null`, `a and b[1] != c`, `(a < b) or (c < d and e)`, 'a || [1]`
|
||||
Parser.prototype.parseExpr = function (src, opts) {
|
||||
Parser.prototype.parseExpr = function(src, opts) {
|
||||
opts = opts || {};
|
||||
//extract string literals -> @
|
||||
var parsed1 = this.extractEnt(src, STRINGS, '@');
|
||||
//note: this will catch {not: 1} and a.is; could we replace temporarily and then check adjacent chars?
|
||||
parsed1.src = parsed1.src.replace(EOPS, function (s, before, op, after) {
|
||||
parsed1.src = parsed1.src.replace(EOPS, function(s, before, op, after) {
|
||||
return (op in operators) ? before + operators[op] + after : s;
|
||||
});
|
||||
//sub out non-string literals (numbers/true/false/null) -> #
|
||||
// the distinction is necessary because @ can be object identifiers, # cannot
|
||||
var parsed2 = this.extractEnt(parsed1.src, IDENTS_AND_NUMS, function (s) {
|
||||
var parsed2 = this.extractEnt(parsed1.src, IDENTS_AND_NUMS, function(s) {
|
||||
return (s in constants || NUMBER.test(s)) ? '#' : null;
|
||||
});
|
||||
//sub out object/variable identifiers -> i
|
||||
@@ -229,10 +240,10 @@
|
||||
var simplified = parsed3.src;
|
||||
//sub out complex literals (objects/arrays) -> ~
|
||||
// the distinction is necessary because @ and # can be subscripts but ~ cannot
|
||||
while (simplified !== (simplified = this.replaceComplex(simplified))) ;
|
||||
while (simplified !== (simplified = this.replaceComplex(simplified)));
|
||||
//now @ represents strings, # represents other primitives and ~ represents non-primitives
|
||||
//replace complex variables (those with dot/subscript accessors) -> v
|
||||
while (simplified !== (simplified = simplified.replace(/i(\.i|\[[@#i]\])+/, 'v'))) ;
|
||||
while (simplified !== (simplified = simplified.replace(/i(\.i|\[[@#i]\])+/, 'v')));
|
||||
//empty subscript or complex variables in subscript, are not permitted
|
||||
simplified = simplified.replace(/[iv]\[v?\]/g, 'x');
|
||||
//sub in "i" for @ and # and ~ and v (now "i" represents all literals, variables and identifiers)
|
||||
@@ -242,9 +253,9 @@
|
||||
//allow 'not' unary operator
|
||||
simplified = simplified.replace(/!+[i]/g, 'i');
|
||||
var terms = opts.terms ? simplified.split(',') : [simplified];
|
||||
terms.forEach(function (term) {
|
||||
terms.forEach(function(term) {
|
||||
//simplify logical grouping
|
||||
while (term !== (term = term.replace(/\(i(%i)*\)/g, 'i'))) ;
|
||||
while (term !== (term = term.replace(/\(i(%i)*\)/g, 'i')));
|
||||
if (!term.match(/^i(%i)*/)) {
|
||||
throw new Error('Invalid expression: ' + src + " " + term);
|
||||
}
|
||||
@@ -255,15 +266,16 @@
|
||||
return this.injectEnt(parsed1, '@');
|
||||
};
|
||||
|
||||
Parser.prototype.parseVar = function (src) {
|
||||
Parser.prototype.parseVar = function(src) {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
var str = args.pop(), index = args.pop();
|
||||
var str = args.pop(),
|
||||
index = args.pop();
|
||||
//quote bare object identifiers (might be a reserved word like {while: 1})
|
||||
if (src === 'i' && str.charAt(index + 1) === ':') {
|
||||
return '"i"';
|
||||
}
|
||||
var parts = ['"i"'];
|
||||
src.replace(ACCESSOR, function (part) {
|
||||
src.replace(ACCESSOR, function(part) {
|
||||
if (part === '.i') {
|
||||
parts.push('"i"');
|
||||
} else if (part === '[i]') {
|
||||
@@ -276,15 +288,15 @@
|
||||
};
|
||||
|
||||
//escapes a name to be used as a javascript identifier
|
||||
Parser.prototype.escName = function (str) {
|
||||
return str.replace(/\W/g, function (s) {
|
||||
Parser.prototype.escName = function(str) {
|
||||
return str.replace(/\W/g, function(s) {
|
||||
return '$' + s.charCodeAt(0).toString(16);
|
||||
});
|
||||
};
|
||||
|
||||
Parser.prototype.parseQuoted = function (str) {
|
||||
Parser.prototype.parseQuoted = function(str) {
|
||||
if (str.charAt(0) === "'") {
|
||||
str = str.slice(1, -1).replace(/\\.|"/, function (s) {
|
||||
str = str.slice(1, -1).replace(/\\.|"/, function(s) {
|
||||
if (s === "\\'") return "'";
|
||||
return s.charAt(0) === '\\' ? s : ('\\' + s);
|
||||
});
|
||||
@@ -297,48 +309,48 @@
|
||||
|
||||
//the context 'this' inside tagHandlers is the parser instance
|
||||
var tagHandlers = {
|
||||
'if': function (expr) {
|
||||
'if': function(expr) {
|
||||
this.push('if (' + this.parseExpr(expr) + ') {');
|
||||
this.nest.unshift('if');
|
||||
},
|
||||
'else': function () {
|
||||
'else': function() {
|
||||
if (this.nest[0] === 'for') {
|
||||
this.push('}, function() {');
|
||||
} else {
|
||||
this.push('} else {');
|
||||
}
|
||||
},
|
||||
'elseif': function (expr) {
|
||||
'elseif': function(expr) {
|
||||
this.push('} else if (' + this.parseExpr(expr) + ') {');
|
||||
},
|
||||
'endif': function () {
|
||||
'endif': function() {
|
||||
this.nest.shift();
|
||||
this.push('}');
|
||||
},
|
||||
'for': function (str) {
|
||||
'for': function(str) {
|
||||
var i = str.indexOf(' in ');
|
||||
var name = str.slice(0, i).trim();
|
||||
var expr = str.slice(i + 4).trim();
|
||||
this.push('each(' + this.parseExpr(expr) + ',' + JSON.stringify(name) + ',function() {');
|
||||
this.nest.unshift('for');
|
||||
},
|
||||
'endfor': function () {
|
||||
'endfor': function() {
|
||||
this.nest.shift();
|
||||
this.push('});');
|
||||
},
|
||||
'raw': function () {
|
||||
'raw': function() {
|
||||
this.rawMode = true;
|
||||
},
|
||||
'endraw': function () {
|
||||
'endraw': function() {
|
||||
this.rawMode = false;
|
||||
},
|
||||
'set': function (stmt) {
|
||||
'set': function(stmt) {
|
||||
var i = stmt.indexOf('=');
|
||||
var name = stmt.slice(0, i).trim();
|
||||
var expr = stmt.slice(i + 1).trim();
|
||||
this.push('set(' + JSON.stringify(name) + ',' + this.parseExpr(expr) + ');');
|
||||
},
|
||||
'block': function (name) {
|
||||
'block': function(name) {
|
||||
if (this.isParent) {
|
||||
++this.parentBlocks;
|
||||
var blockName = 'block_' + (this.escName(name) || this.parentBlocks);
|
||||
@@ -351,7 +363,7 @@
|
||||
}
|
||||
this.nest.unshift('block');
|
||||
},
|
||||
'endblock': function () {
|
||||
'endblock': function() {
|
||||
this.nest.shift();
|
||||
if (this.isParent) {
|
||||
this.push('});');
|
||||
@@ -360,7 +372,7 @@
|
||||
this.isSilent = true;
|
||||
}
|
||||
},
|
||||
'extends': function (name) {
|
||||
'extends': function(name) {
|
||||
name = this.parseQuoted(name);
|
||||
var parentSrc = this.readTemplateFile(name);
|
||||
this.isParent = true;
|
||||
@@ -370,7 +382,7 @@
|
||||
//silence output until we enter a child block
|
||||
this.isSilent = true;
|
||||
},
|
||||
'include': function (name) {
|
||||
'include': function(name) {
|
||||
name = this.parseQuoted(name);
|
||||
var incSrc = this.readTemplateFile(name);
|
||||
this.isInclude = true;
|
||||
@@ -385,29 +397,31 @@
|
||||
tagHandlers.elif = tagHandlers.elseif;
|
||||
|
||||
var getRuntime = function runtime(data, opts) {
|
||||
var defaults = {autoEscape: 'toJson'};
|
||||
var defaults = {
|
||||
autoEscape: 'toJson'
|
||||
};
|
||||
var _toString = Object.prototype.toString;
|
||||
var _hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
var getKeys = Object.keys || function (obj) {
|
||||
var getKeys = Object.keys || function(obj) {
|
||||
var keys = [];
|
||||
for (var n in obj) if (_hasOwnProperty.call(obj, n)) keys.push(n);
|
||||
for (var n in obj)
|
||||
if (_hasOwnProperty.call(obj, n)) keys.push(n);
|
||||
return keys;
|
||||
};
|
||||
var isArray = Array.isArray || function (obj) {
|
||||
var isArray = Array.isArray || function(obj) {
|
||||
return _toString.call(obj) === '[object Array]';
|
||||
};
|
||||
var create = Object.create || function (obj) {
|
||||
function F() {
|
||||
}
|
||||
var create = Object.create || function(obj) {
|
||||
function F() {}
|
||||
|
||||
F.prototype = obj;
|
||||
return new F();
|
||||
};
|
||||
var toString = function (val) {
|
||||
var toString = function(val) {
|
||||
if (val == null) return '';
|
||||
return (typeof val.toString == 'function') ? val.toString() : _toString.call(val);
|
||||
};
|
||||
var extend = function (dest, src) {
|
||||
var extend = function(dest, src) {
|
||||
var keys = getKeys(src);
|
||||
for (var i = 0, len = keys.length; i < len; i++) {
|
||||
var key = keys[i];
|
||||
@@ -416,8 +430,9 @@
|
||||
return dest;
|
||||
};
|
||||
//get a value, lexically, starting in current context; a.b -> get("a","b")
|
||||
var get = function () {
|
||||
var val, n = arguments[0], c = stack.length;
|
||||
var get = function() {
|
||||
var val, n = arguments[0],
|
||||
c = stack.length;
|
||||
while (c--) {
|
||||
val = stack[c][n];
|
||||
if (typeof val != 'undefined') break;
|
||||
@@ -429,21 +444,23 @@
|
||||
}
|
||||
return (val == null) ? '' : val;
|
||||
};
|
||||
var set = function (n, val) {
|
||||
var set = function(n, val) {
|
||||
stack[stack.length - 1][n] = val;
|
||||
};
|
||||
var push = function (ctx) {
|
||||
var push = function(ctx) {
|
||||
stack.push(ctx || {});
|
||||
};
|
||||
var pop = function () {
|
||||
var pop = function() {
|
||||
stack.pop();
|
||||
};
|
||||
var write = function (str) {
|
||||
var write = function(str) {
|
||||
output.push(str);
|
||||
};
|
||||
var filter = function (val) {
|
||||
var filter = function(val) {
|
||||
for (var i = 1, len = arguments.length; i < len; i++) {
|
||||
var arr = arguments[i], name = arr[0], filter = filters[name];
|
||||
var arr = arguments[i],
|
||||
name = arr[0],
|
||||
filter = filters[name];
|
||||
if (filter) {
|
||||
arr[0] = val;
|
||||
//now arr looks like [val, arg1, arg2]
|
||||
@@ -458,47 +475,58 @@
|
||||
}
|
||||
output.push(val);
|
||||
};
|
||||
var each = function (obj, loopvar, fn1, fn2) {
|
||||
var each = function(obj, loopvar, fn1, fn2) {
|
||||
if (obj == null) return;
|
||||
var arr = isArray(obj) ? obj : getKeys(obj), len = arr.length;
|
||||
var ctx = {loop: {length: len, first: arr[0], last: arr[len - 1]}};
|
||||
var arr = isArray(obj) ? obj : getKeys(obj),
|
||||
len = arr.length;
|
||||
var ctx = {
|
||||
loop: {
|
||||
length: len,
|
||||
first: arr[0],
|
||||
last: arr[len - 1]
|
||||
}
|
||||
};
|
||||
push(ctx);
|
||||
for (var i = 0; i < len; i++) {
|
||||
extend(ctx.loop, {index: i + 1, index0: i});
|
||||
extend(ctx.loop, {
|
||||
index: i + 1,
|
||||
index0: i
|
||||
});
|
||||
fn1(ctx[loopvar] = arr[i]);
|
||||
}
|
||||
if (len === 0 && fn2) fn2();
|
||||
pop();
|
||||
};
|
||||
var block = function (fn) {
|
||||
var block = function(fn) {
|
||||
push();
|
||||
fn();
|
||||
pop();
|
||||
};
|
||||
var render = function () {
|
||||
var render = function() {
|
||||
return output.join('');
|
||||
};
|
||||
data = data || {};
|
||||
opts = extend(defaults, opts || {});
|
||||
var filters = extend({
|
||||
html: function (val) {
|
||||
html: function(val) {
|
||||
return toString(val)
|
||||
.split('&').join('&')
|
||||
.split('<').join('<')
|
||||
.split('>').join('>')
|
||||
.split('"').join('"');
|
||||
},
|
||||
safe: function (val) {
|
||||
safe: function(val) {
|
||||
return val;
|
||||
},
|
||||
toJson: function (val) {
|
||||
toJson: function(val) {
|
||||
if (typeof val === 'object') {
|
||||
return JSON.stringify(val);
|
||||
}
|
||||
return toString(val);
|
||||
}
|
||||
}, opts.filters || {});
|
||||
var stack = [create(data || {})], output = [];
|
||||
var stack = [create(data || {})],
|
||||
output = [];
|
||||
return {
|
||||
get: get,
|
||||
set: set,
|
||||
@@ -514,7 +542,7 @@
|
||||
|
||||
var runtime;
|
||||
|
||||
jinja.compile = function (markup, opts) {
|
||||
jinja.compile = function(markup, opts) {
|
||||
opts = opts || {};
|
||||
var parser = new Parser();
|
||||
parser.readTemplateFile = this.readTemplateFile;
|
||||
@@ -531,17 +559,19 @@
|
||||
runtime = runtime || (runtime = getRuntime.toString());
|
||||
fn = new Function('data', 'options', 'return (' + code + ')((' + runtime + ')(data, options))');
|
||||
}
|
||||
return {render: fn};
|
||||
return {
|
||||
render: fn
|
||||
};
|
||||
};
|
||||
|
||||
jinja.render = function (markup, data, opts) {
|
||||
jinja.render = function(markup, data, opts) {
|
||||
var tmpl = jinja.compile(markup);
|
||||
return tmpl.render(data, opts);
|
||||
};
|
||||
|
||||
jinja.templateFiles = [];
|
||||
|
||||
jinja.readTemplateFile = function (name) {
|
||||
jinja.readTemplateFile = function(name) {
|
||||
var templateFiles = this.templateFiles || [];
|
||||
var templateFile = templateFiles[name];
|
||||
if (templateFile == null) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
3542
欧歌/api/json5.js
3542
欧歌/api/json5.js
File diff suppressed because one or more lines are too long
5860
欧歌/api/node-rsa.js
5860
欧歌/api/node-rsa.js
File diff suppressed because one or more lines are too long
1441
欧歌/api/pako.min.js
vendored
1441
欧歌/api/pako.min.js
vendored
File diff suppressed because one or more lines are too long
146
欧歌/api/嗨皮影视.py
Normal file
146
欧歌/api/嗨皮影视.py
Normal file
@@ -0,0 +1,146 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# by @嗷呜
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
import requests
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
|
||||
def init(self, extend=""):
|
||||
pass
|
||||
|
||||
def getName(self):
|
||||
return "hitv"
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def destroy(self):
|
||||
pass
|
||||
|
||||
def homeContent(self, filter):
|
||||
result = {}
|
||||
cateManual = {
|
||||
# "直播": "live",
|
||||
'排行榜': 'rank',
|
||||
"电影": "1",
|
||||
"剧集": "2",
|
||||
"综艺": "3",
|
||||
"动画": "4",
|
||||
"短片": "5"
|
||||
}
|
||||
classes = []
|
||||
for k in cateManual:
|
||||
classes.append({
|
||||
'type_name': k,
|
||||
'type_id': cateManual[k]
|
||||
})
|
||||
result['class'] = classes
|
||||
return result
|
||||
|
||||
host = "https://wys.upfuhn.com"
|
||||
headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
|
||||
"Chrome/80.0.3987.149 Safari/537.36"
|
||||
}
|
||||
|
||||
def list(self, list):
|
||||
videos = []
|
||||
for it in list:
|
||||
videos.append({
|
||||
"vod_id": it['video_site_id'],
|
||||
"vod_name": it['video_name'],
|
||||
"vod_pic": it['video_horizontal_url'] or it['video_vertical_url'],
|
||||
"vod_remarks": it['newest_series_num'],
|
||||
"vod_year": it['years'],
|
||||
})
|
||||
return videos
|
||||
|
||||
def homeVideoContent(self):
|
||||
url = f'{self.host}/v1/ys_video_sites/hot?t=1'
|
||||
data = requests.get(url, headers=self.headers).json()
|
||||
videos = self.list(data['data']['data'])
|
||||
result = {'list': videos}
|
||||
return result
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
path = f'/v1/ys_video_sites?t={tid}&s_t=0&a&y&o=0&ps=21&pn={pg}'
|
||||
rank = False
|
||||
if tid == 'rank':
|
||||
if pg == 1:
|
||||
path = f'/v1/ys_video_sites/ranking'
|
||||
rank = True
|
||||
else:
|
||||
path = ''
|
||||
# elif tid == 'live' and pg == 1:
|
||||
# path = f'/v1/ys_live_tvs'
|
||||
videos = []
|
||||
result = {}
|
||||
try:
|
||||
data = requests.get(self.host + path, headers=self.headers).json()
|
||||
if rank:
|
||||
for video in data['data']:
|
||||
videos.extend(data['data'][video])
|
||||
else:
|
||||
videos = data['data']['data']
|
||||
result = {}
|
||||
result['list'] = self.list(videos)
|
||||
result['page'] = pg
|
||||
result['pagecount'] = 9999
|
||||
result['limit'] = 90
|
||||
result['total'] = 999999
|
||||
except:
|
||||
result['list'] = []
|
||||
return result
|
||||
|
||||
def detailContent(self, ids):
|
||||
tid = ids[0]
|
||||
url = f'{self.host}/v1/ys_video_series/by_vid/{tid}'
|
||||
data = requests.get(url, headers=self.headers).json()
|
||||
data1 = data['data']['ys_video_site']
|
||||
urls = []
|
||||
for it in data['data']['data']:
|
||||
urls.append(it['series_num'] + '$' + it['video_url'])
|
||||
vod = {
|
||||
'vod_name': data1['video_name'],
|
||||
'type_name': data1['tag'],
|
||||
'vod_year': data1['years'],
|
||||
'vod_area': data1['area'],
|
||||
'vod_director': data1['main_actor'],
|
||||
'vod_content': data1['video_desc'],
|
||||
'vod_play_from': '嗨皮在线',
|
||||
'vod_play_url': '#'.join(urls),
|
||||
}
|
||||
result = {
|
||||
'list': [
|
||||
vod
|
||||
]
|
||||
}
|
||||
return result
|
||||
|
||||
def searchContent(self, key, quick, pg=1):
|
||||
url = f'{self.host}/v1/ys_video_sites/search?s={key}&o=0&ps=200&pn={pg}'
|
||||
data = requests.get(url, headers=self.headers).json()
|
||||
videos = data['data']['video_sites']
|
||||
if data['data']['first_video_series'] is not None:
|
||||
videos = [data['data']['first_video_series']] + videos
|
||||
result = {}
|
||||
result['list'] = self.list(videos)
|
||||
result['page'] = pg
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
result = {
|
||||
'url': id,
|
||||
'parse': 0,
|
||||
'header': self.headers
|
||||
}
|
||||
return result
|
||||
|
||||
def localProxy(self, param):
|
||||
pass
|
||||
109
欧歌/api/模板.js
109
欧歌/api/模板.js
@@ -1,5 +1,5 @@
|
||||
if (typeof Object.assign !== 'function') {
|
||||
Object.assign = function () {
|
||||
Object.assign = function() {
|
||||
let target = arguments[0];
|
||||
for (let i = 1; i < arguments.length; i++) {
|
||||
let source = arguments[i];
|
||||
@@ -31,7 +31,7 @@ let common_lazy = `js:
|
||||
url: url,
|
||||
};
|
||||
} else {
|
||||
input;
|
||||
input = url && url.startsWith('http') && tellIsJx(url) ? {parse:0,jx:1,url:url}:input;
|
||||
}`;
|
||||
// 默认嗅探播放
|
||||
|
||||
@@ -90,10 +90,10 @@ function getMubans() {
|
||||
host: '', // homeUrl:'/',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
headers: { //网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA', // "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.navbar-items li:gt(0):lt(10);a&&Text;a&&href;/(\\d+)',
|
||||
@@ -113,14 +113,15 @@ function getMubans() {
|
||||
tab_text: 'div--small&&Text',
|
||||
},
|
||||
搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',
|
||||
}, mxone5: {
|
||||
},
|
||||
mxone5: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/show/fyclass--------fypage---.html',
|
||||
searchUrl: '/search/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?)\.html',
|
||||
play_parse: true,
|
||||
lazy: common_lazy,
|
||||
@@ -138,15 +139,16 @@ function getMubans() {
|
||||
tab_text: 'div--small&&Text',
|
||||
},
|
||||
搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',
|
||||
}, 首图: {
|
||||
},
|
||||
首图: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---/',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
headers: { //网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA', // "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html',
|
||||
@@ -166,14 +168,15 @@ function getMubans() {
|
||||
lists: '.myui-content__list:eq(#id) li',
|
||||
},
|
||||
搜索: '#searchList li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href;.detail&&Text',
|
||||
}, 首图2: {
|
||||
},
|
||||
首图2: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/list/fyclass-fypage.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA', // "Cookie": ""
|
||||
},
|
||||
@@ -196,7 +199,8 @@ function getMubans() {
|
||||
lists: '.stui-content__playlist:eq(#id) li',
|
||||
},
|
||||
搜索: 'ul.stui-vodlist__media,ul.stui-vodlist,#searchList li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href;.detail&&Text',
|
||||
}, 默认: {
|
||||
},
|
||||
默认: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '',
|
||||
@@ -230,14 +234,15 @@ function getMubans() {
|
||||
list_url: 'a&&href',
|
||||
},
|
||||
搜索: '列表;标题;图片;描述;链接;详情',
|
||||
}, vfed: {
|
||||
},
|
||||
vfed: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/index.php/vod/show/id/fyclass/page/fypage.html',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
},
|
||||
@@ -257,7 +262,8 @@ function getMubans() {
|
||||
lists: '.fed-play-item:eq(#id)&&ul:eq(1)&&li',
|
||||
},
|
||||
搜索: '.fed-deta-info;h1&&Text;.lazyload&&data-original;.fed-list-remarks&&Text;a&&href;.fed-deta-content&&Text',
|
||||
}, 海螺3: {
|
||||
},
|
||||
海螺3: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/v_search/**----------fypage---.html',
|
||||
@@ -284,10 +290,11 @@ function getMubans() {
|
||||
lists: '.hl-plays-list:eq(#id)&&li',
|
||||
},
|
||||
搜索: '.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
}, 海螺2: {
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
},
|
||||
海螺2: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**/',
|
||||
@@ -312,18 +319,19 @@ function getMubans() {
|
||||
lists: '.play_list_box:eq(#id)&&li',
|
||||
},
|
||||
搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
}, 短视: {
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
},
|
||||
短视: {
|
||||
title: '',
|
||||
host: '', // homeUrl:'/',
|
||||
url: '/channel/fyclass-fypage.html',
|
||||
searchUrl: '/search.html?wd=**',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 0, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
headers: { //网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA', // "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',
|
||||
@@ -343,7 +351,8 @@ function getMubans() {
|
||||
lists: '.player:eq(#id) li',
|
||||
},
|
||||
搜索: '.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href',
|
||||
}, 短视2: {
|
||||
},
|
||||
短视2: {
|
||||
title: '',
|
||||
host: '',
|
||||
class_name: '电影&电视剧&综艺&动漫',
|
||||
@@ -351,9 +360,11 @@ function getMubans() {
|
||||
searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
headers: {'User-Agent': 'MOBILE_UA'},
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
url: '/index.php/api/vod#type=fyclass&page=fypage',
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
filter_url: '',
|
||||
filter: {},
|
||||
filter_def: {},
|
||||
@@ -373,7 +384,8 @@ function getMubans() {
|
||||
lists: '.anthology-list-box:eq(#id) li',
|
||||
},
|
||||
搜索: 'json:list;name;pic;;id',
|
||||
}, 采集1: {
|
||||
},
|
||||
采集1: {
|
||||
title: '',
|
||||
host: '',
|
||||
homeTid: '13',
|
||||
@@ -381,16 +393,18 @@ function getMubans() {
|
||||
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
|
||||
searchUrl: '/api.php/provide/vod/?wd=**&pg=fypage',
|
||||
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyclass',
|
||||
headers: {'User-Agent': 'MOBILE_UA'},
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000, // class_name: '电影&电视剧&综艺&动漫',
|
||||
// class_url: '1&2&3&4',
|
||||
// class_parse:'js:let html=request(input);input=JSON.parse(html).class;',
|
||||
class_parse: 'json:class;',
|
||||
limit: 20,
|
||||
multi: 1,
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 1,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 1, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
play_parse: true,
|
||||
parse_url: '',
|
||||
lazy: cj_lazy,
|
||||
@@ -409,4 +423,7 @@ function getMubans() {
|
||||
|
||||
var mubanDict = getMubans();
|
||||
var muban = getMubans();
|
||||
export default {muban, getMubans};
|
||||
export default {
|
||||
muban,
|
||||
getMubans
|
||||
};
|
||||
301
欧歌/api/火车影视.py
Normal file
301
欧歌/api/火车影视.py
Normal file
@@ -0,0 +1,301 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# by @嗷呜
|
||||
import sys
|
||||
from urllib.parse import urlparse
|
||||
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 init(self, extend=""):
|
||||
self.device = self.device_id()
|
||||
self.host = self.gethost()
|
||||
pass
|
||||
|
||||
def getName(self):
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def action(self, action):
|
||||
pass
|
||||
|
||||
def destroy(self):
|
||||
pass
|
||||
|
||||
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 not re.search(r"\.m3u8|\.mp4", url):
|
||||
try:
|
||||
data = json.loads(b64decode(id.encode('utf-8')).decode('utf-8'))
|
||||
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')
|
||||
except Exception as e:
|
||||
pass
|
||||
if re.search(r'\.jpg|\.png|\.jpeg', url):
|
||||
url = self.Mproxy(url)
|
||||
result = {}
|
||||
result["parse"] = 0
|
||||
result["url"] = url
|
||||
result["header"] = {'user-agent': 'okhttp/4.9.2'}
|
||||
return result
|
||||
|
||||
def localProxy(self, param):
|
||||
return self.Mlocal(param)
|
||||
|
||||
def Mproxy(self, url):
|
||||
return self.getProxyUrl() + "&url=" + b64encode(url.encode('utf-8')).decode('utf-8') + "&type=m3u8"
|
||||
|
||||
def Mlocal(self, param,header=None):
|
||||
url = self.d64(param["url"])
|
||||
ydata = self.fetch(url, headers=header, allow_redirects=False)
|
||||
data = ydata.content.decode('utf-8')
|
||||
if ydata.headers.get('Location'):
|
||||
url = ydata.headers['Location']
|
||||
data = self.fetch(url, headers=header).content.decode('utf-8')
|
||||
parsed_url = urlparse(url)
|
||||
durl = parsed_url.scheme + "://" + parsed_url.netloc
|
||||
lines = data.strip().split('\n')
|
||||
for index, string in enumerate(lines):
|
||||
if '#EXT' not in string and 'http' not in string:
|
||||
last_slash_index = string.rfind('/')
|
||||
lpath = string[:last_slash_index + 1]
|
||||
lines[index] = durl + ('' if lpath.startswith('/') else '/') + lpath
|
||||
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):
|
||||
try:
|
||||
url = 'https://dns.alidns.com/dns-query'
|
||||
headers = {
|
||||
'User-Agent': 'okhttp/4.9.2',
|
||||
'Accept': 'application/dns-message'
|
||||
}
|
||||
params = {
|
||||
'dns': 'AAABAAABAAAAAAAACWJmbTExYXM5ZgdmdXFpeXVuAmNuAAAcAAE'
|
||||
}
|
||||
response = self.fetch(url, headers=headers, params=params)
|
||||
host=self.parse_dns_name(response.content, 12)
|
||||
return f"https://{host}"
|
||||
except:
|
||||
return "https://bfm11as9f.fuqiyun.cn"
|
||||
|
||||
def parse_dns_name(self, data, offset):
|
||||
parts = []
|
||||
while True:
|
||||
length = data[offset]
|
||||
if length == 0:
|
||||
break
|
||||
offset += 1
|
||||
parts.append(data[offset:offset + length].decode('utf-8'))
|
||||
offset += length
|
||||
return '.'.join(parts)
|
||||
|
||||
def header(self):
|
||||
headers = {
|
||||
'User-Agent': 'Android',
|
||||
'Accept': 'application/prs.55App.v2+json',
|
||||
'timestamp': str(int(time.time())),
|
||||
'x-client-setting': '{"pure-mode":0}',
|
||||
'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"] = str(int(time.time()))
|
||||
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:
|
||||
vd={"from_code": it['from_code'], "play_url": it['play_url'], "episode_id": it['episode_id'], "type": "play"}
|
||||
play_urls.append(
|
||||
f"{it['episode_name']}${b64encode(json.dumps(vd).encode('utf-8')).decode('utf-8')}"
|
||||
)
|
||||
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)
|
||||
279
欧歌/api/猎手影视.py
Normal file
279
欧歌/api/猎手影视.py
Normal file
@@ -0,0 +1,279 @@
|
||||
# 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)
|
||||
93
欧歌/api/美帕影视.py
Normal file
93
欧歌/api/美帕影视.py
Normal file
@@ -0,0 +1,93 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# by @嗷呜
|
||||
import sys
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
def getName(self):
|
||||
return "mp"
|
||||
|
||||
def init(self, extend=""):
|
||||
pass
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def destroy(self):
|
||||
pass
|
||||
|
||||
host = 'https://g.c494.com'
|
||||
|
||||
header = {
|
||||
'User-Agent': 'Dart/2.10 (dart:io)',
|
||||
'platform_version': 'RP1A.200720.011',
|
||||
'version': '2.2.3',
|
||||
'copyright': 'xiaogui',
|
||||
'platform': 'android',
|
||||
'client_name': '576O5p+P5b2x6KeG',
|
||||
}
|
||||
|
||||
def homeContent(self, filter):
|
||||
data = self.fetch(f'{self.host}/api.php/app/nav?token=', headers=self.header).json()
|
||||
dy = {"class": "类型", "area": "地区", "lang": "语言", "year": "年份", "letter": "字母", "by": "排序",
|
||||
"sort": "排序"}
|
||||
filters = {}
|
||||
classes = []
|
||||
json_data = data["list"]
|
||||
for item in json_data:
|
||||
has_non_empty_field = False
|
||||
jsontype_extend = item["type_extend"]
|
||||
classes.append({"type_name": item["type_name"], "type_id": str(item["type_id"])})
|
||||
for key in dy:
|
||||
if key in jsontype_extend and jsontype_extend[key].strip() != "":
|
||||
has_non_empty_field = True
|
||||
break
|
||||
if has_non_empty_field:
|
||||
filters[str(item["type_id"])] = []
|
||||
for dkey in jsontype_extend:
|
||||
if dkey in dy and jsontype_extend[dkey].strip() != "":
|
||||
values = jsontype_extend[dkey].split(",")
|
||||
value_array = [{"n": value.strip(), "v": value.strip()} for value in values if
|
||||
value.strip() != ""]
|
||||
filters[str(item["type_id"])].append({"key": dkey, "name": dy[dkey], "value": value_array})
|
||||
result = {}
|
||||
result["class"] = classes
|
||||
result["filters"] = filters
|
||||
return result
|
||||
|
||||
def homeVideoContent(self):
|
||||
rsp = self.fetch(f"{self.host}/api.php/app/index_video?token=", headers=self.header)
|
||||
root = rsp.json()['list']
|
||||
videos = [item for vodd in root for item in vodd['vlist']]
|
||||
return {'list': videos}
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
parms = {"pg": pg, "tid": tid, "class": extend.get("class", ""), "area": extend.get("area", ""),
|
||||
"lang": extend.get("lang", ""), "year": extend.get("year", ""), "token": ""}
|
||||
data = self.fetch(f'{self.host}/api.php/app/video', params=parms, headers=self.header).json()
|
||||
return data
|
||||
|
||||
def detailContent(self, ids):
|
||||
parms = {"id": ids[0], "token": ""}
|
||||
data = self.fetch(f'{self.host}/api.php/app/video_detail', params=parms, headers=self.header).json()
|
||||
vod = data['data']
|
||||
vod.pop('pause_advert_list', None)
|
||||
vod.pop('init_advert_list', None)
|
||||
vod.pop('vod_url_with_player', None)
|
||||
return {"list": [vod]}
|
||||
|
||||
def searchContent(self, key, quick, pg='1'):
|
||||
parms = {'pg': pg, 'text': key, 'token': ''}
|
||||
data = self.fetch(f'{self.host}/api.php/app/search', params=parms, headers=self.header).json()
|
||||
return data
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
return {"parse": 0, "url": id, "header": {'User-Agent': 'User-Agent: Lavf/58.12.100'}}
|
||||
|
||||
def localProxy(self, param):
|
||||
pass
|
||||
1506
欧歌/json/球星合集.json
1506
欧歌/json/球星合集.json
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
3603
欧歌/lives/【公众号欧歌APP网络收集】接口即将关闭,请勿演示.txt
Normal file
3603
欧歌/lives/【公众号欧歌APP网络收集】接口即将关闭,请勿演示.txt
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
46
王二小/api.json
46
王二小/api.json
@@ -50,10 +50,10 @@
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "Wexpan123ziyuanGuard",
|
||||
"name": "💓123┃4K💓",
|
||||
"key": "WexxzysGuard",
|
||||
"name": "💓校长┃4K💓",
|
||||
"type": 3,
|
||||
"api": "csp_Wexpan123ziyuanGuard",
|
||||
"api": "csp_WexxzysGuard",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
@@ -138,14 +138,6 @@
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "WexxzysGuard",
|
||||
"name": "💓校长┃4K💓",
|
||||
"type": 3,
|
||||
"api": "csp_WexxzysGuard",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "盘他",
|
||||
"name": "💓盘他┃4K💓",
|
||||
@@ -154,6 +146,14 @@
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "Wexpan123ziyuanGuard",
|
||||
"name": "💓123┃4K💓",
|
||||
"type": 3,
|
||||
"api": "csp_Wexpan123ziyuanGuard",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "雷鲸",
|
||||
"name": "💓雷鲸┃4K💓",
|
||||
@@ -798,6 +798,30 @@
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "xunlei",
|
||||
"name": "💓我的┃讯蕾💓",
|
||||
"type": 3,
|
||||
"api": "csp_WexWoXunLeiPanGuard",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"timeout": 50,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "baidu",
|
||||
"name": "💓我的┃百度💓",
|
||||
"type": 3,
|
||||
"api": "csp_WexWoBaiduPanGuard",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"timeout": 50,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "push_agent",
|
||||
"name": "推送",
|
||||
|
||||
BIN
王二小/spider.jar
BIN
王二小/spider.jar
Binary file not shown.
File diff suppressed because it is too large
Load Diff
2772
饭太硬/lives/平台直播.txt
2772
饭太硬/lives/平台直播.txt
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user