1
This commit is contained in:
@@ -0,0 +1,1063 @@
|
||||
{
|
||||
"spider": "./hktk.jar",
|
||||
"logo": "https://gitee.com/gyjune/hktk/raw/master/tmxk.gif",
|
||||
"warningText": "海阔天空接口完全免费,切勿付费购买!",
|
||||
"wallpaper": "http://rihou.cc:88/壁纸",
|
||||
"lives": [
|
||||
{
|
||||
"name": "组播源",
|
||||
"type": 0,
|
||||
"url": "https://live.gyj07.dedyn.io/组播源.m3u",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "咪咕直播(python)",
|
||||
"type": 3,
|
||||
"api": "./lib/migu.py",
|
||||
"ext": {}
|
||||
},
|
||||
{
|
||||
"name": "山东电视(python)",
|
||||
"type": 3,
|
||||
"api": "./lib/sdtv.py",
|
||||
"ext": {}
|
||||
},
|
||||
{
|
||||
"name": "快直播直播(python)",
|
||||
"type": 3,
|
||||
"api": "./lib/kzbzb.py",
|
||||
"ext": {}
|
||||
},
|
||||
{
|
||||
"name": "快直播体育(python)",
|
||||
"type": 3,
|
||||
"api": "./lib/kzbty.py",
|
||||
"ext": {}
|
||||
},
|
||||
{
|
||||
"name": "江苏地方频道",
|
||||
"type": 0,
|
||||
"url": "./lib/live.txt",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "咪咕局域网",
|
||||
"type": 0,
|
||||
"url": "http://192.168.0.4/",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "咪咕直播",
|
||||
"type": 0,
|
||||
"url": "http://117.72.203.216:3000",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "官网直播",
|
||||
"type": 0,
|
||||
"url": "./lib/jsyd.txt",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "全国地方php",
|
||||
"type": 0,
|
||||
"url": "http://192.168.0.4/全国地方频道.txt",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "印度直播",
|
||||
"type": 0,
|
||||
"url": "./lib/live.txt",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "ccwu直播源",
|
||||
"type": 0,
|
||||
"url": "./lib/jsmbh.txt",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
},
|
||||
{
|
||||
"name": "web官网直播源",
|
||||
"type": 0,
|
||||
"url": "https://yatv.indevs.in/tv.m3u",
|
||||
"logo": "https://gitee.com/gyjune/logo/raw/master/{name}.png",
|
||||
"epg": "https://epg.laobaitv.net"
|
||||
}
|
||||
],
|
||||
"sites": [
|
||||
{
|
||||
"key": "js豆瓣热播",
|
||||
"name": "海阔天空",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": "./lib/douban.js"
|
||||
},
|
||||
{
|
||||
"key": "小俊",
|
||||
"name": "俊俊直播",
|
||||
"type": 3,
|
||||
"api": "./lib/sdtv.js",
|
||||
"ext": "./lib/sdtv.txt"
|
||||
},
|
||||
{
|
||||
"key": "fqdj",
|
||||
"name": "🎈️番茄短剧┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"ua": "okhttp/3.15",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/hmdj.json"
|
||||
},
|
||||
{
|
||||
"key": "hipy_js_采集之王[合]",
|
||||
"name": "🎈采集之王┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"order_num": 210,
|
||||
"ext": "./lib/采集静态.json"
|
||||
},
|
||||
{
|
||||
"key": "360采集",
|
||||
"name": "🎈360采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://www.360jiexi.com/player/?url=",
|
||||
"api": "https://360zy.com/api.php/seaxml/vod/at/xml",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "豆瓣采集",
|
||||
"name": "🎈豆瓣采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://www.dbjiexi.com:966/jx/?url=",
|
||||
"api": "https://caiji.dbzy5.com/api.php/provide/vod/from/dbm3u8/at/xml/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "牛牛采集",
|
||||
"name": "🎈牛牛采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://jiexi.niuniuzy.org/m3u8/?url=",
|
||||
"api": "https://api.niuniuzy.me/api.php/provide/vod/from/nnm3u8/at/xml",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "茅台采集",
|
||||
"name": "🎈茅台采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://www.mtjiexi.cc:966/?url=",
|
||||
"api": "https://caiji.maotaizy.cc/api.php/provide/vod/from/mtm3u8/at/xml/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "量子采集",
|
||||
"name": "🎈量子采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://lziplayer.com/?url=",
|
||||
"api": "https://cj.lziapi.com/api.php/provide/vod/at/xml/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "极速采集",
|
||||
"name": "🎈极速采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://jsjiexi.com/play/?url=",
|
||||
"api": "https://jszyapi.com/api.php/provide/vod/at/xml",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "金鹰采集",
|
||||
"name": "🎈金鹰采集┃T爽剧",
|
||||
"type": 0,
|
||||
"playurl": "https://hd.iapijy.com/play?url=",
|
||||
"api": "http://jyzyapi.com/provide/vod/at/xml/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1
|
||||
},
|
||||
{
|
||||
"key": "光速资源",
|
||||
"name": "🎈光速采集┃T爽剧",
|
||||
"type": 1,
|
||||
"api": "https://api.guangsuapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"categories": [
|
||||
"动漫",
|
||||
"综艺",
|
||||
"剧情片",
|
||||
"科幻片",
|
||||
"动作片",
|
||||
"战争片",
|
||||
"记录片",
|
||||
"伦理片",
|
||||
"恐怖片",
|
||||
"爱情片",
|
||||
"喜剧片",
|
||||
"日剧",
|
||||
"韩剧",
|
||||
"泰剧",
|
||||
"大陆剧",
|
||||
"港澳剧",
|
||||
"欧美剧",
|
||||
"台湾剧",
|
||||
"体育赛事"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "youku资源",
|
||||
"name": "🎈优酷采集┃T爽剧",
|
||||
"playurl": "https://api.ukubf.com/m3u8/?url=",
|
||||
"type": 1,
|
||||
"api": "https://api.ukuapi88.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"categories": [
|
||||
"连续剧",
|
||||
"电影",
|
||||
"综艺",
|
||||
"动漫",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"动作片",
|
||||
"科幻片",
|
||||
"记录片",
|
||||
"奇幻片",
|
||||
"恐怖片",
|
||||
"爱情片",
|
||||
"喜剧片",
|
||||
"伦理片",
|
||||
"国产剧",
|
||||
"港澳剧",
|
||||
"欧美剧",
|
||||
"日剧",
|
||||
"台湾剧",
|
||||
"韩剧",
|
||||
"泰剧",
|
||||
"短剧"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "豪华资源",
|
||||
"name": "🎈豪华采集┃T爽剧",
|
||||
"type": 1,
|
||||
"api": "https://hhzyapi.com/api.php/provide/vod/?ac=list",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"categories": [
|
||||
"内地剧",
|
||||
"香港剧",
|
||||
"欧美剧",
|
||||
"韩剧",
|
||||
"日剧",
|
||||
"马泰剧",
|
||||
"台湾剧",
|
||||
"动画片",
|
||||
"中国动漫",
|
||||
"日本动漫",
|
||||
"欧美动漫",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"动作片",
|
||||
"科幻片",
|
||||
"记录片",
|
||||
"爱情片",
|
||||
"喜剧片",
|
||||
"灾难片",
|
||||
"悬疑片",
|
||||
"犯罪片",
|
||||
"伦理片",
|
||||
"大陆综艺",
|
||||
"日韩综艺",
|
||||
"港台综艺",
|
||||
"欧美综艺"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "csp_xml_虎牙",
|
||||
"name": "🎈虎牙采集┃T爽剧",
|
||||
"type": 1,
|
||||
"api": "https://www.huyaapi.com/api.php/provide/vod/from/hym3u8/at/json",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"playurl": "https://huyajx.com/play/?url=",
|
||||
"categories": [
|
||||
"电影",
|
||||
"电视剧",
|
||||
"综艺",
|
||||
"动漫",
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"科幻片",
|
||||
"恐怖片",
|
||||
"爱情片",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"纪录片",
|
||||
"伦理片",
|
||||
"动画片",
|
||||
"内地剧",
|
||||
"欧美剧",
|
||||
"香港剧",
|
||||
"台湾剧",
|
||||
"韩剧",
|
||||
"日剧",
|
||||
"马泰剧",
|
||||
"体育赛事",
|
||||
"短剧",
|
||||
"中国动漫",
|
||||
"日本动漫",
|
||||
"欧美动漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "mfys",
|
||||
"name": "🎈蜜蜂影院┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/98影视.json"
|
||||
},
|
||||
{
|
||||
"key": "麻花",
|
||||
"name": "🎈麻花影院┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/hema.json"
|
||||
},
|
||||
{
|
||||
"key": "天天空",
|
||||
"name": "🎈天天影院┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/chun.json"
|
||||
},
|
||||
{
|
||||
"key": "dytt",
|
||||
"name": "🎈电影天堂┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/81影院.json"
|
||||
},
|
||||
{
|
||||
"key": "乐兔",
|
||||
"name": "🎈乐兔影视┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/1080.json"
|
||||
},
|
||||
{
|
||||
"key": "slys",
|
||||
"name": "🎈️️森林影视┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/bp.json"
|
||||
},
|
||||
{
|
||||
"key": "伪freeok",
|
||||
"name": "🎈freeok┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"ext": {
|
||||
"线路数组": "module-tab-item tab-item&&</div>",
|
||||
"线路标题": "data-dropdown-value=\"&&\"+【 +共+<small>&&</small>+集】",
|
||||
"分类url": "https://www.jsard.com/vodshow/{cateId}/area/{area}/by/{by}/class/{class}/page/{catePg}/year/{year}.html",
|
||||
"分类数组": "<li class=\"swiper-slide navbar-item&&</li>",
|
||||
"分类标题": "title=\"&&\"",
|
||||
"分类ID": "href=\"/vodtype/&&.html\""
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "csp_xBPQ_番茄",
|
||||
"name": "🎈️番茄影视Ⅰ┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/番茄影院.json"
|
||||
},
|
||||
{
|
||||
"key": "如意",
|
||||
"name": "🎈️如意影院┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/如意影院.json"
|
||||
},
|
||||
{
|
||||
"key": "蜂鸟",
|
||||
"name": "🎈️洋葱影视Ⅰ┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/洋葱影视.json"
|
||||
},
|
||||
{
|
||||
"key": "ikanbot3",
|
||||
"name": "🎈爱看机器人┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/ikanbot3.js"
|
||||
},
|
||||
{
|
||||
"key": "ddtys",
|
||||
"name": "🎈️耐看影视┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"click": "document.querySelector(\"#playleft iframe\").contentWindow.document.querySelector(\"#start\").click();",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/nk1.json"
|
||||
},
|
||||
{
|
||||
"key": "zz",
|
||||
"name": "🎈️子子影视Ⅰ┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/子子.json"
|
||||
},
|
||||
{
|
||||
"key": "csp_xBPQ_飞飞",
|
||||
"name": "🎈️飞飞影视┃T爽剧",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/飞飞影视.json"
|
||||
}
|
||||
],
|
||||
"parses": [
|
||||
{
|
||||
"name": "超级并发",
|
||||
"type": 3,
|
||||
"url": "Demo"
|
||||
},
|
||||
{
|
||||
"name": "超级嗅探",
|
||||
"type": 3,
|
||||
"url": "Web"
|
||||
},
|
||||
{
|
||||
"name": "观音解析",
|
||||
"type": 1,
|
||||
"url": "http://61.147.93.21:8090/index.php?url=",
|
||||
"ext": {
|
||||
"flag": [
|
||||
"qq",
|
||||
"腾讯",
|
||||
"企鹅",
|
||||
"IQiYi",
|
||||
"qiyi",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"youku",
|
||||
"YouKu",
|
||||
"优酷",
|
||||
"sohu",
|
||||
"SoHu",
|
||||
"搜狐",
|
||||
"letv",
|
||||
"LeShi",
|
||||
"乐视",
|
||||
"imgo",
|
||||
"mgtv",
|
||||
"MangGuo",
|
||||
"芒果",
|
||||
"SLYS4k",
|
||||
"BYGA",
|
||||
"luanzi",
|
||||
"AliS",
|
||||
"dxzy",
|
||||
"bilibili",
|
||||
"QEYSS",
|
||||
"xigua",
|
||||
"西瓜视频",
|
||||
"腾讯视频",
|
||||
"奇艺视频",
|
||||
"优酷视频",
|
||||
"芒果视频",
|
||||
"乐视视频"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "茶杯解析",
|
||||
"type": 1,
|
||||
"url": "http://110.42.2.247:880/analysis/json/?uid=2449&my=acfgikquvzFGJRW459&url=",
|
||||
"ext": {
|
||||
"flag": [
|
||||
"qq",
|
||||
"腾讯",
|
||||
"企鹅",
|
||||
"IQiYi",
|
||||
"qiyi",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"youku",
|
||||
"YouKu",
|
||||
"优酷",
|
||||
"sohu",
|
||||
"SoHu",
|
||||
"搜狐",
|
||||
"letv",
|
||||
"LeShi",
|
||||
"乐视",
|
||||
"imgo",
|
||||
"mgtv",
|
||||
"MangGuo",
|
||||
"芒果",
|
||||
"SLYS4k",
|
||||
"BYGA",
|
||||
"luanzi",
|
||||
"AliS",
|
||||
"dxzy",
|
||||
"bilibili",
|
||||
"QEYSS",
|
||||
"xigua",
|
||||
"西瓜视频",
|
||||
"腾讯视频",
|
||||
"奇艺视频",
|
||||
"优酷视频",
|
||||
"芒果视频",
|
||||
"乐视视频"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "盖碗解析",
|
||||
"type": 1,
|
||||
"url": "http://119.91.123.253:1234/Api/cs.php?url=2449&my=acfgikquvzFGJRW459&url=",
|
||||
"ext": {
|
||||
"flag": [
|
||||
"qiyi",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"youku",
|
||||
"优酷",
|
||||
"mgtv",
|
||||
"芒果",
|
||||
"letv",
|
||||
"乐视",
|
||||
"pptv",
|
||||
"PPTV",
|
||||
"sohu",
|
||||
"xigua",
|
||||
"bilibili",
|
||||
"哔哩哔哩",
|
||||
"哔哩"
|
||||
],
|
||||
"header": {
|
||||
"User-Agent": "okhttp/4.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "白茶嗅探",
|
||||
"url": "https://jx.bozrc.com:4433/player/?url=",
|
||||
"showType": 1
|
||||
},
|
||||
{
|
||||
"name": "滇红嗅探",
|
||||
"type": 0,
|
||||
"url": "https://jx.777jiexi.com/player/?url="
|
||||
},
|
||||
{
|
||||
"name": "毛尖嗅探",
|
||||
"type": 0,
|
||||
"url": "https://jx.bozrc.com:4433/player/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"User-Agent": "okhttp/4.1.0"
|
||||
},
|
||||
"flag": [
|
||||
"qq",
|
||||
"腾讯",
|
||||
"qiyi",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"youku",
|
||||
"优酷",
|
||||
"mgtv",
|
||||
"芒果",
|
||||
"letv",
|
||||
"leshi",
|
||||
"LS",
|
||||
"乐视",
|
||||
"pptv",
|
||||
"PPTV",
|
||||
"sohu",
|
||||
"bilibili",
|
||||
"哔哩哔哩",
|
||||
"哔哩"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "青柑嗅探",
|
||||
"type": 0,
|
||||
"url": "http://www.miaoys.cc/vip/?url="
|
||||
},
|
||||
{
|
||||
"name": "岩茶嗅探",
|
||||
"type": 0,
|
||||
"url": "https://jx.ppjbk.cn/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"User-Agent": "Mozilla/5.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "小种嗅探",
|
||||
"type": 0,
|
||||
"url": "https://jx.jsonplayer.com/player/?url="
|
||||
},
|
||||
{
|
||||
"name": "普洱嗅探",
|
||||
"url": "https://jx.bozrc.com:4433/player/?url=",
|
||||
"type": 0,
|
||||
"ext": {
|
||||
"flag": [
|
||||
"qiyi",
|
||||
"imgo",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"qq",
|
||||
"腾讯",
|
||||
"youku",
|
||||
"优酷",
|
||||
"pptv",
|
||||
"PPTV",
|
||||
"letv",
|
||||
"乐视",
|
||||
"leshi",
|
||||
"bilibili",
|
||||
"哔哩哔哩",
|
||||
"哔哩",
|
||||
"mgtv",
|
||||
"芒果",
|
||||
"sohu",
|
||||
"xigua",
|
||||
"fun",
|
||||
"风行"
|
||||
],
|
||||
"header": {
|
||||
"User-Agent": "Mozilla/5.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "红茶嗅探",
|
||||
"type": 0,
|
||||
"url": "https://jx.4kdv.com/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"User-Agent": "okhttp/4.1.0"
|
||||
},
|
||||
"flag": [
|
||||
"qq",
|
||||
"腾讯",
|
||||
"qiyi",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"youku",
|
||||
"优酷",
|
||||
"mgtv",
|
||||
"芒果",
|
||||
"letv",
|
||||
"leshi",
|
||||
"LS",
|
||||
"乐视",
|
||||
"pptv",
|
||||
"PPTV",
|
||||
"sohu",
|
||||
"bilibili",
|
||||
"哔哩哔哩",
|
||||
"哔哩"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"flags": [
|
||||
"youku",
|
||||
"qq",
|
||||
"QQ",
|
||||
"iqiyi",
|
||||
"qiyi",
|
||||
"letv",
|
||||
"sohu",
|
||||
"tudou",
|
||||
"pptv",
|
||||
"PPTV",
|
||||
"mgtv",
|
||||
"ltnb",
|
||||
"rx",
|
||||
"CL4K",
|
||||
"xfyun",
|
||||
"wuduzy",
|
||||
"wasu",
|
||||
"bilibili",
|
||||
"renrenmi",
|
||||
"xmm",
|
||||
"xigua",
|
||||
"m1905 ",
|
||||
"funshion ",
|
||||
"duoduozy",
|
||||
"xinluan",
|
||||
"ddzy",
|
||||
"tgqp",
|
||||
"tkqp",
|
||||
"XRJX",
|
||||
"优酷",
|
||||
"芒果",
|
||||
"腾讯",
|
||||
"爱奇艺",
|
||||
"奇艺",
|
||||
"哔哩哔哩",
|
||||
"哔哩"
|
||||
],
|
||||
"ijk": [
|
||||
{
|
||||
"group": "软解码",
|
||||
"options": [
|
||||
{
|
||||
"category": 4,
|
||||
"name": "opensles",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "fflags",
|
||||
"value": "fastseek"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "framedrop",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "enable-accurate-seek",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "start-on-prepared",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "http-detect-range-support",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-handle-resolution-change",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 2,
|
||||
"name": "skip_loop_filter",
|
||||
"value": "48"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "reconnect",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "overlay-format",
|
||||
"value": "842225234"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-auto-rotate",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "soundtouch",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-hevc",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "dns_cache_timeout",
|
||||
"value": "600000000"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "硬解码",
|
||||
"options": [
|
||||
{
|
||||
"category": 4,
|
||||
"name": "opensles",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "fflags",
|
||||
"value": "fastseek"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "framedrop",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "enable-accurate-seek",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "start-on-prepared",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "http-detect-range-support",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-handle-resolution-change",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 2,
|
||||
"name": "skip_loop_filter",
|
||||
"value": "48"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "reconnect",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "overlay-format",
|
||||
"value": "842225234"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-auto-rotate",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "soundtouch",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-hevc",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "dns_cache_timeout",
|
||||
"value": "600000000"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"rules": [
|
||||
{
|
||||
"name": "lz",
|
||||
"hosts": [
|
||||
"vip.lz",
|
||||
"hd.lz",
|
||||
"v.cdnlz"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.433333,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "蜗牛直连去广",
|
||||
"hosts": [
|
||||
"vip.123pan.cn",
|
||||
"rescdn.wuxivlog.cn"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:20.840000,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:10.120000,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ff",
|
||||
"hosts": [
|
||||
"vip.ffzy",
|
||||
"hd.ffzy"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6.666667,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "bf",
|
||||
"hosts": [
|
||||
"bfzy",
|
||||
"s5.bfzycdn"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:3,[\\s\\S]*?#EXT-X-DISCONTINUITY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "hs",
|
||||
"hosts": [
|
||||
"huoshan.com"
|
||||
],
|
||||
"regex": [
|
||||
"item_id="
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dy",
|
||||
"hosts": [
|
||||
"douyin.com"
|
||||
],
|
||||
"regex": [
|
||||
"is_play_url="
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "cl",
|
||||
"hosts": [
|
||||
"magnet"
|
||||
],
|
||||
"regex": [
|
||||
"最 新",
|
||||
"直 播",
|
||||
"更 新"
|
||||
]
|
||||
}
|
||||
],
|
||||
"ads": [
|
||||
"mimg.0c1q0l.cn",
|
||||
"www.googletagmanager.com",
|
||||
"www.google-analytics.com",
|
||||
"mc.usihnbcq.cn",
|
||||
"mg.g1mm3d.cn",
|
||||
"mscs.svaeuzh.cn",
|
||||
"cnzz.hhttm.top",
|
||||
"tp.vinuxhome.com",
|
||||
"cnzz.mmstat.com",
|
||||
"www.baihuillq.com",
|
||||
"s23.cnzz.com",
|
||||
"z3.cnzz.com",
|
||||
"c.cnzz.com",
|
||||
"stj.v1vo.top",
|
||||
"z12.cnzz.com",
|
||||
"img.mosflower.cn",
|
||||
"tips.gamevvip.com",
|
||||
"ehwe.yhdtns.com",
|
||||
"xdn.cqqc3.com",
|
||||
"www.jixunkyy.cn",
|
||||
"sp.chemacid.cn",
|
||||
"hm.baidu.com",
|
||||
"s9.cnzz.com",
|
||||
"z6.cnzz.com",
|
||||
"um.cavuc.com",
|
||||
"mav.mavuz.com",
|
||||
"wofwk.aoidf3.com",
|
||||
"z5.cnzz.com",
|
||||
"xc.hubeijieshikj.cn",
|
||||
"tj.tianwenhu.com",
|
||||
"xg.gars57.cn",
|
||||
"k.jinxiuzhilv.com",
|
||||
"cdn.bootcss.com",
|
||||
"ppl.xunzhuo123.com",
|
||||
"xomk.jiangjunmh.top",
|
||||
"img.xunzhuo123.com",
|
||||
"z1.cnzz.com",
|
||||
"s13.cnzz.com",
|
||||
"xg.huataisangao.cn",
|
||||
"z7.cnzz.com",
|
||||
"z2.cnzz.com",
|
||||
"s96.cnzz.com",
|
||||
"q11.cnzz.com",
|
||||
"thy.dacedsfa.cn",
|
||||
"xg.whsbpw.cn",
|
||||
"s19.cnzz.com",
|
||||
"z8.cnzz.com",
|
||||
"s4.cnzz.com",
|
||||
"f5w.as12df.top",
|
||||
"ae01.alicdn.com",
|
||||
"www.92424.cn",
|
||||
"k.wudejia.com",
|
||||
"vivovip.mmszxc.top",
|
||||
"qiu.xixiqiu.com",
|
||||
"cdnjs.hnfenxun.com",
|
||||
"cms.qdwght.com"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
|
||||
"分类url": "https://www.letu.me/vodshow/{cateId}-{area}-{by}------{catePg}---{year}.html",
|
||||
"分类": "电影$1#连续剧$2#动漫$4"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"分类url":"https://www.dyttv.cn/show/{cateId}--{by}------{catePg}---.html",
|
||||
|
||||
"分类": "电影$dianying#剧集$dianshiju#动漫$dongman#综艺$zongyi#短剧$duanju"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"线路数组":"<a class=\"hl-from-btn hl-text-muted\">&&</a>",
|
||||
"线路标题":"</i> &&</span>",
|
||||
|
||||
|
||||
"分类url":"https://www.xmfyy.com/index.php/vod/show/by/{by}/id/{cateId}/page/{catePg}/year/{year}.html",
|
||||
|
||||
"分类":"电影$1#电视剧$2#综艺$3#动漫$4"}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
{"作者":"荷城茶秀",
|
||||
|
||||
"站名":"影视森林",
|
||||
|
||||
"主页url":"https://www.imtlink.com",
|
||||
|
||||
"分类url":"https://www.imtlink.com/vodshow/{cateId}-{area}-{by}-{class}-----{catePg}---{year}.html",
|
||||
"线路数组":"ewave-playlist&&</li>",
|
||||
"线路标题":">&&<em>",
|
||||
"分类":"电影$dianying#电视剧$dsj#动漫$dongman#综艺$zongyi#热门短剧$renmenduanju#体育赛事$tiyusaishi",
|
||||
"简介":"【天马行空】提醒您请勿相信影片中的广告,以免上当受骗!+<p class=\"pt-10 pb-10\"*>&&</p>"}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"分类url":"https://www.baixiaotangtop.com/vodshow/{cateId}-{area}--{class}-----{catePg}---{year}.html",
|
||||
"分类": "电影$1#电视剧$2#短剧$36#动漫$4#综艺$3"
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
var rule = {
|
||||
title:'drpy',
|
||||
host:'https://frodo.douban.com',
|
||||
apidoc:'https://www.doubanapi.com',
|
||||
homeUrl:'',
|
||||
searchUrl:'',
|
||||
searchable:1,
|
||||
quickSearch:1,
|
||||
filterable:1,
|
||||
// 分类链接fypage参数支持1个()表达式
|
||||
url:'/?pg=fypage&class=fyclass&douban=$douban',
|
||||
filter_url:'fl={{fl}}',
|
||||
图片来源:'@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36',
|
||||
headers:{
|
||||
"Host": "frodo.douban.com",
|
||||
// "Host": "api.douban.com",
|
||||
"Connection": "Keep-Alive",
|
||||
"Referer": "https://servicewechat.com/wx2f9b06c1de1ccfca/84/page-frame.html",
|
||||
// "content-type": "application/json",
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat"
|
||||
},
|
||||
timeout:5000,
|
||||
class_name:'海阔天空电影&海阔天空剧集&海阔天空综艺&海阔电影筛选&海阔电视筛选&海阔电影榜单&海阔电视榜单',
|
||||
class_url:'hot_gaia&tv_hot&show_hot&movie&tv&rank_list_movie&rank_list_tv',
|
||||
filter:{'interests': [{'key': 'status', 'name': '状态', 'value': [{'n': '想看', 'v': 'mark'}, {'n': '在看', 'v': 'doing'}, {'n': '看过', 'v': 'done'}]}, {'key': 'subtype_tag', 'name': '形式', 'value': [{'n': '全部', 'v': ''}, {'n': '电影', 'v': 'movie'}, {'n': '电视', 'v': 'tv'}]}, {'key': 'year_tag', 'name': '年代', 'value': [{'n': '全部', 'v': '全部'}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}], 'hot_gaia': [{'key': 'sort', 'name': '排序', 'value': [{'n': '热度', 'v': 'recommend'}, {'n': '最新', 'v': 'time'}, {'n': '评分', 'v': 'rank'}]}, {'key': 'area', 'name': '地区', 'value': [{'n': '全部', 'v': '全部'}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}]}], 'tv_hot': [{'key': 'type', 'name': '分类', 'value': [{'n': '综合', 'v': 'tv_hot'}, {'n': '国产剧', 'v': 'tv_domestic'}, {'n': '欧美剧', 'v': 'tv_american'}, {'n': '日剧', 'v': 'tv_japanese'}, {'n': '韩剧', 'v': 'tv_korean'}, {'n': '动画', 'v': 'tv_animation'}]}], 'show_hot': [{'key': 'type', 'name': '分类', 'value': [{'n': '综合', 'v': 'show_hot'}, {'n': '国内', 'v': 'show_domestic'}, {'n': '国外', 'v': 'show_foreign'}]}], 'movie': [{'key': '类型', 'name': '类型', 'value': [{'n': '全部类型', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '动作', 'v': '动作'}, {'n': '科幻', 'v': '科幻'}, {'n': '动画', 'v': '动画'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '冒险', 'v': '冒险'}, {'n': '音乐', 'v': '音乐'}, {'n': '历史', 'v': '历史'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '战争', 'v': '战争'}, {'n': '传记', 'v': '传记'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '武侠', 'v': '武侠'}, {'n': '情色', 'v': '情色'}, {'n': '灾难', 'v': '灾难'}, {'n': '西部', 'v': '西部'}, {'n': '纪录片', 'v': '纪录片'}, {'n': '短片', 'v': '短片'}]}, {'key': '地区', 'name': '地区', 'value': [{'n': '全部地区', 'v': ''}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '美国', 'v': '美国'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '英国', 'v': '英国'}, {'n': '法国', 'v': '法国'}, {'n': '德国', 'v': '德国'}, {'n': '意大利', 'v': '意大利'}, {'n': '西班牙', 'v': '西班牙'}, {'n': '印度', 'v': '印度'}, {'n': '泰国', 'v': '泰国'}, {'n': '俄罗斯', 'v': '俄罗斯'}, {'n': '加拿大', 'v': '加拿大'}, {'n': '澳大利亚', 'v': '澳大利亚'}, {'n': '爱尔兰', 'v': '爱尔兰'}, {'n': '瑞典', 'v': '瑞典'}, {'n': '巴西', 'v': '巴西'}, {'n': '丹麦', 'v': '丹麦'}]}, {'key': 'sort', 'name': '排序', 'value': [{'n': '近期热度', 'v': 'T'}, {'n': '首映时间', 'v': 'R'}, {'n': '高分优先', 'v': 'S'}]}, {'key': '年代', 'name': '年代', 'value': [{'n': '全部年代', 'v': ''}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}], 'tv': [{'key': '类型', 'name': '类型', 'value': [{'n': '不限', 'v': ''}, {'n': '电视剧', 'v': '电视剧'}, {'n': '综艺', 'v': '综艺'}]}, {'key': '电视剧形式', 'name': '电视剧形式', 'value': [{'n': '不限', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '动画', 'v': '动画'}, {'n': '武侠', 'v': '武侠'}, {'n': '古装', 'v': '古装'}, {'n': '家庭', 'v': '家庭'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '科幻', 'v': '科幻'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '历史', 'v': '历史'}, {'n': '战争', 'v': '战争'}, {'n': '动作', 'v': '动作'}, {'n': '冒险', 'v': '冒险'}, {'n': '传记', 'v': '传记'}, {'n': '剧情', 'v': '剧情'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '灾难', 'v': '灾难'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '音乐', 'v': '音乐'}]}, {'key': '综艺形式', 'name': '综艺形式', 'value': [{'n': '不限', 'v': ''}, {'n': '真人秀', 'v': '真人秀'}, {'n': '脱口秀', 'v': '脱口秀'}, {'n': '音乐', 'v': '音乐'}, {'n': '歌舞', 'v': '歌舞'}]}, {'key': '地区', 'name': '地区', 'value': [{'n': '全部地区', 'v': ''}, {'n': '华语', 'v': '华语'}, {'n': '欧美', 'v': '欧美'}, {'n': '国外', 'v': '国外'}, {'n': '韩国', 'v': '韩国'}, {'n': '日本', 'v': '日本'}, {'n': '中国大陆', 'v': '中国大陆'}, {'n': '中国香港', 'v': '中国香港'}, {'n': '美国', 'v': '美国'}, {'n': '英国', 'v': '英国'}, {'n': '泰国', 'v': '泰国'}, {'n': '中国台湾', 'v': '中国台湾'}, {'n': '意大利', 'v': '意大利'}, {'n': '法国', 'v': '法国'}, {'n': '德国', 'v': '德国'}, {'n': '西班牙', 'v': '西班牙'}, {'n': '俄罗斯', 'v': '俄罗斯'}, {'n': '瑞典', 'v': '瑞典'}, {'n': '巴西', 'v': '巴西'}, {'n': '丹麦', 'v': '丹麦'}, {'n': '印度', 'v': '印度'}, {'n': '加拿大', 'v': '加拿大'}, {'n': '爱尔兰', 'v': '爱尔兰'}, {'n': '澳大利亚', 'v': '澳大利亚'}]}, {'key': 'sort', 'name': '排序', 'value': [{'n': '近期热度', 'v': 'T'}, {'n': '首播时间', 'v': 'R'}, {'n': '高分优先', 'v': 'S'}]}, {'key': '年代', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2010年代', 'v': '2010年代'}, {'n': '2000年代', 'v': '2000年代'}, {'n': '90年代', 'v': '90年代'}, {'n': '80年代', 'v': '80年代'}, {'n': '70年代', 'v': '70年代'}, {'n': '60年代', 'v': '60年代'}, {'n': '更早', 'v': '更早'}]}, {'key': '平台', 'name': '平台', 'value': [{'n': '全部', 'v': ''}, {'n': '腾讯视频', 'v': '腾讯视频'}, {'n': '爱奇艺', 'v': '爱奇艺'}, {'n': '优酷', 'v': '优酷'}, {'n': '湖南卫视', 'v': '湖南卫视'}, {'n': 'Netflix', 'v': 'Netflix'}, {'n': 'HBO', 'v': 'HBO'}, {'n': 'BBC', 'v': 'BBC'}, {'n': 'NHK', 'v': 'NHK'}, {'n': 'CBS', 'v': 'CBS'}, {'n': 'NBC', 'v': 'NBC'}, {'n': 'tvN', 'v': 'tvN'}]}], 'rank_list_movie': [{'key': '榜单', 'name': '榜单', 'value': [{'n': '实时热门电影', 'v': 'movie_real_time_hotest'}, {'n': '一周口碑电影榜', 'v': 'movie_weekly_best'}, {'n': '豆瓣电影Top250', 'v': 'movie_top250'}]}], 'rank_list_tv': [{'key': '榜单', 'name': '榜单', 'value': [{'n': '实时热门电视', 'v': 'tv_real_time_hotest'}, {'n': '华语口碑剧集榜', 'v': 'tv_chinese_best_weekly'}, {'n': '全球口碑剧集榜', 'v': 'tv_global_best_weekly'}, {'n': '国内口碑综艺榜', 'v': 'show_chinese_best_weekly'}, {'n': '国外口碑综艺榜', 'v': 'show_global_best_weekly'}]}]},
|
||||
limit:20,
|
||||
play_parse:false,
|
||||
推荐:'',
|
||||
推荐:'js:let d=[];let douban_api_host="http://api.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);return JSON.parse(html)}catch(e){print("发生了错误:"+e.message);return{}}}function subject_real_time_hotest(){try{let res=miniapp_request("/subject_collection/subject_real_time_hotest/items",{});let lists=[];let arr=res.subject_collection_items||[];arr.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"暂无评分";let honnor=(item.honor_infos||[]).map(function(it){return it.title}).join("|");lists.append({vod_id:"msearch:"+TYPE,vod_name:item.title||"",vod_pic:item.pic.normal,vod_remarks:rating+" "+honnor})}});return lists}catch(e){print("发生了错误:"+e.message);return[]}}VODS=subject_real_time_hotest();print(VODS);',
|
||||
// 手动调用解析请求json的url,此lazy不方便
|
||||
lazy:'',
|
||||
// 推荐:'.list_item;img&&alt;img&&src;a&&Text;a&&data-float',
|
||||
一级:'',
|
||||
一级:'js:let d=[];let douban=input.split("douban=")[1].split("&")[0];let douban_api_host="http://api.douban.com/api/v2";let miniapp_apikey="0ac44ae016490db2204ce0a042db2916";const count=30;function miniapp_request(path,query){try{let url=douban_api_host+path;query.apikey=miniapp_apikey;fetch_params.headers=oheaders;url=buildUrl(url,query);let html=fetch(url,fetch_params);if(/request_error/.test(html)){print(html)}return JSON.parse(html)}catch(e){print("发生了错误:"+e.message);return{}}}function cate_filter(d,douban){douban=douban||"";try{let res={};if(MY_CATE==="interests"){if(douban){let status=MY_FL.status||"mark";let subtype_tag=MY_FL.subtype_tag||"";let year_tag=MY_FL.year_tag||"全部";let path="/user/"+douban+"/interests";res=miniapp_request(path,{type:"movie",status:status,subtype_tag:subtype_tag,year_tag:year_tag,start:(MY_PAGE-1)*count,count:count})}else{return{}}}else if(MY_CATE==="hot_gaia"){let sort=MY_FL.sort||"recommend";let area=MY_FL.area||"全部";let path="/movie/"+MY_CATE;res=miniapp_request(path,{area:area,sort:sort,start:(MY_PAGE-1)*count,count:count})}else if(MY_CATE==="tv_hot"||MY_CATE==="show_hot"){let stype=MY_FL.type||MY_CATE;let path="/subject_collection/"+stype+"/items";res=miniapp_request(path,{start:(MY_PAGE-1)*count,count:count})}else if(MY_CATE.startsWith("rank_list")){let id=MY_CATE==="rank_list_movie"?"movie_real_time_hotest":"tv_real_time_hotest";id=MY_FL.榜单||id;let path="/subject_collection/"+id+"/items";res=miniapp_request(path,{start:(MY_PAGE-1)*count,count:count})}else{let path="/"+MY_CATE+"/recommend";let selected_categories;let tags;let sort;if(Object.keys(MY_FL).length>0){sort=MY_FL.sort||"T";tags=Object.values(MY_FL).join(",");if(MY_CATE==="movie"){selected_categories={"类型":MY_FL.类型||"","地区":MY_FL.地区||""}}else{selected_categories={"类型":MY_FL.类型||"","形式":MY_FL.类型?MY_FL.类型+"地区":"","地区":MY_FL.地区||""}}}else{sort="T";tags="";if(MY_CATE==="movie"){selected_categories={"类型":"","地区":""}}else{selected_categories={"类型":"","形式":"","地区":""}}}let params={tags:tags,sort:sort,refresh:0,selected_categories:stringify(selected_categories),start:(MY_PAGE-1)*count,count:count};res=miniapp_request(path,params)}let result={page:MY_PAGE,pagecount:Math.ceil(res.total/count),limit:count,total:res.total};let items=[];if(/^rank_list|tv_hot|show_hot/.test(MY_CATE)){items=res["subject_collection_items"]}else if(MY_CATE==="interests"){res["interests"].forEach(function(it){items.push(it.subject)})}else{items=res.items}let lists=[];items.forEach(function(item){if(item.type==="movie"||item.type==="tv"){let rating=item.rating?item.rating.value:"";let rat_str=rating||"暂无评分";let title=item.title;let honor=item.honor_infos||[];let honor_str=honor.map(function(it){return it.title}).join("|");let vod_obj={vod_name:title!=="未知电影"?title:"暂不支持展示",vod_pic:item.pic.normal,vod_remarks:rat_str+" "+honor_str};let vod_obj_d={url:item.type+"$"+item.id,title:title!=="未知电影"?title:"暂不支持展示",pic_url:item.pic.normal,desc:rat_str+" "+honor_str};lists.push(vod_obj);d.push(vod_obj_d)}});result.list=lists;return result}catch(e){print(e.message)}return{}}let res=cate_filter(d,douban);setResult2(res);',
|
||||
二级:'',
|
||||
搜索:'',
|
||||
}
|
||||
Vendored
+73
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"分类url":"https://www.mahuavod.cc/show/{cateId}-{area}-{by}------{catePg}---{year}.html",
|
||||
"分类":"电影$1#电视剧$2#综艺$3#动漫$4#短剧$44"}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
|
||||
"数组":"<li class=\"col8\">&&</li>",
|
||||
"链接": "href=\"&&\"",
|
||||
"标题": "title=\"&&\"",
|
||||
"图片":"data-original=\"&&\"",
|
||||
"副标题": "text\">&&</p>",
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
"分类url":"https://www.shanhuzs.com/fqsansw/{cateId}--{by}-{class}-----{catePg}---{year}.html",
|
||||
"年份":"2025-2022",
|
||||
|
||||
"分类":"短剧$5",
|
||||
"剧情":"女频恋爱$女频恋爱#反转爽$反转爽#脑洞悬疑$脑洞悬疑#年代穿越$年代穿越#古装仙侠$古装仙侠#现代都市$现代都市"
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
var rule = {
|
||||
title:'爱看机器人3',
|
||||
host:'https://v.ikanbot.com',
|
||||
url:'/hot/index-fyclass-fyfilter-p-fypage.html[/hot/index-fyclass-fyfilter.html]',
|
||||
searchUrl:'/search?q=**&p=fypage[/search?q=**]',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
filterable:1,
|
||||
filter_url:'{{fl.tag}}',
|
||||
图片来源:'@Referer=https://v.ikanbot.com/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
|
||||
filter:{
|
||||
"movie":[{"key":"tag","name":"标签","value":[{"n":"热门","v":"热门"},{"n":"最新","v":"最新"},{"n":"经典","v":"经典"},{"n":"豆瓣高分","v":"豆瓣高分"},{"n":"冷门佳片","v":"冷门佳片"},{"n":"华语","v":"华语"},{"n":"欧美","v":"欧美"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"动作","v":"动作"},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"科幻","v":"科幻"},{"n":"悬疑","v":"悬疑"},{"n":"恐怖","v":"恐怖"},{"n":"治愈","v":"治愈"},{"n":"豆瓣top250","v":"豆瓣top250"}]}],
|
||||
"tv":[{"key":"tag","name":"标签","value":[{"n":"热门","v":"热门"},{"n":"美剧","v":"美剧"},{"n":"英剧","v":"英剧"},{"n":"韩剧","v":"韩剧"},{"n":"日剧","v":"日剧"},{"n":"国产剧","v":"国产剧"},{"n":"港剧","v":"港剧"},{"n":"日本动画","v":"日本动画"},{"n":"综艺","v":"综艺"},{"n":"纪录片","v":"纪录片"}]}]
|
||||
},
|
||||
filter_def:{
|
||||
movie:{tag:'热门'},
|
||||
tv:{tag:'热门'},
|
||||
},
|
||||
filter获取方法:`
|
||||
let value = [];
|
||||
$('ul').eq(2).find('li').each(function() {
|
||||
// console.log($(this).text());
|
||||
let n = $(this).text().trim();
|
||||
value.push({
|
||||
'n': n, 'v': n
|
||||
});
|
||||
});
|
||||
// 电影执行:
|
||||
let data = {'movie': [{'key': 'tag', 'name': '标签', 'value': value}]};
|
||||
console.log(JSON.stringify(data));
|
||||
|
||||
//剧集执行:
|
||||
let data = {'tv': [{'key': 'tag', 'name': '标签', 'value': value}]};
|
||||
console.log(JSON.stringify(data));
|
||||
`,
|
||||
headers:{'User-Agent':'PC_UA',},
|
||||
class_name:'天马行空电影&天马行空剧集',
|
||||
class_url:'movie&tv',
|
||||
play_parse:true,
|
||||
double:true,
|
||||
推荐:'.v-list;div.item;*;*;*;*', //这里可以为空,这样点播不会有内容
|
||||
一级:'.v-list&&div.item;p&&Text;img&&data-src;;a&&href', //一级的内容是推荐或者点播时候的一级匹配
|
||||
// 二级:二级,
|
||||
二级:'js:eval(unescape(base64Decode("anM6CiAgICAgICAgcGRmaCA9IGpzcC5wZGZoOwogICAgICAgIGZ1bmN0aW9uIGdldFRva2VuKGh0bWwxKSB7CiAgICAgICAgICAgIGxldCBjdXJyZW50SWQgPSBwZGZoKGh0bWwxLCAnI2N1cnJlbnRfaWQmJnZhbHVlJyk7CiAgICAgICAgICAgIGxldCBlVG9rZW4gPSBwZGZoKGh0bWwxLCAnI2VfdG9rZW4mJnZhbHVlJyk7CiAgICAgICAgICAgIGlmICghY3VycmVudElkIHx8ICFlVG9rZW4pIHJldHVybiAnJzsKICAgICAgICAgICAgbGV0IGlkTGVuZ3RoID0gY3VycmVudElkLmxlbmd0aDsKICAgICAgICAgICAgbGV0IHN1YklkID0gY3VycmVudElkLnN1YnN0cmluZyhpZExlbmd0aCAtIDQsIGlkTGVuZ3RoKTsKICAgICAgICAgICAgbGV0IGtleXMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJJZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGV0IGN1ckludCA9IHBhcnNlSW50KHN1YklkW2ldKTsKICAgICAgICAgICAgICAgIGxldCBzcGxpdFBvcyA9IGN1ckludCAlIDMgKyAxOwogICAgICAgICAgICAgICAga2V5c1tpXSA9IGVUb2tlbi5zdWJzdHJpbmcoc3BsaXRQb3MsIHNwbGl0UG9zICsgOCk7CiAgICAgICAgICAgICAgICBlVG9rZW4gPSBlVG9rZW4uc3Vic3RyaW5nKHNwbGl0UG9zICsgOCwgZVRva2VuLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGtleXMuam9pbignJyk7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFZPRD17fTsKICAgICAgICAgICAgbGV0IGh0bWwxID0gcmVxdWVzdChpbnB1dCk7CiAgICAgICAgICAgIFZPRC52b2RfaWQgPSBwZGZoKGh0bWwxLCAnI2N1cnJlbnRfaWQmJnZhbHVlJyk7CiAgICAgICAgICAgIFZPRC52b2RfbmFtZSA9IHBkZmgoaHRtbDEsICdoMiYmVGV4dCcpOwogICAgICAgICAgICBWT0Qudm9kX3BpYyA9IHBkZmgoaHRtbDEsICcuaXRlbS1yb290JiZpbWcmJmRhdGEtc3JjJyk7CiAgICAgICAgICAgIFZPRC52b2RfYWN0b3IgPSBwZGZoKGh0bWwxLCAnLm1ldGE6ZXEoNCkmJlRleHQnKTsKICAgICAgICAgICAgVk9ELnZvZF9hcmVhID0gcGRmaChodG1sMSwgJy5tZXRhOmVxKDMpJiZUZXh0Jyk7CiAgICAgICAgICAgIFZPRC52b2RfeWVhciA9IHBkZmgoaHRtbDEsICcubWV0YTplcSgyKSYmVGV4dCcpOwogICAgICAgICAgICBWT0Qudm9kX3JlbWFya3MgPSAnJzsKICAgICAgICAgICAgVk9ELnZvZF9kaXJlY3RvciA9ICcnOwogICAgICAgICAgICBWT0Qudm9kX2NvbnRlbnQgPSBwZGZoKGh0bWwxLCAnI2xpbmUtdGlwcyYmVGV4dCcpOwogICAgICAgICAgICAvLyBsb2coVk9EKTsKICAgICAgICAgICAgdmFyIHZfdGtzID0gZ2V0VG9rZW4oaHRtbDEpOwogICAgICAgICAgICBsb2coJ3ZfdGtzID09PT4gJyArIHZfdGtzKTsKICAgICAgICAgICAgaW5wdXQgPSBIT1NUICsgJy9hcGkvZ2V0UmVzTj92aWRlb0lkPScgKyBpbnB1dC5zcGxpdCgnLycpLnBvcCgpICsgJyZtdHlwZT0yJnRva2VuPScrdl90a3M7CiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChpbnB1dCwgewogICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzonTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxM18yXzMgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjAuMyBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsCiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZXInOiBNWV9VUkwsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwcmludChodG1sKTsKICAgICAgICAgICAgaHRtbCA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgICAgIGxldCBlcGlzb2RlcyA9IGh0bWwuZGF0YS5saXN0OwogICAgICAgICAgICBsZXQgcGxheU1hcCA9IHt9OwogICAgICAgICAgICBpZiAodHlwZW9mIHBsYXlfdXJsID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgdmFyIHBsYXlfdXJsID0gJycKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgbWFwID0ge30KICAgICAgICAgICAgbGV0IGFyciA9IFtdCiAgICAgICAgICAgIGxldCBuYW1lID0gewogICAgICAgICAgICAgICAgJ2JmenltM3U4JzogJ+aatOmjjicsCiAgICAgICAgICAgICAgICAnMTA4MHp5ayc6ICfkvJjotKgnLAogICAgICAgICAgICAgICAgJ2t1YWlrYW4nOiAn5b+r55yLJywKICAgICAgICAgICAgICAgICdsem0zdTgnOiAn6YeP5a2QJywKICAgICAgICAgICAgICAgICdmZm0zdTgnOiAn6Z2e5YehJywKICAgICAgICAgICAgICAgICdoYWl3YWlrYW4nOiAn5rW35aSW55yLJywKICAgICAgICAgICAgICAgICdnc20zdTgnOiAn5YWJ6YCfJywKICAgICAgICAgICAgICAgICd6dWlkYW0zdTgnOiAn5pyA5aSnJywKICAgICAgICAgICAgICAgICdiam0zdTgnOiAn5YWr5oiSJywKICAgICAgICAgICAgICAgICdzbm0zdTgnOiAn57Si5bC8JywKICAgICAgICAgICAgICAgICd3b2xvbmcnOiAn5Y2n6b6ZJywKICAgICAgICAgICAgICAgICd4bG0zdTgnOiAn5paw5rWqJywKICAgICAgICAgICAgICAgICd5aG0zdTgnOiAn5qix6IqxJywKICAgICAgICAgICAgICAgICd0a20zdTgnOiAn5aSp56m6JywKICAgICAgICAgICAgICAgICdqc20zdTgnOiAn5p6B6YCfJywKICAgICAgICAgICAgICAgICd3am0zdTgnOiAn5peg5bC9JywKICAgICAgICAgICAgICAgICdzZG0zdTgnOiAn6Zeq55S1JywKICAgICAgICAgICAgICAgICdrY20zdTgnOiAn5b+r6L2mJywKICAgICAgICAgICAgICAgICdqaW55aW5nbTN1OCc6ICfph5HpubAnLAogICAgICAgICAgICAgICAgJ2ZzbTN1OCc6ICfpo57pgJ8nLAogICAgICAgICAgICAgICAgJ3RwbTN1OCc6ICfmt5jniYcnLAogICAgICAgICAgICAgICAgJ2xlbTN1OCc6ICfpsbzkuZAnLAogICAgICAgICAgICAgICAgJ2RibTN1OCc6ICfnmb7luqYnLAogICAgICAgICAgICAgICAgJ3RvbW0zdTgnOiAn55Wq6IyEJywKICAgICAgICAgICAgICAgICd1a20zdTgnOiAnVemFtycsCiAgICAgICAgICAgICAgICAnaWttM3U4JzogJ+eIseWdpCcsCiAgICAgICAgICAgICAgICAnaG56eW0zdTgnOiAn57qi54mb6LWE5rqQJywKICAgICAgICAgICAgICAgICdobm0zdTgnOiAn57qi54mbJywKICAgICAgICAgICAgICAgICc2OHp5X20zdTgnOiAnNjgnLAogICAgICAgICAgICAgICAgJ2tkbTN1OCc6ICfphbfngrknLAogICAgICAgICAgICAgICAgJ2JkeG0zdTgnOiAn5YyX5paX5pifJywKICAgICAgICAgICAgICAgICdxaG0zdTgnOiAn5aWH6JmOJywKICAgICAgICAgICAgICAgICdoaG0zdTgnOiAn6LGq5Y2OJwogICAgICAgICAgICB9OwogICAgICAgICAgICBlcGlzb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGVwKSB7CiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZXBbJ3Jlc0RhdGEnXSk7CiAgICAgICAgICAgICAgICBkYXRhLm1hcCh2YWwgPT4gewogICAgICAgICAgICAgICAgICAgIGlmKCFtYXBbdmFsLmZsYWddKXsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwW3ZhbC5mbGFnXSA9IFt2YWwudXJsLnJlcGxhY2VBbGwoJyMjJywnIycpXQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFt2YWwuZmxhZ10ucHVzaCh2YWwudXJsLnJlcGxhY2VBbGwoJyMjJywnIycpKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSB7CiAgICAgICAgICAgICAgICBpZiAoJ2JmenltM3U4JyA9PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc6IG5hbWVba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogMQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCcxMDgwenlrJyA9PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc6IG5hbWVba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogMgogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdrdWFpa2FuJyA9PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc6IG5hbWVba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogMwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdsem0zdTgnID09IGtleSkgewogICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZzogbmFtZVtrZXldLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG1hcFtrZXldLAogICAgICAgICAgICAgICAgICAgICAgICBzb3J0OiA0CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ2ZmbTN1OCcgPT0ga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmbGFnOiBuYW1lW2tleV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbWFwW2tleV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQ6IDUKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnc25tM3U4JyA9PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc6IG5hbWVba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogNgogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdxaG0zdTgnID09IGtleSkgewogICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZzogbmFtZVtrZXldLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG1hcFtrZXldLAogICAgICAgICAgICAgICAgICAgICAgICBzb3J0OiA3CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmbGFnOiAobmFtZVtrZXldKSA/IG5hbWVba2V5XSA6IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtYXBba2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogOAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJyLnNvcnQoKGEsIGIpID0+IGEuc29ydCAtIGIuc29ydCk7CiAgICAgICAgICAgIGxldCBwbGF5RnJvbSA9IFtdOwogICAgICAgICAgICBsZXQgcGxheUxpc3QgPSBbXTsKICAgICAgICAgICAgYXJyLm1hcCh2YWwgPT4gewogICAgICAgICAgICAgICAgaWYgKCEvdW5kZWZpbmVkLy50ZXN0KHZhbC5mbGFnKSkgewogICAgICAgICAgICAgICAgICAgIHBsYXlGcm9tLnB1c2godmFsLmZsYWcpOwogICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LnB1c2godmFsLnVybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIGxldCB2b2RfcGxheV9mcm9tID0gcGxheUZyb20uam9pbignJCQkJyk7CiAgICAgICAgICAgIGxldCB2b2RfcGxheV91cmwgPSBwbGF5TGlzdC5qb2luKCckJCQnKTsKICAgICAgICAgICAgVk9EWyd2b2RfcGxheV9mcm9tJ10gPSB2b2RfcGxheV9mcm9tOwogICAgICAgICAgICBWT0RbJ3ZvZF9wbGF5X3VybCddID0gdm9kX3BsYXlfdXJsOwogICAgICAgICAgICAvLyBsb2coVk9EKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGxvZygn6I635Y+W5LqM57qn6K+m5oOF6aG15Y+R55Sf6ZSZ6K+vOicgKyBlLm1lc3NhZ2UpCiAgICAgICAgfQ==")))',
|
||||
搜索:'.col-md-8&&.media;h5&&a&&Text;a&&img&&data-src;.label&&Text;a&&href',//第三个是描述,一般显示更新或者完结
|
||||
}
|
||||
+429
@@ -0,0 +1,429 @@
|
||||
凤凰高清,#genre#
|
||||
凤凰卫视香港台,http://ott.mobaibox.com/PLTV/3/224/3221228530/index.m3u8
|
||||
凤凰卫视中文台,http://ott.mobaibox.com/PLTV/3/224/3221228527/index.m3u8
|
||||
凤凰资讯,http://ott.mobaibox.com/PLTV/3/224/3221228524/index.m3u8
|
||||
CCTV高清,#genre#
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227375/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227736/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227739/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227641/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221225530/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228146/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227644/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227675/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228049/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227462/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227634/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228213/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227725/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228149/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227467/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221228094/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221226993/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227207/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227708/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227427/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227696/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221228118/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221228300/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227543/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221225588/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227295/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228237/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227650/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227623/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227424/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228188/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228392/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227546/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228126/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227378/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221225534/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227658/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227683/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221228156/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227489/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221228307/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227549/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221228091/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227298/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227166/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227640/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227661/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228173/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228082/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227401/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227686/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228395/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227537/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227617/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228179/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227381/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228492/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221225604/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227714/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227685/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228114/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228076/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227480/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227631/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228277/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227502/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228176/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227209/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227301/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228196/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221225548/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227664/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228185/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227581/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227430/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228280/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227505/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228123/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221227314/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221225546/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221227642/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221227626/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227304/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227205/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227667/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227750/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228079/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227433/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227629/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227573/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228398/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227473/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228194/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221225532/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221227659/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221227704/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221227614/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221227317/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221225550/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221227717/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221227620/index.m3u8
|
||||
CCTV11,http://ott.mobaibox.com/PLTV/3/224/3221227524/index.m3u8
|
||||
CCTV11,http://ott.mobaibox.com/PLTV/3/224/3221227384/index.m3u8
|
||||
CCTV11,http://ott.mobaibox.com/PLTV/3/224/3221227720/index.m3u8
|
||||
CCTV12,http://ott.mobaibox.com/PLTV/3/224/3221225556/index.m3u8
|
||||
CCTV12,http://ott.mobaibox.com/PLTV/3/224/3221227655/index.m3u8
|
||||
CCTV12,http://ott.mobaibox.com/PLTV/3/224/3221227637/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221225560/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221228121/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221227387/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221228224/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221228324/index.m3u8
|
||||
CCTV14,http://ott.mobaibox.com/PLTV/3/224/3221227201/index.m3u8
|
||||
CCTV14,http://ott.mobaibox.com/PLTV/3/224/3221227656/index.m3u8
|
||||
CCTV14,http://ott.mobaibox.com/PLTV/3/224/3221227693/index.m3u8
|
||||
CCTV15,http://ott.mobaibox.com/PLTV/3/224/3221227538/index.m3u8
|
||||
CCTV15,http://ott.mobaibox.com/PLTV/3/224/3221227723/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228320/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228144/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228112/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227578/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227589/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227592/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227726/index.m3u8
|
||||
CCTV高尔夫网球,http://ott.mobaibox.com/PLTV/3/224/3221228138/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/4/224/3221228581/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228499/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228502/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228516/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228578/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228168/index.m3u8
|
||||
CCTV4K,http://ott.mobaibox.com/PLTV/3/224/3221228472/index.m3u8
|
||||
CCTV8K,http://ott.mobaibox.com/PLTV/3/224/3221228165/index.m3u8
|
||||
CCTV兵器科技,http://ott.mobaibox.com/PLTV/3/224/3221228686/index.m3u8
|
||||
CCTV第一剧场,http://ott.mobaibox.com/PLTV/3/224/3221228659/index.m3u8
|
||||
CCTV电视指南,http://ott.mobaibox.com/PLTV/3/224/3221228689/index.m3u8
|
||||
CCTV风云剧场,http://ott.mobaibox.com/PLTV/3/224/3221228662/index.m3u8
|
||||
CCTV风云音乐,http://ott.mobaibox.com/PLTV/3/224/3221228665/index.m3u8
|
||||
CCTV风云足球,http://ott.mobaibox.com/PLTV/3/224/3221228668/index.m3u8
|
||||
CCTV女性时尚,http://ott.mobaibox.com/PLTV/3/224/3221228674/index.m3u8
|
||||
CCTV怀旧剧场,http://ott.mobaibox.com/PLTV/3/224/3221228671/index.m3u8
|
||||
CCTV世界地理,http://ott.mobaibox.com/PLTV/3/224/3221228680/index.m3u8
|
||||
CCTV央视台球,http://ott.mobaibox.com/PLTV/3/224/3221228683/index.m3u8
|
||||
CCTV央视文化精品,http://ott.mobaibox.com/PLTV/3/224/3221228677/index.m3u8
|
||||
卫视高清,#genre#
|
||||
北京卫视4K,http://183.207.249.71/gitv/live1/-/G_BEIJING-4K
|
||||
北京卫视ID,http://183.207.249.71/PLTV/4/224/3221228817/1.m3u8
|
||||
|
||||
北京卫视4K,http://183.207.249.71/cntv/live1/-/HD-34M-2160P-beijingstv4k
|
||||
北京卫视ID,http://183.207.249.71/PLTV/4/224/3221228890/1.m3u8
|
||||
|
||||
广东卫视4K,http://183.207.249.71/gitv/live1/-/G_GUANGDONG-4K
|
||||
广东卫视ID,http://183.207.249.71/PLTV/4/224/3221228838/1.m3u8
|
||||
|
||||
湖南卫视4K,http://183.207.249.71/gitv/live1/-/G_HUNAN-4K
|
||||
湖南卫视ID,http://183.207.249.71/PLTV/4/224/3221228883/1.m3u8
|
||||
|
||||
江苏卫视4K,http://183.207.249.71/gitv/live1/-/G_JIANGSU-4K
|
||||
江苏卫视ID,http://183.207.249.71/PLTV/4/224/3221228897/1.m3u8
|
||||
|
||||
山东卫视4K,http://183.207.249.71/gitv/live1/-/G_SHANDONG-4K
|
||||
山东卫视ID,http://183.207.249.71/PLTV/4/224/3221228880/1.m3u8
|
||||
|
||||
东方卫视4K,http://183.207.249.71/gitv/live1/-/G_DONGFANG-4K
|
||||
对应数字ID,http://183.207.249.71/PLTV/4/224/3221228956/1.m3u8
|
||||
|
||||
深圳卫视4K,http://183.207.249.71/gitv/live1/-/G_SHENZHEN-4K
|
||||
对应数字ID,http://183.207.249.71/PLTV/4/224/3221228835/1.m3u8
|
||||
|
||||
四川卫视4K,http://183.207.249.71/gitv/live1/-/G_SICHUAN-4K
|
||||
对应数字IDhttp://183.207.249.71/PLTV/4/224/3221228877/1.m3u8
|
||||
|
||||
浙江卫视4K,http://183.207.249.71/gitv/live1/-/G_ZHEJIANG-4K
|
||||
对应数字IDhttp://183.207.249.71/PLTV/4/224/3221228900/1.m3u8
|
||||
东南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227553/index.m3u8
|
||||
东南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227670/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227396/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221228504/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227597/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227732/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227688/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221228150/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227208/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227486/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221228425/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227511/index.m3u8
|
||||
云南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227571/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227390/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227246/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227652/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227694/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221228115/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227436/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221228410/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227508/index.m3u8
|
||||
吉林卫视,http://ott.mobaibox.com/PLTV/3/224/3221228028/index.m3u8
|
||||
吉林卫视,http://ott.mobaibox.com/PLTV/3/224/3221228130/index.m3u8
|
||||
四川卫视,http://ott.mobaibox.com/PLTV/3/224/3221227556/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227382/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227212/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227633/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227741/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227756/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221228239/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227407/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221228416/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227488/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221225634/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227653/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227759/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221228153/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227498/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227643/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221228327/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227558/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227310/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228560/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227621/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227671/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227697/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228124/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227258/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227448/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228315/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227517/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227399/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228566/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227249/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227591/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227673/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227691/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228230/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227445/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228312/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227476/index.m3u8
|
||||
广西卫视,http://ott.mobaibox.com/PLTV/3/224/3221228183/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227402/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227649/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227255/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227705/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227668/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227689/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227439/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221228099/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221228306/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221228097/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227552/index.m3u8
|
||||
江西卫视,http://ott.mobaibox.com/PLTV/3/224/3221225536/index.m3u8
|
||||
江西卫视,http://ott.mobaibox.com/PLTV/3/224/3221227738/index.m3u8
|
||||
江西卫视,http://ott.mobaibox.com/PLTV/3/224/3221228109/index.m3u8
|
||||
河北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227545/index.m3u8
|
||||
河北卫视,http://ott.mobaibox.com/PLTV/3/224/3221228106/index.m3u8
|
||||
河南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227521/index.m3u8
|
||||
河南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228221/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227393/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227215/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227744/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227692/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228147/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228204/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228309/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227491/index.m3u8
|
||||
海南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228139/index.m3u8
|
||||
海南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228101/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227307/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227624/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227677/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227695/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221228236/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227217/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227442/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227555/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227377/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227211/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227565/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227665/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227703/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227495/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227479/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227320/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227220/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227735/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227698/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228227/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227404/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228413/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227482/index.m3u8
|
||||
甘肃卫视,http://ott.mobaibox.com/PLTV/3/224/3221227568/index.m3u8
|
||||
贵州卫视,http://ott.mobaibox.com/PLTV/3/224/3221227551/index.m3u8
|
||||
贵州卫视,http://ott.mobaibox.com/PLTV/3/224/3221228136/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227380/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227676/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227700/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221228162/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227410/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221228310/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227485/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221227632/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221227550/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221227729/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221228133/index.m3u8
|
||||
青海卫视,http://ott.mobaibox.com/PLTV/3/224/3221227554/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227323/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227252/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227662/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227753/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228233/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227492/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227638/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228295/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227514/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/1/224/3221227476/index.m3u8
|
||||
三沙卫视,http://ott.mobaibox.com/PLTV/3/224/3221228626/index.m3u8
|
||||
四川卫视,http://ott.mobaibox.com/PLTV/3/224/3221228171/index.m3u8
|
||||
新疆卫视,http://ott.mobaibox.com/PLTV/3/224/3221228290/index.m3u8
|
||||
SiTV高清,#genre#
|
||||
SiTV乐游,http://ott.mobaibox.com/PLTV/3/224/3221227771/index.m3u8
|
||||
SiTV动漫秀场,http://ott.mobaibox.com/PLTV/3/224/3221227774/index.m3u8
|
||||
SiTV游戏风云,http://ott.mobaibox.com/PLTV/3/224/3221227713/index.m3u8
|
||||
SiTV生活时尚,http://ott.mobaibox.com/PLTV/3/224/3221227707/index.m3u8
|
||||
SiTV都市剧场,http://ott.mobaibox.com/PLTV/3/224/3221227710/index.m3u8
|
||||
NewTV高清,#genre#
|
||||
NewTV海外剧场,http://ott.mobaibox.com/PLTV/3/224/3221227539/index.m3u8
|
||||
NewTV中国功夫,http://ott.mobaibox.com/PLTV/3/224/3221227530/index.m3u8
|
||||
NewTV军事评论,http://ott.mobaibox.com/PLTV/3/224/3221227544/index.m3u8
|
||||
NewTV军旅剧场,http://ott.mobaibox.com/PLTV/3/224/3221227603/index.m3u8
|
||||
NewTV农业致富,http://ott.mobaibox.com/PLTV/3/224/3221227588/index.m3u8
|
||||
NewTV动作电影,http://ott.mobaibox.com/PLTV/3/224/3221227606/index.m3u8
|
||||
NewTV家庭剧场,http://ott.mobaibox.com/PLTV/3/224/3221227600/index.m3u8
|
||||
NewTV怡伴健康,http://ott.mobaibox.com/PLTV/3/224/3221227612/index.m3u8
|
||||
NewTV惊悚悬疑,http://ott.mobaibox.com/PLTV/3/224/3221227536/index.m3u8
|
||||
NewTV明星大片,http://ott.mobaibox.com/PLTV/3/224/3221227594/index.m3u8
|
||||
NewTV武搏世界,http://ott.mobaibox.com/PLTV/3/224/3221227533/index.m3u8
|
||||
NewTV潮妈辣婆,http://ott.mobaibox.com/PLTV/3/224/3221227527/index.m3u8
|
||||
NewTV炫舞未来,http://ott.mobaibox.com/PLTV/3/224/3221227475/index.m3u8
|
||||
NewTV爱情喜剧,http://ott.mobaibox.com/PLTV/3/224/3221227548/index.m3u8
|
||||
NewTV精品体育,http://ott.mobaibox.com/PLTV/3/224/3221227615/index.m3u8
|
||||
NewTV精品大剧,http://ott.mobaibox.com/PLTV/3/224/3221227618/index.m3u8
|
||||
NewTV精品纪录,http://ott.mobaibox.com/PLTV/3/224/3221227547/index.m3u8
|
||||
NewTV精品萌宠,http://ott.mobaibox.com/PLTV/3/224/3221228430/index.m3u8
|
||||
NewTV金牌综艺,http://ott.mobaibox.com/PLTV/3/224/3221227541/index.m3u8
|
||||
NewTV古装剧场,http://ott.mobaibox.com/PLTV/3/224/3221227542/index.m3u8
|
||||
NewTV精选影视,http://ott.mobaibox.com/PLTV/3/224/3221227579/index.m3u8
|
||||
NewTV热播精选,http://ott.mobaibox.com/PLTV/3/224/3221227512/index.m3u8
|
||||
黑莓高清,#genre#
|
||||
黑莓动画,http://ott.mobaibox.com/PLTV/3/224/3221225555/index.m3u8
|
||||
黑莓电影,http://ott.mobaibox.com/PLTV/3/224/3221225567/index.m3u8
|
||||
黑莓电影,http://ott.mobaibox.com/PLTV/3/224/3221227520/index.m3u8
|
||||
哒啵赛事,http://ott.mobaibox.com/PLTV/3/224/3221225539/index.m3u8
|
||||
数字高清,#genre#
|
||||
睛彩青少,http://ott.mobaibox.com/PLTV/3/224/3221228427/index.m3u8
|
||||
晴彩竞技,http://ott.mobaibox.com/PLTV/3/224/3221228206/index.m3u8
|
||||
睛彩竞技,http://ott.mobaibox.com/PLTV/4/224/3221228679/index.m3u8
|
||||
睛彩广场舞,http://ott.mobaibox.com/PLTV/4/224/3221228231/index.m3u8
|
||||
睛彩篮球,http://ott.mobaibox.com/PLTV/4/224/3221228234/index.m3u8
|
||||
百姓生活,http://ott.mobaibox.com/PLTV/3/224/3221228466/index.m3u8
|
||||
北京纪实科教,http://ott.mobaibox.com/PLTV/3/224/3221227699/index.m3u8
|
||||
上海纪实人文,http://ott.mobaibox.com/PLTV/3/224/3221227674/index.m3u8
|
||||
上海纪实人文,http://ott.mobaibox.com/PLTV/3/224/3221227635/index.m3u8
|
||||
知否知否,http://ott.mobaibox.com/PLTV/3/224/3221228465/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228441/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228463/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228460/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228456/index.m3u8
|
||||
未知,http://ott.mobaibox.com/PLTV/3/224/3221228539/index.m3u8
|
||||
未知,http://ott.mobaibox.com/PLTV/3/224/3221228536/index.m3u8
|
||||
咪咕高清,#genre#
|
||||
咪咕全民热练,http://ott.mobaibox.com/PLTV/3/224/3221228427/index.m3u8
|
||||
咪咕怀旧剧场 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228120/index.m3u8
|
||||
咪咕视频 ,http://ott.mobaibox.com/PLTV/3/224/3221228084/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228231/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228129/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228206/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228193/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228234/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221227529/index.m3u8
|
||||
江苏4K修复,http://ott.mobaibox.com/PLTV/3/224/3221228141/index.m3u8
|
||||
江苏8K测试,http://ott.mobaibox.com/PLTV/3/224/3221228132/index.m3u8
|
||||
江苏高清,#genre#
|
||||
南京信息,http://ott.mobaibox.com/PLTV/3/224/3221227730/index.m3u8
|
||||
南京娱乐,http://ott.mobaibox.com/PLTV/3/224/3221227722/index.m3u8
|
||||
南京新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227213/index.m3u8
|
||||
东海综合,http://ott.mobaibox.com/PLTV/3/224/3221227792/index.m3u8
|
||||
仪化有线,http://ott.mobaibox.com/PLTV/3/224/3221227702/index.m3u8
|
||||
南通2,http://ott.mobaibox.com/PLTV/3/224/3221228448/index.m3u8
|
||||
南通3,http://ott.mobaibox.com/PLTV/3/224/3221228451/index.m3u8
|
||||
南通新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221228462/index.m3u8
|
||||
宝应新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221228007/index.m3u8
|
||||
宝应生活资讯,http://ott.mobaibox.com/PLTV/3/224/3221228039/index.m3u8
|
||||
崇川,http://ott.mobaibox.com/PLTV/3/224/3221228533/index.m3u8
|
||||
常州公共,http://ott.mobaibox.com/PLTV/3/224/3221227772/index.m3u8
|
||||
常州公共,http://ott.mobaibox.com/PLTV/3/224/3221227905/index.m3u8
|
||||
常州新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227752/index.m3u8
|
||||
常州新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227899/index.m3u8
|
||||
常州生活,http://ott.mobaibox.com/PLTV/3/224/3221227816/index.m3u8
|
||||
常州生活,http://ott.mobaibox.com/PLTV/3/224/3221227902/index.m3u8
|
||||
常州都市,http://ott.mobaibox.com/PLTV/3/224/3221227755/index.m3u8
|
||||
常州都市,http://ott.mobaibox.com/PLTV/3/224/3221227955/index.m3u8
|
||||
徐州1,http://ott.mobaibox.com/PLTV/3/224/3221225945/index.m3u8
|
||||
徐州2,http://ott.mobaibox.com/PLTV/3/224/3221225947/index.m3u8
|
||||
徐州3,http://ott.mobaibox.com/PLTV/3/224/3221225949/index.m3u8
|
||||
徐州4,http://ott.mobaibox.com/PLTV/3/224/3221225951/index.m3u8
|
||||
江西风尚购物,http://ott.mobaibox.com/PLTV/3/224/3221225956/index.m3u8
|
||||
沛县文艺影视,http://ott.mobaibox.com/PLTV/3/224/3221227681/index.m3u8
|
||||
沛县新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227678/index.m3u8
|
||||
沛县经济生活,http://ott.mobaibox.com/PLTV/3/224/3221227611/index.m3u8
|
||||
泰州1,http://ott.mobaibox.com/PLTV/3/224/3221228209/index.m3u8
|
||||
泰州2,http://ott.mobaibox.com/PLTV/3/224/3221228212/index.m3u8
|
||||
泰州3,http://ott.mobaibox.com/PLTV/3/224/3221228100/index.m3u8
|
||||
睢宁三农,http://ott.mobaibox.com/PLTV/3/224/3221227709/index.m3u8
|
||||
睢宁生活教育,http://ott.mobaibox.com/PLTV/3/224/3221227701/index.m3u8
|
||||
睢宁综合,http://ott.mobaibox.com/PLTV/3/224/3221227706/index.m3u8
|
||||
睢宁资讯,http://ott.mobaibox.com/PLTV/3/224/3221227712/index.m3u8
|
||||
赣榆,http://ott.mobaibox.com/PLTV/3/224/3221228317/index.m3u8
|
||||
连云港公共 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221227819/index.m3u8
|
||||
连云港新闻综合 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221227758/index.m3u8
|
||||
邳州综合,http://ott.mobaibox.com/PLTV/3/224/3221227576/index.m3u8
|
||||
镇江新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221228246/index.m3u8
|
||||
高淳新闻,http://ott.mobaibox.com/PLTV/3/224/3221227870/index.m3u8
|
||||
盐城1,http://ott.mobaibox.com/PLTV/3/224/3221228435/index.m3u8
|
||||
盐城2,http://ott.mobaibox.com/PLTV/3/224/3221228433/index.m3u8
|
||||
盐城3,http://ott.mobaibox.com/PLTV/3/224/3221228436/index.m3u8
|
||||
大丰综合频道,http://dafeng-tv-hls.cm.jstv.com/dafeng-tv/dafengyt.m3u8?zjiangsd
|
||||
大丰公共频道,http://dafeng-tv-hls.cm.jstv.com/dafeng-tv/dafenget.m3u8?zjiangsd
|
||||
+395
@@ -0,0 +1,395 @@
|
||||
凤凰高清,#genre#
|
||||
凤凰卫视香港台,http://ott.mobaibox.com/PLTV/3/224/3221228530/index.m3u8
|
||||
凤凰卫视中文台,http://ott.mobaibox.com/PLTV/3/224/3221228527/index.m3u8
|
||||
凤凰资讯,http://ott.mobaibox.com/PLTV/3/224/3221228524/index.m3u8
|
||||
CCTV高清,#genre#
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227375/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227736/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227739/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227641/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221225530/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228146/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227644/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227675/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228049/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227462/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227634/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228213/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227725/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221228149/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/3/224/3221227467/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221228094/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221226993/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227207/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227708/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227427/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227696/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221228118/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221228300/index.m3u8
|
||||
CCTV2,http://ott.mobaibox.com/PLTV/3/224/3221227543/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221225588/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227295/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228237/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227650/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227623/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227424/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228188/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228392/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221227546/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228126/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227378/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221225534/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227658/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227683/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221228156/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227489/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221228307/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221227549/index.m3u8
|
||||
CCTV4,http://ott.mobaibox.com/PLTV/3/224/3221228091/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227298/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227166/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227640/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227661/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228173/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228082/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227401/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227686/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228395/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227537/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227617/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228179/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227381/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228492/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221225604/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227714/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227685/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228114/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228076/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227480/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227631/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228277/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221227502/index.m3u8
|
||||
CCTV5+,http://ott.mobaibox.com/PLTV/3/224/3221228176/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227209/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227301/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228196/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221225548/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227664/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228185/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227581/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227430/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228280/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221227505/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228123/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221227314/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221225546/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221227642/index.m3u8
|
||||
CCTV7,http://ott.mobaibox.com/PLTV/3/224/3221227626/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227304/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227205/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227667/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227750/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228079/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227433/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227629/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221227573/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228398/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221227473/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228194/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221225532/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221227659/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221227704/index.m3u8
|
||||
CCTV9,http://ott.mobaibox.com/PLTV/3/224/3221227614/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221227317/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221225550/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221227717/index.m3u8
|
||||
CCTV10,http://ott.mobaibox.com/PLTV/3/224/3221227620/index.m3u8
|
||||
CCTV11,http://ott.mobaibox.com/PLTV/3/224/3221227524/index.m3u8
|
||||
CCTV11,http://ott.mobaibox.com/PLTV/3/224/3221227384/index.m3u8
|
||||
CCTV11,http://ott.mobaibox.com/PLTV/3/224/3221227720/index.m3u8
|
||||
CCTV12,http://ott.mobaibox.com/PLTV/3/224/3221225556/index.m3u8
|
||||
CCTV12,http://ott.mobaibox.com/PLTV/3/224/3221227655/index.m3u8
|
||||
CCTV12,http://ott.mobaibox.com/PLTV/3/224/3221227637/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221225560/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221228121/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221227387/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221228224/index.m3u8
|
||||
CCTV13,http://ott.mobaibox.com/PLTV/3/224/3221228324/index.m3u8
|
||||
CCTV14,http://ott.mobaibox.com/PLTV/3/224/3221227201/index.m3u8
|
||||
CCTV14,http://ott.mobaibox.com/PLTV/3/224/3221227656/index.m3u8
|
||||
CCTV14,http://ott.mobaibox.com/PLTV/3/224/3221227693/index.m3u8
|
||||
CCTV15,http://ott.mobaibox.com/PLTV/3/224/3221227538/index.m3u8
|
||||
CCTV15,http://ott.mobaibox.com/PLTV/3/224/3221227723/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228320/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228144/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228112/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227578/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227589/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227592/index.m3u8
|
||||
CCTV17,http://ott.mobaibox.com/PLTV/3/224/3221227726/index.m3u8
|
||||
CCTV高尔夫网球,http://ott.mobaibox.com/PLTV/3/224/3221228138/index.m3u8
|
||||
CCTV1,http://ott.mobaibox.com/PLTV/4/224/3221228581/index.m3u8
|
||||
CCTV3,http://ott.mobaibox.com/PLTV/3/224/3221228499/index.m3u8
|
||||
CCTV5,http://ott.mobaibox.com/PLTV/3/224/3221228502/index.m3u8
|
||||
CCTV6,http://ott.mobaibox.com/PLTV/3/224/3221228516/index.m3u8
|
||||
CCTV8,http://ott.mobaibox.com/PLTV/3/224/3221228578/index.m3u8
|
||||
CCTV16,http://ott.mobaibox.com/PLTV/3/224/3221228168/index.m3u8
|
||||
CCTV4K,http://ott.mobaibox.com/PLTV/3/224/3221228472/index.m3u8
|
||||
CCTV8K,http://ott.mobaibox.com/PLTV/3/224/3221228165/index.m3u8
|
||||
CCTV兵器科技,http://ott.mobaibox.com/PLTV/3/224/3221228686/index.m3u8
|
||||
CCTV第一剧场,http://ott.mobaibox.com/PLTV/3/224/3221228659/index.m3u8
|
||||
CCTV电视指南,http://ott.mobaibox.com/PLTV/3/224/3221228689/index.m3u8
|
||||
CCTV风云剧场,http://ott.mobaibox.com/PLTV/3/224/3221228662/index.m3u8
|
||||
CCTV风云音乐,http://ott.mobaibox.com/PLTV/3/224/3221228665/index.m3u8
|
||||
CCTV风云足球,http://ott.mobaibox.com/PLTV/3/224/3221228668/index.m3u8
|
||||
CCTV女性时尚,http://ott.mobaibox.com/PLTV/3/224/3221228674/index.m3u8
|
||||
CCTV怀旧剧场,http://ott.mobaibox.com/PLTV/3/224/3221228671/index.m3u8
|
||||
CCTV世界地理,http://ott.mobaibox.com/PLTV/3/224/3221228680/index.m3u8
|
||||
CCTV央视台球,http://ott.mobaibox.com/PLTV/3/224/3221228683/index.m3u8
|
||||
CCTV央视文化精品,http://ott.mobaibox.com/PLTV/3/224/3221228677/index.m3u8
|
||||
卫视高清,#genre#
|
||||
东南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227553/index.m3u8
|
||||
东南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227670/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227396/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221228504/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227597/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227732/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227688/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221228150/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227208/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227486/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221228425/index.m3u8
|
||||
东方卫视,http://ott.mobaibox.com/PLTV/3/224/3221227511/index.m3u8
|
||||
云南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227571/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227390/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227246/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227652/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227694/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221228115/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227436/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221228410/index.m3u8
|
||||
北京卫视,http://ott.mobaibox.com/PLTV/3/224/3221227508/index.m3u8
|
||||
吉林卫视,http://ott.mobaibox.com/PLTV/3/224/3221228028/index.m3u8
|
||||
吉林卫视,http://ott.mobaibox.com/PLTV/3/224/3221228130/index.m3u8
|
||||
四川卫视,http://ott.mobaibox.com/PLTV/3/224/3221227556/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227382/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227212/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227633/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227741/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227756/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221228239/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227407/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221228416/index.m3u8
|
||||
天津卫视,http://ott.mobaibox.com/PLTV/3/224/3221227488/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221225634/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227653/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227759/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221228153/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227498/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227643/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221228327/index.m3u8
|
||||
安徽卫视,http://ott.mobaibox.com/PLTV/3/224/3221227558/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227310/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228560/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227621/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227671/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227697/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228124/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227258/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227448/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228315/index.m3u8
|
||||
山东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227517/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227399/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228566/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227249/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227591/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227673/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227691/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228230/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227445/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221228312/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/3/224/3221227476/index.m3u8
|
||||
广西卫视,http://ott.mobaibox.com/PLTV/3/224/3221228183/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227402/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227649/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227255/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227705/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227668/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227689/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227439/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221228099/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221228306/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221228097/index.m3u8
|
||||
江苏卫视,http://ott.mobaibox.com/PLTV/3/224/3221227552/index.m3u8
|
||||
江西卫视,http://ott.mobaibox.com/PLTV/3/224/3221225536/index.m3u8
|
||||
江西卫视,http://ott.mobaibox.com/PLTV/3/224/3221227738/index.m3u8
|
||||
江西卫视,http://ott.mobaibox.com/PLTV/3/224/3221228109/index.m3u8
|
||||
河北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227545/index.m3u8
|
||||
河北卫视,http://ott.mobaibox.com/PLTV/3/224/3221228106/index.m3u8
|
||||
河南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227521/index.m3u8
|
||||
河南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228221/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227393/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227215/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227744/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227692/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228147/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228204/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228309/index.m3u8
|
||||
浙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227491/index.m3u8
|
||||
海南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228139/index.m3u8
|
||||
海南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228101/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227307/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227624/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227677/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227695/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221228236/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227217/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227442/index.m3u8
|
||||
深圳卫视,http://ott.mobaibox.com/PLTV/3/224/3221227555/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227377/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227211/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227565/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227665/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227703/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227495/index.m3u8
|
||||
湖北卫视,http://ott.mobaibox.com/PLTV/3/224/3221227479/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227320/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227220/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227735/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227698/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228227/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227404/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221228413/index.m3u8
|
||||
湖南卫视,http://ott.mobaibox.com/PLTV/3/224/3221227482/index.m3u8
|
||||
甘肃卫视,http://ott.mobaibox.com/PLTV/3/224/3221227568/index.m3u8
|
||||
贵州卫视,http://ott.mobaibox.com/PLTV/3/224/3221227551/index.m3u8
|
||||
贵州卫视,http://ott.mobaibox.com/PLTV/3/224/3221228136/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227380/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227676/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227700/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221228162/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227410/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221228310/index.m3u8
|
||||
辽宁卫视,http://ott.mobaibox.com/PLTV/3/224/3221227485/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221227632/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221227550/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221227729/index.m3u8
|
||||
重庆卫视,http://ott.mobaibox.com/PLTV/3/224/3221228133/index.m3u8
|
||||
青海卫视,http://ott.mobaibox.com/PLTV/3/224/3221227554/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227323/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227252/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227662/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227753/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228233/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227492/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227638/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221228295/index.m3u8
|
||||
黑龙江卫视,http://ott.mobaibox.com/PLTV/3/224/3221227514/index.m3u8
|
||||
广东卫视,http://ott.mobaibox.com/PLTV/1/224/3221227476/index.m3u8
|
||||
三沙卫视,http://ott.mobaibox.com/PLTV/3/224/3221228626/index.m3u8
|
||||
四川卫视,http://ott.mobaibox.com/PLTV/3/224/3221228171/index.m3u8
|
||||
新疆卫视,http://ott.mobaibox.com/PLTV/3/224/3221228290/index.m3u8
|
||||
SiTV高清,#genre#
|
||||
SiTV乐游,http://ott.mobaibox.com/PLTV/3/224/3221227771/index.m3u8
|
||||
SiTV动漫秀场,http://ott.mobaibox.com/PLTV/3/224/3221227774/index.m3u8
|
||||
SiTV游戏风云,http://ott.mobaibox.com/PLTV/3/224/3221227713/index.m3u8
|
||||
SiTV生活时尚,http://ott.mobaibox.com/PLTV/3/224/3221227707/index.m3u8
|
||||
SiTV都市剧场,http://ott.mobaibox.com/PLTV/3/224/3221227710/index.m3u8
|
||||
NewTV高清,#genre#
|
||||
NewTV海外剧场,http://ott.mobaibox.com/PLTV/3/224/3221227539/index.m3u8
|
||||
NewTV中国功夫,http://ott.mobaibox.com/PLTV/3/224/3221227530/index.m3u8
|
||||
NewTV军事评论,http://ott.mobaibox.com/PLTV/3/224/3221227544/index.m3u8
|
||||
NewTV军旅剧场,http://ott.mobaibox.com/PLTV/3/224/3221227603/index.m3u8
|
||||
NewTV农业致富,http://ott.mobaibox.com/PLTV/3/224/3221227588/index.m3u8
|
||||
NewTV动作电影,http://ott.mobaibox.com/PLTV/3/224/3221227606/index.m3u8
|
||||
NewTV家庭剧场,http://ott.mobaibox.com/PLTV/3/224/3221227600/index.m3u8
|
||||
NewTV怡伴健康,http://ott.mobaibox.com/PLTV/3/224/3221227612/index.m3u8
|
||||
NewTV惊悚悬疑,http://ott.mobaibox.com/PLTV/3/224/3221227536/index.m3u8
|
||||
NewTV明星大片,http://ott.mobaibox.com/PLTV/3/224/3221227594/index.m3u8
|
||||
NewTV武搏世界,http://ott.mobaibox.com/PLTV/3/224/3221227533/index.m3u8
|
||||
NewTV潮妈辣婆,http://ott.mobaibox.com/PLTV/3/224/3221227527/index.m3u8
|
||||
NewTV炫舞未来,http://ott.mobaibox.com/PLTV/3/224/3221227475/index.m3u8
|
||||
NewTV爱情喜剧,http://ott.mobaibox.com/PLTV/3/224/3221227548/index.m3u8
|
||||
NewTV精品体育,http://ott.mobaibox.com/PLTV/3/224/3221227615/index.m3u8
|
||||
NewTV精品大剧,http://ott.mobaibox.com/PLTV/3/224/3221227618/index.m3u8
|
||||
NewTV精品纪录,http://ott.mobaibox.com/PLTV/3/224/3221227547/index.m3u8
|
||||
NewTV精品萌宠,http://ott.mobaibox.com/PLTV/3/224/3221228430/index.m3u8
|
||||
NewTV金牌综艺,http://ott.mobaibox.com/PLTV/3/224/3221227541/index.m3u8
|
||||
NewTV古装剧场,http://ott.mobaibox.com/PLTV/3/224/3221227542/index.m3u8
|
||||
NewTV精选影视,http://ott.mobaibox.com/PLTV/3/224/3221227579/index.m3u8
|
||||
NewTV热播精选,http://ott.mobaibox.com/PLTV/3/224/3221227512/index.m3u8
|
||||
黑莓高清,#genre#
|
||||
黑莓动画,http://ott.mobaibox.com/PLTV/3/224/3221225555/index.m3u8
|
||||
黑莓电影,http://ott.mobaibox.com/PLTV/3/224/3221225567/index.m3u8
|
||||
黑莓电影,http://ott.mobaibox.com/PLTV/3/224/3221227520/index.m3u8
|
||||
哒啵赛事,http://ott.mobaibox.com/PLTV/3/224/3221225539/index.m3u8
|
||||
数字高清,#genre#
|
||||
百姓生活,http://ott.mobaibox.com/PLTV/3/224/3221228466/index.m3u8
|
||||
北京纪实科教,http://ott.mobaibox.com/PLTV/3/224/3221227699/index.m3u8
|
||||
上海纪实人文,http://ott.mobaibox.com/PLTV/3/224/3221227674/index.m3u8
|
||||
上海纪实人文,http://ott.mobaibox.com/PLTV/3/224/3221227635/index.m3u8
|
||||
知否知否,http://ott.mobaibox.com/PLTV/3/224/3221228465/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228441/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228463/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228460/index.m3u8
|
||||
未知 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228456/index.m3u8
|
||||
未知,http://ott.mobaibox.com/PLTV/3/224/3221228539/index.m3u8
|
||||
未知,http://ott.mobaibox.com/PLTV/3/224/3221228536/index.m3u8
|
||||
咪咕高清,#genre#
|
||||
咪咕全民热练,http://ott.mobaibox.com/PLTV/3/224/3221228427/index.m3u8
|
||||
咪咕怀旧剧场 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221228120/index.m3u8
|
||||
咪咕视频 ,http://ott.mobaibox.com/PLTV/3/224/3221228084/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228231/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228129/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228206/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228193/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221228234/index.m3u8
|
||||
咪咕视频,http://ott.mobaibox.com/PLTV/3/224/3221227529/index.m3u8
|
||||
江苏4K修复,http://ott.mobaibox.com/PLTV/3/224/3221228141/index.m3u8
|
||||
江苏8K测试,http://ott.mobaibox.com/PLTV/3/224/3221228132/index.m3u8
|
||||
江苏高清,#genre#
|
||||
南京信息,http://ott.mobaibox.com/PLTV/3/224/3221227730/index.m3u8
|
||||
南京娱乐,http://ott.mobaibox.com/PLTV/3/224/3221227722/index.m3u8
|
||||
南京新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227213/index.m3u8
|
||||
东海综合,http://ott.mobaibox.com/PLTV/3/224/3221227792/index.m3u8
|
||||
仪化有线,http://ott.mobaibox.com/PLTV/3/224/3221227702/index.m3u8
|
||||
南通2,http://ott.mobaibox.com/PLTV/3/224/3221228448/index.m3u8
|
||||
南通3,http://ott.mobaibox.com/PLTV/3/224/3221228451/index.m3u8
|
||||
南通新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221228462/index.m3u8
|
||||
宝应新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221228007/index.m3u8
|
||||
宝应生活资讯,http://ott.mobaibox.com/PLTV/3/224/3221228039/index.m3u8
|
||||
崇川,http://ott.mobaibox.com/PLTV/3/224/3221228533/index.m3u8
|
||||
常州公共,http://ott.mobaibox.com/PLTV/3/224/3221227772/index.m3u8
|
||||
常州公共,http://ott.mobaibox.com/PLTV/3/224/3221227905/index.m3u8
|
||||
常州新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227752/index.m3u8
|
||||
常州新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227899/index.m3u8
|
||||
常州生活,http://ott.mobaibox.com/PLTV/3/224/3221227816/index.m3u8
|
||||
常州生活,http://ott.mobaibox.com/PLTV/3/224/3221227902/index.m3u8
|
||||
常州都市,http://ott.mobaibox.com/PLTV/3/224/3221227755/index.m3u8
|
||||
常州都市,http://ott.mobaibox.com/PLTV/3/224/3221227955/index.m3u8
|
||||
徐州1,http://ott.mobaibox.com/PLTV/3/224/3221225945/index.m3u8
|
||||
徐州2,http://ott.mobaibox.com/PLTV/3/224/3221225947/index.m3u8
|
||||
徐州3,http://ott.mobaibox.com/PLTV/3/224/3221225949/index.m3u8
|
||||
徐州4,http://ott.mobaibox.com/PLTV/3/224/3221225951/index.m3u8
|
||||
江西风尚购物,http://ott.mobaibox.com/PLTV/3/224/3221225956/index.m3u8
|
||||
沛县文艺影视,http://ott.mobaibox.com/PLTV/3/224/3221227681/index.m3u8
|
||||
沛县新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221227678/index.m3u8
|
||||
沛县经济生活,http://ott.mobaibox.com/PLTV/3/224/3221227611/index.m3u8
|
||||
泰州1,http://ott.mobaibox.com/PLTV/3/224/3221228209/index.m3u8
|
||||
泰州2,http://ott.mobaibox.com/PLTV/3/224/3221228212/index.m3u8
|
||||
泰州3,http://ott.mobaibox.com/PLTV/3/224/3221228100/index.m3u8
|
||||
睢宁三农,http://ott.mobaibox.com/PLTV/3/224/3221227709/index.m3u8
|
||||
睢宁生活教育,http://ott.mobaibox.com/PLTV/3/224/3221227701/index.m3u8
|
||||
睢宁综合,http://ott.mobaibox.com/PLTV/3/224/3221227706/index.m3u8
|
||||
睢宁资讯,http://ott.mobaibox.com/PLTV/3/224/3221227712/index.m3u8
|
||||
赣榆,http://ott.mobaibox.com/PLTV/3/224/3221228317/index.m3u8
|
||||
连云港公共 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221227819/index.m3u8
|
||||
连云港新闻综合 2M1080,http://ott.mobaibox.com/PLTV/3/224/3221227758/index.m3u8
|
||||
邳州综合,http://ott.mobaibox.com/PLTV/3/224/3221227576/index.m3u8
|
||||
镇江新闻综合,http://ott.mobaibox.com/PLTV/3/224/3221228246/index.m3u8
|
||||
高淳新闻,http://ott.mobaibox.com/PLTV/3/224/3221227870/index.m3u8
|
||||
盐城1,http://ott.mobaibox.com/PLTV/3/224/3221228435/index.m3u8
|
||||
盐城2,http://ott.mobaibox.com/PLTV/3/224/3221228433/index.m3u8
|
||||
盐城3,http://ott.mobaibox.com/PLTV/3/224/3221228436/index.m3u8
|
||||
大丰综合频道,http://dafeng-tv-hls.cm.jstv.com/dafeng-tv/dafengyt.m3u8?zjiangsd
|
||||
大丰公共频道,http://dafeng-tv-hls.cm.jstv.com/dafeng-tv/dafenget.m3u8?zjiangsd
|
||||
+263
@@ -0,0 +1,263 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import base64
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import requests
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
# 类级别的缓存(所有实例共享)
|
||||
_cache_data = None
|
||||
_cache_time = None
|
||||
_cache_ttl = 3600 # 1小时
|
||||
|
||||
def getName(self):
|
||||
return "Litv"
|
||||
|
||||
def init(self, extend):
|
||||
self.extend = extend
|
||||
try:
|
||||
self.extendDict = json.loads(extend)
|
||||
except:
|
||||
self.extendDict = {}
|
||||
|
||||
proxy = self.extendDict.get('proxy', None)
|
||||
if proxy is None:
|
||||
self.is_proxy = False
|
||||
else:
|
||||
self.proxy = proxy
|
||||
self.is_proxy = True
|
||||
pass
|
||||
|
||||
def getDependence(self):
|
||||
return []
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def _get_cached_data(self):
|
||||
"""获取缓存数据(自动清空过期缓存)"""
|
||||
if Spider._cache_data is None or Spider._cache_time is None:
|
||||
return None
|
||||
|
||||
elapsed = (datetime.now() - Spider._cache_time).total_seconds()
|
||||
|
||||
if elapsed < Spider._cache_ttl:
|
||||
return Spider._cache_data
|
||||
|
||||
# 缓存过期,主动清空
|
||||
Spider._cache_data = None
|
||||
Spider._cache_time = None
|
||||
return None
|
||||
|
||||
def _set_cached_data(self, data):
|
||||
"""设置缓存数据"""
|
||||
Spider._cache_data = data
|
||||
Spider._cache_time = datetime.now()
|
||||
|
||||
def _fetch_live_data(self):
|
||||
"""获取直播数据(带内存缓存)"""
|
||||
# 尝试从缓存获取
|
||||
cached_data = self._get_cached_data()
|
||||
if cached_data is not None:
|
||||
return cached_data
|
||||
|
||||
# 缓存失效,请求新数据
|
||||
starttime = datetime.now().strftime("%Y-%m-%d")
|
||||
api_url = f"https://kzb29rda.com/prod-api/match/list/new?isfanye=1&type=0&cid=0&ishot=1&pn=1&ps=50&level=&name=&langtype=zh&starttime={starttime}&pid=4&zoneId=Asia%2FShanghai&zhuboType=1"
|
||||
|
||||
try:
|
||||
# 创建会话
|
||||
session = requests.Session()
|
||||
|
||||
# 第一次请求(会返回跳转页面)
|
||||
headers_first = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
||||
"Connection": "keep-alive"
|
||||
}
|
||||
|
||||
response = session.get(api_url, headers=headers_first, timeout=15)
|
||||
|
||||
# 提取跳转地址
|
||||
target_url = None
|
||||
|
||||
# 方法1: location.replace
|
||||
match = re.search(r'location\.replace\("([^"]+)"\)', response.text)
|
||||
if match:
|
||||
target_url = match.group(1)
|
||||
|
||||
# 方法2: meta refresh
|
||||
if not target_url:
|
||||
match = re.search(r'url=([^"\'\s>]+)', response.text)
|
||||
if match:
|
||||
target_url = match.group(1)
|
||||
|
||||
# 如果找到跳转地址,则请求真实数据
|
||||
if target_url:
|
||||
# 清理URL
|
||||
target_url = target_url.replace('&', '&')
|
||||
|
||||
# 延迟一下
|
||||
time.sleep(1)
|
||||
|
||||
# 请求真实数据
|
||||
headers_data = {
|
||||
"User-Agent": headers_first["User-Agent"],
|
||||
"Referer": api_url,
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
||||
"Connection": "keep-alive",
|
||||
"X-Requested-With": "XMLHttpRequest"
|
||||
}
|
||||
|
||||
data_response = session.get(target_url, headers=headers_data, timeout=15)
|
||||
data_response.raise_for_status()
|
||||
|
||||
# 处理可能的BOM
|
||||
text = data_response.text.strip()
|
||||
if text.startswith('\ufeff'):
|
||||
text = text[1:]
|
||||
|
||||
data = json.loads(text)
|
||||
else:
|
||||
# 如果没有跳转,尝试直接解析
|
||||
response.raise_for_status()
|
||||
text = response.text.strip()
|
||||
if text.startswith('\ufeff'):
|
||||
text = text[1:]
|
||||
data = json.loads(text)
|
||||
|
||||
# 存入缓存
|
||||
self._set_cached_data(data)
|
||||
|
||||
return data
|
||||
|
||||
except:
|
||||
return None
|
||||
|
||||
def _parse_live_data(self, data):
|
||||
"""解析直播数据为M3U格式"""
|
||||
m3u_content = ['#EXTM3U']
|
||||
|
||||
if not data:
|
||||
m3u_content.append('# 错误:无法获取直播数据')
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
try:
|
||||
# 处理 topList
|
||||
for match in data.get("data", {}).get("topList", []):
|
||||
hteam = match.get("hteam_name", "Unknown Home")
|
||||
ateam = match.get("ateam_name", "Unknown Away")
|
||||
name = match.get("name", "Unnamed Match")
|
||||
matchtime = match.get("matchtime", "Unknown Time")
|
||||
status = match.get("status_up_name", "Unknown Status")
|
||||
|
||||
for url_info in match.get("live_urls", []):
|
||||
url = url_info.get("url", "")
|
||||
if url:
|
||||
extinf = f'#EXTINF:-1 tvg-name="{name}({hteam}-{ateam}){status}{matchtime}" group-title="{name}",({hteam}-{ateam}){status}{matchtime}'
|
||||
m3u_content.extend([extinf, url])
|
||||
|
||||
# 处理 dataList
|
||||
for match in data.get("data", {}).get("dataList", []):
|
||||
hteam = match.get("hteam_name", "Unknown Home")
|
||||
ateam = match.get("ateam_name", "Unknown Away")
|
||||
name = match.get("name", "Unnamed Match")
|
||||
matchtime = match.get("matchtime", "Unknown Time")
|
||||
status = match.get("status_up_name", "Unknown Status")
|
||||
|
||||
for url_info in match.get("live_urls", []):
|
||||
url = url_info.get("url", "")
|
||||
if url:
|
||||
extinf = f'#EXTINF:-1 tvg-name="{name}({hteam}-{ateam}){status}{matchtime}" group-title="{name}",({hteam}-{ateam}){status}{matchtime}'
|
||||
m3u_content.extend([extinf, url])
|
||||
|
||||
except:
|
||||
m3u_content.append('# 错误:数据处理异常')
|
||||
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
def liveContent(self, url):
|
||||
"""主入口方法,返回M3U内容"""
|
||||
live_data = self._fetch_live_data()
|
||||
m3u_content = self._parse_live_data(live_data)
|
||||
return m3u_content
|
||||
|
||||
def homeContent(self, filter):
|
||||
return {}
|
||||
|
||||
def homeVideoContent(self):
|
||||
return {}
|
||||
|
||||
def categoryContent(self, cid, page, filter, ext):
|
||||
return {}
|
||||
|
||||
def detailContent(self, did):
|
||||
return {}
|
||||
|
||||
def searchContent(self, key, quick, page='1'):
|
||||
return {}
|
||||
|
||||
def searchContentPage(self, keywords, quick, page):
|
||||
return {}
|
||||
|
||||
def playerContent(self, flag, pid, vipFlags):
|
||||
return {}
|
||||
|
||||
def localProxy(self, params):
|
||||
if params['type'] == "m3u8":
|
||||
return self.proxyM3u8(params)
|
||||
if params['type'] == "ts":
|
||||
return self.get_ts(params)
|
||||
return [302, "text/plain", None, {'Location': 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'}]
|
||||
|
||||
def proxyM3u8(self, params):
|
||||
pid = params['pid']
|
||||
info = pid.split(',')
|
||||
a = info[0]
|
||||
b = info[1]
|
||||
c = info[2]
|
||||
timestamp = int(time.time() / 4 - 355017625)
|
||||
t = timestamp * 4
|
||||
m3u8_text = f'#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:4\n#EXT-X-MEDIA-SEQUENCE:{timestamp}\n'
|
||||
for i in range(10):
|
||||
url = f'https://ntd-tgc.cdn.hinet.net/live/pool/{a}/litv-pc/{a}-avc1_6000000={b}-mp4a_134000_zho={c}-begin={t}0000000-dur=40000000-seq={timestamp}.ts'
|
||||
if self.is_proxy:
|
||||
url = f'http://127.0.0.1:9978/proxy?do=py&type=ts&url={self.b64encode(url)}'
|
||||
|
||||
m3u8_text += f'#EXTINF:4,\n{url}\n'
|
||||
timestamp += 1
|
||||
t += 4
|
||||
return [200, "application/vnd.apple.mpegurl", m3u8_text]
|
||||
|
||||
def get_ts(self, params):
|
||||
url = self.b64decode(params['url'])
|
||||
headers = {'User-Agent': 'Mozilla/5.0'}
|
||||
if self.is_proxy:
|
||||
response = requests.get(url, headers=headers, stream=True, proxies=self.proxy)
|
||||
else:
|
||||
response = requests.get(url, headers=headers, stream=True)
|
||||
return [206, "application/octet-stream", response.content]
|
||||
|
||||
def destroy(self):
|
||||
return '正在Destroy'
|
||||
|
||||
def b64encode(self, data):
|
||||
return base64.b64encode(data.encode('utf-8')).decode('utf-8')
|
||||
|
||||
def b64decode(self, data):
|
||||
return base64.b64decode(data.encode('utf-8')).decode('utf-8')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
+400
@@ -0,0 +1,400 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import base64
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import requests
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
# 类级别的缓存(所有实例共享)
|
||||
_cache_data = None
|
||||
_cache_time = None
|
||||
_cache_ttl = 3600 # 1小时
|
||||
|
||||
# 央视频道顺序定义
|
||||
CCTV_ORDER = {
|
||||
'cctv1': 1, 'cctv2': 2, 'cctv3': 3, 'cctv4': 4, 'cctv5': 5,
|
||||
'cctv5plus': 6, 'cctv6': 7, 'cctv7': 8, 'cctv8': 9, 'cctv9': 10,
|
||||
'cctv10': 11, 'cctv11': 12, 'cctv12': 13, 'cctv13': 14, 'cctv14': 15,
|
||||
'cctv15': 16, 'cctv16': 17, 'cctv17': 18
|
||||
}
|
||||
|
||||
# 卫视频道顺序定义
|
||||
WEISHI_ORDER = {
|
||||
'湖南卫视': 1, '东方卫视': 2, '浙江卫视': 3, '江苏卫视': 4, '北京卫视': 5,
|
||||
'深圳卫视': 6, '广东卫视': 7, '安徽卫视': 8, '湖北卫视': 9, '山东卫视': 10,
|
||||
'江西卫视': 11, '海南卫视': 12, '黑龙江卫视': 13, '东南卫视': 14, '河北卫视': 15,
|
||||
'天津卫视': 16, '重庆卫视': 17, '辽宁卫视': 18, '四川卫视': 19, '河南卫视': 20,
|
||||
'广西卫视': 21, '吉林卫视': 22, '山西卫视': 23, '陕西卫视': 24, '云南卫视': 25,
|
||||
'贵州卫视': 26, '甘肃卫视': 27, '宁夏卫视': 28, '青海卫视': 29, '内蒙古卫视': 30,
|
||||
'新疆卫视': 31, '西藏卫视': 32, '厦门卫视': 33, '金鹰卡通': 34, '卡酷少儿': 35,
|
||||
'嘉佳卡通': 36, '优漫卡通': 37
|
||||
}
|
||||
|
||||
def getName(self):
|
||||
return "IPTV"
|
||||
|
||||
def init(self, extend):
|
||||
self.extend = extend
|
||||
try:
|
||||
self.extendDict = json.loads(extend)
|
||||
except:
|
||||
self.extendDict = {}
|
||||
|
||||
proxy = self.extendDict.get('proxy', None)
|
||||
if proxy is None:
|
||||
self.is_proxy = False
|
||||
else:
|
||||
self.proxy = proxy
|
||||
self.is_proxy = True
|
||||
pass
|
||||
|
||||
def getDependence(self):
|
||||
return []
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def _get_cached_data(self):
|
||||
"""获取缓存数据"""
|
||||
# 检查缓存是否存在且未过期
|
||||
if (Spider._cache_data is not None and
|
||||
Spider._cache_time is not None):
|
||||
elapsed = (datetime.now() - Spider._cache_time).total_seconds()
|
||||
if elapsed < Spider._cache_ttl:
|
||||
print(f"使用内存缓存(剩余有效期: {Spider._cache_ttl - elapsed:.0f}秒)")
|
||||
return Spider._cache_data
|
||||
|
||||
print("缓存失效,重新请求API")
|
||||
return None
|
||||
|
||||
def _set_cached_data(self, data):
|
||||
"""设置缓存数据"""
|
||||
Spider._cache_data = data
|
||||
Spider._cache_time = datetime.now()
|
||||
print(f"已缓存数据,有效期: {Spider._cache_ttl}秒")
|
||||
|
||||
def _is_cctv_channel(self, channel_name, channel_code):
|
||||
"""判断是否为央视频道"""
|
||||
# 通过频道代码判断
|
||||
if channel_code and channel_code.lower().startswith('cctv'):
|
||||
return True
|
||||
# 通过频道名称判断
|
||||
if channel_name and channel_name.startswith('CCTV'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def _get_cctv_order(self, channel_name, channel_code):
|
||||
"""获取央视频道排序值"""
|
||||
# 先通过频道代码获取
|
||||
if channel_code:
|
||||
code_lower = channel_code.lower()
|
||||
if code_lower in self.CCTV_ORDER:
|
||||
return self.CCTV_ORDER[code_lower]
|
||||
|
||||
# 通过频道名称获取
|
||||
if channel_name:
|
||||
# 处理如 "CCTV1"、"CCTV-1"、"CCTV1综合" 等格式
|
||||
match = re.search(r'CCTV[-]?(\d+)', channel_name, re.IGNORECASE)
|
||||
if match:
|
||||
num = int(match.group(1))
|
||||
if 1 <= num <= 18:
|
||||
return num
|
||||
# 特殊处理 CCTV5+
|
||||
if 'CCTV5+' in channel_name or 'CCTV5plus' in channel_name:
|
||||
return 6
|
||||
|
||||
return 999 # 无法识别的央视频道放在最后
|
||||
|
||||
def _get_weishi_order(self, channel_name):
|
||||
"""获取卫视频道排序值"""
|
||||
# 精确匹配
|
||||
if channel_name in self.WEISHI_ORDER:
|
||||
return self.WEISHI_ORDER[channel_name]
|
||||
|
||||
# 模糊匹配(去除"卫视"、"TV"等后缀)
|
||||
clean_name = channel_name.replace('卫视', '').replace('TV', '').strip()
|
||||
for key in self.WEISHI_ORDER:
|
||||
if key.startswith(clean_name) or clean_name in key:
|
||||
return self.WEISHI_ORDER[key]
|
||||
|
||||
return 999 # 无法识别的卫视放在最后
|
||||
|
||||
def _fetch_iptv_data(self):
|
||||
"""获取IPTV数据(带内存缓存)"""
|
||||
# 尝试从缓存获取
|
||||
cached_data = self._get_cached_data()
|
||||
if cached_data is not None:
|
||||
return cached_data
|
||||
|
||||
# 缓存失效,请求新数据
|
||||
api_url = "https://kzb29rda.com/prod-api/iptv/getIptvList?liveType=0&deviceType=1"
|
||||
|
||||
try:
|
||||
# 创建会话
|
||||
session = requests.Session()
|
||||
|
||||
# 第一次请求(会返回跳转页面)
|
||||
headers_first = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
||||
"Connection": "keep-alive"
|
||||
}
|
||||
|
||||
response = session.get(api_url, headers=headers_first, timeout=15)
|
||||
|
||||
# 提取跳转地址
|
||||
target_url = None
|
||||
|
||||
# 方法1: location.replace
|
||||
match = re.search(r'location\.replace\("([^"]+)"\)', response.text)
|
||||
if match:
|
||||
target_url = match.group(1)
|
||||
|
||||
# 方法2: meta refresh
|
||||
if not target_url:
|
||||
match = re.search(r'url=([^"\'\s>]+)', response.text)
|
||||
if match:
|
||||
target_url = match.group(1)
|
||||
|
||||
# 如果找到跳转地址,则请求真实数据
|
||||
if target_url:
|
||||
# 清理URL
|
||||
target_url = target_url.replace('&', '&')
|
||||
|
||||
# 延迟一下
|
||||
time.sleep(1)
|
||||
|
||||
# 请求真实数据
|
||||
headers_data = {
|
||||
"User-Agent": headers_first["User-Agent"],
|
||||
"Referer": api_url,
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
||||
"Connection": "keep-alive",
|
||||
"X-Requested-With": "XMLHttpRequest"
|
||||
}
|
||||
|
||||
data_response = session.get(target_url, headers=headers_data, timeout=15)
|
||||
data_response.raise_for_status()
|
||||
|
||||
# 处理可能的BOM
|
||||
text = data_response.text.strip()
|
||||
if text.startswith('\ufeff'):
|
||||
text = text[1:]
|
||||
|
||||
data = json.loads(text)
|
||||
else:
|
||||
# 如果没有跳转,尝试直接解析
|
||||
response.raise_for_status()
|
||||
text = response.text.strip()
|
||||
if text.startswith('\ufeff'):
|
||||
text = text[1:]
|
||||
data = json.loads(text)
|
||||
|
||||
# 存入缓存
|
||||
self._set_cached_data(data)
|
||||
|
||||
return data
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"网络请求异常: {str(e)}")
|
||||
return None
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"JSON解析错误: {str(e)}")
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"未知错误: {str(e)}")
|
||||
return None
|
||||
|
||||
def _sort_channels(self, channels):
|
||||
"""对频道进行排序:央视按顺序,卫视按顺序,其他放最后"""
|
||||
cctv_channels = []
|
||||
weishi_channels = []
|
||||
other_channels = []
|
||||
|
||||
for channel in channels:
|
||||
channel_name = channel.get("play_source_name", "")
|
||||
channel_code = channel.get("play_source_code", "")
|
||||
|
||||
if self._is_cctv_channel(channel_name, channel_code):
|
||||
# 计算央视频道排序值
|
||||
order = self._get_cctv_order(channel_name, channel_code)
|
||||
cctv_channels.append((order, channel))
|
||||
elif '卫视' in channel_name or 'TV' in channel_name:
|
||||
# 计算卫视频道排序值
|
||||
order = self._get_weishi_order(channel_name)
|
||||
weishi_channels.append((order, channel))
|
||||
else:
|
||||
# 其他频道
|
||||
other_channels.append((999, channel))
|
||||
|
||||
# 按排序值排序
|
||||
cctv_channels.sort(key=lambda x: x[0])
|
||||
weishi_channels.sort(key=lambda x: x[0])
|
||||
other_channels.sort(key=lambda x: x[0])
|
||||
|
||||
# 合并结果
|
||||
result = []
|
||||
result.extend([ch for _, ch in cctv_channels])
|
||||
result.extend([ch for _, ch in weishi_channels])
|
||||
result.extend([ch for _, ch in other_channels])
|
||||
|
||||
return result
|
||||
|
||||
def _parse_iptv_data(self, data):
|
||||
"""解析IPTV数据为M3U格式"""
|
||||
m3u_content = ['#EXTM3U']
|
||||
|
||||
if not data:
|
||||
m3u_content.append('# 错误:无法获取直播数据')
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
try:
|
||||
# 检查响应状态
|
||||
if data.get("code") != "0":
|
||||
m3u_content.append(f'# 错误:{data.get("msg", "未知错误")}')
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
# 获取频道列表
|
||||
channel_list = data.get("list", [])
|
||||
|
||||
if not channel_list:
|
||||
m3u_content.append('# 错误:没有获取到频道数据')
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
# 对频道进行排序
|
||||
sorted_channels = self._sort_channels(channel_list)
|
||||
|
||||
# 添加分组注释
|
||||
m3u_content.append('# 央视频道')
|
||||
|
||||
cctv_count = 0
|
||||
weishi_count = 0
|
||||
|
||||
# 遍历排序后的频道列表
|
||||
for channel in sorted_channels:
|
||||
channel_name = channel.get("play_source_name", "未知频道")
|
||||
channel_url = channel.get("play_source_url", "")
|
||||
channel_code = channel.get("play_source_code", "")
|
||||
|
||||
if channel_url:
|
||||
# 检测分组变化
|
||||
if self._is_cctv_channel(channel_name, channel_code):
|
||||
if weishi_count == 0 and cctv_count > 0:
|
||||
# 已经在央视分组中,不需要添加注释
|
||||
pass
|
||||
cctv_count += 1
|
||||
elif '卫视' in channel_name or 'TV' in channel_name:
|
||||
if cctv_count > 0 and weishi_count == 0:
|
||||
# 从央视切换到卫视,添加分组注释
|
||||
m3u_content.append('\n# 卫视频道')
|
||||
weishi_count += 1
|
||||
else:
|
||||
if (cctv_count > 0 or weishi_count > 0) and (cctv_count + weishi_count) == len([ch for ch in sorted_channels if self._is_cctv_channel(ch.get("play_source_name", ""), ch.get("play_source_code", "")) or ('卫视' in ch.get("play_source_name", "") or 'TV' in ch.get("play_source_name", ""))]):
|
||||
# 从央视/卫视切换到其他频道
|
||||
m3u_content.append('\n# 其他频道')
|
||||
|
||||
# 构建EXTINF行
|
||||
tvg_name = channel_code if channel_code else channel_name
|
||||
extinf = f'#EXTINF:-1 tvg-id="{channel_code}" tvg-name="{tvg_name}" group-title="直播频道",{channel_name}'
|
||||
m3u_content.extend([extinf, channel_url])
|
||||
|
||||
print(f"成功解析 {len(channel_list)} 个频道(央视: {cctv_count},卫视: {weishi_count},其他: {len(channel_list) - cctv_count - weishi_count})")
|
||||
|
||||
except Exception as e:
|
||||
print(f"解析数据失败: {str(e)}")
|
||||
m3u_content.append('# 错误:数据处理异常')
|
||||
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
def liveContent(self, url):
|
||||
"""主入口方法,返回M3U内容"""
|
||||
# 获取IPTV数据(带内存缓存)
|
||||
iptv_data = self._fetch_iptv_data()
|
||||
|
||||
# 解析数据为M3U格式
|
||||
m3u_content = self._parse_iptv_data(iptv_data)
|
||||
|
||||
return m3u_content
|
||||
|
||||
def homeContent(self, filter):
|
||||
return {}
|
||||
|
||||
def homeVideoContent(self):
|
||||
return {}
|
||||
|
||||
def categoryContent(self, cid, page, filter, ext):
|
||||
return {}
|
||||
|
||||
def detailContent(self, did):
|
||||
return {}
|
||||
|
||||
def searchContent(self, key, quick, page='1'):
|
||||
return {}
|
||||
|
||||
def searchContentPage(self, keywords, quick, page):
|
||||
return {}
|
||||
|
||||
def playerContent(self, flag, pid, vipFlags):
|
||||
return {}
|
||||
|
||||
def localProxy(self, params):
|
||||
if params['type'] == "m3u8":
|
||||
return self.proxyM3u8(params)
|
||||
if params['type'] == "ts":
|
||||
return self.get_ts(params)
|
||||
return [302, "text/plain", None, {'Location': 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'}]
|
||||
|
||||
def proxyM3u8(self, params):
|
||||
# 这个方法保留但可能不会被使用,因为IPTV的URL直接是m3u8地址
|
||||
pid = params['pid']
|
||||
info = pid.split(',')
|
||||
if len(info) >= 3:
|
||||
a = info[0]
|
||||
b = info[1]
|
||||
c = info[2]
|
||||
timestamp = int(time.time() / 4 - 355017625)
|
||||
t = timestamp * 4
|
||||
m3u8_text = f'#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:4\n#EXT-X-MEDIA-SEQUENCE:{timestamp}\n'
|
||||
for i in range(10):
|
||||
url = f'https://ntd-tgc.cdn.hinet.net/live/pool/{a}/litv-pc/{a}-avc1_6000000={b}-mp4a_134000_zho={c}-begin={t}0000000-dur=40000000-seq={timestamp}.ts'
|
||||
if self.is_proxy:
|
||||
url = f'http://127.0.0.1:9978/proxy?do=py&type=ts&url={self.b64encode(url)}'
|
||||
|
||||
m3u8_text += f'#EXTINF:4,\n{url}\n'
|
||||
timestamp += 1
|
||||
t += 4
|
||||
return [200, "application/vnd.apple.mpegurl", m3u8_text]
|
||||
return [200, "application/vnd.apple.mpegurl", "#EXTM3U\n# 错误:无效的代理参数"]
|
||||
|
||||
def get_ts(self, params):
|
||||
url = self.b64decode(params['url'])
|
||||
headers = {'User-Agent': 'Mozilla/5.0'}
|
||||
if self.is_proxy:
|
||||
response = requests.get(url, headers=headers, stream=True, proxies=self.proxy)
|
||||
else:
|
||||
response = requests.get(url, headers=headers, stream=True)
|
||||
return [206, "application/octet-stream", response.content]
|
||||
|
||||
def destroy(self):
|
||||
return '正在Destroy'
|
||||
|
||||
def b64encode(self, data):
|
||||
return base64.b64encode(data.encode('utf-8')).decode('utf-8')
|
||||
|
||||
def b64decode(self, data):
|
||||
return base64.b64decode(data.encode('utf-8')).decode('utf-8')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
=== 南京地区频道 ===
|
||||
南京新闻综合,https://nklive.nbs.cn/hls/d511bc9d-a694-4453-b3a2-4fc842cc97a1/index.m3u8
|
||||
南京教科,https://nklive.nbs.cn/hls/75b3c462-b831-4de7-a34b-5d3221db2069/index.m3u8
|
||||
南京文旅,https://nklive.nbs.cn/hls/9b2005c4-046c-422f-ba45-e6adc4f4de07/index.m3u8
|
||||
南京少儿,https://nklive.nbs.cn/hls/e0981f3f-1a20-4a59-b8d1-17feb83a4610/index.m3u8
|
||||
南京十八,https://nklive.nbs.cn/hls/1173a815-bfdb-4c3c-9f73-89ec37ae7716/index.m3u8
|
||||
江宁综合,https://jiangning-tv-hls.cm.jstv.com/jiangning-tv/jnxwzh.m3u8
|
||||
|
||||
=== 无锡地区频道 ===
|
||||
无锡宜兴,http://yixing-tv-ori-hls.jstv.com/yixing-tv-ori/yixing_xw.m3u8
|
||||
|
||||
=== 徐州地区频道 ===
|
||||
徐州1,https://pull.nicewifi.cn/live/xztv01.m3u8
|
||||
徐州2,https://pull.nicewifi.cn/live/xztv02.m3u8
|
||||
徐州3,https://pull.nicewifi.cn/live/xztv03.m3u8
|
||||
徐州贾汪新闻,https://jiawang-tv-replay.cm.jstv.com/jiawang-tv/jwxw.m3u8
|
||||
徐州贾汪旅游,https://jiawang-tv-replay.cm.jstv.com/jiawang-tv/jwly.m3u8
|
||||
徐州睢宁综合,https://suining-tv-hls.cm.jstv.com/suining-tv/suiningzh.m3u8
|
||||
徐州睢宁综合,http://3739115311.cloudvdn.com/a.m3u8?domain=suining-tv-hls.cm.jstv.com&player=TwMAAPjPskOkJ6kX&secondToken=secondToken%3AjegfwzYXwUE9HzG7kRfhCd81WMU&streamid=suining-tv%3Asuining-tv%2Fsuiningzh&v3=1&zjiangsd=
|
||||
徐州睢宁三农,https://suining-tv-hls.cm.jstv.com/suining-tv/suiningsn.m3u8
|
||||
徐州铜山1,http://192.168.0.4/铜山.php?id=10
|
||||
徐州铜山2,http://192.168.0.4/铜山.php?id=9
|
||||
|
||||
=== 常州地区频道 ===
|
||||
常州新闻综合,https://livekcz.cztv.tv/kcz/cztv1.m3u8?auth_key=1763273772-0-0-ce375d795ff6fb58e095e033ac55b17f
|
||||
常州武进新闻综合,https://live.wjyanghu.com/live/CH1.m3u8
|
||||
常州武进生活频道,https://live.wjyanghu.com/live/CH2.m3u8
|
||||
|
||||
=== 苏州地区频道 ===
|
||||
苏州新闻综合,https://live-auth.51kandianshi.com/szgd/csztv1.m3u8
|
||||
苏州社会经济,https://live-auth.51kandianshi.com/szgd/csztv2.m3u8
|
||||
苏州文化生活,https://live-auth.51kandianshi.com/szgd/csztv3.m3u8
|
||||
苏州电影娱乐信息,https://live-auth.51kandianshi.com/szgd/csztv4.m3u8
|
||||
苏州生活资讯,https://live-auth.51kandianshi.com/szgd/csztv5.m3u8
|
||||
苏州张家港新闻综合,http://3gvod.zjgonline.com.cn:1935/live/_definst_/xinwenzonghe_app/chunklist.m3u8
|
||||
苏州张家港民生,http://3gvod.zjgonline.com.cn:1935/live/_definst_/shehuishenghuo_app/chunklist.m3u8
|
||||
苏州吴江新闻综合,https://ctlive2.wjdaily.com/wjtv/ch1.m3u8
|
||||
|
||||
=== 南通地区频道 ===
|
||||
南通新闻综合,http://tv.sohu.blog/d/jsnt.php?id=1
|
||||
南通2套社教频道,http://tv.sohu.blog/d/jsnt.php?id=2
|
||||
南通3套公共频道,http://tv.sohu.blog/d/jsnt.php?id=3
|
||||
海门新闻综合,http://haimen-tv-hls.cm.jstv.com/haimen-tv/haimenxwzh.m3u8
|
||||
海门经济生活,http://haimen-tv-hls.cm.jstv.com/haimen-tv/haimenjjzh.m3u8
|
||||
海门教育人文,http://haimen-tv-hls.cm.jstv.com/haimen-tv/haimenjyrw.m3u8
|
||||
如东新闻综合,https://rudong-tv-hls.cm.jstv.com/rudong-tv/rdxwzh.m3u8
|
||||
如东2,https://rudong-tv-replay.cm.jstv.com/rudong-tv/rdxwzh.m3u8
|
||||
|
||||
=== 连云港地区频道 ===
|
||||
赣榆电视台,https://ganyu-tv-hls.cm.jstv.com/ganyu-tv/ganyutv.m3u8
|
||||
|
||||
=== 淮安地区频道 ===
|
||||
淮阴新闻综合,https://huaiyin-tv-replay.cm.jstv.com/huaiyin-tv/huaiyinf.m3u8
|
||||
淮安涟水,https://lianshui-tv-hls.cm.jstv.com/lianshui-tv/lsxw.m3u8
|
||||
淮安金湖,https://jinhu-tv-hls.cm.jstv.com/jinhu-tv/jinhuzh.m3u8
|
||||
|
||||
=== 盐城地区频道 ===
|
||||
盐城1,http://192.168.0.4/江苏.php?id=yc1
|
||||
响水综合,http://192.168.0.4/江苏.php?id=xszh
|
||||
东台综合,http://192.168.0.4/江苏.php?id=dt1
|
||||
滨海新闻综合,http://192.168.0.4/江苏.php?id=bhxwzh
|
||||
大丰1套,https://dafeng-tv-hls.cm.jstv.com/dafeng-tv/dafengyt.m3u8
|
||||
大丰2套,https://dafeng-tv-hls.cm.jstv.com/dafeng-tv/dafenget.m3u8
|
||||
东台1套,https://dongtai-tv-hls.cm.jstv.com/dongtai-tv/dongtaizonghe.m3u8
|
||||
|
||||
=== 扬州地区频道 ===
|
||||
高邮一台,http://gaoyou-tv-hls.cm.jstv.com/gaoyou-tv/gaoyouxw.m3u8
|
||||
高邮一台,http://192.168.0.4/江苏.php?id=gy1
|
||||
|
||||
=== 镇江地区频道 ===
|
||||
镇江新闻综合,https://zjtv-wshls.homecdn.com/live/2aa50.m3u8
|
||||
镇江民生,http://zjtv-wshls.homecdn.com/live/2aa16.m3u8
|
||||
句容综合,http://jrlive.jrntv.com/live/jrxwzh/playlist.m3u8
|
||||
句容生活,http://jrlive.jrntv.com/live/shenghuo/playlist.m3u8
|
||||
句容影视,http://jrlive.jrntv.com/live/yingshi/playlist.m3u8
|
||||
句容党建,http://jrlive.jrntv.com/live/dangjian/playlist.m3u8
|
||||
|
||||
=== 泰州地区频道 ===
|
||||
靖江新闻频道,http://visit.jjbctv.com:1935/live/xwzhmb/playlist.m3u8
|
||||
|
||||
=== 宿迁地区频道 ===
|
||||
泗阳综合,https://siyang-tv-hls.cm.jstv.com/siyang-tv/siyangzh.m3u8
|
||||
泗阳资讯,https://siyang-tv-hls.cm.jstv.com/siyang-tv/siyangzx.m3u8
|
||||
沭阳综合,https://shuyang-tv-hls.cm.jstv.com/shuyang-tv/shuyangzh.m3u8
|
||||
宿豫综合,https://suyu-tv-hls.cm.jstv.com/suyu-tv/syzhpd.m3u8
|
||||
南京新闻综合,http://192.168.0.4/江苏.php?id=njxwzh
|
||||
溧水新闻综合,http://192.168.0.4/江苏.php?id=lsxwzh
|
||||
江宁综合,http://192.168.0.4/江苏.php?id=jlzh
|
||||
江阴新闻综合,http://192.168.0.4/江苏.php?id=jyxwzh
|
||||
睢宁综合,http://192.168.0.4/江苏.php?id=snzh
|
||||
邳州综合,http://192.168.0.4/江苏.php?id=pzzh
|
||||
新沂新闻综合,http://192.168.0.4/江苏.php?id=xyxwzh
|
||||
贾汪新闻,http://192.168.0.4/江苏.php?id=jwxw
|
||||
铜山,http://192.168.0.4/江苏.php?id=ts1
|
||||
常州新闻综合,http://192.168.0.4/江苏.php?id=czxwzh
|
||||
沛县新闻综合,http://192.168.0.4/江苏.php?id=pxxwzh
|
||||
连云港新闻,http://192.168.0.4/江苏.php?id=lygxw
|
||||
赣榆综合,http://192.168.0.4/江苏.php?id=gyzh
|
||||
淮安新闻,http://192.168.0.4/江苏.php?id=haxw
|
||||
盱眙综合,http://192.168.0.4/江苏.php?id=xyzh
|
||||
洪泽综合,http://192.168.0.4/江苏.php?id=hz1
|
||||
金湖新闻综合,http://192.168.0.4/江苏.php?id=jhxwzh
|
||||
|
||||
镇江新闻综合,http://192.168.0.4/江苏.php?id=zjxwzh
|
||||
泰州1,http://192.168.0.4/江苏.php?id=tz1
|
||||
兴化新闻综合,http://192.168.0.4/江苏.php?id=xhxwzh
|
||||
泰兴综合,http://192.168.0.4/江苏.php?id=txzh
|
||||
宿迁综合,http://192.168.0.4/江苏.php?id=sqzh
|
||||
靖江新闻,http://192.168.0.4/江苏.php?id=jjxw
|
||||
泗阳新闻,http://192.168.0.4/江苏.php?id=syxw
|
||||
沭阳综合,http://192.168.0.4/江苏.php?id=syzh
|
||||
徐州1,http://192.168.0.4/江苏.php?id=xz1
|
||||
泗洪新闻综合,http://192.168.0.4/江苏.php?id=shzh
|
||||
泗阳新闻综合,http://192.168.0.4/江苏.php?id=syxwzh
|
||||
淮阴综合,http://192.168.0.4/江苏.php?id=hyzh
|
||||
金坛综合,http://192.168.0.4/江苏.php?id=jtzh
|
||||
宜兴新闻综合,http://192.168.0.4/江苏.php?id=yxxwzh
|
||||
+444
@@ -0,0 +1,444 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# 咪咕直播 - OK影视插件(完整频道版)
|
||||
import base64
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import requests
|
||||
import hashlib
|
||||
import random
|
||||
import os
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
|
||||
def getName(self):
|
||||
return "咪咕直播"
|
||||
|
||||
def init(self, extend):
|
||||
self.extend = extend
|
||||
try:
|
||||
self.extendDict = json.loads(extend)
|
||||
except:
|
||||
self.extendDict = {}
|
||||
|
||||
proxy = self.extendDict.get('proxy', None)
|
||||
if proxy is None:
|
||||
self.is_proxy = False
|
||||
else:
|
||||
self.proxy = proxy
|
||||
self.is_proxy = True
|
||||
|
||||
# 缓存目录
|
||||
self.cache_dir = os.path.join(os.path.dirname(__file__), 'migucache')
|
||||
if not os.path.exists(self.cache_dir):
|
||||
try:
|
||||
os.makedirs(self.cache_dir, 0o775, True)
|
||||
except:
|
||||
pass
|
||||
|
||||
def getDependence(self):
|
||||
return []
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
# ==================== 咪咕核心函数 ====================
|
||||
|
||||
def _cache_path(self, key):
|
||||
return os.path.join(self.cache_dir, f"migu_cache_{hashlib.md5(key.encode()).hexdigest()}.json")
|
||||
|
||||
def _get_cache(self, key):
|
||||
path = self._cache_path(key)
|
||||
if not os.path.exists(path):
|
||||
return None
|
||||
try:
|
||||
with open(path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
if time.time() - data.get('time', 0) > data.get('ttl', 0):
|
||||
os.unlink(path)
|
||||
return None
|
||||
return data.get('url')
|
||||
except:
|
||||
return None
|
||||
|
||||
def _set_cache(self, key, url, ttl_seconds):
|
||||
path = self._cache_path(key)
|
||||
try:
|
||||
with open(path, 'w', encoding='utf-8') as f:
|
||||
json.dump({'url': url, 'time': time.time(), 'ttl': ttl_seconds}, f)
|
||||
except:
|
||||
pass
|
||||
|
||||
def _get_sign_config(self, contId):
|
||||
appVersion = '2600033500'
|
||||
saltValue = '16d4328df21a4138859388418bd252c2'
|
||||
timestampMs = str(int(round(time.time() * 1000)))
|
||||
ver8 = appVersion[:8]
|
||||
md5string = hashlib.md5(f"{timestampMs}{contId}{ver8}".encode()).hexdigest()
|
||||
prefix = random.randint(0, 999999)
|
||||
salt = f"{prefix:06d}80"
|
||||
text = md5string + saltValue + 'migu' + salt[:4]
|
||||
sign = hashlib.md5(text.encode()).hexdigest()
|
||||
return timestampMs, [salt, sign]
|
||||
|
||||
def _send_get_request(self, url, headers):
|
||||
try:
|
||||
if self.is_proxy:
|
||||
response = requests.get(url, headers=headers, timeout=10, proxies=self.proxy)
|
||||
else:
|
||||
response = requests.get(url, headers=headers, timeout=10)
|
||||
if response.status_code != 200:
|
||||
return None
|
||||
return response.text
|
||||
except:
|
||||
return None
|
||||
|
||||
def _migu_encrypted_url(self, rawUrl):
|
||||
factorOfEncryption = [8, 3, 7, 6, 6]
|
||||
|
||||
parsed = urlparse(rawUrl)
|
||||
if parsed is None:
|
||||
return rawUrl
|
||||
|
||||
queryParams = parse_qs(parsed.query)
|
||||
for k, v in queryParams.items():
|
||||
if v and isinstance(v, list):
|
||||
queryParams[k] = v[0]
|
||||
|
||||
puData = queryParams.get('puData', '')
|
||||
if puData == '':
|
||||
return rawUrl
|
||||
|
||||
paramsToAppend = []
|
||||
|
||||
ddCalcuExists = queryParams.get('ddCalcu', '') != ''
|
||||
if not ddCalcuExists:
|
||||
userid = queryParams.get('userid', '')
|
||||
if userid == '':
|
||||
userid = 'eeeeeeeee'
|
||||
|
||||
timestamp = queryParams.get('timestamp', '')
|
||||
if timestamp == '':
|
||||
timestamp = 'tttttttttttttt'
|
||||
|
||||
programId = queryParams.get('ProgramID', '')
|
||||
if programId == '':
|
||||
programId = 'ccccccccc'
|
||||
|
||||
channelId = queryParams.get('Channel_ID', '')
|
||||
if channelId == '':
|
||||
channelId = 'nnnnnnnnnnnnnnnn'
|
||||
|
||||
useridChars = list(userid)
|
||||
timestampChars = list(timestamp)
|
||||
programIdChars = list(programId)
|
||||
channelIdChars = list(channelId)
|
||||
|
||||
ddCalcu = ''
|
||||
|
||||
puLen = len(puData)
|
||||
halfLen = puLen // 2
|
||||
|
||||
for i in range(halfLen):
|
||||
ddCalcu += puData[puLen - 1 - i]
|
||||
ddCalcu += puData[i]
|
||||
|
||||
if i == 1:
|
||||
idx = factorOfEncryption[0] - 1
|
||||
charToEncrypt = 'e'
|
||||
if idx < len(useridChars):
|
||||
charToEncrypt = useridChars[idx]
|
||||
codePoint = ord(charToEncrypt) if charToEncrypt else 0
|
||||
encryptedVal = (codePoint ^ factorOfEncryption[4]) % 26 + 97
|
||||
ddCalcu += chr(encryptedVal)
|
||||
elif i == 2:
|
||||
idx = factorOfEncryption[1] - 1
|
||||
charToEncrypt = 't'
|
||||
if idx < len(timestampChars):
|
||||
charToEncrypt = timestampChars[idx]
|
||||
codePoint = ord(charToEncrypt) if charToEncrypt else 0
|
||||
encryptedVal = (codePoint ^ factorOfEncryption[4]) % 26 + 97
|
||||
ddCalcu += chr(encryptedVal)
|
||||
elif i == 3:
|
||||
idx = factorOfEncryption[2] - 1
|
||||
charToEncrypt = 'c'
|
||||
if idx < len(programIdChars):
|
||||
charToEncrypt = programIdChars[idx]
|
||||
codePoint = ord(charToEncrypt) if charToEncrypt else 0
|
||||
encryptedVal = (codePoint ^ factorOfEncryption[4]) % 26 + 97
|
||||
ddCalcu += chr(encryptedVal)
|
||||
elif i == 4:
|
||||
idx = factorOfEncryption[3] - 1
|
||||
charToEncrypt = 'n'
|
||||
if idx < len(channelIdChars):
|
||||
charToEncrypt = channelIdChars[idx]
|
||||
codePoint = ord(charToEncrypt) if charToEncrypt else 0
|
||||
encryptedVal = (codePoint ^ factorOfEncryption[4]) % 26 + 97
|
||||
ddCalcu += chr(encryptedVal)
|
||||
|
||||
if puLen % 2 == 1:
|
||||
ddCalcu += puData[halfLen]
|
||||
|
||||
paramsToAppend.append(f'ddCalcu={ddCalcu}')
|
||||
|
||||
sv = queryParams.get('sv', '')
|
||||
if sv == '':
|
||||
paramsToAppend.append('sv=10004')
|
||||
|
||||
ct = queryParams.get('ct', '')
|
||||
if ct == '':
|
||||
paramsToAppend.append('ct=android')
|
||||
|
||||
if paramsToAppend:
|
||||
if '?' in rawUrl:
|
||||
if rawUrl[-1] not in ['?', '&']:
|
||||
rawUrl += '&'
|
||||
else:
|
||||
rawUrl += '?'
|
||||
rawUrl += '&'.join(paramsToAppend)
|
||||
|
||||
return rawUrl
|
||||
|
||||
def _get_channel_stream(self, channel_id):
|
||||
"""获取单个频道的直播流地址"""
|
||||
cached = self._get_cache(channel_id)
|
||||
if cached:
|
||||
return cached
|
||||
|
||||
try:
|
||||
tm, saltSign = self._get_sign_config(channel_id)
|
||||
salt = saltSign[0]
|
||||
sign = saltSign[1]
|
||||
|
||||
url = f"https://play.miguvideo.com/playurl/v1/play/playurl?contId={channel_id}&dolby=true&isMultiView=true&xh265=true&os=13&ott=false&rateType=3&salt={salt}&sign={sign}×tamp={tm}&ua=oneplus-12&vr=true"
|
||||
|
||||
headers = {
|
||||
"Host": "play.miguvideo.com",
|
||||
"appId": "miguvideo",
|
||||
"terminalId": "android",
|
||||
"User-Agent": "Dalvik/2.1.0+(Linux;+U;+Android+13;+oneplus-13+Build/TP1A.220624.014)",
|
||||
"MG-BH": "true",
|
||||
"appVersionName": "6.3.35",
|
||||
"appVersion": "2600033500",
|
||||
"Phone-Info": "oneplus-13|13",
|
||||
"X-UP-CLIENT-CHANNEL-ID": "2600033500-99000-201600010010028",
|
||||
"APP-VERSION-CODE": "260335005",
|
||||
"Accept": "*/*",
|
||||
"Connection": "keep-alive",
|
||||
}
|
||||
|
||||
body = self._send_get_request(url, headers)
|
||||
if body is None:
|
||||
return None
|
||||
|
||||
data = json.loads(body)
|
||||
rawUrl = data.get("body", {}).get("urlInfo", {}).get("url", "")
|
||||
if not rawUrl:
|
||||
return None
|
||||
|
||||
ottUrl = self._migu_encrypted_url(rawUrl)
|
||||
if ottUrl:
|
||||
self._set_cache(channel_id, ottUrl, 1800)
|
||||
return ottUrl
|
||||
except:
|
||||
pass
|
||||
return None
|
||||
|
||||
# ==================== 完整频道列表(从咪咕直播.txt提取)====================
|
||||
|
||||
def _get_channel_list(self):
|
||||
"""返回所有频道列表"""
|
||||
channels = [
|
||||
# ========== 央视频道 ==========
|
||||
("CCTV1综合", "608807420", "央视频道"),
|
||||
("CCTV2财经", "631780532", "央视频道"),
|
||||
("CCTV3综艺", "624878271", "央视频道"),
|
||||
("CCTV4中文国际", "631780421", "央视频道"),
|
||||
("CCTV5体育", "641886683", "央视频道"),
|
||||
("CCTV5+体育赛事", "641886773", "央视频道"),
|
||||
("CCTV6电影", "624878396", "央视频道"),
|
||||
("CCTV7国防军事", "673168121", "央视频道"),
|
||||
("CCTV8电视剧", "624878356", "央视频道"),
|
||||
("CCTV9纪录", "673168140", "央视频道"),
|
||||
("CCTV10科教", "624878405", "央视频道"),
|
||||
("CCTV11戏曲", "667987558", "央视频道"),
|
||||
("CCTV12社会与法", "673168185", "央视频道"),
|
||||
("CCTV13新闻", "608807423", "央视频道"),
|
||||
("CCTV14少儿", "624878440", "央视频道"),
|
||||
("CCTV15音乐", "673168223", "央视频道"),
|
||||
("CCTV17农业农村", "673168256", "央视频道"),
|
||||
("CCTV4欧洲", "608807419", "央视频道"),
|
||||
("CCTV4美洲", "608807416", "央视频道"),
|
||||
("CGTN", "609017205", "央视频道"),
|
||||
("CGTN外语纪录", "609006487", "央视频道"),
|
||||
("CGTN阿拉伯语", "609154345", "央视频道"),
|
||||
("CGTN西班牙语", "609006450", "央视频道"),
|
||||
("CGTN法语", "609006476", "央视频道"),
|
||||
("CGTN俄语", "609006446", "央视频道"),
|
||||
("老故事", "884121956", "央视频道"),
|
||||
("中学生", "708869532", "央视频道"),
|
||||
|
||||
# ========== 卫视频道 ==========
|
||||
("东方卫视", "651632648", "卫视频道"),
|
||||
("江苏卫视", "623899368", "卫视频道"),
|
||||
("广东卫视", "608831231", "卫视频道"),
|
||||
("江西卫视", "783847495", "卫视频道"),
|
||||
("河南卫视", "790187291", "卫视频道"),
|
||||
("陕西卫视", "738910838", "卫视频道"),
|
||||
("大湾区卫视", "608917627", "卫视频道"),
|
||||
("湖北卫视", "947472496", "卫视频道"),
|
||||
("吉林卫视", "947472500", "卫视频道"),
|
||||
("青海卫视", "947472506", "卫视频道"),
|
||||
("东南卫视", "849116810", "卫视频道"),
|
||||
("海南卫视", "947472502", "卫视频道"),
|
||||
("海峡卫视", "849119120", "卫视频道"),
|
||||
("中国农林卫视", "956904896", "卫视频道"),
|
||||
("兵团卫视", "956923145", "卫视频道"),
|
||||
("辽宁卫视", "630291707", "卫视频道"),
|
||||
("湖南卫视", "608799681", "卫视频道"),
|
||||
("北京卫视", "608799545", "卫视频道"),
|
||||
("浙江卫视", "608858086", "卫视频道"),
|
||||
("深圳卫视", "608858094", "卫视频道"),
|
||||
|
||||
# ========== 地方频道 ==========
|
||||
("上海新闻综合", "651632657", "地方频道"),
|
||||
("上视东方影视", "617290047", "地方频道"),
|
||||
("南京新闻综合", "838109047", "地方频道"),
|
||||
("南京教科频道", "838153729", "地方频道"),
|
||||
("南京十八频道", "838151753", "地方频道"),
|
||||
("江苏城市频道", "626064714", "地方频道"),
|
||||
("江苏国际", "626064674", "地方频道"),
|
||||
("江苏教育", "628008321", "地方频道"),
|
||||
("江苏影视", "626064697", "地方频道"),
|
||||
("江苏综艺", "626065193", "地方频道"),
|
||||
("公共新闻频道", "626064693", "地方频道"),
|
||||
("盐城新闻综合", "639731825", "地方频道"),
|
||||
("淮安新闻综合", "639731826", "地方频道"),
|
||||
("泰州新闻综合", "639731818", "地方频道"),
|
||||
("连云港新闻综合", "639731715", "地方频道"),
|
||||
("宿迁新闻综合", "639731832", "地方频道"),
|
||||
("徐州新闻综合", "639731747", "地方频道"),
|
||||
("优漫卡通", "626064703", "地方频道"),
|
||||
("江阴新闻综合", "955227979", "地方频道"),
|
||||
("南通新闻综合", "955227985", "地方频道"),
|
||||
("宜兴新闻综合", "955227996", "地方频道"),
|
||||
("溧水新闻综合", "639737327", "地方频道"),
|
||||
("陕西银龄频道", "956909362", "地方频道"),
|
||||
("陕西都市青春", "956909358", "地方频道"),
|
||||
("陕西体育休闲", "956909356", "地方频道"),
|
||||
("陕西秦腔频道", "956909303", "地方频道"),
|
||||
("陕西新闻资讯", "956909289", "地方频道"),
|
||||
("财富天下", "956923159", "地方频道"),
|
||||
|
||||
# ========== 影视频道 ==========
|
||||
("经典香港电影", "625703337", "影视频道"),
|
||||
("抗战经典影片", "617432318", "影视频道"),
|
||||
("新片放映厅", "619495952", "影视频道"),
|
||||
("CHC影迷电影", "952383261", "影视频道"),
|
||||
("和美乡途轮播台", "713591450", "影视频道"),
|
||||
("高清大片", "629943678", "影视频道"),
|
||||
("南方影视", "614961829", "影视频道"),
|
||||
("血色山河·抗日战争影像志", "713600957", "影视频道"),
|
||||
|
||||
# ========== 熊猫频道 ==========
|
||||
("熊猫频道01高清", "609158151", "熊猫频道"),
|
||||
("熊猫频道1", "608933610", "熊猫频道"),
|
||||
("熊猫频道2", "608933640", "熊猫频道"),
|
||||
("熊猫频道3", "608934619", "熊猫频道"),
|
||||
("熊猫频道4", "608934721", "熊猫频道"),
|
||||
("熊猫频道5", "608935104", "熊猫频道"),
|
||||
("熊猫频道6", "608935797", "熊猫频道"),
|
||||
("熊猫频道7", "609169286", "熊猫频道"),
|
||||
("熊猫频道8", "609169287", "熊猫频道"),
|
||||
("熊猫频道9", "609169226", "熊猫频道"),
|
||||
("熊猫频道10", "609169285", "熊猫频道"),
|
||||
|
||||
# ========== 其他频道 ==========
|
||||
("最强综艺趴", "629942228", "其他频道"),
|
||||
("嘉佳卡通", "614952364", "其他频道"),
|
||||
("经典动画大集合", "629942219", "其他频道"),
|
||||
("新动力量创一流", "713589837", "其他频道"),
|
||||
("环球旅游", "958475356", "其他频道"),
|
||||
("钱塘江", "647370520", "其他频道"),
|
||||
("五环传奇", "707671890", "其他频道"),
|
||||
("赛事最经典", "646596895", "其他频道"),
|
||||
("掼蛋精英赛", "631354620", "其他频道"),
|
||||
("体坛名栏汇", "629943305", "其他频道"),
|
||||
("四海钓鱼", "637444975", "其他频道"),
|
||||
("咪咕24小时体育台", "654102378", "其他频道"),
|
||||
("24小时城市联赛轮播台", "915512915", "其他频道"),
|
||||
("武术世界", "958475359", "其他频道"),
|
||||
("CETV1", "923287154", "其他频道"),
|
||||
("CETV2", "923287211", "其他频道"),
|
||||
("CETV4", "923287339", "其他频道"),
|
||||
("山东教育", "609154353", "其他频道"),
|
||||
]
|
||||
return channels
|
||||
|
||||
# ==================== OK影视入口函数 ====================
|
||||
|
||||
def liveContent(self, url):
|
||||
"""返回M3U频道列表"""
|
||||
channels = self._get_channel_list()
|
||||
|
||||
m3u_lines = ['#EXTM3U']
|
||||
|
||||
for name, cid, group in channels:
|
||||
stream_url = self._get_channel_stream(cid)
|
||||
if stream_url:
|
||||
extinf = f'#EXTINF:-1 tvg-name="{name}" group-title="{group}",{name}'
|
||||
m3u_lines.append(extinf)
|
||||
m3u_lines.append(stream_url)
|
||||
|
||||
result = '\n'.join(m3u_lines)
|
||||
|
||||
# 如果全部失败,返回测试频道
|
||||
if len(m3u_lines) <= 1:
|
||||
return '''#EXTM3U
|
||||
#EXTINF:-1 tvg-name="CCTV1综合" group-title="央视频道",CCTV1综合
|
||||
http://gslbmgsplive.miguvideo.com/wd_r2/cctv/cctv1hd/600/index.m3u8?msisdn=2026042617575278c8eadc36de41339f0cd48295893350&mdspid=&spid=699004&netType=0&sid=2201057821&pid=2028597139×tamp=20260426175752&Channel_ID=0116_2600033500-99000-201600010010028&ProgramID=608807420&ParentNodeID=-99&assertID=2201057821&client_ip=112.3.44.29&SecurityKey=20260426175752&promotionId=&mvid=2201057821&mcid=500020&playurlVersion=ZQ-A1-9.3.2-RELEASE&userid=&jmhm=&videocodec=h264&appCode=miguvideo_android&bean=mgspad&tid=android&conFee=0&puData=1cc31b33cb71e961afdb65232c779f86&ddCalcu=618cvfca93y71a7bc3233c2b5761bed9f6a1&sv=10004&ct=android'''
|
||||
|
||||
return result
|
||||
|
||||
def getLives(self):
|
||||
return self.liveContent("")
|
||||
|
||||
# ==================== 空方法 ====================
|
||||
|
||||
def homeContent(self, filter):
|
||||
return {}
|
||||
|
||||
def homeVideoContent(self):
|
||||
return {}
|
||||
|
||||
def categoryContent(self, cid, page, filter, ext):
|
||||
return {}
|
||||
|
||||
def detailContent(self, did):
|
||||
return {}
|
||||
|
||||
def searchContent(self, key, quick, page='1'):
|
||||
return {}
|
||||
|
||||
def searchContentPage(self, keywords, quick, page):
|
||||
return {}
|
||||
|
||||
def playerContent(self, flag, pid, vipFlags):
|
||||
return {}
|
||||
|
||||
def localProxy(self, params):
|
||||
return [302, "text/plain", None, {'Location': 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'}]
|
||||
|
||||
def destroy(self):
|
||||
return 'Destroy'
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
|
||||
|
||||
"线路数组":"module-tab-item tab-item&&</div>",
|
||||
"线路标题":"<span>&&</small>[替换:</span><small>>>共]+集",
|
||||
|
||||
"分类url":"https://www.nkdvd.me/vodshow/area/{area}/by/{by}/class/{class}/id/{cateId}/page/{catePg}/year/{year}.html",
|
||||
|
||||
"分类":"电影$20#剧集$21#动漫$22#综艺$23#纪录片$24#爽剧$25"
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
|
||||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).pako={})}(this,(function(t){"use strict";function e(t){let e=t.length;for(;--e>=0;)t[e]=0}const a=256,i=286,n=30,s=15,r=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),o=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),l=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),h=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),d=new Array(576);e(d);const _=new Array(60);e(_);const f=new Array(512);e(f);const c=new Array(256);e(c);const u=new Array(29);e(u);const w=new Array(n);function m(t,e,a,i,n){this.static_tree=t,this.extra_bits=e,this.extra_base=a,this.elems=i,this.max_length=n,this.has_stree=t&&t.length}let b,g,p;function k(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}e(w);const v=t=>t<256?f[t]:f[256+(t>>>7)],y=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},x=(t,e,a)=>{t.bi_valid>16-a?(t.bi_buf|=e<<t.bi_valid&65535,y(t,t.bi_buf),t.bi_buf=e>>16-t.bi_valid,t.bi_valid+=a-16):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=a)},z=(t,e,a)=>{x(t,a[2*e],a[2*e+1])},A=(t,e)=>{let a=0;do{a|=1&t,t>>>=1,a<<=1}while(--e>0);return a>>>1},E=(t,e,a)=>{const i=new Array(16);let n,r,o=0;for(n=1;n<=s;n++)o=o+a[n-1]<<1,i[n]=o;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=A(i[e]++,e))}},R=t=>{let e;for(e=0;e<i;e++)t.dyn_ltree[2*e]=0;for(e=0;e<n;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},Z=t=>{t.bi_valid>8?y(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},U=(t,e,a,i)=>{const n=2*e,s=2*a;return t[n]<t[s]||t[n]===t[s]&&i[e]<=i[a]},S=(t,e,a)=>{const i=t.heap[a];let n=a<<1;for(;n<=t.heap_len&&(n<t.heap_len&&U(e,t.heap[n+1],t.heap[n],t.depth)&&n++,!U(e,i,t.heap[n],t.depth));)t.heap[a]=t.heap[n],a=n,n<<=1;t.heap[a]=i},D=(t,e,i)=>{let n,s,l,h,d=0;if(0!==t.sym_next)do{n=255&t.pending_buf[t.sym_buf+d++],n+=(255&t.pending_buf[t.sym_buf+d++])<<8,s=t.pending_buf[t.sym_buf+d++],0===n?z(t,s,e):(l=c[s],z(t,l+a+1,e),h=r[l],0!==h&&(s-=u[l],x(t,s,h)),n--,l=v(n),z(t,l,i),h=o[l],0!==h&&(n-=w[l],x(t,n,h)))}while(d<t.sym_next);z(t,256,e)},T=(t,e)=>{const a=e.dyn_tree,i=e.stat_desc.static_tree,n=e.stat_desc.has_stree,r=e.stat_desc.elems;let o,l,h,d=-1;for(t.heap_len=0,t.heap_max=573,o=0;o<r;o++)0!==a[2*o]?(t.heap[++t.heap_len]=d=o,t.depth[o]=0):a[2*o+1]=0;for(;t.heap_len<2;)h=t.heap[++t.heap_len]=d<2?++d:0,a[2*h]=1,t.depth[h]=0,t.opt_len--,n&&(t.static_len-=i[2*h+1]);for(e.max_code=d,o=t.heap_len>>1;o>=1;o--)S(t,a,o);h=r;do{o=t.heap[1],t.heap[1]=t.heap[t.heap_len--],S(t,a,1),l=t.heap[1],t.heap[--t.heap_max]=o,t.heap[--t.heap_max]=l,a[2*h]=a[2*o]+a[2*l],t.depth[h]=(t.depth[o]>=t.depth[l]?t.depth[o]:t.depth[l])+1,a[2*o+1]=a[2*l+1]=h,t.heap[1]=h++,S(t,a,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const a=e.dyn_tree,i=e.max_code,n=e.stat_desc.static_tree,r=e.stat_desc.has_stree,o=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,h=e.stat_desc.max_length;let d,_,f,c,u,w,m=0;for(c=0;c<=s;c++)t.bl_count[c]=0;for(a[2*t.heap[t.heap_max]+1]=0,d=t.heap_max+1;d<573;d++)_=t.heap[d],c=a[2*a[2*_+1]+1]+1,c>h&&(c=h,m++),a[2*_+1]=c,_>i||(t.bl_count[c]++,u=0,_>=l&&(u=o[_-l]),w=a[2*_],t.opt_len+=w*(c+u),r&&(t.static_len+=w*(n[2*_+1]+u)));if(0!==m){do{for(c=h-1;0===t.bl_count[c];)c--;t.bl_count[c]--,t.bl_count[c+1]+=2,t.bl_count[h]--,m-=2}while(m>0);for(c=h;0!==c;c--)for(_=t.bl_count[c];0!==_;)f=t.heap[--d],f>i||(a[2*f+1]!==c&&(t.opt_len+=(c-a[2*f+1])*a[2*f],a[2*f+1]=c),_--)}})(t,e),E(a,d,t.bl_count)},O=(t,e,a)=>{let i,n,s=-1,r=e[1],o=0,l=7,h=4;for(0===r&&(l=138,h=3),e[2*(a+1)+1]=65535,i=0;i<=a;i++)n=r,r=e[2*(i+1)+1],++o<l&&n===r||(o<h?t.bl_tree[2*n]+=o:0!==n?(n!==s&&t.bl_tree[2*n]++,t.bl_tree[32]++):o<=10?t.bl_tree[34]++:t.bl_tree[36]++,o=0,s=n,0===r?(l=138,h=3):n===r?(l=6,h=3):(l=7,h=4))},I=(t,e,a)=>{let i,n,s=-1,r=e[1],o=0,l=7,h=4;for(0===r&&(l=138,h=3),i=0;i<=a;i++)if(n=r,r=e[2*(i+1)+1],!(++o<l&&n===r)){if(o<h)do{z(t,n,t.bl_tree)}while(0!=--o);else 0!==n?(n!==s&&(z(t,n,t.bl_tree),o--),z(t,16,t.bl_tree),x(t,o-3,2)):o<=10?(z(t,17,t.bl_tree),x(t,o-3,3)):(z(t,18,t.bl_tree),x(t,o-11,7));o=0,s=n,0===r?(l=138,h=3):n===r?(l=6,h=3):(l=7,h=4)}};let F=!1;const L=(t,e,a,i)=>{x(t,0+(i?1:0),3),Z(t),y(t,a),y(t,~a),a&&t.pending_buf.set(t.window.subarray(e,e+a),t.pending),t.pending+=a};var N=(t,e,i,n)=>{let s,r,o=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<a;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0})(t)),T(t,t.l_desc),T(t,t.d_desc),o=(t=>{let e;for(O(t,t.dyn_ltree,t.l_desc.max_code),O(t,t.dyn_dtree,t.d_desc.max_code),T(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*h[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),s=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=s&&(s=r)):s=r=i+5,i+4<=s&&-1!==e?L(t,e,i,n):4===t.strategy||r===s?(x(t,2+(n?1:0),3),D(t,d,_)):(x(t,4+(n?1:0),3),((t,e,a,i)=>{let n;for(x(t,e-257,5),x(t,a-1,5),x(t,i-4,4),n=0;n<i;n++)x(t,t.bl_tree[2*h[n]+1],3);I(t,t.dyn_ltree,e-1),I(t,t.dyn_dtree,a-1)})(t,t.l_desc.max_code+1,t.d_desc.max_code+1,o+1),D(t,t.dyn_ltree,t.dyn_dtree)),R(t),n&&Z(t)},B={_tr_init:t=>{F||((()=>{let t,e,a,h,k;const v=new Array(16);for(a=0,h=0;h<28;h++)for(u[h]=a,t=0;t<1<<r[h];t++)c[a++]=h;for(c[a-1]=h,k=0,h=0;h<16;h++)for(w[h]=k,t=0;t<1<<o[h];t++)f[k++]=h;for(k>>=7;h<n;h++)for(w[h]=k<<7,t=0;t<1<<o[h]-7;t++)f[256+k++]=h;for(e=0;e<=s;e++)v[e]=0;for(t=0;t<=143;)d[2*t+1]=8,t++,v[8]++;for(;t<=255;)d[2*t+1]=9,t++,v[9]++;for(;t<=279;)d[2*t+1]=7,t++,v[7]++;for(;t<=287;)d[2*t+1]=8,t++,v[8]++;for(E(d,287,v),t=0;t<n;t++)_[2*t+1]=5,_[2*t]=A(t,5);b=new m(d,r,257,i,s),g=new m(_,o,0,n,s),p=new m(new Array(0),l,0,19,7)})(),F=!0),t.l_desc=new k(t.dyn_ltree,b),t.d_desc=new k(t.dyn_dtree,g),t.bl_desc=new k(t.bl_tree,p),t.bi_buf=0,t.bi_valid=0,R(t)},_tr_stored_block:L,_tr_flush_block:N,_tr_tally:(t,e,i)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(c[i]+a+1)]++,t.dyn_dtree[2*v(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{x(t,2,3),z(t,256,d),(t=>{16===t.bi_valid?(y(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var C=(t,e,a,i)=>{let n=65535&t|0,s=t>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{n=n+e[i++]|0,s=s+n|0}while(--r);n%=65521,s%=65521}return n|s<<16|0};const M=new Uint32Array((()=>{let t,e=[];for(var a=0;a<256;a++){t=a;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[a]=t}return e})());var H=(t,e,a,i)=>{const n=M,s=i+a;t^=-1;for(let a=i;a<s;a++)t=t>>>8^n[255&(t^e[a])];return-1^t},j={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},K={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:P,_tr_stored_block:Y,_tr_flush_block:G,_tr_tally:X,_tr_align:W}=B,{Z_NO_FLUSH:q,Z_PARTIAL_FLUSH:J,Z_FULL_FLUSH:Q,Z_FINISH:V,Z_BLOCK:$,Z_OK:tt,Z_STREAM_END:et,Z_STREAM_ERROR:at,Z_DATA_ERROR:it,Z_BUF_ERROR:nt,Z_DEFAULT_COMPRESSION:st,Z_FILTERED:rt,Z_HUFFMAN_ONLY:ot,Z_RLE:lt,Z_FIXED:ht,Z_DEFAULT_STRATEGY:dt,Z_UNKNOWN:_t,Z_DEFLATED:ft}=K,ct=258,ut=262,wt=42,mt=113,bt=666,gt=(t,e)=>(t.msg=j[e],e),pt=t=>2*t-(t>4?9:0),kt=t=>{let e=t.length;for(;--e>=0;)t[e]=0},vt=t=>{let e,a,i,n=t.w_size;e=t.hash_size,i=e;do{a=t.head[--i],t.head[i]=a>=n?a-n:0}while(--e);e=n,i=e;do{a=t.prev[--i],t.prev[i]=a>=n?a-n:0}while(--e)};let yt=(t,e,a)=>(e<<t.hash_shift^a)&t.hash_mask;const xt=t=>{const e=t.state;let a=e.pending;a>t.avail_out&&(a=t.avail_out),0!==a&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+a),t.next_out),t.next_out+=a,e.pending_out+=a,t.total_out+=a,t.avail_out-=a,e.pending-=a,0===e.pending&&(e.pending_out=0))},zt=(t,e)=>{G(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,xt(t.strm)},At=(t,e)=>{t.pending_buf[t.pending++]=e},Et=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Rt=(t,e,a,i)=>{let n=t.avail_in;return n>i&&(n=i),0===n?0:(t.avail_in-=n,e.set(t.input.subarray(t.next_in,t.next_in+n),a),1===t.state.wrap?t.adler=C(t.adler,e,n,a):2===t.state.wrap&&(t.adler=H(t.adler,e,n,a)),t.next_in+=n,t.total_in+=n,n)},Zt=(t,e)=>{let a,i,n=t.max_chain_length,s=t.strstart,r=t.prev_length,o=t.nice_match;const l=t.strstart>t.w_size-ut?t.strstart-(t.w_size-ut):0,h=t.window,d=t.w_mask,_=t.prev,f=t.strstart+ct;let c=h[s+r-1],u=h[s+r];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(a=e,h[a+r]===u&&h[a+r-1]===c&&h[a]===h[s]&&h[++a]===h[s+1]){s+=2,a++;do{}while(h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&h[++s]===h[++a]&&s<f);if(i=ct-(f-s),s=f-ct,i>r){if(t.match_start=e,r=i,i>=o)break;c=h[s+r-1],u=h[s+r]}}}while((e=_[e&d])>l&&0!=--n);return r<=t.lookahead?r:t.lookahead},Ut=t=>{const e=t.w_size;let a,i,n;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-ut)&&(t.window.set(t.window.subarray(e,e+e-i),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),vt(t),i+=e),0===t.strm.avail_in)break;if(a=Rt(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=a,t.lookahead+t.insert>=3)for(n=t.strstart-t.insert,t.ins_h=t.window[n],t.ins_h=yt(t,t.ins_h,t.window[n+1]);t.insert&&(t.ins_h=yt(t,t.ins_h,t.window[n+3-1]),t.prev[n&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=n,n++,t.insert--,!(t.lookahead+t.insert<3)););}while(t.lookahead<ut&&0!==t.strm.avail_in)},St=(t,e)=>{let a,i,n,s=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,r=0,o=t.strm.avail_in;do{if(a=65535,n=t.bi_valid+42>>3,t.strm.avail_out<n)break;if(n=t.strm.avail_out-n,i=t.strstart-t.block_start,a>i+t.strm.avail_in&&(a=i+t.strm.avail_in),a>n&&(a=n),a<s&&(0===a&&e!==V||e===q||a!==i+t.strm.avail_in))break;r=e===V&&a===i+t.strm.avail_in?1:0,Y(t,0,0,r),t.pending_buf[t.pending-4]=a,t.pending_buf[t.pending-3]=a>>8,t.pending_buf[t.pending-2]=~a,t.pending_buf[t.pending-1]=~a>>8,xt(t.strm),i&&(i>a&&(i=a),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+i),t.strm.next_out),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i,t.block_start+=i,a-=i),a&&(Rt(t.strm,t.strm.output,t.strm.next_out,a),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a)}while(0===r);return o-=t.strm.avail_in,o&&(o>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=o&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-o,t.strm.next_in),t.strstart),t.strstart+=o,t.insert+=o>t.w_size-t.insert?t.w_size-t.insert:o),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),r?4:e!==q&&e!==V&&0===t.strm.avail_in&&t.strstart===t.block_start?2:(n=t.window_size-t.strstart,t.strm.avail_in>n&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,n+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),n>t.strm.avail_in&&(n=t.strm.avail_in),n&&(Rt(t.strm,t.window,t.strstart,n),t.strstart+=n,t.insert+=n>t.w_size-t.insert?t.w_size-t.insert:n),t.high_water<t.strstart&&(t.high_water=t.strstart),n=t.bi_valid+42>>3,n=t.pending_buf_size-n>65535?65535:t.pending_buf_size-n,s=n>t.w_size?t.w_size:n,i=t.strstart-t.block_start,(i>=s||(i||e===V)&&e!==q&&0===t.strm.avail_in&&i<=n)&&(a=i>n?n:i,r=e===V&&0===t.strm.avail_in&&a===i?1:0,Y(t,t.block_start,a,r),t.block_start+=a,xt(t.strm)),r?3:1)},Dt=(t,e)=>{let a,i;for(;;){if(t.lookahead<ut){if(Ut(t),t.lookahead<ut&&e===q)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==a&&t.strstart-a<=t.w_size-ut&&(t.match_length=Zt(t,a)),t.match_length>=3)if(i=X(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart}while(0!=--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=yt(t,t.ins_h,t.window[t.strstart+1]);else i=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2},Tt=(t,e)=>{let a,i,n;for(;;){if(t.lookahead<ut){if(Ut(t),t.lookahead<ut&&e===q)return 1;if(0===t.lookahead)break}if(a=0,t.lookahead>=3&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==a&&t.prev_length<t.max_lazy_match&&t.strstart-a<=t.w_size-ut&&(t.match_length=Zt(t,a),t.match_length<=5&&(t.strategy===rt||3===t.match_length&&t.strstart-t.match_start>4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){n=t.strstart+t.lookahead-3,i=X(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=n&&(t.ins_h=yt(t,t.ins_h,t.window[t.strstart+3-1]),a=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart)}while(0!=--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,i&&(zt(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(i=X(t,0,t.window[t.strstart-1]),i&&zt(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=X(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2};function Ot(t,e,a,i,n){this.good_length=t,this.max_lazy=e,this.nice_length=a,this.max_chain=i,this.func=n}const It=[new Ot(0,0,0,0,St),new Ot(4,4,8,4,Dt),new Ot(4,5,16,8,Dt),new Ot(4,6,32,32,Dt),new Ot(4,4,16,16,Tt),new Ot(8,16,32,32,Tt),new Ot(8,16,128,128,Tt),new Ot(8,32,128,256,Tt),new Ot(32,128,258,1024,Tt),new Ot(32,258,258,4096,Tt)];function Ft(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=ft,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),kt(this.dyn_ltree),kt(this.dyn_dtree),kt(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),kt(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),kt(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Lt=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==wt&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==mt&&e.status!==bt?1:0},Nt=t=>{if(Lt(t))return gt(t,at);t.total_in=t.total_out=0,t.data_type=_t;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?wt:mt,t.adler=2===e.wrap?0:1,e.last_flush=-2,P(e),tt},Bt=t=>{const e=Nt(t);var a;return e===tt&&((a=t.state).window_size=2*a.w_size,kt(a.head),a.max_lazy_match=It[a.level].max_lazy,a.good_match=It[a.level].good_length,a.nice_match=It[a.level].nice_length,a.max_chain_length=It[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=2,a.match_available=0,a.ins_h=0),e},Ct=(t,e,a,i,n,s)=>{if(!t)return at;let r=1;if(e===st&&(e=6),i<0?(r=0,i=-i):i>15&&(r=2,i-=16),n<1||n>9||a!==ft||i<8||i>15||e<0||e>9||s<0||s>ht||8===i&&1!==r)return gt(t,at);8===i&&(i=9);const o=new Ft;return t.state=o,o.strm=t,o.status=wt,o.wrap=r,o.gzhead=null,o.w_bits=i,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=n+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+3-1)/3),o.window=new Uint8Array(2*o.w_size),o.head=new Uint16Array(o.hash_size),o.prev=new Uint16Array(o.w_size),o.lit_bufsize=1<<n+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new Uint8Array(o.pending_buf_size),o.sym_buf=o.lit_bufsize,o.sym_end=3*(o.lit_bufsize-1),o.level=e,o.strategy=s,o.method=a,Bt(t)};var Mt={deflateInit:(t,e)=>Ct(t,e,ft,15,8,dt),deflateInit2:Ct,deflateReset:Bt,deflateResetKeep:Nt,deflateSetHeader:(t,e)=>Lt(t)||2!==t.state.wrap?at:(t.state.gzhead=e,tt),deflate:(t,e)=>{if(Lt(t)||e>$||e<0)return t?gt(t,at):at;const a=t.state;if(!t.output||0!==t.avail_in&&!t.input||a.status===bt&&e!==V)return gt(t,0===t.avail_out?nt:at);const i=a.last_flush;if(a.last_flush=e,0!==a.pending){if(xt(t),0===t.avail_out)return a.last_flush=-1,tt}else if(0===t.avail_in&&pt(e)<=pt(i)&&e!==V)return gt(t,nt);if(a.status===bt&&0!==t.avail_in)return gt(t,nt);if(a.status===wt&&0===a.wrap&&(a.status=mt),a.status===wt){let e=ft+(a.w_bits-8<<4)<<8,i=-1;if(i=a.strategy>=ot||a.level<2?0:a.level<6?1:6===a.level?2:3,e|=i<<6,0!==a.strstart&&(e|=32),e+=31-e%31,Et(a,e),0!==a.strstart&&(Et(a,t.adler>>>16),Et(a,65535&t.adler)),t.adler=1,a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(57===a.status)if(t.adler=0,At(a,31),At(a,139),At(a,8),a.gzhead)At(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),At(a,255&a.gzhead.time),At(a,a.gzhead.time>>8&255),At(a,a.gzhead.time>>16&255),At(a,a.gzhead.time>>24&255),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(At(a,255&a.gzhead.extra.length),At(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(t.adler=H(t.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(At(a,0),At(a,0),At(a,0),At(a,0),At(a,0),At(a,9===a.level?2:a.strategy>=ot||a.level<2?4:0),At(a,3),a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt;if(69===a.status){if(a.gzhead.extra){let e=a.pending,i=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+i>a.pending_buf_size;){let n=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+n),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>e&&(t.adler=H(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex+=n,xt(t),0!==a.pending)return a.last_flush=-1,tt;e=0,i-=n}let n=new Uint8Array(a.gzhead.extra);a.pending_buf.set(n.subarray(a.gzindex,a.gzindex+i),a.pending),a.pending+=i,a.gzhead.hcrc&&a.pending>e&&(t.adler=H(t.adler,a.pending_buf,a.pending-e,e)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let e,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),xt(t),0!==a.pending)return a.last_flush=-1,tt;i=0}e=a.gzindex<a.gzhead.name.length?255&a.gzhead.name.charCodeAt(a.gzindex++):0,At(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let e,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i)),xt(t),0!==a.pending)return a.last_flush=-1,tt;i=0}e=a.gzindex<a.gzhead.comment.length?255&a.gzhead.comment.charCodeAt(a.gzindex++):0,At(a,e)}while(0!==e);a.gzhead.hcrc&&a.pending>i&&(t.adler=H(t.adler,a.pending_buf,a.pending-i,i))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(xt(t),0!==a.pending))return a.last_flush=-1,tt;At(a,255&t.adler),At(a,t.adler>>8&255),t.adler=0}if(a.status=mt,xt(t),0!==a.pending)return a.last_flush=-1,tt}if(0!==t.avail_in||0!==a.lookahead||e!==q&&a.status!==bt){let i=0===a.level?St(a,e):a.strategy===ot?((t,e)=>{let a;for(;;){if(0===t.lookahead&&(Ut(t),0===t.lookahead)){if(e===q)return 1;break}if(t.match_length=0,a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2})(a,e):a.strategy===lt?((t,e)=>{let a,i,n,s;const r=t.window;for(;;){if(t.lookahead<=ct){if(Ut(t),t.lookahead<=ct&&e===q)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(n=t.strstart-1,i=r[n],i===r[++n]&&i===r[++n]&&i===r[++n])){s=t.strstart+ct;do{}while(i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&i===r[++n]&&n<s);t.match_length=ct-(s-n),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(a=X(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(a=X(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),a&&(zt(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===V?(zt(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(zt(t,!1),0===t.strm.avail_out)?1:2})(a,e):It[a.level].func(a,e);if(3!==i&&4!==i||(a.status=bt),1===i||3===i)return 0===t.avail_out&&(a.last_flush=-1),tt;if(2===i&&(e===J?W(a):e!==$&&(Y(a,0,0,!1),e===Q&&(kt(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),xt(t),0===t.avail_out))return a.last_flush=-1,tt}return e!==V?tt:a.wrap<=0?et:(2===a.wrap?(At(a,255&t.adler),At(a,t.adler>>8&255),At(a,t.adler>>16&255),At(a,t.adler>>24&255),At(a,255&t.total_in),At(a,t.total_in>>8&255),At(a,t.total_in>>16&255),At(a,t.total_in>>24&255)):(Et(a,t.adler>>>16),Et(a,65535&t.adler)),xt(t),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?tt:et)},deflateEnd:t=>{if(Lt(t))return at;const e=t.state.status;return t.state=null,e===mt?gt(t,it):tt},deflateSetDictionary:(t,e)=>{let a=e.length;if(Lt(t))return at;const i=t.state,n=i.wrap;if(2===n||1===n&&i.status!==wt||i.lookahead)return at;if(1===n&&(t.adler=C(t.adler,e,a,0)),i.wrap=0,a>=i.w_size){0===n&&(kt(i.head),i.strstart=0,i.block_start=0,i.insert=0);let t=new Uint8Array(i.w_size);t.set(e.subarray(a-i.w_size,a),0),e=t,a=i.w_size}const s=t.avail_in,r=t.next_in,o=t.input;for(t.avail_in=a,t.next_in=0,t.input=e,Ut(i);i.lookahead>=3;){let t=i.strstart,e=i.lookahead-2;do{i.ins_h=yt(i,i.ins_h,i.window[t+3-1]),i.prev[t&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=t,t++}while(--e);i.strstart=t,i.lookahead=2,Ut(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=2,i.match_available=0,t.next_in=r,t.input=o,t.avail_in=s,i.wrap=n,tt},deflateInfo:"pako deflate (from Nodeca project)"};const Ht=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var jt=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const a=e.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const e in a)Ht(a,e)&&(t[e]=a[e])}}return t},Kt=t=>{let e=0;for(let a=0,i=t.length;a<i;a++)e+=t[a].length;const a=new Uint8Array(e);for(let e=0,i=0,n=t.length;e<n;e++){let n=t[e];a.set(n,i),i+=n.length}return a};let Pt=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){Pt=!1}const Yt=new Uint8Array(256);for(let t=0;t<256;t++)Yt[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;Yt[254]=Yt[254]=1;var Gt=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,a,i,n,s,r=t.length,o=0;for(n=0;n<r;n++)a=t.charCodeAt(n),55296==(64512&a)&&n+1<r&&(i=t.charCodeAt(n+1),56320==(64512&i)&&(a=65536+(a-55296<<10)+(i-56320),n++)),o+=a<128?1:a<2048?2:a<65536?3:4;for(e=new Uint8Array(o),s=0,n=0;s<o;n++)a=t.charCodeAt(n),55296==(64512&a)&&n+1<r&&(i=t.charCodeAt(n+1),56320==(64512&i)&&(a=65536+(a-55296<<10)+(i-56320),n++)),a<128?e[s++]=a:a<2048?(e[s++]=192|a>>>6,e[s++]=128|63&a):a<65536?(e[s++]=224|a>>>12,e[s++]=128|a>>>6&63,e[s++]=128|63&a):(e[s++]=240|a>>>18,e[s++]=128|a>>>12&63,e[s++]=128|a>>>6&63,e[s++]=128|63&a);return e},Xt=(t,e)=>{const a=e||t.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(t.subarray(0,e));let i,n;const s=new Array(2*a);for(n=0,i=0;i<a;){let e=t[i++];if(e<128){s[n++]=e;continue}let r=Yt[e];if(r>4)s[n++]=65533,i+=r-1;else{for(e&=2===r?31:3===r?15:7;r>1&&i<a;)e=e<<6|63&t[i++],r--;r>1?s[n++]=65533:e<65536?s[n++]=e:(e-=65536,s[n++]=55296|e>>10&1023,s[n++]=56320|1023&e)}}return((t,e)=>{if(e<65534&&t.subarray&&Pt)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let a="";for(let i=0;i<e;i++)a+=String.fromCharCode(t[i]);return a})(s,n)},Wt=(t,e)=>{(e=e||t.length)>t.length&&(e=t.length);let a=e-1;for(;a>=0&&128==(192&t[a]);)a--;return a<0||0===a?e:a+Yt[t[a]]>e?a:e};var qt=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const Jt=Object.prototype.toString,{Z_NO_FLUSH:Qt,Z_SYNC_FLUSH:Vt,Z_FULL_FLUSH:$t,Z_FINISH:te,Z_OK:ee,Z_STREAM_END:ae,Z_DEFAULT_COMPRESSION:ie,Z_DEFAULT_STRATEGY:ne,Z_DEFLATED:se}=K;function re(t){this.options=jt({level:ie,method:se,chunkSize:16384,windowBits:15,memLevel:8,strategy:ne},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new qt,this.strm.avail_out=0;let a=Mt.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(a!==ee)throw new Error(j[a]);if(e.header&&Mt.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?Gt(e.dictionary):"[object ArrayBuffer]"===Jt.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,a=Mt.deflateSetDictionary(this.strm,t),a!==ee)throw new Error(j[a]);this._dict_set=!0}}function oe(t,e){const a=new re(e);if(a.push(t,!0),a.err)throw a.msg||j[a.err];return a.result}re.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize;let n,s;if(this.ended)return!1;for(s=e===~~e?e:!0===e?te:Qt,"string"==typeof t?a.input=Gt(t):"[object ArrayBuffer]"===Jt.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;)if(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),(s===Vt||s===$t)&&a.avail_out<=6)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else{if(n=Mt.deflate(a,s),n===ae)return a.next_out>0&&this.onData(a.output.subarray(0,a.next_out)),n=Mt.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===ee;if(0!==a.avail_out){if(s>0&&a.next_out>0)this.onData(a.output.subarray(0,a.next_out)),a.avail_out=0;else if(0===a.avail_in)break}else this.onData(a.output)}return!0},re.prototype.onData=function(t){this.chunks.push(t)},re.prototype.onEnd=function(t){t===ee&&(this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var le={Deflate:re,deflate:oe,deflateRaw:function(t,e){return(e=e||{}).raw=!0,oe(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,oe(t,e)},constants:K};const he=16209;var de=function(t,e){let a,i,n,s,r,o,l,h,d,_,f,c,u,w,m,b,g,p,k,v,y,x,z,A;const E=t.state;a=t.next_in,z=t.input,i=a+(t.avail_in-5),n=t.next_out,A=t.output,s=n-(e-t.avail_out),r=n+(t.avail_out-257),o=E.dmax,l=E.wsize,h=E.whave,d=E.wnext,_=E.window,f=E.hold,c=E.bits,u=E.lencode,w=E.distcode,m=(1<<E.lenbits)-1,b=(1<<E.distbits)-1;t:do{c<15&&(f+=z[a++]<<c,c+=8,f+=z[a++]<<c,c+=8),g=u[f&m];e:for(;;){if(p=g>>>24,f>>>=p,c-=p,p=g>>>16&255,0===p)A[n++]=65535&g;else{if(!(16&p)){if(0==(64&p)){g=u[(65535&g)+(f&(1<<p)-1)];continue e}if(32&p){E.mode=16191;break t}t.msg="invalid literal/length code",E.mode=he;break t}k=65535&g,p&=15,p&&(c<p&&(f+=z[a++]<<c,c+=8),k+=f&(1<<p)-1,f>>>=p,c-=p),c<15&&(f+=z[a++]<<c,c+=8,f+=z[a++]<<c,c+=8),g=w[f&b];a:for(;;){if(p=g>>>24,f>>>=p,c-=p,p=g>>>16&255,!(16&p)){if(0==(64&p)){g=w[(65535&g)+(f&(1<<p)-1)];continue a}t.msg="invalid distance code",E.mode=he;break t}if(v=65535&g,p&=15,c<p&&(f+=z[a++]<<c,c+=8,c<p&&(f+=z[a++]<<c,c+=8)),v+=f&(1<<p)-1,v>o){t.msg="invalid distance too far back",E.mode=he;break t}if(f>>>=p,c-=p,p=n-s,v>p){if(p=v-p,p>h&&E.sane){t.msg="invalid distance too far back",E.mode=he;break t}if(y=0,x=_,0===d){if(y+=l-p,p<k){k-=p;do{A[n++]=_[y++]}while(--p);y=n-v,x=A}}else if(d<p){if(y+=l+d-p,p-=d,p<k){k-=p;do{A[n++]=_[y++]}while(--p);if(y=0,d<k){p=d,k-=p;do{A[n++]=_[y++]}while(--p);y=n-v,x=A}}}else if(y+=d-p,p<k){k-=p;do{A[n++]=_[y++]}while(--p);y=n-v,x=A}for(;k>2;)A[n++]=x[y++],A[n++]=x[y++],A[n++]=x[y++],k-=3;k&&(A[n++]=x[y++],k>1&&(A[n++]=x[y++]))}else{y=n-v;do{A[n++]=A[y++],A[n++]=A[y++],A[n++]=A[y++],k-=3}while(k>2);k&&(A[n++]=A[y++],k>1&&(A[n++]=A[y++]))}break}}break}}while(a<i&&n<r);k=c>>3,a-=k,c-=k<<3,f&=(1<<c)-1,t.next_in=a,t.next_out=n,t.avail_in=a<i?i-a+5:5-(a-i),t.avail_out=n<r?r-n+257:257-(n-r),E.hold=f,E.bits=c};const _e=15,fe=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),ce=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),ue=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),we=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]);var me=(t,e,a,i,n,s,r,o)=>{const l=o.bits;let h,d,_,f,c,u,w=0,m=0,b=0,g=0,p=0,k=0,v=0,y=0,x=0,z=0,A=null;const E=new Uint16Array(16),R=new Uint16Array(16);let Z,U,S,D=null;for(w=0;w<=_e;w++)E[w]=0;for(m=0;m<i;m++)E[e[a+m]]++;for(p=l,g=_e;g>=1&&0===E[g];g--);if(p>g&&(p=g),0===g)return n[s++]=20971520,n[s++]=20971520,o.bits=1,0;for(b=1;b<g&&0===E[b];b++);for(p<b&&(p=b),y=1,w=1;w<=_e;w++)if(y<<=1,y-=E[w],y<0)return-1;if(y>0&&(0===t||1!==g))return-1;for(R[1]=0,w=1;w<_e;w++)R[w+1]=R[w]+E[w];for(m=0;m<i;m++)0!==e[a+m]&&(r[R[e[a+m]]++]=m);if(0===t?(A=D=r,u=20):1===t?(A=fe,D=ce,u=257):(A=ue,D=we,u=0),z=0,m=0,w=b,c=s,k=p,v=0,_=-1,x=1<<p,f=x-1,1===t&&x>852||2===t&&x>592)return 1;for(;;){Z=w-v,r[m]+1<u?(U=0,S=r[m]):r[m]>=u?(U=D[r[m]-u],S=A[r[m]-u]):(U=96,S=0),h=1<<w-v,d=1<<k,b=d;do{d-=h,n[c+(z>>v)+d]=Z<<24|U<<16|S|0}while(0!==d);for(h=1<<w-1;z&h;)h>>=1;if(0!==h?(z&=h-1,z+=h):z=0,m++,0==--E[w]){if(w===g)break;w=e[a+r[m]]}if(w>p&&(z&f)!==_){for(0===v&&(v=p),c+=b,k=w-v,y=1<<k;k+v<g&&(y-=E[k+v],!(y<=0));)k++,y<<=1;if(x+=1<<k,1===t&&x>852||2===t&&x>592)return 1;_=z&f,n[_]=p<<24|k<<16|c-s|0}}return 0!==z&&(n[c+z]=w-v<<24|64<<16|0),o.bits=p,0};const{Z_FINISH:be,Z_BLOCK:ge,Z_TREES:pe,Z_OK:ke,Z_STREAM_END:ve,Z_NEED_DICT:ye,Z_STREAM_ERROR:xe,Z_DATA_ERROR:ze,Z_MEM_ERROR:Ae,Z_BUF_ERROR:Ee,Z_DEFLATED:Re}=K,Ze=16180,Ue=16190,Se=16191,De=16192,Te=16194,Oe=16199,Ie=16200,Fe=16206,Le=16209,Ne=t=>(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24);function Be(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Ce=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.mode<Ze||e.mode>16211?1:0},Me=t=>{if(Ce(t))return xe;const e=t.state;return t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=Ze,e.last=0,e.havedict=0,e.flags=-1,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(852),e.distcode=e.distdyn=new Int32Array(592),e.sane=1,e.back=-1,ke},He=t=>{if(Ce(t))return xe;const e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,Me(t)},je=(t,e)=>{let a;if(Ce(t))return xe;const i=t.state;return e<0?(a=0,e=-e):(a=5+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?xe:(null!==i.window&&i.wbits!==e&&(i.window=null),i.wrap=a,i.wbits=e,He(t))},Ke=(t,e)=>{if(!t)return xe;const a=new Be;t.state=a,a.strm=t,a.window=null,a.mode=Ze;const i=je(t,e);return i!==ke&&(t.state=null),i};let Pe,Ye,Ge=!0;const Xe=t=>{if(Ge){Pe=new Int32Array(512),Ye=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(me(1,t.lens,0,288,Pe,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;me(2,t.lens,0,32,Ye,0,t.work,{bits:5}),Ge=!1}t.lencode=Pe,t.lenbits=9,t.distcode=Ye,t.distbits=5},We=(t,e,a,i)=>{let n;const s=t.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new Uint8Array(s.wsize)),i>=s.wsize?(s.window.set(e.subarray(a-s.wsize,a),0),s.wnext=0,s.whave=s.wsize):(n=s.wsize-s.wnext,n>i&&(n=i),s.window.set(e.subarray(a-i,a-i+n),s.wnext),(i-=n)?(s.window.set(e.subarray(a-i,a),0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=n))),0};var qe={inflateReset:He,inflateReset2:je,inflateResetKeep:Me,inflateInit:t=>Ke(t,15),inflateInit2:Ke,inflate:(t,e)=>{let a,i,n,s,r,o,l,h,d,_,f,c,u,w,m,b,g,p,k,v,y,x,z=0;const A=new Uint8Array(4);let E,R;const Z=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Ce(t)||!t.output||!t.input&&0!==t.avail_in)return xe;a=t.state,a.mode===Se&&(a.mode=De),r=t.next_out,n=t.output,l=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,_=o,f=l,x=ke;t:for(;;)switch(a.mode){case Ze:if(0===a.wrap){a.mode=De;break}for(;d<16;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(2&a.wrap&&35615===h){0===a.wbits&&(a.wbits=15),a.check=0,A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0),h=0,d=0,a.mode=16181;break}if(a.head&&(a.head.done=!1),!(1&a.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",a.mode=Le;break}if((15&h)!==Re){t.msg="unknown compression method",a.mode=Le;break}if(h>>>=4,d-=4,y=8+(15&h),0===a.wbits&&(a.wbits=y),y>15||y>a.wbits){t.msg="invalid window size",a.mode=Le;break}a.dmax=1<<a.wbits,a.flags=0,t.adler=a.check=1,a.mode=512&h?16189:Se,h=0,d=0;break;case 16181:for(;d<16;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(a.flags=h,(255&a.flags)!==Re){t.msg="unknown compression method",a.mode=Le;break}if(57344&a.flags){t.msg="unknown header flags set",a.mode=Le;break}a.head&&(a.head.text=h>>8&1),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0,a.mode=16182;case 16182:for(;d<32;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}a.head&&(a.head.time=h),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,A[2]=h>>>16&255,A[3]=h>>>24&255,a.check=H(a.check,A,4,0)),h=0,d=0,a.mode=16183;case 16183:for(;d<16;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}a.head&&(a.head.xflags=255&h,a.head.os=h>>8),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0,a.mode=16184;case 16184:if(1024&a.flags){for(;d<16;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}a.length=h,a.head&&(a.head.extra_len=h),512&a.flags&&4&a.wrap&&(A[0]=255&h,A[1]=h>>>8&255,a.check=H(a.check,A,2,0)),h=0,d=0}else a.head&&(a.head.extra=null);a.mode=16185;case 16185:if(1024&a.flags&&(c=a.length,c>o&&(c=o),c&&(a.head&&(y=a.head.extra_len-a.length,a.head.extra||(a.head.extra=new Uint8Array(a.head.extra_len)),a.head.extra.set(i.subarray(s,s+c),y)),512&a.flags&&4&a.wrap&&(a.check=H(a.check,i,c,s)),o-=c,s+=c,a.length-=c),a.length))break t;a.length=0,a.mode=16186;case 16186:if(2048&a.flags){if(0===o)break t;c=0;do{y=i[s+c++],a.head&&y&&a.length<65536&&(a.head.name+=String.fromCharCode(y))}while(y&&c<o);if(512&a.flags&&4&a.wrap&&(a.check=H(a.check,i,c,s)),o-=c,s+=c,y)break t}else a.head&&(a.head.name=null);a.length=0,a.mode=16187;case 16187:if(4096&a.flags){if(0===o)break t;c=0;do{y=i[s+c++],a.head&&y&&a.length<65536&&(a.head.comment+=String.fromCharCode(y))}while(y&&c<o);if(512&a.flags&&4&a.wrap&&(a.check=H(a.check,i,c,s)),o-=c,s+=c,y)break t}else a.head&&(a.head.comment=null);a.mode=16188;case 16188:if(512&a.flags){for(;d<16;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(4&a.wrap&&h!==(65535&a.check)){t.msg="header crc mismatch",a.mode=Le;break}h=0,d=0}a.head&&(a.head.hcrc=a.flags>>9&1,a.head.done=!0),t.adler=a.check=0,a.mode=Se;break;case 16189:for(;d<32;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}t.adler=a.check=Ne(h),h=0,d=0,a.mode=Ue;case Ue:if(0===a.havedict)return t.next_out=r,t.avail_out=l,t.next_in=s,t.avail_in=o,a.hold=h,a.bits=d,ye;t.adler=a.check=1,a.mode=Se;case Se:if(e===ge||e===pe)break t;case De:if(a.last){h>>>=7&d,d-=7&d,a.mode=Fe;break}for(;d<3;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}switch(a.last=1&h,h>>>=1,d-=1,3&h){case 0:a.mode=16193;break;case 1:if(Xe(a),a.mode=Oe,e===pe){h>>>=2,d-=2;break t}break;case 2:a.mode=16196;break;case 3:t.msg="invalid block type",a.mode=Le}h>>>=2,d-=2;break;case 16193:for(h>>>=7&d,d-=7&d;d<32;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if((65535&h)!=(h>>>16^65535)){t.msg="invalid stored block lengths",a.mode=Le;break}if(a.length=65535&h,h=0,d=0,a.mode=Te,e===pe)break t;case Te:a.mode=16195;case 16195:if(c=a.length,c){if(c>o&&(c=o),c>l&&(c=l),0===c)break t;n.set(i.subarray(s,s+c),r),o-=c,s+=c,l-=c,r+=c,a.length-=c;break}a.mode=Se;break;case 16196:for(;d<14;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(a.nlen=257+(31&h),h>>>=5,d-=5,a.ndist=1+(31&h),h>>>=5,d-=5,a.ncode=4+(15&h),h>>>=4,d-=4,a.nlen>286||a.ndist>30){t.msg="too many length or distance symbols",a.mode=Le;break}a.have=0,a.mode=16197;case 16197:for(;a.have<a.ncode;){for(;d<3;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}a.lens[Z[a.have++]]=7&h,h>>>=3,d-=3}for(;a.have<19;)a.lens[Z[a.have++]]=0;if(a.lencode=a.lendyn,a.lenbits=7,E={bits:a.lenbits},x=me(0,a.lens,0,19,a.lencode,0,a.work,E),a.lenbits=E.bits,x){t.msg="invalid code lengths set",a.mode=Le;break}a.have=0,a.mode=16198;case 16198:for(;a.have<a.nlen+a.ndist;){for(;z=a.lencode[h&(1<<a.lenbits)-1],m=z>>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(g<16)h>>>=m,d-=m,a.lens[a.have++]=g;else{if(16===g){for(R=m+2;d<R;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(h>>>=m,d-=m,0===a.have){t.msg="invalid bit length repeat",a.mode=Le;break}y=a.lens[a.have-1],c=3+(3&h),h>>>=2,d-=2}else if(17===g){for(R=m+3;d<R;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}h>>>=m,d-=m,y=0,c=3+(7&h),h>>>=3,d-=3}else{for(R=m+7;d<R;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}h>>>=m,d-=m,y=0,c=11+(127&h),h>>>=7,d-=7}if(a.have+c>a.nlen+a.ndist){t.msg="invalid bit length repeat",a.mode=Le;break}for(;c--;)a.lens[a.have++]=y}}if(a.mode===Le)break;if(0===a.lens[256]){t.msg="invalid code -- missing end-of-block",a.mode=Le;break}if(a.lenbits=9,E={bits:a.lenbits},x=me(1,a.lens,0,a.nlen,a.lencode,0,a.work,E),a.lenbits=E.bits,x){t.msg="invalid literal/lengths set",a.mode=Le;break}if(a.distbits=6,a.distcode=a.distdyn,E={bits:a.distbits},x=me(2,a.lens,a.nlen,a.ndist,a.distcode,0,a.work,E),a.distbits=E.bits,x){t.msg="invalid distances set",a.mode=Le;break}if(a.mode=Oe,e===pe)break t;case Oe:a.mode=Ie;case Ie:if(o>=6&&l>=258){t.next_out=r,t.avail_out=l,t.next_in=s,t.avail_in=o,a.hold=h,a.bits=d,de(t,f),r=t.next_out,n=t.output,l=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,h=a.hold,d=a.bits,a.mode===Se&&(a.back=-1);break}for(a.back=0;z=a.lencode[h&(1<<a.lenbits)-1],m=z>>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(b&&0==(240&b)){for(p=m,k=b,v=g;z=a.lencode[v+((h&(1<<p+k)-1)>>p)],m=z>>>24,b=z>>>16&255,g=65535&z,!(p+m<=d);){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}h>>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,a.length=g,0===b){a.mode=16205;break}if(32&b){a.back=-1,a.mode=Se;break}if(64&b){t.msg="invalid literal/length code",a.mode=Le;break}a.extra=15&b,a.mode=16201;case 16201:if(a.extra){for(R=a.extra;d<R;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}a.length+=h&(1<<a.extra)-1,h>>>=a.extra,d-=a.extra,a.back+=a.extra}a.was=a.length,a.mode=16202;case 16202:for(;z=a.distcode[h&(1<<a.distbits)-1],m=z>>>24,b=z>>>16&255,g=65535&z,!(m<=d);){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(0==(240&b)){for(p=m,k=b,v=g;z=a.distcode[v+((h&(1<<p+k)-1)>>p)],m=z>>>24,b=z>>>16&255,g=65535&z,!(p+m<=d);){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}h>>>=p,d-=p,a.back+=p}if(h>>>=m,d-=m,a.back+=m,64&b){t.msg="invalid distance code",a.mode=Le;break}a.offset=g,a.extra=15&b,a.mode=16203;case 16203:if(a.extra){for(R=a.extra;d<R;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}a.offset+=h&(1<<a.extra)-1,h>>>=a.extra,d-=a.extra,a.back+=a.extra}if(a.offset>a.dmax){t.msg="invalid distance too far back",a.mode=Le;break}a.mode=16204;case 16204:if(0===l)break t;if(c=f-l,a.offset>c){if(c=a.offset-c,c>a.whave&&a.sane){t.msg="invalid distance too far back",a.mode=Le;break}c>a.wnext?(c-=a.wnext,u=a.wsize-c):u=a.wnext-c,c>a.length&&(c=a.length),w=a.window}else w=n,u=r-a.offset,c=a.length;c>l&&(c=l),l-=c,a.length-=c;do{n[r++]=w[u++]}while(--c);0===a.length&&(a.mode=Ie);break;case 16205:if(0===l)break t;n[r++]=a.length,l--,a.mode=Ie;break;case Fe:if(a.wrap){for(;d<32;){if(0===o)break t;o--,h|=i[s++]<<d,d+=8}if(f-=l,t.total_out+=f,a.total+=f,4&a.wrap&&f&&(t.adler=a.check=a.flags?H(a.check,n,f,r-f):C(a.check,n,f,r-f)),f=l,4&a.wrap&&(a.flags?h:Ne(h))!==a.check){t.msg="incorrect data check",a.mode=Le;break}h=0,d=0}a.mode=16207;case 16207:if(a.wrap&&a.flags){for(;d<32;){if(0===o)break t;o--,h+=i[s++]<<d,d+=8}if(4&a.wrap&&h!==(4294967295&a.total)){t.msg="incorrect length check",a.mode=Le;break}h=0,d=0}a.mode=16208;case 16208:x=ve;break t;case Le:x=ze;break t;case 16210:return Ae;default:return xe}return t.next_out=r,t.avail_out=l,t.next_in=s,t.avail_in=o,a.hold=h,a.bits=d,(a.wsize||f!==t.avail_out&&a.mode<Le&&(a.mode<Fe||e!==be))&&We(t,t.output,t.next_out,f-t.avail_out),_-=t.avail_in,f-=t.avail_out,t.total_in+=_,t.total_out+=f,a.total+=f,4&a.wrap&&f&&(t.adler=a.check=a.flags?H(a.check,n,f,t.next_out-f):C(a.check,n,f,t.next_out-f)),t.data_type=a.bits+(a.last?64:0)+(a.mode===Se?128:0)+(a.mode===Oe||a.mode===Te?256:0),(0===_&&0===f||e===be)&&x===ke&&(x=Ee),x},inflateEnd:t=>{if(Ce(t))return xe;let e=t.state;return e.window&&(e.window=null),t.state=null,ke},inflateGetHeader:(t,e)=>{if(Ce(t))return xe;const a=t.state;return 0==(2&a.wrap)?xe:(a.head=e,e.done=!1,ke)},inflateSetDictionary:(t,e)=>{const a=e.length;let i,n,s;return Ce(t)?xe:(i=t.state,0!==i.wrap&&i.mode!==Ue?xe:i.mode===Ue&&(n=1,n=C(n,e,a,0),n!==i.check)?ze:(s=We(t,e,a,a),s?(i.mode=16210,Ae):(i.havedict=1,ke)))},inflateInfo:"pako inflate (from Nodeca project)"};var Je=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Qe=Object.prototype.toString,{Z_NO_FLUSH:Ve,Z_FINISH:$e,Z_OK:ta,Z_STREAM_END:ea,Z_NEED_DICT:aa,Z_STREAM_ERROR:ia,Z_DATA_ERROR:na,Z_MEM_ERROR:sa}=K;function ra(t){this.options=jt({chunkSize:65536,windowBits:15,to:""},t||{});const e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new qt,this.strm.avail_out=0;let a=qe.inflateInit2(this.strm,e.windowBits);if(a!==ta)throw new Error(j[a]);if(this.header=new Je,qe.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Gt(e.dictionary):"[object ArrayBuffer]"===Qe.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(a=qe.inflateSetDictionary(this.strm,e.dictionary),a!==ta)))throw new Error(j[a])}function oa(t,e){const a=new ra(e);if(a.push(t),a.err)throw a.msg||j[a.err];return a.result}ra.prototype.push=function(t,e){const a=this.strm,i=this.options.chunkSize,n=this.options.dictionary;let s,r,o;if(this.ended)return!1;for(r=e===~~e?e:!0===e?$e:Ve,"[object ArrayBuffer]"===Qe.call(t)?a.input=new Uint8Array(t):a.input=t,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(i),a.next_out=0,a.avail_out=i),s=qe.inflate(a,r),s===aa&&n&&(s=qe.inflateSetDictionary(a,n),s===ta?s=qe.inflate(a,r):s===na&&(s=aa));a.avail_in>0&&s===ea&&a.state.wrap>0&&0!==t[a.next_in];)qe.inflateReset(a),s=qe.inflate(a,r);switch(s){case ia:case na:case aa:case sa:return this.onEnd(s),this.ended=!0,!1}if(o=a.avail_out,a.next_out&&(0===a.avail_out||s===ea))if("string"===this.options.to){let t=Wt(a.output,a.next_out),e=a.next_out-t,n=Xt(a.output,t);a.next_out=e,a.avail_out=i-e,e&&a.output.set(a.output.subarray(t,t+e),0),this.onData(n)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(s!==ta||0!==o){if(s===ea)return s=qe.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},ra.prototype.onData=function(t){this.chunks.push(t)},ra.prototype.onEnd=function(t){t===ta&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Kt(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var la={Inflate:ra,inflate:oa,inflateRaw:function(t,e){return(e=e||{}).raw=!0,oa(t,e)},ungzip:oa,constants:K};const{Deflate:ha,deflate:da,deflateRaw:_a,gzip:fa}=le,{Inflate:ca,inflate:ua,inflateRaw:wa,ungzip:ma}=la;var ba=ha,ga=da,pa=_a,ka=fa,va=ca,ya=ua,xa=wa,za=ma,Aa=K,Ea={Deflate:ba,deflate:ga,deflateRaw:pa,gzip:ka,Inflate:va,inflate:ya,inflateRaw:xa,ungzip:za,constants:Aa};t.Deflate=ba,t.Inflate=va,t.constants=Aa,t.default=Ea,t.deflate=ga,t.deflateRaw=pa,t.gzip=ka,t.inflate=ya,t.inflateRaw=xa,t.ungzip=za,Object.defineProperty(t,"__esModule",{value:!0})}));
|
||||
+304
@@ -0,0 +1,304 @@
|
||||
if (typeof Object.assign != 'function') {
|
||||
Object.assign = function () {
|
||||
var target = arguments[0];
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var source = arguments[i];
|
||||
for (var key in source) {
|
||||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
}
|
||||
function getMubans() {
|
||||
var mubanDict = { // 模板字典
|
||||
mxpro: {
|
||||
title: '',
|
||||
host: '',
|
||||
// homeUrl:'/',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.navbar-items li:gt(2):lt(8);a&&Text;a&&href;/(\\d+).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: 'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.module-info-tag&&Text",
|
||||
"img": ".lazyload&&data-original",
|
||||
"desc": ".module-info-item:eq(1)&&Text;.module-info-item:eq(2)&&Text;.module-info-item:eq(3)&&Text",
|
||||
"content": ".module-info-introduction&&Text",
|
||||
"tabs": ".module-tab-item",
|
||||
"lists": ".module-play-list:eq(#id) a"
|
||||
},
|
||||
搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',
|
||||
},
|
||||
mxone5: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/show/fyclass--------fypage---.html',
|
||||
searchUrl: '/search/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.tag-link&&Text",
|
||||
"img": ".module-item-pic&&img&&data-src",
|
||||
"desc": ".video-info-items:eq(0)&&Text;.video-info-items:eq(1)&&Text;.video-info-items:eq(2)&&Text;.video-info-items:eq(3)&&Text",
|
||||
"content": ".vod_content&&Text",
|
||||
"tabs": ".module-tab-item",
|
||||
"lists": ".module-player-list:eq(#id)&&.scroll-content&&a"
|
||||
},
|
||||
搜索: '.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
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(5);a&&Text;a&&href;/(\\d+).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.myui-vodlist.clearfix;li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.myui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".myui-content__detail .title&&Text;.myui-content__detail p:eq(-2)&&Text",
|
||||
"img": ".myui-content__thumb .lazyload&&data-original",
|
||||
"desc": ".myui-content__detail p:eq(0)&&Text;.myui-content__detail p:eq(1)&&Text;.myui-content__detail p:eq(2)&&Text",
|
||||
"content": ".content&&Text",
|
||||
"tabs": ".nav-tabs:eq(0) li",
|
||||
"lists": ".myui-content__list:eq(#id) li"
|
||||
},
|
||||
搜索: '#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
},
|
||||
首图2: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/list/fyclass-fypage.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
// "Cookie": ""
|
||||
},
|
||||
// class_parse:'.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html',
|
||||
class_parse: '.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.stui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".stui-content__detail .title&&Text;.stui-content__detail p:eq(-2)&&Text",
|
||||
"img": ".stui-content__thumb .lazyload&&data-original",
|
||||
"desc": ".stui-content__detail p:eq(0)&&Text;.stui-content__detail p:eq(1)&&Text;.stui-content__detail p:eq(2)&&Text",
|
||||
"content": ".detail&&Text",
|
||||
"tabs": ".stui-vodlist__head h3",
|
||||
"lists": ".stui-content__playlist:eq(#id) li"
|
||||
},
|
||||
搜索: 'ul.stui-vodlist__media:eq(0) li,ul.stui-vodlist:eq(0) li,#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
搜索1: 'ul.stui-vodlist&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
搜索2: 'ul.stui-vodlist__media&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
},
|
||||
默认: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/-------------.html?wd=**',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
double: true, // 推荐内容是否双层定位
|
||||
},
|
||||
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,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
},
|
||||
// class_parse:'.fed-pops-navbar&&ul.fed-part-rows&&a.fed-part-eone:gt(0):lt(5);a&&Text;a&&href;.*/(.*?).html',
|
||||
class_parse: '.fed-pops-navbar&&ul.fed-part-rows&&a;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.fed-list-info.fed-part-rows;li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.fed-list-info&&li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1.fed-part-eone&&Text;.fed-deta-content&&.fed-part-rows&&li&&Text",
|
||||
"img": ".fed-list-info&&a&&data-original",
|
||||
"desc": ".fed-deta-content&&.fed-part-rows&&li:eq(1)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(2)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(3)&&Text",
|
||||
"content": ".fed-part-esan&&Text",
|
||||
"tabs": ".fed-drop-boxs&&.fed-part-rows&&li",
|
||||
"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: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/v_search/**----------fypage---.html',
|
||||
url: '/vod_____show/fyclass--------fypage---.html',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: 'body&&.hl-nav li:gt(0);a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '明星|专题|最新|排行',
|
||||
limit: 40,
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
推荐: '.hl-vod-list;li;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
double: true,
|
||||
一级: '.hl-vod-list&&.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".hl-infos-title&&Text;.hl-text-conch&&Text",
|
||||
"img": ".hl-lazy&&data-original",
|
||||
"desc": ".hl-infos-content&&.hl-text-conch&&Text",
|
||||
"content": ".hl-content-text&&Text",
|
||||
"tabs": ".hl-tabs&&a",
|
||||
"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: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**/',
|
||||
url: '/index.php/vod/show/id/fyclass/page/fypage/',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: '#nav-bar li;a&&Text;a&&href;id/(.*?)/',
|
||||
limit: 40,
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
推荐: '.list-a.size;li;a&&title;.lazy&&data-original;.bt&&Text;a&&href',
|
||||
double: true,
|
||||
一级: '.list-a&&li;a&&title;.lazy&&data-original;.list-remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h2&&Text;.deployment&&Text",
|
||||
"img": ".lazy&&data-original",
|
||||
"desc": ".deployment&&Text",
|
||||
"content": ".ec-show&&Text",
|
||||
"tabs": "#tag&&a",
|
||||
"lists": ".play_list_box:eq(#id)&&li"
|
||||
},
|
||||
搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',
|
||||
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
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '解析|动态',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.pic-list&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.content-rt&&p:eq(0)&&Text",
|
||||
"img": ".img&&img&&data-src",
|
||||
"desc": ".content-rt&&p:eq(1)&&Text;.content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text;.content-rt&&p:eq(4)&&Text;.content-rt&&p:eq(5)&&Text",
|
||||
"content": ".zkjj_a&&Text",
|
||||
"tabs": ".py-tabs&&option",
|
||||
"lists": ".player:eq(#id) li"
|
||||
},
|
||||
搜索: '.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href',
|
||||
},
|
||||
短视2:{
|
||||
title: '',
|
||||
host: '',
|
||||
class_name:'电影&电视剧&综艺&动漫',
|
||||
class_url:'1&2&3&4',
|
||||
searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
headers:{'User-Agent':'MOBILE_UA'},
|
||||
url: '/index.php/api/vod#type=fyclass&page=fypage',
|
||||
filterable:0,//是否启用分类筛选,
|
||||
filter_url:'',
|
||||
filter: {},
|
||||
filter_def:{},
|
||||
detailUrl:'/index.php/vod/detail/id/fyid.html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐:'.list-vod.flex .public-list-box;a&&title;.lazy&&data-original;.public-list-prb&&Text;a&&href',
|
||||
一级:'js:let body=input.split("#")[1];let t=Math.round(new Date/1e3).toString();let key=md5("DS"+t+"DCC147D11943AF75");let url=input.split("#")[0];body=body+"&time="+t+"&key="+key;print(body);fetch_params.body=body;let html=post(url,fetch_params);let data=JSON.parse(html);VODS=data.list.map(function(it){it.vod_pic=urljoin2(input.split("/i")[0],it.vod_pic);return it});',
|
||||
二级:{
|
||||
"title":".slide-info-title&&Text;.slide-info:eq(3)--strong&&Text",
|
||||
"img":".detail-pic&&data-original",
|
||||
"desc":".fraction&&Text;.slide-info-remarks:eq(1)&&Text;.slide-info-remarks:eq(2)&&Text;.slide-info:eq(2)--strong&&Text;.slide-info:eq(1)--strong&&Text",
|
||||
"content":"#height_limit&&Text",
|
||||
"tabs":".anthology.wow.fadeInUp.animated&&.swiper-wrapper&&a",
|
||||
"tab_text":".swiper-slide&&Text",
|
||||
"lists":".anthology-list-box:eq(#id) li"
|
||||
},
|
||||
搜索:'json:list;name;pic;;id',
|
||||
}
|
||||
};
|
||||
return JSON.parse(JSON.stringify(mubanDict));
|
||||
}
|
||||
var mubanDict = getMubans();
|
||||
var muban = getMubans();
|
||||
export default {muban,getMubans};
|
||||
+68
File diff suppressed because one or more lines are too long
+1737
@@ -0,0 +1,1737 @@
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.JSON5 = factory());
|
||||
}(this, (function () { 'use strict';
|
||||
|
||||
function createCommonjsModule(fn, module) {
|
||||
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
||||
}
|
||||
|
||||
var _global = createCommonjsModule(function (module) {
|
||||
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
|
||||
var global = module.exports = typeof window != 'undefined' && window.Math == Math
|
||||
? window : typeof self != 'undefined' && self.Math == Math ? self
|
||||
// eslint-disable-next-line no-new-func
|
||||
: Function('return this')();
|
||||
if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
|
||||
});
|
||||
|
||||
var _core = createCommonjsModule(function (module) {
|
||||
var core = module.exports = { version: '2.6.5' };
|
||||
if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
|
||||
});
|
||||
var _core_1 = _core.version;
|
||||
|
||||
var _isObject = function (it) {
|
||||
return typeof it === 'object' ? it !== null : typeof it === 'function';
|
||||
};
|
||||
|
||||
var _anObject = function (it) {
|
||||
if (!_isObject(it)) { throw TypeError(it + ' is not an object!'); }
|
||||
return it;
|
||||
};
|
||||
|
||||
var _fails = function (exec) {
|
||||
try {
|
||||
return !!exec();
|
||||
} catch (e) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
// Thank's IE8 for his funny defineProperty
|
||||
var _descriptors = !_fails(function () {
|
||||
return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
|
||||
});
|
||||
|
||||
var document = _global.document;
|
||||
// typeof document.createElement is 'object' in old IE
|
||||
var is = _isObject(document) && _isObject(document.createElement);
|
||||
var _domCreate = function (it) {
|
||||
return is ? document.createElement(it) : {};
|
||||
};
|
||||
|
||||
var _ie8DomDefine = !_descriptors && !_fails(function () {
|
||||
return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
|
||||
});
|
||||
|
||||
// 7.1.1 ToPrimitive(input [, PreferredType])
|
||||
|
||||
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
|
||||
// and the second argument - flag - preferred type is a string
|
||||
var _toPrimitive = function (it, S) {
|
||||
if (!_isObject(it)) { return it; }
|
||||
var fn, val;
|
||||
if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
|
||||
if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) { return val; }
|
||||
if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) { return val; }
|
||||
throw TypeError("Can't convert object to primitive value");
|
||||
};
|
||||
|
||||
var dP = Object.defineProperty;
|
||||
|
||||
var f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
|
||||
_anObject(O);
|
||||
P = _toPrimitive(P, true);
|
||||
_anObject(Attributes);
|
||||
if (_ie8DomDefine) { try {
|
||||
return dP(O, P, Attributes);
|
||||
} catch (e) { /* empty */ } }
|
||||
if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
|
||||
if ('value' in Attributes) { O[P] = Attributes.value; }
|
||||
return O;
|
||||
};
|
||||
|
||||
var _objectDp = {
|
||||
f: f
|
||||
};
|
||||
|
||||
var _propertyDesc = function (bitmap, value) {
|
||||
return {
|
||||
enumerable: !(bitmap & 1),
|
||||
configurable: !(bitmap & 2),
|
||||
writable: !(bitmap & 4),
|
||||
value: value
|
||||
};
|
||||
};
|
||||
|
||||
var _hide = _descriptors ? function (object, key, value) {
|
||||
return _objectDp.f(object, key, _propertyDesc(1, value));
|
||||
} : function (object, key, value) {
|
||||
object[key] = value;
|
||||
return object;
|
||||
};
|
||||
|
||||
var hasOwnProperty = {}.hasOwnProperty;
|
||||
var _has = function (it, key) {
|
||||
return hasOwnProperty.call(it, key);
|
||||
};
|
||||
|
||||
var id = 0;
|
||||
var px = Math.random();
|
||||
var _uid = function (key) {
|
||||
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
|
||||
};
|
||||
|
||||
var _library = false;
|
||||
|
||||
var _shared = createCommonjsModule(function (module) {
|
||||
var SHARED = '__core-js_shared__';
|
||||
var store = _global[SHARED] || (_global[SHARED] = {});
|
||||
|
||||
(module.exports = function (key, value) {
|
||||
return store[key] || (store[key] = value !== undefined ? value : {});
|
||||
})('versions', []).push({
|
||||
version: _core.version,
|
||||
mode: _library ? 'pure' : 'global',
|
||||
copyright: '© 2019 Denis Pushkarev (zloirock.ru)'
|
||||
});
|
||||
});
|
||||
|
||||
var _functionToString = _shared('native-function-to-string', Function.toString);
|
||||
|
||||
var _redefine = createCommonjsModule(function (module) {
|
||||
var SRC = _uid('src');
|
||||
|
||||
var TO_STRING = 'toString';
|
||||
var TPL = ('' + _functionToString).split(TO_STRING);
|
||||
|
||||
_core.inspectSource = function (it) {
|
||||
return _functionToString.call(it);
|
||||
};
|
||||
|
||||
(module.exports = function (O, key, val, safe) {
|
||||
var isFunction = typeof val == 'function';
|
||||
if (isFunction) { _has(val, 'name') || _hide(val, 'name', key); }
|
||||
if (O[key] === val) { return; }
|
||||
if (isFunction) { _has(val, SRC) || _hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
|
||||
if (O === _global) {
|
||||
O[key] = val;
|
||||
} else if (!safe) {
|
||||
delete O[key];
|
||||
_hide(O, key, val);
|
||||
} else if (O[key]) {
|
||||
O[key] = val;
|
||||
} else {
|
||||
_hide(O, key, val);
|
||||
}
|
||||
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
|
||||
})(Function.prototype, TO_STRING, function toString() {
|
||||
return typeof this == 'function' && this[SRC] || _functionToString.call(this);
|
||||
});
|
||||
});
|
||||
|
||||
var _aFunction = function (it) {
|
||||
if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
|
||||
return it;
|
||||
};
|
||||
|
||||
// optional / simple context binding
|
||||
|
||||
var _ctx = function (fn, that, length) {
|
||||
_aFunction(fn);
|
||||
if (that === undefined) { return fn; }
|
||||
switch (length) {
|
||||
case 1: return function (a) {
|
||||
return fn.call(that, a);
|
||||
};
|
||||
case 2: return function (a, b) {
|
||||
return fn.call(that, a, b);
|
||||
};
|
||||
case 3: return function (a, b, c) {
|
||||
return fn.call(that, a, b, c);
|
||||
};
|
||||
}
|
||||
return function (/* ...args */) {
|
||||
return fn.apply(that, arguments);
|
||||
};
|
||||
};
|
||||
|
||||
var PROTOTYPE = 'prototype';
|
||||
|
||||
var $export = function (type, name, source) {
|
||||
var IS_FORCED = type & $export.F;
|
||||
var IS_GLOBAL = type & $export.G;
|
||||
var IS_STATIC = type & $export.S;
|
||||
var IS_PROTO = type & $export.P;
|
||||
var IS_BIND = type & $export.B;
|
||||
var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] || (_global[name] = {}) : (_global[name] || {})[PROTOTYPE];
|
||||
var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});
|
||||
var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
|
||||
var key, own, out, exp;
|
||||
if (IS_GLOBAL) { source = name; }
|
||||
for (key in source) {
|
||||
// contains in native
|
||||
own = !IS_FORCED && target && target[key] !== undefined;
|
||||
// export native or passed
|
||||
out = (own ? target : source)[key];
|
||||
// bind timers to global for call from export context
|
||||
exp = IS_BIND && own ? _ctx(out, _global) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;
|
||||
// extend global
|
||||
if (target) { _redefine(target, key, out, type & $export.U); }
|
||||
// export
|
||||
if (exports[key] != out) { _hide(exports, key, exp); }
|
||||
if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
|
||||
}
|
||||
};
|
||||
_global.core = _core;
|
||||
// type bitmap
|
||||
$export.F = 1; // forced
|
||||
$export.G = 2; // global
|
||||
$export.S = 4; // static
|
||||
$export.P = 8; // proto
|
||||
$export.B = 16; // bind
|
||||
$export.W = 32; // wrap
|
||||
$export.U = 64; // safe
|
||||
$export.R = 128; // real proto method for `library`
|
||||
var _export = $export;
|
||||
|
||||
// 7.1.4 ToInteger
|
||||
var ceil = Math.ceil;
|
||||
var floor = Math.floor;
|
||||
var _toInteger = function (it) {
|
||||
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
|
||||
};
|
||||
|
||||
// 7.2.1 RequireObjectCoercible(argument)
|
||||
var _defined = function (it) {
|
||||
if (it == undefined) { throw TypeError("Can't call method on " + it); }
|
||||
return it;
|
||||
};
|
||||
|
||||
// true -> String#at
|
||||
// false -> String#codePointAt
|
||||
var _stringAt = function (TO_STRING) {
|
||||
return function (that, pos) {
|
||||
var s = String(_defined(that));
|
||||
var i = _toInteger(pos);
|
||||
var l = s.length;
|
||||
var a, b;
|
||||
if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
|
||||
a = s.charCodeAt(i);
|
||||
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
|
||||
? TO_STRING ? s.charAt(i) : a
|
||||
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
|
||||
};
|
||||
};
|
||||
|
||||
var $at = _stringAt(false);
|
||||
_export(_export.P, 'String', {
|
||||
// 21.1.3.3 String.prototype.codePointAt(pos)
|
||||
codePointAt: function codePointAt(pos) {
|
||||
return $at(this, pos);
|
||||
}
|
||||
});
|
||||
|
||||
var codePointAt = _core.String.codePointAt;
|
||||
|
||||
var max = Math.max;
|
||||
var min = Math.min;
|
||||
var _toAbsoluteIndex = function (index, length) {
|
||||
index = _toInteger(index);
|
||||
return index < 0 ? max(index + length, 0) : min(index, length);
|
||||
};
|
||||
|
||||
var fromCharCode = String.fromCharCode;
|
||||
var $fromCodePoint = String.fromCodePoint;
|
||||
|
||||
// length should be 1, old FF problem
|
||||
_export(_export.S + _export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
|
||||
// 21.1.2.2 String.fromCodePoint(...codePoints)
|
||||
fromCodePoint: function fromCodePoint(x) {
|
||||
var arguments$1 = arguments;
|
||||
// eslint-disable-line no-unused-vars
|
||||
var res = [];
|
||||
var aLen = arguments.length;
|
||||
var i = 0;
|
||||
var code;
|
||||
while (aLen > i) {
|
||||
code = +arguments$1[i++];
|
||||
if (_toAbsoluteIndex(code, 0x10ffff) !== code) { throw RangeError(code + ' is not a valid code point'); }
|
||||
res.push(code < 0x10000
|
||||
? fromCharCode(code)
|
||||
: fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
|
||||
);
|
||||
} return res.join('');
|
||||
}
|
||||
});
|
||||
|
||||
var fromCodePoint = _core.String.fromCodePoint;
|
||||
|
||||
// This is a generated file. Do not edit.
|
||||
var Space_Separator = /[\u1680\u2000-\u200A\u202F\u205F\u3000]/;
|
||||
var ID_Start = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/;
|
||||
var ID_Continue = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/;
|
||||
|
||||
var unicode = {
|
||||
Space_Separator: Space_Separator,
|
||||
ID_Start: ID_Start,
|
||||
ID_Continue: ID_Continue
|
||||
};
|
||||
|
||||
var util = {
|
||||
isSpaceSeparator: function isSpaceSeparator (c) {
|
||||
return typeof c === 'string' && unicode.Space_Separator.test(c)
|
||||
},
|
||||
|
||||
isIdStartChar: function isIdStartChar (c) {
|
||||
return typeof c === 'string' && (
|
||||
(c >= 'a' && c <= 'z') ||
|
||||
(c >= 'A' && c <= 'Z') ||
|
||||
(c === '$') || (c === '_') ||
|
||||
unicode.ID_Start.test(c)
|
||||
)
|
||||
},
|
||||
|
||||
isIdContinueChar: function isIdContinueChar (c) {
|
||||
return typeof c === 'string' && (
|
||||
(c >= 'a' && c <= 'z') ||
|
||||
(c >= 'A' && c <= 'Z') ||
|
||||
(c >= '0' && c <= '9') ||
|
||||
(c === '$') || (c === '_') ||
|
||||
(c === '\u200C') || (c === '\u200D') ||
|
||||
unicode.ID_Continue.test(c)
|
||||
)
|
||||
},
|
||||
|
||||
isDigit: function isDigit (c) {
|
||||
return typeof c === 'string' && /[0-9]/.test(c)
|
||||
},
|
||||
|
||||
isHexDigit: function isHexDigit (c) {
|
||||
return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)
|
||||
},
|
||||
};
|
||||
|
||||
var source;
|
||||
var parseState;
|
||||
var stack;
|
||||
var pos;
|
||||
var line;
|
||||
var column;
|
||||
var token;
|
||||
var key;
|
||||
var root;
|
||||
|
||||
var parse = function parse (text, reviver) {
|
||||
source = String(text);
|
||||
parseState = 'start';
|
||||
stack = [];
|
||||
pos = 0;
|
||||
line = 1;
|
||||
column = 0;
|
||||
token = undefined;
|
||||
key = undefined;
|
||||
root = undefined;
|
||||
|
||||
do {
|
||||
token = lex();
|
||||
|
||||
// This code is unreachable.
|
||||
// if (!parseStates[parseState]) {
|
||||
// throw invalidParseState()
|
||||
// }
|
||||
|
||||
parseStates[parseState]();
|
||||
} while (token.type !== 'eof')
|
||||
|
||||
if (typeof reviver === 'function') {
|
||||
return internalize({'': root}, '', reviver)
|
||||
}
|
||||
|
||||
return root
|
||||
};
|
||||
|
||||
function internalize (holder, name, reviver) {
|
||||
var value = holder[name];
|
||||
if (value != null && typeof value === 'object') {
|
||||
if (Array.isArray(value)) {
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
var key = String(i);
|
||||
var replacement = internalize(value, key, reviver);
|
||||
if (replacement === undefined) {
|
||||
delete value[key];
|
||||
} else {
|
||||
Object.defineProperty(value, key, {
|
||||
value: replacement,
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (var key$1 in value) {
|
||||
var replacement$1 = internalize(value, key$1, reviver);
|
||||
if (replacement$1 === undefined) {
|
||||
delete value[key$1];
|
||||
} else {
|
||||
Object.defineProperty(value, key$1, {
|
||||
value: replacement$1,
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return reviver.call(holder, name, value)
|
||||
}
|
||||
|
||||
var lexState;
|
||||
var buffer;
|
||||
var doubleQuote;
|
||||
var sign;
|
||||
var c;
|
||||
|
||||
function lex () {
|
||||
lexState = 'default';
|
||||
buffer = '';
|
||||
doubleQuote = false;
|
||||
sign = 1;
|
||||
|
||||
for (;;) {
|
||||
c = peek();
|
||||
|
||||
// This code is unreachable.
|
||||
// if (!lexStates[lexState]) {
|
||||
// throw invalidLexState(lexState)
|
||||
// }
|
||||
|
||||
var token = lexStates[lexState]();
|
||||
if (token) {
|
||||
return token
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function peek () {
|
||||
if (source[pos]) {
|
||||
return String.fromCodePoint(source.codePointAt(pos))
|
||||
}
|
||||
}
|
||||
|
||||
function read () {
|
||||
var c = peek();
|
||||
|
||||
if (c === '\n') {
|
||||
line++;
|
||||
column = 0;
|
||||
} else if (c) {
|
||||
column += c.length;
|
||||
} else {
|
||||
column++;
|
||||
}
|
||||
|
||||
if (c) {
|
||||
pos += c.length;
|
||||
}
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
var lexStates = {
|
||||
default: function default$1 () {
|
||||
switch (c) {
|
||||
case '\t':
|
||||
case '\v':
|
||||
case '\f':
|
||||
case ' ':
|
||||
case '\u00A0':
|
||||
case '\uFEFF':
|
||||
case '\n':
|
||||
case '\r':
|
||||
case '\u2028':
|
||||
case '\u2029':
|
||||
read();
|
||||
return
|
||||
|
||||
case '/':
|
||||
read();
|
||||
lexState = 'comment';
|
||||
return
|
||||
|
||||
case undefined:
|
||||
read();
|
||||
return newToken('eof')
|
||||
}
|
||||
|
||||
if (util.isSpaceSeparator(c)) {
|
||||
read();
|
||||
return
|
||||
}
|
||||
|
||||
// This code is unreachable.
|
||||
// if (!lexStates[parseState]) {
|
||||
// throw invalidLexState(parseState)
|
||||
// }
|
||||
|
||||
return lexStates[parseState]()
|
||||
},
|
||||
|
||||
comment: function comment () {
|
||||
switch (c) {
|
||||
case '*':
|
||||
read();
|
||||
lexState = 'multiLineComment';
|
||||
return
|
||||
|
||||
case '/':
|
||||
read();
|
||||
lexState = 'singleLineComment';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
multiLineComment: function multiLineComment () {
|
||||
switch (c) {
|
||||
case '*':
|
||||
read();
|
||||
lexState = 'multiLineCommentAsterisk';
|
||||
return
|
||||
|
||||
case undefined:
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
read();
|
||||
},
|
||||
|
||||
multiLineCommentAsterisk: function multiLineCommentAsterisk () {
|
||||
switch (c) {
|
||||
case '*':
|
||||
read();
|
||||
return
|
||||
|
||||
case '/':
|
||||
read();
|
||||
lexState = 'default';
|
||||
return
|
||||
|
||||
case undefined:
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
read();
|
||||
lexState = 'multiLineComment';
|
||||
},
|
||||
|
||||
singleLineComment: function singleLineComment () {
|
||||
switch (c) {
|
||||
case '\n':
|
||||
case '\r':
|
||||
case '\u2028':
|
||||
case '\u2029':
|
||||
read();
|
||||
lexState = 'default';
|
||||
return
|
||||
|
||||
case undefined:
|
||||
read();
|
||||
return newToken('eof')
|
||||
}
|
||||
|
||||
read();
|
||||
},
|
||||
|
||||
value: function value () {
|
||||
switch (c) {
|
||||
case '{':
|
||||
case '[':
|
||||
return newToken('punctuator', read())
|
||||
|
||||
case 'n':
|
||||
read();
|
||||
literal('ull');
|
||||
return newToken('null', null)
|
||||
|
||||
case 't':
|
||||
read();
|
||||
literal('rue');
|
||||
return newToken('boolean', true)
|
||||
|
||||
case 'f':
|
||||
read();
|
||||
literal('alse');
|
||||
return newToken('boolean', false)
|
||||
|
||||
case '-':
|
||||
case '+':
|
||||
if (read() === '-') {
|
||||
sign = -1;
|
||||
}
|
||||
|
||||
lexState = 'sign';
|
||||
return
|
||||
|
||||
case '.':
|
||||
buffer = read();
|
||||
lexState = 'decimalPointLeading';
|
||||
return
|
||||
|
||||
case '0':
|
||||
buffer = read();
|
||||
lexState = 'zero';
|
||||
return
|
||||
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
buffer = read();
|
||||
lexState = 'decimalInteger';
|
||||
return
|
||||
|
||||
case 'I':
|
||||
read();
|
||||
literal('nfinity');
|
||||
return newToken('numeric', Infinity)
|
||||
|
||||
case 'N':
|
||||
read();
|
||||
literal('aN');
|
||||
return newToken('numeric', NaN)
|
||||
|
||||
case '"':
|
||||
case "'":
|
||||
doubleQuote = (read() === '"');
|
||||
buffer = '';
|
||||
lexState = 'string';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
identifierNameStartEscape: function identifierNameStartEscape () {
|
||||
if (c !== 'u') {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
read();
|
||||
var u = unicodeEscape();
|
||||
switch (u) {
|
||||
case '$':
|
||||
case '_':
|
||||
break
|
||||
|
||||
default:
|
||||
if (!util.isIdStartChar(u)) {
|
||||
throw invalidIdentifier()
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
buffer += u;
|
||||
lexState = 'identifierName';
|
||||
},
|
||||
|
||||
identifierName: function identifierName () {
|
||||
switch (c) {
|
||||
case '$':
|
||||
case '_':
|
||||
case '\u200C':
|
||||
case '\u200D':
|
||||
buffer += read();
|
||||
return
|
||||
|
||||
case '\\':
|
||||
read();
|
||||
lexState = 'identifierNameEscape';
|
||||
return
|
||||
}
|
||||
|
||||
if (util.isIdContinueChar(c)) {
|
||||
buffer += read();
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('identifier', buffer)
|
||||
},
|
||||
|
||||
identifierNameEscape: function identifierNameEscape () {
|
||||
if (c !== 'u') {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
read();
|
||||
var u = unicodeEscape();
|
||||
switch (u) {
|
||||
case '$':
|
||||
case '_':
|
||||
case '\u200C':
|
||||
case '\u200D':
|
||||
break
|
||||
|
||||
default:
|
||||
if (!util.isIdContinueChar(u)) {
|
||||
throw invalidIdentifier()
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
buffer += u;
|
||||
lexState = 'identifierName';
|
||||
},
|
||||
|
||||
sign: function sign$1 () {
|
||||
switch (c) {
|
||||
case '.':
|
||||
buffer = read();
|
||||
lexState = 'decimalPointLeading';
|
||||
return
|
||||
|
||||
case '0':
|
||||
buffer = read();
|
||||
lexState = 'zero';
|
||||
return
|
||||
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
buffer = read();
|
||||
lexState = 'decimalInteger';
|
||||
return
|
||||
|
||||
case 'I':
|
||||
read();
|
||||
literal('nfinity');
|
||||
return newToken('numeric', sign * Infinity)
|
||||
|
||||
case 'N':
|
||||
read();
|
||||
literal('aN');
|
||||
return newToken('numeric', NaN)
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
zero: function zero () {
|
||||
switch (c) {
|
||||
case '.':
|
||||
buffer += read();
|
||||
lexState = 'decimalPoint';
|
||||
return
|
||||
|
||||
case 'e':
|
||||
case 'E':
|
||||
buffer += read();
|
||||
lexState = 'decimalExponent';
|
||||
return
|
||||
|
||||
case 'x':
|
||||
case 'X':
|
||||
buffer += read();
|
||||
lexState = 'hexadecimal';
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('numeric', sign * 0)
|
||||
},
|
||||
|
||||
decimalInteger: function decimalInteger () {
|
||||
switch (c) {
|
||||
case '.':
|
||||
buffer += read();
|
||||
lexState = 'decimalPoint';
|
||||
return
|
||||
|
||||
case 'e':
|
||||
case 'E':
|
||||
buffer += read();
|
||||
lexState = 'decimalExponent';
|
||||
return
|
||||
}
|
||||
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('numeric', sign * Number(buffer))
|
||||
},
|
||||
|
||||
decimalPointLeading: function decimalPointLeading () {
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
lexState = 'decimalFraction';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
decimalPoint: function decimalPoint () {
|
||||
switch (c) {
|
||||
case 'e':
|
||||
case 'E':
|
||||
buffer += read();
|
||||
lexState = 'decimalExponent';
|
||||
return
|
||||
}
|
||||
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
lexState = 'decimalFraction';
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('numeric', sign * Number(buffer))
|
||||
},
|
||||
|
||||
decimalFraction: function decimalFraction () {
|
||||
switch (c) {
|
||||
case 'e':
|
||||
case 'E':
|
||||
buffer += read();
|
||||
lexState = 'decimalExponent';
|
||||
return
|
||||
}
|
||||
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('numeric', sign * Number(buffer))
|
||||
},
|
||||
|
||||
decimalExponent: function decimalExponent () {
|
||||
switch (c) {
|
||||
case '+':
|
||||
case '-':
|
||||
buffer += read();
|
||||
lexState = 'decimalExponentSign';
|
||||
return
|
||||
}
|
||||
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
lexState = 'decimalExponentInteger';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
decimalExponentSign: function decimalExponentSign () {
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
lexState = 'decimalExponentInteger';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
decimalExponentInteger: function decimalExponentInteger () {
|
||||
if (util.isDigit(c)) {
|
||||
buffer += read();
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('numeric', sign * Number(buffer))
|
||||
},
|
||||
|
||||
hexadecimal: function hexadecimal () {
|
||||
if (util.isHexDigit(c)) {
|
||||
buffer += read();
|
||||
lexState = 'hexadecimalInteger';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
hexadecimalInteger: function hexadecimalInteger () {
|
||||
if (util.isHexDigit(c)) {
|
||||
buffer += read();
|
||||
return
|
||||
}
|
||||
|
||||
return newToken('numeric', sign * Number(buffer))
|
||||
},
|
||||
|
||||
string: function string () {
|
||||
switch (c) {
|
||||
case '\\':
|
||||
read();
|
||||
buffer += escape();
|
||||
return
|
||||
|
||||
case '"':
|
||||
if (doubleQuote) {
|
||||
read();
|
||||
return newToken('string', buffer)
|
||||
}
|
||||
|
||||
buffer += read();
|
||||
return
|
||||
|
||||
case "'":
|
||||
if (!doubleQuote) {
|
||||
read();
|
||||
return newToken('string', buffer)
|
||||
}
|
||||
|
||||
buffer += read();
|
||||
return
|
||||
|
||||
case '\n':
|
||||
case '\r':
|
||||
throw invalidChar(read())
|
||||
|
||||
case '\u2028':
|
||||
case '\u2029':
|
||||
separatorChar(c);
|
||||
break
|
||||
|
||||
case undefined:
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
buffer += read();
|
||||
},
|
||||
|
||||
start: function start () {
|
||||
switch (c) {
|
||||
case '{':
|
||||
case '[':
|
||||
return newToken('punctuator', read())
|
||||
|
||||
// This code is unreachable since the default lexState handles eof.
|
||||
// case undefined:
|
||||
// return newToken('eof')
|
||||
}
|
||||
|
||||
lexState = 'value';
|
||||
},
|
||||
|
||||
beforePropertyName: function beforePropertyName () {
|
||||
switch (c) {
|
||||
case '$':
|
||||
case '_':
|
||||
buffer = read();
|
||||
lexState = 'identifierName';
|
||||
return
|
||||
|
||||
case '\\':
|
||||
read();
|
||||
lexState = 'identifierNameStartEscape';
|
||||
return
|
||||
|
||||
case '}':
|
||||
return newToken('punctuator', read())
|
||||
|
||||
case '"':
|
||||
case "'":
|
||||
doubleQuote = (read() === '"');
|
||||
lexState = 'string';
|
||||
return
|
||||
}
|
||||
|
||||
if (util.isIdStartChar(c)) {
|
||||
buffer += read();
|
||||
lexState = 'identifierName';
|
||||
return
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
afterPropertyName: function afterPropertyName () {
|
||||
if (c === ':') {
|
||||
return newToken('punctuator', read())
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
beforePropertyValue: function beforePropertyValue () {
|
||||
lexState = 'value';
|
||||
},
|
||||
|
||||
afterPropertyValue: function afterPropertyValue () {
|
||||
switch (c) {
|
||||
case ',':
|
||||
case '}':
|
||||
return newToken('punctuator', read())
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
beforeArrayValue: function beforeArrayValue () {
|
||||
if (c === ']') {
|
||||
return newToken('punctuator', read())
|
||||
}
|
||||
|
||||
lexState = 'value';
|
||||
},
|
||||
|
||||
afterArrayValue: function afterArrayValue () {
|
||||
switch (c) {
|
||||
case ',':
|
||||
case ']':
|
||||
return newToken('punctuator', read())
|
||||
}
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
|
||||
end: function end () {
|
||||
// This code is unreachable since it's handled by the default lexState.
|
||||
// if (c === undefined) {
|
||||
// read()
|
||||
// return newToken('eof')
|
||||
// }
|
||||
|
||||
throw invalidChar(read())
|
||||
},
|
||||
};
|
||||
|
||||
function newToken (type, value) {
|
||||
return {
|
||||
type: type,
|
||||
value: value,
|
||||
line: line,
|
||||
column: column,
|
||||
}
|
||||
}
|
||||
|
||||
function literal (s) {
|
||||
for (var i = 0, list = s; i < list.length; i += 1) {
|
||||
var c = list[i];
|
||||
|
||||
var p = peek();
|
||||
|
||||
if (p !== c) {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
read();
|
||||
}
|
||||
}
|
||||
|
||||
function escape () {
|
||||
var c = peek();
|
||||
switch (c) {
|
||||
case 'b':
|
||||
read();
|
||||
return '\b'
|
||||
|
||||
case 'f':
|
||||
read();
|
||||
return '\f'
|
||||
|
||||
case 'n':
|
||||
read();
|
||||
return '\n'
|
||||
|
||||
case 'r':
|
||||
read();
|
||||
return '\r'
|
||||
|
||||
case 't':
|
||||
read();
|
||||
return '\t'
|
||||
|
||||
case 'v':
|
||||
read();
|
||||
return '\v'
|
||||
|
||||
case '0':
|
||||
read();
|
||||
if (util.isDigit(peek())) {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
return '\0'
|
||||
|
||||
case 'x':
|
||||
read();
|
||||
return hexEscape()
|
||||
|
||||
case 'u':
|
||||
read();
|
||||
return unicodeEscape()
|
||||
|
||||
case '\n':
|
||||
case '\u2028':
|
||||
case '\u2029':
|
||||
read();
|
||||
return ''
|
||||
|
||||
case '\r':
|
||||
read();
|
||||
if (peek() === '\n') {
|
||||
read();
|
||||
}
|
||||
|
||||
return ''
|
||||
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
throw invalidChar(read())
|
||||
|
||||
case undefined:
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
return read()
|
||||
}
|
||||
|
||||
function hexEscape () {
|
||||
var buffer = '';
|
||||
var c = peek();
|
||||
|
||||
if (!util.isHexDigit(c)) {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
buffer += read();
|
||||
|
||||
c = peek();
|
||||
if (!util.isHexDigit(c)) {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
buffer += read();
|
||||
|
||||
return String.fromCodePoint(parseInt(buffer, 16))
|
||||
}
|
||||
|
||||
function unicodeEscape () {
|
||||
var buffer = '';
|
||||
var count = 4;
|
||||
|
||||
while (count-- > 0) {
|
||||
var c = peek();
|
||||
if (!util.isHexDigit(c)) {
|
||||
throw invalidChar(read())
|
||||
}
|
||||
|
||||
buffer += read();
|
||||
}
|
||||
|
||||
return String.fromCodePoint(parseInt(buffer, 16))
|
||||
}
|
||||
|
||||
var parseStates = {
|
||||
start: function start () {
|
||||
if (token.type === 'eof') {
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
push();
|
||||
},
|
||||
|
||||
beforePropertyName: function beforePropertyName () {
|
||||
switch (token.type) {
|
||||
case 'identifier':
|
||||
case 'string':
|
||||
key = token.value;
|
||||
parseState = 'afterPropertyName';
|
||||
return
|
||||
|
||||
case 'punctuator':
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// if (token.value !== '}') {
|
||||
// throw invalidToken()
|
||||
// }
|
||||
|
||||
pop();
|
||||
return
|
||||
|
||||
case 'eof':
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// throw invalidToken()
|
||||
},
|
||||
|
||||
afterPropertyName: function afterPropertyName () {
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// if (token.type !== 'punctuator' || token.value !== ':') {
|
||||
// throw invalidToken()
|
||||
// }
|
||||
|
||||
if (token.type === 'eof') {
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
parseState = 'beforePropertyValue';
|
||||
},
|
||||
|
||||
beforePropertyValue: function beforePropertyValue () {
|
||||
if (token.type === 'eof') {
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
push();
|
||||
},
|
||||
|
||||
beforeArrayValue: function beforeArrayValue () {
|
||||
if (token.type === 'eof') {
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
if (token.type === 'punctuator' && token.value === ']') {
|
||||
pop();
|
||||
return
|
||||
}
|
||||
|
||||
push();
|
||||
},
|
||||
|
||||
afterPropertyValue: function afterPropertyValue () {
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// if (token.type !== 'punctuator') {
|
||||
// throw invalidToken()
|
||||
// }
|
||||
|
||||
if (token.type === 'eof') {
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
switch (token.value) {
|
||||
case ',':
|
||||
parseState = 'beforePropertyName';
|
||||
return
|
||||
|
||||
case '}':
|
||||
pop();
|
||||
}
|
||||
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// throw invalidToken()
|
||||
},
|
||||
|
||||
afterArrayValue: function afterArrayValue () {
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// if (token.type !== 'punctuator') {
|
||||
// throw invalidToken()
|
||||
// }
|
||||
|
||||
if (token.type === 'eof') {
|
||||
throw invalidEOF()
|
||||
}
|
||||
|
||||
switch (token.value) {
|
||||
case ',':
|
||||
parseState = 'beforeArrayValue';
|
||||
return
|
||||
|
||||
case ']':
|
||||
pop();
|
||||
}
|
||||
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// throw invalidToken()
|
||||
},
|
||||
|
||||
end: function end () {
|
||||
// This code is unreachable since it's handled by the lexState.
|
||||
// if (token.type !== 'eof') {
|
||||
// throw invalidToken()
|
||||
// }
|
||||
},
|
||||
};
|
||||
|
||||
function push () {
|
||||
var value;
|
||||
|
||||
switch (token.type) {
|
||||
case 'punctuator':
|
||||
switch (token.value) {
|
||||
case '{':
|
||||
value = {};
|
||||
break
|
||||
|
||||
case '[':
|
||||
value = [];
|
||||
break
|
||||
}
|
||||
|
||||
break
|
||||
|
||||
case 'null':
|
||||
case 'boolean':
|
||||
case 'numeric':
|
||||
case 'string':
|
||||
value = token.value;
|
||||
break
|
||||
|
||||
// This code is unreachable.
|
||||
// default:
|
||||
// throw invalidToken()
|
||||
}
|
||||
|
||||
if (root === undefined) {
|
||||
root = value;
|
||||
} else {
|
||||
var parent = stack[stack.length - 1];
|
||||
if (Array.isArray(parent)) {
|
||||
parent.push(value);
|
||||
} else {
|
||||
Object.defineProperty(parent, key, {
|
||||
value: value,
|
||||
writable: true,
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (value !== null && typeof value === 'object') {
|
||||
stack.push(value);
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
parseState = 'beforeArrayValue';
|
||||
} else {
|
||||
parseState = 'beforePropertyName';
|
||||
}
|
||||
} else {
|
||||
var current = stack[stack.length - 1];
|
||||
if (current == null) {
|
||||
parseState = 'end';
|
||||
} else if (Array.isArray(current)) {
|
||||
parseState = 'afterArrayValue';
|
||||
} else {
|
||||
parseState = 'afterPropertyValue';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function pop () {
|
||||
stack.pop();
|
||||
|
||||
var current = stack[stack.length - 1];
|
||||
if (current == null) {
|
||||
parseState = 'end';
|
||||
} else if (Array.isArray(current)) {
|
||||
parseState = 'afterArrayValue';
|
||||
} else {
|
||||
parseState = 'afterPropertyValue';
|
||||
}
|
||||
}
|
||||
|
||||
// This code is unreachable.
|
||||
// function invalidParseState () {
|
||||
// return new Error(`JSON5: invalid parse state '${parseState}'`)
|
||||
// }
|
||||
|
||||
// This code is unreachable.
|
||||
// function invalidLexState (state) {
|
||||
// return new Error(`JSON5: invalid lex state '${state}'`)
|
||||
// }
|
||||
|
||||
function invalidChar (c) {
|
||||
if (c === undefined) {
|
||||
return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
|
||||
}
|
||||
|
||||
return syntaxError(("JSON5: invalid character '" + (formatChar(c)) + "' at " + line + ":" + column))
|
||||
}
|
||||
|
||||
function invalidEOF () {
|
||||
return syntaxError(("JSON5: invalid end of input at " + line + ":" + column))
|
||||
}
|
||||
|
||||
// This code is unreachable.
|
||||
// function invalidToken () {
|
||||
// if (token.type === 'eof') {
|
||||
// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)
|
||||
// }
|
||||
|
||||
// const c = String.fromCodePoint(token.value.codePointAt(0))
|
||||
// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)
|
||||
// }
|
||||
|
||||
function invalidIdentifier () {
|
||||
column -= 5;
|
||||
return syntaxError(("JSON5: invalid identifier character at " + line + ":" + column))
|
||||
}
|
||||
|
||||
function separatorChar (c) {
|
||||
console.warn(("JSON5: '" + (formatChar(c)) + "' in strings is not valid ECMAScript; consider escaping"));
|
||||
}
|
||||
|
||||
function formatChar (c) {
|
||||
var replacements = {
|
||||
"'": "\\'",
|
||||
'"': '\\"',
|
||||
'\\': '\\\\',
|
||||
'\b': '\\b',
|
||||
'\f': '\\f',
|
||||
'\n': '\\n',
|
||||
'\r': '\\r',
|
||||
'\t': '\\t',
|
||||
'\v': '\\v',
|
||||
'\0': '\\0',
|
||||
'\u2028': '\\u2028',
|
||||
'\u2029': '\\u2029',
|
||||
};
|
||||
|
||||
if (replacements[c]) {
|
||||
return replacements[c]
|
||||
}
|
||||
|
||||
if (c < ' ') {
|
||||
var hexString = c.charCodeAt(0).toString(16);
|
||||
return '\\x' + ('00' + hexString).substring(hexString.length)
|
||||
}
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
function syntaxError (message) {
|
||||
var err = new SyntaxError(message);
|
||||
err.lineNumber = line;
|
||||
err.columnNumber = column;
|
||||
return err
|
||||
}
|
||||
|
||||
var stringify = function stringify (value, replacer, space) {
|
||||
var stack = [];
|
||||
var indent = '';
|
||||
var propertyList;
|
||||
var replacerFunc;
|
||||
var gap = '';
|
||||
var quote;
|
||||
|
||||
if (
|
||||
replacer != null &&
|
||||
typeof replacer === 'object' &&
|
||||
!Array.isArray(replacer)
|
||||
) {
|
||||
space = replacer.space;
|
||||
quote = replacer.quote;
|
||||
replacer = replacer.replacer;
|
||||
}
|
||||
|
||||
if (typeof replacer === 'function') {
|
||||
replacerFunc = replacer;
|
||||
} else if (Array.isArray(replacer)) {
|
||||
propertyList = [];
|
||||
for (var i = 0, list = replacer; i < list.length; i += 1) {
|
||||
var v = list[i];
|
||||
|
||||
var item = (void 0);
|
||||
|
||||
if (typeof v === 'string') {
|
||||
item = v;
|
||||
} else if (
|
||||
typeof v === 'number' ||
|
||||
v instanceof String ||
|
||||
v instanceof Number
|
||||
) {
|
||||
item = String(v);
|
||||
}
|
||||
|
||||
if (item !== undefined && propertyList.indexOf(item) < 0) {
|
||||
propertyList.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (space instanceof Number) {
|
||||
space = Number(space);
|
||||
} else if (space instanceof String) {
|
||||
space = String(space);
|
||||
}
|
||||
|
||||
if (typeof space === 'number') {
|
||||
if (space > 0) {
|
||||
space = Math.min(10, Math.floor(space));
|
||||
gap = ' '.substr(0, space);
|
||||
}
|
||||
} else if (typeof space === 'string') {
|
||||
gap = space.substr(0, 10);
|
||||
}
|
||||
|
||||
return serializeProperty('', {'': value})
|
||||
|
||||
function serializeProperty (key, holder) {
|
||||
var value = holder[key];
|
||||
if (value != null) {
|
||||
if (typeof value.toJSON5 === 'function') {
|
||||
value = value.toJSON5(key);
|
||||
} else if (typeof value.toJSON === 'function') {
|
||||
value = value.toJSON(key);
|
||||
}
|
||||
}
|
||||
|
||||
if (replacerFunc) {
|
||||
value = replacerFunc.call(holder, key, value);
|
||||
}
|
||||
|
||||
if (value instanceof Number) {
|
||||
value = Number(value);
|
||||
} else if (value instanceof String) {
|
||||
value = String(value);
|
||||
} else if (value instanceof Boolean) {
|
||||
value = value.valueOf();
|
||||
}
|
||||
|
||||
switch (value) {
|
||||
case null: return 'null'
|
||||
case true: return 'true'
|
||||
case false: return 'false'
|
||||
}
|
||||
|
||||
if (typeof value === 'string') {
|
||||
return quoteString(value, false)
|
||||
}
|
||||
|
||||
if (typeof value === 'number') {
|
||||
return String(value)
|
||||
}
|
||||
|
||||
if (typeof value === 'object') {
|
||||
return Array.isArray(value) ? serializeArray(value) : serializeObject(value)
|
||||
}
|
||||
|
||||
return undefined
|
||||
}
|
||||
|
||||
function quoteString (value) {
|
||||
var quotes = {
|
||||
"'": 0.1,
|
||||
'"': 0.2,
|
||||
};
|
||||
|
||||
var replacements = {
|
||||
"'": "\\'",
|
||||
'"': '\\"',
|
||||
'\\': '\\\\',
|
||||
'\b': '\\b',
|
||||
'\f': '\\f',
|
||||
'\n': '\\n',
|
||||
'\r': '\\r',
|
||||
'\t': '\\t',
|
||||
'\v': '\\v',
|
||||
'\0': '\\0',
|
||||
'\u2028': '\\u2028',
|
||||
'\u2029': '\\u2029',
|
||||
};
|
||||
|
||||
var product = '';
|
||||
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
var c = value[i];
|
||||
switch (c) {
|
||||
case "'":
|
||||
case '"':
|
||||
quotes[c]++;
|
||||
product += c;
|
||||
continue
|
||||
|
||||
case '\0':
|
||||
if (util.isDigit(value[i + 1])) {
|
||||
product += '\\x00';
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if (replacements[c]) {
|
||||
product += replacements[c];
|
||||
continue
|
||||
}
|
||||
|
||||
if (c < ' ') {
|
||||
var hexString = c.charCodeAt(0).toString(16);
|
||||
product += '\\x' + ('00' + hexString).substring(hexString.length);
|
||||
continue
|
||||
}
|
||||
|
||||
product += c;
|
||||
}
|
||||
|
||||
var quoteChar = quote || Object.keys(quotes).reduce(function (a, b) { return (quotes[a] < quotes[b]) ? a : b; });
|
||||
|
||||
product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);
|
||||
|
||||
return quoteChar + product + quoteChar
|
||||
}
|
||||
|
||||
function serializeObject (value) {
|
||||
if (stack.indexOf(value) >= 0) {
|
||||
throw TypeError('Converting circular structure to JSON5')
|
||||
}
|
||||
|
||||
stack.push(value);
|
||||
|
||||
var stepback = indent;
|
||||
indent = indent + gap;
|
||||
|
||||
var keys = propertyList || Object.keys(value);
|
||||
var partial = [];
|
||||
for (var i = 0, list = keys; i < list.length; i += 1) {
|
||||
var key = list[i];
|
||||
|
||||
var propertyString = serializeProperty(key, value);
|
||||
if (propertyString !== undefined) {
|
||||
var member = serializeKey(key) + ':';
|
||||
if (gap !== '') {
|
||||
member += ' ';
|
||||
}
|
||||
member += propertyString;
|
||||
partial.push(member);
|
||||
}
|
||||
}
|
||||
|
||||
var final;
|
||||
if (partial.length === 0) {
|
||||
final = '{}';
|
||||
} else {
|
||||
var properties;
|
||||
if (gap === '') {
|
||||
properties = partial.join(',');
|
||||
final = '{' + properties + '}';
|
||||
} else {
|
||||
var separator = ',\n' + indent;
|
||||
properties = partial.join(separator);
|
||||
final = '{\n' + indent + properties + ',\n' + stepback + '}';
|
||||
}
|
||||
}
|
||||
|
||||
stack.pop();
|
||||
indent = stepback;
|
||||
return final
|
||||
}
|
||||
|
||||
function serializeKey (key) {
|
||||
if (key.length === 0) {
|
||||
return quoteString(key, true)
|
||||
}
|
||||
|
||||
var firstChar = String.fromCodePoint(key.codePointAt(0));
|
||||
if (!util.isIdStartChar(firstChar)) {
|
||||
return quoteString(key, true)
|
||||
}
|
||||
|
||||
for (var i = firstChar.length; i < key.length; i++) {
|
||||
if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {
|
||||
return quoteString(key, true)
|
||||
}
|
||||
}
|
||||
|
||||
return key
|
||||
}
|
||||
|
||||
function serializeArray (value) {
|
||||
if (stack.indexOf(value) >= 0) {
|
||||
throw TypeError('Converting circular structure to JSON5')
|
||||
}
|
||||
|
||||
stack.push(value);
|
||||
|
||||
var stepback = indent;
|
||||
indent = indent + gap;
|
||||
|
||||
var partial = [];
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
var propertyString = serializeProperty(String(i), value);
|
||||
partial.push((propertyString !== undefined) ? propertyString : 'null');
|
||||
}
|
||||
|
||||
var final;
|
||||
if (partial.length === 0) {
|
||||
final = '[]';
|
||||
} else {
|
||||
if (gap === '') {
|
||||
var properties = partial.join(',');
|
||||
final = '[' + properties + ']';
|
||||
} else {
|
||||
var separator = ',\n' + indent;
|
||||
var properties$1 = partial.join(separator);
|
||||
final = '[\n' + indent + properties$1 + ',\n' + stepback + ']';
|
||||
}
|
||||
}
|
||||
|
||||
stack.pop();
|
||||
indent = stepback;
|
||||
return final
|
||||
}
|
||||
};
|
||||
|
||||
var JSON5 = {
|
||||
parse: parse,
|
||||
stringify: stringify,
|
||||
};
|
||||
|
||||
var lib = JSON5;
|
||||
|
||||
var es5 = lib;
|
||||
|
||||
return es5;
|
||||
|
||||
})));
|
||||
+577
@@ -0,0 +1,577 @@
|
||||
/*!
|
||||
* Jinja Templating for JavaScript v0.1.8
|
||||
* https://github.com/sstur/jinja-js
|
||||
*
|
||||
* This is a slimmed-down Jinja2 implementation [http://jinja.pocoo.org/]
|
||||
*
|
||||
* In the interest of simplicity, it deviates from Jinja2 as follows:
|
||||
* - Line statements, cycle, super, macro tags and block nesting are not implemented
|
||||
* - auto escapes html by default (the filter is "html" not "e")
|
||||
* - Only "html" and "safe" filters are built in
|
||||
* - Filters are not valid in expressions; `foo|length > 1` is not valid
|
||||
* - Expression Tests (`if num is odd`) not implemented (`is` translates to `==` and `isnot` to `!=`)
|
||||
*
|
||||
* Notes:
|
||||
* - if property is not found, but method '_get' exists, it will be called with the property name (and cached)
|
||||
* - `{% for n in obj %}` iterates the object's keys; get the value with `{% for n in obj %}{{ obj[n] }}{% endfor %}`
|
||||
* - subscript notation `a[0]` takes literals or simple variables but not `a[item.key]`
|
||||
* - `.2` is not a valid number literal; use `0.2`
|
||||
*
|
||||
*/
|
||||
/*global require, exports, module, define */
|
||||
|
||||
(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) {
|
||||
"use strict";
|
||||
var STRINGS = /'(\\.|[^'])*'|"(\\.|[^"'"])*"/g;
|
||||
var IDENTS_AND_NUMS = /([$_a-z][$\w]*)|([+-]?\d+(\.\d+)?)/g;
|
||||
var NUMBER = /^[+-]?\d+(\.\d+)?$/;
|
||||
//non-primitive literals (array and object literals)
|
||||
var NON_PRIMITIVES = /\[[@#~](,[@#~])*\]|\[\]|\{([@i]:[@#~])(,[@i]:[@#~])*\}|\{\}/g;
|
||||
//bare identifiers such as variables and in object literals: {foo: 'value'}
|
||||
var IDENTIFIERS = /[$_a-z][$\w]*/ig;
|
||||
var VARIABLES = /i(\.i|\[[@#i]\])*/g;
|
||||
var ACCESSOR = /(\.i|\[[@#i]\])/g;
|
||||
var OPERATORS = /(===?|!==?|>=?|<=?|&&|\|\||[+\-\*\/%])/g;
|
||||
//extended (english) operators
|
||||
var EOPS = /(^|[^$\w])(and|or|not|is|isnot)([^$\w]|$)/g;
|
||||
var LEADING_SPACE = /^\s+/;
|
||||
var TRAILING_SPACE = /\s+$/;
|
||||
|
||||
var START_TOKEN = /\{\{\{|\{\{|\{%|\{#/;
|
||||
var TAGS = {
|
||||
'{{{': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?\}\}\}/,
|
||||
'{{': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?\}\}/,
|
||||
'{%': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?%\}/,
|
||||
'{#': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?#\}/
|
||||
};
|
||||
|
||||
var delimeters = {
|
||||
'{%': 'directive',
|
||||
'{{': 'output',
|
||||
'{#': 'comment'
|
||||
};
|
||||
|
||||
var operators = {
|
||||
and: '&&',
|
||||
or: '||',
|
||||
not: '!',
|
||||
is: '==',
|
||||
isnot: '!='
|
||||
};
|
||||
|
||||
var constants = {
|
||||
'true': true,
|
||||
'false': false,
|
||||
'null': null
|
||||
};
|
||||
|
||||
function Parser() {
|
||||
this.nest = [];
|
||||
this.compiled = [];
|
||||
this.childBlocks = 0;
|
||||
this.parentBlocks = 0;
|
||||
this.isSilent = false;
|
||||
}
|
||||
|
||||
Parser.prototype.push = function (line) {
|
||||
if (!this.isSilent) {
|
||||
this.compiled.push(line);
|
||||
}
|
||||
};
|
||||
|
||||
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) {
|
||||
//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] : '');
|
||||
//here we sub out strings so we don't get false matches
|
||||
var simplified = match.replace(STRINGS, '@');
|
||||
//if we don't have a close tag or there is a nested open tag
|
||||
if (!match || ~simplified.indexOf(open)) {
|
||||
return index + 1;
|
||||
}
|
||||
var inner = match.slice(0, 0 - open.length);
|
||||
//check for white-space collapse syntax
|
||||
if (inner.charAt(0) === '-') var wsCollapseLeft = true;
|
||||
if (inner.slice(-1) === '-') var wsCollapseRight = true;
|
||||
inner = inner.replace(/^-|-$/g, '').trim();
|
||||
//if we're in raw mode and we are not looking at an "endraw" tag, move along
|
||||
if (parser.rawMode && (open + inner) !== '{%endraw') {
|
||||
return index + 1;
|
||||
}
|
||||
var text = src.slice(lastEnd, index);
|
||||
lastEnd = index + open.length + match.length;
|
||||
if (trimLeading) text = trimLeft(text);
|
||||
if (wsCollapseLeft) text = trimRight(text);
|
||||
if (wsCollapseRight) trimLeading = true;
|
||||
if (open === '{{{') {
|
||||
//liquid-style: make {{{x}}} => {{x|safe}}
|
||||
open = '{{';
|
||||
inner += '|safe';
|
||||
}
|
||||
parser.textHandler(text);
|
||||
parser.tokenHandler(open, inner);
|
||||
});
|
||||
var text = src.slice(lastEnd);
|
||||
if (trimLeading) text = trimLeft(text);
|
||||
this.textHandler(text);
|
||||
};
|
||||
|
||||
Parser.prototype.textHandler = function (text) {
|
||||
this.push('write(' + JSON.stringify(text) + ');');
|
||||
};
|
||||
|
||||
Parser.prototype.tokenHandler = function (open, inner) {
|
||||
var type = delimeters[open];
|
||||
if (type === 'directive') {
|
||||
this.compileTag(inner);
|
||||
} else if (type === 'output') {
|
||||
var extracted = this.extractEnt(inner, STRINGS, '@');
|
||||
//replace || operators with ~
|
||||
extracted.src = extracted.src.replace(/\|\|/g, '~').split('|');
|
||||
//put back || operators
|
||||
extracted.src = extracted.src.map(function (part) {
|
||||
return part.split('~').join('||');
|
||||
});
|
||||
var parts = this.injectEnt(extracted, '@');
|
||||
if (parts.length > 1) {
|
||||
var filters = parts.slice(1).map(this.parseFilter.bind(this));
|
||||
this.push('filter(' + this.parseExpr(parts[0]) + ',' + filters.join(',') + ');');
|
||||
} else {
|
||||
this.push('filter(' + this.parseExpr(parts[0]) + ');');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Parser.prototype.compileTag = function (str) {
|
||||
var directive = str.split(' ')[0];
|
||||
var handler = tagHandlers[directive];
|
||||
if (!handler) {
|
||||
throw new Error('Invalid tag: ' + str);
|
||||
}
|
||||
handler.call(this, str.slice(directive.length).trim());
|
||||
};
|
||||
|
||||
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});
|
||||
return '[' + JSON.stringify(name) + ',' + args + ']';
|
||||
};
|
||||
|
||||
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);
|
||||
return replacement;
|
||||
}
|
||||
return str;
|
||||
});
|
||||
return {src: src, subs: subs};
|
||||
};
|
||||
|
||||
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 () {
|
||||
return subs[i++];
|
||||
});
|
||||
});
|
||||
return isArr ? arr : arr[0];
|
||||
};
|
||||
|
||||
//replace complex literals without mistaking subscript notation with array literals
|
||||
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');
|
||||
};
|
||||
|
||||
//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) {
|
||||
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) {
|
||||
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) {
|
||||
return (s in constants || NUMBER.test(s)) ? '#' : null;
|
||||
});
|
||||
//sub out object/variable identifiers -> i
|
||||
var parsed3 = this.extractEnt(parsed2.src, IDENTIFIERS, 'i');
|
||||
//remove white-space
|
||||
parsed3.src = parsed3.src.replace(/\s+/g, '');
|
||||
|
||||
//the rest of this is simply to boil the expression down and check validity
|
||||
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))) ;
|
||||
//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'))) ;
|
||||
//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)
|
||||
simplified = simplified.replace(/[@#~v]/g, 'i');
|
||||
//sub out operators
|
||||
simplified = simplified.replace(OPERATORS, '%');
|
||||
//allow 'not' unary operator
|
||||
simplified = simplified.replace(/!+[i]/g, 'i');
|
||||
var terms = opts.terms ? simplified.split(',') : [simplified];
|
||||
terms.forEach(function (term) {
|
||||
//simplify logical grouping
|
||||
while (term !== (term = term.replace(/\(i(%i)*\)/g, 'i'))) ;
|
||||
if (!term.match(/^i(%i)*/)) {
|
||||
throw new Error('Invalid expression: ' + src + " " + term);
|
||||
}
|
||||
});
|
||||
parsed3.src = parsed3.src.replace(VARIABLES, this.parseVar.bind(this));
|
||||
parsed2.src = this.injectEnt(parsed3, 'i');
|
||||
parsed1.src = this.injectEnt(parsed2, '#');
|
||||
return this.injectEnt(parsed1, '@');
|
||||
};
|
||||
|
||||
Parser.prototype.parseVar = function (src) {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
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) {
|
||||
if (part === '.i') {
|
||||
parts.push('"i"');
|
||||
} else if (part === '[i]') {
|
||||
parts.push('get("i")');
|
||||
} else {
|
||||
parts.push(part.slice(1, -1));
|
||||
}
|
||||
});
|
||||
return 'get(' + parts.join(',') + ')';
|
||||
};
|
||||
|
||||
//escapes a name to be used as a javascript identifier
|
||||
Parser.prototype.escName = function (str) {
|
||||
return str.replace(/\W/g, function (s) {
|
||||
return '$' + s.charCodeAt(0).toString(16);
|
||||
});
|
||||
};
|
||||
|
||||
Parser.prototype.parseQuoted = function (str) {
|
||||
if (str.charAt(0) === "'") {
|
||||
str = str.slice(1, -1).replace(/\\.|"/, function (s) {
|
||||
if (s === "\\'") return "'";
|
||||
return s.charAt(0) === '\\' ? s : ('\\' + s);
|
||||
});
|
||||
str = '"' + str + '"';
|
||||
}
|
||||
//todo: try/catch or deal with invalid characters (linebreaks, control characters)
|
||||
return JSON.parse(str);
|
||||
};
|
||||
|
||||
|
||||
//the context 'this' inside tagHandlers is the parser instance
|
||||
var tagHandlers = {
|
||||
'if': function (expr) {
|
||||
this.push('if (' + this.parseExpr(expr) + ') {');
|
||||
this.nest.unshift('if');
|
||||
},
|
||||
'else': function () {
|
||||
if (this.nest[0] === 'for') {
|
||||
this.push('}, function() {');
|
||||
} else {
|
||||
this.push('} else {');
|
||||
}
|
||||
},
|
||||
'elseif': function (expr) {
|
||||
this.push('} else if (' + this.parseExpr(expr) + ') {');
|
||||
},
|
||||
'endif': function () {
|
||||
this.nest.shift();
|
||||
this.push('}');
|
||||
},
|
||||
'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 () {
|
||||
this.nest.shift();
|
||||
this.push('});');
|
||||
},
|
||||
'raw': function () {
|
||||
this.rawMode = true;
|
||||
},
|
||||
'endraw': function () {
|
||||
this.rawMode = false;
|
||||
},
|
||||
'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) {
|
||||
if (this.isParent) {
|
||||
++this.parentBlocks;
|
||||
var blockName = 'block_' + (this.escName(name) || this.parentBlocks);
|
||||
this.push('block(typeof ' + blockName + ' == "function" ? ' + blockName + ' : function() {');
|
||||
} else if (this.hasParent) {
|
||||
this.isSilent = false;
|
||||
++this.childBlocks;
|
||||
blockName = 'block_' + (this.escName(name) || this.childBlocks);
|
||||
this.push('function ' + blockName + '() {');
|
||||
}
|
||||
this.nest.unshift('block');
|
||||
},
|
||||
'endblock': function () {
|
||||
this.nest.shift();
|
||||
if (this.isParent) {
|
||||
this.push('});');
|
||||
} else if (this.hasParent) {
|
||||
this.push('}');
|
||||
this.isSilent = true;
|
||||
}
|
||||
},
|
||||
'extends': function (name) {
|
||||
name = this.parseQuoted(name);
|
||||
var parentSrc = this.readTemplateFile(name);
|
||||
this.isParent = true;
|
||||
this.tokenize(parentSrc);
|
||||
this.isParent = false;
|
||||
this.hasParent = true;
|
||||
//silence output until we enter a child block
|
||||
this.isSilent = true;
|
||||
},
|
||||
'include': function (name) {
|
||||
name = this.parseQuoted(name);
|
||||
var incSrc = this.readTemplateFile(name);
|
||||
this.isInclude = true;
|
||||
this.tokenize(incSrc);
|
||||
this.isInclude = false;
|
||||
}
|
||||
};
|
||||
|
||||
//liquid style
|
||||
tagHandlers.assign = tagHandlers.set;
|
||||
//python/django style
|
||||
tagHandlers.elif = tagHandlers.elseif;
|
||||
|
||||
var getRuntime = function runtime(data, opts) {
|
||||
var defaults = {autoEscape: 'toJson'};
|
||||
var _toString = Object.prototype.toString;
|
||||
var _hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||
var getKeys = Object.keys || function (obj) {
|
||||
var keys = [];
|
||||
for (var n in obj) if (_hasOwnProperty.call(obj, n)) keys.push(n);
|
||||
return keys;
|
||||
};
|
||||
var isArray = Array.isArray || function (obj) {
|
||||
return _toString.call(obj) === '[object Array]';
|
||||
};
|
||||
var create = Object.create || function (obj) {
|
||||
function F() {
|
||||
}
|
||||
|
||||
F.prototype = obj;
|
||||
return new F();
|
||||
};
|
||||
var toString = function (val) {
|
||||
if (val == null) return '';
|
||||
return (typeof val.toString == 'function') ? val.toString() : _toString.call(val);
|
||||
};
|
||||
var extend = function (dest, src) {
|
||||
var keys = getKeys(src);
|
||||
for (var i = 0, len = keys.length; i < len; i++) {
|
||||
var key = keys[i];
|
||||
dest[key] = src[key];
|
||||
}
|
||||
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;
|
||||
while (c--) {
|
||||
val = stack[c][n];
|
||||
if (typeof val != 'undefined') break;
|
||||
}
|
||||
for (var i = 1, len = arguments.length; i < len; i++) {
|
||||
if (val == null) continue;
|
||||
n = arguments[i];
|
||||
val = (_hasOwnProperty.call(val, n)) ? val[n] : (typeof val._get == 'function' ? (val[n] = val._get(n)) : null);
|
||||
}
|
||||
return (val == null) ? '' : val;
|
||||
};
|
||||
var set = function (n, val) {
|
||||
stack[stack.length - 1][n] = val;
|
||||
};
|
||||
var push = function (ctx) {
|
||||
stack.push(ctx || {});
|
||||
};
|
||||
var pop = function () {
|
||||
stack.pop();
|
||||
};
|
||||
var write = function (str) {
|
||||
output.push(str);
|
||||
};
|
||||
var filter = function (val) {
|
||||
for (var i = 1, len = arguments.length; i < len; i++) {
|
||||
var arr = arguments[i], name = arr[0], filter = filters[name];
|
||||
if (filter) {
|
||||
arr[0] = val;
|
||||
//now arr looks like [val, arg1, arg2]
|
||||
val = filter.apply(data, arr);
|
||||
} else {
|
||||
throw new Error('Invalid filter: ' + name);
|
||||
}
|
||||
}
|
||||
if (opts.autoEscape && name !== opts.autoEscape && name !== 'safe') {
|
||||
//auto escape if not explicitly safe or already escaped
|
||||
val = filters[opts.autoEscape].call(data, val);
|
||||
}
|
||||
output.push(val);
|
||||
};
|
||||
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]}};
|
||||
push(ctx);
|
||||
for (var i = 0; i < len; i++) {
|
||||
extend(ctx.loop, {index: i + 1, index0: i});
|
||||
fn1(ctx[loopvar] = arr[i]);
|
||||
}
|
||||
if (len === 0 && fn2) fn2();
|
||||
pop();
|
||||
};
|
||||
var block = function (fn) {
|
||||
push();
|
||||
fn();
|
||||
pop();
|
||||
};
|
||||
var render = function () {
|
||||
return output.join('');
|
||||
};
|
||||
data = data || {};
|
||||
opts = extend(defaults, opts || {});
|
||||
var filters = extend({
|
||||
html: function (val) {
|
||||
return toString(val)
|
||||
.split('&').join('&')
|
||||
.split('<').join('<')
|
||||
.split('>').join('>')
|
||||
.split('"').join('"');
|
||||
},
|
||||
safe: function (val) {
|
||||
return val;
|
||||
},
|
||||
toJson: function (val) {
|
||||
if (typeof val === 'object') {
|
||||
return JSON.stringify(val);
|
||||
}
|
||||
return toString(val);
|
||||
}
|
||||
}, opts.filters || {});
|
||||
var stack = [create(data || {})], output = [];
|
||||
return {
|
||||
get: get,
|
||||
set: set,
|
||||
push: push,
|
||||
pop: pop,
|
||||
write: write,
|
||||
filter: filter,
|
||||
each: each,
|
||||
block: block,
|
||||
render: render
|
||||
};
|
||||
};
|
||||
|
||||
var runtime;
|
||||
|
||||
jinja.compile = function (markup, opts) {
|
||||
opts = opts || {};
|
||||
var parser = new Parser();
|
||||
parser.readTemplateFile = this.readTemplateFile;
|
||||
var code = [];
|
||||
code.push('function render($) {');
|
||||
code.push('var get = $.get, set = $.set, push = $.push, pop = $.pop, write = $.write, filter = $.filter, each = $.each, block = $.block;');
|
||||
code.push.apply(code, parser.parse(markup));
|
||||
code.push('return $.render();');
|
||||
code.push('}');
|
||||
code = code.join('\n');
|
||||
if (opts.runtime === false) {
|
||||
var fn = new Function('data', 'options', 'return (' + code + ')(runtime(data, options))');
|
||||
} else {
|
||||
runtime = runtime || (runtime = getRuntime.toString());
|
||||
fn = new Function('data', 'options', 'return (' + code + ')((' + runtime + ')(data, options))');
|
||||
}
|
||||
return {render: fn};
|
||||
};
|
||||
|
||||
jinja.render = function (markup, data, opts) {
|
||||
var tmpl = jinja.compile(markup);
|
||||
return tmpl.render(data, opts);
|
||||
};
|
||||
|
||||
jinja.templateFiles = [];
|
||||
|
||||
jinja.readTemplateFile = function (name) {
|
||||
var templateFiles = this.templateFiles || [];
|
||||
var templateFile = templateFiles[name];
|
||||
if (templateFile == null) {
|
||||
throw new Error('Template file not found: ' + name);
|
||||
}
|
||||
return templateFile;
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
* Helpers
|
||||
*/
|
||||
|
||||
function trimLeft(str) {
|
||||
return str.replace(LEADING_SPACE, '');
|
||||
}
|
||||
|
||||
function trimRight(str) {
|
||||
return str.replace(TRAILING_SPACE, '');
|
||||
}
|
||||
|
||||
function matchAll(str, reg, fn) {
|
||||
//copy as global
|
||||
reg = new RegExp(reg.source, 'g' + (reg.ignoreCase ? 'i' : '') + (reg.multiline ? 'm' : ''));
|
||||
var match;
|
||||
while ((match = reg.exec(str))) {
|
||||
var result = fn(match[0], match.index, str);
|
||||
if (typeof result == 'number') {
|
||||
reg.lastIndex = result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}));
|
||||
@@ -0,0 +1,3 @@
|
||||
// JSON 解析错误:JSON语法结构存在错误,无法解析,以下为您输出接口原文。
|
||||
|
||||
var iil='jsjiami.com.v6',iil_=['iil'],lIIIl1ll=[iil,'\x6f\x6b\x68\x74\x74\x70\x2f\x33\x2e\x31\x35','\x69\x6e\x64\x65\x78\x4f\x66','\x24\x24\x24','\x73\x70\x6c\x69\x74','\x74\x72\x69\x6d','\x26\x26\x26','\x3a\x2f\x2f','\x6c\x6f\x67','\x70\x69\x63\x55\x72\x6c\x3a\x20','\x72\x65\x70\x6c\x61\x63\x65','\x70\x75\x73\x68','\x2f\x66\x69\x6c\x65\x2f\x6c\x69\x76\x65\x73\x6f\x75\x72\x63\x65\x6c\x69\x73\x74','\x2f\x6c\x69\x76\x65\x73\x6f\x75\x72\x63\x65\x6c\x69\x73\x74','\x47\x45\x54','\x70\x61\x72\x73\x65','\x63\x6f\x6e\x74\x65\x6e\x74','\x73\x75\x62\x73\x74\x72\x69\x6e\x67','\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x4f\x66','\x6e\x61\x6d\x65','\x75\x72\x6c','\x3d\x3d\x3d\x3d\x20\x3e\x3e\x3e\x20','\x73\x74\x72\x69\x6e\x67\x69\x66\x79','\x65\x78\x65\x63','\x74\x65\x73\x74','\x6d\x61\x74\x63\x68','\x63\x68\x61\x6e\x6e\x65\x6c','\x2c\x23\x67\x65\x6e\x72\x65\x23\x0a','\x75\x72\x6c\x73','\x64\x61\x74\x61','\x64\x61\x74\x61\x6c\x69\x73\x74','\x70\x72\x6f\x76','\x6c\x69\x73\x74','\x2d\x2d\x2d','\x6c\x69\x6e\x65','\x77\x65\x62\x50\x69\x63\x55\x72\x6c\x3a\x20','\x23\x45\x58\x54\x4d\x33\x55','\x22\x63\x68\x61\x6e\x6e\x65\x6c\x22','\x22\x75\x72\x6c\x73\x22','\x22\x64\x61\x74\x61\x6c\x69\x73\x74\x22','\x6c\x65\x6e\x67\x74\x68','\x23\x67\x65\x6e\x72\x65\x23','\x7b\x6e\x61\x6d\x65\x7d','\x7b\x63\x61\x74\x65\x7d','\u76f4\u64ad\u5217\u8868','\x6e\x75\x6c\x6c','\x74\x79\x70\x65\x5f\x69\x64','\x76\x6f\x64\x5f\x70\x6c\x61\x79\x5f\x75\x72\x6c','\x68\x61\x73\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79','\x6a\x6f\x69\x6e','\x76\x6f\x64\x5f\x70\x6c\x61\x79\x5f\x66\x72\x6f\x6d','\x6a\x43\x50\x73\x4e\x6a\x77\x69\x4a\x61\x51\x6d\x69\x2e\x63\x6f\x4e\x4f\x6d\x47\x72\x2e\x76\x56\x36\x41\x46\x67\x79\x74\x74\x3d\x3d'];function Ii1l1III(_0x3b13df,_0x346a54){_0x3b13df=~~'0x'['concat'](_0x3b13df['slice'](0x0));var _0x4db44b=lIIIl1ll[_0x3b13df];return _0x4db44b;};(function(_0x209161,_0x5eaa4a){var _0x42ecdf=0x0;for(_0x5eaa4a=_0x209161['shift'](_0x42ecdf>>0x2);_0x5eaa4a&&_0x5eaa4a!==(_0x209161['pop'](_0x42ecdf>>0x3)+'')['replace'](/[CPNwJQNOGrVAFgytt=]/g,'');_0x42ecdf++){_0x42ecdf=_0x42ecdf^0x127efd;}}(lIIIl1ll,Ii1l1III));let headers={'User-Agent':Ii1l1III('0')};let classes=[];let cates={};let picUrl='';let webPaths={};function init(IiIIi1i){let i1Ii11I1='';if(IiIIi1i[Ii1l1III('1')](Ii1l1III('2'))>0x0){i1Ii11I1=IiIIi1i[Ii1l1III('3')](Ii1l1III('2'))[0x0][Ii1l1III('4')]();IiIIi1i=IiIIi1i[Ii1l1III('3')](Ii1l1III('2'))[0x1][Ii1l1III('4')]();}if(IiIIi1i[Ii1l1III('1')](Ii1l1III('5'))>0x0){picUrl=IiIIi1i[Ii1l1III('3')](Ii1l1III('5'))[0x1][Ii1l1III('4')]();if(picUrl[Ii1l1III('1')](Ii1l1III('6'))<0x0){picUrl=i1Ii11I1+picUrl;}IiIIi1i=IiIIi1i[Ii1l1III('3')](Ii1l1III('5'))[0x0][Ii1l1III('4')]();}console[Ii1l1III('7')](Ii1l1III('8')+picUrl);let IIlIlI1I=IiIIi1i[Ii1l1III('3')]('\x23');for(const IlII1I1 of IIlIlI1I){if(IlII1I1[Ii1l1III('1')]('\x24')>0x0){let illIl111=IlII1I1;let Ill1iIi=IlII1I1[Ii1l1III('3')]('\x24')[0x0];if(illIl111[Ii1l1III('1')](Ii1l1III('6'))<0x0){illIl111=illIl111[Ii1l1III('9')]('\x24','\x24'+i1Ii11I1);}classes[Ii1l1III('a')]({'type_id':illIl111,'type_name':Ill1iIi[Ii1l1III('9')]('\x21\x21','')});}else{let II1lIlli=IlII1I1;if(II1lIlli[Ii1l1III('1')](Ii1l1III('6'))<0x0){II1lIlli=i1Ii11I1+II1lIlli;}II1lIlli=II1lIlli[Ii1l1III('9')](Ii1l1III('b'),Ii1l1III('c'));let Illi11ll=req(II1lIlli,{'\x6d\x65\x74\x68\x6f\x64':Ii1l1III('d'),'\x68\x65\x61\x64\x65\x72\x73':headers});try{let l1lIiill=JSON[Ii1l1III('e')](Illi11ll[Ii1l1III('f')]);let lillI11l=II1lIlli[Ii1l1III('10')](0x0,II1lIlli[Ii1l1III('11')]('\x2f')+0x1);for(const i1iilII1 of l1lIiill){let Iillil=i1iilII1[Ii1l1III('12')];let lI1iIl=i1iilII1[Ii1l1III('13')];let illIl111=Iillil+'\x24'+(lI1iIl[Ii1l1III('1')](Ii1l1III('6'))<0x0?lillI11l:'')+lI1iIl;classes[Ii1l1III('a')]({'type_id':illIl111,'type_name':Iillil[Ii1l1III('9')]('\x21\x21','')});webPaths[illIl111]=lillI11l;}}catch(Ii1Ii11){console[Ii1l1III('7')](Ii1l1III('14')+Ii1Ii11);}}}}function home(I1iiIiIl){return JSON[Ii1l1III('15')]({'class':classes,'filters':null});}function parseM3u(iIi1Ii1I,I1IlIIIi){let iI1iiIii={};let iiI11111=/(#EXTINF:.+?),([^,]+?)\s*\n(.+?)\s*\n/g;let ii1iilil=null;while((ii1iilil=iiI11111[Ii1l1III('16')](iIi1Ii1I))!=null){let lllli1iI=ii1iilil[0x1];let il1Ili1I=ii1iilil[0x2];let liIlll1l=ii1iilil[0x3];if(il1Ili1I==null||liIlll1l==null||il1Ili1I==''||liIlll1l==''){continue;}il1Ili1I=il1Ili1I[Ii1l1III('4')]();liIlll1l=liIlll1l[Ii1l1III('4')]();let IiI1lI1l=I1IlIIIi;let ilIl1i1i=/group-title="(.*?)"/;if(ilIl1i1i[Ii1l1III('17')](lllli1iI)){IiI1lI1l=lllli1iI[Ii1l1III('18')](ilIl1i1i)[0x1];}if(!iI1iiIii[IiI1lI1l]){iI1iiIii[IiI1lI1l]=[];}iI1iiIii[IiI1lI1l][Ii1l1III('a')](il1Ili1I+'\x2c'+liIlll1l);}let ll11III1='';for(const li1Ili in iI1iiIii){ll11III1+=li1Ili+'\x0a';let IlIil1ll=iI1iiIii[li1Ili];for(const li1iI11 of IlIil1ll){ll11III1+=li1iI11+'\x0a';}}return ll11III1;}function parseFm(IliiIl1I){let lliiI1i1='';let Iii1ll=JSON[Ii1l1III('e')](IliiIl1I);for(const i1lIlli1 of Iii1ll){let I111Il1l=i1lIlli1[Ii1l1III('12')];let ilI11li=i1lIlli1[Ii1l1III('19')];lliiI1i1+=I111Il1l+Ii1l1III('1a');for(const iiilI1iI of ilI11li){let I11111l1=iiilI1iI[Ii1l1III('12')];let IlI1l1I1=iiilI1iI[Ii1l1III('1b')];for(const l1II1lll of IlI1l1I1){lliiI1i1+=I11111l1+'\x2c'+l1II1lll+'\x0a';}}}return lliiI1i1;}function parseLu(iIliI1lI){let IIlilI1i='';let I11ilI1i=JSON[Ii1l1III('e')](iIliI1lI)[Ii1l1III('1c')];for(const i1Ii1l1 of I11ilI1i[Ii1l1III('1d')]){let I11111l=i1Ii1l1[Ii1l1III('1e')];let IiIiii1l=i1Ii1l1[Ii1l1III('1f')];IIlilI1i+=I11111l+Ii1l1III('1a');for(const l1111lI of IiIiii1l){let lIlI1iI=l1111lI[Ii1l1III('12')];let ll11i1II=l1111lI[Ii1l1III('1b')];for(const Iliilii of ll11i1II){IIlilI1i+=lIlI1iI+Ii1l1III('20')+Iliilii[Ii1l1III('21')]+'\x2c'+Iliilii[Ii1l1III('13')]+'\x0a';}}}return IIlilI1i;}function getCateData(IliI1i){let iI1I1I1I=picUrl;if(IliI1i[Ii1l1III('1')](Ii1l1III('5'))>0x0){iI1I1I1I=IliI1i[Ii1l1III('3')](Ii1l1III('5'))[0x1][Ii1l1III('4')]();if(iI1I1I1I[Ii1l1III('1')](Ii1l1III('6'))<0x0&&webPaths[IliI1i]){iI1I1I1I=webPaths[IliI1i]+iI1I1I1I;}IliI1i=IliI1i[Ii1l1III('3')](Ii1l1III('5'))[0x0][Ii1l1III('4')]();}console[Ii1l1III('7')](Ii1l1III('22')+iI1I1I1I);let ll1iIiiI=IliI1i[Ii1l1III('3')]('\x24')[0x1];let i1I1l1i=IliI1i[Ii1l1III('3')]('\x24')[0x0];if(!cates[IliI1i]){cates[IliI1i]=[];let iIl11Iii=headers;if(ll1iIiiI[Ii1l1III('1')]('\x7c')>0x0){let ii111I1I=decodeURIComponent(ll1iIiiI[Ii1l1III('3')]('\x7c')[0x1]);ll1iIiiI=ll1iIiiI[Ii1l1III('3')]('\x7c')[0x0];for(const II1Ii1l of ii111I1I[Ii1l1III('3')]('\x26')){if(II1Ii1l[Ii1l1III('1')]('\x3d')>0x0){let lI1lliii=II1Ii1l[Ii1l1III('3')]('\x3d')[0x0];let I11Iii1i=II1Ii1l[Ii1l1III('3')]('\x3d')[0x1];iIl11Iii[lI1lliii]=I11Iii1i;}}}let I111lilI=req(ll1iIiiI,{'\x6d\x65\x74\x68\x6f\x64':Ii1l1III('d'),'\x68\x65\x61\x64\x65\x72\x73':iIl11Iii});I111lilI=I111lilI[Ii1l1III('f')][Ii1l1III('4')]();if(I111lilI[Ii1l1III('1')](Ii1l1III('23'))>=0x0){I111lilI=parseM3u(I111lilI,i1I1l1i);}else if(I111lilI[Ii1l1III('1')](Ii1l1III('24'))>0x0&&I111lilI[Ii1l1III('1')](Ii1l1III('25'))>0x0){I111lilI=parseFm(I111lilI);}else if(I111lilI[Ii1l1III('1')](Ii1l1III('26'))>0x0&&I111lilI[Ii1l1III('1')](Ii1l1III('25'))>0x0){I111lilI=parseLu(I111lilI);}let li1IiiII=(i1I1l1i+'\x0a'+I111lilI[Ii1l1III('9')]('\x0d',''))[Ii1l1III('3')]('\x0a');let lli11iI=i1I1l1i;let IiiIIiIi=null;let iiiI1l='';for(let i1ii1IIl=0x0;i1ii1IIl<li1IiiII[Ii1l1III('27')];i1ii1IIl++){let lIliIii=li1IiiII[i1ii1IIl][Ii1l1III('9')](/\s+/g,'');if(lIliIii!=''&&lIliIii[Ii1l1III('1')](Ii1l1III('6'))<0x0&&(lIliIii[Ii1l1III('1')]('\x2c')<0x0||lIliIii[Ii1l1III('1')](Ii1l1III('28'))>0x0)){if(iiiI1l!=''){let ilIIIl=iI1I1I1I[Ii1l1III('9')](Ii1l1III('29'),encodeURIComponent(lli11iI))[Ii1l1III('9')](Ii1l1III('2a'),encodeURIComponent(i1I1l1i));let ilI1ilI=ilIIIl[Ii1l1III('1')]('\x3c');let iili1I1i=ilIIIl[Ii1l1III('11')]('\x3e');if(ilI1ilI>-0x1&&iili1I1i>ilI1ilI){let I11Ilili=ilIIIl[Ii1l1III('10')](ilI1ilI,iili1I1i+0x1);let I1liliII=new RegExp(I11Ilili[Ii1l1III('9')](/<|>/g,''));let lii11liI=lli11iI[Ii1l1III('9')](I1liliII,function(Ili1lIi1,iiliII1l){return iiliII1l;});ilIIIl=ilIIIl[Ii1l1III('9')](I11Ilili,lii11liI);console[Ii1l1III('7')](lli11iI+'\x2c\x20'+ilIIIl);}let IiiIIiIi={'vod_id':IliI1i+Ii1l1III('2')+cates[IliI1i][Ii1l1III('27')],'vod_name':lli11iI,'vod_pic':ilIIIl,'vod_remarks':'','type_name':Ii1l1III('2b'),'vod_year':'','vod_area':'','vod_actor':'','vod_director':'','vod_content':'','vod_play_from':i1I1l1i,'vod_play_url':iiiI1l};cates[IliI1i][Ii1l1III('a')](IiiIIiIi);}lli11iI=lIliIii[Ii1l1III('3')]('\x2c')[0x0][Ii1l1III('4')]();iiiI1l='';}else if(lIliIii[Ii1l1III('1')]('\x2c')>0x0&&/http|rtmp|rtsp|rsp/[Ii1l1III('17')](lIliIii)){let l1iiI1ii=lIliIii[Ii1l1III('3')]('\x2c');if(iiiI1l!=''){iiiI1l+='\x23';}iiiI1l+=l1iiI1ii[0x0][Ii1l1III('4')]()+'\x24'+l1iiI1ii[0x1][Ii1l1III('4')]();}}if(iiiI1l!=''){let II1Iliil=iI1I1I1I[Ii1l1III('9')](Ii1l1III('29'),encodeURIComponent(lli11iI))[Ii1l1III('9')](Ii1l1III('2a'),encodeURIComponent(i1I1l1i));let ilI1ilI=II1Iliil[Ii1l1III('1')]('\x3c');let iili1I1i=II1Iliil[Ii1l1III('11')]('\x3e');if(ilI1ilI>-0x1&&iili1I1i>ilI1ilI){let I11Ilili=II1Iliil[Ii1l1III('10')](ilI1ilI,iili1I1i+0x1);let I1liliII=new RegExp(I11Ilili[Ii1l1III('9')](/<|>/g,''));let lii11liI=I1liliII[Ii1l1III('17')](lli11iI)?lli11iI[Ii1l1III('18')](I1liliII)[0x1]:Ii1l1III('2c');II1Iliil=II1Iliil[Ii1l1III('9')](I11Ilili,lii11liI);}let IiiIIiIi={'vod_id':IliI1i+Ii1l1III('2')+cates[IliI1i][Ii1l1III('27')],'vod_name':lli11iI,'vod_pic':II1Iliil,'vod_remarks':'','type_name':Ii1l1III('2b'),'vod_year':'','vod_area':'','vod_actor':'','vod_director':'','vod_content':'','vod_play_from':i1I1l1i,'vod_play_url':iiiI1l};cates[IliI1i][Ii1l1III('a')](IiiIIiIi);}}return cates[IliI1i];}function homeVod(liIIlIl1){let iIl1IIii=getCateData(classes[0x0][Ii1l1III('2d')]);let I1l1iil=JSON[Ii1l1III('15')]({'list':iIl1IIii});return I1l1iil;}function category(I1l1i1Ii,l1IiiIli,IIi1Illi,lilIliIl){let IIi1i1ll=[];if(l1IiiIli==0x1){IIi1i1ll=getCateData(I1l1i1Ii);}let iIiiIi1i=JSON[Ii1l1III('15')]({'list':IIi1i1ll});return iIiiIi1i;}function detail(lIl11iii){let I1IIIil=lIl11iii[Ii1l1III('3')](Ii1l1III('2'));let liiiil1i=I1IIIil[0x0];let l1l111II=liiiil1i[Ii1l1III('3')]('\x24')[0x0];let Il1li11i=parseInt(I1IIIil[0x1]);let Iill11Ii=getCateData(liiiil1i)[Il1li11i];console[Ii1l1III('7')](JSON[Ii1l1III('15')](Iill11Ii));if(l1l111II[Ii1l1III('1')]('\x21\x21')>=0x0){l1l111II=l1l111II[Ii1l1III('9')]('\x21\x21','');const ii1l1iil=Iill11Ii[Ii1l1III('2e')][Ii1l1III('3')]('\x23');console[Ii1l1III('7')](JSON[Ii1l1III('15')](ii1l1iil));let i1Ili1I={};let IIIllli1={};for(const i1IiIlIl of ii1l1iil){let Ill1iii1=i1IiIlIl[Ii1l1III('3')]('\x24')[0x0];let IIiIII11=l1l111II;if(Ill1iii1[Ii1l1III('1')](Ii1l1III('20'))>0x0){IIiIII11=Ill1iii1[Ii1l1III('3')](Ii1l1III('20'))[0x1];Ill1iii1=Ill1iii1[Ii1l1III('3')](Ii1l1III('20'))[0x0];}if(!i1Ili1I[Ii1l1III('2f')](Ill1iii1)){i1Ili1I[Ill1iii1]=0x1;}else{i1Ili1I[Ill1iii1]++;}IIiIII11=l1l111II+(i1Ili1I[Ill1iii1]>0x1?'\x20'+i1Ili1I[Ill1iii1]:'');if(!IIIllli1[Ii1l1III('2f')](IIiIII11)){IIIllli1[IIiIII11]=[];}IIIllli1[IIiIII11][Ii1l1III('a')](Ill1iii1+'\x24'+i1IiIlIl[Ii1l1III('3')]('\x24')[0x1]);}let III1i1ii=[];let iii1lIIi=[];for(let iliI1I1i in IIIllli1){III1i1ii[Ii1l1III('a')](iliI1I1i);iii1lIIi[Ii1l1III('a')](IIIllli1[iliI1I1i][Ii1l1III('30')]('\x23'));}Iill11Ii[Ii1l1III('31')]=III1i1ii[Ii1l1III('30')](Ii1l1III('2'));Iill11Ii[Ii1l1III('2e')]=iii1lIIi[Ii1l1III('30')](Ii1l1III('2'));}return JSON[Ii1l1III('15')]({'list':[Iill11Ii]});}function play(l1llIIii,illiiIII,lIIIiIiI){return JSON[Ii1l1III('15')]({'parse':0x0,'url':illiiIII});}function search(I1lll,lI1iiIII){return null;}__JS_SPIDER__={'\x69\x6e\x69\x74':init,'\x68\x6f\x6d\x65':home,'\x68\x6f\x6d\x65\x56\x6f\x64':homeVod,'\x63\x61\x74\x65\x67\x6f\x72\x79':category,'\x64\x65\x74\x61\x69\x6c':detail,'\x70\x6c\x61\x79':play,'\x73\x65\x61\x72\x63\x68':search};;iil='jsjiami.com.v6';
|
||||
+190
@@ -0,0 +1,190 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import base64
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import requests
|
||||
import re
|
||||
from datetime import datetime, timedelta
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
|
||||
|
||||
class Spider(Spider):
|
||||
|
||||
def getName(self):
|
||||
return "山东电视台"
|
||||
|
||||
def init(self, extend):
|
||||
self.extend = extend
|
||||
try:
|
||||
self.extendDict = json.loads(extend)
|
||||
except:
|
||||
self.extendDict = {}
|
||||
|
||||
proxy = self.extendDict.get('proxy', None)
|
||||
if proxy is None:
|
||||
self.is_proxy = False
|
||||
else:
|
||||
self.proxy = proxy
|
||||
self.is_proxy = True
|
||||
pass
|
||||
|
||||
def getDependence(self):
|
||||
return []
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
pass
|
||||
|
||||
def manualVideoCheck(self):
|
||||
pass
|
||||
|
||||
def _get_stream_by_orgid(self, orgid):
|
||||
"""根据orgid获取该电视台的所有频道流"""
|
||||
api_url = f"https://app.litenews.cn/v1/app/play/tv/live?_orgid_={orgid}"
|
||||
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
|
||||
'Referer': 'https://app.litenews.cn/',
|
||||
'Accept': 'application/json, text/plain, */*'
|
||||
}
|
||||
|
||||
try:
|
||||
if self.is_proxy:
|
||||
response = requests.get(api_url, headers=headers, timeout=10, proxies=self.proxy)
|
||||
else:
|
||||
response = requests.get(api_url, headers=headers, timeout=10)
|
||||
|
||||
if response.status_code != 200:
|
||||
return []
|
||||
|
||||
text = response.text.strip()
|
||||
if text.startswith('\ufeff'):
|
||||
text = text[1:]
|
||||
|
||||
data = json.loads(text)
|
||||
|
||||
# 检查返回码
|
||||
if data.get("code") != 1:
|
||||
return []
|
||||
|
||||
# 返回data数组
|
||||
return data.get("data", [])
|
||||
except Exception:
|
||||
return []
|
||||
|
||||
def _fetch_all_channels(self):
|
||||
"""获取所有山东电视台频道数据"""
|
||||
# 从之前测试成功的orgid列表
|
||||
orgid_list = [
|
||||
171, 303, 85, 261, 257, 97, 195, 537, 29, 163, 237, 269, 153,
|
||||
403, 227, 221, 305, 173, 295, 253, 45, 1, 71, 133, 125, 175,
|
||||
189, 255, 57, 239, 109, 165, 55, 17, 61, 23, 203, 75, 101,
|
||||
243, 233, 103, 37, 207, 211, 169, 277, 11, 193, 19, 33, 235,
|
||||
27, 135, 273, 13, 73, 117, 231, 31, 265, 65, 183, 81, 191,
|
||||
113, 201, 167, 147, 145, 159, 289, 187, 293, 51, 59, 213, 77, 91
|
||||
]
|
||||
|
||||
all_channels = []
|
||||
|
||||
for orgid in orgid_list:
|
||||
channels = self._get_stream_by_orgid(orgid)
|
||||
if channels:
|
||||
all_channels.extend(channels)
|
||||
time.sleep(0.1)
|
||||
|
||||
return all_channels
|
||||
|
||||
def liveContent(self, url):
|
||||
"""主入口方法,返回M3U内容"""
|
||||
# 获取所有频道数据
|
||||
channels = self._fetch_all_channels()
|
||||
|
||||
if not channels:
|
||||
return "#EXTM3U\n# 错误:无法获取直播数据"
|
||||
|
||||
# 生成M3U内容(严格按照模板格式)
|
||||
m3u_content = ['#EXTM3U']
|
||||
|
||||
for channel in channels:
|
||||
channel_name = channel.get("name", "未知频道")
|
||||
channel_url = channel.get("stream", "")
|
||||
|
||||
if channel_url:
|
||||
# 严格按照模板格式:EXTINF行 + URL行
|
||||
# 格式:#EXTINF:-1 tvg-name="频道名称" group-title="山东电视台",频道名称
|
||||
extinf = f'#EXTINF:-1 tvg-name="{channel_name}" group-title="山东电视台",{channel_name}'
|
||||
m3u_content.extend([extinf, channel_url])
|
||||
|
||||
return '\n'.join(m3u_content)
|
||||
|
||||
def homeContent(self, filter):
|
||||
return {}
|
||||
|
||||
def homeVideoContent(self):
|
||||
return {}
|
||||
|
||||
def categoryContent(self, cid, page, filter, ext):
|
||||
return {}
|
||||
|
||||
def detailContent(self, did):
|
||||
return {}
|
||||
|
||||
def searchContent(self, key, quick, page='1'):
|
||||
return {}
|
||||
|
||||
def searchContentPage(self, keywords, quick, page):
|
||||
return {}
|
||||
|
||||
def playerContent(self, flag, pid, vipFlags):
|
||||
return {}
|
||||
|
||||
def localProxy(self, params):
|
||||
if params['type'] == "m3u8":
|
||||
return self.proxyM3u8(params)
|
||||
if params['type'] == "ts":
|
||||
return self.get_ts(params)
|
||||
return [302, "text/plain", None, {'Location': 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4'}]
|
||||
|
||||
def proxyM3u8(self, params):
|
||||
pid = params['pid']
|
||||
info = pid.split(',')
|
||||
if len(info) >= 3:
|
||||
a = info[0]
|
||||
b = info[1]
|
||||
c = info[2]
|
||||
timestamp = int(time.time() / 4 - 355017625)
|
||||
t = timestamp * 4
|
||||
m3u8_text = f'#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:4\n#EXT-X-MEDIA-SEQUENCE:{timestamp}\n'
|
||||
for i in range(10):
|
||||
url = f'https://ntd-tgc.cdn.hinet.net/live/pool/{a}/litv-pc/{a}-avc1_6000000={b}-mp4a_134000_zho={c}-begin={t}0000000-dur=40000000-seq={timestamp}.ts'
|
||||
if self.is_proxy:
|
||||
url = f'http://127.0.0.1:9978/proxy?do=py&type=ts&url={self.b64encode(url)}'
|
||||
|
||||
m3u8_text += f'#EXTINF:4,\n{url}\n'
|
||||
timestamp += 1
|
||||
t += 4
|
||||
return [200, "application/vnd.apple.mpegurl", m3u8_text]
|
||||
return [200, "application/vnd.apple.mpegurl", "#EXTM3U\n# 错误:无效的代理参数"]
|
||||
|
||||
def get_ts(self, params):
|
||||
url = self.b64decode(params['url'])
|
||||
headers = {'User-Agent': 'Mozilla/5.0'}
|
||||
if self.is_proxy:
|
||||
response = requests.get(url, headers=headers, stream=True, proxies=self.proxy)
|
||||
else:
|
||||
response = requests.get(url, headers=headers, stream=True)
|
||||
return [206, "application/octet-stream", response.content]
|
||||
|
||||
def destroy(self):
|
||||
return '正在Destroy'
|
||||
|
||||
def b64encode(self, data):
|
||||
return base64.b64encode(data.encode('utf-8')).decode('utf-8')
|
||||
|
||||
def b64decode(self, data):
|
||||
return base64.b64decode(data.encode('utf-8')).decode('utf-8')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
@@ -0,0 +1,13 @@
|
||||
[
|
||||
|
||||
{"name":"凯速官网","url":"https://d.kstore.dev/download/8177/电视直播/tv.json&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"},
|
||||
{"name":"江苏","url":"http://gyjune.kesug.com/jsyd.txt&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"},
|
||||
{"name":"全国","url":"http://gyjune.kesug.com/全国地方.txt&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"},
|
||||
{"name":"魔百盒","url":"https://cc.76220726.xyz/jsmbh.txt&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"},
|
||||
{"name":"上传","url":"http://gyjune.fwh.is/1/gyj.txt&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"},
|
||||
{"name":"南京","url":"https://cc.76220726.xyz/szyd.txt&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"},
|
||||
{"name":"小聚直播","url":"https://gyj.de5.net/tv2.txt&&&https://gitee.com/gyjune/xbpq/raw/main/1.jpg"}
|
||||
|
||||
|
||||
|
||||
]
|
||||
+202
@@ -0,0 +1,202 @@
|
||||
{
|
||||
|
||||
"简介": "【天马行空】提醒您请勿相信影片中的广告,以免上当受骗!+none;\">&&</span>",
|
||||
|
||||
|
||||
|
||||
"线路数组": "#playlist&&</li>",
|
||||
|
||||
"线路标题": "🐬天马行空接口🐬+>&&</a>",
|
||||
|
||||
|
||||
"分类url":"https://www.zjvis.com/show/{cateId}--------{catePg}---{year}.html",
|
||||
|
||||
"分类":"电影$1#电视剧$2#动漫$4#综艺$3#短剧$33",
|
||||
|
||||
"筛选":{
|
||||
"1":[
|
||||
{"key":"cateId","name":"类型","value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"动作片","v":"6"},
|
||||
{"n":"喜剧片","v":"7"},
|
||||
{"n":"爱情片","v":"8"},
|
||||
{"n":"恐怖片","v":"10"},
|
||||
{"n":"剧情片","v":"11"},
|
||||
{"n":"科幻片","v":"9"},
|
||||
{"n":"动画片","v":"24"},
|
||||
{"n":"战争片","v":"12"}
|
||||
|
||||
]
|
||||
},
|
||||
{"key":"year","name":"时间","value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"},
|
||||
{"n":"2009","v":"2009"},
|
||||
{"n":"2008","v":"2008"},
|
||||
{"n":"2007","v":"2007"},
|
||||
{"n":"2006","v":"2006"},
|
||||
{"n":"2005","v":"2005"},
|
||||
{"n":"2004","v":"2004"}
|
||||
|
||||
]
|
||||
}
|
||||
|
||||
],
|
||||
"2":[
|
||||
{"key":"cateId",
|
||||
"name":"类型","value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"国产剧","v":"13"},
|
||||
{"n":"香港剧","v":"14"},
|
||||
{"n":"台湾剧","v":"20"},
|
||||
{"n":"欧美剧","v":"16"},
|
||||
{"n":"日本剧","v":"21"},
|
||||
{"n":"韩国剧","v":"15"},
|
||||
{"n":"其他剧","v":"22"}
|
||||
|
||||
]
|
||||
},
|
||||
{"key":"year","name":"时间","value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"},
|
||||
{"n":"2009","v":"2009"},
|
||||
{"n":"2008","v":"2008"},
|
||||
{"n":"2007","v":"2007"},
|
||||
{"n":"2006","v":"2006"},
|
||||
{"n":"2005","v":"2005"},
|
||||
{"n":"2004","v":"2004"}
|
||||
|
||||
]
|
||||
}
|
||||
],
|
||||
"3":[
|
||||
{
|
||||
"key":"cateId",
|
||||
"name":"类型",
|
||||
"value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"大陆综艺","v":"25"},
|
||||
{"n":"日韩综艺","v":"26"},
|
||||
{"n":"港台综艺","v":"27"},
|
||||
{"n":"欧美综艺","v":"28"}
|
||||
|
||||
]
|
||||
},
|
||||
{"key":"year","name":"时间","value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"},
|
||||
{"n":"2009","v":"2009"},
|
||||
{"n":"2008","v":"2008"},
|
||||
{"n":"2007","v":"2007"},
|
||||
{"n":"2006","v":"2006"},
|
||||
{"n":"2005","v":"2005"},
|
||||
{"n":"2004","v":"2004"}
|
||||
|
||||
]
|
||||
}
|
||||
],
|
||||
"4":[
|
||||
{"key":"cateId","name":"类型","value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"国产动漫","v":"29"},
|
||||
{"n":"日韩动漫","v":"30"},
|
||||
{"n":"欧美动漫","v":"31"},
|
||||
{"n":"其他动漫","v":"32"}
|
||||
]
|
||||
},
|
||||
{"key":"year","name":"时间","value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2024","v":"2024"},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"},
|
||||
{"n":"2009","v":"2009"},
|
||||
{"n":"2008","v":"2008"},
|
||||
{"n":"2007","v":"2007"},
|
||||
{"n":"2006","v":"2006"},
|
||||
{"n":"2005","v":"2005"},
|
||||
{"n":"2004","v":"2004"}
|
||||
|
||||
]
|
||||
}
|
||||
],
|
||||
"33":[
|
||||
{
|
||||
"key":"cateId",
|
||||
"name":"类型",
|
||||
"value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"女频恋爱","v":"34"},
|
||||
{"n":"反转爽剧","v":"35"},
|
||||
{"n":"古装仙侠","v":"36"},
|
||||
{"n":"年代穿越","v":"37"},
|
||||
{"n":"脑洞悬疑","v":"38"},
|
||||
{"n":"现代都市","v":"39"}
|
||||
|
||||
]
|
||||
},
|
||||
{"key":"year","name":"时间","value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2024","v":"2024"},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"}
|
||||
|
||||
|
||||
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
|
||||
|
||||
"分类url":"http://wap.yisi148.com/list-read-id-{cateId}.html",
|
||||
|
||||
"分类":"伦理片$14#国产剧$neidi#港台剧$gangju#日韩剧$hanju#美剧$meiju#泰剧$taiju#海外剧$haiwai#抖音短剧$dydj#动作片$dongzuo#喜剧片$xiju#爱情片$aiqing#科幻片$kehuan#恐怖片$kongbu#剧情片$juqing#战争片$zhanzheng#记录片$jilu#动画片$donghua"
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
|
||||
"主页url":"https://www.zjgydsj.com/",
|
||||
|
||||
"简介":"【天马行空】提醒您请勿相信影片中的广告,以免上当受骗!+<p class=\"col-pd\">&&</p>",
|
||||
|
||||
"数组":"<div class=\"stui-vodlist__box\">&&</div>",
|
||||
|
||||
"标题":" title=\"&&\"",
|
||||
|
||||
"副标题":"🐬天马行空🐬+pic-text text-right\">&&</span>",
|
||||
|
||||
"图片":"data-original=\"&&\"",
|
||||
|
||||
"链接":"href=\"&&\"",
|
||||
|
||||
"线路数组":"#playlist&&</li>",
|
||||
|
||||
"线路标题":"🐬天马行空接口🐬+>&&</a>",
|
||||
|
||||
|
||||
|
||||
|
||||
"分类url":"https://www.zjgydsj.com/show/{cateId}-{area}-{by}------{catePg}---{year}.html",
|
||||
|
||||
"分类":"电影$1#电视剧$2#动漫$4#综艺$3"
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
|
||||
"筛选":"1",
|
||||
|
||||
"类型":"全部$1#动作片$6#喜剧片$7#爱情片$8#科幻片$9#恐怖片$10#剧情片$11#战争片$12#记录片$13#悬疑片$14#犯罪片$15#奇幻片$16#动画片$31||全部$2#国产剧$17#欧美剧$21#日韩剧$20#港台剧$18#海外剧$22||空||空",
|
||||
|
||||
"作者":"天马行空",
|
||||
|
||||
"站名":"番茄影院",
|
||||
|
||||
"数组":"<div class=\"stui-vodlist__box\">&&</div>",
|
||||
|
||||
"标题":"title=\"&&\"",
|
||||
|
||||
"副标题":"🐬天马行空🐬+<span class=\"pic-text text-right\">&&</span>",
|
||||
|
||||
"图片":"data-original=\"&&\"",
|
||||
|
||||
"链接":"href=\"&&\"",
|
||||
|
||||
|
||||
"线路数组":"<div class=\"stui-pannel__head bottom-line active clearfix\">&&</div>",
|
||||
|
||||
"线路标题":"🐬天马行空接口🐬+>&&</h3>",
|
||||
|
||||
|
||||
"播放数组":"<ul class=\"stui-content__playlist clearfix\">&&</ul>",
|
||||
|
||||
"播放标题":">&&</a>",
|
||||
|
||||
"播放列表":"<li >&&</li>",
|
||||
|
||||
"简介":"【天马行空】提醒您请勿相信影片中的广告,以免上当受骗!+<p class=\"col-pd\">&&</p>",
|
||||
|
||||
"分类url":"https://www.jiuhaobashi.com/fqsw/{cateId}-{area}-{by}------{catePg}---{year}.html",
|
||||
|
||||
"分类":"电影$1#电视剧$2#动漫$4#综艺$3"
|
||||
|
||||
|
||||
}
|
||||
+447
@@ -0,0 +1,447 @@
|
||||
/**
|
||||
* 强烈推荐静态分类。可以加快速度!!!
|
||||
* 不建议:
|
||||
* 传参 ?type=url¶ms=../json/采集.json
|
||||
* 建议:
|
||||
* 传参 ?type=url¶ms=../json/采集静态.json#1
|
||||
* 传参 ?type=url¶ms=../json/采集[zy]静态.json#1
|
||||
* 传参 ?type=url¶ms=../json/采集[密]静态.json#1
|
||||
* hipy-server支持@改名比如:
|
||||
* 传参 ?type=url¶ms=../json/采集静态.json#1@采王道长[合]
|
||||
* 传参 ?type=url¶ms=../json/采集[zy]静态.json#1@采王zy[密]
|
||||
* 传参 ?type=url¶ms=../json/采集[密]静态.json@采王成人[密]
|
||||
* [{"name":"暴风资源","url":"https://bfzyapi.com","parse_url":""},{"name":"飞刀资源","url":"http://www.feidaozy.com","parse_url":""},{"name":"黑木耳资源","url":"https://www.heimuer.tv","parse_url":""}]
|
||||
*/
|
||||
globalThis.getRandomItem = function (items) {//从列表随机取出一个元素
|
||||
return items[Math.random() * items.length | 0];
|
||||
}
|
||||
var rule = {
|
||||
title: '采集之王[合]',
|
||||
author: '道长',
|
||||
version: '20240705 beta15',
|
||||
update_info: `
|
||||
20240705:
|
||||
1.支持传参json后面增加#1 这样的额外标识,用于搜索结果精准匹配
|
||||
2.支持传参json后面增加#1#1 这样的额外标识,用于强制获取搜索图片。#1#不显示图片。默认是搜索强制有图片的[已实现详情页请求使用批量]
|
||||
3.修复二级数据无序匹配搜索列表图片的问题
|
||||
20240703:
|
||||
1.采集json支持"searchable": 0,用于搜索时排除这个源
|
||||
20240604:
|
||||
1.首页推荐取消硬控等待。增加随机推荐功能。
|
||||
2.首页推荐新增更新日志查看功能
|
||||
【特别说明】目前只支持标准json格式的采集站(资源站一般都提供xml和json两种接口,目前没有支持xml的想法,没什么必要)
|
||||
有些资源站的json接口不是标准的/api.php/provide/vod/,需要自己在采集静态.json中编辑对应的api属性填写比如:/api.php/provide/vod/at/json/
|
||||
有些资源站的采集数据是加密后的切片片段,可能需要采集站特定的解析接口,需要自己编辑json里的parse_url属性
|
||||
资源站部分大分类下无数据很正常,可以自行编辑json里cate_exclude属性排除掉自己测试过无数据的分类(小程序无法自动识别,只能人工测好哪些分类无数据)
|
||||
`.trim(),
|
||||
host: '',
|
||||
homeTid: '', // 首页推荐。一般填写第一个资源站的想要的推荐分类的id.可以空
|
||||
homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',
|
||||
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
|
||||
searchUrl: '/api.php/provide/vod/?wd=**&pg=#TruePage##page=fypage',
|
||||
classUrl: '/api.php/provide/vod/',
|
||||
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyfilter',
|
||||
filter_url: '{{fl.类型}}',
|
||||
headers: {'User-Agent': 'MOBILE_UA'},
|
||||
timeout: 5000, // class_name: '电影&电视剧&综艺&动漫',
|
||||
limit: 20,
|
||||
search_limit: 5, // 搜索限制取前5个,可以注释掉,就不限制搜索
|
||||
searchable: 1,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 1,//是否启用分类筛选,
|
||||
play_parse: true,
|
||||
parse_url: '', // 这个参数暂时不起作用。聚合类的每个资源应该有自己独立的解析口。单独配置在采集.json里的parse_url有效
|
||||
search_match: false, // 搜索精准匹配
|
||||
search_pic: true, // 搜索强制需要图片
|
||||
// params: 'http://127.0.0.1:5707/files/json/%E9%87%87%E9%9B%86.json',
|
||||
// params: 'http://127.0.0.1:5707/files/json/采集静态.json#1',
|
||||
// params: 'http://127.0.0.1:5707/files/json/采集[zy]静态.json#1',
|
||||
// hostJs:$js.toString(()=>{
|
||||
//
|
||||
// }),
|
||||
预处理: $js.toString(() => {
|
||||
function getClasses(item) {
|
||||
let classes = [];
|
||||
if (item.class_name && item.class_url) {
|
||||
if (!/&|电影|电视剧|综艺|动漫[\u4E00-\u9FA5]+/.test(item.class_name)) {
|
||||
try {
|
||||
item.class_name = ungzip(item.class_name)
|
||||
} catch (e) {
|
||||
log(`不识别的class_name导致gzip解码失败:${e}`)
|
||||
return classes
|
||||
}
|
||||
}
|
||||
let names = item.class_name.split('&');
|
||||
let urls = item.class_url.split('&');
|
||||
let cnt = Math.min(names.length, urls.length);
|
||||
for (let i = 0; i < cnt; i++) {
|
||||
classes.push({
|
||||
'type_id': urls[i],
|
||||
'type_name': names[i]
|
||||
});
|
||||
}
|
||||
}
|
||||
return classes
|
||||
}
|
||||
|
||||
if (typeof (batchFetch) === 'function') {
|
||||
// 支持批量请求直接放飞自我。搜索限制最大线程数量16
|
||||
rule.search_limit = 16;
|
||||
log('当前程序支持批量请求[batchFetch],搜索限制已设置为16');
|
||||
}
|
||||
let _url = rule.params;
|
||||
if (_url && typeof (_url) === 'string' && /^(http|file)/.test(_url)) {
|
||||
if (_url.includes('#')) {
|
||||
let _url_params = _url.split('#');
|
||||
_url = _url_params[0];
|
||||
rule.search_match = !!(_url_params[1]);
|
||||
if (_url_params.length > 2) { // 强制图片
|
||||
rule.search_pic = !!(_url_params[2]);
|
||||
}
|
||||
}
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
let _classes = [];
|
||||
rule.filter = {};
|
||||
rule.filter_def = {};
|
||||
json.forEach(it => {
|
||||
let _obj = {
|
||||
type_name: it.name,
|
||||
type_id: it.url,
|
||||
parse_url: it.parse_url || '',
|
||||
searchable: it.searchable !== 0,
|
||||
api: it.api || '',
|
||||
cate_exclude: it.cate_exclude || '',
|
||||
// class_name: it.class_name || '',
|
||||
// class_url: it.class_url || '',
|
||||
};
|
||||
_classes.push(_obj);
|
||||
try {
|
||||
let json1 = [];
|
||||
if (it.class_name && it.class_url) {
|
||||
json1 = getClasses(it);
|
||||
} else {
|
||||
json1 = JSON.parse(request(urljoin(_obj.type_id, _obj.api || rule.classUrl))).class;
|
||||
}
|
||||
if (_obj.cate_exclude) {
|
||||
json1 = json1.filter(cl => !new RegExp(_obj.cate_exclude, 'i').test(cl.type_name));
|
||||
}
|
||||
rule.filter[_obj.type_id] = [{
|
||||
"key": "类型", "name": "类型", "value": json1.map(i => {
|
||||
return {"n": i.type_name, 'v': i.type_id}
|
||||
})
|
||||
}];
|
||||
if (json1.length > 0) {
|
||||
rule.filter_def[it.url] = {"类型": json1[0].type_id};
|
||||
}
|
||||
} catch (e) {
|
||||
rule.filter[it.url] = [{"key": "类型", "name": "类型", "value": [{"n": "全部", "v": ""}]}];
|
||||
}
|
||||
});
|
||||
rule.classes = _classes;
|
||||
}
|
||||
}),
|
||||
// class_parse: $js.toString(() => {
|
||||
// let _url = rule.params;
|
||||
// if (_url && typeof (_url) === 'string' && _url.startsWith('http')) {
|
||||
// let html = request(_url);
|
||||
// let json = JSON.parse(html);
|
||||
// let _classes = [];
|
||||
// homeObj.filter = {};
|
||||
// rule.filter_def = {};
|
||||
// json.forEach(it => {
|
||||
// let _obj = {
|
||||
// type_name: it.name,
|
||||
// type_id: it.url,
|
||||
// parse_url: it.parse_url || '',
|
||||
// cate_exclude: it.cate_exclude || '',
|
||||
// };
|
||||
// _classes.push(_obj);
|
||||
// try {
|
||||
// let json1 = JSON.parse(request(urljoin(_obj.type_id, rule.classUrl))).class;
|
||||
// if (_obj.cate_exclude) {
|
||||
// json1 = json1.filter(cl => !new RegExp(_obj.cate_exclude, 'i').test(cl.type_name));
|
||||
// }
|
||||
// homeObj.filter[_obj.type_id] = [{
|
||||
// "key": "类型", "name": "类型", "value": json1.map(i => {
|
||||
// return {"n": i.type_name, 'v': i.type_id}
|
||||
// })
|
||||
// }];
|
||||
// if (json1.length > 0) {
|
||||
// rule.filter_def[it.url] = {"类型": json1[0].type_id};
|
||||
// }
|
||||
// } catch (e) {
|
||||
// homeObj.filter[it.url] = [{"key": "类型", "name": "类型", "value": [{"n": "全部", "v": ""}]}];
|
||||
// }
|
||||
// });
|
||||
// rule.classes = _classes;
|
||||
// input = _classes;
|
||||
// }
|
||||
// }),
|
||||
class_parse: $js.toString(() => {
|
||||
input = rule.classes;
|
||||
}),
|
||||
推荐: $js.toString(() => {
|
||||
let update_info = [{
|
||||
vod_name: '更新日志',
|
||||
vod_id: 'update_info',
|
||||
vod_remarks: `版本:${rule.version}`,
|
||||
vod_pic: 'https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/hipy-server/master/app/static/img/logo.png'
|
||||
}];
|
||||
VODS = [];
|
||||
if (rule.classes) {
|
||||
let randomClass = getRandomItem(rule.classes);
|
||||
let _url = urljoin(randomClass.type_id, input);
|
||||
if (randomClass.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', randomClass.api)
|
||||
}
|
||||
try {
|
||||
let html = request(_url, {timeout: rule.timeout});
|
||||
let json = JSON.parse(html);
|
||||
VODS = json.list;
|
||||
VODS.forEach(it => {
|
||||
it.vod_id = randomClass.type_id + '$' + it.vod_id;
|
||||
it.vod_remarks = it.vod_remarks + '|' + randomClass.type_name;
|
||||
});
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
VODS = update_info.concat(VODS);
|
||||
}),
|
||||
一级: $js.toString(() => {
|
||||
VODS = [];
|
||||
if (rule.classes) {
|
||||
// log(input);
|
||||
let _url = urljoin(MY_CATE, input);
|
||||
let current_vod = rule.classes.find(item => item.type_id === MY_CATE);
|
||||
if (current_vod && current_vod.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
|
||||
}
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
VODS = json.list;
|
||||
VODS.forEach(it => {
|
||||
it.vod_id = MY_CATE + '$' + it.vod_id
|
||||
});
|
||||
}
|
||||
}),
|
||||
// 一级: 'json:list;vod_name;vod_pic;vod_remarks;vod_id;vod_play_from',
|
||||
二级: $js.toString(() => {
|
||||
VOD = {};
|
||||
if (orId === 'update_info') {
|
||||
VOD = {
|
||||
vod_content: rule.update_info.trim(),
|
||||
vod_name: '更新日志',
|
||||
type_name: '更新日志',
|
||||
vod_pic: 'https://resource-cdn.tuxiaobei.com/video/FtWhs2mewX_7nEuE51_k6zvg6awl.png',
|
||||
vod_remarks: `版本:${rule.version}`,
|
||||
vod_play_from: '道长在线',
|
||||
// vod_play_url: '嗅探播放$https://resource-cdn.tuxiaobei.com/video/10/8f/108fc9d1ac3f69d29a738cdc097c9018.mp4',
|
||||
vod_play_url: '随机小视频$http://api.yujn.cn/api/zzxjj.php',
|
||||
};
|
||||
} else {
|
||||
if (rule.classes) {
|
||||
let _url = urljoin(fyclass, input);
|
||||
let current_vod = rule.classes.find(item => item.type_id === fyclass);
|
||||
if (current_vod && current_vod.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
|
||||
}
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
let data = json.list;
|
||||
VOD = data[0];
|
||||
if (current_vod && current_vod.type_name) {
|
||||
VOD.vod_play_from = VOD.vod_play_from.split('$$$').map(it => current_vod.type_name + '|' + it).join('$$$')
|
||||
}
|
||||
}
|
||||
}
|
||||
}),
|
||||
搜索: $js.toString(() => {
|
||||
VODS = [];
|
||||
if (rule.classes) {
|
||||
let canSearch = rule.classes.filter(it => it.searchable);
|
||||
let page = Number(MY_PAGE);
|
||||
page = (MY_PAGE - 1) % Math.ceil(canSearch.length / rule.search_limit) + 1;
|
||||
let truePage = Math.ceil(MY_PAGE / Math.ceil(canSearch.length / rule.search_limit));
|
||||
if (rule.search_limit) {
|
||||
let start = (page - 1) * rule.search_limit;
|
||||
let end = page * rule.search_limit;
|
||||
let t1 = new Date().getTime();
|
||||
let searchMode = typeof (batchFetch) === 'function' ? '批量' : '单个';
|
||||
log('start:' + start);
|
||||
log('end:' + end);
|
||||
log('搜索模式:' + searchMode);
|
||||
// log('t1:' + t1);
|
||||
if (start < canSearch.length) {
|
||||
let search_classes = canSearch.slice(start, end);
|
||||
let urls = [];
|
||||
search_classes.forEach(it => {
|
||||
let _url = urljoin(it.type_id, input);
|
||||
if (it.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', it.api)
|
||||
}
|
||||
_url = _url.replace("#TruePage#", "" + truePage);
|
||||
urls.push(_url);
|
||||
});
|
||||
let results_list = [];
|
||||
let results = [];
|
||||
if (typeof (batchFetch) === 'function') {
|
||||
let reqUrls = urls.map(it => {
|
||||
return {
|
||||
url: it,
|
||||
options: {timeout: rule.timeout}
|
||||
}
|
||||
});
|
||||
let rets = batchFetch(reqUrls);
|
||||
let detailUrls = [];
|
||||
let detailUrlCount = 0;
|
||||
rets.forEach((ret, idx) => {
|
||||
let it = search_classes[idx];
|
||||
if (ret) {
|
||||
try {
|
||||
let json = JSON.parse(ret);
|
||||
let data = json.list;
|
||||
data.forEach(i => {
|
||||
i.site_name = it.type_name;
|
||||
i.vod_id = it.type_id + '$' + i.vod_id;
|
||||
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
|
||||
});
|
||||
if (rule.search_match) {
|
||||
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
|
||||
}
|
||||
if (data.length > 0) {
|
||||
if (rule.search_pic && !data[0].vod_pic) {
|
||||
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
|
||||
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
|
||||
detailUrls.push(detailUrl);
|
||||
results_list.push({
|
||||
data: data,
|
||||
has_pic: false,
|
||||
detailUrlCount: detailUrlCount
|
||||
});
|
||||
detailUrlCount++;
|
||||
// try {
|
||||
// let detailJson = JSON.parse(request(detailUrl));
|
||||
// data.forEach((d, _seq) => {
|
||||
// log('二级数据列表元素数:' + detailJson.list.length);
|
||||
// let detailVodPic = detailJson.list[_seq].vod_pic;
|
||||
// if (detailVodPic) {
|
||||
// Object.assign(d, {vod_pic: detailVodPic});
|
||||
// }
|
||||
// });
|
||||
// } catch (e) {
|
||||
// log(`强制获取网站${it.type_id}的搜索图片失败:${e.message}`);
|
||||
// }
|
||||
} else {
|
||||
results_list.push({data: data, has_pic: true});
|
||||
|
||||
}
|
||||
// results = results.concat(data);
|
||||
}
|
||||
} catch (e) {
|
||||
log(`请求:${it.type_id}发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
});
|
||||
// 构造请求二级的batchFetch列表
|
||||
let reqUrls2 = detailUrls.map(it => {
|
||||
return {
|
||||
url: it,
|
||||
options: {timeout: rule.timeout}
|
||||
}
|
||||
});
|
||||
let rets2 = batchFetch(reqUrls2);
|
||||
for (let k = 0; k < results_list.length; k++) {
|
||||
let result_data = results_list[k].data;
|
||||
if (!results_list[k].has_pic) {
|
||||
try {
|
||||
let detailJson = JSON.parse(rets2[results_list[k].detailUrlCount]);
|
||||
log('二级数据列表元素数:' + detailJson.list.length);
|
||||
result_data.forEach((d, _seq) => {
|
||||
// let detailVodPic = detailJson.list[_seq].vod_pic;
|
||||
// log(detailJson);
|
||||
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
|
||||
if (detailVodPic) {
|
||||
Object.assign(d, {vod_pic: detailVodPic.vod_pic});
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
log(`强制获取网站${result_data[0].site_name}的搜索图片失败:${e.message}`);
|
||||
}
|
||||
}
|
||||
results = results.concat(result_data);
|
||||
}
|
||||
|
||||
} else {
|
||||
urls.forEach((_url, idx) => {
|
||||
let it = search_classes[idx];
|
||||
try {
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
let data = json.list;
|
||||
data.forEach(i => {
|
||||
i.vod_id = it.type_id + '$' + i.vod_id;
|
||||
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
|
||||
});
|
||||
if (rule.search_match) {
|
||||
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
|
||||
}
|
||||
if (data.length > 0) {
|
||||
if (rule.search_pic && !data[0].vod_pic) {
|
||||
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
|
||||
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
|
||||
try {
|
||||
let detailJson = JSON.parse(request(detailUrl));
|
||||
log('二级数据列表元素数:' + detailJson.list.length);
|
||||
data.forEach((d, _seq) => {
|
||||
// let detailVodPic = detailJson.list[_seq].vod_pic;
|
||||
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
|
||||
if (detailVodPic) {
|
||||
Object.assign(d, {vod_pic: detailVodPic.vod_pic});
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
log(`强制获取网站${it.type_id}的搜索图片失败:${e.message}`);
|
||||
}
|
||||
}
|
||||
results = results.concat(data);
|
||||
}
|
||||
results = results.concat(data);
|
||||
} catch (e) {
|
||||
log(`请求:${it.type_id}发生错误:${e.message}`)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
VODS = results;
|
||||
let t2 = new Date().getTime();
|
||||
// log('t2:'+t2);
|
||||
log(`${searchMode}搜索:${urls.length}个站耗时:${(Number(t2) - Number(t1))}ms`)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}),
|
||||
lazy: $js.toString(() => {
|
||||
// lazy想办法用对应的parse_url,但是有难度,暂未实现
|
||||
let parse_url = '';
|
||||
if (flag && flag.includes('|')) {
|
||||
let type_name = flag.split('|')[0];
|
||||
let current_vod = rule.classes.find(item => item.type_name === type_name);
|
||||
if (current_vod && current_vod.parse_url) {
|
||||
parse_url = current_vod.parse_url
|
||||
}
|
||||
}
|
||||
if (/\.(m3u8|mp4)/.test(input)) {
|
||||
input = {parse: 0, url: input}
|
||||
} else {
|
||||
if (parse_url.startsWith('json:')) {
|
||||
let purl = parse_url.replace('json:', '') + input;
|
||||
let html = request(purl);
|
||||
input = {parse: 0, url: JSON.parse(html).url}
|
||||
} else {
|
||||
input = parse_url + input;
|
||||
}
|
||||
}
|
||||
}),
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{ "简介": "【天马行空】提醒您请勿相信影片中的广告,以免上当受骗!+<p class=\"col-pd\">&&</p>",
|
||||
|
||||
"数组":"<div class=\"stui-vodlist__box\">&&</div>",
|
||||
|
||||
"标题":"title=\"&&\"",
|
||||
|
||||
"副标题":"🐬天马行空🐬+pic-text text-right\">&&</span>",
|
||||
|
||||
"链接":"href=\"&&\"",
|
||||
|
||||
"图片": "data-original=\"&&\"",
|
||||
|
||||
"线路数组":"#playlist&&</li>",
|
||||
|
||||
"线路标题":"🐬天马行空接口🐬+>&&</a>",
|
||||
|
||||
"分类url":"https://www.wanshunlogistics.com/show/{cateId}-{area}-{by}------{catePg}---{year}.html",
|
||||
|
||||
"分类":"电影$1#电视剧$2#综艺$3#动漫$4"}
|
||||
Reference in New Issue
Block a user