Sync all projects
This commit is contained in:
@@ -0,0 +1,688 @@
|
||||
{
|
||||
"spider": "./spider.jar",
|
||||
"wallpaper": "https://饭的动态壁纸.xxooo.cf/",
|
||||
"sites": [
|
||||
{
|
||||
"key": "点我切源",
|
||||
"name": "去【太太太硬了】领取嘟嘟盘免费容量",
|
||||
"type": 3,
|
||||
"api": "csp_DouDouGuard",
|
||||
"indexs": 1,
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "MDrive",
|
||||
"name": "🗂我的云盘┃我配置",
|
||||
"type": 3,
|
||||
"api": "csp_MyDriveGuard",
|
||||
"changeable": 0,
|
||||
"indexs": 0,
|
||||
"searchable": 1,
|
||||
"style": {
|
||||
"type": "oval"
|
||||
},
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "玩偶",
|
||||
"name": "👽玩偶哥哥┃4K弹幕",
|
||||
"type": 3,
|
||||
"api": "csp_WoGGGuard",
|
||||
"timeout": 30,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "YGP",
|
||||
"name": "🚀叨观荐影┃预告片",
|
||||
"type": 3,
|
||||
"api": "csp_YGPGuard",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "MTV1",
|
||||
"name": "🎙️易听音乐┃带歌词",
|
||||
"type": 3,
|
||||
"api": "csp_MusicGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1
|
||||
},
|
||||
"playerType": 2,
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "seed",
|
||||
"name": "💡聚剧剧┃四盘",
|
||||
"type": 3,
|
||||
"api": "csp_SeedhubGuard",
|
||||
"ext": "5++kwLhNYm9UrO9wh7Dl7eKamTee4s/5",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"indexs": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "ZPan",
|
||||
"name": "🎈聚盘搜┃四盘",
|
||||
"type": 3,
|
||||
"api": "csp_S_zpsGuard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"siteUrl": "http://107.173.211.148/"
|
||||
},
|
||||
"indexs": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "光影",
|
||||
"name": "🌞光影┃不卡",
|
||||
"type": 3,
|
||||
"api": "csp_T4Guard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "rfOIzPkSUkANv6AT2prC8en3+Trbx4j10CIoZMv3Ag4bdEYQqTMqu/Z3YPtC2NJv6n6YeZdgyWlo4WJjBL5gUt6B7LvCEDT4CLrWka31GRq7jwVkfQRB/Jy9HkG7E8xUBIJi5DdVFk3qAuGnwUWqQNRblRxzHW+tdSm6zoFcG/QkZ97bzWOXn0fzbgwjBDkBHgcPIYjlULlctCNKgJ9DzGNSl+zMZDZgmxczsZeeahRS38Cst3qvaHn1T2lmLBGVGXPaRovi77LPRRDOJSNRrdpvCHdRikYwgar0MU56hXMGeGBiKp/OmGTIYR8dFRGvZ/m8xGOqs8U13h6wvADOGlYoP9VaQBqTcDnz9Q0Urhw3oFXWyvIlUrDhX9la5L2NYzagbyk3afqhxeSXXp07nAFsNy2CojHRTbmz4eohLoIJTSi2DzPpheVx1DAapfgRdTc7Ax5ddYpN338GiDAa0GnEgLe04a1pZ5jF+/Q7HJswqlSO+DXCQ3FjRbb/ZPQcozcCWwzhUHE1QUAt799V9DPMuiHGyudIcZarGQmezB+Lb45RdHIRy0PXD+NRVPJlfDFD5FMGSqsiVklibvuwlVHT8J5vHgh/1nEZoI1RlYYLrkjTts2EeQmrpB/sgLyo1vnjFw=="
|
||||
},
|
||||
{
|
||||
"key": "原创",
|
||||
"name": "👒原创┃不卡",
|
||||
"type": 3,
|
||||
"api": "csp_YCyzGuard",
|
||||
"timeout": 15,
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "厂长",
|
||||
"name": "📔厂长┃不卡",
|
||||
"type": 3,
|
||||
"api": "csp_NewCzGuard",
|
||||
"timeout": 10,
|
||||
"playerType": 2,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "立播",
|
||||
"name": "🌟立播┃不卡",
|
||||
"type": 3,
|
||||
"api": "csp_LibvioGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt",
|
||||
"siteUrl": "https://www.libvio.pw/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "瓜子",
|
||||
"name": "👀瓜子┃不卡",
|
||||
"type": 3,
|
||||
"api": "csp_AppgzGuard",
|
||||
"timeout": 15,
|
||||
"playerType": "2",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "比特",
|
||||
"name": "🍄比特┃不卡",
|
||||
"type": 3,
|
||||
"api": "csp_BttwooGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "糯米",
|
||||
"name": "🍓糯米┃秒播",
|
||||
"type": 3,
|
||||
"api": "csp_NmyswvGuard",
|
||||
"timeout": 15,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "文采",
|
||||
"name": "💮文采┃秒播",
|
||||
"type": 3,
|
||||
"api": "csp_JpysGuard",
|
||||
"timeout": 10,
|
||||
"playerType": 2,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "奶酪",
|
||||
"name": "🧀奶酪┃秒播",
|
||||
"type": 3,
|
||||
"api": "csp_T4Guard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "rfOIzPkSUkANv6AT2prC8en3+TzKx9TnlT8vaY37HhtYfAQe6C5xqrVuJPhQwYV6r3eRdMBGm3Qm6Th+BushR86B6KqJGXDsHazHw7alBG/7zUxkN1tK/NypRxnpBNoeUtpw4jcCGhytI75yO4g4zG6SOPA0RSwhksM0IF2friAkrHCWoW3v+0mdw6sjz4t4XB1Df7yL/R5cfaA/5LQYq3I8OkvMrJMU9Q1P7JXwx7NSF2zTyH/ANVmZ4u5m567DW1KVG7OuQjXPjZiOXTYk0+wjpfBRTf19yIq6q/C76k2Fs80joAMPw0ueDR+QHxtuDcTom2rmHkI1Fonkzi6BotbpUcbSi4PiIgmfdbvVwhG6Z+i4nvt+IYa48l5aLA7PLgDiERpuOs31aHaXlgFswT87XyTb8QaF4CuzKWJuXptwNTjvXAS9KHdxH49Ay+hfBAB2bCvUf4CMoldF2wZUv0mI2qY966erFpOFg+FOc7t88EUH8j8ACXQtHJiKC9RQ+SaLIF0="
|
||||
},
|
||||
{
|
||||
"key": "热播",
|
||||
"name": "📺热播┃多线",
|
||||
"type": 3,
|
||||
"api": "csp_AppTTGuard",
|
||||
"timeout": 10,
|
||||
"playerType": 2,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "uqGL1bNENExT7/hGxpSE5qU="
|
||||
},
|
||||
{
|
||||
"key": "视界",
|
||||
"name": "🌸茉莉┃多线",
|
||||
"type": 3,
|
||||
"api": "csp_AppSxGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "rfOb1uAWbkRHp7hdxprG9un3+TDC2t/rlTwlcMr+ChdbeV8Q9y9xsKxqfbtO0M05tGWcacFVm2c45jhyH6t1Rt6A6PjICGqxV+uN1uOqS2/x0Vp5J0Vfo8usQADpHg=="
|
||||
},
|
||||
{
|
||||
"key": "播客",
|
||||
"name": "🦊播客┃多线",
|
||||
"type": 3,
|
||||
"api": "csp_AppSxGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "rfOb1uAWbkRHp7hdxprG9un3+SPC3Nbv1SI/b5LtAUhbYkFU/DFvsLBvd/oV3cA4uGiCZNFRz3ln6nh5Q+AgDZiM5KrCAiO7S7SVzv31EG78jVB4JEMNrMPzTgWqRZdMTdR1smBWWwru"
|
||||
},
|
||||
{
|
||||
"key": "剧圈",
|
||||
"name": "🐻剧圈┃多线",
|
||||
"type": 3,
|
||||
"api": "csp_AppSxGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "rfOX1voDIQhH8epBwpmIsuSluiuZl4+/lm1iJsy3HwNWMxpf9CY77fshI+kByoxy7DyPatUZ1jk0ty1p"
|
||||
},
|
||||
{
|
||||
"key": "荐片",
|
||||
"name": "🥝荐片┃多线",
|
||||
"type": 3,
|
||||
"api": "csp_JPJGuard",
|
||||
"timeout": 10,
|
||||
"playerType": 2,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "奥特",
|
||||
"name": "🏝奥特┃多线",
|
||||
"type": 3,
|
||||
"api": "csp_AueteGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "新6V",
|
||||
"name": "🧲新6V┃磁力",
|
||||
"type": 3,
|
||||
"api": "csp_SixVGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": "https://www.xb6v.com/"
|
||||
},
|
||||
{
|
||||
"key": "咕咕",
|
||||
"name": "🦉咕咕┃动漫",
|
||||
"type": 3,
|
||||
"api": "csp_AppSxGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "rfOX1voDIQhH8epBwpmIsuS/sSCZxc/l0mxkeoroQVYOelMAvX1kuYptSLB36YxEjVawS9p37Cgo"
|
||||
},
|
||||
{
|
||||
"key": "Dm84",
|
||||
"name": "🚌巴士┃动漫",
|
||||
"type": 3,
|
||||
"api": "csp_Dm84Guard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "Anime1",
|
||||
"name": "🐾日本┃动漫",
|
||||
"type": 3,
|
||||
"api": "csp_Anime1Guard",
|
||||
"timeout": 10,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "看球",
|
||||
"name": "⚽八八┃看球",
|
||||
"type": 3,
|
||||
"api": "csp_KanqiuGuard",
|
||||
"timeout": 10,
|
||||
"searchable": 0,
|
||||
"changeable": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "多多",
|
||||
"name": "🏀多多┃看球",
|
||||
"type": 3,
|
||||
"api": "csp_DoubaoGuard",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "吃瓜",
|
||||
"name": "🏐吃瓜┃看球",
|
||||
"type": 3,
|
||||
"api": "csp_LiveGzGuard",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"style": {
|
||||
"type": "list"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "alllive",
|
||||
"name": "🎮一直播┃直播",
|
||||
"type": 3,
|
||||
"api": "csp_AllliveGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"timeout": 15,
|
||||
"playerType": "2",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": "uqGL1fpJNAUN8ORQgIPD+b6l+CzC2t8="
|
||||
},
|
||||
{
|
||||
"key": "MTV",
|
||||
"name": "🎶明星┃MV",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/5af5fbe12a88b7c45aa1c21e6551826c.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "有声小说",
|
||||
"name": "🎧有声┃小说",
|
||||
"type": 3,
|
||||
"api": "csp_Tingshu275Guard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "Aid",
|
||||
"name": "🚑急救┃教学",
|
||||
"type": 3,
|
||||
"api": "csp_FirstAidGuard",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 3.8
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "虎牙js",
|
||||
"name": "🐯虎牙┃直播",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"ext": "./js/虎牙.js",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.755
|
||||
},
|
||||
"timeout": 10,
|
||||
"playerType": "2",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "斗鱼js",
|
||||
"name": "🐟斗鱼┃直播",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"ext": "./js/斗鱼直播.js",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.755
|
||||
},
|
||||
"timeout": 10,
|
||||
"playerType": "2",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "抠搜",
|
||||
"name": "🍄抠抠┃搜搜",
|
||||
"type": 3,
|
||||
"api": "csp_KkSsGuard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "UC",
|
||||
"name": "🌈优汐┃搜搜",
|
||||
"type": 3,
|
||||
"api": "csp_UuSsGuard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "YpanSo",
|
||||
"name": "🐟盘她┃夸父",
|
||||
"type": 3,
|
||||
"api": "csp_YpanSoGuard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "BpanSo",
|
||||
"name": "🐞盘他┃嘟嘟",
|
||||
"type": 3,
|
||||
"api": "csp_BpanSoGuard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "push_agent",
|
||||
"name": "🛴手机┃推送",
|
||||
"type": 3,
|
||||
"api": "csp_PushGuard",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"ext": {
|
||||
"Cloud-drive": "http://127.0.0.1:9978/file/TVBox/Cloud-drive.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Bili",
|
||||
"name": "🅱哔哔合集┃弹幕",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/0075389dca9afadd4614e9713765ff17.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "Biliych",
|
||||
"name": "🅱哔哔演唱会┃弹幕",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/6496356286589c68f52c2f99c0c674c7.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "dr_兔小贝",
|
||||
"name": "📚儿童┃启蒙",
|
||||
"type": 3,
|
||||
"api": "./api/drpy2.min.js",
|
||||
"ext": "./js/兔小贝.js",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "少儿教育",
|
||||
"name": "📚少儿┃教育",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/89370c8ddf36b5e1beb4d71adb921bda.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "小学课堂",
|
||||
"name": "📚小学┃课堂",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/d7a21cf34ede56f5c686ecfba5fc7e3f.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "初中课堂",
|
||||
"name": "📚初中┃课堂",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/8f55d520f8d70056695740ef151744a7.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "高中教育",
|
||||
"name": "📚高中┃课堂",
|
||||
"type": 3,
|
||||
"api": "csp_BiliGuard",
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"json": "https://nos.netease.com/ysf/c66a4b5356141c49fd45ec51568017b4.txt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"key": "cc",
|
||||
"name": "请勿信视频中任何广告",
|
||||
"type": 3,
|
||||
"api": "csp_XPathGuard",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
}
|
||||
],
|
||||
"rules": [
|
||||
{
|
||||
"name": "cdn.ryplay",
|
||||
"hosts": [
|
||||
"cdn.ryplay"
|
||||
],
|
||||
"regex": [
|
||||
"5.480000",
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:5.480000,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXT-X-DISCONTINUITY\\s*\\r?\\n#EXTINF:5.320000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n(?:#EXTINF:[\\d.]+,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n)*?#EXTINF:3.360000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n#EXT-X-DISCONTINUITY",
|
||||
"#EXT-X-DISCONTINUITY\\s*\\r?\\n#EXTINF:4.000000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n(?:#EXTINF:[\\d.]+,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n)*?#EXTINF:0.560000,\\s*\\r?\\n.+\\.ts\\s*\\r?\\n#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"
|
||||
]
|
||||
}
|
||||
],
|
||||
"logo": "https://bdcache1-f1.v3mh.com/image/25-12-16/6941612717007.gif",
|
||||
"hosts": [
|
||||
"img1.wsyzy.org=fan.cloudflare.182682.xyz",
|
||||
"fiizvfck.top=fan.cloudflare.182682.xyz",
|
||||
"images.67c6c7a.com=fan.cloudflare.182682.xyz"
|
||||
],
|
||||
"lives": [
|
||||
{
|
||||
"name": "develop202",
|
||||
"type": 0,
|
||||
"url": "https://gh.927223.xyz/https://raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt",
|
||||
"playerType": 2,
|
||||
"epg": "http://diyp5.112114.xyz/?ch={name}&date={date}",
|
||||
"logo": "https://epg.112114.xyz/logo/{name}.png"
|
||||
},
|
||||
{
|
||||
"name": "Kimentanm",
|
||||
"type": 0,
|
||||
"url": "https://gh.927223.xyz/https://raw.githubusercontent.com/Kimentanm/aptv/master/m3u/iptv.m3u",
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"name": "范明明(需开启V6网络)",
|
||||
"type": 0,
|
||||
"url": "https://nos.netease.com/ysf/3d75a78a0fc7ede372c03598d6d10367.m3u",
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"name": "世界杯",
|
||||
"type": 0,
|
||||
"url": "http://82.156.243.185:33389/fwc.m3u",
|
||||
"playerType": 2
|
||||
},
|
||||
{
|
||||
"name": "虎牙一起看",
|
||||
"type": 0,
|
||||
"url": "https://sub.ottiptv.cc/huyayqk.m3u",
|
||||
"playerType": 2,
|
||||
"timeout": 10,
|
||||
"ua": "okHttp/Mod-1.5.0.0"
|
||||
},
|
||||
{
|
||||
"name": "斗鱼一起看",
|
||||
"type": 0,
|
||||
"url": "https://sub.ottiptv.cc/douyuyqk.m3u",
|
||||
"playerType": 2,
|
||||
"timeout": 10,
|
||||
"ua": "okHttp/Mod-1.5.0.0"
|
||||
},
|
||||
{
|
||||
"name": "B站直播",
|
||||
"type": 0,
|
||||
"url": "https://sub.ottiptv.cc/bililive.m3u",
|
||||
"playerType": 2,
|
||||
"timeout": 10,
|
||||
"ua": "okHttp/Mod-1.5.0.0"
|
||||
},
|
||||
{
|
||||
"name": "YY轮播",
|
||||
"type": 0,
|
||||
"url": "https://sub.ottiptv.cc/yylunbo.m3u",
|
||||
"playerType": 2,
|
||||
"timeout": 10,
|
||||
"ua": "okHttp/Mod-1.5.0.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
+1
File diff suppressed because one or more lines are too long
Vendored
+3201
@@ -0,0 +1,3201 @@
|
||||
import {
|
||||
cheerio,
|
||||
模板
|
||||
} from "./drpy-core-lite.min.js";
|
||||
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
|
||||
const VERSION = vercode + " 3.9.52beta3 20250801";
|
||||
const UpdateInfo = [{
|
||||
date: "20250801",
|
||||
title: "drpy依赖更新,使用drpy-core-lite.min.js",
|
||||
version: "3.9.52beta3 20250801",
|
||||
msg: `
|
||||
drpy-core.min.js 更换为更小的drpy-core-lite.min.js
|
||||
|
||||
`
|
||||
}, {
|
||||
date: "20250729",
|
||||
title: "drpy更新,所有依赖打包成一个js文件",
|
||||
version: "3.9.52beta2 20250729",
|
||||
msg: `
|
||||
1. wasm支持
|
||||
2. 引入 TextEncoder、TextDecoder对象
|
||||
3. 引入 WXXH 加解密库
|
||||
4. 所有依赖打包成一个js
|
||||
5. 增加 buildQueryString
|
||||
|
||||
`
|
||||
}, {
|
||||
date: "20250728",
|
||||
title: "drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",
|
||||
version: "3.9.52beta1 20250728",
|
||||
msg: `
|
||||
1. 增加tab_order线路模糊排序
|
||||
2. 优化解密算法支持文件头
|
||||
3. wasm支持
|
||||
4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释
|
||||
5. 引入 TextEncoder、TextDecoder对象
|
||||
6. 引入 WXXH 加解密库
|
||||
`
|
||||
}, {
|
||||
date: "20241126",
|
||||
title: "drpy更新,优化去广告算法",
|
||||
version: "3.9.51beta6 20241126",
|
||||
msg: `
|
||||
1. 更新龙头大佬提供的去广告算法
|
||||
`
|
||||
}, {
|
||||
date: "20241104",
|
||||
title: "drpy更新,增加新特性",
|
||||
version: "3.9.51beta5 20241104",
|
||||
msg: `
|
||||
1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码'
|
||||
2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能,超过1页直接返回空
|
||||
`
|
||||
}];
|
||||
|
||||
function getUpdateInfo() {
|
||||
return UpdateInfo.map(_o => {
|
||||
_o.msg = _o.msg.trim().split("\n").map(_it => _it.trim()).join("\n");
|
||||
return _o
|
||||
})
|
||||
}
|
||||
|
||||
function init_test() {
|
||||
console.log("init_test_start");
|
||||
console.log("当前版本号:" + VERSION);
|
||||
console.log("本地代理地址:" + getProxyUrl());
|
||||
console.log(RKEY);
|
||||
console.log(JSON.stringify(rule));
|
||||
console.log("init_test_end")
|
||||
}
|
||||
|
||||
function ocr_demo_test() {
|
||||
let img_base64 = `iVBORw0KGgoAAAANSUhEUgAAAIAAAAAoBAMAAADEX+97AAAAG1BMVEXz+/4thQTa7N6QwIFFkyNeokKozqDB3b93sWHFR+MEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABN0lEQVRIie2TQU+DQBCFt9vScvQpxR4xrcSjJCZ67JDGXsX+AdR4B3vpsSYm/m2HXaRLmuySepR3Gdidb/btDAjRq5dT96eCMlfBuzi1QLZUoZy2yz5sOvI+9iomaPEZ6nWnEtxqIyiM1RcAy44GNDhBXUjot/VVNweV1ah68FqWRyjKIOqAcyYF6rGcmpYnHzGt3fycNoMw0d3/THFu7hFSJ/8OXO6iTM8/KSg09obAzIHLO250LgQ0txOZSfgrV4Exdw98uGycJ0ErAeExZGhOmFHV9zHO6qVSj0MpLq7xZON56o++MjlsEgfVhbQWWME+xQX7J4V6zfi9A1Ly9rP1BvEXp+BbVJ/M77n+wfOIDVp51pZ4iBxvmj9AGrtvry6emwfKnVkW+ZRKd5ZNMvob36vXP9YPDmQki8QiCFAAAAAASUVORK5CYII=`;
|
||||
OcrApi.api = OCR_API;
|
||||
let code = OcrApi.classification(img_base64);
|
||||
log("测试验证码图片的ocr识别结果为:" + code)
|
||||
}
|
||||
|
||||
function rsa_demo_test() {
|
||||
let t1 = (new Date).getTime();
|
||||
let pkcs1_public = `
|
||||
-----BEGIN RSA PUBLIC KEY-----
|
||||
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy
|
||||
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE=
|
||||
-----END RSA PUBLIC KEY-----
|
||||
`.trim();
|
||||
let pkcs1_public_pem = `
|
||||
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy
|
||||
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE=
|
||||
`.trim();
|
||||
let pkcs8_public = `
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/
|
||||
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
|
||||
-----END PUBLIC KEY-----`.trim();
|
||||
let pkcs8_public_pem = `
|
||||
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/
|
||||
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
|
||||
`.trim();
|
||||
let pkcs1_private = `
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIBOAIBAAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/nas61fIPGUUrkPenokm7
|
||||
ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQI/b6OV1z65UokQaMvSeRXt
|
||||
0Yv6wiYtduQI9qpq5nzy/ytaqsbBfClNTi/HifKPKxlRouWFkc518EQI8LBxoarJ
|
||||
AiEA4DaONMplV8PQNa3TKn2F+SDEvLOCjdL0kHKdN90Ti28CIQDDZnTBaHgZwZbA
|
||||
hS7Bbf5yvwjWMhO6Y7l04/Qm7R+35QIgPuQuqXIoUSD080mp1N5WyRW++atksIF+
|
||||
5lGv9e6GP/MCICnj8y/rl6Pd7tXDN6zcSeqLrfdNsREKhB3dKOCXgW9JAiAFYtFS
|
||||
EJNBXVRTK42SNsZ2hJ/9xLwOwnH2epT8Q43s3Q==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
`.trim();
|
||||
let pkcs8_private = `
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAqyNKUPxEUaSdzrtf
|
||||
dFyXnRavOOpw2D+dqzrV8g8ZRSuQ96eiSbtkcLCsMpbEPcWNMWD6UWVGSjBHke3v
|
||||
YJkTSwIDAQABAj9vo5XXPrlSiRBoy9J5Fe3Ri/rCJi125Aj2qmrmfPL/K1qqxsF8
|
||||
KU1OL8eJ8o8rGVGi5YWRznXwRAjwsHGhqskCIQDgNo40ymVXw9A1rdMqfYX5IMS8
|
||||
s4KN0vSQcp033ROLbwIhAMNmdMFoeBnBlsCFLsFt/nK/CNYyE7pjuXTj9CbtH7fl
|
||||
AiA+5C6pcihRIPTzSanU3lbJFb75q2SwgX7mUa/17oY/8wIgKePzL+uXo93u1cM3
|
||||
rNxJ6out902xEQqEHd0o4JeBb0kCIAVi0VIQk0FdVFMrjZI2xnaEn/3EvA7CcfZ6
|
||||
lPxDjezd
|
||||
-----END PRIVATE KEY-----
|
||||
`.trim();
|
||||
let data = `
|
||||
NodeRsa
|
||||
这是node-rsa 现在修改集成在drpy里使用`.trim();
|
||||
let encryptedWithPublic = NODERSA.encryptRSAWithPublicKey(data, pkcs1_public, {
|
||||
outputEncoding: "base64",
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: "pkcs1_oaep"
|
||||
}
|
||||
});
|
||||
console.log("公钥加密");
|
||||
console.log(encryptedWithPublic);
|
||||
let decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey(encryptedWithPublic, pkcs1_private, {
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: "pkcs1_oaep"
|
||||
}
|
||||
});
|
||||
console.log("私钥解密");
|
||||
console.log(decryptedWithPrivate);
|
||||
let pkcs1_sha256_sign = NODERSA.sign("1", pkcs1_private, {
|
||||
outputEncoding: "base64",
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: "pkcs1",
|
||||
signingScheme: "pkcs1-sha256"
|
||||
}
|
||||
});
|
||||
console.log("pkcs1_sha256_sign");
|
||||
console.log(pkcs1_sha256_sign);
|
||||
let pkcs1_sha256_sign_verify = NODERSA.verify("1", "Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==", pkcs1_private, {
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: "pkcs1",
|
||||
signingScheme: "pkcs1-sha256"
|
||||
}
|
||||
});
|
||||
console.log("pkcs1_sha256_sign_verify");
|
||||
console.log(pkcs1_sha256_sign_verify);
|
||||
let pkcs1_oaep_sha256 = NODERSA.encryptRSAWithPublicKey(data, `-----BEGIN RSA PUBLIC KEY-----
|
||||
MIIBCgKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7IsT1du
|
||||
SYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7Sxhdm
|
||||
kte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy3zD8
|
||||
PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+HP+m
|
||||
PfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEAApRb
|
||||
Dd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQAB
|
||||
-----END RSA PUBLIC KEY-----
|
||||
`, {
|
||||
outputEncoding: "base64",
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: {
|
||||
scheme: "pkcs1_oaep",
|
||||
hash: "sha256"
|
||||
}
|
||||
}
|
||||
});
|
||||
console.log("pkcs1_oaep_sha256");
|
||||
console.log(pkcs1_oaep_sha256);
|
||||
decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey("kSZesAAyYh2hdsQnYMdGqb6gKAzTauBKouvBzWcc4+F8RvGd0nwO6mVkUMVilPgUuNxjEauHayHiY8gI3Py45UI3+km0rSGyHrS6dHiHgCkMejXHieglYzAB0IxX3Jkm4z/66bdB/D+GFy0oct5fGCMI1UHPjEAYOsazJDa8lBFNbjiWFeb/qiZtIx3vGM7KYPAZzyRf/zPbbQ8zy9xOmRuOl5nnIxgo0Okp3KO/RIPO4GZOSBA8f2lx1UtNwwrXAMpcNavtoqHVcjJ/9lcotXYQFrn5b299pSIRf2gVm8ZJ31SK6Z8cc14nKtvgnmsgClDzIXJ1o1RcDK+knVAySg==", `-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpAIBAAKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7Is
|
||||
T1duSYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7S
|
||||
xhdmkte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy
|
||||
3zD8PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+
|
||||
HP+mPfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEA
|
||||
ApRbDd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQABAoIBADZ/QGgUzInvsLp/
|
||||
zO2WbfYm39o/uhNAvk9RbLt1TIZbMFhyOpeKynHi3Swwd9xsfWX/U9zS/lGi/m31
|
||||
iKrhmaW4OA1G3vqpMcK7TBbFufYwUEaA+ZJX344euH8pIfdzyneMQ4z3Far2dS7l
|
||||
QsmjuilVV2kEFadveXewiYoVOWCu00w6bN8wy2SIHlQn+kIL6HQhWz12iKKflIKu
|
||||
eGRdzLHsKmBt6WbY1Wuhx7HU0fAKdlBDPxCHNlI+kybUYE9o5C2vJiaVM5wqJBgZ
|
||||
8Dz8kt1QbLJ910JoLXkLVQ8uC8NJKQwFtqQjTGPnEq0+wbgz6Ij599rKZkwW/xq9
|
||||
l6KoUiECgYEA6Ah42tVdkNW047f03xVYXFH96RgorHRS36mR8Y+ONUq1fwKidovC
|
||||
WjwVujt4OPf3l1W6iyn/F6cu/bsmvPrSc3HTN0B1V31QK4OjgetxQ2PSbTldH02J
|
||||
NPzkt+v+cPxXpx/P5mgt7Weefw5txU547KubGrHUV5rBKFtIx9pj16MCgYEA/EF0
|
||||
o19+D24DZAPwlDS5VbEd7FStnwY4oQ5PqbuNOSbSJLMWU0AqzXcRokp8UTyCZ0X3
|
||||
ATkS1REq97kShCuR+npTR6a6DlY7sdpPI1SMLNajgB2tkx0EOzX+PfNIbHUd4jpJ
|
||||
I0ZMAHv/OOtkzQHDaeTWBTrzsWm6/nTiykfduNECgYEA46AMD4HpPECqKAs66e5i
|
||||
tI6q7JSKskObWVdcmQEfnSAhVOwcvPb2Ptda6UuV8S0xcwDi88rLOUUFUFzc79+P
|
||||
vTkY38cYVi/VChsluDpk7ptqv0PbGu5Rf+3n4pZdEjI7OvR2W64wAAn67uIUxc7p
|
||||
yiO/ET0K9rYWb6S9jXGtKMkCgYEA2kPAqoO7zZoBMQ7/oR0lp/HC1HRIbiqx4RlC
|
||||
8Lgpb+QZPEwA6zPAVVvLVENi4d+bbcRp/xLlKpraNNJcJSSWAMbLPFoU7sbKjA87
|
||||
HnTPfRSTEA2d3Ibk3F7Rh8TzS3Ti0JZiJjVzGZAwu41iAMifzwaD8K6boUy80eNN
|
||||
QH2CaaECgYBUsLYvC/MiYg3w+LGOONuQongoVUXjGqnw2bjVa9RK7lwRdXPUqJ51
|
||||
MpVO98IkoLvGSI/0sGNP3GKNhC+eMGjJAVwFyEuOn+JsmMv9Y9uStIVi5tIHIhKw
|
||||
m7mp8il0kaftHdSxTbspG3tZ2fjIiFIZkLEOmRpd7ogWumgOajzUdA==
|
||||
-----END RSA PRIVATE KEY-----`, {
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: "pkcs1_oaep"
|
||||
}
|
||||
});
|
||||
console.log("decryptedWithPrivate");
|
||||
console.log(decryptedWithPrivate);
|
||||
(() => {
|
||||
let key = new NODERSA.NodeRSA({
|
||||
b: 1024
|
||||
});
|
||||
key.setOptions({
|
||||
encryptionScheme: "pkcs1"
|
||||
});
|
||||
let text = `你好drpy node-ras`;
|
||||
let encrypted = key.encrypt(text, "base64");
|
||||
console.log("encrypted: ", encrypted);
|
||||
const decrypted = key.decrypt(encrypted, "utf8");
|
||||
console.log("decrypted: ", decrypted)
|
||||
})();
|
||||
let t2 = (new Date).getTime();
|
||||
console.log("rsa_demo_test 测试耗时:" + (t2 - t1) + "毫秒")
|
||||
}
|
||||
|
||||
function pre() {
|
||||
if (typeof rule.预处理 === "string" && rule.预处理 && rule.预处理.trim()) {
|
||||
let code = rule.预处理.trim();
|
||||
console.log("执行预处理代码:" + code);
|
||||
if (code.startsWith("js:")) {
|
||||
code = code.replace("js:", "")
|
||||
}
|
||||
try {
|
||||
eval(code)
|
||||
} catch (e) {
|
||||
console.log(`预处理执行失败:${e.message}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
let rule = {};
|
||||
const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
|
||||
const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";
|
||||
const UA = "Mozilla/5.0";
|
||||
const UC_UA = "Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";
|
||||
const IOS_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";
|
||||
const RULE_CK = "cookie";
|
||||
const CATE_EXCLUDE = "首页|留言|APP|下载|资讯|新闻|动态";
|
||||
const TAB_EXCLUDE = "猜你|喜欢|下载|剧情|榜|评论";
|
||||
const OCR_RETRY = 3;
|
||||
const OCR_API = "https://api.nn.ci/ocr/b64/text";
|
||||
if (typeof MY_URL === "undefined") {
|
||||
var MY_URL
|
||||
}
|
||||
var HOST;
|
||||
var RKEY;
|
||||
var fetch;
|
||||
var print;
|
||||
var log;
|
||||
var rule_fetch_params;
|
||||
var fetch_params;
|
||||
var oheaders;
|
||||
var _pdfh;
|
||||
var _pdfa;
|
||||
var _pd;
|
||||
const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
|
||||
const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
|
||||
const NOADD_INDEX = /:eq|:lt|:gt|:first|:last|^body$|^#/;
|
||||
const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$|^(data-|url-|src-)/;
|
||||
const SELECT_REGEX = /:eq|:lt|:gt|#/g;
|
||||
const SELECT_REGEX_A = /:eq|:lt|:gt/g;
|
||||
const $js = {
|
||||
toString(func) {
|
||||
let strfun = func.toString();
|
||||
return strfun.replace(/^\(\)(\s+)?=>(\s+)?\{/, "js:").replace(/\}$/, "")
|
||||
}
|
||||
};
|
||||
|
||||
function window_b64() {
|
||||
let b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
let base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 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, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
|
||||
|
||||
function btoa(str) {
|
||||
var out, i, len;
|
||||
var c1, c2, c3;
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while (i < len) {
|
||||
c1 = str.charCodeAt(i++) & 255;
|
||||
if (i == len) {
|
||||
out += b64map.charAt(c1 >> 2);
|
||||
out += b64map.charAt((c1 & 3) << 4);
|
||||
out += "==";
|
||||
break
|
||||
}
|
||||
c2 = str.charCodeAt(i++);
|
||||
if (i == len) {
|
||||
out += b64map.charAt(c1 >> 2);
|
||||
out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4);
|
||||
out += b64map.charAt((c2 & 15) << 2);
|
||||
out += "=";
|
||||
break
|
||||
}
|
||||
c3 = str.charCodeAt(i++);
|
||||
out += b64map.charAt(c1 >> 2);
|
||||
out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4);
|
||||
out += b64map.charAt((c2 & 15) << 2 | (c3 & 192) >> 6);
|
||||
out += b64map.charAt(c3 & 63)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
function atob(str) {
|
||||
var c1, c2, c3, c4;
|
||||
var i, len, out;
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while (i < len) {
|
||||
do {
|
||||
c1 = base64DecodeChars[str.charCodeAt(i++) & 255]
|
||||
} while (i < len && c1 == -1);
|
||||
if (c1 == -1) break;
|
||||
do {
|
||||
c2 = base64DecodeChars[str.charCodeAt(i++) & 255]
|
||||
} while (i < len && c2 == -1);
|
||||
if (c2 == -1) break;
|
||||
out += String.fromCharCode(c1 << 2 | (c2 & 48) >> 4);
|
||||
do {
|
||||
c3 = str.charCodeAt(i++) & 255;
|
||||
if (c3 == 61) return out;
|
||||
c3 = base64DecodeChars[c3]
|
||||
} while (i < len && c3 == -1);
|
||||
if (c3 == -1) break;
|
||||
out += String.fromCharCode((c2 & 15) << 4 | (c3 & 60) >> 2);
|
||||
do {
|
||||
c4 = str.charCodeAt(i++) & 255;
|
||||
if (c4 == 61) return out;
|
||||
c4 = base64DecodeChars[c4]
|
||||
} while (i < len && c4 == -1);
|
||||
if (c4 == -1) break;
|
||||
out += String.fromCharCode((c3 & 3) << 6 | c4)
|
||||
}
|
||||
return out
|
||||
}
|
||||
return {
|
||||
atob: atob,
|
||||
btoa: btoa
|
||||
}
|
||||
}
|
||||
if (typeof atob !== "function" || typeof btoa !== "function") {
|
||||
var {
|
||||
atob,
|
||||
btoa
|
||||
} = window_b64()
|
||||
}
|
||||
if (typeof Object.assign !== "function") {
|
||||
Object.assign = function() {
|
||||
let target = arguments[0];
|
||||
for (let i = 1; i < arguments.length; i++) {
|
||||
let source = arguments[i];
|
||||
for (let key in source) {
|
||||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||
target[key] = source[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
return target
|
||||
}
|
||||
}
|
||||
if (!String.prototype.includes) {
|
||||
String.prototype.includes = function(search, start) {
|
||||
if (typeof start !== "number") {
|
||||
start = 0
|
||||
}
|
||||
if (start + search.length > this.length) {
|
||||
return false
|
||||
} else {
|
||||
return this.indexOf(search, start) !== -1
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!Array.prototype.includes) {
|
||||
Object.defineProperty(Array.prototype, "includes", {
|
||||
value: function(searchElement, fromIndex) {
|
||||
if (this == null) {
|
||||
throw new TypeError('"this" is null or not defined')
|
||||
}
|
||||
var o = Object(this);
|
||||
var len = o.length >>> 0;
|
||||
if (len === 0) {
|
||||
return false
|
||||
}
|
||||
var n = fromIndex | 0;
|
||||
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
||||
while (k < len) {
|
||||
if (o[k] === searchElement) {
|
||||
return true
|
||||
}
|
||||
k++
|
||||
}
|
||||
return false
|
||||
},
|
||||
enumerable: false
|
||||
})
|
||||
}
|
||||
if (typeof String.prototype.startsWith !== "function") {
|
||||
String.prototype.startsWith = function(prefix) {
|
||||
return this.slice(0, prefix.length) === prefix
|
||||
}
|
||||
}
|
||||
if (typeof String.prototype.endsWith !== "function") {
|
||||
String.prototype.endsWith = function(suffix) {
|
||||
return this.indexOf(suffix, this.length - suffix.length) !== -1
|
||||
}
|
||||
}
|
||||
Object.defineProperty(Object.prototype, "myValues", {
|
||||
value: function(obj) {
|
||||
if (obj == null) {
|
||||
throw new TypeError("Cannot convert undefined or null to object")
|
||||
}
|
||||
var res = [];
|
||||
for (var k in obj) {
|
||||
if (obj.hasOwnProperty(k)) {
|
||||
res.push(obj[k])
|
||||
}
|
||||
}
|
||||
return res
|
||||
},
|
||||
enumerable: false
|
||||
});
|
||||
if (typeof Object.prototype.values !== "function") {
|
||||
Object.defineProperty(Object.prototype, "values", {
|
||||
value: function(obj) {
|
||||
if (obj == null) {
|
||||
throw new TypeError("Cannot convert undefined or null to object")
|
||||
}
|
||||
var res = [];
|
||||
for (var k in obj) {
|
||||
if (obj.hasOwnProperty(k)) {
|
||||
res.push(obj[k])
|
||||
}
|
||||
}
|
||||
return res
|
||||
},
|
||||
enumerable: false
|
||||
})
|
||||
}
|
||||
if (typeof Array.prototype.join !== "function") {
|
||||
Object.defineProperty(Array.prototype, "join", {
|
||||
value: function(emoji) {
|
||||
emoji = emoji || "";
|
||||
let self = this;
|
||||
let str = "";
|
||||
let i = 0;
|
||||
if (!Array.isArray(self)) {
|
||||
throw String(self) + "is not Array"
|
||||
}
|
||||
if (self.length === 0) {
|
||||
return ""
|
||||
}
|
||||
if (self.length === 1) {
|
||||
return String(self[0])
|
||||
}
|
||||
i = 1;
|
||||
str = this[0];
|
||||
for (; i < self.length; i++) {
|
||||
str += String(emoji) + String(self[i])
|
||||
}
|
||||
return str
|
||||
},
|
||||
enumerable: false
|
||||
})
|
||||
}
|
||||
if (typeof Array.prototype.toReversed !== "function") {
|
||||
Object.defineProperty(Array.prototype, "toReversed", {
|
||||
value: function() {
|
||||
const clonedList = this.slice();
|
||||
const reversedList = clonedList.reverse();
|
||||
return reversedList
|
||||
},
|
||||
enumerable: false
|
||||
})
|
||||
}
|
||||
Object.defineProperty(Array.prototype, "append", {
|
||||
value: Array.prototype.push,
|
||||
enumerable: false
|
||||
});
|
||||
Object.defineProperty(String.prototype, "strip", {
|
||||
value: String.prototype.trim,
|
||||
enumerable: false
|
||||
});
|
||||
Object.defineProperty(String.prototype, "rstrip", {
|
||||
value: function(chars) {
|
||||
let regex = new RegExp(chars + "$");
|
||||
return this.replace(regex, "")
|
||||
},
|
||||
enumerable: false
|
||||
});
|
||||
|
||||
function 是否正版(vipUrl) {
|
||||
let flag = new RegExp("qq.com|iqiyi.com|youku.com|mgtv.com|bilibili.com|sohu.com|ixigua.com|pptv.com|miguvideo.com|le.com|1905.com|fun.tv");
|
||||
return flag.test(vipUrl)
|
||||
}
|
||||
|
||||
function urlDeal(vipUrl) {
|
||||
if (!vipUrl) {
|
||||
return ""
|
||||
}
|
||||
if (!是否正版(vipUrl)) {
|
||||
return vipUrl
|
||||
}
|
||||
if (!/miguvideo/.test(vipUrl)) {
|
||||
vipUrl = vipUrl.split("#")[0].split("?")[0]
|
||||
}
|
||||
return vipUrl
|
||||
}
|
||||
|
||||
function setResult(d) {
|
||||
if (!Array.isArray(d)) {
|
||||
return []
|
||||
}
|
||||
VODS = [];
|
||||
d.forEach(function(it) {
|
||||
let obj = {
|
||||
vod_id: it.url || "",
|
||||
vod_name: it.title || "",
|
||||
vod_remarks: it.desc || "",
|
||||
vod_content: it.content || "",
|
||||
vod_pic: it.pic_url || it.img || ""
|
||||
};
|
||||
let keys = Object.keys(it);
|
||||
if (keys.includes("tname")) {
|
||||
obj.type_name = it.tname || ""
|
||||
}
|
||||
if (keys.includes("tid")) {
|
||||
obj.type_id = it.tid || ""
|
||||
}
|
||||
if (keys.includes("year")) {
|
||||
obj.vod_year = it.year || ""
|
||||
}
|
||||
if (keys.includes("actor")) {
|
||||
obj.vod_actor = it.actor || ""
|
||||
}
|
||||
if (keys.includes("director")) {
|
||||
obj.vod_director = it.director || ""
|
||||
}
|
||||
if (keys.includes("area")) {
|
||||
obj.vod_area = it.area || ""
|
||||
}
|
||||
VODS.push(obj)
|
||||
});
|
||||
return VODS
|
||||
}
|
||||
|
||||
function setResult2(res) {
|
||||
VODS = res.list || [];
|
||||
return VODS
|
||||
}
|
||||
|
||||
function setHomeResult(res) {
|
||||
if (!res || typeof res !== "object") {
|
||||
return []
|
||||
}
|
||||
return setResult(res.list)
|
||||
}
|
||||
|
||||
function rc(js) {
|
||||
if (js === "maomi_aes.js") {
|
||||
var a = CryptoJS.enc.Utf8.parse("625222f9149e961d");
|
||||
var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330");
|
||||
return {
|
||||
De: function(word) {
|
||||
word = CryptoJS.enc.Hex.parse(word);
|
||||
return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, {
|
||||
iv: t,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8)
|
||||
},
|
||||
En: function(word) {
|
||||
var Encrypted = CryptoJS.AES.encrypt(word, a, {
|
||||
iv: t,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
return Encrypted.ciphertext.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
return {}
|
||||
}
|
||||
|
||||
function maoss(jxurl, ref, key) {
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
eval(getCryptoJS());
|
||||
try {
|
||||
var getVideoInfo = function(text) {
|
||||
return CryptoJS.AES.decrypt(text, key, {
|
||||
iv: iv,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8)
|
||||
};
|
||||
var token_key = key == undefined ? "dvyYRQlnPRCMdQSe" : key;
|
||||
if (ref) {
|
||||
var html = request(jxurl, {
|
||||
headers: {
|
||||
Referer: ref
|
||||
}
|
||||
})
|
||||
} else {
|
||||
var html = request(jxurl)
|
||||
}
|
||||
if (html.indexOf("&btwaf=") != -1) {
|
||||
html = request(jxurl + "&btwaf" + html.match(/&btwaf(.*?)"/)[1], {
|
||||
headers: {
|
||||
Referer: ref
|
||||
}
|
||||
})
|
||||
}
|
||||
var token_iv = html.split('_token = "')[1].split('"')[0];
|
||||
var key = CryptoJS.enc.Utf8.parse(token_key);
|
||||
var iv = CryptoJS.enc.Utf8.parse(token_iv);
|
||||
eval(html.match(/var config = {[\s\S]*?}/)[0] + "");
|
||||
if (!config.url.startsWith("http")) {
|
||||
config.url = CryptoJS.AES.decrypt(config.url, key, {
|
||||
iv: iv,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
return config.url
|
||||
} catch (e) {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
function urlencode(str) {
|
||||
str = (str + "").toString();
|
||||
return encodeURIComponent(str).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/%20/g, "+")
|
||||
}
|
||||
|
||||
function encodeUrl(str) {
|
||||
if (typeof encodeURI == "function") {
|
||||
return encodeURI(str)
|
||||
} else {
|
||||
str = (str + "").toString();
|
||||
return encodeURIComponent(str).replace(/%2F/g, "/").replace(/%3F/g, "?").replace(/%3A/g, ":").replace(/%40/g, "@").replace(/%3D/g, "=").replace(/%3A/g, ":").replace(/%2C/g, ",").replace(/%2B/g, "+").replace(/%24/g, "$")
|
||||
}
|
||||
}
|
||||
|
||||
function base64Encode(text) {
|
||||
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))
|
||||
}
|
||||
|
||||
function base64Decode(text) {
|
||||
return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))
|
||||
}
|
||||
|
||||
function md5(text) {
|
||||
return CryptoJS.MD5(text).toString()
|
||||
}
|
||||
|
||||
function uint8ArrayToBase64(uint8Array) {
|
||||
let binaryString = String.fromCharCode.apply(null, Array.from(uint8Array));
|
||||
return btoa(binaryString)
|
||||
}
|
||||
|
||||
function Utf8ArrayToStr(array) {
|
||||
var out, i, len, c;
|
||||
var char2, char3;
|
||||
out = "";
|
||||
len = array.length;
|
||||
i = 0;
|
||||
while (i < len) {
|
||||
c = array[i++];
|
||||
switch (c >> 4) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
out += String.fromCharCode(c);
|
||||
break;
|
||||
case 12:
|
||||
case 13:
|
||||
char2 = array[i++];
|
||||
out += String.fromCharCode((c & 31) << 6 | char2 & 63);
|
||||
break;
|
||||
case 14:
|
||||
char2 = array[i++];
|
||||
char3 = array[i++];
|
||||
out += String.fromCharCode((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0);
|
||||
break
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
function gzip(str) {
|
||||
let arr = pako.gzip(str, {});
|
||||
return uint8ArrayToBase64(arr)
|
||||
}
|
||||
|
||||
function ungzip(b64Data) {
|
||||
let strData = atob(b64Data);
|
||||
const charData = strData.split("").map(function(x) {
|
||||
return x.charCodeAt(0)
|
||||
});
|
||||
const binData = new Uint8Array(charData);
|
||||
const data = pako.inflate(binData);
|
||||
return Utf8ArrayToStr(data)
|
||||
}
|
||||
|
||||
function encodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
input = gbkTool.encode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
|
||||
function decodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
input = gbkTool.decode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
|
||||
function getCryptoJS() {
|
||||
return 'console.log("CryptoJS已装载");'
|
||||
}
|
||||
const RSA = {
|
||||
decode: function(data, key, option) {
|
||||
option = option || {};
|
||||
if (typeof JSEncrypt === "function") {
|
||||
let chunkSize = option.chunkSize || 117;
|
||||
let privateKey = this.getPrivateKey(key);
|
||||
const decryptor = new JSEncrypt;
|
||||
decryptor.setPrivateKey(privateKey);
|
||||
let uncrypted = "";
|
||||
uncrypted = decryptor.decryptUnicodeLong(data);
|
||||
return uncrypted
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
},
|
||||
encode: function(data, key, option) {
|
||||
option = option || {};
|
||||
if (typeof JSEncrypt === "function") {
|
||||
let chunkSize = option.chunkSize || 117;
|
||||
let publicKey = this.getPublicKey(key);
|
||||
const encryptor = new JSEncrypt;
|
||||
encryptor.setPublicKey(publicKey);
|
||||
let encrypted = "";
|
||||
encrypted = encryptor.encryptUnicodeLong(data);
|
||||
return encrypted
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
},
|
||||
fixKey(key, prefix, endfix) {
|
||||
if (!key.includes(prefix)) {
|
||||
key = prefix + key
|
||||
}
|
||||
if (!key.includes(endfix)) {
|
||||
key += endfix
|
||||
}
|
||||
return key
|
||||
},
|
||||
getPrivateKey(key) {
|
||||
let prefix = "-----BEGIN RSA PRIVATE KEY-----";
|
||||
let endfix = "-----END RSA PRIVATE KEY-----";
|
||||
return this.fixKey(key, prefix, endfix)
|
||||
},
|
||||
getPublicKey(key) {
|
||||
let prefix = "-----BEGIN PUBLIC KEY-----";
|
||||
let endfix = "-----END PUBLIC KEY-----";
|
||||
return this.fixKey(key, prefix, endfix)
|
||||
}
|
||||
};
|
||||
|
||||
function getProxyUrl() {
|
||||
if (typeof getProxy === "function") {
|
||||
return getProxy(true)
|
||||
} else {
|
||||
return "http://127.0.0.1:9978/proxy?do=js"
|
||||
}
|
||||
}
|
||||
|
||||
function fixAdM3u8(m3u8_text, m3u8_url, ad_remove) {
|
||||
if (!m3u8_text && !m3u8_url || !m3u8_text && m3u8_url && !m3u8_url.startsWith("http")) {
|
||||
return ""
|
||||
}
|
||||
if (!m3u8_text) {
|
||||
log("m3u8_url:" + m3u8_url);
|
||||
m3u8_text = request(m3u8_url)
|
||||
}
|
||||
log("len(m3u8_text):" + m3u8_text.length);
|
||||
if (!ad_remove) {
|
||||
return m3u8_text
|
||||
}
|
||||
if (ad_remove.startsWith("reg:")) {
|
||||
ad_remove = ad_remove.slice(4)
|
||||
} else if (ad_remove.startsWith("js:")) {
|
||||
ad_remove = ad_remove.slice(3)
|
||||
}
|
||||
let m3u8_start = m3u8_text.slice(0, m3u8_text.indexOf("#EXTINF")).trim();
|
||||
let m3u8_body = m3u8_text.slice(m3u8_text.indexOf("#EXTINF"), m3u8_text.indexOf("#EXT-X-ENDLIST")).trim();
|
||||
let m3u8_end = m3u8_text.slice(m3u8_text.indexOf("#EXT-X-ENDLIST")).trim();
|
||||
let murls = [];
|
||||
let m3_body_list = m3u8_body.split("\n");
|
||||
let m3_len = m3_body_list.length;
|
||||
let i = 0;
|
||||
while (i < m3_len) {
|
||||
let mi = m3_body_list[i];
|
||||
let mi_1 = m3_body_list[i + 1];
|
||||
if (mi.startsWith("#EXTINF")) {
|
||||
murls.push([mi, mi_1].join("&"));
|
||||
i += 2
|
||||
} else if (mi.startsWith("#EXT-X-DISCONTINUITY")) {
|
||||
let mi_2 = m3_body_list[i + 2];
|
||||
murls.push([mi, mi_1, mi_2].join("&"));
|
||||
i += 3
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
let new_m3u8_body = [];
|
||||
for (let murl of murls) {
|
||||
if (ad_remove && new RegExp(ad_remove).test(murl)) {} else {
|
||||
let murl_list = murl.split("&");
|
||||
if (!murl_list[murl_list.length - 1].startsWith("http") && m3u8_url.startsWith("http")) {
|
||||
murl_list[murl_list.length - 1] = urljoin(m3u8_url, murl_list[murl_list.length - 1])
|
||||
}
|
||||
murl_list.forEach(it => {
|
||||
new_m3u8_body.push(it)
|
||||
})
|
||||
}
|
||||
}
|
||||
new_m3u8_body = new_m3u8_body.join("\n").trim();
|
||||
m3u8_text = [m3u8_start, new_m3u8_body, m3u8_end].join("\n").trim();
|
||||
return m3u8_text
|
||||
}
|
||||
|
||||
function fixAdM3u8Ai(m3u8_url, headers) {
|
||||
let ts = (new Date).getTime();
|
||||
let option = headers ? {
|
||||
headers: headers
|
||||
} : {};
|
||||
|
||||
function b(s1, s2) {
|
||||
let i = 0;
|
||||
while (i < s1.length) {
|
||||
if (s1[i] !== s2[i]) {
|
||||
break
|
||||
}
|
||||
i++
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
function reverseString(str) {
|
||||
return str.split("").reverse().join("")
|
||||
}
|
||||
let m3u8 = request(m3u8_url, option);
|
||||
m3u8 = m3u8.trim().split("\n").map(it => it.startsWith("#") ? it : urljoin(m3u8_url, it)).join("\n");
|
||||
m3u8 = m3u8.replace(/\n\n/gi, "\n");
|
||||
let last_url = m3u8.split("\n").slice(-1)[0];
|
||||
if (last_url.length < 5) {
|
||||
last_url = m3u8.split("\n").slice(-2)[0]
|
||||
}
|
||||
if (last_url.includes(".m3u8") && last_url !== m3u8_url) {
|
||||
m3u8_url = urljoin2(m3u8_url, last_url);
|
||||
log("嵌套的m3u8_url:" + m3u8_url);
|
||||
m3u8 = request(m3u8_url, option)
|
||||
}
|
||||
let s = m3u8.trim().split("\n").filter(it => it.trim()).join("\n");
|
||||
let ss = s.split("\n");
|
||||
if (m3u8_url.indexOf("ffzy") > 0) {
|
||||
let j = 0,
|
||||
k1 = 0,
|
||||
m = 0,
|
||||
n = 0,
|
||||
t = 0;
|
||||
let s2 = "";
|
||||
for (let i = 0; i < ss.length; i++) {
|
||||
let s = ss[i];
|
||||
let s1 = "";
|
||||
if (s.startsWith("#EXTINF")) {
|
||||
s1 = s.slice(8);
|
||||
n++;
|
||||
if (n == 1) k1 = i;
|
||||
if (s2.indexOf(s1) == -1) {
|
||||
s2 = s2 + s1;
|
||||
m++
|
||||
}
|
||||
t = t + parseFloat(s1);
|
||||
i++;
|
||||
s = ss[i]
|
||||
}
|
||||
if (s.startsWith("#EXT-X-DISCONTINUITY")) {
|
||||
if (n == 5) {
|
||||
log("n:" + n);
|
||||
log("m:" + m);
|
||||
for (let j = k1; j < k1 + n * 2; j++) {
|
||||
log(ss[j])
|
||||
}
|
||||
log("广告位置:" + k1);
|
||||
log("数据条数:" + n);
|
||||
log("数据种类:" + m);
|
||||
log("广告时间:" + t.toFixed(5));
|
||||
ss.splice(k1, 2 * n + 1);
|
||||
i = i - 2 * n + 1
|
||||
}
|
||||
t = 0;
|
||||
m = 0;
|
||||
n = 0;
|
||||
s2 = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
let firststr = "";
|
||||
let maxl = 0;
|
||||
let kk = 0;
|
||||
let kkk1 = 1;
|
||||
let kkk2 = 0;
|
||||
let secondstr = "";
|
||||
for (let i = 0; i < ss.length; i++) {
|
||||
let s = ss[i];
|
||||
if (!s.startsWith("#")) {
|
||||
if (kk == 0) firststr = s;
|
||||
if (kk > 0) {
|
||||
if (maxl > b(firststr, s) + 1) {
|
||||
if (secondstr.length < 5) secondstr = s;
|
||||
kkk2++
|
||||
} else {
|
||||
maxl = b(firststr, s);
|
||||
kkk1++
|
||||
}
|
||||
}
|
||||
kk++;
|
||||
if (kk >= 30) break
|
||||
}
|
||||
}
|
||||
if (kkk2 > kkk1) firststr = secondstr;
|
||||
let firststrlen = firststr.length;
|
||||
let ml = Math.round(ss.length / 2).toString().length;
|
||||
let maxc = 0;
|
||||
let laststr = ss.toReversed().find(x => {
|
||||
if (!x.startsWith("#")) {
|
||||
let k = b(reverseString(firststr), reverseString(x));
|
||||
maxl = b(firststr, x);
|
||||
maxc++;
|
||||
if (firststrlen - maxl <= ml + k || maxc > 10) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
});
|
||||
log("最后一条切片:" + laststr);
|
||||
let ad_urls = [];
|
||||
for (let i = 0; i < ss.length; i++) {
|
||||
let s = ss[i];
|
||||
if (!s.startsWith("#")) {
|
||||
if (b(firststr, s) < maxl) {
|
||||
ad_urls.push(s);
|
||||
ss.splice(i - 1, 2);
|
||||
i = i - 2
|
||||
} else {
|
||||
ss[i] = urljoin(m3u8_url, s)
|
||||
}
|
||||
} else {
|
||||
ss[i] = s.replace(/URI=\"(.*)\"/, 'URI="' + urljoin(m3u8_url, "$1") + '"')
|
||||
}
|
||||
}
|
||||
log("处理的m3u8地址:" + m3u8_url);
|
||||
log("----广告地址----");
|
||||
log(ad_urls);
|
||||
m3u8 = ss.join("\n");
|
||||
log("处理耗时:" + ((new Date).getTime() - ts).toString());
|
||||
log(m3u8);
|
||||
return m3u8
|
||||
}
|
||||
|
||||
function forceOrder(lists, key, option) {
|
||||
let start = Math.floor(lists.length / 2);
|
||||
let end = Math.min(lists.length - 1, start + 1);
|
||||
if (start >= end) {
|
||||
return lists
|
||||
}
|
||||
let first = lists[start];
|
||||
let second = lists[end];
|
||||
if (key) {
|
||||
try {
|
||||
first = first[key];
|
||||
second = second[key]
|
||||
} catch (e) {}
|
||||
}
|
||||
if (option && typeof option === "function") {
|
||||
try {
|
||||
first = option(first);
|
||||
second = option(second)
|
||||
} catch (e) {}
|
||||
}
|
||||
first += "";
|
||||
second += "";
|
||||
if (first.match(/(\d+)/) && second.match(/(\d+)/)) {
|
||||
let num1 = Number(first.match(/(\d+)/)[1]);
|
||||
let num2 = Number(second.match(/(\d+)/)[1]);
|
||||
if (num1 > num2) {
|
||||
lists.reverse()
|
||||
}
|
||||
}
|
||||
return lists
|
||||
}
|
||||
let VODS = [];
|
||||
let VOD = {};
|
||||
let TABS = [];
|
||||
let LISTS = [];
|
||||
|
||||
function getQuery(url) {
|
||||
try {
|
||||
if (url.indexOf("?") > -1) {
|
||||
url = url.slice(url.indexOf("?") + 1)
|
||||
}
|
||||
let arr = url.split("#")[0].split("&");
|
||||
const resObj = {};
|
||||
arr.forEach(item => {
|
||||
let arr1 = item.split("=");
|
||||
let key = arr1[0];
|
||||
let value = arr1.slice(1).join("=");
|
||||
resObj[key] = value
|
||||
});
|
||||
return resObj
|
||||
} catch (err) {
|
||||
log(`getQuery发生错误:${e.message}`);
|
||||
return {}
|
||||
}
|
||||
}
|
||||
|
||||
function urljoin(fromPath, nowPath) {
|
||||
fromPath = fromPath || "";
|
||||
nowPath = nowPath || "";
|
||||
return joinUrl(fromPath, nowPath)
|
||||
}
|
||||
var urljoin2 = urljoin;
|
||||
const defaultParser = {
|
||||
pdfh: pdfh,
|
||||
pdfa: pdfa,
|
||||
pd: pd
|
||||
};
|
||||
|
||||
function pdfh2(html, parse) {
|
||||
let html2 = html;
|
||||
try {
|
||||
if (typeof html !== "string") {
|
||||
html2 = html.rr(html.ele).toString()
|
||||
}
|
||||
} catch (e) {
|
||||
print(`html对象转文本发生了错误:${e.message}`)
|
||||
}
|
||||
let result = defaultParser.pdfh(html2, parse);
|
||||
let option = parse.includes("&&") ? parse.split("&&").slice(-1)[0] : parse.split(" ").slice(-1)[0];
|
||||
if (/style/.test(option.toLowerCase()) && /url\(/.test(result)) {
|
||||
try {
|
||||
result = result.match(/url\((.*?)\)/)[1];
|
||||
result = result.replace(/^['|"](.*)['|"]$/, "$1")
|
||||
} catch (e) {}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function pdfa2(html, parse) {
|
||||
let html2 = html;
|
||||
try {
|
||||
if (typeof html !== "string") {
|
||||
html2 = html.rr(html.ele).toString()
|
||||
}
|
||||
} catch (e) {
|
||||
print(`html对象转文本发生了错误:${e.message}`)
|
||||
}
|
||||
return defaultParser.pdfa(html2, parse)
|
||||
}
|
||||
|
||||
function pd2(html, parse, uri) {
|
||||
let ret = pdfh2(html, parse);
|
||||
if (typeof uri === "undefined" || !uri) {
|
||||
uri = ""
|
||||
}
|
||||
if (DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)) {
|
||||
if (/http/.test(ret)) {
|
||||
ret = ret.slice(ret.indexOf("http"))
|
||||
} else {
|
||||
ret = urljoin(MY_URL, ret)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
const parseTags = {
|
||||
jsp: {
|
||||
pdfh: pdfh2,
|
||||
pdfa: pdfa2,
|
||||
pd: pd2
|
||||
},
|
||||
json: {
|
||||
pdfh(html, parse) {
|
||||
if (!parse || !parse.trim()) {
|
||||
return ""
|
||||
}
|
||||
if (typeof html === "string") {
|
||||
html = JSON.parse(html)
|
||||
}
|
||||
parse = parse.trim();
|
||||
if (!parse.startsWith("$.")) {
|
||||
parse = "$." + parse
|
||||
}
|
||||
parse = parse.split("||");
|
||||
for (let ps of parse) {
|
||||
let ret = cheerio.jp(ps, html);
|
||||
if (Array.isArray(ret)) {
|
||||
ret = ret[0] || ""
|
||||
} else {
|
||||
ret = ret || ""
|
||||
}
|
||||
if (ret && typeof ret !== "string") {
|
||||
ret = ret.toString()
|
||||
}
|
||||
if (ret) {
|
||||
return ret
|
||||
}
|
||||
}
|
||||
return ""
|
||||
},
|
||||
pdfa(html, parse) {
|
||||
if (!parse || !parse.trim()) {
|
||||
return ""
|
||||
}
|
||||
if (typeof html === "string") {
|
||||
html = JSON.parse(html)
|
||||
}
|
||||
parse = parse.trim();
|
||||
if (!parse.startsWith("$.")) {
|
||||
parse = "$." + parse
|
||||
}
|
||||
let ret = cheerio.jp(parse, html);
|
||||
if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1) {
|
||||
return ret[0] || []
|
||||
}
|
||||
return ret || []
|
||||
},
|
||||
pd(html, parse) {
|
||||
let ret = parseTags.json.pdfh(html, parse);
|
||||
if (ret) {
|
||||
return urljoin(MY_URL, ret)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
},
|
||||
jq: {
|
||||
pdfh(html, parse) {
|
||||
if (!html || !parse || !parse.trim()) {
|
||||
return ""
|
||||
}
|
||||
parse = parse.trim();
|
||||
let result = defaultParser.pdfh(html, parse);
|
||||
return result
|
||||
},
|
||||
pdfa(html, parse) {
|
||||
if (!html || !parse || !parse.trim()) {
|
||||
return []
|
||||
}
|
||||
parse = parse.trim();
|
||||
let result = defaultParser.pdfa(html, parse);
|
||||
print(`pdfa解析${parse}=>${result.length}`);
|
||||
return result
|
||||
},
|
||||
pd(html, parse, base_url) {
|
||||
if (!html || !parse || !parse.trim()) {
|
||||
return ""
|
||||
}
|
||||
parse = parse.trim();
|
||||
base_url = base_url || MY_URL;
|
||||
return defaultParser.pd(html, parse, base_url)
|
||||
}
|
||||
},
|
||||
getParse(p0) {
|
||||
if (p0.startsWith("jsp:")) {
|
||||
return this.jsp
|
||||
} else if (p0.startsWith("json:")) {
|
||||
return this.json
|
||||
} else if (p0.startsWith("jq:")) {
|
||||
return this.jq
|
||||
} else {
|
||||
return this.jq
|
||||
}
|
||||
}
|
||||
};
|
||||
const stringify = JSON.stringify;
|
||||
const jsp = parseTags.jsp;
|
||||
const jq = parseTags.jq;
|
||||
|
||||
function readFile(filePath) {
|
||||
filePath = filePath || "./uri.min.js";
|
||||
var fd = os.open(filePath);
|
||||
var buffer = new ArrayBuffer(1024);
|
||||
var len = os.read(fd, buffer, 0, 1024);
|
||||
console.log(len);
|
||||
let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
|
||||
console.log(text);
|
||||
return text
|
||||
}
|
||||
|
||||
function dealJson(html) {
|
||||
try {
|
||||
html = html.trim();
|
||||
if (!(html.startsWith("{") && html.endsWith("}") || html.startsWith("[") && html.endsWith("]"))) {
|
||||
html = "{" + html.match(/.*?\{(.*)\}/m)[1] + "}"
|
||||
}
|
||||
} catch (e) {}
|
||||
try {
|
||||
html = JSON.parse(html)
|
||||
} catch (e) {}
|
||||
return html
|
||||
}
|
||||
var OcrApi = {
|
||||
api: OCR_API,
|
||||
classification: function(img) {
|
||||
let code = "";
|
||||
try {
|
||||
log("通过drpy_ocr验证码接口过验证...");
|
||||
let html = "";
|
||||
if (this.api.endsWith("drpy/text")) {
|
||||
html = request(this.api, {
|
||||
data: {
|
||||
img: img
|
||||
},
|
||||
headers: {
|
||||
"User-Agent": PC_UA
|
||||
},
|
||||
method: "POST"
|
||||
}, true)
|
||||
} else {
|
||||
html = post(this.api, {
|
||||
body: img
|
||||
})
|
||||
}
|
||||
code = html || ""
|
||||
} catch (e) {
|
||||
log(`OCR识别验证码发生错误:${e.message}`)
|
||||
}
|
||||
return code
|
||||
}
|
||||
};
|
||||
|
||||
function verifyCode(url) {
|
||||
let cnt = 0;
|
||||
let host = getHome(url);
|
||||
let cookie = "";
|
||||
while (cnt < OCR_RETRY) {
|
||||
try {
|
||||
let yzm_url = `${host}/index.php/verify/index.html`;
|
||||
console.log(`验证码链接:${yzm_url}`);
|
||||
let hhtml = request(yzm_url, {
|
||||
withHeaders: true,
|
||||
toBase64: true
|
||||
}, true);
|
||||
let json = JSON.parse(hhtml);
|
||||
if (!cookie) {
|
||||
let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie");
|
||||
cookie = setCk ? json[setCk].split(";")[0] : ""
|
||||
}
|
||||
console.log("cookie:" + cookie);
|
||||
let img = json.body;
|
||||
let code = OcrApi.classification(img);
|
||||
console.log(`第${cnt+1}次验证码识别结果:${code}`);
|
||||
let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
|
||||
console.log(submit_url);
|
||||
let html = request(submit_url, {
|
||||
headers: {
|
||||
Cookie: cookie
|
||||
},
|
||||
method: "POST"
|
||||
});
|
||||
html = JSON.parse(html);
|
||||
if (html.msg === "ok") {
|
||||
console.log(`第${cnt+1}次验证码提交成功`);
|
||||
return cookie
|
||||
} else if (html.msg !== "ok" && cnt + 1 >= OCR_RETRY) {
|
||||
cookie = ""
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(`第${cnt+1}次验证码提交失败:${e.message}`);
|
||||
if (cnt + 1 >= OCR_RETRY) {
|
||||
cookie = ""
|
||||
}
|
||||
}
|
||||
cnt += 1
|
||||
}
|
||||
return cookie
|
||||
}
|
||||
|
||||
function setItem(k, v) {
|
||||
local.set(RKEY, k, v);
|
||||
console.log(`规则${RKEY}设置${k} => ${v}`)
|
||||
}
|
||||
|
||||
function getItem(k, v) {
|
||||
return local.get(RKEY, k) || v
|
||||
}
|
||||
|
||||
function clearItem(k) {
|
||||
local.delete(RKEY, k)
|
||||
}
|
||||
|
||||
function getHome(url) {
|
||||
if (!url) {
|
||||
return ""
|
||||
}
|
||||
let tmp = url.split("//");
|
||||
url = tmp[0] + "//" + tmp[1].split("/")[0];
|
||||
try {
|
||||
url = decodeURIComponent(url)
|
||||
} catch (e) {}
|
||||
return url
|
||||
}
|
||||
|
||||
function buildUrl(url, obj) {
|
||||
obj = obj || {};
|
||||
if (url.indexOf("?") < 0) {
|
||||
url += "?"
|
||||
}
|
||||
let param_list = [];
|
||||
let keys = Object.keys(obj);
|
||||
keys.forEach(it => {
|
||||
param_list.push(it + "=" + obj[it])
|
||||
});
|
||||
let prs = param_list.join("&");
|
||||
if (keys.length > 0 && !url.endsWith("?")) {
|
||||
url += "&"
|
||||
}
|
||||
url += prs;
|
||||
return url
|
||||
}
|
||||
|
||||
function $require(url) {
|
||||
eval(request(url))
|
||||
}
|
||||
|
||||
function keysToLowerCase(obj) {
|
||||
return Object.keys(obj).reduce((result, key) => {
|
||||
const newKey = key.toLowerCase();
|
||||
result[newKey] = obj[key];
|
||||
return result
|
||||
}, {})
|
||||
}
|
||||
|
||||
function buildQueryString(params) {
|
||||
const queryArray = [];
|
||||
for (const key in params) {
|
||||
if (params.hasOwnProperty(key)) {
|
||||
let value = params[key];
|
||||
if (value === undefined || value === null) {
|
||||
value = ""
|
||||
} else {
|
||||
value = value.toString()
|
||||
}
|
||||
const encodedKey = encodeURIComponent(key);
|
||||
const encodedValue = encodeURIComponent(value);
|
||||
queryArray.push(encodedKey + "=" + encodedValue)
|
||||
}
|
||||
}
|
||||
return queryArray.join("&")
|
||||
}
|
||||
|
||||
function parseQueryString(query) {
|
||||
const params = {};
|
||||
query.split("&").forEach(function(part) {
|
||||
const regex = /^(.*?)=(.*)/;
|
||||
const match = part.match(regex);
|
||||
if (match) {
|
||||
const key = decodeURIComponent(match[1]);
|
||||
const value = decodeURIComponent(match[2]);
|
||||
params[key] = value
|
||||
}
|
||||
});
|
||||
return params
|
||||
}
|
||||
|
||||
function encodeIfContainsSpecialChars(value) {
|
||||
const specialChars = ":/?#[]@!$'()*+,;=%";
|
||||
if (specialChars.split("").some(char => value.includes(char))) {
|
||||
return encodeURIComponent(value)
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
function objectToQueryString(obj) {
|
||||
const encoded = [];
|
||||
for (let key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
encoded.push(encodeURIComponent(key) + "=" + encodeIfContainsSpecialChars(obj[key]))
|
||||
}
|
||||
}
|
||||
return encoded.join("&")
|
||||
}
|
||||
|
||||
function request(url, obj, ocr_flag) {
|
||||
ocr_flag = ocr_flag || false;
|
||||
if (typeof obj === "undefined" || !obj || obj === {}) {
|
||||
if (!fetch_params || !fetch_params.headers) {
|
||||
let headers = {
|
||||
"User-Agent": MOBILE_UA
|
||||
};
|
||||
if (rule.headers) {
|
||||
Object.assign(headers, rule.headers)
|
||||
}
|
||||
if (!fetch_params) {
|
||||
fetch_params = {}
|
||||
}
|
||||
fetch_params.headers = headers
|
||||
}
|
||||
if (!fetch_params.headers.Referer) {
|
||||
fetch_params.headers.Referer = getHome(url)
|
||||
}
|
||||
obj = fetch_params
|
||||
} else {
|
||||
let headers = obj.headers || {};
|
||||
let keys = Object.keys(headers).map(it => it.toLowerCase());
|
||||
if (!keys.includes("user-agent")) {
|
||||
headers["User-Agent"] = MOBILE_UA;
|
||||
if (typeof fetch_params === "object" && fetch_params && fetch_params.headers) {
|
||||
let fetch_headers = keysToLowerCase(fetch_params.headers);
|
||||
if (fetch_headers["user-agent"]) {
|
||||
headers["User-Agent"] = fetch_headers["user-agent"]
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!keys.includes("referer")) {
|
||||
headers["Referer"] = getHome(url)
|
||||
}
|
||||
obj.headers = headers
|
||||
}
|
||||
if (rule.encoding && rule.encoding !== "utf-8" && !ocr_flag) {
|
||||
if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) {
|
||||
obj.headers["Content-Type"] = "text/html; charset=" + rule.encoding
|
||||
}
|
||||
}
|
||||
if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "string") {
|
||||
if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) {
|
||||
obj.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=" + rule.encoding
|
||||
}
|
||||
} else if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "object") {
|
||||
obj.data = obj.body;
|
||||
delete obj.body
|
||||
}
|
||||
if (!url) {
|
||||
return obj.withHeaders ? "{}" : ""
|
||||
}
|
||||
if (obj.toBase64) {
|
||||
obj.buffer = 2;
|
||||
delete obj.toBase64
|
||||
}
|
||||
if (obj.redirect === false) {
|
||||
obj.redirect = 0
|
||||
}
|
||||
if (obj.headers.hasOwnProperty("Content-Type") || obj.headers.hasOwnProperty("content-type")) {
|
||||
let _contentType = obj.headers["Content-Type"] || obj.headers["content-type"] || "";
|
||||
if (_contentType.includes("application/x-www-form-urlencoded")) {
|
||||
log("custom body is application/x-www-form-urlencoded");
|
||||
if (typeof obj.body == "string") {
|
||||
let temp_obj = parseQueryString(obj.body);
|
||||
console.log(JSON.stringify(temp_obj))
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(JSON.stringify(obj.headers));
|
||||
console.log("request:" + url + `|method:${obj.method||"GET"}|body:${obj.body||""}`);
|
||||
let res = req(url, obj);
|
||||
let html = res.content || "";
|
||||
if (obj.withHeaders) {
|
||||
let htmlWithHeaders = res.headers;
|
||||
htmlWithHeaders.body = html;
|
||||
return JSON.stringify(htmlWithHeaders)
|
||||
} else {
|
||||
return html
|
||||
}
|
||||
}
|
||||
|
||||
function post(url, obj) {
|
||||
obj = obj || {};
|
||||
obj.method = "POST";
|
||||
return request(url, obj)
|
||||
}
|
||||
|
||||
function reqCookie(url, obj, all_cookie) {
|
||||
obj = obj || {};
|
||||
obj.withHeaders = true;
|
||||
all_cookie = all_cookie || false;
|
||||
let html = request(url, obj);
|
||||
let json = JSON.parse(html);
|
||||
let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie");
|
||||
let cookie = setCk ? json[setCk] : "";
|
||||
if (Array.isArray(cookie)) {
|
||||
cookie = cookie.join(";")
|
||||
}
|
||||
if (!all_cookie) {
|
||||
cookie = cookie.split(";")[0]
|
||||
}
|
||||
html = json.body;
|
||||
return {
|
||||
cookie: cookie,
|
||||
html: html
|
||||
}
|
||||
}
|
||||
fetch = request;
|
||||
print = function(data) {
|
||||
data = data || "";
|
||||
if (typeof data == "object" && Object.keys(data).length > 0) {
|
||||
try {
|
||||
data = JSON.stringify(data);
|
||||
console.log(data)
|
||||
} catch (e) {
|
||||
console.log(typeof data + ":" + data.length);
|
||||
return
|
||||
}
|
||||
} else if (typeof data == "object" && Object.keys(data).length < 1) {
|
||||
console.log("null object")
|
||||
} else {
|
||||
console.log(data)
|
||||
}
|
||||
};
|
||||
log = print;
|
||||
|
||||
function checkHtml(html, url, obj) {
|
||||
if (/\?btwaf=/.test(html)) {
|
||||
let btwaf = html.match(/btwaf(.*?)"/)[1];
|
||||
url = url.split("#")[0] + "?btwaf" + btwaf;
|
||||
print("宝塔验证访问链接:" + url);
|
||||
html = request(url, obj)
|
||||
}
|
||||
return html
|
||||
}
|
||||
|
||||
function getCode(url, obj) {
|
||||
let html = request(url, obj);
|
||||
html = checkHtml(html, url, obj);
|
||||
return html
|
||||
}
|
||||
|
||||
function getHtml(url) {
|
||||
let obj = {};
|
||||
if (rule.headers) {
|
||||
obj.headers = rule.headers
|
||||
}
|
||||
let cookie = getItem(RULE_CK, "");
|
||||
if (cookie) {
|
||||
if (obj.headers && !Object.keys(obj.headers).map(it => it.toLowerCase()).includes("cookie")) {
|
||||
log("历史无cookie,新增过验证后的cookie");
|
||||
obj.headers["Cookie"] = cookie
|
||||
} else if (obj.headers && obj.headers.cookie && obj.headers.cookie !== cookie) {
|
||||
obj.headers["Cookie"] = cookie;
|
||||
log("历史有小写过期的cookie,更新过验证后的cookie")
|
||||
} else if (obj.headers && obj.headers.Cookie && obj.headers.Cookie !== cookie) {
|
||||
obj.headers["Cookie"] = cookie;
|
||||
log("历史有大写过期的cookie,更新过验证后的cookie")
|
||||
} else if (!obj.headers) {
|
||||
obj.headers = {
|
||||
Cookie: cookie
|
||||
};
|
||||
log("历史无headers,更新过验证后的含cookie的headers")
|
||||
}
|
||||
}
|
||||
let html = getCode(url, obj);
|
||||
return html
|
||||
}
|
||||
|
||||
function homeParse(homeObj) {
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let classes = [];
|
||||
if (homeObj.class_name && homeObj.class_url) {
|
||||
let names = homeObj.class_name.split("&");
|
||||
let urls = homeObj.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]
|
||||
})
|
||||
}
|
||||
}
|
||||
if (homeObj.class_parse) {
|
||||
if (homeObj.class_parse.startsWith("js:")) {
|
||||
var input = homeObj.MY_URL;
|
||||
try {
|
||||
eval(homeObj.class_parse.replace("js:", ""));
|
||||
if (Array.isArray(input)) {
|
||||
classes = input
|
||||
}
|
||||
} catch (e) {
|
||||
log(`通过js动态获取分类发生了错误:${e.message}`)
|
||||
}
|
||||
} else {
|
||||
let p = homeObj.class_parse.split(";");
|
||||
let p0 = p[0];
|
||||
let _ps = parseTags.getParse(p0);
|
||||
let is_json = p0.startsWith("json:");
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
MY_URL = rule.url;
|
||||
if (is_json) {
|
||||
try {
|
||||
let cms_cate_url = homeObj.MY_URL.replace("ac=detail", "ac=list");
|
||||
let html = homeObj.home_html || getHtml(cms_cate_url);
|
||||
if (html) {
|
||||
if (cms_cate_url === homeObj.MY_URL) {
|
||||
homeHtmlCache = html
|
||||
}
|
||||
let list = _pdfa(html, p0.replace("json:", ""));
|
||||
if (list && list.length > 0) {
|
||||
classes = list
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e.message)
|
||||
}
|
||||
} else if (p.length >= 3 && !is_json) {
|
||||
try {
|
||||
let html = homeObj.home_html || getHtml(homeObj.MY_URL);
|
||||
if (html) {
|
||||
homeHtmlCache = html;
|
||||
let list = _pdfa(html, p0);
|
||||
if (list && list.length > 0) {
|
||||
list.forEach((it, idex) => {
|
||||
try {
|
||||
let name = _pdfh(it, p[1]);
|
||||
if (homeObj.cate_exclude && new RegExp(homeObj.cate_exclude).test(name)) {
|
||||
return
|
||||
}
|
||||
let url = _pd(it, p[2]);
|
||||
if (p.length > 3 && p[3] && !homeObj.home_html) {
|
||||
let exp = new RegExp(p[3]);
|
||||
url = url.match(exp)[1]
|
||||
}
|
||||
classes.push({
|
||||
type_id: url.trim(),
|
||||
type_name: name.trim()
|
||||
})
|
||||
} catch (e) {
|
||||
console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e.message)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
classes = classes.filter(it => !homeObj.cate_exclude || !new RegExp(homeObj.cate_exclude).test(it.type_name));
|
||||
let resp = {
|
||||
class: classes
|
||||
};
|
||||
if (homeObj.filter) {
|
||||
resp.filters = homeObj.filter
|
||||
}
|
||||
console.log(JSON.stringify(resp));
|
||||
return JSON.stringify(resp)
|
||||
}
|
||||
|
||||
function getPP(p, pn, pp, ppn) {
|
||||
try {
|
||||
let ps = p[pn] === "*" && pp.length > ppn ? pp[ppn] : p[pn];
|
||||
return ps
|
||||
} catch (e) {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
function homeVodParse(homeVodObj) {
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let d = [];
|
||||
MY_URL = homeVodObj.homeUrl;
|
||||
console.log(MY_URL);
|
||||
let t1 = (new Date).getTime();
|
||||
let p = homeVodObj.推荐;
|
||||
print("p:" + p);
|
||||
if (p === "*" && rule.一级) {
|
||||
p = rule.一级;
|
||||
homeVodObj.double = false
|
||||
}
|
||||
if (!p || typeof p !== "string") {
|
||||
return "{}"
|
||||
}
|
||||
p = p.trim();
|
||||
let pp = rule.一级 ? rule.一级.split(";") : [];
|
||||
if (p.startsWith("js:")) {
|
||||
const TYPE = "home";
|
||||
var input = MY_URL;
|
||||
HOST = rule.host;
|
||||
eval(p.replace("js:", ""));
|
||||
d = VODS
|
||||
} else {
|
||||
p = p.split(";");
|
||||
if (!homeVodObj.double && p.length < 5) {
|
||||
return "{}"
|
||||
} else if (homeVodObj.double && p.length < 6) {
|
||||
return "{}"
|
||||
}
|
||||
let p0 = getPP(p, 0, pp, 0);
|
||||
let _ps = parseTags.getParse(p0);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p0.startsWith("json:");
|
||||
p0 = p0.replace(/^(jsp:|json:|jq:)/, "");
|
||||
let html = homeHtmlCache || getHtml(MY_URL);
|
||||
homeHtmlCache = undefined;
|
||||
if (is_json) {
|
||||
html = dealJson(html)
|
||||
}
|
||||
try {
|
||||
console.log("double:" + homeVodObj.double);
|
||||
if (homeVodObj.double) {
|
||||
let items = _pdfa(html, p0);
|
||||
let p1 = getPP(p, 1, pp, 0);
|
||||
let p2 = getPP(p, 2, pp, 1);
|
||||
let p3 = getPP(p, 3, pp, 2);
|
||||
let p4 = getPP(p, 4, pp, 3);
|
||||
let p5 = getPP(p, 5, pp, 4);
|
||||
let p6 = getPP(p, 6, pp, 5);
|
||||
for (let item of items) {
|
||||
let items2 = _pdfa(item, p1);
|
||||
for (let item2 of items2) {
|
||||
try {
|
||||
let title = _pdfh(item2, p2);
|
||||
let img = "";
|
||||
try {
|
||||
img = _pd(item2, p3)
|
||||
} catch (e) {}
|
||||
let desc = "";
|
||||
try {
|
||||
desc = _pdfh(item2, p4)
|
||||
} catch (e) {}
|
||||
let links = [];
|
||||
for (let _p5 of p5.split("+")) {
|
||||
let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
|
||||
links.push(link)
|
||||
}
|
||||
let content;
|
||||
if (p.length > 6 && p[6]) {
|
||||
content = _pdfh(item2, p6)
|
||||
} else {
|
||||
content = ""
|
||||
}
|
||||
let vid = links.join("$");
|
||||
if (rule.二级 === "*") {
|
||||
vid = vid + "@@" + title + "@@" + img
|
||||
}
|
||||
let vod = {
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: desc,
|
||||
vod_content: content,
|
||||
vod_id: vid
|
||||
};
|
||||
d.push(vod)
|
||||
} catch (e) {
|
||||
console.log(`首页列表双层定位处理发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let items = _pdfa(html, p0);
|
||||
let p1 = getPP(p, 1, pp, 1);
|
||||
let p2 = getPP(p, 2, pp, 2);
|
||||
let p3 = getPP(p, 3, pp, 3);
|
||||
let p4 = getPP(p, 4, pp, 4);
|
||||
let p5 = getPP(p, 5, pp, 5);
|
||||
for (let item of items) {
|
||||
try {
|
||||
let title = _pdfh(item, p1);
|
||||
let img = "";
|
||||
try {
|
||||
img = _pd(item, p2, MY_URL)
|
||||
} catch (e) {}
|
||||
let desc = "";
|
||||
try {
|
||||
desc = _pdfh(item, p3)
|
||||
} catch (e) {}
|
||||
let links = [];
|
||||
for (let _p5 of p4.split("+")) {
|
||||
let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
|
||||
links.push(link)
|
||||
}
|
||||
let content;
|
||||
if (p.length > 5 && p[5]) {
|
||||
content = _pdfh(item, p5)
|
||||
} else {
|
||||
content = ""
|
||||
}
|
||||
let vid = links.join("$");
|
||||
if (rule.二级 === "*") {
|
||||
vid = vid + "@@" + title + "@@" + img
|
||||
}
|
||||
let vod = {
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: desc,
|
||||
vod_content: content,
|
||||
vod_id: vid
|
||||
};
|
||||
d.push(vod)
|
||||
} catch (e) {
|
||||
console.log(`首页列表单层定位处理发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
let t2 = (new Date).getTime();
|
||||
console.log("加载首页推荐耗时:" + (t2 - t1) + "毫秒");
|
||||
if (rule.图片替换) {
|
||||
if (rule.图片替换.startsWith("js:")) {
|
||||
d.forEach(it => {
|
||||
try {
|
||||
var input = it.vod_pic;
|
||||
eval(rule.图片替换.trim().replace("js:", ""));
|
||||
it.vod_pic = input
|
||||
} catch (e) {
|
||||
log(`图片:${it.vod_pic}替换错误:${e.message}`)
|
||||
}
|
||||
})
|
||||
} else if (rule.图片替换.includes("=>")) {
|
||||
let replace_from = rule.图片替换.split("=>")[0];
|
||||
let replace_to = rule.图片替换.split("=>")[1];
|
||||
d.forEach(it => {
|
||||
if (it.vod_pic && it.vod_pic.startsWith("http")) {
|
||||
it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
if (rule.图片来源) {
|
||||
d.forEach(it => {
|
||||
if (it.vod_pic && it.vod_pic.startsWith("http")) {
|
||||
it.vod_pic = it.vod_pic + rule.图片来源
|
||||
}
|
||||
})
|
||||
}
|
||||
if (d.length > 0) {
|
||||
print(d.slice(0, 2))
|
||||
}
|
||||
return JSON.stringify({
|
||||
list: d
|
||||
})
|
||||
}
|
||||
|
||||
function categoryParse(cateObj) {
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let p = cateObj.一级;
|
||||
if (!p || typeof p !== "string") {
|
||||
return "{}"
|
||||
}
|
||||
let d = [];
|
||||
let url = cateObj.url.replaceAll("fyclass", cateObj.tid);
|
||||
if (cateObj.pg === 1 && url.includes("[") && url.includes("]")) {
|
||||
url = url.split("[")[1].split("]")[0]
|
||||
} else if (cateObj.pg > 1 && url.includes("[") && url.includes("]")) {
|
||||
url = url.split("[")[0]
|
||||
}
|
||||
if (rule.filter_url) {
|
||||
if (!/fyfilter/.test(url)) {
|
||||
if (!url.endsWith("&") && !rule.filter_url.startsWith("&")) {
|
||||
url += "&"
|
||||
}
|
||||
url += rule.filter_url
|
||||
} else {
|
||||
url = url.replace("fyfilter", rule.filter_url)
|
||||
}
|
||||
url = url.replaceAll("fyclass", cateObj.tid);
|
||||
let fl = cateObj.filter ? cateObj.extend : {};
|
||||
if (rule.filter_def && typeof rule.filter_def === "object") {
|
||||
try {
|
||||
if (Object.keys(rule.filter_def).length > 0 && rule.filter_def.hasOwnProperty(cateObj.tid)) {
|
||||
let self_fl_def = rule.filter_def[cateObj.tid];
|
||||
if (self_fl_def && typeof self_fl_def === "object") {
|
||||
let fl_def = JSON.parse(JSON.stringify(self_fl_def));
|
||||
fl = Object.assign(fl_def, fl)
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
print(`合并不同分类对应的默认筛选出错:${e.message}`)
|
||||
}
|
||||
}
|
||||
let new_url;
|
||||
new_url = cheerio.jinja2(url, {
|
||||
fl: fl,
|
||||
fyclass: cateObj.tid
|
||||
});
|
||||
url = new_url
|
||||
}
|
||||
if (/fypage/.test(url)) {
|
||||
if (url.includes("(") && url.includes(")")) {
|
||||
let url_rep = url.match(/.*?\((.*)\)/)[1];
|
||||
let cnt_page = url_rep.replaceAll("fypage", cateObj.pg);
|
||||
let cnt_pg = eval(cnt_page);
|
||||
url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "")
|
||||
} else {
|
||||
url = url.replaceAll("fypage", cateObj.pg)
|
||||
}
|
||||
}
|
||||
MY_URL = url;
|
||||
console.log(MY_URL);
|
||||
p = p.trim();
|
||||
const MY_CATE = cateObj.tid;
|
||||
if (p.startsWith("js:")) {
|
||||
var MY_FL = cateObj.extend;
|
||||
const TYPE = "cate";
|
||||
var input = MY_URL;
|
||||
const MY_PAGE = cateObj.pg;
|
||||
var desc = "";
|
||||
eval(p.trim().replace("js:", ""));
|
||||
d = VODS
|
||||
} else {
|
||||
p = p.split(";");
|
||||
if (p.length < 5) {
|
||||
return "{}"
|
||||
}
|
||||
let _ps = parseTags.getParse(p[0]);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p[0].startsWith("json:");
|
||||
p[0] = p[0].replace(/^(jsp:|json:|jq:)/, "");
|
||||
try {
|
||||
let html = getHtml(MY_URL);
|
||||
if (html) {
|
||||
if (is_json) {
|
||||
html = dealJson(html)
|
||||
}
|
||||
let list = _pdfa(html, p[0]);
|
||||
list.forEach(it => {
|
||||
let links = p[4].split("+").map(p4 => {
|
||||
return !rule.detailUrl ? _pd(it, p4, MY_URL) : _pdfh(it, p4)
|
||||
});
|
||||
let link = links.join("$");
|
||||
let vod_id = rule.detailUrl ? MY_CATE + "$" + link : link;
|
||||
let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g, "").trim();
|
||||
let vod_pic = _pd(it, p[2], MY_URL);
|
||||
if (rule.二级 === "*") {
|
||||
vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic
|
||||
}
|
||||
d.push({
|
||||
vod_id: vod_id,
|
||||
vod_name: vod_name,
|
||||
vod_pic: vod_pic,
|
||||
vod_remarks: _pdfh(it, p[3]).replace(/\n|\t/g, "").trim()
|
||||
})
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e.message)
|
||||
}
|
||||
}
|
||||
if (rule.图片替换) {
|
||||
if (rule.图片替换.startsWith("js:")) {
|
||||
d.forEach(it => {
|
||||
try {
|
||||
var input = it.vod_pic;
|
||||
eval(rule.图片替换.trim().replace("js:", ""));
|
||||
it.vod_pic = input
|
||||
} catch (e) {
|
||||
log(`图片:${it.vod_pic}替换错误:${e.message}`)
|
||||
}
|
||||
})
|
||||
} else if (rule.图片替换.includes("=>")) {
|
||||
let replace_from = rule.图片替换.split("=>")[0];
|
||||
let replace_to = rule.图片替换.split("=>")[1];
|
||||
d.forEach(it => {
|
||||
if (it.vod_pic && it.vod_pic.startsWith("http")) {
|
||||
it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
if (rule.图片来源) {
|
||||
d.forEach(it => {
|
||||
if (it.vod_pic && it.vod_pic.startsWith("http")) {
|
||||
it.vod_pic = it.vod_pic + rule.图片来源
|
||||
}
|
||||
})
|
||||
}
|
||||
if (d.length > 0) {
|
||||
print(d.slice(0, 2))
|
||||
}
|
||||
let pagecount = 0;
|
||||
if (rule.pagecount && typeof rule.pagecount === "object" && rule.pagecount.hasOwnProperty(MY_CATE)) {
|
||||
print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
|
||||
pagecount = parseInt(rule.pagecount[MY_CATE])
|
||||
}
|
||||
let nodata = {
|
||||
list: [{
|
||||
vod_name: "无数据,防无限请求",
|
||||
vod_id: "no_data",
|
||||
vod_remarks: "不要点,会崩的",
|
||||
vod_pic: "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"
|
||||
}],
|
||||
total: 1,
|
||||
pagecount: 1,
|
||||
page: 1,
|
||||
limit: 1
|
||||
};
|
||||
let vod = d.length < 1 ? JSON.stringify(nodata) : JSON.stringify({
|
||||
page: parseInt(cateObj.pg),
|
||||
pagecount: pagecount || 999,
|
||||
limit: 20,
|
||||
total: 999,
|
||||
list: d
|
||||
});
|
||||
return vod
|
||||
}
|
||||
|
||||
function searchParse(searchObj) {
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let d = [];
|
||||
if (!searchObj.searchUrl) {
|
||||
return "{}"
|
||||
}
|
||||
if (rule.searchNoPage && Number(searchObj.pg) > 1) {
|
||||
return "{}"
|
||||
}
|
||||
let p = searchObj.搜索 === "*" && rule.一级 ? rule.一级 : searchObj.搜索;
|
||||
if (!p || typeof p !== "string") {
|
||||
return "{}"
|
||||
}
|
||||
p = p.trim();
|
||||
let pp = rule.一级 ? rule.一级.split(";") : [];
|
||||
let url = searchObj.searchUrl.replaceAll("**", searchObj.wd);
|
||||
if (searchObj.pg === 1 && url.includes("[") && url.includes("]") && !url.includes("#")) {
|
||||
url = url.split("[")[1].split("]")[0]
|
||||
} else if (searchObj.pg > 1 && url.includes("[") && url.includes("]") && !url.includes("#")) {
|
||||
url = url.split("[")[0]
|
||||
}
|
||||
if (/fypage/.test(url)) {
|
||||
if (url.includes("(") && url.includes(")")) {
|
||||
let url_rep = url.match(/.*?\((.*)\)/)[1];
|
||||
let cnt_page = url_rep.replaceAll("fypage", searchObj.pg);
|
||||
let cnt_pg = eval(cnt_page);
|
||||
url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "")
|
||||
} else {
|
||||
url = url.replaceAll("fypage", searchObj.pg)
|
||||
}
|
||||
}
|
||||
MY_URL = url;
|
||||
console.log(MY_URL);
|
||||
if (p.startsWith("js:")) {
|
||||
const TYPE = "search";
|
||||
const MY_PAGE = searchObj.pg;
|
||||
const KEY = searchObj.wd;
|
||||
var input = MY_URL;
|
||||
var detailUrl = rule.detailUrl || "";
|
||||
eval(p.trim().replace("js:", ""));
|
||||
d = VODS
|
||||
} else {
|
||||
p = p.split(";");
|
||||
if (p.length < 5) {
|
||||
return "{}"
|
||||
}
|
||||
let p0 = getPP(p, 0, pp, 0);
|
||||
let _ps = parseTags.getParse(p0);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
let is_json = p0.startsWith("json:");
|
||||
p0 = p0.replace(/^(jsp:|json:|jq:)/, "");
|
||||
try {
|
||||
let req_method = MY_URL.split(";").length > 1 ? MY_URL.split(";")[1].toLowerCase() : "get";
|
||||
let html;
|
||||
if (req_method === "post") {
|
||||
let rurls = MY_URL.split(";")[0].split("#");
|
||||
let rurl = rurls[0];
|
||||
let params = rurls.length > 1 ? rurls[1] : "";
|
||||
print(`post=》rurl:${rurl},params:${params}`);
|
||||
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let postData = {
|
||||
body: params
|
||||
};
|
||||
Object.assign(_fetch_params, postData);
|
||||
html = post(rurl, _fetch_params)
|
||||
} else if (req_method === "postjson") {
|
||||
let rurls = MY_URL.split(";")[0].split("#");
|
||||
let rurl = rurls[0];
|
||||
let params = rurls.length > 1 ? rurls[1] : "";
|
||||
print(`postjson-》rurl:${rurl},params:${params}`);
|
||||
try {
|
||||
params = JSON.parse(params)
|
||||
} catch (e) {
|
||||
params = "{}"
|
||||
}
|
||||
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let postData = {
|
||||
body: params
|
||||
};
|
||||
Object.assign(_fetch_params, postData);
|
||||
html = post(rurl, _fetch_params)
|
||||
} else {
|
||||
html = getHtml(MY_URL)
|
||||
}
|
||||
if (html) {
|
||||
let search_tag = rule.搜索验证标识 || "系统安全验证|输入验证码";
|
||||
if (new RegExp(search_tag).test(html)) {
|
||||
let cookie = verifyCode(MY_URL);
|
||||
if (cookie) {
|
||||
console.log(`本次成功过验证,cookie:${cookie}`);
|
||||
setItem(RULE_CK, cookie)
|
||||
} else {
|
||||
console.log(`本次自动过搜索验证失败,cookie:${cookie}`)
|
||||
}
|
||||
html = getHtml(MY_URL)
|
||||
}
|
||||
if (!html.includes(searchObj.wd)) {
|
||||
console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");
|
||||
console.log(html)
|
||||
}
|
||||
if (is_json) {
|
||||
html = dealJson(html)
|
||||
}
|
||||
let list = _pdfa(html, p0);
|
||||
let p1 = getPP(p, 1, pp, 1);
|
||||
let p2 = getPP(p, 2, pp, 2);
|
||||
let p3 = getPP(p, 3, pp, 3);
|
||||
let p4 = getPP(p, 4, pp, 4);
|
||||
let p5 = getPP(p, 5, pp, 5);
|
||||
list.forEach(it => {
|
||||
let links = p4.split("+").map(_p4 => {
|
||||
return !rule.detailUrl ? _pd(it, _p4, MY_URL) : _pdfh(it, _p4)
|
||||
});
|
||||
let link = links.join("$");
|
||||
let content;
|
||||
if (p.length > 5 && p[5]) {
|
||||
content = _pdfh(it, p5)
|
||||
} else {
|
||||
content = ""
|
||||
}
|
||||
let vod_id = link;
|
||||
let vod_name = _pdfh(it, p1).replace(/\n|\t/g, "").trim();
|
||||
let vod_pic = _pd(it, p2, MY_URL);
|
||||
if (rule.二级 === "*") {
|
||||
vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic
|
||||
}
|
||||
let ob = {
|
||||
vod_id: vod_id,
|
||||
vod_name: vod_name,
|
||||
vod_pic: vod_pic,
|
||||
vod_remarks: _pdfh(it, p3).replace(/\n|\t/g, "").trim(),
|
||||
vod_content: content.replace(/\n|\t/g, "").trim()
|
||||
};
|
||||
d.push(ob)
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
print(`搜索发生错误:${e.message}`);
|
||||
return "{}"
|
||||
}
|
||||
}
|
||||
if (rule.图片替换) {
|
||||
if (rule.图片替换.startsWith("js:")) {
|
||||
d.forEach(it => {
|
||||
try {
|
||||
var input = it.vod_pic;
|
||||
eval(rule.图片替换.trim().replace("js:", ""));
|
||||
it.vod_pic = input
|
||||
} catch (e) {
|
||||
log(`图片:${it.vod_pic}替换错误:${e.message}`)
|
||||
}
|
||||
})
|
||||
} else if (rule.图片替换.includes("=>")) {
|
||||
let replace_from = rule.图片替换.split("=>")[0];
|
||||
let replace_to = rule.图片替换.split("=>")[1];
|
||||
d.forEach(it => {
|
||||
if (it.vod_pic && it.vod_pic.startsWith("http")) {
|
||||
it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
if (rule.图片来源) {
|
||||
d.forEach(it => {
|
||||
if (it.vod_pic && it.vod_pic.startsWith("http")) {
|
||||
it.vod_pic = it.vod_pic + rule.图片来源
|
||||
}
|
||||
})
|
||||
}
|
||||
return JSON.stringify({
|
||||
page: parseInt(searchObj.pg),
|
||||
pagecount: 10,
|
||||
limit: 20,
|
||||
total: 100,
|
||||
list: d
|
||||
})
|
||||
}
|
||||
|
||||
function detailParse(detailObj) {
|
||||
let t1 = (new Date).getTime();
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
let orId = detailObj.orId;
|
||||
let vod_name = "片名";
|
||||
let vod_pic = "";
|
||||
let vod_id = orId;
|
||||
if (rule.二级 === "*") {
|
||||
let extra = orId.split("@@");
|
||||
vod_name = extra.length > 1 ? extra[1] : vod_name;
|
||||
vod_pic = extra.length > 2 ? extra[2] : vod_pic
|
||||
}
|
||||
let vod = {
|
||||
vod_id: vod_id,
|
||||
vod_name: vod_name,
|
||||
vod_pic: vod_pic,
|
||||
type_name: "类型",
|
||||
vod_year: "年份",
|
||||
vod_area: "地区",
|
||||
vod_remarks: "更新信息",
|
||||
vod_actor: "主演",
|
||||
vod_director: "导演",
|
||||
vod_content: "简介"
|
||||
};
|
||||
let p = detailObj.二级;
|
||||
let url = detailObj.url;
|
||||
let detailUrl = detailObj.detailUrl;
|
||||
let fyclass = detailObj.fyclass;
|
||||
let tab_exclude = detailObj.tab_exclude;
|
||||
let html = detailObj.html || "";
|
||||
MY_URL = url;
|
||||
if (detailObj.二级访问前) {
|
||||
try {
|
||||
print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
|
||||
eval(detailObj.二级访问前.trim().replace("js:", ""))
|
||||
} catch (e) {
|
||||
print(`二级访问前执行代码出现错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
if (p === "*") {
|
||||
vod.vod_play_from = "在线播放";
|
||||
vod.vod_remarks = detailUrl;
|
||||
vod.vod_actor = "没有二级,只有一级链接直接嗅探播放";
|
||||
vod.vod_content = MY_URL;
|
||||
vod.vod_play_url = "嗅探播放$" + MY_URL.split("@@")[0]
|
||||
} else if (typeof p === "string" && p.trim().startsWith("js:")) {
|
||||
const TYPE = "detail";
|
||||
var input = MY_URL;
|
||||
var play_url = "";
|
||||
eval(p.trim().replace("js:", ""));
|
||||
vod = VOD;
|
||||
console.log(JSON.stringify(vod))
|
||||
} else if (p && typeof p === "object") {
|
||||
let tt1 = (new Date).getTime();
|
||||
if (!html) {
|
||||
html = getHtml(MY_URL)
|
||||
}
|
||||
print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);
|
||||
let _ps;
|
||||
if (p.is_json) {
|
||||
print("二级是json");
|
||||
_ps = parseTags.json;
|
||||
html = dealJson(html)
|
||||
} else if (p.is_jsp) {
|
||||
print("二级是jsp");
|
||||
_ps = parseTags.jsp
|
||||
} else if (p.is_jq) {
|
||||
print("二级是jq");
|
||||
_ps = parseTags.jq
|
||||
} else {
|
||||
print("二级默认jq");
|
||||
_ps = parseTags.jq
|
||||
}
|
||||
let tt2 = (new Date).getTime();
|
||||
print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
|
||||
_pdfa = _ps.pdfa;
|
||||
_pdfh = _ps.pdfh;
|
||||
_pd = _ps.pd;
|
||||
if (p.title) {
|
||||
let p1 = p.title.split(";");
|
||||
vod.vod_name = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim();
|
||||
let type_name = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").replace(/ /g, "").trim() : "";
|
||||
vod.type_name = type_name || vod.type_name
|
||||
}
|
||||
if (p.desc) {
|
||||
try {
|
||||
let p1 = p.desc.split(";");
|
||||
vod.vod_remarks = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim();
|
||||
vod.vod_year = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").trim() : "";
|
||||
vod.vod_area = p1.length > 2 ? _pdfh(html, p1[2]).replace(/\n|\t/g, "").trim() : "";
|
||||
vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replace(/\n|\t/g, "").trim() : "";
|
||||
vod.vod_director = p1.length > 4 ? _pdfh(html, p1[4]).replace(/\n|\t/g, "").trim() : ""
|
||||
} catch (e) {}
|
||||
}
|
||||
if (p.content) {
|
||||
try {
|
||||
let p1 = p.content.split(";");
|
||||
vod.vod_content = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim()
|
||||
} catch (e) {}
|
||||
}
|
||||
if (p.img) {
|
||||
try {
|
||||
let p1 = p.img.split(";");
|
||||
vod.vod_pic = _pd(html, p1[0], MY_URL)
|
||||
} catch (e) {}
|
||||
}
|
||||
let vod_play_from = "$$$";
|
||||
let playFrom = [];
|
||||
if (p.重定向 && p.重定向.startsWith("js:")) {
|
||||
print("开始执行重定向代码:" + p.重定向);
|
||||
html = eval(p.重定向.replace("js:", ""))
|
||||
}
|
||||
if (p.tabs) {
|
||||
if (p.tabs.startsWith("js:")) {
|
||||
print("开始执行tabs代码:" + p.tabs);
|
||||
var input = MY_URL;
|
||||
eval(p.tabs.replace("js:", ""));
|
||||
playFrom = TABS
|
||||
} else {
|
||||
let p_tab = p.tabs.split(";")[0];
|
||||
let vHeader = _pdfa(html, p_tab);
|
||||
console.log(vHeader.length);
|
||||
let tab_text = p.tab_text || "body&&Text";
|
||||
let new_map = {};
|
||||
for (let v of vHeader) {
|
||||
let v_title = _pdfh(v, tab_text).trim();
|
||||
if (!v_title) {
|
||||
v_title = "线路空"
|
||||
}
|
||||
console.log(v_title);
|
||||
if (tab_exclude && new RegExp(tab_exclude).test(v_title)) {
|
||||
continue
|
||||
}
|
||||
if (!new_map.hasOwnProperty(v_title)) {
|
||||
new_map[v_title] = 1
|
||||
} else {
|
||||
new_map[v_title] += 1
|
||||
}
|
||||
if (new_map[v_title] > 1) {
|
||||
v_title += Number(new_map[v_title] - 1)
|
||||
}
|
||||
playFrom.push(v_title)
|
||||
}
|
||||
}
|
||||
console.log(JSON.stringify(playFrom))
|
||||
} else {
|
||||
playFrom = ["在线播放"]
|
||||
}
|
||||
vod.vod_play_from = playFrom.join(vod_play_from);
|
||||
let vod_play_url = "$$$";
|
||||
let vod_tab_list = [];
|
||||
if (p.lists) {
|
||||
if (p.lists.startsWith("js:")) {
|
||||
print("开始执行lists代码:" + p.lists);
|
||||
try {
|
||||
var input = MY_URL;
|
||||
var play_url = "";
|
||||
eval(p.lists.replace("js:", ""));
|
||||
for (let i in LISTS) {
|
||||
if (LISTS.hasOwnProperty(i)) {
|
||||
try {
|
||||
LISTS[i] = LISTS[i].map(it => it.split("$").slice(0, 2).join("$"))
|
||||
} catch (e) {
|
||||
print(`格式化LISTS发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
vod_play_url = LISTS.map(it => it.join("#")).join(vod_play_url)
|
||||
} catch (e) {
|
||||
print(`js执行lists: 发生错误:${e.message}`)
|
||||
}
|
||||
} else {
|
||||
let list_text = p.list_text || "body&&Text";
|
||||
let list_url = p.list_url || "a&&href";
|
||||
let list_url_prefix = p.list_url_prefix || "";
|
||||
let is_tab_js = p.tabs.trim().startsWith("js:");
|
||||
for (let i = 0; i < playFrom.length; i++) {
|
||||
let tab_name = playFrom[i];
|
||||
let tab_ext = p.tabs.split(";").length > 1 && !is_tab_js ? p.tabs.split(";")[1] : "";
|
||||
let p1 = p.lists.replaceAll("#idv", tab_name).replaceAll("#id", i);
|
||||
tab_ext = tab_ext.replaceAll("#idv", tab_name).replaceAll("#id", i);
|
||||
let tabName = tab_ext ? _pdfh(html, tab_ext) : tab_name;
|
||||
console.log(tabName);
|
||||
let new_vod_list = [];
|
||||
let tt1 = (new Date).getTime();
|
||||
if (typeof pdfl === "function") {
|
||||
new_vod_list = pdfl(html, p1, list_text, list_url, MY_URL);
|
||||
if (list_url_prefix) {
|
||||
new_vod_list = new_vod_list.map(it => it.split("$")[0] + "$" + list_url_prefix + it.split("$").slice(1).join("$"))
|
||||
}
|
||||
} else {
|
||||
let vodList = [];
|
||||
try {
|
||||
vodList = _pdfa(html, p1);
|
||||
console.log("len(vodList):" + vodList.length)
|
||||
} catch (e) {}
|
||||
for (let i = 0; i < vodList.length; i++) {
|
||||
let it = vodList[i];
|
||||
new_vod_list.push(_pdfh(it, list_text).trim() + "$" + list_url_prefix + _pd(it, list_url, MY_URL))
|
||||
}
|
||||
}
|
||||
if (new_vod_list.length > 0) {
|
||||
new_vod_list = forceOrder(new_vod_list, "", x => x.split("$")[0]);
|
||||
console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)
|
||||
}
|
||||
let vlist = new_vod_list.join("#");
|
||||
vod_tab_list.push(vlist)
|
||||
}
|
||||
vod_play_url = vod_tab_list.join(vod_play_url)
|
||||
}
|
||||
}
|
||||
vod.vod_play_url = vod_play_url
|
||||
}
|
||||
if (rule.图片替换 && rule.图片替换.includes("=>")) {
|
||||
let replace_from = rule.图片替换.split("=>")[0];
|
||||
let replace_to = rule.图片替换.split("=>")[1];
|
||||
vod.vod_pic = vod.vod_pic.replace(replace_from, replace_to)
|
||||
}
|
||||
if (rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith("http")) {
|
||||
vod.vod_pic = vod.vod_pic + rule.图片来源
|
||||
}
|
||||
if (!vod.vod_id || vod_id.includes("$") && vod.vod_id !== vod_id) {
|
||||
vod.vod_id = vod_id
|
||||
}
|
||||
let t2 = (new Date).getTime();
|
||||
console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
|
||||
try {
|
||||
vod = vodDeal(vod)
|
||||
} catch (e) {
|
||||
console.log(`vodDeal发生错误:${e.message}`)
|
||||
}
|
||||
return JSON.stringify({
|
||||
list: [vod]
|
||||
})
|
||||
}
|
||||
|
||||
function get_tab_index(vod) {
|
||||
let obj = {};
|
||||
vod.vod_play_from.split("$$$").forEach((it, index) => {
|
||||
obj[it] = index
|
||||
});
|
||||
return obj
|
||||
}
|
||||
|
||||
function vodDeal(vod) {
|
||||
let vod_play_from = vod.vod_play_from.split("$$$");
|
||||
let vod_play_url = vod.vod_play_url.split("$$$");
|
||||
let tab_removed_list = vod_play_from;
|
||||
let tab_ordered_list = vod_play_from;
|
||||
let tab_renamed_list = vod_play_from;
|
||||
let tab_list = vod_play_from;
|
||||
let play_ordered_list = vod_play_url;
|
||||
if (rule.tab_remove && rule.tab_remove.length > 0 || rule.tab_order && rule.tab_order.length > 0) {
|
||||
let tab_index_dict = get_tab_index(vod);
|
||||
if (rule.tab_remove && rule.tab_remove.length > 0) {
|
||||
tab_removed_list = vod_play_from.filter(it => !rule.tab_remove.includes(it));
|
||||
tab_list = tab_removed_list
|
||||
}
|
||||
if (rule.tab_order && rule.tab_order.length > 0) {
|
||||
let tab_order = rule.tab_order;
|
||||
tab_ordered_list = tab_removed_list.sort((a, b) => {
|
||||
const getOrderIndex = (tabName, orderRules) => {
|
||||
for (let i = 0; i < orderRules.length; i++) {
|
||||
if (tabName.includes(orderRules[i])) {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return 9999
|
||||
};
|
||||
const indexA = getOrderIndex(a, tab_order);
|
||||
const indexB = getOrderIndex(b, tab_order);
|
||||
return indexA - indexB
|
||||
});
|
||||
tab_list = tab_ordered_list
|
||||
}
|
||||
play_ordered_list = tab_list.map(it => vod_play_url[tab_index_dict[it]])
|
||||
}
|
||||
if (rule.tab_rename && typeof rule.tab_rename === "object" & Object.keys(rule.tab_rename).length > 0) {
|
||||
tab_renamed_list = tab_list.map(it => rule.tab_rename[it] || it);
|
||||
tab_list = tab_renamed_list
|
||||
}
|
||||
vod.vod_play_from = tab_list.join("$$$");
|
||||
vod.vod_play_url = play_ordered_list.join("$$$");
|
||||
return vod
|
||||
}
|
||||
|
||||
function tellIsJx(url) {
|
||||
try {
|
||||
let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0]) && 是否正版(url);
|
||||
return is_vip ? 1 : 0
|
||||
} catch (e) {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
function playParse(playObj) {
|
||||
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
|
||||
MY_URL = playObj.url;
|
||||
var MY_FLAG = playObj.flag;
|
||||
if (!/http/.test(MY_URL)) {
|
||||
try {
|
||||
MY_URL = base64Decode(MY_URL)
|
||||
} catch (e) {}
|
||||
}
|
||||
MY_URL = decodeURIComponent(MY_URL);
|
||||
var input = MY_URL;
|
||||
var flag = MY_FLAG;
|
||||
let common_play = {
|
||||
parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1,
|
||||
url: input,
|
||||
flag: flag,
|
||||
jx: tellIsJx(input)
|
||||
};
|
||||
let lazy_play;
|
||||
if (!rule.play_parse || !rule.lazy) {
|
||||
lazy_play = common_play
|
||||
} else if (rule.play_parse && rule.lazy && typeof rule.lazy === "string") {
|
||||
try {
|
||||
let lazy_code = rule.lazy.trim();
|
||||
if (lazy_code.startsWith("js:")) {
|
||||
lazy_code = lazy_code.replace("js:", "").trim()
|
||||
}
|
||||
print("开始执行js免嗅=>" + lazy_code);
|
||||
eval(lazy_code);
|
||||
lazy_play = typeof input === "object" ? input : {
|
||||
parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1,
|
||||
jx: tellIsJx(input),
|
||||
url: input
|
||||
}
|
||||
} catch (e) {
|
||||
print(`js免嗅错误:${e.message}`);
|
||||
lazy_play = common_play
|
||||
}
|
||||
} else {
|
||||
lazy_play = common_play
|
||||
}
|
||||
if (Array.isArray(rule.play_json) && rule.play_json.length > 0) {
|
||||
let web_url = lazy_play.url;
|
||||
for (let pjson of rule.play_json) {
|
||||
if (pjson.re && (pjson.re === "*" || web_url.match(new RegExp(pjson.re)))) {
|
||||
if (pjson.json && typeof pjson.json === "object") {
|
||||
let base_json = pjson.json;
|
||||
lazy_play = Object.assign(lazy_play, base_json);
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (rule.play_json && !Array.isArray(rule.play_json)) {
|
||||
let base_json = {
|
||||
jx: 1,
|
||||
parse: 1
|
||||
};
|
||||
lazy_play = Object.assign(lazy_play, base_json)
|
||||
} else if (!rule.play_json) {
|
||||
let base_json = {
|
||||
jx: 0,
|
||||
parse: 1
|
||||
};
|
||||
lazy_play = Object.assign(lazy_play, base_json)
|
||||
}
|
||||
console.log(JSON.stringify(lazy_play));
|
||||
return JSON.stringify(lazy_play)
|
||||
}
|
||||
|
||||
function proxyParse(proxyObj) {
|
||||
var input = proxyObj.params;
|
||||
if (proxyObj.proxy_rule) {
|
||||
log("准备执行本地代理规则:\n" + proxyObj.proxy_rule);
|
||||
try {
|
||||
eval(proxyObj.proxy_rule);
|
||||
if (input && input !== proxyObj.params && Array.isArray(input) && input.length >= 3) {
|
||||
return input
|
||||
} else {
|
||||
return [404, "text/plain", "Not Found"]
|
||||
}
|
||||
} catch (e) {
|
||||
return [500, "text/plain", "代理规则错误:" + e.message]
|
||||
}
|
||||
} else {
|
||||
return [404, "text/plain", "Not Found"]
|
||||
}
|
||||
}
|
||||
|
||||
function isVideoParse(isVideoObj) {
|
||||
var input = isVideoObj.url;
|
||||
if (!isVideoObj.t) {
|
||||
let re_matcher = new RegExp(isVideoObj.isVideo, "i");
|
||||
return re_matcher.test(input)
|
||||
} else {
|
||||
try {
|
||||
eval(isVideoObj.isVideo);
|
||||
if (typeof input === "boolean") {
|
||||
return input
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} catch (e) {
|
||||
log(`执行嗅探规则发生错误:${e.message}`);
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function removeHeader(content, options = {}) {
|
||||
const {
|
||||
mode = "header-only", fileType
|
||||
} = options;
|
||||
const COMMENT_CONFIG = {
|
||||
".js": {
|
||||
start: "/*",
|
||||
end: "*/",
|
||||
regex: /^\s*\/\*([\s\S]*?)\*\/\s*/,
|
||||
headerRegex: /@header\(([\s\S]*?)\)/,
|
||||
topCommentsRegex: /^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/
|
||||
},
|
||||
".py": {
|
||||
start: '"""',
|
||||
end: '"""',
|
||||
regex: /^\s*"""([\s\S]*?)"""\s*/,
|
||||
headerRegex: /@header\(([\s\S]*?)\)/,
|
||||
topCommentsRegex: /^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/
|
||||
}
|
||||
};
|
||||
if (!fileType) throw new Error("fileType option is required");
|
||||
const ext = fileType.startsWith(".") ? fileType : `.${fileType}`;
|
||||
const config = COMMENT_CONFIG[ext];
|
||||
if (!config) throw new Error(`Unsupported file type: ${ext}`);
|
||||
if (mode === "top-comments") {
|
||||
const match = content.match(config.topCommentsRegex);
|
||||
if (match) {
|
||||
return content.substring(match[0].length).trim()
|
||||
}
|
||||
return content.trim()
|
||||
}
|
||||
const match = content.match(config.regex);
|
||||
if (!match) return content.trim();
|
||||
let [fullComment, innerContent] = match;
|
||||
if (config.headerRegex.test(innerContent)) {
|
||||
innerContent = innerContent.replace(config.headerRegex, "");
|
||||
const cleanedInner = innerContent.split("\n").filter(line => line.trim().length > 0).join("\n");
|
||||
if (!cleanedInner.trim()) {
|
||||
return content.replace(fullComment, "").trim()
|
||||
} else {
|
||||
const newComment = `${config.start}${cleanedInner}${config.end}`;
|
||||
return content.replace(fullComment, newComment).trim()
|
||||
}
|
||||
}
|
||||
return content.trim()
|
||||
}
|
||||
|
||||
function getOriginalJs(js_code) {
|
||||
let current_match = /var rule|function|let |var |const|class Rule|async|this\./;
|
||||
if (current_match.test(js_code)) {
|
||||
return js_code
|
||||
}
|
||||
js_code = removeHeader(js_code, {
|
||||
mode: "top-comments",
|
||||
fileType: ".js"
|
||||
});
|
||||
let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";
|
||||
let decode_content = "";
|
||||
|
||||
function aes_decrypt(data) {
|
||||
let key = CryptoJS.enc.Hex.parse("686A64686E780A0A0A0A0A0A0A0A0A0A");
|
||||
let iv = CryptoJS.enc.Hex.parse("647A797964730A0A0A0A0A0A0A0A0A0A");
|
||||
let encrypted = CryptoJS.AES.decrypt({
|
||||
ciphertext: CryptoJS.enc.Base64.parse(data)
|
||||
}, key, {
|
||||
iv: iv,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8);
|
||||
return encrypted
|
||||
}
|
||||
let error_log = false;
|
||||
|
||||
function logger(text) {
|
||||
if (error_log) {
|
||||
log(text)
|
||||
}
|
||||
}
|
||||
let decode_funcs = [text => {
|
||||
try {
|
||||
return ungzip(text)
|
||||
} catch (e) {
|
||||
logger("非gzip加密");
|
||||
return ""
|
||||
}
|
||||
}, text => {
|
||||
try {
|
||||
return base64Decode(text)
|
||||
} catch (e) {
|
||||
logger("非b64加密");
|
||||
return ""
|
||||
}
|
||||
}, text => {
|
||||
try {
|
||||
return aes_decrypt(text)
|
||||
} catch (e) {
|
||||
logger("非aes加密");
|
||||
return ""
|
||||
}
|
||||
}, text => {
|
||||
try {
|
||||
return RSA.decode(text, rsa_private_key, null)
|
||||
} catch (e) {
|
||||
logger("非rsa加密");
|
||||
return ""
|
||||
}
|
||||
}];
|
||||
let func_index = 0;
|
||||
while (!current_match.test(decode_content)) {
|
||||
decode_content = decode_funcs[func_index](js_code);
|
||||
func_index++;
|
||||
if (func_index >= decode_funcs.length) {
|
||||
break
|
||||
}
|
||||
}
|
||||
return decode_content
|
||||
}
|
||||
|
||||
function runMain(main_func_code, arg) {
|
||||
let mainFunc = function() {
|
||||
return ""
|
||||
};
|
||||
try {
|
||||
eval(main_func_code + "\nmainFunc=main;");
|
||||
return mainFunc(arg)
|
||||
} catch (e) {
|
||||
log(`执行main_funct发生了错误:${e.message}`);
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
function init(ext) {
|
||||
console.log("init");
|
||||
rule = {};
|
||||
rule_fetch_params = {};
|
||||
fetch_params = null;
|
||||
try {
|
||||
let muban = 模板.getMubans();
|
||||
if (typeof ext == "object") {
|
||||
rule = ext
|
||||
} else if (typeof ext == "string") {
|
||||
let is_file = ext.startsWith("file://");
|
||||
if (ext.startsWith("http") || is_file) {
|
||||
let query = getQuery(ext);
|
||||
if (is_file) {
|
||||
ext = ext.split("?")[0]
|
||||
}
|
||||
let js = request(ext, {
|
||||
method: "GET"
|
||||
});
|
||||
if (js) {
|
||||
js = getOriginalJs(js);
|
||||
eval("(function(){" + js.replace("var rule", "rule") + "})()")
|
||||
}
|
||||
if (query.type === "url" && query.params) {
|
||||
if (is_file && /^http/.test(query.params)) {
|
||||
rule.params = query.params
|
||||
} else {
|
||||
rule.params = urljoin(ext, query.params)
|
||||
}
|
||||
} else if (query.params) {
|
||||
rule.params = query.params
|
||||
}
|
||||
} else {
|
||||
ext = getOriginalJs(ext);
|
||||
eval("(function(){" + ext.replace("var rule", "rule") + "})()")
|
||||
}
|
||||
} else {
|
||||
console.log(`规则加载失败,不支持的规则类型:${typeof ext}`);
|
||||
return
|
||||
}
|
||||
rule.host = (rule.host || "").rstrip("/");
|
||||
HOST = rule.host;
|
||||
if (rule.hostJs) {
|
||||
console.log(`检测到hostJs,准备执行...`);
|
||||
try {
|
||||
eval(rule.hostJs);
|
||||
rule.host = HOST.rstrip("/")
|
||||
} catch (e) {
|
||||
console.log(`执行${rule.hostJs}获取host发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
if (rule["模板"] === "自动") {
|
||||
try {
|
||||
let host_headers = rule["headers"] || {};
|
||||
let host_html = getCode(HOST, {
|
||||
headers: host_headers
|
||||
});
|
||||
let match_muban = "";
|
||||
let muban_keys = Object.keys(muban).filter(it => !/默认|短视2|采集1/.test(it));
|
||||
for (let muban_key of muban_keys) {
|
||||
try {
|
||||
let host_data = JSON.parse(home({}, host_html, muban[muban_key].class_parse));
|
||||
if (host_data.class && host_data.class.length > 0) {
|
||||
match_muban = muban_key;
|
||||
console.log(`自动匹配模板:【${muban_key}】`);
|
||||
break
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(`自动匹配模板:【${muban_key}】错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
if (match_muban) {
|
||||
muban["自动"] = muban[match_muban];
|
||||
if (rule["模板修改"] && rule["模板修改"].startsWith("js:")) {
|
||||
eval(rule["模板修改"].replace("js:", "").trim())
|
||||
}
|
||||
} else {
|
||||
delete rule["模板"]
|
||||
}
|
||||
} catch (e) {
|
||||
delete rule["模板"]
|
||||
}
|
||||
}
|
||||
if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
|
||||
print("继承模板:" + rule.模板);
|
||||
rule = Object.assign(muban[rule.模板], rule)
|
||||
}
|
||||
let rule_cate_excludes = (rule.cate_exclude || "").split("|").filter(it => it.trim());
|
||||
let rule_tab_excludes = (rule.tab_exclude || "").split("|").filter(it => it.trim());
|
||||
rule_cate_excludes = rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it => it.trim()));
|
||||
rule_tab_excludes = rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it => it.trim()));
|
||||
rule.cate_exclude = rule_cate_excludes.join("|");
|
||||
rule.tab_exclude = rule_tab_excludes.join("|");
|
||||
rule.类型 = rule.类型 || "影视";
|
||||
rule.url = rule.url || "";
|
||||
rule.double = rule.double || false;
|
||||
rule.homeUrl = rule.homeUrl || "";
|
||||
rule.detailUrl = rule.detailUrl || "";
|
||||
rule.searchUrl = rule.searchUrl || "";
|
||||
rule.homeUrl = rule.host && rule.homeUrl ? urljoin(rule.host, rule.homeUrl) : rule.homeUrl || rule.host;
|
||||
rule.homeUrl = cheerio.jinja2(rule.homeUrl, {
|
||||
rule: rule
|
||||
});
|
||||
rule.detailUrl = rule.host && rule.detailUrl ? urljoin(rule.host, rule.detailUrl) : rule.detailUrl;
|
||||
rule.二级访问前 = rule.二级访问前 || "";
|
||||
if (rule.url.includes("[") && rule.url.includes("]")) {
|
||||
let u1 = rule.url.split("[")[0];
|
||||
let u2 = rule.url.split("[")[1].split("]")[0];
|
||||
rule.url = rule.host && rule.url ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.url
|
||||
} else {
|
||||
rule.url = rule.host && rule.url ? urljoin(rule.host, rule.url) : rule.url
|
||||
}
|
||||
if (rule.searchUrl.includes("[") && rule.searchUrl.includes("]") && !rule.searchUrl.includes("#")) {
|
||||
let u1 = rule.searchUrl.split("[")[0];
|
||||
let u2 = rule.searchUrl.split("[")[1].split("]")[0];
|
||||
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.searchUrl
|
||||
} else {
|
||||
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, rule.searchUrl) : rule.searchUrl
|
||||
}
|
||||
rule.timeout = rule.timeout || 5e3;
|
||||
rule.encoding = rule.编码 || rule.encoding || "utf-8";
|
||||
rule.search_encoding = rule.搜索编码 || rule.search_encoding || "";
|
||||
rule.图片来源 = rule.图片来源 || "";
|
||||
rule.图片替换 = rule.图片替换 || "";
|
||||
rule.play_json = rule.hasOwnProperty("play_json") ? rule.play_json : [];
|
||||
rule.pagecount = rule.hasOwnProperty("pagecount") ? rule.pagecount : {};
|
||||
rule.proxy_rule = rule.hasOwnProperty("proxy_rule") ? rule.proxy_rule : "";
|
||||
if (!rule.hasOwnProperty("sniffer")) {
|
||||
rule.sniffer = false
|
||||
}
|
||||
rule.sniffer = rule.hasOwnProperty("sniffer") ? rule.sniffer : "";
|
||||
rule.sniffer = !!(rule.sniffer && rule.sniffer !== "0" && rule.sniffer !== "false");
|
||||
rule.isVideo = rule.hasOwnProperty("isVideo") ? rule.isVideo : "";
|
||||
if (rule.sniffer && !rule.isVideo) {
|
||||
rule.isVideo = "http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*"
|
||||
}
|
||||
rule.tab_remove = rule.hasOwnProperty("tab_remove") ? rule.tab_remove : [];
|
||||
rule.tab_order = rule.hasOwnProperty("tab_order") ? rule.tab_order : [];
|
||||
rule.tab_rename = rule.hasOwnProperty("tab_rename") ? rule.tab_rename : {};
|
||||
if (rule.headers && typeof rule.headers === "object") {
|
||||
try {
|
||||
let header_keys = Object.keys(rule.headers);
|
||||
for (let k of header_keys) {
|
||||
if (k.toLowerCase() === "user-agent") {
|
||||
let v = rule.headers[k];
|
||||
console.log(v);
|
||||
if (["MOBILE_UA", "PC_UA", "UC_UA", "IOS_UA", "UA"].includes(v)) {
|
||||
rule.headers[k] = eval(v)
|
||||
}
|
||||
} else if (k.toLowerCase() === "cookie") {
|
||||
let v = rule.headers[k];
|
||||
if (v && v.startsWith("http")) {
|
||||
console.log(v);
|
||||
try {
|
||||
v = fetch(v);
|
||||
console.log(v);
|
||||
rule.headers[k] = v
|
||||
} catch (e) {
|
||||
console.log(`从${v}获取cookie发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(`处理headers发生错误:${e.message}`)
|
||||
}
|
||||
} else {
|
||||
rule.headers = {}
|
||||
}
|
||||
oheaders = deepCopy(rule.headers);
|
||||
rule_fetch_params = {
|
||||
headers: rule.headers,
|
||||
timeout: rule.timeout,
|
||||
encoding: rule.encoding
|
||||
};
|
||||
RKEY = typeof key !== "undefined" && key ? key : "drpy_" + (rule.title || rule.host);
|
||||
pre();
|
||||
init_test()
|
||||
} catch (e) {
|
||||
console.log(`init_test发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
let homeHtmlCache = undefined;
|
||||
|
||||
function home(filter, home_html, class_parse) {
|
||||
console.log("home");
|
||||
home_html = home_html || "";
|
||||
class_parse = class_parse || "";
|
||||
if (typeof rule.filter === "string" && rule.filter.trim().length > 0) {
|
||||
try {
|
||||
let filter_json = ungzip(rule.filter.trim());
|
||||
rule.filter = JSON.parse(filter_json)
|
||||
} catch (e) {
|
||||
rule.filter = {}
|
||||
}
|
||||
}
|
||||
let homeObj = {
|
||||
filter: rule.filter || false,
|
||||
MY_URL: rule.homeUrl,
|
||||
class_name: rule.class_name || "",
|
||||
class_url: rule.class_url || "",
|
||||
class_parse: class_parse || rule.class_parse || "",
|
||||
cate_exclude: rule.cate_exclude,
|
||||
home_html: home_html
|
||||
};
|
||||
return homeParse(homeObj)
|
||||
}
|
||||
|
||||
function homeVod(params) {
|
||||
console.log("homeVod");
|
||||
let homeVodObj = {
|
||||
"推荐": rule.推荐,
|
||||
double: rule.double,
|
||||
homeUrl: rule.homeUrl,
|
||||
detailUrl: rule.detailUrl
|
||||
};
|
||||
return homeVodParse(homeVodObj)
|
||||
}
|
||||
|
||||
function category(tid, pg, filter, extend) {
|
||||
let cateObj = {
|
||||
url: rule.url,
|
||||
"一级": rule.一级,
|
||||
tid: tid,
|
||||
pg: parseInt(pg),
|
||||
filter: filter,
|
||||
extend: extend
|
||||
};
|
||||
return categoryParse(cateObj)
|
||||
}
|
||||
|
||||
function detail(vod_url) {
|
||||
let orId = vod_url;
|
||||
let fyclass = "";
|
||||
log("orId:" + orId);
|
||||
if (vod_url.indexOf("$") > -1) {
|
||||
let tmp = vod_url.split("$");
|
||||
fyclass = tmp[0];
|
||||
vod_url = tmp[1]
|
||||
}
|
||||
let detailUrl = vod_url.split("@@")[0];
|
||||
let url;
|
||||
if (!detailUrl.startsWith("http") && !detailUrl.includes("/")) {
|
||||
url = rule.detailUrl.replaceAll("fyid", detailUrl).replaceAll("fyclass", fyclass)
|
||||
} else if (detailUrl.includes("/")) {
|
||||
url = urljoin(rule.homeUrl, detailUrl)
|
||||
} else {
|
||||
url = detailUrl
|
||||
}
|
||||
let detailObj = {
|
||||
orId: orId,
|
||||
url: url,
|
||||
"二级": rule.二级,
|
||||
"二级访问前": rule.二级访问前,
|
||||
detailUrl: detailUrl,
|
||||
fyclass: fyclass,
|
||||
tab_exclude: rule.tab_exclude
|
||||
};
|
||||
return detailParse(detailObj)
|
||||
}
|
||||
|
||||
function play(flag, id, flags) {
|
||||
let playObj = {
|
||||
url: id,
|
||||
flag: flag,
|
||||
flags: flags
|
||||
};
|
||||
return playParse(playObj)
|
||||
}
|
||||
|
||||
function search(wd, quick, pg) {
|
||||
if (rule.search_encoding) {
|
||||
if (rule.search_encoding.toLowerCase() !== "utf-8") {
|
||||
wd = encodeStr(wd, rule.search_encoding)
|
||||
}
|
||||
} else if (rule.encoding && rule.encoding.toLowerCase() !== "utf-8") {
|
||||
wd = encodeStr(wd, rule.encoding)
|
||||
}
|
||||
let searchObj = {
|
||||
searchUrl: rule.searchUrl,
|
||||
"搜索": rule.搜索,
|
||||
wd: wd,
|
||||
pg: pg || 1,
|
||||
quick: quick
|
||||
};
|
||||
return searchParse(searchObj)
|
||||
}
|
||||
|
||||
function proxy(params) {
|
||||
if (rule.proxy_rule && rule.proxy_rule.trim()) {
|
||||
rule.proxy_rule = rule.proxy_rule.trim()
|
||||
}
|
||||
if (rule.proxy_rule.startsWith("js:")) {
|
||||
rule.proxy_rule = rule.proxy_rule.replace("js:", "")
|
||||
}
|
||||
let proxyObj = {
|
||||
params: params,
|
||||
proxy_rule: rule.proxy_rule
|
||||
};
|
||||
return proxyParse(proxyObj)
|
||||
}
|
||||
|
||||
function sniffer() {
|
||||
let enable_sniffer = rule.sniffer || false;
|
||||
if (enable_sniffer) {
|
||||
log("开始执行辅助嗅探代理规则...")
|
||||
}
|
||||
return enable_sniffer
|
||||
}
|
||||
|
||||
function isVideo(url) {
|
||||
let t = 0;
|
||||
let is_video;
|
||||
if (rule.isVideo && rule.isVideo.trim()) {
|
||||
is_video = rule.isVideo.trim()
|
||||
}
|
||||
if (is_video.startsWith("js:")) {
|
||||
is_video = is_video.replace("js:", "");
|
||||
t = 1
|
||||
}
|
||||
let isVideoObj = {
|
||||
url: url,
|
||||
isVideo: is_video,
|
||||
t: t
|
||||
};
|
||||
let result = isVideoParse(isVideoObj);
|
||||
if (result) {
|
||||
log("成功执行辅助嗅探规则并检测到视频地址:\n" + rule.isVideo)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function getRule(key) {
|
||||
return key ? rule[key] || "" : rule
|
||||
}
|
||||
|
||||
function deepCopy(_obj) {
|
||||
return JSON.parse(JSON.stringify(_obj))
|
||||
}
|
||||
|
||||
function matchesAll(str, pattern, flatten) {
|
||||
if (!pattern.global) {
|
||||
pattern = new RegExp(pattern.source, "g" + (pattern.ignoreCase ? "i" : "") + (pattern.multiline ? "m" : ""))
|
||||
}
|
||||
var matches = [];
|
||||
var match;
|
||||
while ((match = pattern.exec(str)) !== null) {
|
||||
matches.push(match)
|
||||
}
|
||||
return flatten ? matches.flat() : matches
|
||||
}
|
||||
|
||||
function stringUtils() {
|
||||
Object.defineProperties(String.prototype, {
|
||||
replaceX: {
|
||||
value: function(regex, replacement) {
|
||||
let matches = matchesAll(this, regex, true);
|
||||
if (matches && matches.length > 1) {
|
||||
const hasCaptureGroup = /\$\d/.test(replacement);
|
||||
if (hasCaptureGroup) {
|
||||
return this.replace(regex, m => m.replace(regex, replacement))
|
||||
} else {
|
||||
return this.replace(regex, (m, p1) => m.replace(p1, replacement))
|
||||
}
|
||||
}
|
||||
return this.replace(regex, replacement)
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: false,
|
||||
writable: true
|
||||
},
|
||||
parseX: {
|
||||
get: function() {
|
||||
try {
|
||||
return JSON.parse(this)
|
||||
} catch (e) {
|
||||
console.log(e.message);
|
||||
return this.startsWith("[") ? [] : {}
|
||||
}
|
||||
},
|
||||
configurable: true,
|
||||
enumerable: false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function cut(text, start, end, method, All) {
|
||||
let result = "";
|
||||
let c = (t, s, e) => {
|
||||
let result = "";
|
||||
let rs = [];
|
||||
let results = [];
|
||||
try {
|
||||
let lr = new RegExp(String.raw`${s}`.toString());
|
||||
let rr = new RegExp(String.raw`${e}`.toString());
|
||||
const segments = t.split(lr);
|
||||
if (segments.length < 2) return "";
|
||||
let cutSegments = segments.slice(1).map(segment => {
|
||||
let splitSegment = segment.split(rr);
|
||||
return splitSegment.length < 2 ? undefined : splitSegment[0] + e
|
||||
}).filter(f => f);
|
||||
if (All) {
|
||||
return `[${cutSegments.join(",")}]`
|
||||
} else {
|
||||
return cutSegments[0]
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(`Error cutting text:${e.message}`)
|
||||
}
|
||||
return result
|
||||
};
|
||||
result = c(text, start, end);
|
||||
stringUtils();
|
||||
if (method && typeof method === "function") {
|
||||
result = method(result)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
function DRPY() {
|
||||
return {
|
||||
runMain: runMain,
|
||||
getRule: getRule,
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
proxy: proxy,
|
||||
sniffer: sniffer,
|
||||
isVideo: isVideo,
|
||||
fixAdM3u8Ai: fixAdM3u8Ai
|
||||
}
|
||||
}
|
||||
export default {
|
||||
runMain: runMain,
|
||||
getRule: getRule,
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
proxy: proxy,
|
||||
sniffer: sniffer,
|
||||
isVideo: isVideo,
|
||||
fixAdM3u8Ai: fixAdM3u8Ai,
|
||||
DRPY: DRPY
|
||||
};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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,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;
|
||||
|
||||
})));
|
||||
File diff suppressed because one or more lines are too long
Vendored
+2
@@ -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})}));
|
||||
@@ -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};
|
||||
@@ -0,0 +1,26 @@
|
||||
var rule = {
|
||||
title:'兔小贝',
|
||||
host:'https://www.tuxiaobei.com',
|
||||
homeUrl:'',
|
||||
url:'/list/mip-data?typeId=fyclass&page=fypage&callback=',
|
||||
detailUrl:'/play/fyid',
|
||||
searchUrl:'/search/index?key=**',
|
||||
searchable:2,
|
||||
headers:{
|
||||
'User-Agent':'MOBILE_UA'
|
||||
},
|
||||
timeout:5000,
|
||||
class_url:'2&3&4&25',
|
||||
class_name:'儿歌&故事&国学&启蒙',
|
||||
//class_name:'#page-viewport&&ul&&li;.text&&Text;a&&href;/(.*)',
|
||||
cate_exclude:'应用',
|
||||
推荐:'.pic-list.list-box;.items;.text&&Text;mip-img&&src;.all&&Text;a&&href',
|
||||
double:true,
|
||||
limit:5,
|
||||
play_parse:true,
|
||||
lazy:'js:fetch_params.headers["user-agent"] = IOS_UA;let html=fetch(input,fetch_params);let src = jsp.pdfh(html,"body&&#videoWrap&&video-src");input=src;',
|
||||
// 一级:'json:data.items;name;image;collect_num;category_id+video_id',
|
||||
一级:'json:data.items;name;image;duration_string;video_id',
|
||||
二级:'*',
|
||||
搜索:'.list-con&&.items;.text&&Text;mip-img&&src;.time&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
var rule={title:"斗鱼直播",host:"https://m.douyu.com",homeUrl:"/api/home/mix",url:"/api/room/list?page=fypage&type=fyfilter",filterable:1,filter_url:"{{fl.cateId}}",filter:{yl:[{key:"cateId",name:"分类",value:[{n:"原创IP",v:"ip"},{n:"一起看",v:"yqk"},{n:"二次元",v:"ecy"},{n:"音乐",v:"music"},{n:"户外",v:"HW"},{n:"美食",v:"ms"},{n:"心动派对",v:"xdpd"},{n:"音遇恋人",v:"yinyu"},{n:"星秀",v:"xingxiu"},{n:"心动FM",v:"dtxs"},{n:"娱乐推荐",v:"yltj"},{n:"新选",v:"xinxuan"}]}],PCgame:[{key:"cateId",name:"分类",value:[{n:"英雄联盟",v:"LOL"},{n:"热门游戏",v:"rmyx"},{n:"穿越火线",v:"CF"},{n:"重生边缘",v:"CSBYOL"},{n:"无畏契约",v:"VALORANT"},{n:"CFHD",v:"CFHD"},{n:"命运方舟",v:"LostArk"},{n:"DNF",v:"DNF"},{n:"DOTA2",v:"DOTA2"},{n:"使命召唤",v:"COD"},{n:"炉石传说",v:"How"},{n:"CS2",v:"CounterStrike"},{n:"lol云顶之弈",v:"ydzhy"},{n:"魔兽争霸",v:"mszb"},{n:"魔兽怀旧服",v:"wowclassic"},{n:"全民街篮",v:"qmjl"},{n:"自走棋",v:"dota2rpg"},{n:"传奇",v:"cq"},{n:"跑跑卡丁车",v:"Popkart"},{n:"网易游戏",v:"wyyx"},{n:"星际争霸",v:"SC"},{n:"守望先锋",v:"Overwatch"},{n:"DOTA",v:"DOTA"},{n:"魔兽世界",v:"WOW"},{n:"剑网3",v:"JX3"},{n:"魔域",v:"EudemonsOnline"},{n:"我的世界",v:"MC"},{n:"超激斗梦境",v:"cjdmj"},{n:"冒险岛",v:"mxd"},{n:"三国杀",v:"sanguosha"},{n:"梦幻西游",v:"MHXYOL"},{n:"天涯明月刀",v:"tianya"},{n:"街头篮球",v:"jtlq"},{n:"NBA2KOL2",v:"NBA2KOL2"},{n:"QQ飞车端游",v:"qqfcdy"},{n:"战地之王",v:"AVA"},{n:"军事游戏",v:"jsyx"},{n:"棋牌娱乐",v:"qipai"},{n:"FC ONLINE",v:"FCOL"},{n:"热门网游",v:"rmwy"},{n:"卡拉彼丘",v:"klbq"},{n:"诛仙世界",v:"zxsj"},{n:"千古风流",v:"qgflpc"},{n:"APEX",v:"APEX"},{n:"流放之路POE",v:"PathofExile"},{n:"剑网3缘起",v:"JW3YQ"},{n:"逆水寒",v:"nsh"},{n:"风暴英雄",v:"HOTS"},{n:"逆战",v:"NZ"},{n:"坦克世界",v:"TKSJ"},{n:"战舰世界",v:"wfws"},{n:"巫师之昆特牌",v:"wszktp"},{n:"反恐精英Online",v:"CS"},{n:"暗黑破坏神",v:"DIABLO"},{n:"梦三国2",v:"msg2"},{n:"传奇世界",v:"cqsj"},{n:"方舟:生存进化",v:"fzscjh"},{n:"神武4电脑版",v:"swdnb"},{n:"群雄逐鹿",v:"qxzl"},{n:"堡垒之夜",v:"blzy"},{n:"无限法则",v:"roe"},{n:"问道电脑版",v:"wddnb"},{n:"西山居游戏",v:"Seasun"},{n:"最终幻想14",v:"FF14"},{n:"战意",v:"WYZY"},{n:"剑灵",v:"BladeSoul"},{n:"星际战甲",v:"Warframe"},{n:"龙之谷",v:"DragonNest"},{n:"铁甲雄兵",v:"tjxb"},{n:"古剑奇谭网络版",v:"gjqtwlb"},{n:"轩辕传奇",v:"XYCQ"},{n:"神途",v:"shentu"},{n:"激战2",v:"GuildWars2"},{n:"高达文化区",v:"gdyxq"},{n:"忍者村大战2",v:"rzcdz2"},{n:"RPG网游专区",v:"rpgwyzq"},{n:"诛仙3",v:"zhuxian3"},{n:"笑傲江湖OL",v:"xajhol"},{n:"冒险岛2",v:"MXD2"},{n:"超击突破",v:"SuperPeople"},{n:"无尽战区",v:"WJZQ"},{n:"斗战神",v:"dzs"},{n:"永恒之塔",v:"AION"},{n:"九阴真经",v:"JYZJ"},{n:"FPS综合网游",v:"FPSOL"},{n:"劲舞团",v:"jwt"},{n:"天下",v:"tianxai"},{n:"泡泡堂",v:"ppt"},{n:"武侠乂",v:"wxy"},{n:"音乐游戏",v:"MG"},{n:"新倩女幽魂",v:"ONLINE"},{n:"天谕",v:"tianyu"},{n:"征途2",v:"zhengtu2"},{n:"QQ炫舞",v:"qqxw"},{n:"泰亚史诗",v:"tyss"},{n:"怪物猎人ol",v:"MHol"},{n:"手工星球",v:"sgxq"},{n:"星战前夜:晨曦",v:"EVE"},{n:"热血传奇:本源",v:"rxcqhjsgb"},{n:"枪火重生",v:"qhcs"},{n:"彩虹岛",v:"CHD"},{n:"御龙在天",v:"YLZT"},{n:"英魂之刃",v:"YHZR"},{n:"自由篮球",v:"ZYLQ"},{n:"洛奇英雄传",v:"LQYXZ"},{n:"封印者",v:"FYZ"},{n:"合金弹头",v:"HJDT"},{n:"新英雄年代",v:"XYXSD"},{n:"星尘传说",v:"XCCS"},{n:"盛趣游戏",v:"SQYX"},{n:"新热血英豪",v:"XRXYH"},{n:"沙盒游戏",v:"SHYX"},{n:"我的世界:地下城",v:"MD"},{n:"恐鬼症",v:"KGZ"},{n:"领地人生",v:"LDRS"},{n:"梦塔防",v:"TDOTK"},{n:"大话西游2",v:"dhxy2"},{n:"猎人",v:"lr"},{n:"热血江湖online",v:"rxjhol"},{n:"千年3",v:"qn3"},{n:"逍遥情缘",v:"xyqy"},{n:"快乐西游",v:"klxy"},{n:"鹿鼎记",v:"ldj"},{n:"新桃花源记",v:"xthyj"},{n:"疾风之刃电脑版",v:"jfzr1"},{n:"武魂2电脑版",v:"wh2pc"},{n:"奇迹世界sun",v:"qjsjsun"},{n:"剑侠世界2电脑版",v:"jxsj2pc"},{n:"斩魂",v:"zhpc"},{n:"大唐2",v:"dt2pc"},{n:"蜀山:初章",v:"ssczpc"},{n:"狼人对决网游",v:"lrdjpc"},{n:"武林群侠传",v:"wlqxzpc"},{n:"飘流幻境",v:"plhjpc"},{n:"破天一剑",v:"ptyj"},{n:"四国军棋",v:"sgjq"},{n:"新大话西游3",v:"xy3"},{n:"装甲战争",v:"zjzz"},{n:"暴雪游戏综合",v:"g_bliz"},{n:"长尾4部虚拟分区",v:"cw4bxnfq"},{n:"燕云十六声",v:"WHEREWINDSMEET"},{n:"THE FINALS",v:"THEFINALS"},{n:"NBA2K Online",v:"NBA2KOL"},{n:"塔瑞斯世界",v:"Tarisland"},{n:"跑跑卡丁车:漂移",v:"KartRiderDrift"},{n:"传奇永恒",v:"EternalLegend"},{n:"全境封锁2",v:"TheDivision2"},{n:"盛趣传奇",v:"sqcq"},{n:"火爆热游",v:"hbry"},{n:"火爆传奇",v:"hbcq"}]}],djry:[{key:"cateId",name:"分类",value:[{n:"主机游戏",v:"TVgame"},{n:"刺客信条:英灵殿",v:"AC"},{n:"马里奥制造",v:"Mario"},{n:"逃离塔科夫",v:"EFT"},{n:"命运2",v:"MY2"},{n:"恐怖游戏",v:"Horror"},{n:"荒野大镖客",v:"hydbk"},{n:"灵魂筹码",v:"lhcm"},{n:"骑马与砍杀",v:"MountAndBlade"},{n:"只狼",v:"ZL"},{n:"格斗游戏",v:"FTG"},{n:"饥荒",v:"DontStarve"},{n:"全境封锁",v:"qjfs"},{n:"怀旧游戏",v:"classic"},{n:"NBA2K",v:"NBA2K"},{n:"八方旅人",v:"OT"},{n:"血污:夜之仪式",v:"Blood"},{n:"人类一败涂地",v:"Human"},{n:"环世界",v:"RimWorld"},{n:"古墓丽影",v:"gmly"},{n:"鬼泣",v:"DMC"},{n:"往日不再",v:"WRBZ"},{n:"仙剑奇侠传",v:"PAL"},{n:"神秘海域",v:"Uncharted"},{n:"塞尔达系列",v:"TLoZ"},{n:"僵尸世界大战",v:"WWZ"},{n:"足球游戏",v:"zq"},{n:"橙光",v:"cg"},{n:"了不起的修仙模拟器",v:"ACS"},{n:"女神异闻录",v:"P5"},{n:"超级马里奥",v:"SMO"},{n:"三国志系列",v:"Sangokushi"},{n:"最终幻想",v:"FF"},{n:"中土世界:战争之影",v:"MiddleEarth"},{n:"流放者柯南",v:"Conan"},{n:"三国群英传",v:"SANGO"},{n:"无主之地",v:"Bor"},{n:"辐射",v:"fs"},{n:"SCUM",v:"Scum"},{n:"文明",v:"CVI"},{n:"仁王",v:"NIOH"},{n:"缺氧",v:"ONI"},{n:"全面吃鸡模拟器",v:"TAB"},{n:"古剑奇谭",v:"GuJian3"},{n:"皇牌空战",v:"hpkz"},{n:"体育游戏",v:"tyyx"},{n:"海岛大亨",v:"hddh"},{n:"碧海黑帆",v:"klhdt"},{n:"植物大战僵尸:花园战争系列",v:"PvsZ"},{n:"蜘蛛侠",v:"Spide"},{n:"勇者斗恶龙:建造者2",v:"DQB2"},{n:"遗迹:灰烬重生",v:"Rem"},{n:"血源",v:"BB"},{n:"旺达与巨像",v:"SotC"},{n:"死亡搁浅",v:"DS"},{n:"模拟人生",v:"Sims"},{n:"空洞骑士",v:"HKS"},{n:"胡闹厨房",v:"Overcooked"},{n:"地铁:离去",v:"ME"},{n:"生死狙击2",v:"ssjjtwo"},{n:"三国战纪",v:"sgzj"},{n:"怀旧FC",v:"edwcy"},{n:"经典单机",v:"jddj"},{n:"英雄无敌",v:"HoMM"},{n:"街机游戏",v:"jjyx"},{n:"合金装备",v:"MetalGear"},{n:"红色警戒",v:"hsjj"},{n:"镜之边缘",v:"MsE"},{n:"勿忘我",v:"Remw"},{n:"火焰纹章系列",v:"FireEmblem"},{n:"星露谷物语",v:"Stardew"},{n:"火炬之光",v:"Torchlight"},{n:"赛博朋克2077",v:"Cyberpunk"},{n:"中国式家长",v:"CP"},{n:"精灵宝可梦系列",v:"Pokemon"},{n:"尼尔:机械纪元",v:"NieR"},{n:"无人深空",v:"NMS"},{n:"EVOTINCTION",v:"EVOTINCTION"},{n:"GT赛车7",v:"GT"},{n:"超级机器人大战",v:"SRW"},{n:"这是我的战争",v:"TWoM"},{n:"杀戮尖塔",v:"sljt"},{n:"冰汽时代",v:"Frostpunk"},{n:"帝国时代",v:"AoEIV"},{n:"死亡空间",v:"swkj"},{n:"凯瑟琳Full Body",v:"CFB"},{n:"足球经理",v:"Football"},{n:"雨中冒险",v:"RoR"},{n:"亿万僵尸",v:"Billions"},{n:"武装突袭",v:"ArmA"},{n:"石油大亨",v:"Oil"},{n:"欧洲卡车模拟器",v:"Truck"},{n:"美国逃亡者",v:"Fugitive"},{n:"漫漫长夜",v:"mmcy"},{n:"永恒轮回",v:"Survival"},{n:"孤岛惊魂",v:"FarCry"},{n:"都市:天际线",v:"Skylines"},{n:"盗贼之海",v:"hdzh"},{n:"Dayz",v:"DayZ"},{n:"60秒",v:"60S"},{n:"俄罗斯钓鱼",v:"RF"},{n:"猎人:荒野的召唤",v:"theHunter"},{n:"恐怖黎明",v:"GD"},{n:"看门狗",v:"kmg"},{n:"真三国无双",v:"DW"},{n:"战斗砖块剧场",v:"BT"},{n:"泰拉瑞亚",v:"Terraria"},{n:"异星工厂",v:"Factorio"},{n:"UFC",v:"UFC"},{n:"底特律:变人",v:"Detroit"},{n:"恶魔城",v:"Castlevania"},{n:"毁灭战士",v:"Doom"},{n:"火影忍者:究极忍者风暴",v:"Naruto"},{n:"坎巴拉太空计划",v:"Kerbal"},{n:"龙珠:超宇宙",v:"DBX"},{n:"马里奥赛车",v:"MarioKart"},{n:"欧陆风云",v:"EU"},{n:"乞丐模拟器",v:"HoboToughLife"},{n:"小偷模拟器",v:"ThiefSimulator"},{n:"逆转裁判",v:"AceA"},{n:"超越光速",v:"FTL"},{n:"植物大战僵尸",v:"PvZ"},{n:"游戏开发者",v:"GGM"},{n:"最后的绿洲",v:"LO"},{n:"大富翁",v:"RichMan"},{n:"反恐精英",v:"fkjy"},{n:"英雄连",v:"yxl"},{n:"永劫无间",v:"NB"},{n:"初音未来:歌姬计划",v:"MIKU"},{n:"部落与弯刀",v:"BLYWD"},{n:"一起开火车!",v:"Unrailed"},{n:"霓虹深渊",v:"NA"},{n:"主机其他游戏",v:"OG"},{n:"战场兄弟",v:"ZCXD"},{n:"地狱潜者",v:"DYQZ"},{n:"地下城",v:"dxc"},{n:"人间地狱",v:"RJDY"},{n:"temtem",v:"temtem"},{n:"弹丸论破",v:"dwlp"},{n:"皇家美食",v:"HJMS"},{n:"基佬大乱斗",v:"jldld"},{n:"僵尸毁灭工程",v:"jshmgc"},{n:"岛屿生存者",v:"Sur"},{n:"冬日计划",v:"drjh"},{n:"四海兄弟",v:"shxd"},{n:"创世理想乡",v:"Craftopia"},{n:"柯娜:精神之桥",v:"Kena"},{n:"幽灵线:东京",v:"GTO"},{n:"Solar Ash",v:"Ash"},{n:"BUGSNAX",v:"BUGSNAX"},{n:"生化危机4重制版",v:"ResidentEvil"},{n:"Grounded",v:"Grounded"},{n:"Superliminal",v:"Superliminal"},{n:"Omno",v:"Omno"},{n:"Röki",v:"Roki"},{n:"Undungeon",v:"Undungeon"},{n:"糖豆人",v:"FallGuys"},{n:"渡神纪",v:"Gods"},{n:"Aeolis Tournament",v:"Aeolis"},{n:"猛兽派对",v:"Animals"},{n:"Olija",v:"Olija"},{n:"Creaks",v:"Creaks"},{n:"暗影火炬城",v:"FIST"},{n:"阿尔比恩",v:"Albion"},{n:"Uragun",v:"Uragun"},{n:"戴森球计划",v:"DSP"},{n:"Muse Dash",v:"MuseDash"},{n:"恐惧之间",v:"Fearsurrounds"},{n:"孤岛惊魂6",v:"FarCry6"},{n:"怪物猎人",v:"MonsterHunterRise"},{n:"黑神话:悟空",v:"BlackMythWuKong"},{n:"仁王2",v:"Nioh2"},{n:"三国群英传8",v:"TheThreeKingdoms8"},{n:"三国志14",v:"THREEKINGDOMSXIV"},{n:"杀手3",v:"Hitman3"},{n:"双人成行",v:"ittakestwo"},{n:"Scrapnaut",v:"Scrapnaut"},{n:"租房达人",v:"TheTenants"},{n:"狙击手:幽灵战士契约2",v:"SniperContracts2"},{n:"全面战争",v:"TotalWarWARHAMMER"},{n:"复体",v:"TheComplex"},{n:"战争机器:战术小队",v:"GearsTactics"},{n:"海绵宝宝:比奇堡的冒险",v:"BattleforBikini"},{n:"分离",v:"Disintegration"},{n:"奇妙探险队2",v:"CuriousExpedition2"},{n:"刺客信条:奥德赛",v:"Odyssey"},{n:"丧尸围城4",v:"DeadRising4"},{n:"星球大战:前线",v:"Battlefront"},{n:"Moonray",v:"Moonray"},{n:"灵魂旅人",v:"SpiritFarerlhlr"},{n:"面容",v:"Visage"},{n:"车祸现场模拟器",v:"Accident"},{n:"破门而入2:北方特遣队",v:"DoorKickers2"},{n:"俄罗斯方块效应:连接",v:"TetrisEffect"},{n:"SD高达G世纪:起源",v:"SDGundamG"},{n:"东方计划:不可思议的幻想乡",v:"TouHou"},{n:"Fate/EXTELLA",v:"FateEXTELLA"},{n:"临终:重生试炼",v:"DYINGReborn"},{n:"虚拟现实乐园",v:"VRWorlds"},{n:"苍翼默示录:神观之梦",v:"CentralFiction"},{n:"晚班",v:"LateShift"},{n:"子弹风暴",v:"Bulletstorm"},{n:"巡警",v:"BeatCop"},{n:"耻辱之日",v:"DayofInfamy"},{n:"狙击精英4",v:"SniperElite4"},{n:"热血物语:地下世界",v:"RiverCityRansom"},{n:"史诗战争模拟器",v:"BattleSimulator"},{n:"银河护卫队",v:"Guardians"},{n:"上古卷轴:传奇",v:"ScrollsLegends"},{n:"闪乱神乐:少女们的选择",v:"SenranKagura"},{n:"幽灵行动:荒野",v:"GhostReconWildland"},{n:"白色情人节",v:"WhiteDay"},{n:"誓死坚守",v:"UntilWeDie"},{n:"狂战传说",v:"TalesofBerseria"},{n:"双截龙4",v:"DoubleDragon4"},{n:"地下蚁国",v:"Undergrowth"},{n:"寻找天堂",v:"findparadise"},{n:"画中世界",v:"Gorogoa"},{n:"现代战争",v:"ModernCombat"},{n:"绯红结系",v:"SCARLETNEXUS"},{n:"罪恶装备:STRIVE",v:"GuiltyGear"},{n:"涅克罗蒙达:赏金猎人",v:"NHiredGun"},{n:"骑士精神2",v:"Chivalry2"},{n:"Rune Knights",v:"RuneKnights"},{n:"红至日2:幸存者",v:"TheRed2"},{n:"真女神转生3",v:"ShinMegami3"},{n:"速降王者",v:"Descenders"},{n:"工业崛起",v:"RiseIndustry"},{n:"前往中世纪",v:"GoMedieval"},{n:"Arid",v:"Arid"},{n:"伊始之地",v:"TerraNil"},{n:"进击的巨人2",v:"AttackonTitan2"},{n:"魔域之书",v:"Bookofdevil"},{n:"自由人:游击战争",v:"Freeman"},{n:"战国无双5",v:"SWarriors5"},{n:"不要喂食猴子",v:"NotFeedMonkeys"},{n:"古剑奇谭3",v:"GuJianqitan3"},{n:"剑士",v:"KenshiJS"},{n:"GRIS",v:"GRIS"},{n:"古剑奇谭:永夜",v:"gujianyongye"},{n:"永恒边缘",v:"EdgeEternity"},{n:"Below",v:"Below"},{n:"彩虹坠入",v:"IrisFall"},{n:"嗜血印",v:"BloodySpell"},{n:"兽人必须死3",v:"OrcsDie3"},{n:"狙击精英VR",v:"SniperEliteVR"},{n:"遗忘之城",v:"ForgotCity"},{n:"Last Stop",v:"LastStop"},{n:"边界之外",v:"OutofLine"},{n:"从军",v:"jointhearmy"},{n:"石炉",v:"Stonehearth"},{n:"狂热运输2",v:"TransportFever2"},{n:"机甲战士5",v:"MechWarrior5"},{n:"PICO PARK",v:"PICOPARK"},{n:"光明记忆:无限",v:"Brightmemory"},{n:"秘馆疑踪",v:"HeavenDust"},{n:"侠盗公司",v:"RogueCompany"},{n:"英雄传说:创之轨迹",v:"HajimariNOKiseki"},{n:"战地系列",v:"Battlefiel"},{n:"塞尔达传说:天空之剑HD",v:"SkywardSword"},{n:"尘埃异变",v:"GRIME"},{n:"异形:火力小队精英",v:"FireteamElite"},{n:"12分钟",v:"TwelveMinutes"},{n:"九十六号公路",v:"Road96"},{n:"FORECLOSED",v:"FORECLOSED"},{n:"RiMS Racing",v:"RiMSRacing"},{n:"钢铁之尾",v:"TailsofIron"},{n:"剑侠图",v:"JianXiaTu"},{n:"审判之逝",v:"Lostjudgment"},{n:"帝国神话",v:"mythofempires"},{n:"艾尔登法环",v:"ELDENRING"},{n:"极限竞速:地平线5",v:"ForzaHorizon5"},{n:"使命召唤系列",v:"CALLOFDUTYCOD"},{n:"网吧模拟器",v:"InternetCS"},{n:"The Anacrusis",v:"TheAnacrusis"},{n:"浩劫前夕",v:"TheDayBefore"},{n:"文字游戏",v:"WordGame"},{n:"消逝的光芒2",v:"DyingLight2"},{n:"无主之地3",v:"Borderlands3"},{n:"战神:诸神黄昏",v:"GodofWarRagnarok"},{n:"海上狼人杀",v:"DreadHunger"},{n:"侠乂行:浪迹天涯",v:"XIAYIXING"},{n:"最终幻想:起源",v:"STRANGEROFPARADISE"},{n:"HordeCore",v:"HordeCore"},{n:"双子星:盛气凌人",v:"YoungSouls"},{n:"Indies’ Lies",v:"IndiesLies"},{n:"Deck of Ashes",v:"DeckofAshes"},{n:"星空",v:"Starfield"},{n:"Ilysia",v:"Ilysia"},{n:"Project Q",v:"ProjectQ"},{n:"Pummel Party",v:"PummelParty"},{n:"Holomento",v:"Holomento"},{n:"Overprime",v:"Overprime"},{n:"森林之子",v:"SonsOfTheForest"},{n:"弈仙牌",v:"yixianpai"},{n:"夜族崛起",v:"VRising"},{n:"罗马复兴",v:"RomanRenaissance"},{n:"萤火突击",v:"LostLight"},{n:"High on Life",v:"HighonLife"},{n:"匹诺曹的谎言",v:"LiesofP"},{n:"Isonzo",v:"Isonzo"},{n:"瘟疫传说:安魂曲",v:"Requiem"},{n:"漂泊牧歌",v:"WanderingVillage"},{n:"塞尔达传说:王国之泪",v:"TEARSKINGDOM"},{n:"破碎线",v:"Shatterline"},{n:"卧龙:苍天陨落",v:"Wolong"},{n:"卡库远古封印",v:"KAKU"},{n:"原子之心",v:"AtomicHeart"},{n:"Warhaven",v:"Warhaven"},{n:"宝可梦:朱/紫",v:"ScarletandViolet"},{n:"Evercore Heroes",v:"EvercoreHeroes"},{n:"灵魂石幸存者",v:"SoulstoneSurvivors"},{n:"主机一起看",v:"zjyqk"},{n:"社交互动游戏",v:"SJHDYX"},{n:"轮回修仙路",v:"lhxxl"},{n:"Divine Knockout",v:"DivineKnockout"},{n:"至暗时刻",v:"DarkandDarker"},{n:"自杀小队:杀死正义联盟",v:"KTJL"},{n:"XDefiant",v:"XDefiant"},{n:"Warlander",v:"Warlander"},{n:"Scars Above",v:"ScarsAbove"},{n:"Pacific Drive",v:"PacificDrive"},{n:"最终幻想16",v:"FinalFantasyXVI"},{n:"街头霸王",v:"StreetFighter"},{n:"Tchia",v:"Tchia"},{n:"大侠立志传",v:"HerosAdventure"},{n:"最后纪元",v:"LastEpoch"},{n:"魔戒:咕噜",v:"Gollum"},{n:"Prison Life 2",v:"PrisonLife"},{n:"Innchanted",v:"Innchanted"},{n:"幻兽帕鲁",v:"Palworld"},{n:"Life by You",v:"LifebyYou"},{n:"Eresys",v:"Eresys"},{n:"Pax Dei",v:"PaxDei"},{n:"Teravit",v:"Teravit"},{n:"Caliber",v:"Caliber"},{n:"沙盒与副本:英勇之地",v:"HerosLand"},{n:"Coridden",v:"Coridden"},{n:"Unrecord",v:"Unrecord"},{n:"Deducto 2",v:"Deducto2"},{n:"装甲核心6:境界天火",v:"ArmoredCore"},{n:"Wayfinder",v:"Wayfinder"},{n:"迷瘴纪事",v:"MiasmaChronicles"},{n:"Minigame Madness",v:"MinigameMadness"},{n:"严阵以待",v:"ReadyorNot"},{n:"上古卷轴OL",v:"TheElderScrolls"},{n:"弹幕风暴",v:"dmfb"},{n:"学园构想家",v:"SchoolHomeroom"},{n:"弈仙牌手游",v:"YiXianm"},{n:"Jusant",v:"JUSANT"},{n:"潜水员戴夫",v:"DAVETHEDIVER"},{n:"GYLT",v:"GYLT"},{n:"索利斯堡",v:"FortSolis"},{n:"Towerborne",v:"Towerborne"},{n:"33 Immortals",v:"33Immortals"},{n:"Wildmender",v:"Wildmender"},{n:"How 2 Escape",v:"How2Escape"},{n:"碧蓝幻想:Relink",v:"Relink"},{n:"漫威蜘蛛侠2",v:"MarvelSpiderman2"},{n:"王权与自由",v:"ThroneandLiberty"},{n:"博德之门3",v:"BG3"},{n:"Eternights",v:"Eternights"},{n:"Project F",v:"ProjectF"},{n:"BaldMan Climbs Up",v:"BaldManClimbsUp"},{n:"FC24",v:"FC24"},{n:"NBA 2K24",v:"NBA2K24"},{n:"沉没之地",v:"Sunkenland"},{n:"七日世界",v:"qrsj"},{n:"雾锁王国",v:"wswg"}]}],syxx:[{key:"cateId",name:"分类",value:[{n:"元梦之星",v:"YMZX"},{n:"王者荣耀",v:"wzry"},{n:"LOL手游",v:"LOLM"},{n:"崩坏:星穹铁道",v:"bhxqtd"},{n:"和平精英",v:"hpjy"},{n:"暗区突围",v:"aqtw"},{n:"蛋仔派对",v:"dzpd"},{n:"高能英雄",v:"gnyx"},{n:"幻塔",v:"ht"},{n:"火影忍者",v:"hyrz"},{n:"COD手游",v:"smzhsy"},{n:"lol电竞经理",v:"EGAME"},{n:"DNF手游",v:"mdnf"},{n:"金铲铲之战",v:"JGAME"},{n:"天刀手游",v:"tdsy"},{n:"原神",v:"yuanshen"},{n:"航海王热血航线",v:"HHWRXHX"},{n:"逆水寒手游",v:"NSHM"},{n:"万国觉醒",v:"wgjx"},{n:"鸿图之下",v:"htzx"},{n:"欢乐麻将",v:"HLMJ"},{n:"王者模拟战",v:"wzrpg"},{n:"中国象棋",v:"ZGXQ"},{n:"天谕手游",v:"tysy"},{n:"巅峰坦克",v:"DFTK"},{n:"新游中心",v:"xyzx"},{n:"热门手游",v:"phone"},{n:"梦幻手游",v:"mhxy"},{n:"QQ飞车",v:"qqfcsy"},{n:"第五人格",v:"dwrg"},{n:"欢乐斗地主",v:"hlddz"},{n:"荒野乱斗",v:"hyld"},{n:"阴阳师",v:"yys"},{n:"狼人杀",v:"LRS"},{n:"JJ斗地主",v:"jj"},{n:"梦幻新诛仙",v:"mhxzx"},{n:"街霸对决",v:"jbdj"},{n:"机动都市阿尔法",v:"jddsaef"},{n:"一人之下",v:"yrzx"},{n:"多多自走棋",v:"zzq"},{n:"崩坏3",v:"bhxl"},{n:"风云岛行动",v:"fydxd"},{n:"云游戏",v:"cloudgame"},{n:"跑跑手游",v:"PPKDCSY"},{n:"率土之滨",v:"stzb"},{n:"灌篮高手",v:"glgs"},{n:"皇室战争",v:"hszz"},{n:"忍者必须死3",v:"rzbxs3"},{n:"神武4手游",v:"sw3"},{n:"梦幻模拟战",v:"mhmnz"},{n:"实况足球",v:"skzq"},{n:"剑与远征",v:"jyyz"},{n:"航海王:燃烧意志",v:"hhwrsyz"},{n:"球球大作战",v:"qqdzz"},{n:"英雄杀",v:"yxs"},{n:"魔域口袋版",v:"mykdb"},{n:"口袋新旅程",v:"KDXLC"},{n:"剑网3:指尖江湖",v:"jw3zjjh"},{n:"部落冲突",v:"blct"},{n:"剑与家园",v:"jyjy"},{n:"新笑傲江湖",v:"xxajh"},{n:"猫和老鼠",v:"mhls"},{n:"猎人手游",v:"lrlr"},{n:"明日之后",v:"mrzh"},{n:"影之诗",v:"yzs"},{n:"决战平安京",v:"jzpaj"},{n:"魂斗罗归来",v:"DLHGL"},{n:"贪吃蛇大作战",v:"tcsdzz"},{n:"圣斗士星矢",v:"sdsxs"},{n:"魔力宝贝手游",v:"mlbbsy"},{n:"哈利波特:魔法觉醒",v:"HarryPotter"},{n:"手游推广",v:"rmsy"},{n:"魔灵召唤",v:"mlzh"},{n:"香肠派对",v:"xcpd"},{n:"迷你世界",v:"MNSJ"},{n:"荒野行动",v:"hyxd"},{n:"大话西游2口袋版",v:"dhxy2kdb"},{n:"FC足球世界",v:"FCZQSJ"},{n:"街篮",v:"jl"},{n:"一起来捉妖",v:"yiqilaizhuoyao"},{n:"明日方舟",v:"mrfz"},{n:"自由幻想手游",v:"zyhx"},{n:"一梦江湖",v:"ymjh"},{n:"王牌战争:文明重启",v:"wmcq"},{n:"完美世界手游",v:"wmsjsy"},{n:"拳皇98OL",v:"kof98"},{n:"赛尔号",v:"srh"},{n:"猎魂觉醒",v:"lhjx"},{n:"仙境传说",v:"xjcs"},{n:"逃跑吧少年",v:"tpbsn"},{n:"石器时代",v:"sqsd"},{n:"英魂之刃口袋版",v:"yh"},{n:"拉结尔",v:"lje"},{n:"倩女幽魂手游",v:"qnyhsy"},{n:"决斗之城2",v:"jdzc2"},{n:"传奇手游",v:"cqsy"},{n:"欢乐升级",v:"hlsj"},{n:"雀魂",v:"Majsoul"},{n:"二次元手游",v:"ecysy"},{n:"天龙八部online",v:"tianlongbabuonline"},{n:"征途2手游",v:"zt2sy"},{n:"万王之王3D",v:"wwzw3D"},{n:"武林外传",v:"wlwz"},{n:"我叫MT4",v:"MT4"},{n:"元气骑士",v:"yuanqiqishi"},{n:"红警OL手游",v:"hjolsy"},{n:"植物大战僵尸手游",v:"ZWDZJS"},{n:"龙之谷手游",v:"lzgsy"},{n:"创造与魔法",v:"ccymf"},{n:"境界-死神激斗",v:"jjssjd"},{n:"奇迹觉醒",v:"qjjx"},{n:"光遇",v:"skygy"},{n:"游戏王:决斗链接",v:"yxwjdlj"},{n:"巅峰战舰",v:"dfzj"},{n:"绝世战魂",v:"jszh"},{n:"寻仙",v:"xunxian"},{n:"天天象棋",v:"ttxq"},{n:"王国纪元",v:"wgjy"},{n:"龙族幻想",v:"lzhx"},{n:"剑网3指尖对弈",v:"jwszjdy"},{n:"剑侠情缘2:剑歌行",v:"jianxiaqingyuan"},{n:"三国杀移动版",v:"SGSSY"},{n:"罗布乐思",v:"Roblox"},{n:"足球手游",v:"zqsy"},{n:"月圆之夜",v:"yyzy"},{n:"王牌战争",v:"wpzz"},{n:"秦时明月世界",v:"qsmysj"},{n:"独立手游",v:"dlsy"},{n:"神都夜行录",v:"sdyxl"},{n:"风之大陆",v:"fzdl"},{n:"金属对决",v:"jsdj"},{n:"轩辕剑龙舞云山",v:"xyjlwys"},{n:"微乐棋牌",v:"WLQP"},{n:"辐射:避难所Online",v:"fsbnsonline"},{n:"街篮2",v:"jl2"},{n:"极光计划",v:"jgjh"},{n:"不良人3",v:"blr3"},{n:"镇魔曲手游",v:"zmq"},{n:"传奇世界手游",v:"cqsjsy"},{n:"永恒纪元",v:"yhjy"},{n:"乱世王者",v:"lswz"},{n:"数码宝贝:相遇",v:"smbbxy"},{n:"仙剑4",v:"xjqxz4"},{n:"长安幻世绘",v:"cahsh"},{n:"篮球手游",v:"lqsy"},{n:"鬼泣-巅峰之战",v:"gqdfzz"},{n:"射击类手游",v:"qtsy"},{n:"命运歌姬",v:"mygj"},{n:"光明大陆",v:"gmdl"},{n:"暗黑不朽",v:"diabloimmortal"},{n:"新神魔大陆",v:"xsmdl"},{n:"公主连结Re:Dive",v:"gzlj"},{n:"三国志战略版",v:"sgzzlb"},{n:"天地劫:幽城再临",v:"tdj"},{n:"Disorder",v:"Disorder"},{n:"凹凸世界",v:"atsj"},{n:"云上城之歌",v:"ysczg"},{n:"五子棋",v:"wzq"},{n:"围棋",v:"wq"},{n:"梦想新大陆",v:"mxxdl"},{n:"三国志幻想大陆:国创加强版",v:"sgzhxdl"},{n:"全球行动",v:"qqxd"},{n:"诛仙手游",v:"zxsy"},{n:"妄想山海",v:"wxsh"},{n:"黎明觉醒:生机",v:"lmjx"},{n:"龙之谷2手游",v:"lzg2sy"},{n:"庆余年",v:"QYN"},{n:"我的侠客",v:"wdxk"},{n:"曙光英雄",v:"sgyx"},{n:"真三国无双霸",v:"zsgwsb"},{n:"大话西游手游",v:"dhxysy"},{n:"口袋进化",v:"kdjh"},{n:"开心消消乐",v:"kxxxl"},{n:"战争怒吼",v:"zznh"},{n:"忘川风华录",v:"wcfhl"},{n:"新剑侠情缘手游",v:"xjxqysy"},{n:"重生细胞",v:"csxb"},{n:"汉家江湖",v:"HJJH"},{n:"海岛奇兵",v:"hdqb"},{n:"钢铁力量2",v:"gtll2"},{n:"仙剑奇侠传九野",v:"xjqxzjy"},{n:"魔域手游",v:"mysy"},{n:"大唐无双手游",v:"dtwssy"},{n:"地铁跑酷",v:"dtpk"},{n:"战舰世界闪击战",v:"zjsjsjz"},{n:"狂暴之翼",v:"kbzy"},{n:"西游女儿国",v:"xyneg"},{n:"少年三国志",v:"snsgz"},{n:"钢琴师",v:"gqs"},{n:"横扫千军",v:"hsqj"},{n:"节奏大爆炸",v:"jzdbz"},{n:"喵斯快跑",v:"mskp"},{n:"双子",v:"sz"},{n:"梦想世界3手游",v:"mxsj3"},{n:"精灵之境",v:"jlzj"},{n:"镇魂街:武神躯",v:"zhjwsq"},{n:"斗罗大陆:斗神再临",v:"dldldszl"},{n:"斗罗大陆:武魂觉醒",v:"dldlwhjx"},{n:"斗罗大陆2绝世唐门",v:"dldl2jstm"},{n:"战神觉醒",v:"zsjx"},{n:"九州仙剑传H5",v:"jzxjzh5"},{n:"荣耀大天使",v:"rydts"},{n:"蓝月传奇",v:"lycq"},{n:"凡人修仙传挂机版H5",v:"frxxzgjbh5"},{n:"我的帝国H5",v:"wddgh5"},{n:"盗墓笔记",v:"dmbj"},{n:"剑与轮回",v:"jylh"},{n:"混沌起源",v:"hdqy"},{n:"大天使之剑",v:"dtszj"},{n:"战斗少女跑酷",v:"zdsnpk"},{n:"绝世仙王",v:"jsxw"},{n:"一刀传世",v:"ydcs"},{n:"斗罗大陆",v:"dldl"},{n:"破雪刃",v:"pxr"},{n:"JJ象棋",v:"jjxq"},{n:"天姬变",v:"tjb"},{n:"剑玲珑",v:"jll"},{n:"火线精英",v:"hxjy"},{n:"造梦西游OL",v:"zmxyol"},{n:"奥奇传说手游",v:"aqcssy"},{n:"战斗吧龙魂",v:"zdblh"},{n:"剑开仙门",v:"jkxm"},{n:"机甲爱丽丝",v:"jjals"},{n:"狼人对决",v:"lrdj"},{n:"最终幻想:勇气启示录 幻影战争",v:"hyzz"},{n:"贝比岛",v:"bbd"},{n:"葫芦娃兄弟",v:"hlwxd"},{n:"造梦西游4",v:"zmxy4"},{n:"比特小队",v:"btxd"},{n:"流言侦探",v:"lyzt"},{n:"少女前线",v:"snqx"},{n:"遇见",v:"yj"},{n:"霓虹深渊:无限",v:"nhsywx"},{n:"胡莱三国3",v:"hlsg3"},{n:"奥拉星",v:"alx"},{n:"先游云游戏",v:"Gamer"},{n:"绿茵信仰",v:"lyxy"},{n:"蜀山掌门",v:"sszm"},{n:"球球联盟",v:"qqlm"},{n:"碧蓝航线手游",v:"blhxsy"},{n:"300大作战",v:"300dzz"},{n:"第七史诗",v:"dqss"},{n:"宝可梦大集结",v:"PokemonUNITE"},{n:"无极仙途",v:"wjxt"},{n:"汉末霸业",v:"hmby"},{n:"EVE星战前夜:无烬星河",v:"evexzqywjxh"},{n:"少女前线2:追放",v:"sq2zf"},{n:"火力苏打(T3)",v:"T3"},{n:"植物大战僵尸2",v:"zwdzjs2"},{n:"球球英雄",v:"qqyx"},{n:"悠长假期",v:"ycjq"},{n:"无悔华夏",v:"whrhx"},{n:"猫之城",v:"mzc"},{n:"墨斗",v:"modou"},{n:"圣斗士星矢:正义传说",v:"sdsxszyz"},{n:"未定事件簿",v:"wdsjp"},{n:"白夜极光",v:"byjg"},{n:"斗罗大陆:魂师对决",v:"dldlhsdj"},{n:"古墓丽影传说:迷踪",v:"gmlycsmz"},{n:"放置与召唤",v:"fzyzh"},{n:"闪烁之光",v:"syzg"},{n:"老农种树",v:"lnzs"},{n:"三国演义:吞噬无界",v:"sgyytswj"},{n:"偶像梦幻祭2",v:"oxmhj2"},{n:"卡卡保皇",v:"kkbh"},{n:"灵猫传",v:"lmz"},{n:"绝对演绎",v:"jdyy"},{n:"剑侠世界3",v:"jxsj3"},{n:"召唤与合成2",v:"zhyhc2"},{n:"仙侠第一放置",v:"xxdyfz"},{n:"弓箭手大作战",v:"gjsdzz"},{n:"挨饿荒野",v:"aehy"},{n:"诺亚之心",v:"nyzx"},{n:"闪耀暖暖",v:"synn"},{n:"模拟城市:我是市长",v:"mncswssc"},{n:"重返帝国",v:"cfdg"},{n:"长安幻想",v:"cahx"},{n:"火炬之光:无限",v:"hjzgwx"},{n:"富豪闯三国",v:"fhcsg"},{n:"拂晓",v:"fx"},{n:"火影忍者:忍者新世代",v:"hyrzrzxsd"},{n:"滚动的天空",v:"gddtk"},{n:"新斗罗大陆",v:"xdldl"},{n:"登山赛车",v:"dssc"},{n:"荒野乱斗(腾讯版)",v:"hyldtxb"},{n:"小小勇者",v:"xxyz"},{n:"小冰冰传奇",v:"xbbcq"},{n:"三国战纪2手游",v:"sgzj2"},{n:"我的战舰",v:"wdzj"},{n:"我是大东家",v:"wsddj"},{n:"幸存者危城",v:"xczwc"},{n:"暗魔领主",v:"amlz"},{n:"冒险公社手游",v:"mxgs"},{n:"欧陆战争5:帝国",v:"olzz5dg"},{n:"纪念碑谷2",v:"jnbg2"},{n:"大航海探险物语",v:"dhhtxwy"},{n:"我在7年后等着你",v:"wz7nhdzn"},{n:"航海日记",v:"hhrj"},{n:"一拳超人:最强之男",v:"yqcrzqzn"},{n:"王国保卫战4",v:"wgbwz4"},{n:"半世界之旅",v:"bsjzl"},{n:"奥特曼宇宙英雄",v:"atmyzyx"},{n:"新三国杀",v:"xsgs"},{n:"奶块",v:"nk"},{n:"策魂三国",v:"chsg"},{n:"奥特曼系列OL",v:"atmxlol"},{n:"洪荒文明",v:"hhwm"},{n:"街头足球",v:"jtzq"},{n:"同人圣三国蜀汉传",v:"trssgshc"},{n:"我做夫人那些年",v:"wzfrnxn"},{n:"小小五千年",v:"xxwqn"},{n:"实况球会经理",v:"skqhjl"},{n:"时空猎人",v:"sklr"},{n:"星际逆战",v:"xjnz"},{n:"LoveLive! 学园偶像祭",v:"lovelivexyoxj"},{n:"黑色沙漠手游",v:"hesmsy"},{n:"魔力宝贝:旅人",v:"mlbblr"},{n:"盾之勇者成名录:浪潮",v:"dzyzcmllc"},{n:"魔力宝贝归来",v:"mlbbgl"},{n:"荣耀新三国",v:"ryxsg"},{n:"巅峰极速",v:"dfjs"},{n:"新盗墓笔记",v:"xdmbj"},{n:"卧龙吟2",v:"wly2"},{n:"武林闲侠",v:"wlxx"},{n:"淘米游戏",v:"tmyx"},{n:"暖雪",v:"warmsnow"},{n:"无期迷途",v:"wqmt"},{n:"逆光潜入",v:"ngqr"},{n:"CF手游",v:"CFSY"},{n:"新天龙八部手游",v:"xtlbbsy"},{n:"无神之界",v:"wszj"},{n:"尘白禁区",v:"cbjq"},{n:"传奇天下",v:"CQTX"},{n:"全民大灌篮",v:"qmdgl"},{n:"枪火重生手游",v:"GunfireReborn"},{n:"火影三国志",v:"g_hysg"},{n:"网易其它组",v:"g_wyqt"},{n:"三国战纪手游",v:"sgzjsy"},{n:"染·钟楼谜团",v:"BOTC"},{n:"绝区零",v:"jql"},{n:"魔兽弧光大作战",v:"warcraftrumble"},{n:"重返CODM",v:"RECODM"},{n:"综合手游",v:"zhsy"},{n:"IP游戏",v:"ipyx"},{n:"鸣潮",v:"cm"},{n:"棋牌游戏",v:"QPYX"},{n:"奥比岛:梦想国度",v:"abdmxgd"},{n:"铃兰之剑",v:"llzjwzhpdsj"},{n:"晶核",v:"jhcoa"},{n:"星之破晓",v:"dhpx"},{n:"赛尔计划",v:"srjh"},{n:"SLG综合",v:"SLG"},{n:"代号:伙伴",v:"DHGB"},{n:"天使之战",v:"tszz"},{n:"全明星街球派对",v:"hoopheroes"},{n:"合金弹头:觉醒",v:"MetalSlug"},{n:"白荆回廊",v:"BJHL"},{n:"三国志战棋版",v:"g_sgzzqb"},{n:"鹅鸭杀手游",v:"GooseDuck"},{n:"太空杀",v:"SuperSus"},{n:"天龙八部2:飞龙战天",v:"tlbb2flzt"},{n:"西行纪 燃魂",v:"xxjrh"},{n:"决胜巅峰",v:"jueshengdianfeng"},{n:"冒险岛:枫之传说",v:"MapleStory"},{n:"石器时代:觉醒",v:"sqsdjx"},{n:"星球:重启",v:"xqcq"},{n:"决战玛法",v:"jzmf"},{n:"二次元游戏",v:"ECYYX"},{n:"圣境之塔",v:"sjzt"},{n:"传说法师手游",v:"CSFSSY"},{n:"钢岚",v:"Mecharashi"},{n:"勇闯三国",v:"ycsg"},{n:"绯色回响",v:"fshxgf"},{n:"三国:谋定天下",v:"sgmdtx"}]}],kjwh:[{key:"cateId",name:"分类",value:[{n:"数码科技",v:"smkj"},{n:"纪录片",v:"jlp"},{n:"成年教育",v:"jiaoyu"},{n:"人文社科",v:"Humanities"}]}],yp:[{key:"cateId",name:"分类",value:[{n:"派对",v:"paidui"},{n:"心动FM.",v:"DIANT"},{n:"一起玩",v:"yiqiwan"}]}],voice:[{key:"cateId",name:"分类",value:[{n:"语音交友",v:"yyjy"},{n:"音乐之声",v:"yyzs"},{n:"连麦互动",v:"lianmaihudong"},{n:"娱乐开黑",v:"ylkh"}]}]},filter_def:{yl:{cateId:"yqk"},PCgame:{cateId:"LOL"},djry:{cateId:"TVgame"},syxx:{cateId:"wzry"},yz:{cateId:"yz"},kjwh:{cateId:"smkj"},yp:{cateId:"yiqiwan"},voice:{cateId:"yyzs"},znl:{cateId:"znl"}},class_name:"娱乐天地&网游竞技&单机热游&手游休闲&颜值&科技文化&语音互动&语音直播&正能量",class_url:"yl&PCgame&djry&syxx&yz&kjwh&yp&voice&znl",detailUrl:"https://m.douyu.com/fyid?dyshid=0-1c6d52c74b1e6bec7aa63a8e000617p1&dyshci=181",searchUrl:"/api/search/liveRoom?#did=10000000000000000000000000001501&limit=20&offset=0&sk=**;post",searchable:2,quickSearch:0,headers:{"User-Agent":"MOBILE_UA"},timeout:5e3,limit:8,play_parse:!0,lazy:"","推荐":"js:\n let d = [];\n let jo = JSON.parse(request(input)).data;\n jo.forEach((it,idex) => {\n let slist = jo[idex].list ;\n slist.forEach(it => {\n d.push({\n url: it.rid,\n title: it.roomName,\n img: it.roomSrc,\n desc: '👁' + it.hn + ' 🆙' + it.nickname,\n })\n });\n });\n setResult(d);\n ","一级":"js:\n let d = [];\n let jo = JSON.parse(request(input)).data.list;\n jo.forEach(it => {\n d.push({\n url: it.rid,\n title: it.roomName,\n img: it.roomSrc,\n desc: '👁' + it.hn + ' 🆙' + it.nickname,\n })\n });\n setResult(d);\n ",
|
||||
|
||||
二级:'*',
|
||||
|
||||
"搜索":"js:\n var d = [];\n let rurls = input.split(';')[0].split('#');\n let rurl = rurls[0];\n let params = rurls.length > 1 ?rurls[1]:'';\n let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));\n let postData = {body:params};\n Object.assign(_fetch_params,postData);\n let jo = JSON.parse(post(rurl,_fetch_params)).data.list;\n jo.forEach(it => {\n d.push({\n url: it.roomId,\n title: it.roomName,\n img: it.roomSrc,\n desc: '👁' + it.hn + ' 🆙' + it.nickname,\n })\n });\n setResult(d);\n ",sniffer:1,isVideo:"js:\n log(input);\n if(/\\/huya/.test(input)) {\n input = true\n } else if(/\\.flv?|\\.m3u8?|\\.mp4?/.test(input)){\n input = true\n }else{\n input = false\n }\n "};
|
||||
+1651
@@ -0,0 +1,1651 @@
|
||||
var rule = {
|
||||
title: "虎牙直播",
|
||||
host: "https://www.huya.com",
|
||||
homeUrl: "/cache.php?m=LiveList&do=getLiveListByPage&gameId=2168&tagAll=0&page=1",
|
||||
url: "/cache.php?m=LiveList&do=getLiveListByPage&gameId=fyfilter&tagAll=0&page=fypage",
|
||||
class_name: "娱乐&网游&单机&手游",
|
||||
class_url: "8&1&2&3",
|
||||
detailUrl: "https://m.huya.com/fyid",
|
||||
filterable: 1,
|
||||
filter_url: "{{fl.cateId}}",
|
||||
filter_def: {
|
||||
8: {
|
||||
cateId: "2135"
|
||||
},
|
||||
1: {
|
||||
cateId: "1"
|
||||
},
|
||||
2: {
|
||||
cateId: "1732"
|
||||
},
|
||||
3: {
|
||||
cateId: "2336"
|
||||
}
|
||||
},
|
||||
filter: {
|
||||
8: [{
|
||||
key: "cateId",
|
||||
name: "分类",
|
||||
value: [{
|
||||
n: "星秀",
|
||||
v: "1663"
|
||||
}, {
|
||||
n: "户外",
|
||||
v: "2165"
|
||||
}, {
|
||||
n: "一起看",
|
||||
v: "2135"
|
||||
}, {
|
||||
n: "二次元",
|
||||
v: "2633"
|
||||
}, {
|
||||
n: "虚拟偶像",
|
||||
v: "6055"
|
||||
}, {
|
||||
n: "旅游",
|
||||
v: "6791"
|
||||
}, {
|
||||
n: "放映厅",
|
||||
v: "6245"
|
||||
}, {
|
||||
n: "娱乐天地",
|
||||
v: "100022"
|
||||
}, {
|
||||
n: "交友",
|
||||
v: "4079"
|
||||
}, {
|
||||
n: "组队",
|
||||
v: "5367"
|
||||
}, {
|
||||
n: "吃喝玩乐",
|
||||
v: "100044"
|
||||
}, {
|
||||
n: "原创",
|
||||
v: "6861"
|
||||
}, {
|
||||
n: "虎牙文化",
|
||||
v: "4089"
|
||||
}, {
|
||||
n: "体育",
|
||||
v: "2356"
|
||||
}, {
|
||||
n: "虎牙地方",
|
||||
v: "5123"
|
||||
}, {
|
||||
n: "颜值",
|
||||
v: "2168"
|
||||
}, {
|
||||
n: "科技",
|
||||
v: "2408"
|
||||
}, {
|
||||
n: "音乐",
|
||||
v: "3793"
|
||||
}, {
|
||||
n: "趣分享",
|
||||
v: "5883"
|
||||
}, {
|
||||
n: "一起买",
|
||||
v: "7759"
|
||||
}, {
|
||||
n: "派对",
|
||||
v: "7785"
|
||||
}]
|
||||
}],
|
||||
1: [{
|
||||
key: "cateId",
|
||||
name: "分类",
|
||||
value: [{
|
||||
n: "英雄联盟",
|
||||
v: "1"
|
||||
}, {
|
||||
n: "CS2",
|
||||
v: "862"
|
||||
}, {
|
||||
n: "穿越火线",
|
||||
v: "4"
|
||||
}, {
|
||||
n: "lol云顶之弈",
|
||||
v: "5485"
|
||||
}, {
|
||||
n: "无畏契约",
|
||||
v: "5937"
|
||||
}, {
|
||||
n: "CFHD",
|
||||
v: "6079"
|
||||
}, {
|
||||
n: "逆战",
|
||||
v: "135"
|
||||
}, {
|
||||
n: "炉石传说",
|
||||
v: "393"
|
||||
}, {
|
||||
n: "DOTA2",
|
||||
v: "7"
|
||||
}, {
|
||||
n: "地下城与勇士",
|
||||
v: "2"
|
||||
}, {
|
||||
n: "魔兽世界",
|
||||
v: "8"
|
||||
}, {
|
||||
n: "坦克世界",
|
||||
v: "802"
|
||||
}, {
|
||||
n: "DOTA1",
|
||||
v: "6"
|
||||
}, {
|
||||
n: "梦三国",
|
||||
v: "489"
|
||||
}, {
|
||||
n: "魔兽争霸3",
|
||||
v: "4615"
|
||||
}, {
|
||||
n: "问道",
|
||||
v: "107"
|
||||
}, {
|
||||
n: "命运方舟",
|
||||
v: "3058"
|
||||
}, {
|
||||
n: "QQ飞车",
|
||||
v: "9"
|
||||
}, {
|
||||
n: "星际争霸",
|
||||
v: "5"
|
||||
}, {
|
||||
n: "网游竞技",
|
||||
v: "100023"
|
||||
}, {
|
||||
n: "射击综合游戏",
|
||||
v: "100141"
|
||||
}, {
|
||||
n: "暴雪专区",
|
||||
v: "100043"
|
||||
}, {
|
||||
n: "彩虹岛Online",
|
||||
v: "683"
|
||||
}, {
|
||||
n: "剑灵",
|
||||
v: "897"
|
||||
}, {
|
||||
n: "军事游戏",
|
||||
v: "100133"
|
||||
}, {
|
||||
n: "冒险岛",
|
||||
v: "2243"
|
||||
}, {
|
||||
n: "暗黑破坏神",
|
||||
v: "1123"
|
||||
}, {
|
||||
n: "诛仙3",
|
||||
v: "1646"
|
||||
}, {
|
||||
n: "热血江湖",
|
||||
v: "387"
|
||||
}, {
|
||||
n: "英魂之刃",
|
||||
v: "1830"
|
||||
}, {
|
||||
n: "武林外传一世琴缘",
|
||||
v: "1661"
|
||||
}, {
|
||||
n: "起凡:群雄逐鹿",
|
||||
v: "1612"
|
||||
}, {
|
||||
n: "神武4电脑版",
|
||||
v: "3227"
|
||||
}, {
|
||||
n: "龙之谷",
|
||||
v: "15"
|
||||
}, {
|
||||
n: "炉石战棋",
|
||||
v: "5751"
|
||||
}, {
|
||||
n: "御龙在天",
|
||||
v: "675"
|
||||
}, {
|
||||
n: "逆水寒",
|
||||
v: "2952"
|
||||
}, {
|
||||
n: "千年3",
|
||||
v: "878"
|
||||
}, {
|
||||
n: "永恒之塔",
|
||||
v: "446"
|
||||
}, {
|
||||
n: "体育游戏",
|
||||
v: "100135"
|
||||
}, {
|
||||
n: "寻仙",
|
||||
v: "734"
|
||||
}, {
|
||||
n: "战舰世界",
|
||||
v: "1947"
|
||||
}, {
|
||||
n: "QQ三国",
|
||||
v: "1090"
|
||||
}, {
|
||||
n: "流放之路",
|
||||
v: "427"
|
||||
}, {
|
||||
n: "反恐精英Online",
|
||||
v: "1918"
|
||||
}, {
|
||||
n: "反恐行动online",
|
||||
v: "861"
|
||||
}, {
|
||||
n: "征途",
|
||||
v: "2715"
|
||||
}, {
|
||||
n: "战争雷霆",
|
||||
v: "624"
|
||||
}, {
|
||||
n: "丝路传说2",
|
||||
v: "1026"
|
||||
}, {
|
||||
n: "星际战甲",
|
||||
v: "627"
|
||||
}, {
|
||||
n: "NBA2KOL系列",
|
||||
v: "3959"
|
||||
}, {
|
||||
n: "九阴真经",
|
||||
v: "1009"
|
||||
}, {
|
||||
n: "跑跑卡丁车",
|
||||
v: "162"
|
||||
}, {
|
||||
n: "诛仙世界",
|
||||
v: "7749"
|
||||
}, {
|
||||
n: "QQ华夏",
|
||||
v: "1878"
|
||||
}, {
|
||||
n: "天涯明月刀",
|
||||
v: "1219"
|
||||
}, {
|
||||
n: "大话西游:归来",
|
||||
v: "8239"
|
||||
}, {
|
||||
n: "荒野行动PC版",
|
||||
v: "3185"
|
||||
}, {
|
||||
n: "新剑侠情缘",
|
||||
v: "586"
|
||||
}, {
|
||||
n: "剑网3",
|
||||
v: "900"
|
||||
}, {
|
||||
n: "生死狙击2",
|
||||
v: "6091"
|
||||
}, {
|
||||
n: "全球使命",
|
||||
v: "939"
|
||||
}, {
|
||||
n: "梦想世界3",
|
||||
v: "486"
|
||||
}, {
|
||||
n: "枪神纪",
|
||||
v: "496"
|
||||
}, {
|
||||
n: "新天龙八部",
|
||||
v: "5671"
|
||||
}, {
|
||||
n: "铁甲雄兵",
|
||||
v: "2765"
|
||||
}, {
|
||||
n: "神泣",
|
||||
v: "2531"
|
||||
}, {
|
||||
n: "斗战神",
|
||||
v: "591"
|
||||
}, {
|
||||
n: "造梦西游OL",
|
||||
v: "6815"
|
||||
}, {
|
||||
n: "天堂",
|
||||
v: "1966"
|
||||
}, {
|
||||
n: "大话西游2",
|
||||
v: "2975"
|
||||
}, {
|
||||
n: "使命召唤:战区",
|
||||
v: "5911"
|
||||
}, {
|
||||
n: "希望OL",
|
||||
v: "1161"
|
||||
}, {
|
||||
n: "极光世界 弑神传",
|
||||
v: "514"
|
||||
}, {
|
||||
n: "守望先锋归来",
|
||||
v: "2174"
|
||||
}, {
|
||||
n: "QQ自由幻想",
|
||||
v: "1862"
|
||||
}, {
|
||||
n: "命运2",
|
||||
v: "2942"
|
||||
}, {
|
||||
n: "奇迹世界2",
|
||||
v: "766"
|
||||
}, {
|
||||
n: "坦克大战",
|
||||
v: "4359"
|
||||
}, {
|
||||
n: "生死狙击",
|
||||
v: "2471"
|
||||
}, {
|
||||
n: "天翼决",
|
||||
v: "779"
|
||||
}, {
|
||||
n: "QQ幻想",
|
||||
v: "2419"
|
||||
}, {
|
||||
n: "新飞飞(FlyFF)",
|
||||
v: "1582"
|
||||
}, {
|
||||
n: "刀剑英雄",
|
||||
v: "915"
|
||||
}, {
|
||||
n: "FIFA Online系列",
|
||||
v: "100079"
|
||||
}, {
|
||||
n: "全球使命3",
|
||||
v: "2953"
|
||||
}, {
|
||||
n: "完美端游系列",
|
||||
v: "3034"
|
||||
}, {
|
||||
n: "战意",
|
||||
v: "2599"
|
||||
}, {
|
||||
n: "泡泡堂",
|
||||
v: "440"
|
||||
}, {
|
||||
n: "赛尔号",
|
||||
v: "2755"
|
||||
}, {
|
||||
n: "大唐无双零",
|
||||
v: "1584"
|
||||
}, {
|
||||
n: "QQ炫舞",
|
||||
v: "2440"
|
||||
}, {
|
||||
n: "007:传奇",
|
||||
v: "1135"
|
||||
}, {
|
||||
n: "天下",
|
||||
v: "1597"
|
||||
}, {
|
||||
n: "天谕",
|
||||
v: "1899"
|
||||
}, {
|
||||
n: "新倩女幽魂",
|
||||
v: "1579"
|
||||
}, {
|
||||
n: "传世无双",
|
||||
v: "984"
|
||||
}, {
|
||||
n: "剑侠世界",
|
||||
v: "903"
|
||||
}, {
|
||||
n: "Warhaven",
|
||||
v: "9053"
|
||||
}, {
|
||||
n: "诺亚传说",
|
||||
v: "190"
|
||||
}, {
|
||||
n: "新挑战",
|
||||
v: "583"
|
||||
}, {
|
||||
n: "超激斗梦境",
|
||||
v: "5691"
|
||||
}, {
|
||||
n: "QQ音速",
|
||||
v: "1085"
|
||||
}, {
|
||||
n: "征途2",
|
||||
v: "677"
|
||||
}, {
|
||||
n: "征程",
|
||||
v: "678"
|
||||
}, {
|
||||
n: "蜀门",
|
||||
v: "4711"
|
||||
}, {
|
||||
n: "完美世界:诸神之战",
|
||||
v: "7217"
|
||||
}, {
|
||||
n: "战之刃:幸存者",
|
||||
v: "8627"
|
||||
}, {
|
||||
n: "黎明之光",
|
||||
v: "41"
|
||||
}, {
|
||||
n: "天命西游",
|
||||
v: "1086"
|
||||
}, {
|
||||
n: "炫舞时代",
|
||||
v: "3353"
|
||||
}, {
|
||||
n: "荣誉空间",
|
||||
v: "225"
|
||||
}, {
|
||||
n: "卡拉彼丘",
|
||||
v: "9073"
|
||||
}, {
|
||||
n: "成吉思汗怀旧版",
|
||||
v: "640"
|
||||
}, {
|
||||
n: "英雄年代3",
|
||||
v: "1232"
|
||||
}, {
|
||||
n: "天书奇谈",
|
||||
v: "2225"
|
||||
}, {
|
||||
n: "劲舞团",
|
||||
v: "2420"
|
||||
}, {
|
||||
n: "远征Online梦想版",
|
||||
v: "142"
|
||||
}, {
|
||||
n: "奇迹:传奇",
|
||||
v: "3917"
|
||||
}, {
|
||||
n: "封印者",
|
||||
v: "2294"
|
||||
}, {
|
||||
n: "上古世纪",
|
||||
v: "1046"
|
||||
}, {
|
||||
n: "梦幻诛仙2",
|
||||
v: "488"
|
||||
}, {
|
||||
n: "TERA Online",
|
||||
v: "1072"
|
||||
}, {
|
||||
n: "倚天Ⅱ",
|
||||
v: "959"
|
||||
}, {
|
||||
n: "街头篮球",
|
||||
v: "206"
|
||||
}, {
|
||||
n: "永恒轮回:无限",
|
||||
v: "7847"
|
||||
}, {
|
||||
n: "火线精英",
|
||||
v: "2550"
|
||||
}, {
|
||||
n: "忍者村大战2",
|
||||
v: "2369"
|
||||
}, {
|
||||
n: "领地人生",
|
||||
v: "2282"
|
||||
}, {
|
||||
n: "仙侠世界",
|
||||
v: "995"
|
||||
}, {
|
||||
n: "洛奇英雄传",
|
||||
v: "432"
|
||||
}, {
|
||||
n: "KARDS",
|
||||
v: "8261"
|
||||
}, {
|
||||
n: "无限法则",
|
||||
v: "3189"
|
||||
}, {
|
||||
n: "全面战争:竞技场",
|
||||
v: "5901"
|
||||
}, {
|
||||
n: "自由篮球",
|
||||
v: "243"
|
||||
}, {
|
||||
n: "FC Online4",
|
||||
v: "3683"
|
||||
}, {
|
||||
n: "战地之王",
|
||||
v: "618"
|
||||
}, {
|
||||
n: "古剑奇谭OL",
|
||||
v: "1892"
|
||||
}, {
|
||||
n: "QQ仙侠传",
|
||||
v: "2291"
|
||||
}, {
|
||||
n: "300英雄",
|
||||
v: "1132"
|
||||
}]
|
||||
}],
|
||||
2: [{
|
||||
key: "cateId",
|
||||
name: "分类",
|
||||
value: [{
|
||||
n: "天天吃鸡",
|
||||
v: "2793"
|
||||
}, {
|
||||
n: "永劫无间",
|
||||
v: "6219"
|
||||
}, {
|
||||
n: "主机游戏",
|
||||
v: "100032"
|
||||
}, {
|
||||
n: "猛兽派对",
|
||||
v: "6165"
|
||||
}, {
|
||||
n: "互动点播",
|
||||
v: "5907"
|
||||
}, {
|
||||
n: "我的世界",
|
||||
v: "1732"
|
||||
}, {
|
||||
n: "方舟",
|
||||
v: "1997"
|
||||
}, {
|
||||
n: "单机热游",
|
||||
v: "100002"
|
||||
}, {
|
||||
n: "怀旧游戏",
|
||||
v: "100125"
|
||||
}, {
|
||||
n: "逃离塔科夫",
|
||||
v: "3493"
|
||||
}, {
|
||||
n: "俄罗斯钓鱼4",
|
||||
v: "5495"
|
||||
}, {
|
||||
n: "部落:上升",
|
||||
v: "1318"
|
||||
}, {
|
||||
n: "Dark and Darker",
|
||||
v: "7905"
|
||||
}, {
|
||||
n: "The Front",
|
||||
v: "9497"
|
||||
}, {
|
||||
n: "Apex英雄",
|
||||
v: "5011"
|
||||
}, {
|
||||
n: "生化危机4重制版",
|
||||
v: "8013"
|
||||
}, {
|
||||
n: "DayZ独立版",
|
||||
v: "1125"
|
||||
}, {
|
||||
n: "星空",
|
||||
v: "7857"
|
||||
}, {
|
||||
n: "互动剧游",
|
||||
v: "6919"
|
||||
}, {
|
||||
n: "艾尔登法环",
|
||||
v: "5801"
|
||||
}, {
|
||||
n: "恐惧之间",
|
||||
v: "6679"
|
||||
}, {
|
||||
n: "SCUM",
|
||||
v: "4245"
|
||||
}, {
|
||||
n: "Dread Hunger",
|
||||
v: "7601"
|
||||
}, {
|
||||
n: "塞尔达传说:王国之泪",
|
||||
v: "7883"
|
||||
}, {
|
||||
n: "欧洲卡车模拟",
|
||||
v: "475"
|
||||
}, {
|
||||
n: "洛克王国",
|
||||
v: "2864"
|
||||
}, {
|
||||
n: "卧龙:苍天陨落",
|
||||
v: "7859"
|
||||
}, {
|
||||
n: "无人深空",
|
||||
v: "2566"
|
||||
}, {
|
||||
n: "帝国神话",
|
||||
v: "6821"
|
||||
}, {
|
||||
n: "饥荒",
|
||||
v: "74"
|
||||
}, {
|
||||
n: "森林之子",
|
||||
v: "7943"
|
||||
}, {
|
||||
n: "星球大战系列",
|
||||
v: "554"
|
||||
}, {
|
||||
n: "极限竞速:地平线",
|
||||
v: "2634"
|
||||
}, {
|
||||
n: "最终幻想16",
|
||||
v: "7869"
|
||||
}, {
|
||||
n: "Among Us",
|
||||
v: "6163"
|
||||
}, {
|
||||
n: "怪物猎人:崛起",
|
||||
v: "6479"
|
||||
}, {
|
||||
n: "怪物猎人物语",
|
||||
v: "7101"
|
||||
}, {
|
||||
n: "骑马与砍杀系列",
|
||||
v: "4783"
|
||||
}, {
|
||||
n: "荒野大镖客2",
|
||||
v: "4319"
|
||||
}, {
|
||||
n: "太荒初境",
|
||||
v: "7685"
|
||||
}, {
|
||||
n: "罗布乐思",
|
||||
v: "5771"
|
||||
}, {
|
||||
n: "只狼:影逝二度",
|
||||
v: "4505"
|
||||
}, {
|
||||
n: "双人成行",
|
||||
v: "6737"
|
||||
}, {
|
||||
n: "重生边缘",
|
||||
v: "6201"
|
||||
}, {
|
||||
n: "海贼王 寻秘世界",
|
||||
v: "5097"
|
||||
}, {
|
||||
n: "战神:诸神黄昏",
|
||||
v: "7771"
|
||||
}, {
|
||||
n: "恐鬼症",
|
||||
v: "6205"
|
||||
}, {
|
||||
n: "鬼谷八荒",
|
||||
v: "6571"
|
||||
}, {
|
||||
n: "霍格沃茨之遗",
|
||||
v: "7881"
|
||||
}, {
|
||||
n: "全面战争",
|
||||
v: "3521"
|
||||
}, {
|
||||
n: "仁王2",
|
||||
v: "5795"
|
||||
}, {
|
||||
n: "奥拉星",
|
||||
v: "2846"
|
||||
}, {
|
||||
n: "甜蜜之家",
|
||||
v: "6739"
|
||||
}, {
|
||||
n: "仙剑奇侠传七",
|
||||
v: "6509"
|
||||
}, {
|
||||
n: "消逝的光芒2",
|
||||
v: "7581"
|
||||
}, {
|
||||
n: "渡神记",
|
||||
v: "6231"
|
||||
}, {
|
||||
n: "归家异途",
|
||||
v: "2949"
|
||||
}, {
|
||||
n: "博德之门3",
|
||||
v: "6147"
|
||||
}, {
|
||||
n: "看门狗:军团",
|
||||
v: "6155"
|
||||
}, {
|
||||
n: "使命召唤系列",
|
||||
v: "100137"
|
||||
}, {
|
||||
n: "育碧游戏",
|
||||
v: "100139"
|
||||
}, {
|
||||
n: "帝国时代4",
|
||||
v: "4835"
|
||||
}, {
|
||||
n: "英灵神殿",
|
||||
v: "6609"
|
||||
}, {
|
||||
n: "蛮荒志异:起源",
|
||||
v: "9709"
|
||||
}, {
|
||||
n: "岛",
|
||||
v: "3019"
|
||||
}, {
|
||||
n: "沙盒与副本",
|
||||
v: "9151"
|
||||
}, {
|
||||
n: "扫雷",
|
||||
v: "2349"
|
||||
}, {
|
||||
n: "街机游戏",
|
||||
v: "5999"
|
||||
}, {
|
||||
n: "幽灵线:东京",
|
||||
v: "7669"
|
||||
}, {
|
||||
n: "怪物猎人世界",
|
||||
v: "3519"
|
||||
}, {
|
||||
n: "盗贼之海",
|
||||
v: "3641"
|
||||
}, {
|
||||
n: "纸人",
|
||||
v: "5257"
|
||||
}, {
|
||||
n: "黑色像素人",
|
||||
v: "28"
|
||||
}, {
|
||||
n: "对马岛之魂",
|
||||
v: "6039"
|
||||
}, {
|
||||
n: "瑞奇与叮当",
|
||||
v: "2455"
|
||||
}, {
|
||||
n: "港诡实录",
|
||||
v: "5853"
|
||||
}, {
|
||||
n: "剑士",
|
||||
v: "1467"
|
||||
}, {
|
||||
n: "魔法门之英雄无敌系列",
|
||||
v: "2096"
|
||||
}, {
|
||||
n: "星露谷物语",
|
||||
v: "2443"
|
||||
}, {
|
||||
n: "仙剑奇侠传四",
|
||||
v: "1659"
|
||||
}, {
|
||||
n: "伤害世界",
|
||||
v: "2337"
|
||||
}, {
|
||||
n: "禁闭求生",
|
||||
v: "6065"
|
||||
}, {
|
||||
n: "真三国无双",
|
||||
v: "1599"
|
||||
}, {
|
||||
n: "恐怖黎明",
|
||||
v: "3435"
|
||||
}, {
|
||||
n: "其他单机",
|
||||
v: "3069"
|
||||
}, {
|
||||
n: "幽灵行动:荒野",
|
||||
v: "2794"
|
||||
}, {
|
||||
n: "边缘",
|
||||
v: "151"
|
||||
}, {
|
||||
n: "阿凡达",
|
||||
v: "106"
|
||||
}, {
|
||||
n: "全面战争:三国",
|
||||
v: "3004"
|
||||
}, {
|
||||
n: "黎明之星",
|
||||
v: "40"
|
||||
}, {
|
||||
n: "翼星求生",
|
||||
v: "7463"
|
||||
}, {
|
||||
n: "黎明传说",
|
||||
v: "39"
|
||||
}, {
|
||||
n: "恶魔之魂",
|
||||
v: "6151"
|
||||
}, {
|
||||
n: "艾兰岛",
|
||||
v: "3855"
|
||||
}, {
|
||||
n: "龙与地下城:秘影历代记HD",
|
||||
v: "17"
|
||||
}, {
|
||||
n: "龙与地下城:匕首谷",
|
||||
v: "18"
|
||||
}, {
|
||||
n: "沙石镇时光",
|
||||
v: "7687"
|
||||
}, {
|
||||
n: "三国志曹操传",
|
||||
v: "2592"
|
||||
}, {
|
||||
n: "FIFA足球",
|
||||
v: "1888"
|
||||
}, {
|
||||
n: "最终幻想7:重制版",
|
||||
v: "5809"
|
||||
}, {
|
||||
n: "四海兄弟",
|
||||
v: "5995"
|
||||
}, {
|
||||
n: "最终幻想:起源",
|
||||
v: "7653"
|
||||
}, {
|
||||
n: "摔跤城大乱斗",
|
||||
v: "7773"
|
||||
}, {
|
||||
n: "音乐游戏",
|
||||
v: "2761"
|
||||
}, {
|
||||
n: "精灵与萤火意志",
|
||||
v: "5895"
|
||||
}, {
|
||||
n: "桥梁建造师",
|
||||
v: "3275"
|
||||
}, {
|
||||
n: "哈迪斯",
|
||||
v: "6153"
|
||||
}, {
|
||||
n: "小缇娜的奇幻之地",
|
||||
v: "7647"
|
||||
}, {
|
||||
n: "宝可梦:剑盾",
|
||||
v: "5715"
|
||||
}, {
|
||||
n: "边境",
|
||||
v: "4779"
|
||||
}, {
|
||||
n: "人类一败涂地",
|
||||
v: "3289"
|
||||
}, {
|
||||
n: "糖豆人:终极淘汰赛",
|
||||
v: "6083"
|
||||
}, {
|
||||
n: "精灵宝可梦Let's Go",
|
||||
v: "4375"
|
||||
}, {
|
||||
n: "战锤40K:暗潮",
|
||||
v: "3016"
|
||||
}, {
|
||||
n: "石油骚动",
|
||||
v: "2585"
|
||||
}, {
|
||||
n: "紫塞秋风",
|
||||
v: "6045"
|
||||
}, {
|
||||
n: "阿尔比恩",
|
||||
v: "8115"
|
||||
}, {
|
||||
n: "猎人:荒野的召唤",
|
||||
v: "2906"
|
||||
}, {
|
||||
n: "FIFA 23",
|
||||
v: "7789"
|
||||
}, {
|
||||
n: "都市:天际线",
|
||||
v: "2201"
|
||||
}, {
|
||||
n: "乐高大电影:游戏版",
|
||||
v: "1439"
|
||||
}, {
|
||||
n: "全面战争:阿提拉",
|
||||
v: "2383"
|
||||
}, {
|
||||
n: "斩妖行",
|
||||
v: "6105"
|
||||
}, {
|
||||
n: "马里奥赛车8",
|
||||
v: "5947"
|
||||
}, {
|
||||
n: "复仇者联盟",
|
||||
v: "6121"
|
||||
}, {
|
||||
n: "霓虹深渊",
|
||||
v: "5743"
|
||||
}]
|
||||
}],
|
||||
3: [{
|
||||
key: "cateId",
|
||||
name: "分类",
|
||||
value: [{
|
||||
n: "王者荣耀",
|
||||
v: "2336"
|
||||
}, {
|
||||
n: "和平精英",
|
||||
v: "3203"
|
||||
}, {
|
||||
n: "英雄联盟手游",
|
||||
v: "6203"
|
||||
}, {
|
||||
n: "CF手游",
|
||||
v: "2413"
|
||||
}, {
|
||||
n: "金铲铲之战",
|
||||
v: "7185"
|
||||
}, {
|
||||
n: "三国杀",
|
||||
v: "1669"
|
||||
}, {
|
||||
n: "原神",
|
||||
v: "5489"
|
||||
}, {
|
||||
n: "棋牌桌游",
|
||||
v: "100036"
|
||||
}, {
|
||||
n: "综合手游",
|
||||
v: "100029"
|
||||
}, {
|
||||
n: "劲乐幻想",
|
||||
v: "7691"
|
||||
}, {
|
||||
n: "新游广场",
|
||||
v: "100052"
|
||||
}, {
|
||||
n: "崩坏:星穹铁道",
|
||||
v: "7349"
|
||||
}, {
|
||||
n: "火影忍者手游",
|
||||
v: "2429"
|
||||
}, {
|
||||
n: "第五人格",
|
||||
v: "3115"
|
||||
}, {
|
||||
n: "问道手游",
|
||||
v: "2477"
|
||||
}, {
|
||||
n: "暗区突围",
|
||||
v: "7209"
|
||||
}, {
|
||||
n: "QQ飞车手游",
|
||||
v: "2928"
|
||||
}, {
|
||||
n: "球球大作战",
|
||||
v: "2411"
|
||||
}, {
|
||||
n: "明日之后",
|
||||
v: "3483"
|
||||
}, {
|
||||
n: "皇室战争",
|
||||
v: "2439"
|
||||
}, {
|
||||
n: "COD手游",
|
||||
v: "4769"
|
||||
}, {
|
||||
n: "手游休闲",
|
||||
v: "100004"
|
||||
}, {
|
||||
n: "二次元手游",
|
||||
v: "100091"
|
||||
}, {
|
||||
n: "摸了个鱼",
|
||||
v: "9283"
|
||||
}, {
|
||||
n: "MMORPG",
|
||||
v: "100273"
|
||||
}, {
|
||||
n: "动作游戏",
|
||||
v: "100197"
|
||||
}, {
|
||||
n: "战争冲突",
|
||||
v: "7449"
|
||||
}, {
|
||||
n: "王者模拟战",
|
||||
v: "5699"
|
||||
}, {
|
||||
n: "逆水寒手游",
|
||||
v: "7725"
|
||||
}, {
|
||||
n: "幻塔",
|
||||
v: "6437"
|
||||
}, {
|
||||
n: "欢乐斗地主",
|
||||
v: "1749"
|
||||
}, {
|
||||
n: "神武4手游",
|
||||
v: "3135"
|
||||
}, {
|
||||
n: "阴阳师",
|
||||
v: "2598"
|
||||
}, {
|
||||
n: "DNF手游",
|
||||
v: "4921"
|
||||
}, {
|
||||
n: "欢乐麻将",
|
||||
v: "1751"
|
||||
}, {
|
||||
n: "英雄联盟电竞经理",
|
||||
v: "7177"
|
||||
}, {
|
||||
n: "狼人杀手游",
|
||||
v: "100049"
|
||||
}, {
|
||||
n: "新天龙八部手游",
|
||||
v: "6945"
|
||||
}, {
|
||||
n: "中国象棋",
|
||||
v: "1671"
|
||||
}, {
|
||||
n: "天天象棋",
|
||||
v: "4997"
|
||||
}, {
|
||||
n: "传奇世界3D",
|
||||
v: "3961"
|
||||
}, {
|
||||
n: "御龙在天手游",
|
||||
v: "2568"
|
||||
}, {
|
||||
n: "高能英雄",
|
||||
v: "8359"
|
||||
}, {
|
||||
n: "天龙八部手游",
|
||||
v: "2852"
|
||||
}, {
|
||||
n: "三国志战略版",
|
||||
v: "5619"
|
||||
}, {
|
||||
n: "忍者必须死3",
|
||||
v: "4041"
|
||||
}, {
|
||||
n: "SKY光遇",
|
||||
v: "3719"
|
||||
}, {
|
||||
n: "虎牙领主争霸",
|
||||
v: "7529"
|
||||
}, {
|
||||
n: "云上城之歌",
|
||||
v: "5977"
|
||||
}, {
|
||||
n: "晶核",
|
||||
v: "7279"
|
||||
}, {
|
||||
n: "仙境传说RO",
|
||||
v: "2675"
|
||||
}, {
|
||||
n: "天天狼人",
|
||||
v: "2774"
|
||||
}, {
|
||||
n: "JJ棋牌",
|
||||
v: "3841"
|
||||
}, {
|
||||
n: "奇迹MU:觉醒",
|
||||
v: "3116"
|
||||
}, {
|
||||
n: "指尖四川麻将",
|
||||
v: "7215"
|
||||
}, {
|
||||
n: "部落冲突",
|
||||
v: "1797"
|
||||
}, {
|
||||
n: "新剑侠情缘手游",
|
||||
v: "6259"
|
||||
}, {
|
||||
n: "萌宠远征",
|
||||
v: "9385"
|
||||
}, {
|
||||
n: "暗黑破坏神:不朽",
|
||||
v: "6385"
|
||||
}, {
|
||||
n: "英雄杀",
|
||||
v: "2688"
|
||||
}, {
|
||||
n: "热血江湖手游",
|
||||
v: "2817"
|
||||
}, {
|
||||
n: "蛋仔派对",
|
||||
v: "6909"
|
||||
}, {
|
||||
n: "完美世界手游",
|
||||
v: "4237"
|
||||
}, {
|
||||
n: "巅峰战舰",
|
||||
v: "2502"
|
||||
}, {
|
||||
n: "狼人杀",
|
||||
v: "2785"
|
||||
}, {
|
||||
n: "斗罗大陆:魂师对决",
|
||||
v: "6745"
|
||||
}, {
|
||||
n: "武侠乂手游",
|
||||
v: "4929"
|
||||
}, {
|
||||
n: "诛仙手游",
|
||||
v: "2647"
|
||||
}, {
|
||||
n: "斗破苍穹手游",
|
||||
v: "4337"
|
||||
}, {
|
||||
n: "迷你世界",
|
||||
v: "2683"
|
||||
}, {
|
||||
n: "风云",
|
||||
v: "3061"
|
||||
}, {
|
||||
n: "妄想山海",
|
||||
v: "6007"
|
||||
}, {
|
||||
n: "曙光英雄",
|
||||
v: "6169"
|
||||
}, {
|
||||
n: "三国战纪2",
|
||||
v: "6049"
|
||||
}, {
|
||||
n: "梦幻新诛仙",
|
||||
v: "5975"
|
||||
}, {
|
||||
n: "黎明觉醒:生机",
|
||||
v: "6131"
|
||||
}, {
|
||||
n: "远征",
|
||||
v: "7837"
|
||||
}, {
|
||||
n: "航海王:燃烧意志",
|
||||
v: "3943"
|
||||
}, {
|
||||
n: "火炬之光:无限",
|
||||
v: "6399"
|
||||
}, {
|
||||
n: "巅峰极速",
|
||||
v: "6979"
|
||||
}, {
|
||||
n: "圣境之塔",
|
||||
v: "7055"
|
||||
}, {
|
||||
n: "魔力宝贝",
|
||||
v: "2891"
|
||||
}, {
|
||||
n: "香肠派对",
|
||||
v: "3639"
|
||||
}, {
|
||||
n: "创造与魔法",
|
||||
v: "2931"
|
||||
}, {
|
||||
n: "JJ斗地主",
|
||||
v: "6271"
|
||||
}, {
|
||||
n: "永恒纪元:戒",
|
||||
v: "2646"
|
||||
}, {
|
||||
n: "天涯明月刀手游",
|
||||
v: "5115"
|
||||
}, {
|
||||
n: "狼人杀官方",
|
||||
v: "3679"
|
||||
}, {
|
||||
n: "混沌起源",
|
||||
v: "5985"
|
||||
}, {
|
||||
n: "多多自走棋",
|
||||
v: "5133"
|
||||
}, {
|
||||
n: "梦幻诛仙手游",
|
||||
v: "2672"
|
||||
}, {
|
||||
n: "鸿图之下",
|
||||
v: "6027"
|
||||
}, {
|
||||
n: "新笑傲江湖",
|
||||
v: "5669"
|
||||
}, {
|
||||
n: "凡人修仙传:人界篇",
|
||||
v: "8297"
|
||||
}, {
|
||||
n: "多乐棋牌",
|
||||
v: "6209"
|
||||
}, {
|
||||
n: "口袋觉醒",
|
||||
v: "5953"
|
||||
}, {
|
||||
n: "跑跑卡丁车手游",
|
||||
v: "2620"
|
||||
}, {
|
||||
n: "奶块",
|
||||
v: "2775"
|
||||
}, {
|
||||
n: "月圆之夜",
|
||||
v: "4339"
|
||||
}, {
|
||||
n: "率土之滨",
|
||||
v: "2691"
|
||||
}, {
|
||||
n: "征途2手游",
|
||||
v: "2811"
|
||||
}, {
|
||||
n: "英魂之刃口袋版",
|
||||
v: "2760"
|
||||
}, {
|
||||
n: "精灵盛典:黎明",
|
||||
v: "6123"
|
||||
}, {
|
||||
n: "方舟手游",
|
||||
v: "4035"
|
||||
}, {
|
||||
n: "掼蛋",
|
||||
v: "6225"
|
||||
}, {
|
||||
n: "绝世仙王",
|
||||
v: "6619"
|
||||
}, {
|
||||
n: "流星群侠传",
|
||||
v: "3927"
|
||||
}, {
|
||||
n: "寻仙手游",
|
||||
v: "2979"
|
||||
}, {
|
||||
n: "一梦江湖",
|
||||
v: "3082"
|
||||
}, {
|
||||
n: "Lost Light(萤火突击国际服)",
|
||||
v: "6859"
|
||||
}, {
|
||||
n: "弹幕云游戏",
|
||||
v: "7001"
|
||||
}, {
|
||||
n: "猎魂觉醒",
|
||||
v: "3071"
|
||||
}, {
|
||||
n: "冒险岛:枫之传说",
|
||||
v: "8005"
|
||||
}, {
|
||||
n: "征途手游",
|
||||
v: "2556"
|
||||
}, {
|
||||
n: "海岛奇兵",
|
||||
v: "2624"
|
||||
}, {
|
||||
n: "倩女幽魂手游",
|
||||
v: "2503"
|
||||
}, {
|
||||
n: "超凡先锋",
|
||||
v: "6507"
|
||||
}, {
|
||||
n: "龙之谷2手游",
|
||||
v: "2736"
|
||||
}, {
|
||||
n: "崩坏3",
|
||||
v: "2639"
|
||||
}, {
|
||||
n: "猫和老鼠",
|
||||
v: "2758"
|
||||
}, {
|
||||
n: "七人传奇:光与暗之交战",
|
||||
v: "8125"
|
||||
}, {
|
||||
n: "JJ麻将",
|
||||
v: "9487"
|
||||
}, {
|
||||
n: "拉轰西游",
|
||||
v: "9543"
|
||||
}, {
|
||||
n: "三国战纪",
|
||||
v: "6047"
|
||||
}, {
|
||||
n: "自由幻想手游",
|
||||
v: "4015"
|
||||
}, {
|
||||
n: "秦时明月世界",
|
||||
v: "5279"
|
||||
}, {
|
||||
n: "新斗罗大陆",
|
||||
v: "6657"
|
||||
}, {
|
||||
n: "新神魔大陆",
|
||||
v: "5939"
|
||||
}, {
|
||||
n: "逃跑吧!少年",
|
||||
v: "4137"
|
||||
}, {
|
||||
n: "太古神王2",
|
||||
v: "6649"
|
||||
}, {
|
||||
n: "剑侠世界3",
|
||||
v: "7183"
|
||||
}, {
|
||||
n: "天天吃鸡手机版",
|
||||
v: "4341"
|
||||
}, {
|
||||
n: "时空猎人3",
|
||||
v: "6411"
|
||||
}, {
|
||||
n: "合金弹头:觉醒",
|
||||
v: "6931"
|
||||
}, {
|
||||
n: "明日方舟",
|
||||
v: "4925"
|
||||
}, {
|
||||
n: "原始征途",
|
||||
v: "7713"
|
||||
}, {
|
||||
n: "奇迹:最强者",
|
||||
v: "3215"
|
||||
}, {
|
||||
n: "天天酷跑",
|
||||
v: "1715"
|
||||
}, {
|
||||
n: "FC 足球世界",
|
||||
v: "3873"
|
||||
}, {
|
||||
n: "万国觉醒",
|
||||
v: "6159"
|
||||
}, {
|
||||
n: "机动都市阿尔法",
|
||||
v: "5411"
|
||||
}, {
|
||||
n: "航海王热血航线",
|
||||
v: "6181"
|
||||
}, {
|
||||
n: "幻世九歌",
|
||||
v: "7199"
|
||||
}, {
|
||||
n: "植物大战僵尸",
|
||||
v: "485"
|
||||
}, {
|
||||
n: "无悔华夏",
|
||||
v: "7063"
|
||||
}, {
|
||||
n: "时空猎人",
|
||||
v: "1742"
|
||||
}, {
|
||||
n: "荒野乱斗",
|
||||
v: "4613"
|
||||
}, {
|
||||
n: "拳皇98终极之战OL",
|
||||
v: "2687"
|
||||
}, {
|
||||
n: "蛇蛇争霸",
|
||||
v: "2680"
|
||||
}, {
|
||||
n: "王牌竞速",
|
||||
v: "6463"
|
||||
}, {
|
||||
n: "重返帝国",
|
||||
v: "6955"
|
||||
}, {
|
||||
n: "吞噬星空:黎明",
|
||||
v: "6651"
|
||||
}, {
|
||||
n: "口袋妖怪",
|
||||
v: "2541"
|
||||
}, {
|
||||
n: "QQ炫舞手游",
|
||||
v: "2991"
|
||||
}, {
|
||||
n: "一拳超人:最强之男",
|
||||
v: "4629"
|
||||
}, {
|
||||
n: "荣耀新三国",
|
||||
v: "6943"
|
||||
}, {
|
||||
n: "少年三国志2",
|
||||
v: "6125"
|
||||
}, {
|
||||
n: "我的起源",
|
||||
v: "5365"
|
||||
}, {
|
||||
n: "决战平安京",
|
||||
v: "3064"
|
||||
}, {
|
||||
n: "剑灵2",
|
||||
v: "7223"
|
||||
}, {
|
||||
n: "开心消消乐",
|
||||
v: "1712"
|
||||
}, {
|
||||
n: "小小蚁国",
|
||||
v: "7803"
|
||||
}, {
|
||||
n: "最强NBA",
|
||||
v: "2988"
|
||||
}, {
|
||||
n: "剑侠情缘手游",
|
||||
v: "2621"
|
||||
}, {
|
||||
n: "长安幻想",
|
||||
v: "6727"
|
||||
}, {
|
||||
n: "我叫MT4",
|
||||
v: "4087"
|
||||
}, {
|
||||
n: "全明星街球派对",
|
||||
v: "8401"
|
||||
}, {
|
||||
n: "大话西游手游",
|
||||
v: "2626"
|
||||
}, {
|
||||
n: "荣耀大天使",
|
||||
v: "6477"
|
||||
}, {
|
||||
n: "镇魂街:天生为王",
|
||||
v: "6557"
|
||||
}, {
|
||||
n: "摩尔庄园",
|
||||
v: "5981"
|
||||
}, {
|
||||
n: "游戏王:决斗链接",
|
||||
v: "4451"
|
||||
}, {
|
||||
n: "剑侠世界2手游",
|
||||
v: "3150"
|
||||
}, {
|
||||
n: "青云诀2",
|
||||
v: "6009"
|
||||
}, {
|
||||
n: "战地无疆",
|
||||
v: "7909"
|
||||
}, {
|
||||
n: "一念逍遥",
|
||||
v: "6419"
|
||||
}, {
|
||||
n: "永劫无间手游",
|
||||
v: "7579"
|
||||
}, {
|
||||
n: "尘白禁区",
|
||||
v: "7297"
|
||||
}, {
|
||||
n: "元梦之星",
|
||||
v: "9521"
|
||||
}, {
|
||||
n: "不良人3",
|
||||
v: "5891"
|
||||
}, {
|
||||
n: "剑灵:革命",
|
||||
v: "4545"
|
||||
}, {
|
||||
n: "魔力宝贝:旅人",
|
||||
v: "7573"
|
||||
}, {
|
||||
n: "米加小镇",
|
||||
v: "7269"
|
||||
}, {
|
||||
n: "龙武手游",
|
||||
v: "5219"
|
||||
}, {
|
||||
n: "斗罗大陆2:绝世唐门",
|
||||
v: "6581"
|
||||
}, {
|
||||
n: "西行纪燃魂",
|
||||
v: "8303"
|
||||
}, {
|
||||
n: "坦克世界闪击战",
|
||||
v: "4977"
|
||||
}, {
|
||||
n: "军棋",
|
||||
v: "2561"
|
||||
}, {
|
||||
n: "饥荒:新家",
|
||||
v: "6491"
|
||||
}, {
|
||||
n: "拳皇命运",
|
||||
v: "3379"
|
||||
}, {
|
||||
n: "实况足球",
|
||||
v: "3741"
|
||||
}, {
|
||||
n: "战舰世界闪击战",
|
||||
v: "4101"
|
||||
}, {
|
||||
n: "时空召唤",
|
||||
v: "2551"
|
||||
}, {
|
||||
n: "王牌战争:文明重启",
|
||||
v: "5479"
|
||||
}, {
|
||||
n: "雀魂麻将",
|
||||
v: "7107"
|
||||
}, {
|
||||
n: "欢乐升级",
|
||||
v: "3925"
|
||||
}, {
|
||||
n: "绿色征途",
|
||||
v: "4227"
|
||||
}, {
|
||||
n: "弹弹堂手游",
|
||||
v: "2857"
|
||||
}, {
|
||||
n: "太极熊猫3:猎龙",
|
||||
v: "2778"
|
||||
}, {
|
||||
n: "哈利波特:魔法觉醒",
|
||||
v: "5835"
|
||||
}, {
|
||||
n: "天地劫:幽城再临",
|
||||
v: "5987"
|
||||
}, {
|
||||
n: "热血街篮",
|
||||
v: "5859"
|
||||
}, {
|
||||
n: "神雕侠侣手游",
|
||||
v: "1781"
|
||||
}, {
|
||||
n: "山海镜花",
|
||||
v: "5089"
|
||||
}, {
|
||||
n: "三国志战棋版",
|
||||
v: "7937"
|
||||
}, {
|
||||
n: "神雕侠侣2",
|
||||
v: "4209"
|
||||
}, {
|
||||
n: "仙魔决",
|
||||
v: "1674"
|
||||
}, {
|
||||
n: "王者荣耀星之破晓",
|
||||
v: "7927"
|
||||
}, {
|
||||
n: "我在江湖之神魔道",
|
||||
v: "7699"
|
||||
}, {
|
||||
n: "梦幻模拟战",
|
||||
v: "3481"
|
||||
}, {
|
||||
n: "单机手游",
|
||||
v: "2777"
|
||||
}, {
|
||||
n: "斗罗大陆-斗神再临",
|
||||
v: "6631"
|
||||
}, {
|
||||
n: "未来之役",
|
||||
v: "6831"
|
||||
}, {
|
||||
n: "风云岛行动",
|
||||
v: "4695"
|
||||
}, {
|
||||
n: "新游推荐",
|
||||
v: "3160"
|
||||
}, {
|
||||
n: "火影忍者OL",
|
||||
v: "3901"
|
||||
}, {
|
||||
n: "九灵神域",
|
||||
v: "7719"
|
||||
}, {
|
||||
n: "武动乾坤",
|
||||
v: "3829"
|
||||
}, {
|
||||
n: "秦时明月2",
|
||||
v: "1784"
|
||||
}, {
|
||||
n: "文明与征服",
|
||||
v: "7071"
|
||||
}, {
|
||||
n: "战双:帕弥什",
|
||||
v: "4133"
|
||||
}, {
|
||||
n: "大航海时代:海上霸主",
|
||||
v: "6929"
|
||||
}, {
|
||||
n: "剑网1:归来",
|
||||
v: "7361"
|
||||
}, {
|
||||
n: "绝区零",
|
||||
v: "7711"
|
||||
}, {
|
||||
n: "黑色沙漠手游",
|
||||
v: "7287"
|
||||
}, {
|
||||
n: "虎牙吃鸡",
|
||||
v: "7465"
|
||||
}, {
|
||||
n: "一剑斩仙",
|
||||
v: "6843"
|
||||
}, {
|
||||
n: "传奇天下",
|
||||
v: "6927"
|
||||
}, {
|
||||
n: "斗斗堂",
|
||||
v: "7133"
|
||||
}, {
|
||||
n: "斗罗大陆",
|
||||
v: "6119"
|
||||
}, {
|
||||
n: "天谕手游",
|
||||
v: "5925"
|
||||
}, {
|
||||
n: "坎公骑冠剑",
|
||||
v: "6641"
|
||||
}, {
|
||||
n: "最终幻想觉醒",
|
||||
v: "2721"
|
||||
}, {
|
||||
n: "神将三国",
|
||||
v: "6621"
|
||||
}, {
|
||||
n: "灌篮高手正版授权手游",
|
||||
v: "5399"
|
||||
}, {
|
||||
n: "剑与家园",
|
||||
v: "2838"
|
||||
}, {
|
||||
n: "极无双2",
|
||||
v: "7825"
|
||||
}, {
|
||||
n: "光明大陆",
|
||||
v: "2832"
|
||||
}, {
|
||||
n: "荒野行动",
|
||||
v: "3084"
|
||||
}, {
|
||||
n: "战斗法则",
|
||||
v: "9513"
|
||||
}, {
|
||||
n: "疯狂原始人",
|
||||
v: "4619"
|
||||
}, {
|
||||
n: "逆战手游",
|
||||
v: "7575"
|
||||
}, {
|
||||
n: "石器时代:觉醒",
|
||||
v: "9159"
|
||||
}]
|
||||
}]
|
||||
},
|
||||
searchUrl: "https://search.cdn.huya.com/?m=Search&do=getSearchContent&q=**&uid=0&v=4&typ=-5&livestate=0&rows=40&start=0",
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
headers: {
|
||||
"User-Agent": "MOBILE_UA"
|
||||
},
|
||||
timeout: 5e3,
|
||||
limit: 8,
|
||||
play_parse: !0,
|
||||
lazy: "js:\n let rid = input.match(/\\/ (\\d + ) / )[1];\n function getRealUrl(live_url) {\n let [i, b] = live_url.split('?');\n let r = i.split('/').pop();\n let s = r.replace(/.(flv|m3u8)/, '');\n let c_tmp = b.split('&').filter(n => n);\n let n = {};\n let c_tmp2 = [];\n c_tmp.forEach(function(tmp, index) {\n if (index < 3) {\n n[tmp.split('=')[0]] = tmp.split('=')[1]\n } else {\n c_tmp2.push(tmp)\n }\n });\n let tmp2 = c_tmp2.join('&');\n n[tmp2.split('=')[0]] = tmp2.split('=')[1];\n let fm = decodeURIComponent(n.fm).split('&')[0];\n let u = base64Decode(fm);\n let p = u.split('_')[0];\n let f = new Date().getTime() + '0000';\n let ll = n.wsTime;\n let t = '0';\n let h = [p, t, s, f, ll].join('_');\n let m = md5(h);\n return (i + '?wsSecret=' + m + '&wsTime=' + ll + '&u=' + t + '&seqid=' + f + '&' + c_tmp2.pop()).replace('hls', 'flv').replace('m3u8', 'flv')\n }\n let purl = JSON.parse(request('https://mp.huya.com/cache.php?m=Live&do=profileRoom&roomid=' + rid)).data.stream.flv.multiLine[0].url;\n input = {\n jx: 0,\n url: getRealUrl(purl),\n parse: 0,\n header: JSON.stringify({\n 'user-agent': 'Mozilla/5.0'\n })\n }\n ",
|
||||
"推荐": "js:\n let d = [];\n let jo = JSON.parse(request(input)).data.datas;\n jo.forEach(it => {\n d.push({\n url: it.profileRoom,\n title: it.introduction,\n img: it.screenshot,\n desc: '👁' + it.totalCount + ' 🆙' + it.nick,\n })\n });\n setResult(d);\n ",
|
||||
"一级": "js:\n let d = [];\n let jo = JSON.parse(request(input)).data.datas;\n jo.forEach(it => {\n d.push({\n url: it.profileRoom,\n title: it.introduction,\n img: it.screenshot,\n desc: '👁' + it.totalCount + ' 🆙' + it.nick,\n })\n });\n setResult(d);\n ",
|
||||
"二级": "*",
|
||||
"搜索": "json:response.3.docs;gameName;game_screenshot;game_nick;room_id"
|
||||
};
|
||||
Binary file not shown.
Reference in New Issue
Block a user