xxxx
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
muban.vfed.二级.title = 'h1&&Text;.fed-col-md3:eq(0)&&Text';
|
||||
muban.vfed.二级.desc = '.fed-col-md3:eq(3)&&Text;;;.fed-col-md6--span:eq(0)&&Text;.fed-col-md6--span:eq(1)&&Text';
|
||||
muban.vfed.二级.tabs = '.nav-tabs&&li';
|
||||
muban.vfed.二级.lists = '.myui-content__list:eq(#id)&&li';
|
||||
var rule = {
|
||||
title: '58动漫[漫]',
|
||||
模板: 'vfed',
|
||||
host: 'http://www.ting38.com',
|
||||
url: '/search.php?page=fypage&searchtype=5&tid=fyclassfyfilter',
|
||||
class_parse: '.fed-pops-navbar&&li;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: "js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);var url=html.url;if(html.encrypt=='1'){url=unescape(url)}else if(html.encrypt=='2'){url=unescape(base64Decode(url))}if(/m3u8|mp4/.test(url)){input=url}else{input}",
|
||||
limit: 6,
|
||||
filterable: 1,//是否启用分类筛选,
|
||||
filter_url: '&order={{fl.by}}&area={{fl.area}}&year={{fl.year}}',
|
||||
filter: 'H4sIAAAAAAAAA+2TzUrDQBSF32XWWWTSX/sq0kXUAYsmhVCFULKSutJURAzFghu1EQoGLMWmtE+TjOYtzM9k7gU37pPdnO/MvTN3DjMmlPQOx+SM2aRHbKZbRCGmbrBUxZtVtN2l+lI/v2D5NjPDEz+58jOcCuIoBdVUrSFYvkRcA65hToFTzFXgKuL0QPJ0iXgXeBfzDvAO5m3gbcxbwFuYN4E3MYd5KZ6XwrwU5jWGFhM8Xzr9zCme/ciGR+fufRxO/zw699aJtxINRoN0a9k4CkMePAjndDCSBnf9n9s7YRwPDYOZJ9mxfYVodeaVy7xRZ165zJsoc91iOsp8HsQ34T8zj18WyexaUCFKL3mb8a8P4Qkh66YB3+zLukLIW3uvfL4UnhCy5/N7/LQrexZC1i0X33u3rCuE9D4DqBNC3mWyjraP5V0KgbOpv0QVvoTzCxTHT5vwCAAA',
|
||||
filter_def: {
|
||||
1: {cateId: '1'},
|
||||
2: {cateId: '2'},
|
||||
3: {cateId: '3'},
|
||||
4: {cateId: '4'}
|
||||
},
|
||||
searchUrl: '/search.php?page=fypage&searchword=**&searchtype=',
|
||||
搜索: '.fed-list-item;a&&title;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
// 注意事项:此源仅支持 影视TV 及 爱佬版tvbox最新版
|
||||
// 注意事项:此源仅支持 影视TV 及 爱佬版tvbox最新版
|
||||
// 注意事项:此源仅支持 影视TV 及 爱佬版tvbox最新版
|
||||
// 3个set-Cookie
|
||||
|
||||
var rule = {
|
||||
title:'Anime1动畫',
|
||||
host:'https://anime1.me',
|
||||
url: '/fyclass',
|
||||
detailUrl:'/?cat=fyid',
|
||||
searchUrl: '/page/fypage?s=**',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
headers:{'User-Agent': 'PC_UA'},
|
||||
timeout:5000,
|
||||
class_name:'連載中&2024&2023&2022&2021&2020&2019&2018&更早',
|
||||
class_url:'連載中&2024&2023&2022&2021&2020&2019&2018&2017',
|
||||
play_parse:true,
|
||||
lazy:`js:
|
||||
var apiurl = 'https://v.anime1.me/api';
|
||||
var html = request(apiurl, {
|
||||
headers: {
|
||||
'Referer': HOST,
|
||||
},
|
||||
body: 'd=' + input,
|
||||
method: 'POST',
|
||||
withHeaders: true
|
||||
});
|
||||
let json = JSON.parse(html);
|
||||
print(json);
|
||||
log(Object.keys(json));
|
||||
let setCk = Object.keys(json).filter(it => it.toLowerCase() === "set-cookie");
|
||||
let cookie = setCk ? json[setCk] : "";
|
||||
// 3个set-Cookie
|
||||
if (Array.isArray(cookie)) {
|
||||
cookie = cookie.join(';');
|
||||
}
|
||||
cookie = cookie.split(';').filter(function(it) {
|
||||
return ['e', 'p', 'h'].includes(it.split('=')[0])
|
||||
}).join(';');
|
||||
log(cookie);
|
||||
var purl = JSON.parse(json.body).s[0].src;
|
||||
if (purl.startsWith('/')) {
|
||||
purl = 'https:' + purl
|
||||
}
|
||||
input = {
|
||||
jx: 0,
|
||||
url: purl,
|
||||
parse: 0,
|
||||
header: JSON.stringify({
|
||||
'referer': HOST,
|
||||
'Cookie': cookie,
|
||||
'user-agent': PC_UA
|
||||
}),
|
||||
}
|
||||
`,
|
||||
limit:6,
|
||||
推荐: `js:
|
||||
var d = [];
|
||||
function stripHtmlTag(src) {
|
||||
return src.replace(/<\\/?[^>]+(>|$)/g, '').replace(/&.{1,5};/g, '').replace(/\\s{2,}/g, ' ');
|
||||
}
|
||||
var timestamp = new Date().getTime();
|
||||
var json = request('https://d1zquzjgwo9yb.cloudfront.net/?_=' + timestamp);
|
||||
var list = JSON.parse(json);
|
||||
let playKeys = Object.values(list).filter(function(x) {
|
||||
return x[2].includes('連載中');
|
||||
});
|
||||
playKeys.forEach(function(it) {
|
||||
d.push({
|
||||
title: stripHtmlTag(it[1]),
|
||||
img: 'https://sta.anicdn.com/playerImg/8.jpg',
|
||||
desc: it[2],
|
||||
url: it[0],
|
||||
});
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
一级: `js:
|
||||
var d = [];
|
||||
function stripHtmlTag(src) {
|
||||
return src.replace(/<\\/?[^>]+(>|$)/g, '').replace(/&.{1,5};/g, '').replace(/\\s{2,}/g, ' ');
|
||||
}
|
||||
var timestamp = new Date().getTime();
|
||||
var json = request('https://d1zquzjgwo9yb.cloudfront.net/?_=' + timestamp);
|
||||
var list = JSON.parse(json);
|
||||
let playKeys = Object.values(list).filter(function(x) {
|
||||
if (MY_CATE === '連載中') return x[2].includes(MY_CATE);
|
||||
else if (MY_CATE === '2017') return x[3] <= MY_CATE;
|
||||
else return x[3] == MY_CATE;
|
||||
});
|
||||
playKeys.forEach(function(it) {
|
||||
d.push({
|
||||
title: stripHtmlTag(it[1]),
|
||||
img: 'https://sta.anicdn.com/playerImg/8.jpg',
|
||||
desc: it[2],
|
||||
url: it[0],
|
||||
});
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
二级: `js:
|
||||
pdfh = jsp.pdfh; pdfa = jsp.pdfa; pd = jsp.pd;
|
||||
var html = request(input);
|
||||
var timestamp = new Date().getTime();
|
||||
var json = request('https://d1zquzjgwo9yb.cloudfront.net/?_=' + timestamp);
|
||||
var list = JSON.parse(json);
|
||||
var vid = input.split('=')[1];
|
||||
let playKeys = Object.values(list).find(function(x) {
|
||||
return x[0] === parseInt(vid);
|
||||
});
|
||||
VOD = {
|
||||
vod_pic: 'https://sta.anicdn.com/playerImg/8.jpg',
|
||||
vod_id: playKeys[0],
|
||||
vod_name: playKeys[1],
|
||||
vod_content: playKeys[2],
|
||||
vod_year: playKeys[3],
|
||||
type_name: playKeys[4],
|
||||
vod_actor: playKeys[5],
|
||||
};
|
||||
var pageurl = pd(html, '.cat-links&&a&&href');
|
||||
var pagenum = 1;
|
||||
let vod_tab_list = [];
|
||||
let vlist = [];
|
||||
for (let p = 1; p < parseInt(pagenum) + 1; p++) {
|
||||
let phtml = request(pageurl + '/page/' + pagenum);
|
||||
let new_vod_list = [];
|
||||
let vodList = [];
|
||||
vodList = pdfa(phtml, '.site-main&&article');
|
||||
for (let i = 0; i < vodList.length; i++) {
|
||||
let it = vodList[i];
|
||||
let ptitle = pdfh(it, '.entry-title&&Text').replace(/\\[(.*)\\]/, '$1');
|
||||
let purl = pd(it, '.video-js&&data-apireq');
|
||||
new_vod_list.push(ptitle + '$' + purl);
|
||||
}
|
||||
vlist = vlist.concat(new_vod_list);
|
||||
try {
|
||||
pagenum = pd(phtml, '.nav-previous&&a&&href').split('/page/')[1];
|
||||
} catch(e) {}
|
||||
}
|
||||
let vlist2 = vlist.reverse().join("#");
|
||||
vod_tab_list.push(vlist2);
|
||||
VOD.vod_play_from = '道长在线';
|
||||
VOD.vod_play_url = vod_tab_list.join("$$$");
|
||||
`,
|
||||
搜索: `js:
|
||||
var d = [];
|
||||
function stripHtmlTag(src) {
|
||||
return src.replace(/<\\/?[^>]+(>|$)/g, '').replace(/&.{1,5};/g, '').replace(/\\s{2,}/g, ' ');
|
||||
}
|
||||
var timestamp = new Date().getTime();
|
||||
var json = request('https://d1zquzjgwo9yb.cloudfront.net/?_=' + timestamp);
|
||||
var list = JSON.parse(json);
|
||||
var wd = input.split('=')[1];
|
||||
let playKeys = Object.values(list).filter(function(x) {
|
||||
return x[1].includes(wd);
|
||||
});
|
||||
log(playKeys);
|
||||
playKeys.forEach(function(it) {
|
||||
d.push({
|
||||
title: stripHtmlTag(it[1]),
|
||||
img: 'https://sta.anicdn.com/playerImg/8.jpg',
|
||||
desc: it[2],
|
||||
url: it[0],
|
||||
});
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"规则名": "BT天堂",
|
||||
"规则作者": "",
|
||||
"请求头参数": "PC_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://www.bttt11.com",
|
||||
"首页列表数组规则": "body&&.ul-imgtxt1",
|
||||
"首页片单列表数组规则": "li",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"首页片单标题": "h3&&Text",
|
||||
"首页片单链接": "a&&href",
|
||||
"首页片单图片": "img&&src",
|
||||
"首页片单副标题": "span,-1&&Text",
|
||||
"首页片单链接加前缀": "https://www.bttt11.com",
|
||||
"首页片单链接加后缀": "",
|
||||
"分类起始页码": "0",
|
||||
"分类链接": "https://www.bttt11.com/html/{cateId}-{catePg}.html",
|
||||
//"分类链接": "https://www.clgod.xyz/list/{catePg}-{cateId}-0-0.html",
|
||||
"分类名称": "欧美电影&日韩电影&港台电影&大陆电影&亚太电影&欧美剧&日韩剧&港台剧&国产剧&亚太剧&动漫&综艺&纪录片",
|
||||
"分类名称替换词": "1&2&3&4&5&6&7&8&9&10&11&12&13",
|
||||
//"分类名称": "电影&动作&灵异&奇幻&宗教&励志&犯罪&功夫&喜剧&黑色&幽默&爱情&香港&纪录片&灾难&亲情&暴力&僵尸&丧尸&悬疑&人性&惊悚&血腥&武侠&剧情&历史&战争&经典&漫画&改编&恐怖&穿越&青春&黑帮&文艺&浪漫&同志&冒险&动画&演唱会",
|
||||
//"分类名称替换词": "0&1&2&3&4&5&6&7&8&10&11&12&1315&16&17&18&19&20&21&22&23&24&25&27&28&29&30&31&32&33&34&35&36&37&38&39&40&41&42",
|
||||
"筛选数据": {},
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".ul-imgtxt2&&li",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "h3&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": "img&&src",
|
||||
"分类片单副标题": "span,-1--a&&Text!更新时间:",
|
||||
"分类片单链接加前缀": "https://www.bttt11.com",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$PC_UA",
|
||||
"搜索链接": "https://www.bttt11.com/e/search/;post",
|
||||
"POST请求数据": "show=title,newstext&keyboard={wd}&searchtype=影视搜索",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".ul-imgtxt2&&li",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "img&&src",
|
||||
"搜索片单标题": "h3&&Text",
|
||||
"搜索片单链接": "a&&href",
|
||||
"搜索片单副标题": "span,-1--a&&Text!更新时间:",
|
||||
"搜索片单链接加前缀": "https://www.bttt11.com",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "0",
|
||||
"类型详情": "<p>◎类 别&&</p>",
|
||||
"年代详情": "<p>◎年 代&&</p>",
|
||||
"地区详情": "<p>◎产 地&&</p>",
|
||||
"演员详情": "",
|
||||
"简介详情": "",
|
||||
"线路列表数组规则": "",
|
||||
"线路标题": "",
|
||||
"播放列表数组规则": "body&&.container",
|
||||
"选集列表数组规则": "a[href^=magnet]||a[href^=ed2K]",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv",
|
||||
"手动嗅探视频链接过滤词": ".html"
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
// http://www.ntdm.tv
|
||||
var rule={
|
||||
title:'NT动漫',
|
||||
host:'http://www.ntdm8.com',
|
||||
homeUrl:'/type/riben.html',
|
||||
// url:'/show/fyclass--------fypage---.html',
|
||||
url:'/show/fyclassfyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'--{{fl.by}}-{{fl.class}}--{{fl.letter}}---fypage---{{fl.year}}',
|
||||
filter:{
|
||||
"riben":[{"key":"year","name":"年份:","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000以前","v":"2000以前"}]},{"key":"class","name":"类型:","value":[{"n":"全部","v":""},{"n":"搞笑","v":"搞笑"},{"n":"运动","v":"运动"},{"n":"励志","v":"励志"},{"n":"热血","v":"热血"},{"n":"战斗","v":"战斗"},{"n":"竞技","v":"竞技"},{"n":"校园","v":"校园"},{"n":"青春","v":"青春"},{"n":"爱情","v":"爱情"},{"n":"冒险","v":"冒险"},{"n":"后宫","v":"后宫"},{"n":"百合","v":"百合"},{"n":"治愈","v":"治愈"},{"n":"萝莉","v":"萝莉"},{"n":"魔法","v":"魔法"},{"n":"悬疑","v":"悬疑"},{"n":"推理","v":"推理"},{"n":"奇幻","v":"奇幻"},{"n":"科幻","v":"科幻"},{"n":"游戏","v":"游戏"},{"n":"神魔","v":"神魔"},{"n":"恐怖","v":"恐怖"},{"n":"血腥","v":"血腥"},{"n":"机战","v":"机战"},{"n":"战争","v":"战争"},{"n":"犯罪","v":"犯罪"},{"n":"历史","v":"历史"},{"n":"社会","v":"社会"},{"n":"职场","v":"职场"},{"n":"剧情","v":"剧情"},{"n":"伪娘","v":"伪娘"},{"n":"耽美","v":"耽美"},{"n":"童年","v":"童年"},{"n":"教育","v":"教育"},{"n":"亲子","v":"亲子"},{"n":"真人","v":"真人"},{"n":"歌舞","v":"歌舞"},{"n":"肉番","v":"肉番"},{"n":"美少女","v":"美少女"},{"n":"轻小说","v":"轻小说"},{"n":"吸血鬼","v":"吸血鬼"},{"n":"女性向","v":"女性向"},{"n":"泡面番","v":"泡面番"},{"n":"欢乐向","v":"欢乐向"}]},{"key":"letter","name":"字母:","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0~9","v":"0~9"}]},{"key":"by","name":"排序:","value":[{"n":"更新时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"zhongguo":[{"key":"year","name":"年份:","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000以前","v":"2000以前"}]},{"key":"class","name":"类型:","value":[{"n":"全部","v":""},{"n":"搞笑","v":"搞笑"},{"n":"运动","v":"运动"},{"n":"励志","v":"励志"},{"n":"热血","v":"热血"},{"n":"战斗","v":"战斗"},{"n":"竞技","v":"竞技"},{"n":"校园","v":"校园"},{"n":"青春","v":"青春"},{"n":"爱情","v":"爱情"},{"n":"冒险","v":"冒险"},{"n":"后宫","v":"后宫"},{"n":"百合","v":"百合"},{"n":"治愈","v":"治愈"},{"n":"萝莉","v":"萝莉"},{"n":"魔法","v":"魔法"},{"n":"悬疑","v":"悬疑"},{"n":"推理","v":"推理"},{"n":"奇幻","v":"奇幻"},{"n":"科幻","v":"科幻"},{"n":"游戏","v":"游戏"},{"n":"神魔","v":"神魔"},{"n":"恐怖","v":"恐怖"},{"n":"血腥","v":"血腥"},{"n":"机战","v":"机战"},{"n":"战争","v":"战争"},{"n":"犯罪","v":"犯罪"},{"n":"历史","v":"历史"},{"n":"社会","v":"社会"},{"n":"职场","v":"职场"},{"n":"剧情","v":"剧情"},{"n":"伪娘","v":"伪娘"},{"n":"耽美","v":"耽美"},{"n":"童年","v":"童年"},{"n":"教育","v":"教育"},{"n":"亲子","v":"亲子"},{"n":"真人","v":"真人"},{"n":"歌舞","v":"歌舞"},{"n":"肉番","v":"肉番"},{"n":"美少女","v":"美少女"},{"n":"轻小说","v":"轻小说"},{"n":"吸血鬼","v":"吸血鬼"},{"n":"女性向","v":"女性向"},{"n":"泡面番","v":"泡面番"},{"n":"欢乐向","v":"欢乐向"}]},{"key":"letter","name":"字母:","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0~9","v":"0~9"}]},{"key":"by","name":"排序:","value":[{"n":"更新时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"omei":[{"key":"year","name":"年份:","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000以前","v":"2000以前"}]},{"key":"class","name":"类型:","value":[{"n":"全部","v":""},{"n":"搞笑","v":"搞笑"},{"n":"运动","v":"运动"},{"n":"励志","v":"励志"},{"n":"热血","v":"热血"},{"n":"战斗","v":"战斗"},{"n":"竞技","v":"竞技"},{"n":"校园","v":"校园"},{"n":"青春","v":"青春"},{"n":"爱情","v":"爱情"},{"n":"冒险","v":"冒险"},{"n":"后宫","v":"后宫"},{"n":"百合","v":"百合"},{"n":"治愈","v":"治愈"},{"n":"萝莉","v":"萝莉"},{"n":"魔法","v":"魔法"},{"n":"悬疑","v":"悬疑"},{"n":"推理","v":"推理"},{"n":"奇幻","v":"奇幻"},{"n":"科幻","v":"科幻"},{"n":"游戏","v":"游戏"},{"n":"神魔","v":"神魔"},{"n":"恐怖","v":"恐怖"},{"n":"血腥","v":"血腥"},{"n":"机战","v":"机战"},{"n":"战争","v":"战争"},{"n":"犯罪","v":"犯罪"},{"n":"历史","v":"历史"},{"n":"社会","v":"社会"},{"n":"职场","v":"职场"},{"n":"剧情","v":"剧情"},{"n":"伪娘","v":"伪娘"},{"n":"耽美","v":"耽美"},{"n":"童年","v":"童年"},{"n":"教育","v":"教育"},{"n":"亲子","v":"亲子"},{"n":"真人","v":"真人"},{"n":"歌舞","v":"歌舞"},{"n":"肉番","v":"肉番"},{"n":"美少女","v":"美少女"},{"n":"轻小说","v":"轻小说"},{"n":"吸血鬼","v":"吸血鬼"},{"n":"女性向","v":"女性向"},{"n":"泡面番","v":"泡面番"},{"n":"欢乐向","v":"欢乐向"}]},{"key":"letter","name":"字母:","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0~9","v":"0~9"}]},{"key":"by","name":"排序:","value":[{"n":"更新时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}]
|
||||
},
|
||||
searchUrl:'/search/**----------fypage---.html',
|
||||
searchable:2,//是否启用全局搜索,
|
||||
quickSearch:0,//是否启用快速搜索,
|
||||
headers:{//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent':'MOBILE_UA',
|
||||
},
|
||||
class_parse: '.search-tag li;a&&Text;a&&href;.*/(\\w+).html',
|
||||
play_parse:true,
|
||||
detailUrl:'',
|
||||
lazy:"",
|
||||
limit:6,
|
||||
推荐:'*',
|
||||
一级:'.blockcontent1&&.blockdif2;img&&alt;img&&src;.newname&&Text;a&&href',
|
||||
二级访问前:'',
|
||||
二级:{
|
||||
"title":"h4&&Text;.detail_imform_value:eq(6)&&Text",
|
||||
"img":".poster&&src",
|
||||
"desc":".detail_imform_kv:eq(0)&&Text;.detail_imform_value:eq(5)&&Text;.detail_imform_value:eq(2)&&Text;.detail_imform_kv:eq(0)&&Text;.detail_imform_kv:eq(3)&&Text",
|
||||
"content":".detail_imform_desc_pre&&Text",
|
||||
"tabs":"#menu0&&li",
|
||||
"lists":".movurl:eq(#id)&&li"},
|
||||
搜索:'*',
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
[
|
||||
{
|
||||
"share_name": "优品阁",
|
||||
"share_id": "uWa9gbM3RJ7"
|
||||
},
|
||||
{
|
||||
"share_name": "阿里1T",
|
||||
"share_id": "mxAfB6eRgY4"
|
||||
},
|
||||
{
|
||||
"share_name": "平凡中的",
|
||||
"share_id": "4ydLxf7VgH7"
|
||||
},
|
||||
{
|
||||
"share_name": "tacit0924",
|
||||
"share_id": "DNgnCudf4cD?pwd=6666"
|
||||
},
|
||||
{
|
||||
"share_name": "黄妈",
|
||||
"share_id": "4bGRVUdUtct"
|
||||
},
|
||||
{
|
||||
"share_name": "YYDSVIP",
|
||||
"share_id": "dieULBdYP3D"
|
||||
},
|
||||
{
|
||||
"share_name": "优源阁",
|
||||
"share_id": "RnjUi1urdb2"
|
||||
},
|
||||
{
|
||||
"share_name": "风流动漫",
|
||||
"share_id": "WdaaeX7HK44"
|
||||
},
|
||||
{
|
||||
"share_name": "风流剧集",
|
||||
"share_id": "kgxWjZsK6bq"
|
||||
},
|
||||
{
|
||||
"share_name": "xiaaluo",
|
||||
"share_id": "sg8CdGUwmUr"
|
||||
},
|
||||
{
|
||||
"share_name": "4K影视",
|
||||
"share_id": "wHPKUENKFsS"
|
||||
}
|
||||
]
|
||||
Vendored
+10756
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6143 @@
|
||||
;
|
||||
(function(root, factory) {
|
||||
if (typeof exports === "object") {
|
||||
// CommonJS
|
||||
module.exports = exports = factory();
|
||||
} else if (typeof define === "function" && define.amd) {
|
||||
// AMD
|
||||
define([], factory);
|
||||
} else {
|
||||
// Global (browser)
|
||||
globalThis.CryptoJS = factory();
|
||||
}
|
||||
}(this, function() {
|
||||
|
||||
/*globals window, global, require*/
|
||||
|
||||
/**
|
||||
* CryptoJS core components.
|
||||
*/
|
||||
var CryptoJS = CryptoJS || (function(Math, undefined) {
|
||||
|
||||
var crypto;
|
||||
|
||||
// Native crypto from window (Browser)
|
||||
if (typeof window !== 'undefined' && window.crypto) {
|
||||
crypto = window.crypto;
|
||||
}
|
||||
|
||||
// Native crypto in web worker (Browser)
|
||||
if (typeof self !== 'undefined' && self.crypto) {
|
||||
crypto = self.crypto;
|
||||
}
|
||||
|
||||
// Native crypto from worker
|
||||
if (typeof globalThis !== 'undefined' && globalThis.crypto) {
|
||||
crypto = globalThis.crypto;
|
||||
}
|
||||
|
||||
// Native (experimental IE 11) crypto from window (Browser)
|
||||
if (!crypto && typeof window !== 'undefined' && window.msCrypto) {
|
||||
crypto = window.msCrypto;
|
||||
}
|
||||
|
||||
// Native crypto from global (NodeJS)
|
||||
if (!crypto && typeof global !== 'undefined' && global.crypto) {
|
||||
crypto = global.crypto;
|
||||
}
|
||||
|
||||
// Native crypto import via require (NodeJS)
|
||||
if (!crypto && typeof require === 'function') {
|
||||
try {
|
||||
crypto = require('crypto');
|
||||
} catch (err) {}
|
||||
}
|
||||
|
||||
/*
|
||||
* Cryptographically secure pseudorandom number generator
|
||||
*
|
||||
* As Math.random() is cryptographically not safe to use
|
||||
*/
|
||||
var cryptoSecureRandomInt = function() {
|
||||
if (crypto) {
|
||||
// Use getRandomValues method (Browser)
|
||||
if (typeof crypto.getRandomValues === 'function') {
|
||||
try {
|
||||
return crypto.getRandomValues(new Uint32Array(1))[0];
|
||||
} catch (err) {}
|
||||
}
|
||||
|
||||
// Use randomBytes method (NodeJS)
|
||||
if (typeof crypto.randomBytes === 'function') {
|
||||
try {
|
||||
return crypto.randomBytes(4)
|
||||
.readInt32LE();
|
||||
} catch (err) {}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('Native crypto module could not be used to get secure random number.');
|
||||
};
|
||||
|
||||
/*
|
||||
* Local polyfill of Object.create
|
||||
*/
|
||||
var create = Object.create || (function() {
|
||||
function F() {}
|
||||
|
||||
return function(obj) {
|
||||
var subtype;
|
||||
|
||||
F.prototype = obj;
|
||||
|
||||
subtype = new F();
|
||||
|
||||
F.prototype = null;
|
||||
|
||||
return subtype;
|
||||
};
|
||||
}());
|
||||
|
||||
/**
|
||||
* CryptoJS namespace.
|
||||
*/
|
||||
var C = {};
|
||||
|
||||
/**
|
||||
* Library namespace.
|
||||
*/
|
||||
var C_lib = C.lib = {};
|
||||
|
||||
/**
|
||||
* Base object for prototypal inheritance.
|
||||
*/
|
||||
var Base = C_lib.Base = (function() {
|
||||
|
||||
|
||||
return {
|
||||
/**
|
||||
* Creates a new object that inherits from this object.
|
||||
*
|
||||
* @param {Object} overrides Properties to copy into the new object.
|
||||
*
|
||||
* @return {Object} The new object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var MyType = CryptoJS.lib.Base.extend({
|
||||
* field: 'value',
|
||||
*
|
||||
* method: function () {
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
extend: function(overrides) {
|
||||
// Spawn
|
||||
var subtype = create(this);
|
||||
|
||||
// Augment
|
||||
if (overrides) {
|
||||
subtype.mixIn(overrides);
|
||||
}
|
||||
|
||||
// Create default initializer
|
||||
if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
|
||||
subtype.init = function() {
|
||||
subtype.$super.init.apply(this, arguments);
|
||||
};
|
||||
}
|
||||
|
||||
// Initializer's prototype is the subtype object
|
||||
subtype.init.prototype = subtype;
|
||||
|
||||
// Reference supertype
|
||||
subtype.$super = this;
|
||||
|
||||
return subtype;
|
||||
},
|
||||
|
||||
/**
|
||||
* Extends this object and runs the init method.
|
||||
* Arguments to create() will be passed to init().
|
||||
*
|
||||
* @return {Object} The new object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var instance = MyType.create();
|
||||
*/
|
||||
create: function() {
|
||||
var instance = this.extend();
|
||||
instance.init.apply(instance, arguments);
|
||||
|
||||
return instance;
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes a newly created object.
|
||||
* Override this method to add some logic when your objects are created.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var MyType = CryptoJS.lib.Base.extend({
|
||||
* init: function () {
|
||||
* // ...
|
||||
* }
|
||||
* });
|
||||
*/
|
||||
init: function() {},
|
||||
|
||||
/**
|
||||
* Copies properties into this object.
|
||||
*
|
||||
* @param {Object} properties The properties to mix in.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* MyType.mixIn({
|
||||
* field: 'value'
|
||||
* });
|
||||
*/
|
||||
mixIn: function(properties) {
|
||||
for (var propertyName in properties) {
|
||||
if (properties.hasOwnProperty(propertyName)) {
|
||||
this[propertyName] = properties[propertyName];
|
||||
}
|
||||
}
|
||||
|
||||
// IE won't copy toString using the loop above
|
||||
if (properties.hasOwnProperty('toString')) {
|
||||
this.toString = properties.toString;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a copy of this object.
|
||||
*
|
||||
* @return {Object} The clone.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var clone = instance.clone();
|
||||
*/
|
||||
clone: function() {
|
||||
return this.init.prototype.extend(this);
|
||||
}
|
||||
};
|
||||
}());
|
||||
|
||||
/**
|
||||
* An array of 32-bit words.
|
||||
*
|
||||
* @property {Array} words The array of 32-bit words.
|
||||
* @property {number} sigBytes The number of significant bytes in this word array.
|
||||
*/
|
||||
var WordArray = C_lib.WordArray = Base.extend({
|
||||
/**
|
||||
* Initializes a newly created word array.
|
||||
*
|
||||
* @param {Array} words (Optional) An array of 32-bit words.
|
||||
* @param {number} sigBytes (Optional) The number of significant bytes in the words.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.lib.WordArray.create();
|
||||
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
|
||||
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
|
||||
*/
|
||||
init: function(words, sigBytes) {
|
||||
words = this.words = words || [];
|
||||
|
||||
if (sigBytes != undefined) {
|
||||
this.sigBytes = sigBytes;
|
||||
} else {
|
||||
this.sigBytes = words.length * 4;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts this word array to a string.
|
||||
*
|
||||
* @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
|
||||
*
|
||||
* @return {string} The stringified word array.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var string = wordArray + '';
|
||||
* var string = wordArray.toString();
|
||||
* var string = wordArray.toString(CryptoJS.enc.Utf8);
|
||||
*/
|
||||
toString: function(encoder) {
|
||||
return (encoder || Hex)
|
||||
.stringify(this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Concatenates a word array to this word array.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array to append.
|
||||
*
|
||||
* @return {WordArray} This word array.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* wordArray1.concat(wordArray2);
|
||||
*/
|
||||
concat: function(wordArray) {
|
||||
// Shortcuts
|
||||
var thisWords = this.words;
|
||||
var thatWords = wordArray.words;
|
||||
var thisSigBytes = this.sigBytes;
|
||||
var thatSigBytes = wordArray.sigBytes;
|
||||
|
||||
// Clamp excess bits
|
||||
this.clamp();
|
||||
|
||||
// Concat
|
||||
if (thisSigBytes % 4) {
|
||||
// Copy one byte at a time
|
||||
for (var i = 0; i < thatSigBytes; i++) {
|
||||
var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||||
thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
|
||||
}
|
||||
} else {
|
||||
// Copy one word at a time
|
||||
for (var j = 0; j < thatSigBytes; j += 4) {
|
||||
thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
|
||||
}
|
||||
}
|
||||
this.sigBytes += thatSigBytes;
|
||||
|
||||
// Chainable
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes insignificant bits.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* wordArray.clamp();
|
||||
*/
|
||||
clamp: function() {
|
||||
// Shortcuts
|
||||
var words = this.words;
|
||||
var sigBytes = this.sigBytes;
|
||||
|
||||
// Clamp
|
||||
words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
|
||||
words.length = Math.ceil(sigBytes / 4);
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a copy of this word array.
|
||||
*
|
||||
* @return {WordArray} The clone.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var clone = wordArray.clone();
|
||||
*/
|
||||
clone: function() {
|
||||
var clone = Base.clone.call(this);
|
||||
clone.words = this.words.slice(0);
|
||||
|
||||
return clone;
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a word array filled with random bytes.
|
||||
*
|
||||
* @param {number} nBytes The number of random bytes to generate.
|
||||
*
|
||||
* @return {WordArray} The random word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.lib.WordArray.random(16);
|
||||
*/
|
||||
random: function(nBytes) {
|
||||
var words = [];
|
||||
|
||||
for (var i = 0; i < nBytes; i += 4) {
|
||||
words.push(cryptoSecureRandomInt());
|
||||
}
|
||||
|
||||
return new WordArray.init(words, nBytes);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Encoder namespace.
|
||||
*/
|
||||
var C_enc = C.enc = {};
|
||||
|
||||
/**
|
||||
* Hex encoding strategy.
|
||||
*/
|
||||
var Hex = C_enc.Hex = {
|
||||
/**
|
||||
* Converts a word array to a hex string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @return {string} The hex string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hexString = CryptoJS.enc.Hex.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray) {
|
||||
// Shortcuts
|
||||
var words = wordArray.words;
|
||||
var sigBytes = wordArray.sigBytes;
|
||||
|
||||
// Convert
|
||||
var hexChars = [];
|
||||
for (var i = 0; i < sigBytes; i++) {
|
||||
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||||
hexChars.push((bite >>> 4)
|
||||
.toString(16));
|
||||
hexChars.push((bite & 0x0f)
|
||||
.toString(16));
|
||||
}
|
||||
|
||||
return hexChars.join('');
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a hex string to a word array.
|
||||
*
|
||||
* @param {string} hexStr The hex string.
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Hex.parse(hexString);
|
||||
*/
|
||||
parse: function(hexStr) {
|
||||
// Shortcut
|
||||
var hexStrLength = hexStr.length;
|
||||
|
||||
// Convert
|
||||
var words = [];
|
||||
for (var i = 0; i < hexStrLength; i += 2) {
|
||||
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
|
||||
}
|
||||
|
||||
return new WordArray.init(words, hexStrLength / 2);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Latin1 encoding strategy.
|
||||
*/
|
||||
var Latin1 = C_enc.Latin1 = {
|
||||
/**
|
||||
* Converts a word array to a Latin1 string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @return {string} The Latin1 string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray) {
|
||||
// Shortcuts
|
||||
var words = wordArray.words;
|
||||
var sigBytes = wordArray.sigBytes;
|
||||
|
||||
// Convert
|
||||
var latin1Chars = [];
|
||||
for (var i = 0; i < sigBytes; i++) {
|
||||
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||||
latin1Chars.push(String.fromCharCode(bite));
|
||||
}
|
||||
|
||||
return latin1Chars.join('');
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a Latin1 string to a word array.
|
||||
*
|
||||
* @param {string} latin1Str The Latin1 string.
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
|
||||
*/
|
||||
parse: function(latin1Str) {
|
||||
// Shortcut
|
||||
var latin1StrLength = latin1Str.length;
|
||||
|
||||
// Convert
|
||||
var words = [];
|
||||
for (var i = 0; i < latin1StrLength; i++) {
|
||||
words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
|
||||
}
|
||||
|
||||
return new WordArray.init(words, latin1StrLength);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* UTF-8 encoding strategy.
|
||||
*/
|
||||
var Utf8 = C_enc.Utf8 = {
|
||||
/**
|
||||
* Converts a word array to a UTF-8 string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @return {string} The UTF-8 string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray) {
|
||||
try {
|
||||
return decodeURIComponent(escape(Latin1.stringify(wordArray)));
|
||||
} catch (e) {
|
||||
throw new Error('Malformed UTF-8 data');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a UTF-8 string to a word array.
|
||||
*
|
||||
* @param {string} utf8Str The UTF-8 string.
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
|
||||
*/
|
||||
parse: function(utf8Str) {
|
||||
return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstract buffered block algorithm template.
|
||||
*
|
||||
* The property blockSize must be implemented in a concrete subtype.
|
||||
*
|
||||
* @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
|
||||
*/
|
||||
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
|
||||
/**
|
||||
* Resets this block algorithm's data buffer to its initial state.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* bufferedBlockAlgorithm.reset();
|
||||
*/
|
||||
reset: function() {
|
||||
// Initial values
|
||||
this._data = new WordArray.init();
|
||||
this._nDataBytes = 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds new data to this block algorithm's buffer.
|
||||
*
|
||||
* @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* bufferedBlockAlgorithm._append('data');
|
||||
* bufferedBlockAlgorithm._append(wordArray);
|
||||
*/
|
||||
_append: function(data) {
|
||||
// Convert string to WordArray, else assume WordArray already
|
||||
if (typeof data == 'string') {
|
||||
data = Utf8.parse(data);
|
||||
}
|
||||
|
||||
// Append
|
||||
this._data.concat(data);
|
||||
this._nDataBytes += data.sigBytes;
|
||||
},
|
||||
|
||||
/**
|
||||
* Processes available data blocks.
|
||||
*
|
||||
* This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
|
||||
*
|
||||
* @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
|
||||
*
|
||||
* @return {WordArray} The processed data.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var processedData = bufferedBlockAlgorithm._process();
|
||||
* var processedData = bufferedBlockAlgorithm._process(!!'flush');
|
||||
*/
|
||||
_process: function(doFlush) {
|
||||
var processedWords;
|
||||
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
var dataSigBytes = data.sigBytes;
|
||||
var blockSize = this.blockSize;
|
||||
var blockSizeBytes = blockSize * 4;
|
||||
|
||||
// Count blocks ready
|
||||
var nBlocksReady = dataSigBytes / blockSizeBytes;
|
||||
if (doFlush) {
|
||||
// Round up to include partial blocks
|
||||
nBlocksReady = Math.ceil(nBlocksReady);
|
||||
} else {
|
||||
// Round down to include only full blocks,
|
||||
// less the number of blocks that must remain in the buffer
|
||||
nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
|
||||
}
|
||||
|
||||
// Count words ready
|
||||
var nWordsReady = nBlocksReady * blockSize;
|
||||
|
||||
// Count bytes ready
|
||||
var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
|
||||
|
||||
// Process blocks
|
||||
if (nWordsReady) {
|
||||
for (var offset = 0; offset < nWordsReady; offset += blockSize) {
|
||||
// Perform concrete-algorithm logic
|
||||
this._doProcessBlock(dataWords, offset);
|
||||
}
|
||||
|
||||
// Remove processed words
|
||||
processedWords = dataWords.splice(0, nWordsReady);
|
||||
data.sigBytes -= nBytesReady;
|
||||
}
|
||||
|
||||
// Return processed words
|
||||
return new WordArray.init(processedWords, nBytesReady);
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a copy of this object.
|
||||
*
|
||||
* @return {Object} The clone.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var clone = bufferedBlockAlgorithm.clone();
|
||||
*/
|
||||
clone: function() {
|
||||
var clone = Base.clone.call(this);
|
||||
clone._data = this._data.clone();
|
||||
|
||||
return clone;
|
||||
},
|
||||
|
||||
_minBufferSize: 0
|
||||
});
|
||||
|
||||
/**
|
||||
* Abstract hasher template.
|
||||
*
|
||||
* @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
|
||||
*/
|
||||
var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*/
|
||||
cfg: Base.extend(),
|
||||
|
||||
/**
|
||||
* Initializes a newly created hasher.
|
||||
*
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this hash computation.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hasher = CryptoJS.algo.SHA256.create();
|
||||
*/
|
||||
init: function(cfg) {
|
||||
// Apply config defaults
|
||||
this.cfg = this.cfg.extend(cfg);
|
||||
|
||||
// Set initial values
|
||||
this.reset();
|
||||
},
|
||||
|
||||
/**
|
||||
* Resets this hasher to its initial state.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* hasher.reset();
|
||||
*/
|
||||
reset: function() {
|
||||
// Reset data buffer
|
||||
BufferedBlockAlgorithm.reset.call(this);
|
||||
|
||||
// Perform concrete-hasher logic
|
||||
this._doReset();
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates this hasher with a message.
|
||||
*
|
||||
* @param {WordArray|string} messageUpdate The message to append.
|
||||
*
|
||||
* @return {Hasher} This hasher.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* hasher.update('message');
|
||||
* hasher.update(wordArray);
|
||||
*/
|
||||
update: function(messageUpdate) {
|
||||
// Append
|
||||
this._append(messageUpdate);
|
||||
|
||||
// Update the hash
|
||||
this._process();
|
||||
|
||||
// Chainable
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Finalizes the hash computation.
|
||||
* Note that the finalize operation is effectively a destructive, read-once operation.
|
||||
*
|
||||
* @param {WordArray|string} messageUpdate (Optional) A final message update.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = hasher.finalize();
|
||||
* var hash = hasher.finalize('message');
|
||||
* var hash = hasher.finalize(wordArray);
|
||||
*/
|
||||
finalize: function(messageUpdate) {
|
||||
// Final message update
|
||||
if (messageUpdate) {
|
||||
this._append(messageUpdate);
|
||||
}
|
||||
|
||||
// Perform concrete-hasher logic
|
||||
var hash = this._doFinalize();
|
||||
|
||||
return hash;
|
||||
},
|
||||
|
||||
blockSize: 512 / 32,
|
||||
|
||||
/**
|
||||
* Creates a shortcut function to a hasher's object interface.
|
||||
*
|
||||
* @param {Hasher} hasher The hasher to create a helper for.
|
||||
*
|
||||
* @return {Function} The shortcut function.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
|
||||
*/
|
||||
_createHelper: function(hasher) {
|
||||
return function(message, cfg) {
|
||||
return new hasher.init(cfg)
|
||||
.finalize(message);
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {Hasher} hasher The hasher to use in this HMAC helper.
|
||||
*
|
||||
* @return {Function} The shortcut function.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
|
||||
*/
|
||||
_createHmacHelper: function(hasher) {
|
||||
return function(message, key) {
|
||||
return new C_algo.HMAC.init(hasher, key)
|
||||
.finalize(message);
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Algorithm namespace.
|
||||
*/
|
||||
var C_algo = C.algo = {};
|
||||
|
||||
return C;
|
||||
}(Math));
|
||||
|
||||
|
||||
(function(undefined) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var Base = C_lib.Base;
|
||||
var X32WordArray = C_lib.WordArray;
|
||||
|
||||
/**
|
||||
* x64 namespace.
|
||||
*/
|
||||
var C_x64 = C.x64 = {};
|
||||
|
||||
/**
|
||||
* A 64-bit word.
|
||||
*/
|
||||
var X64Word = C_x64.Word = Base.extend({
|
||||
/**
|
||||
* Initializes a newly created 64-bit word.
|
||||
*
|
||||
* @param {number} high The high 32 bits.
|
||||
* @param {number} low The low 32 bits.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
|
||||
*/
|
||||
init: function(high, low) {
|
||||
this.high = high;
|
||||
this.low = low;
|
||||
}
|
||||
|
||||
/**
|
||||
* Bitwise NOTs this word.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after negating.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var negated = x64Word.not();
|
||||
*/
|
||||
// not: function () {
|
||||
// var high = ~this.high;
|
||||
// var low = ~this.low;
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// },
|
||||
|
||||
/**
|
||||
* Bitwise ANDs this word with the passed word.
|
||||
*
|
||||
* @param {X64Word} word The x64-Word to AND with this word.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after ANDing.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var anded = x64Word.and(anotherX64Word);
|
||||
*/
|
||||
// and: function (word) {
|
||||
// var high = this.high & word.high;
|
||||
// var low = this.low & word.low;
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// },
|
||||
|
||||
/**
|
||||
* Bitwise ORs this word with the passed word.
|
||||
*
|
||||
* @param {X64Word} word The x64-Word to OR with this word.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after ORing.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ored = x64Word.or(anotherX64Word);
|
||||
*/
|
||||
// or: function (word) {
|
||||
// var high = this.high | word.high;
|
||||
// var low = this.low | word.low;
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// },
|
||||
|
||||
/**
|
||||
* Bitwise XORs this word with the passed word.
|
||||
*
|
||||
* @param {X64Word} word The x64-Word to XOR with this word.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after XORing.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var xored = x64Word.xor(anotherX64Word);
|
||||
*/
|
||||
// xor: function (word) {
|
||||
// var high = this.high ^ word.high;
|
||||
// var low = this.low ^ word.low;
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// },
|
||||
|
||||
/**
|
||||
* Shifts this word n bits to the left.
|
||||
*
|
||||
* @param {number} n The number of bits to shift.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after shifting.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var shifted = x64Word.shiftL(25);
|
||||
*/
|
||||
// shiftL: function (n) {
|
||||
// if (n < 32) {
|
||||
// var high = (this.high << n) | (this.low >>> (32 - n));
|
||||
// var low = this.low << n;
|
||||
// } else {
|
||||
// var high = this.low << (n - 32);
|
||||
// var low = 0;
|
||||
// }
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// },
|
||||
|
||||
/**
|
||||
* Shifts this word n bits to the right.
|
||||
*
|
||||
* @param {number} n The number of bits to shift.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after shifting.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var shifted = x64Word.shiftR(7);
|
||||
*/
|
||||
// shiftR: function (n) {
|
||||
// if (n < 32) {
|
||||
// var low = (this.low >>> n) | (this.high << (32 - n));
|
||||
// var high = this.high >>> n;
|
||||
// } else {
|
||||
// var low = this.high >>> (n - 32);
|
||||
// var high = 0;
|
||||
// }
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// },
|
||||
|
||||
/**
|
||||
* Rotates this word n bits to the left.
|
||||
*
|
||||
* @param {number} n The number of bits to rotate.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after rotating.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var rotated = x64Word.rotL(25);
|
||||
*/
|
||||
// rotL: function (n) {
|
||||
// return this.shiftL(n).or(this.shiftR(64 - n));
|
||||
// },
|
||||
|
||||
/**
|
||||
* Rotates this word n bits to the right.
|
||||
*
|
||||
* @param {number} n The number of bits to rotate.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after rotating.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var rotated = x64Word.rotR(7);
|
||||
*/
|
||||
// rotR: function (n) {
|
||||
// return this.shiftR(n).or(this.shiftL(64 - n));
|
||||
// },
|
||||
|
||||
/**
|
||||
* Adds this word with the passed word.
|
||||
*
|
||||
* @param {X64Word} word The x64-Word to add with this word.
|
||||
*
|
||||
* @return {X64Word} A new x64-Word object after adding.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var added = x64Word.add(anotherX64Word);
|
||||
*/
|
||||
// add: function (word) {
|
||||
// var low = (this.low + word.low) | 0;
|
||||
// var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
|
||||
// var high = (this.high + word.high + carry) | 0;
|
||||
|
||||
// return X64Word.create(high, low);
|
||||
// }
|
||||
});
|
||||
|
||||
/**
|
||||
* An array of 64-bit words.
|
||||
*
|
||||
* @property {Array} words The array of CryptoJS.x64.Word objects.
|
||||
* @property {number} sigBytes The number of significant bytes in this word array.
|
||||
*/
|
||||
var X64WordArray = C_x64.WordArray = Base.extend({
|
||||
/**
|
||||
* Initializes a newly created word array.
|
||||
*
|
||||
* @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
|
||||
* @param {number} sigBytes (Optional) The number of significant bytes in the words.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.x64.WordArray.create();
|
||||
*
|
||||
* var wordArray = CryptoJS.x64.WordArray.create([
|
||||
* CryptoJS.x64.Word.create(0x00010203, 0x04050607),
|
||||
* CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
|
||||
* ]);
|
||||
*
|
||||
* var wordArray = CryptoJS.x64.WordArray.create([
|
||||
* CryptoJS.x64.Word.create(0x00010203, 0x04050607),
|
||||
* CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
|
||||
* ], 10);
|
||||
*/
|
||||
init: function(words, sigBytes) {
|
||||
words = this.words = words || [];
|
||||
|
||||
if (sigBytes != undefined) {
|
||||
this.sigBytes = sigBytes;
|
||||
} else {
|
||||
this.sigBytes = words.length * 8;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts this 64-bit word array to a 32-bit word array.
|
||||
*
|
||||
* @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var x32WordArray = x64WordArray.toX32();
|
||||
*/
|
||||
toX32: function() {
|
||||
// Shortcuts
|
||||
var x64Words = this.words;
|
||||
var x64WordsLength = x64Words.length;
|
||||
|
||||
// Convert
|
||||
var x32Words = [];
|
||||
for (var i = 0; i < x64WordsLength; i++) {
|
||||
var x64Word = x64Words[i];
|
||||
x32Words.push(x64Word.high);
|
||||
x32Words.push(x64Word.low);
|
||||
}
|
||||
|
||||
return X32WordArray.create(x32Words, this.sigBytes);
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a copy of this word array.
|
||||
*
|
||||
* @return {X64WordArray} The clone.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var clone = x64WordArray.clone();
|
||||
*/
|
||||
clone: function() {
|
||||
var clone = Base.clone.call(this);
|
||||
|
||||
// Clone "words" array
|
||||
var words = clone.words = this.words.slice(0);
|
||||
|
||||
// Clone each X64Word object
|
||||
var wordsLength = words.length;
|
||||
for (var i = 0; i < wordsLength; i++) {
|
||||
words[i] = words[i].clone();
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Check if typed arrays are supported
|
||||
if (typeof ArrayBuffer != 'function') {
|
||||
return;
|
||||
}
|
||||
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
|
||||
// Reference original init
|
||||
var superInit = WordArray.init;
|
||||
|
||||
// Augment WordArray.init to handle typed arrays
|
||||
var subInit = WordArray.init = function(typedArray) {
|
||||
// Convert buffers to uint8
|
||||
if (typedArray instanceof ArrayBuffer) {
|
||||
typedArray = new Uint8Array(typedArray);
|
||||
}
|
||||
|
||||
// Convert other array views to uint8
|
||||
if (
|
||||
typedArray instanceof Int8Array || (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || typedArray instanceof Int16Array || typedArray instanceof Uint16Array || typedArray instanceof Int32Array || typedArray instanceof Uint32Array || typedArray instanceof Float32Array || typedArray instanceof Float64Array) {
|
||||
typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
|
||||
}
|
||||
|
||||
// Handle Uint8Array
|
||||
if (typedArray instanceof Uint8Array) {
|
||||
// Shortcut
|
||||
var typedArrayByteLength = typedArray.byteLength;
|
||||
|
||||
// Extract bytes
|
||||
var words = [];
|
||||
for (var i = 0; i < typedArrayByteLength; i++) {
|
||||
words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
|
||||
}
|
||||
|
||||
// Initialize this word array
|
||||
superInit.call(this, words, typedArrayByteLength);
|
||||
} else {
|
||||
// Else call normal init
|
||||
superInit.apply(this, arguments);
|
||||
}
|
||||
};
|
||||
|
||||
subInit.prototype = WordArray;
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var C_enc = C.enc;
|
||||
|
||||
/**
|
||||
* UTF-16 BE encoding strategy.
|
||||
*/
|
||||
var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
|
||||
/**
|
||||
* Converts a word array to a UTF-16 BE string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @return {string} The UTF-16 BE string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray) {
|
||||
// Shortcuts
|
||||
var words = wordArray.words;
|
||||
var sigBytes = wordArray.sigBytes;
|
||||
|
||||
// Convert
|
||||
var utf16Chars = [];
|
||||
for (var i = 0; i < sigBytes; i += 2) {
|
||||
var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
|
||||
utf16Chars.push(String.fromCharCode(codePoint));
|
||||
}
|
||||
|
||||
return utf16Chars.join('');
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a UTF-16 BE string to a word array.
|
||||
*
|
||||
* @param {string} utf16Str The UTF-16 BE string.
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
|
||||
*/
|
||||
parse: function(utf16Str) {
|
||||
// Shortcut
|
||||
var utf16StrLength = utf16Str.length;
|
||||
|
||||
// Convert
|
||||
var words = [];
|
||||
for (var i = 0; i < utf16StrLength; i++) {
|
||||
words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
|
||||
}
|
||||
|
||||
return WordArray.create(words, utf16StrLength * 2);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* UTF-16 LE encoding strategy.
|
||||
*/
|
||||
C_enc.Utf16LE = {
|
||||
/**
|
||||
* Converts a word array to a UTF-16 LE string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @return {string} The UTF-16 LE string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray) {
|
||||
// Shortcuts
|
||||
var words = wordArray.words;
|
||||
var sigBytes = wordArray.sigBytes;
|
||||
|
||||
// Convert
|
||||
var utf16Chars = [];
|
||||
for (var i = 0; i < sigBytes; i += 2) {
|
||||
var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
|
||||
utf16Chars.push(String.fromCharCode(codePoint));
|
||||
}
|
||||
|
||||
return utf16Chars.join('');
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a UTF-16 LE string to a word array.
|
||||
*
|
||||
* @param {string} utf16Str The UTF-16 LE string.
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
|
||||
*/
|
||||
parse: function(utf16Str) {
|
||||
// Shortcut
|
||||
var utf16StrLength = utf16Str.length;
|
||||
|
||||
// Convert
|
||||
var words = [];
|
||||
for (var i = 0; i < utf16StrLength; i++) {
|
||||
words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
|
||||
}
|
||||
|
||||
return WordArray.create(words, utf16StrLength * 2);
|
||||
}
|
||||
};
|
||||
|
||||
function swapEndian(word) {
|
||||
return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
|
||||
}
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var C_enc = C.enc;
|
||||
|
||||
/**
|
||||
* Base64 encoding strategy.
|
||||
*/
|
||||
var Base64 = C_enc.Base64 = {
|
||||
/**
|
||||
* Converts a word array to a Base64 string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @return {string} The Base64 string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var base64String = CryptoJS.enc.Base64.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray) {
|
||||
// Shortcuts
|
||||
var words = wordArray.words;
|
||||
var sigBytes = wordArray.sigBytes;
|
||||
var map = this._map;
|
||||
|
||||
// Clamp excess bits
|
||||
wordArray.clamp();
|
||||
|
||||
// Convert
|
||||
var base64Chars = [];
|
||||
for (var i = 0; i < sigBytes; i += 3) {
|
||||
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||||
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
|
||||
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
|
||||
|
||||
var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
|
||||
|
||||
for (var j = 0;
|
||||
(j < 4) && (i + j * 0.75 < sigBytes); j++) {
|
||||
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
|
||||
}
|
||||
}
|
||||
|
||||
// Add padding
|
||||
var paddingChar = map.charAt(64);
|
||||
if (paddingChar) {
|
||||
while (base64Chars.length % 4) {
|
||||
base64Chars.push(paddingChar);
|
||||
}
|
||||
}
|
||||
|
||||
return base64Chars.join('');
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a Base64 string to a word array.
|
||||
*
|
||||
* @param {string} base64Str The Base64 string.
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Base64.parse(base64String);
|
||||
*/
|
||||
parse: function(base64Str) {
|
||||
// Shortcuts
|
||||
var base64StrLength = base64Str.length;
|
||||
var map = this._map;
|
||||
var reverseMap = this._reverseMap;
|
||||
|
||||
if (!reverseMap) {
|
||||
reverseMap = this._reverseMap = [];
|
||||
for (var j = 0; j < map.length; j++) {
|
||||
reverseMap[map.charCodeAt(j)] = j;
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore padding
|
||||
var paddingChar = map.charAt(64);
|
||||
if (paddingChar) {
|
||||
var paddingIndex = base64Str.indexOf(paddingChar);
|
||||
if (paddingIndex !== -1) {
|
||||
base64StrLength = paddingIndex;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert
|
||||
return parseLoop(base64Str, base64StrLength, reverseMap);
|
||||
|
||||
},
|
||||
|
||||
_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
|
||||
};
|
||||
|
||||
function parseLoop(base64Str, base64StrLength, reverseMap) {
|
||||
var words = [];
|
||||
var nBytes = 0;
|
||||
for (var i = 0; i < base64StrLength; i++) {
|
||||
if (i % 4) {
|
||||
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
|
||||
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
|
||||
var bitsCombined = bits1 | bits2;
|
||||
words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
|
||||
nBytes++;
|
||||
}
|
||||
}
|
||||
return WordArray.create(words, nBytes);
|
||||
}
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var C_enc = C.enc;
|
||||
|
||||
/**
|
||||
* Base64url encoding strategy.
|
||||
*/
|
||||
var Base64url = C_enc.Base64url = {
|
||||
/**
|
||||
* Converts a word array to a Base64url string.
|
||||
*
|
||||
* @param {WordArray} wordArray The word array.
|
||||
*
|
||||
* @param {boolean} urlSafe Whether to use url safe
|
||||
*
|
||||
* @return {string} The Base64url string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
|
||||
*/
|
||||
stringify: function(wordArray, urlSafe = true) {
|
||||
// Shortcuts
|
||||
var words = wordArray.words;
|
||||
var sigBytes = wordArray.sigBytes;
|
||||
var map = urlSafe ? this._safe_map : this._map;
|
||||
|
||||
// Clamp excess bits
|
||||
wordArray.clamp();
|
||||
|
||||
// Convert
|
||||
var base64Chars = [];
|
||||
for (var i = 0; i < sigBytes; i += 3) {
|
||||
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||||
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
|
||||
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
|
||||
|
||||
var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
|
||||
|
||||
for (var j = 0;
|
||||
(j < 4) && (i + j * 0.75 < sigBytes); j++) {
|
||||
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
|
||||
}
|
||||
}
|
||||
|
||||
// Add padding
|
||||
var paddingChar = map.charAt(64);
|
||||
if (paddingChar) {
|
||||
while (base64Chars.length % 4) {
|
||||
base64Chars.push(paddingChar);
|
||||
}
|
||||
}
|
||||
|
||||
return base64Chars.join('');
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a Base64url string to a word array.
|
||||
*
|
||||
* @param {string} base64Str The Base64url string.
|
||||
*
|
||||
* @param {boolean} urlSafe Whether to use url safe
|
||||
*
|
||||
* @return {WordArray} The word array.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var wordArray = CryptoJS.enc.Base64url.parse(base64String);
|
||||
*/
|
||||
parse: function(base64Str, urlSafe = true) {
|
||||
// Shortcuts
|
||||
var base64StrLength = base64Str.length;
|
||||
var map = urlSafe ? this._safe_map : this._map;
|
||||
var reverseMap = this._reverseMap;
|
||||
|
||||
if (!reverseMap) {
|
||||
reverseMap = this._reverseMap = [];
|
||||
for (var j = 0; j < map.length; j++) {
|
||||
reverseMap[map.charCodeAt(j)] = j;
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore padding
|
||||
var paddingChar = map.charAt(64);
|
||||
if (paddingChar) {
|
||||
var paddingIndex = base64Str.indexOf(paddingChar);
|
||||
if (paddingIndex !== -1) {
|
||||
base64StrLength = paddingIndex;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert
|
||||
return parseLoop(base64Str, base64StrLength, reverseMap);
|
||||
|
||||
},
|
||||
|
||||
_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
|
||||
_safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
|
||||
};
|
||||
|
||||
function parseLoop(base64Str, base64StrLength, reverseMap) {
|
||||
var words = [];
|
||||
var nBytes = 0;
|
||||
for (var i = 0; i < base64StrLength; i++) {
|
||||
if (i % 4) {
|
||||
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
|
||||
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
|
||||
var bitsCombined = bits1 | bits2;
|
||||
words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
|
||||
nBytes++;
|
||||
}
|
||||
}
|
||||
return WordArray.create(words, nBytes);
|
||||
}
|
||||
}());
|
||||
|
||||
(function(Math) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var Hasher = C_lib.Hasher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Constants table
|
||||
var T = [];
|
||||
|
||||
// Compute constants
|
||||
(function() {
|
||||
for (var i = 0; i < 64; i++) {
|
||||
T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
|
||||
}
|
||||
}());
|
||||
|
||||
/**
|
||||
* MD5 hash algorithm.
|
||||
*/
|
||||
var MD5 = C_algo.MD5 = Hasher.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new WordArray.init([
|
||||
0x67452301, 0xefcdab89,
|
||||
0x98badcfe, 0x10325476]);
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Swap endian
|
||||
for (var i = 0; i < 16; i++) {
|
||||
// Shortcuts
|
||||
var offset_i = offset + i;
|
||||
var M_offset_i = M[offset_i];
|
||||
|
||||
M[offset_i] = (
|
||||
(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00));
|
||||
}
|
||||
|
||||
// Shortcuts
|
||||
var H = this._hash.words;
|
||||
|
||||
var M_offset_0 = M[offset + 0];
|
||||
var M_offset_1 = M[offset + 1];
|
||||
var M_offset_2 = M[offset + 2];
|
||||
var M_offset_3 = M[offset + 3];
|
||||
var M_offset_4 = M[offset + 4];
|
||||
var M_offset_5 = M[offset + 5];
|
||||
var M_offset_6 = M[offset + 6];
|
||||
var M_offset_7 = M[offset + 7];
|
||||
var M_offset_8 = M[offset + 8];
|
||||
var M_offset_9 = M[offset + 9];
|
||||
var M_offset_10 = M[offset + 10];
|
||||
var M_offset_11 = M[offset + 11];
|
||||
var M_offset_12 = M[offset + 12];
|
||||
var M_offset_13 = M[offset + 13];
|
||||
var M_offset_14 = M[offset + 14];
|
||||
var M_offset_15 = M[offset + 15];
|
||||
|
||||
// Working varialbes
|
||||
var a = H[0];
|
||||
var b = H[1];
|
||||
var c = H[2];
|
||||
var d = H[3];
|
||||
|
||||
// Computation
|
||||
a = FF(a, b, c, d, M_offset_0, 7, T[0]);
|
||||
d = FF(d, a, b, c, M_offset_1, 12, T[1]);
|
||||
c = FF(c, d, a, b, M_offset_2, 17, T[2]);
|
||||
b = FF(b, c, d, a, M_offset_3, 22, T[3]);
|
||||
a = FF(a, b, c, d, M_offset_4, 7, T[4]);
|
||||
d = FF(d, a, b, c, M_offset_5, 12, T[5]);
|
||||
c = FF(c, d, a, b, M_offset_6, 17, T[6]);
|
||||
b = FF(b, c, d, a, M_offset_7, 22, T[7]);
|
||||
a = FF(a, b, c, d, M_offset_8, 7, T[8]);
|
||||
d = FF(d, a, b, c, M_offset_9, 12, T[9]);
|
||||
c = FF(c, d, a, b, M_offset_10, 17, T[10]);
|
||||
b = FF(b, c, d, a, M_offset_11, 22, T[11]);
|
||||
a = FF(a, b, c, d, M_offset_12, 7, T[12]);
|
||||
d = FF(d, a, b, c, M_offset_13, 12, T[13]);
|
||||
c = FF(c, d, a, b, M_offset_14, 17, T[14]);
|
||||
b = FF(b, c, d, a, M_offset_15, 22, T[15]);
|
||||
|
||||
a = GG(a, b, c, d, M_offset_1, 5, T[16]);
|
||||
d = GG(d, a, b, c, M_offset_6, 9, T[17]);
|
||||
c = GG(c, d, a, b, M_offset_11, 14, T[18]);
|
||||
b = GG(b, c, d, a, M_offset_0, 20, T[19]);
|
||||
a = GG(a, b, c, d, M_offset_5, 5, T[20]);
|
||||
d = GG(d, a, b, c, M_offset_10, 9, T[21]);
|
||||
c = GG(c, d, a, b, M_offset_15, 14, T[22]);
|
||||
b = GG(b, c, d, a, M_offset_4, 20, T[23]);
|
||||
a = GG(a, b, c, d, M_offset_9, 5, T[24]);
|
||||
d = GG(d, a, b, c, M_offset_14, 9, T[25]);
|
||||
c = GG(c, d, a, b, M_offset_3, 14, T[26]);
|
||||
b = GG(b, c, d, a, M_offset_8, 20, T[27]);
|
||||
a = GG(a, b, c, d, M_offset_13, 5, T[28]);
|
||||
d = GG(d, a, b, c, M_offset_2, 9, T[29]);
|
||||
c = GG(c, d, a, b, M_offset_7, 14, T[30]);
|
||||
b = GG(b, c, d, a, M_offset_12, 20, T[31]);
|
||||
|
||||
a = HH(a, b, c, d, M_offset_5, 4, T[32]);
|
||||
d = HH(d, a, b, c, M_offset_8, 11, T[33]);
|
||||
c = HH(c, d, a, b, M_offset_11, 16, T[34]);
|
||||
b = HH(b, c, d, a, M_offset_14, 23, T[35]);
|
||||
a = HH(a, b, c, d, M_offset_1, 4, T[36]);
|
||||
d = HH(d, a, b, c, M_offset_4, 11, T[37]);
|
||||
c = HH(c, d, a, b, M_offset_7, 16, T[38]);
|
||||
b = HH(b, c, d, a, M_offset_10, 23, T[39]);
|
||||
a = HH(a, b, c, d, M_offset_13, 4, T[40]);
|
||||
d = HH(d, a, b, c, M_offset_0, 11, T[41]);
|
||||
c = HH(c, d, a, b, M_offset_3, 16, T[42]);
|
||||
b = HH(b, c, d, a, M_offset_6, 23, T[43]);
|
||||
a = HH(a, b, c, d, M_offset_9, 4, T[44]);
|
||||
d = HH(d, a, b, c, M_offset_12, 11, T[45]);
|
||||
c = HH(c, d, a, b, M_offset_15, 16, T[46]);
|
||||
b = HH(b, c, d, a, M_offset_2, 23, T[47]);
|
||||
|
||||
a = II(a, b, c, d, M_offset_0, 6, T[48]);
|
||||
d = II(d, a, b, c, M_offset_7, 10, T[49]);
|
||||
c = II(c, d, a, b, M_offset_14, 15, T[50]);
|
||||
b = II(b, c, d, a, M_offset_5, 21, T[51]);
|
||||
a = II(a, b, c, d, M_offset_12, 6, T[52]);
|
||||
d = II(d, a, b, c, M_offset_3, 10, T[53]);
|
||||
c = II(c, d, a, b, M_offset_10, 15, T[54]);
|
||||
b = II(b, c, d, a, M_offset_1, 21, T[55]);
|
||||
a = II(a, b, c, d, M_offset_8, 6, T[56]);
|
||||
d = II(d, a, b, c, M_offset_15, 10, T[57]);
|
||||
c = II(c, d, a, b, M_offset_6, 15, T[58]);
|
||||
b = II(b, c, d, a, M_offset_13, 21, T[59]);
|
||||
a = II(a, b, c, d, M_offset_4, 6, T[60]);
|
||||
d = II(d, a, b, c, M_offset_11, 10, T[61]);
|
||||
c = II(c, d, a, b, M_offset_2, 15, T[62]);
|
||||
b = II(b, c, d, a, M_offset_9, 21, T[63]);
|
||||
|
||||
// Intermediate hash value
|
||||
H[0] = (H[0] + a) | 0;
|
||||
H[1] = (H[1] + b) | 0;
|
||||
H[2] = (H[2] + c) | 0;
|
||||
H[3] = (H[3] + d) | 0;
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
|
||||
var nBitsTotal = this._nDataBytes * 8;
|
||||
var nBitsLeft = data.sigBytes * 8;
|
||||
|
||||
// Add padding
|
||||
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
||||
|
||||
var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
|
||||
var nBitsTotalL = nBitsTotal;
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
|
||||
(((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00));
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
|
||||
(((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00));
|
||||
|
||||
data.sigBytes = (dataWords.length + 1) * 4;
|
||||
|
||||
// Hash final blocks
|
||||
this._process();
|
||||
|
||||
// Shortcuts
|
||||
var hash = this._hash;
|
||||
var H = hash.words;
|
||||
|
||||
// Swap endian
|
||||
for (var i = 0; i < 4; i++) {
|
||||
// Shortcut
|
||||
var H_i = H[i];
|
||||
|
||||
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
|
||||
}
|
||||
|
||||
// Return final computed hash
|
||||
return hash;
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
var clone = Hasher.clone.call(this);
|
||||
clone._hash = this._hash.clone();
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
|
||||
function FF(a, b, c, d, x, s, t) {
|
||||
var n = a + ((b & c) | (~b & d)) + x + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
}
|
||||
|
||||
function GG(a, b, c, d, x, s, t) {
|
||||
var n = a + ((b & d) | (c & ~d)) + x + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
}
|
||||
|
||||
function HH(a, b, c, d, x, s, t) {
|
||||
var n = a + (b ^ c ^ d) + x + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
}
|
||||
|
||||
function II(a, b, c, d, x, s, t) {
|
||||
var n = a + (c ^ (b | ~d)) + x + t;
|
||||
return ((n << s) | (n >>> (32 - s))) + b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.MD5('message');
|
||||
* var hash = CryptoJS.MD5(wordArray);
|
||||
*/
|
||||
C.MD5 = Hasher._createHelper(MD5);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacMD5(message, key);
|
||||
*/
|
||||
C.HmacMD5 = Hasher._createHmacHelper(MD5);
|
||||
}(Math));
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var Hasher = C_lib.Hasher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Reusable object
|
||||
var W = [];
|
||||
|
||||
/**
|
||||
* SHA-1 hash algorithm.
|
||||
*/
|
||||
var SHA1 = C_algo.SHA1 = Hasher.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new WordArray.init([
|
||||
0x67452301, 0xefcdab89,
|
||||
0x98badcfe, 0x10325476,
|
||||
0xc3d2e1f0]);
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Shortcut
|
||||
var H = this._hash.words;
|
||||
|
||||
// Working variables
|
||||
var a = H[0];
|
||||
var b = H[1];
|
||||
var c = H[2];
|
||||
var d = H[3];
|
||||
var e = H[4];
|
||||
|
||||
// Computation
|
||||
for (var i = 0; i < 80; i++) {
|
||||
if (i < 16) {
|
||||
W[i] = M[offset + i] | 0;
|
||||
} else {
|
||||
var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
|
||||
W[i] = (n << 1) | (n >>> 31);
|
||||
}
|
||||
|
||||
var t = ((a << 5) | (a >>> 27)) + e + W[i];
|
||||
if (i < 20) {
|
||||
t += ((b & c) | (~b & d)) + 0x5a827999;
|
||||
} else if (i < 40) {
|
||||
t += (b ^ c ^ d) + 0x6ed9eba1;
|
||||
} else if (i < 60) {
|
||||
t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
|
||||
} else /* if (i < 80) */ {
|
||||
t += (b ^ c ^ d) - 0x359d3e2a;
|
||||
}
|
||||
|
||||
e = d;
|
||||
d = c;
|
||||
c = (b << 30) | (b >>> 2);
|
||||
b = a;
|
||||
a = t;
|
||||
}
|
||||
|
||||
// Intermediate hash value
|
||||
H[0] = (H[0] + a) | 0;
|
||||
H[1] = (H[1] + b) | 0;
|
||||
H[2] = (H[2] + c) | 0;
|
||||
H[3] = (H[3] + d) | 0;
|
||||
H[4] = (H[4] + e) | 0;
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
|
||||
var nBitsTotal = this._nDataBytes * 8;
|
||||
var nBitsLeft = data.sigBytes * 8;
|
||||
|
||||
// Add padding
|
||||
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
|
||||
data.sigBytes = dataWords.length * 4;
|
||||
|
||||
// Hash final blocks
|
||||
this._process();
|
||||
|
||||
// Return final computed hash
|
||||
return this._hash;
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
var clone = Hasher.clone.call(this);
|
||||
clone._hash = this._hash.clone();
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.SHA1('message');
|
||||
* var hash = CryptoJS.SHA1(wordArray);
|
||||
*/
|
||||
C.SHA1 = Hasher._createHelper(SHA1);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacSHA1(message, key);
|
||||
*/
|
||||
C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
|
||||
}());
|
||||
|
||||
|
||||
(function(Math) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var Hasher = C_lib.Hasher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Initialization and round constants tables
|
||||
var H = [];
|
||||
var K = [];
|
||||
|
||||
// Compute constants
|
||||
(function() {
|
||||
function isPrime(n) {
|
||||
var sqrtN = Math.sqrt(n);
|
||||
for (var factor = 2; factor <= sqrtN; factor++) {
|
||||
if (!(n % factor)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function getFractionalBits(n) {
|
||||
return ((n - (n | 0)) * 0x100000000) | 0;
|
||||
}
|
||||
|
||||
var n = 2;
|
||||
var nPrime = 0;
|
||||
while (nPrime < 64) {
|
||||
if (isPrime(n)) {
|
||||
if (nPrime < 8) {
|
||||
H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
|
||||
}
|
||||
K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
|
||||
|
||||
nPrime++;
|
||||
}
|
||||
|
||||
n++;
|
||||
}
|
||||
}());
|
||||
|
||||
// Reusable object
|
||||
var W = [];
|
||||
|
||||
/**
|
||||
* SHA-256 hash algorithm.
|
||||
*/
|
||||
var SHA256 = C_algo.SHA256 = Hasher.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new WordArray.init(H.slice(0));
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Shortcut
|
||||
var H = this._hash.words;
|
||||
|
||||
// Working variables
|
||||
var a = H[0];
|
||||
var b = H[1];
|
||||
var c = H[2];
|
||||
var d = H[3];
|
||||
var e = H[4];
|
||||
var f = H[5];
|
||||
var g = H[6];
|
||||
var h = H[7];
|
||||
|
||||
// Computation
|
||||
for (var i = 0; i < 64; i++) {
|
||||
if (i < 16) {
|
||||
W[i] = M[offset + i] | 0;
|
||||
} else {
|
||||
var gamma0x = W[i - 15];
|
||||
var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ ((gamma0x << 14) | (gamma0x >>> 18)) ^ (gamma0x >>> 3);
|
||||
|
||||
var gamma1x = W[i - 2];
|
||||
var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ ((gamma1x << 13) | (gamma1x >>> 19)) ^ (gamma1x >>> 10);
|
||||
|
||||
W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
|
||||
}
|
||||
|
||||
var ch = (e & f) ^ (~e & g);
|
||||
var maj = (a & b) ^ (a & c) ^ (b & c);
|
||||
|
||||
var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
|
||||
var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
|
||||
|
||||
var t1 = h + sigma1 + ch + K[i] + W[i];
|
||||
var t2 = sigma0 + maj;
|
||||
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = (d + t1) | 0;
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = (t1 + t2) | 0;
|
||||
}
|
||||
|
||||
// Intermediate hash value
|
||||
H[0] = (H[0] + a) | 0;
|
||||
H[1] = (H[1] + b) | 0;
|
||||
H[2] = (H[2] + c) | 0;
|
||||
H[3] = (H[3] + d) | 0;
|
||||
H[4] = (H[4] + e) | 0;
|
||||
H[5] = (H[5] + f) | 0;
|
||||
H[6] = (H[6] + g) | 0;
|
||||
H[7] = (H[7] + h) | 0;
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
|
||||
var nBitsTotal = this._nDataBytes * 8;
|
||||
var nBitsLeft = data.sigBytes * 8;
|
||||
|
||||
// Add padding
|
||||
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
|
||||
data.sigBytes = dataWords.length * 4;
|
||||
|
||||
// Hash final blocks
|
||||
this._process();
|
||||
|
||||
// Return final computed hash
|
||||
return this._hash;
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
var clone = Hasher.clone.call(this);
|
||||
clone._hash = this._hash.clone();
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.SHA256('message');
|
||||
* var hash = CryptoJS.SHA256(wordArray);
|
||||
*/
|
||||
C.SHA256 = Hasher._createHelper(SHA256);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacSHA256(message, key);
|
||||
*/
|
||||
C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
|
||||
}(Math));
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var C_algo = C.algo;
|
||||
var SHA256 = C_algo.SHA256;
|
||||
|
||||
/**
|
||||
* SHA-224 hash algorithm.
|
||||
*/
|
||||
var SHA224 = C_algo.SHA224 = SHA256.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new WordArray.init([
|
||||
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
|
||||
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]);
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
var hash = SHA256._doFinalize.call(this);
|
||||
|
||||
hash.sigBytes -= 4;
|
||||
|
||||
return hash;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.SHA224('message');
|
||||
* var hash = CryptoJS.SHA224(wordArray);
|
||||
*/
|
||||
C.SHA224 = SHA256._createHelper(SHA224);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacSHA224(message, key);
|
||||
*/
|
||||
C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var Hasher = C_lib.Hasher;
|
||||
var C_x64 = C.x64;
|
||||
var X64Word = C_x64.Word;
|
||||
var X64WordArray = C_x64.WordArray;
|
||||
var C_algo = C.algo;
|
||||
|
||||
function X64Word_create() {
|
||||
return X64Word.create.apply(X64Word, arguments);
|
||||
}
|
||||
|
||||
// Constants
|
||||
var K = [
|
||||
X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
|
||||
X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
|
||||
X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
|
||||
X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
|
||||
X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
|
||||
X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
|
||||
X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
|
||||
X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
|
||||
X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
|
||||
X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
|
||||
X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
|
||||
X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
|
||||
X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
|
||||
X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
|
||||
X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
|
||||
X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
|
||||
X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
|
||||
X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
|
||||
X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
|
||||
X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
|
||||
X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
|
||||
X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
|
||||
X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
|
||||
X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
|
||||
X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
|
||||
X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
|
||||
X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
|
||||
X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
|
||||
X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
|
||||
X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
|
||||
X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
|
||||
X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
|
||||
X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
|
||||
X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
|
||||
X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
|
||||
X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
|
||||
X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
|
||||
X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
|
||||
X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
|
||||
X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)];
|
||||
|
||||
// Reusable objects
|
||||
var W = [];
|
||||
(function() {
|
||||
for (var i = 0; i < 80; i++) {
|
||||
W[i] = X64Word_create();
|
||||
}
|
||||
}());
|
||||
|
||||
/**
|
||||
* SHA-512 hash algorithm.
|
||||
*/
|
||||
var SHA512 = C_algo.SHA512 = Hasher.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new X64WordArray.init([
|
||||
new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
|
||||
new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
|
||||
new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
|
||||
new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)]);
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Shortcuts
|
||||
var H = this._hash.words;
|
||||
|
||||
var H0 = H[0];
|
||||
var H1 = H[1];
|
||||
var H2 = H[2];
|
||||
var H3 = H[3];
|
||||
var H4 = H[4];
|
||||
var H5 = H[5];
|
||||
var H6 = H[6];
|
||||
var H7 = H[7];
|
||||
|
||||
var H0h = H0.high;
|
||||
var H0l = H0.low;
|
||||
var H1h = H1.high;
|
||||
var H1l = H1.low;
|
||||
var H2h = H2.high;
|
||||
var H2l = H2.low;
|
||||
var H3h = H3.high;
|
||||
var H3l = H3.low;
|
||||
var H4h = H4.high;
|
||||
var H4l = H4.low;
|
||||
var H5h = H5.high;
|
||||
var H5l = H5.low;
|
||||
var H6h = H6.high;
|
||||
var H6l = H6.low;
|
||||
var H7h = H7.high;
|
||||
var H7l = H7.low;
|
||||
|
||||
// Working variables
|
||||
var ah = H0h;
|
||||
var al = H0l;
|
||||
var bh = H1h;
|
||||
var bl = H1l;
|
||||
var ch = H2h;
|
||||
var cl = H2l;
|
||||
var dh = H3h;
|
||||
var dl = H3l;
|
||||
var eh = H4h;
|
||||
var el = H4l;
|
||||
var fh = H5h;
|
||||
var fl = H5l;
|
||||
var gh = H6h;
|
||||
var gl = H6l;
|
||||
var hh = H7h;
|
||||
var hl = H7l;
|
||||
|
||||
// Rounds
|
||||
for (var i = 0; i < 80; i++) {
|
||||
var Wil;
|
||||
var Wih;
|
||||
|
||||
// Shortcut
|
||||
var Wi = W[i];
|
||||
|
||||
// Extend message
|
||||
if (i < 16) {
|
||||
Wih = Wi.high = M[offset + i * 2] | 0;
|
||||
Wil = Wi.low = M[offset + i * 2 + 1] | 0;
|
||||
} else {
|
||||
// Gamma0
|
||||
var gamma0x = W[i - 15];
|
||||
var gamma0xh = gamma0x.high;
|
||||
var gamma0xl = gamma0x.low;
|
||||
var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
|
||||
var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
|
||||
|
||||
// Gamma1
|
||||
var gamma1x = W[i - 2];
|
||||
var gamma1xh = gamma1x.high;
|
||||
var gamma1xl = gamma1x.low;
|
||||
var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
|
||||
var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
|
||||
|
||||
// W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
|
||||
var Wi7 = W[i - 7];
|
||||
var Wi7h = Wi7.high;
|
||||
var Wi7l = Wi7.low;
|
||||
|
||||
var Wi16 = W[i - 16];
|
||||
var Wi16h = Wi16.high;
|
||||
var Wi16l = Wi16.low;
|
||||
|
||||
Wil = gamma0l + Wi7l;
|
||||
Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
|
||||
Wil = Wil + gamma1l;
|
||||
Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
|
||||
Wil = Wil + Wi16l;
|
||||
Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
|
||||
|
||||
Wi.high = Wih;
|
||||
Wi.low = Wil;
|
||||
}
|
||||
|
||||
var chh = (eh & fh) ^ (~eh & gh);
|
||||
var chl = (el & fl) ^ (~el & gl);
|
||||
var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
|
||||
var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
|
||||
|
||||
var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
|
||||
var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
|
||||
var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
|
||||
var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
|
||||
|
||||
// t1 = h + sigma1 + ch + K[i] + W[i]
|
||||
var Ki = K[i];
|
||||
var Kih = Ki.high;
|
||||
var Kil = Ki.low;
|
||||
|
||||
var t1l = hl + sigma1l;
|
||||
var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
|
||||
var t1l = t1l + chl;
|
||||
var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
|
||||
var t1l = t1l + Kil;
|
||||
var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
|
||||
var t1l = t1l + Wil;
|
||||
var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
|
||||
|
||||
// t2 = sigma0 + maj
|
||||
var t2l = sigma0l + majl;
|
||||
var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
|
||||
|
||||
// Update working variables
|
||||
hh = gh;
|
||||
hl = gl;
|
||||
gh = fh;
|
||||
gl = fl;
|
||||
fh = eh;
|
||||
fl = el;
|
||||
el = (dl + t1l) | 0;
|
||||
eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
|
||||
dh = ch;
|
||||
dl = cl;
|
||||
ch = bh;
|
||||
cl = bl;
|
||||
bh = ah;
|
||||
bl = al;
|
||||
al = (t1l + t2l) | 0;
|
||||
ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
|
||||
}
|
||||
|
||||
// Intermediate hash value
|
||||
H0l = H0.low = (H0l + al);
|
||||
H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
|
||||
H1l = H1.low = (H1l + bl);
|
||||
H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
|
||||
H2l = H2.low = (H2l + cl);
|
||||
H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
|
||||
H3l = H3.low = (H3l + dl);
|
||||
H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
|
||||
H4l = H4.low = (H4l + el);
|
||||
H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
|
||||
H5l = H5.low = (H5l + fl);
|
||||
H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
|
||||
H6l = H6.low = (H6l + gl);
|
||||
H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
|
||||
H7l = H7.low = (H7l + hl);
|
||||
H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
|
||||
var nBitsTotal = this._nDataBytes * 8;
|
||||
var nBitsLeft = data.sigBytes * 8;
|
||||
|
||||
// Add padding
|
||||
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
||||
dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
|
||||
dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
|
||||
data.sigBytes = dataWords.length * 4;
|
||||
|
||||
// Hash final blocks
|
||||
this._process();
|
||||
|
||||
// Convert hash to 32-bit word array before returning
|
||||
var hash = this._hash.toX32();
|
||||
|
||||
// Return final computed hash
|
||||
return hash;
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
var clone = Hasher.clone.call(this);
|
||||
clone._hash = this._hash.clone();
|
||||
|
||||
return clone;
|
||||
},
|
||||
|
||||
blockSize: 1024 / 32
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.SHA512('message');
|
||||
* var hash = CryptoJS.SHA512(wordArray);
|
||||
*/
|
||||
C.SHA512 = Hasher._createHelper(SHA512);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacSHA512(message, key);
|
||||
*/
|
||||
C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_x64 = C.x64;
|
||||
var X64Word = C_x64.Word;
|
||||
var X64WordArray = C_x64.WordArray;
|
||||
var C_algo = C.algo;
|
||||
var SHA512 = C_algo.SHA512;
|
||||
|
||||
/**
|
||||
* SHA-384 hash algorithm.
|
||||
*/
|
||||
var SHA384 = C_algo.SHA384 = SHA512.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new X64WordArray.init([
|
||||
new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
|
||||
new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
|
||||
new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
|
||||
new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)]);
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
var hash = SHA512._doFinalize.call(this);
|
||||
|
||||
hash.sigBytes -= 16;
|
||||
|
||||
return hash;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.SHA384('message');
|
||||
* var hash = CryptoJS.SHA384(wordArray);
|
||||
*/
|
||||
C.SHA384 = SHA512._createHelper(SHA384);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacSHA384(message, key);
|
||||
*/
|
||||
C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
|
||||
}());
|
||||
|
||||
|
||||
(function(Math) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var Hasher = C_lib.Hasher;
|
||||
var C_x64 = C.x64;
|
||||
var X64Word = C_x64.Word;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Constants tables
|
||||
var RHO_OFFSETS = [];
|
||||
var PI_INDEXES = [];
|
||||
var ROUND_CONSTANTS = [];
|
||||
|
||||
// Compute Constants
|
||||
(function() {
|
||||
// Compute rho offset constants
|
||||
var x = 1,
|
||||
y = 0;
|
||||
for (var t = 0; t < 24; t++) {
|
||||
RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
|
||||
|
||||
var newX = y % 5;
|
||||
var newY = (2 * x + 3 * y) % 5;
|
||||
x = newX;
|
||||
y = newY;
|
||||
}
|
||||
|
||||
// Compute pi index constants
|
||||
for (var x = 0; x < 5; x++) {
|
||||
for (var y = 0; y < 5; y++) {
|
||||
PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
|
||||
}
|
||||
}
|
||||
|
||||
// Compute round constants
|
||||
var LFSR = 0x01;
|
||||
for (var i = 0; i < 24; i++) {
|
||||
var roundConstantMsw = 0;
|
||||
var roundConstantLsw = 0;
|
||||
|
||||
for (var j = 0; j < 7; j++) {
|
||||
if (LFSR & 0x01) {
|
||||
var bitPosition = (1 << j) - 1;
|
||||
if (bitPosition < 32) {
|
||||
roundConstantLsw ^= 1 << bitPosition;
|
||||
} else /* if (bitPosition >= 32) */ {
|
||||
roundConstantMsw ^= 1 << (bitPosition - 32);
|
||||
}
|
||||
}
|
||||
|
||||
// Compute next LFSR
|
||||
if (LFSR & 0x80) {
|
||||
// Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
|
||||
LFSR = (LFSR << 1) ^ 0x71;
|
||||
} else {
|
||||
LFSR <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
|
||||
}
|
||||
}());
|
||||
|
||||
// Reusable objects for temporary values
|
||||
var T = [];
|
||||
(function() {
|
||||
for (var i = 0; i < 25; i++) {
|
||||
T[i] = X64Word.create();
|
||||
}
|
||||
}());
|
||||
|
||||
/**
|
||||
* SHA-3 hash algorithm.
|
||||
*/
|
||||
var SHA3 = C_algo.SHA3 = Hasher.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {number} outputLength
|
||||
* The desired number of bits in the output hash.
|
||||
* Only values permitted are: 224, 256, 384, 512.
|
||||
* Default: 512
|
||||
*/
|
||||
cfg: Hasher.cfg.extend({
|
||||
outputLength: 512
|
||||
}),
|
||||
|
||||
_doReset: function() {
|
||||
var state = this._state = []
|
||||
for (var i = 0; i < 25; i++) {
|
||||
state[i] = new X64Word.init();
|
||||
}
|
||||
|
||||
this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Shortcuts
|
||||
var state = this._state;
|
||||
var nBlockSizeLanes = this.blockSize / 2;
|
||||
|
||||
// Absorb
|
||||
for (var i = 0; i < nBlockSizeLanes; i++) {
|
||||
// Shortcuts
|
||||
var M2i = M[offset + 2 * i];
|
||||
var M2i1 = M[offset + 2 * i + 1];
|
||||
|
||||
// Swap endian
|
||||
M2i = (
|
||||
(((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00));
|
||||
M2i1 = (
|
||||
(((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00));
|
||||
|
||||
// Absorb message into state
|
||||
var lane = state[i];
|
||||
lane.high ^= M2i1;
|
||||
lane.low ^= M2i;
|
||||
}
|
||||
|
||||
// Rounds
|
||||
for (var round = 0; round < 24; round++) {
|
||||
// Theta
|
||||
for (var x = 0; x < 5; x++) {
|
||||
// Mix column lanes
|
||||
var tMsw = 0,
|
||||
tLsw = 0;
|
||||
for (var y = 0; y < 5; y++) {
|
||||
var lane = state[x + 5 * y];
|
||||
tMsw ^= lane.high;
|
||||
tLsw ^= lane.low;
|
||||
}
|
||||
|
||||
// Temporary values
|
||||
var Tx = T[x];
|
||||
Tx.high = tMsw;
|
||||
Tx.low = tLsw;
|
||||
}
|
||||
for (var x = 0; x < 5; x++) {
|
||||
// Shortcuts
|
||||
var Tx4 = T[(x + 4) % 5];
|
||||
var Tx1 = T[(x + 1) % 5];
|
||||
var Tx1Msw = Tx1.high;
|
||||
var Tx1Lsw = Tx1.low;
|
||||
|
||||
// Mix surrounding columns
|
||||
var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
|
||||
var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
|
||||
for (var y = 0; y < 5; y++) {
|
||||
var lane = state[x + 5 * y];
|
||||
lane.high ^= tMsw;
|
||||
lane.low ^= tLsw;
|
||||
}
|
||||
}
|
||||
|
||||
// Rho Pi
|
||||
for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
|
||||
var tMsw;
|
||||
var tLsw;
|
||||
|
||||
// Shortcuts
|
||||
var lane = state[laneIndex];
|
||||
var laneMsw = lane.high;
|
||||
var laneLsw = lane.low;
|
||||
var rhoOffset = RHO_OFFSETS[laneIndex];
|
||||
|
||||
// Rotate lanes
|
||||
if (rhoOffset < 32) {
|
||||
tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
|
||||
tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
|
||||
} else /* if (rhoOffset >= 32) */ {
|
||||
tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
|
||||
tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
|
||||
}
|
||||
|
||||
// Transpose lanes
|
||||
var TPiLane = T[PI_INDEXES[laneIndex]];
|
||||
TPiLane.high = tMsw;
|
||||
TPiLane.low = tLsw;
|
||||
}
|
||||
|
||||
// Rho pi at x = y = 0
|
||||
var T0 = T[0];
|
||||
var state0 = state[0];
|
||||
T0.high = state0.high;
|
||||
T0.low = state0.low;
|
||||
|
||||
// Chi
|
||||
for (var x = 0; x < 5; x++) {
|
||||
for (var y = 0; y < 5; y++) {
|
||||
// Shortcuts
|
||||
var laneIndex = x + 5 * y;
|
||||
var lane = state[laneIndex];
|
||||
var TLane = T[laneIndex];
|
||||
var Tx1Lane = T[((x + 1) % 5) + 5 * y];
|
||||
var Tx2Lane = T[((x + 2) % 5) + 5 * y];
|
||||
|
||||
// Mix rows
|
||||
lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
|
||||
lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
|
||||
}
|
||||
}
|
||||
|
||||
// Iota
|
||||
var lane = state[0];
|
||||
var roundConstant = ROUND_CONSTANTS[round];
|
||||
lane.high ^= roundConstant.high;
|
||||
lane.low ^= roundConstant.low;
|
||||
}
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
var nBitsTotal = this._nDataBytes * 8;
|
||||
var nBitsLeft = data.sigBytes * 8;
|
||||
var blockSizeBits = this.blockSize * 32;
|
||||
|
||||
// Add padding
|
||||
dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
|
||||
dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
|
||||
data.sigBytes = dataWords.length * 4;
|
||||
|
||||
// Hash final blocks
|
||||
this._process();
|
||||
|
||||
// Shortcuts
|
||||
var state = this._state;
|
||||
var outputLengthBytes = this.cfg.outputLength / 8;
|
||||
var outputLengthLanes = outputLengthBytes / 8;
|
||||
|
||||
// Squeeze
|
||||
var hashWords = [];
|
||||
for (var i = 0; i < outputLengthLanes; i++) {
|
||||
// Shortcuts
|
||||
var lane = state[i];
|
||||
var laneMsw = lane.high;
|
||||
var laneLsw = lane.low;
|
||||
|
||||
// Swap endian
|
||||
laneMsw = (
|
||||
(((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00));
|
||||
laneLsw = (
|
||||
(((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00));
|
||||
|
||||
// Squeeze state to retrieve hash
|
||||
hashWords.push(laneLsw);
|
||||
hashWords.push(laneMsw);
|
||||
}
|
||||
|
||||
// Return final computed hash
|
||||
return new WordArray.init(hashWords, outputLengthBytes);
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
var clone = Hasher.clone.call(this);
|
||||
|
||||
var state = clone._state = this._state.slice(0);
|
||||
for (var i = 0; i < 25; i++) {
|
||||
state[i] = state[i].clone();
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.SHA3('message');
|
||||
* var hash = CryptoJS.SHA3(wordArray);
|
||||
*/
|
||||
C.SHA3 = Hasher._createHelper(SHA3);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacSHA3(message, key);
|
||||
*/
|
||||
C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
|
||||
}(Math));
|
||||
|
||||
|
||||
/** @preserve
|
||||
(c) 2012 by Cédric Mesnil. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
(function(Math) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var Hasher = C_lib.Hasher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Constants table
|
||||
var _zl = WordArray.create([
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
|
||||
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
|
||||
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
|
||||
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
|
||||
var _zr = WordArray.create([
|
||||
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
|
||||
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
|
||||
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
|
||||
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
|
||||
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
|
||||
var _sl = WordArray.create([
|
||||
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
|
||||
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
|
||||
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
|
||||
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
|
||||
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]);
|
||||
var _sr = WordArray.create([
|
||||
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
|
||||
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
|
||||
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
|
||||
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
|
||||
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]);
|
||||
|
||||
var _hl = WordArray.create([0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
|
||||
var _hr = WordArray.create([0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
|
||||
|
||||
/**
|
||||
* RIPEMD160 hash algorithm.
|
||||
*/
|
||||
var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
|
||||
_doReset: function() {
|
||||
this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
|
||||
// Swap endian
|
||||
for (var i = 0; i < 16; i++) {
|
||||
// Shortcuts
|
||||
var offset_i = offset + i;
|
||||
var M_offset_i = M[offset_i];
|
||||
|
||||
// Swap
|
||||
M[offset_i] = (
|
||||
(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00));
|
||||
}
|
||||
// Shortcut
|
||||
var H = this._hash.words;
|
||||
var hl = _hl.words;
|
||||
var hr = _hr.words;
|
||||
var zl = _zl.words;
|
||||
var zr = _zr.words;
|
||||
var sl = _sl.words;
|
||||
var sr = _sr.words;
|
||||
|
||||
// Working variables
|
||||
var al, bl, cl, dl, el;
|
||||
var ar, br, cr, dr, er;
|
||||
|
||||
ar = al = H[0];
|
||||
br = bl = H[1];
|
||||
cr = cl = H[2];
|
||||
dr = dl = H[3];
|
||||
er = el = H[4];
|
||||
// Computation
|
||||
var t;
|
||||
for (var i = 0; i < 80; i += 1) {
|
||||
t = (al + M[offset + zl[i]]) | 0;
|
||||
if (i < 16) {
|
||||
t += f1(bl, cl, dl) + hl[0];
|
||||
} else if (i < 32) {
|
||||
t += f2(bl, cl, dl) + hl[1];
|
||||
} else if (i < 48) {
|
||||
t += f3(bl, cl, dl) + hl[2];
|
||||
} else if (i < 64) {
|
||||
t += f4(bl, cl, dl) + hl[3];
|
||||
} else { // if (i<80) {
|
||||
t += f5(bl, cl, dl) + hl[4];
|
||||
}
|
||||
t = t | 0;
|
||||
t = rotl(t, sl[i]);
|
||||
t = (t + el) | 0;
|
||||
al = el;
|
||||
el = dl;
|
||||
dl = rotl(cl, 10);
|
||||
cl = bl;
|
||||
bl = t;
|
||||
|
||||
t = (ar + M[offset + zr[i]]) | 0;
|
||||
if (i < 16) {
|
||||
t += f5(br, cr, dr) + hr[0];
|
||||
} else if (i < 32) {
|
||||
t += f4(br, cr, dr) + hr[1];
|
||||
} else if (i < 48) {
|
||||
t += f3(br, cr, dr) + hr[2];
|
||||
} else if (i < 64) {
|
||||
t += f2(br, cr, dr) + hr[3];
|
||||
} else { // if (i<80) {
|
||||
t += f1(br, cr, dr) + hr[4];
|
||||
}
|
||||
t = t | 0;
|
||||
t = rotl(t, sr[i]);
|
||||
t = (t + er) | 0;
|
||||
ar = er;
|
||||
er = dr;
|
||||
dr = rotl(cr, 10);
|
||||
cr = br;
|
||||
br = t;
|
||||
}
|
||||
// Intermediate hash value
|
||||
t = (H[1] + cl + dr) | 0;
|
||||
H[1] = (H[2] + dl + er) | 0;
|
||||
H[2] = (H[3] + el + ar) | 0;
|
||||
H[3] = (H[4] + al + br) | 0;
|
||||
H[4] = (H[0] + bl + cr) | 0;
|
||||
H[0] = t;
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
// Shortcuts
|
||||
var data = this._data;
|
||||
var dataWords = data.words;
|
||||
|
||||
var nBitsTotal = this._nDataBytes * 8;
|
||||
var nBitsLeft = data.sigBytes * 8;
|
||||
|
||||
// Add padding
|
||||
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
||||
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
|
||||
(((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00));
|
||||
data.sigBytes = (dataWords.length + 1) * 4;
|
||||
|
||||
// Hash final blocks
|
||||
this._process();
|
||||
|
||||
// Shortcuts
|
||||
var hash = this._hash;
|
||||
var H = hash.words;
|
||||
|
||||
// Swap endian
|
||||
for (var i = 0; i < 5; i++) {
|
||||
// Shortcut
|
||||
var H_i = H[i];
|
||||
|
||||
// Swap
|
||||
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
|
||||
}
|
||||
|
||||
// Return final computed hash
|
||||
return hash;
|
||||
},
|
||||
|
||||
clone: function() {
|
||||
var clone = Hasher.clone.call(this);
|
||||
clone._hash = this._hash.clone();
|
||||
|
||||
return clone;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function f1(x, y, z) {
|
||||
return ((x) ^ (y) ^ (z));
|
||||
|
||||
}
|
||||
|
||||
function f2(x, y, z) {
|
||||
return (((x) & (y)) | ((~x) & (z)));
|
||||
}
|
||||
|
||||
function f3(x, y, z) {
|
||||
return (((x) | (~ (y))) ^ (z));
|
||||
}
|
||||
|
||||
function f4(x, y, z) {
|
||||
return (((x) & (z)) | ((y) & (~ (z))));
|
||||
}
|
||||
|
||||
function f5(x, y, z) {
|
||||
return ((x) ^ ((y) | (~ (z))));
|
||||
|
||||
}
|
||||
|
||||
function rotl(x, n) {
|
||||
return (x << n) | (x >>> (32 - n));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut function to the hasher's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
*
|
||||
* @return {WordArray} The hash.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hash = CryptoJS.RIPEMD160('message');
|
||||
* var hash = CryptoJS.RIPEMD160(wordArray);
|
||||
*/
|
||||
C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
|
||||
|
||||
/**
|
||||
* Shortcut function to the HMAC's object interface.
|
||||
*
|
||||
* @param {WordArray|string} message The message to hash.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = CryptoJS.HmacRIPEMD160(message, key);
|
||||
*/
|
||||
C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
|
||||
}(Math));
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var Base = C_lib.Base;
|
||||
var C_enc = C.enc;
|
||||
var Utf8 = C_enc.Utf8;
|
||||
var C_algo = C.algo;
|
||||
|
||||
/**
|
||||
* HMAC algorithm.
|
||||
*/
|
||||
var HMAC = C_algo.HMAC = Base.extend({
|
||||
/**
|
||||
* Initializes a newly created HMAC.
|
||||
*
|
||||
* @param {Hasher} hasher The hash algorithm to use.
|
||||
* @param {WordArray|string} key The secret key.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
|
||||
*/
|
||||
init: function(hasher, key) {
|
||||
// Init hasher
|
||||
hasher = this._hasher = new hasher.init();
|
||||
|
||||
// Convert string to WordArray, else assume WordArray already
|
||||
if (typeof key == 'string') {
|
||||
key = Utf8.parse(key);
|
||||
}
|
||||
|
||||
// Shortcuts
|
||||
var hasherBlockSize = hasher.blockSize;
|
||||
var hasherBlockSizeBytes = hasherBlockSize * 4;
|
||||
|
||||
// Allow arbitrary length keys
|
||||
if (key.sigBytes > hasherBlockSizeBytes) {
|
||||
key = hasher.finalize(key);
|
||||
}
|
||||
|
||||
// Clamp excess bits
|
||||
key.clamp();
|
||||
|
||||
// Clone key for inner and outer pads
|
||||
var oKey = this._oKey = key.clone();
|
||||
var iKey = this._iKey = key.clone();
|
||||
|
||||
// Shortcuts
|
||||
var oKeyWords = oKey.words;
|
||||
var iKeyWords = iKey.words;
|
||||
|
||||
// XOR keys with pad constants
|
||||
for (var i = 0; i < hasherBlockSize; i++) {
|
||||
oKeyWords[i] ^= 0x5c5c5c5c;
|
||||
iKeyWords[i] ^= 0x36363636;
|
||||
}
|
||||
oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
|
||||
|
||||
// Set initial values
|
||||
this.reset();
|
||||
},
|
||||
|
||||
/**
|
||||
* Resets this HMAC to its initial state.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* hmacHasher.reset();
|
||||
*/
|
||||
reset: function() {
|
||||
// Shortcut
|
||||
var hasher = this._hasher;
|
||||
|
||||
// Reset
|
||||
hasher.reset();
|
||||
hasher.update(this._iKey);
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates this HMAC with a message.
|
||||
*
|
||||
* @param {WordArray|string} messageUpdate The message to append.
|
||||
*
|
||||
* @return {HMAC} This HMAC instance.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* hmacHasher.update('message');
|
||||
* hmacHasher.update(wordArray);
|
||||
*/
|
||||
update: function(messageUpdate) {
|
||||
this._hasher.update(messageUpdate);
|
||||
|
||||
// Chainable
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* Finalizes the HMAC computation.
|
||||
* Note that the finalize operation is effectively a destructive, read-once operation.
|
||||
*
|
||||
* @param {WordArray|string} messageUpdate (Optional) A final message update.
|
||||
*
|
||||
* @return {WordArray} The HMAC.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hmac = hmacHasher.finalize();
|
||||
* var hmac = hmacHasher.finalize('message');
|
||||
* var hmac = hmacHasher.finalize(wordArray);
|
||||
*/
|
||||
finalize: function(messageUpdate) {
|
||||
// Shortcut
|
||||
var hasher = this._hasher;
|
||||
|
||||
// Compute HMAC
|
||||
var innerHash = hasher.finalize(messageUpdate);
|
||||
hasher.reset();
|
||||
var hmac = hasher.finalize(this._oKey.clone()
|
||||
.concat(innerHash));
|
||||
|
||||
return hmac;
|
||||
}
|
||||
});
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var Base = C_lib.Base;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var C_algo = C.algo;
|
||||
var SHA1 = C_algo.SHA1;
|
||||
var HMAC = C_algo.HMAC;
|
||||
|
||||
/**
|
||||
* Password-Based Key Derivation Function 2 algorithm.
|
||||
*/
|
||||
var PBKDF2 = C_algo.PBKDF2 = Base.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
|
||||
* @property {Hasher} hasher The hasher to use. Default: SHA1
|
||||
* @property {number} iterations The number of iterations to perform. Default: 1
|
||||
*/
|
||||
cfg: Base.extend({
|
||||
keySize: 128 / 32,
|
||||
hasher: SHA1,
|
||||
iterations: 1
|
||||
}),
|
||||
|
||||
/**
|
||||
* Initializes a newly created key derivation function.
|
||||
*
|
||||
* @param {Object} cfg (Optional) The configuration options to use for the derivation.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var kdf = CryptoJS.algo.PBKDF2.create();
|
||||
* var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
|
||||
* var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
|
||||
*/
|
||||
init: function(cfg) {
|
||||
this.cfg = this.cfg.extend(cfg);
|
||||
},
|
||||
|
||||
/**
|
||||
* Computes the Password-Based Key Derivation Function 2.
|
||||
*
|
||||
* @param {WordArray|string} password The password.
|
||||
* @param {WordArray|string} salt A salt.
|
||||
*
|
||||
* @return {WordArray} The derived key.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var key = kdf.compute(password, salt);
|
||||
*/
|
||||
compute: function(password, salt) {
|
||||
// Shortcut
|
||||
var cfg = this.cfg;
|
||||
|
||||
// Init HMAC
|
||||
var hmac = HMAC.create(cfg.hasher, password);
|
||||
|
||||
// Initial values
|
||||
var derivedKey = WordArray.create();
|
||||
var blockIndex = WordArray.create([0x00000001]);
|
||||
|
||||
// Shortcuts
|
||||
var derivedKeyWords = derivedKey.words;
|
||||
var blockIndexWords = blockIndex.words;
|
||||
var keySize = cfg.keySize;
|
||||
var iterations = cfg.iterations;
|
||||
|
||||
// Generate key
|
||||
while (derivedKeyWords.length < keySize) {
|
||||
var block = hmac.update(salt)
|
||||
.finalize(blockIndex);
|
||||
hmac.reset();
|
||||
|
||||
// Shortcuts
|
||||
var blockWords = block.words;
|
||||
var blockWordsLength = blockWords.length;
|
||||
|
||||
// Iterations
|
||||
var intermediate = block;
|
||||
for (var i = 1; i < iterations; i++) {
|
||||
intermediate = hmac.finalize(intermediate);
|
||||
hmac.reset();
|
||||
|
||||
// Shortcut
|
||||
var intermediateWords = intermediate.words;
|
||||
|
||||
// XOR intermediate with block
|
||||
for (var j = 0; j < blockWordsLength; j++) {
|
||||
blockWords[j] ^= intermediateWords[j];
|
||||
}
|
||||
}
|
||||
|
||||
derivedKey.concat(block);
|
||||
blockIndexWords[0]++;
|
||||
}
|
||||
derivedKey.sigBytes = keySize * 4;
|
||||
|
||||
return derivedKey;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Computes the Password-Based Key Derivation Function 2.
|
||||
*
|
||||
* @param {WordArray|string} password The password.
|
||||
* @param {WordArray|string} salt A salt.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this computation.
|
||||
*
|
||||
* @return {WordArray} The derived key.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var key = CryptoJS.PBKDF2(password, salt);
|
||||
* var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
|
||||
* var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
|
||||
*/
|
||||
C.PBKDF2 = function(password, salt, cfg) {
|
||||
return PBKDF2.create(cfg)
|
||||
.compute(password, salt);
|
||||
};
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var Base = C_lib.Base;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var C_algo = C.algo;
|
||||
var MD5 = C_algo.MD5;
|
||||
|
||||
/**
|
||||
* This key derivation function is meant to conform with EVP_BytesToKey.
|
||||
* www.openssl.org/docs/crypto/EVP_BytesToKey.html
|
||||
*/
|
||||
var EvpKDF = C_algo.EvpKDF = Base.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
|
||||
* @property {Hasher} hasher The hash algorithm to use. Default: MD5
|
||||
* @property {number} iterations The number of iterations to perform. Default: 1
|
||||
*/
|
||||
cfg: Base.extend({
|
||||
keySize: 128 / 32,
|
||||
hasher: MD5,
|
||||
iterations: 1
|
||||
}),
|
||||
|
||||
/**
|
||||
* Initializes a newly created key derivation function.
|
||||
*
|
||||
* @param {Object} cfg (Optional) The configuration options to use for the derivation.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var kdf = CryptoJS.algo.EvpKDF.create();
|
||||
* var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
|
||||
* var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
|
||||
*/
|
||||
init: function(cfg) {
|
||||
this.cfg = this.cfg.extend(cfg);
|
||||
},
|
||||
|
||||
/**
|
||||
* Derives a key from a password.
|
||||
*
|
||||
* @param {WordArray|string} password The password.
|
||||
* @param {WordArray|string} salt A salt.
|
||||
*
|
||||
* @return {WordArray} The derived key.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var key = kdf.compute(password, salt);
|
||||
*/
|
||||
compute: function(password, salt) {
|
||||
var block;
|
||||
|
||||
// Shortcut
|
||||
var cfg = this.cfg;
|
||||
|
||||
// Init hasher
|
||||
var hasher = cfg.hasher.create();
|
||||
|
||||
// Initial values
|
||||
var derivedKey = WordArray.create();
|
||||
|
||||
// Shortcuts
|
||||
var derivedKeyWords = derivedKey.words;
|
||||
var keySize = cfg.keySize;
|
||||
var iterations = cfg.iterations;
|
||||
|
||||
// Generate key
|
||||
while (derivedKeyWords.length < keySize) {
|
||||
if (block) {
|
||||
hasher.update(block);
|
||||
}
|
||||
block = hasher.update(password)
|
||||
.finalize(salt);
|
||||
hasher.reset();
|
||||
|
||||
// Iterations
|
||||
for (var i = 1; i < iterations; i++) {
|
||||
block = hasher.finalize(block);
|
||||
hasher.reset();
|
||||
}
|
||||
|
||||
derivedKey.concat(block);
|
||||
}
|
||||
derivedKey.sigBytes = keySize * 4;
|
||||
|
||||
return derivedKey;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Derives a key from a password.
|
||||
*
|
||||
* @param {WordArray|string} password The password.
|
||||
* @param {WordArray|string} salt A salt.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this computation.
|
||||
*
|
||||
* @return {WordArray} The derived key.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var key = CryptoJS.EvpKDF(password, salt);
|
||||
* var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
|
||||
* var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
|
||||
*/
|
||||
C.EvpKDF = function(password, salt, cfg) {
|
||||
return EvpKDF.create(cfg)
|
||||
.compute(password, salt);
|
||||
};
|
||||
}());
|
||||
|
||||
|
||||
/**
|
||||
* Cipher core components.
|
||||
*/
|
||||
CryptoJS.lib.Cipher || (function(undefined) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var Base = C_lib.Base;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
|
||||
var C_enc = C.enc;
|
||||
var Utf8 = C_enc.Utf8;
|
||||
var Base64 = C_enc.Base64;
|
||||
var C_algo = C.algo;
|
||||
var EvpKDF = C_algo.EvpKDF;
|
||||
|
||||
/**
|
||||
* Abstract base cipher template.
|
||||
*
|
||||
* @property {number} keySize This cipher's key size. Default: 4 (128 bits)
|
||||
* @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
|
||||
* @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
|
||||
* @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
|
||||
*/
|
||||
var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {WordArray} iv The IV to use for this operation.
|
||||
*/
|
||||
cfg: Base.extend(),
|
||||
|
||||
/**
|
||||
* Creates this cipher in encryption mode.
|
||||
*
|
||||
* @param {WordArray} key The key.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @return {Cipher} A cipher instance.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
|
||||
*/
|
||||
createEncryptor: function(key, cfg) {
|
||||
return this.create(this._ENC_XFORM_MODE, key, cfg);
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates this cipher in decryption mode.
|
||||
*
|
||||
* @param {WordArray} key The key.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @return {Cipher} A cipher instance.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
|
||||
*/
|
||||
createDecryptor: function(key, cfg) {
|
||||
return this.create(this._DEC_XFORM_MODE, key, cfg);
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes a newly created cipher.
|
||||
*
|
||||
* @param {number} xformMode Either the encryption or decryption transormation mode constant.
|
||||
* @param {WordArray} key The key.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
|
||||
*/
|
||||
init: function(xformMode, key, cfg) {
|
||||
// Apply config defaults
|
||||
this.cfg = this.cfg.extend(cfg);
|
||||
|
||||
// Store transform mode and key
|
||||
this._xformMode = xformMode;
|
||||
this._key = key;
|
||||
|
||||
// Set initial values
|
||||
this.reset();
|
||||
},
|
||||
|
||||
/**
|
||||
* Resets this cipher to its initial state.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* cipher.reset();
|
||||
*/
|
||||
reset: function() {
|
||||
// Reset data buffer
|
||||
BufferedBlockAlgorithm.reset.call(this);
|
||||
|
||||
// Perform concrete-cipher logic
|
||||
this._doReset();
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds data to be encrypted or decrypted.
|
||||
*
|
||||
* @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
|
||||
*
|
||||
* @return {WordArray} The data after processing.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var encrypted = cipher.process('data');
|
||||
* var encrypted = cipher.process(wordArray);
|
||||
*/
|
||||
process: function(dataUpdate) {
|
||||
// Append
|
||||
this._append(dataUpdate);
|
||||
|
||||
// Process available blocks
|
||||
return this._process();
|
||||
},
|
||||
|
||||
/**
|
||||
* Finalizes the encryption or decryption process.
|
||||
* Note that the finalize operation is effectively a destructive, read-once operation.
|
||||
*
|
||||
* @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
|
||||
*
|
||||
* @return {WordArray} The data after final processing.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var encrypted = cipher.finalize();
|
||||
* var encrypted = cipher.finalize('data');
|
||||
* var encrypted = cipher.finalize(wordArray);
|
||||
*/
|
||||
finalize: function(dataUpdate) {
|
||||
// Final data update
|
||||
if (dataUpdate) {
|
||||
this._append(dataUpdate);
|
||||
}
|
||||
|
||||
// Perform concrete-cipher logic
|
||||
var finalProcessedData = this._doFinalize();
|
||||
|
||||
return finalProcessedData;
|
||||
},
|
||||
|
||||
keySize: 128 / 32,
|
||||
|
||||
ivSize: 128 / 32,
|
||||
|
||||
_ENC_XFORM_MODE: 1,
|
||||
|
||||
_DEC_XFORM_MODE: 2,
|
||||
|
||||
/**
|
||||
* Creates shortcut functions to a cipher's object interface.
|
||||
*
|
||||
* @param {Cipher} cipher The cipher to create a helper for.
|
||||
*
|
||||
* @return {Object} An object with encrypt and decrypt shortcut functions.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
|
||||
*/
|
||||
_createHelper: (function() {
|
||||
function selectCipherStrategy(key) {
|
||||
if (typeof key == 'string') {
|
||||
return PasswordBasedCipher;
|
||||
} else {
|
||||
return SerializableCipher;
|
||||
}
|
||||
}
|
||||
|
||||
return function(cipher) {
|
||||
return {
|
||||
encrypt: function(message, key, cfg) {
|
||||
return selectCipherStrategy(key)
|
||||
.encrypt(cipher, message, key, cfg);
|
||||
},
|
||||
|
||||
decrypt: function(ciphertext, key, cfg) {
|
||||
return selectCipherStrategy(key)
|
||||
.decrypt(cipher, ciphertext, key, cfg);
|
||||
}
|
||||
};
|
||||
};
|
||||
}())
|
||||
});
|
||||
|
||||
/**
|
||||
* Abstract base stream cipher template.
|
||||
*
|
||||
* @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
|
||||
*/
|
||||
var StreamCipher = C_lib.StreamCipher = Cipher.extend({
|
||||
_doFinalize: function() {
|
||||
// Process partial blocks
|
||||
var finalProcessedBlocks = this._process( !! 'flush');
|
||||
|
||||
return finalProcessedBlocks;
|
||||
},
|
||||
|
||||
blockSize: 1
|
||||
});
|
||||
|
||||
/**
|
||||
* Mode namespace.
|
||||
*/
|
||||
var C_mode = C.mode = {};
|
||||
|
||||
/**
|
||||
* Abstract base block cipher mode template.
|
||||
*/
|
||||
var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
|
||||
/**
|
||||
* Creates this mode for encryption.
|
||||
*
|
||||
* @param {Cipher} cipher A block cipher instance.
|
||||
* @param {Array} iv The IV words.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
|
||||
*/
|
||||
createEncryptor: function(cipher, iv) {
|
||||
return this.Encryptor.create(cipher, iv);
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates this mode for decryption.
|
||||
*
|
||||
* @param {Cipher} cipher A block cipher instance.
|
||||
* @param {Array} iv The IV words.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
|
||||
*/
|
||||
createDecryptor: function(cipher, iv) {
|
||||
return this.Decryptor.create(cipher, iv);
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes a newly created mode.
|
||||
*
|
||||
* @param {Cipher} cipher A block cipher instance.
|
||||
* @param {Array} iv The IV words.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
|
||||
*/
|
||||
init: function(cipher, iv) {
|
||||
this._cipher = cipher;
|
||||
this._iv = iv;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Cipher Block Chaining mode.
|
||||
*/
|
||||
var CBC = C_mode.CBC = (function() {
|
||||
/**
|
||||
* Abstract base CBC mode.
|
||||
*/
|
||||
var CBC = BlockCipherMode.extend();
|
||||
|
||||
/**
|
||||
* CBC encryptor.
|
||||
*/
|
||||
CBC.Encryptor = CBC.extend({
|
||||
/**
|
||||
* Processes the data block at offset.
|
||||
*
|
||||
* @param {Array} words The data words to operate on.
|
||||
* @param {number} offset The offset where the block starts.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* mode.processBlock(data.words, offset);
|
||||
*/
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher;
|
||||
var blockSize = cipher.blockSize;
|
||||
|
||||
// XOR and encrypt
|
||||
xorBlock.call(this, words, offset, blockSize);
|
||||
cipher.encryptBlock(words, offset);
|
||||
|
||||
// Remember this block to use with next block
|
||||
this._prevBlock = words.slice(offset, offset + blockSize);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* CBC decryptor.
|
||||
*/
|
||||
CBC.Decryptor = CBC.extend({
|
||||
/**
|
||||
* Processes the data block at offset.
|
||||
*
|
||||
* @param {Array} words The data words to operate on.
|
||||
* @param {number} offset The offset where the block starts.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* mode.processBlock(data.words, offset);
|
||||
*/
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher;
|
||||
var blockSize = cipher.blockSize;
|
||||
|
||||
// Remember this block to use with next block
|
||||
var thisBlock = words.slice(offset, offset + blockSize);
|
||||
|
||||
// Decrypt and XOR
|
||||
cipher.decryptBlock(words, offset);
|
||||
xorBlock.call(this, words, offset, blockSize);
|
||||
|
||||
// This block becomes the previous block
|
||||
this._prevBlock = thisBlock;
|
||||
}
|
||||
});
|
||||
|
||||
function xorBlock(words, offset, blockSize) {
|
||||
var block;
|
||||
|
||||
// Shortcut
|
||||
var iv = this._iv;
|
||||
|
||||
// Choose mixing block
|
||||
if (iv) {
|
||||
block = iv;
|
||||
|
||||
// Remove IV for subsequent blocks
|
||||
this._iv = undefined;
|
||||
} else {
|
||||
block = this._prevBlock;
|
||||
}
|
||||
|
||||
// XOR blocks
|
||||
for (var i = 0; i < blockSize; i++) {
|
||||
words[offset + i] ^= block[i];
|
||||
}
|
||||
}
|
||||
|
||||
return CBC;
|
||||
}());
|
||||
|
||||
/**
|
||||
* Padding namespace.
|
||||
*/
|
||||
var C_pad = C.pad = {};
|
||||
|
||||
/**
|
||||
* PKCS #5/7 padding strategy.
|
||||
*/
|
||||
var Pkcs7 = C_pad.Pkcs7 = {
|
||||
/**
|
||||
* Pads data using the algorithm defined in PKCS #5/7.
|
||||
*
|
||||
* @param {WordArray} data The data to pad.
|
||||
* @param {number} blockSize The multiple that the data should be padded to.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* CryptoJS.pad.Pkcs7.pad(wordArray, 4);
|
||||
*/
|
||||
pad: function(data, blockSize) {
|
||||
// Shortcut
|
||||
var blockSizeBytes = blockSize * 4;
|
||||
|
||||
// Count padding bytes
|
||||
var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
|
||||
|
||||
// Create padding word
|
||||
var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
|
||||
|
||||
// Create padding
|
||||
var paddingWords = [];
|
||||
for (var i = 0; i < nPaddingBytes; i += 4) {
|
||||
paddingWords.push(paddingWord);
|
||||
}
|
||||
var padding = WordArray.create(paddingWords, nPaddingBytes);
|
||||
|
||||
// Add padding
|
||||
data.concat(padding);
|
||||
},
|
||||
|
||||
/**
|
||||
* Unpads data that had been padded using the algorithm defined in PKCS #5/7.
|
||||
*
|
||||
* @param {WordArray} data The data to unpad.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* CryptoJS.pad.Pkcs7.unpad(wordArray);
|
||||
*/
|
||||
unpad: function(data) {
|
||||
// Get number of padding bytes from last byte
|
||||
var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
|
||||
|
||||
// Remove padding
|
||||
data.sigBytes -= nPaddingBytes;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstract base block cipher template.
|
||||
*
|
||||
* @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
|
||||
*/
|
||||
var BlockCipher = C_lib.BlockCipher = Cipher.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {Mode} mode The block mode to use. Default: CBC
|
||||
* @property {Padding} padding The padding strategy to use. Default: Pkcs7
|
||||
*/
|
||||
cfg: Cipher.cfg.extend({
|
||||
mode: CBC,
|
||||
padding: Pkcs7
|
||||
}),
|
||||
|
||||
reset: function() {
|
||||
var modeCreator;
|
||||
|
||||
// Reset cipher
|
||||
Cipher.reset.call(this);
|
||||
|
||||
// Shortcuts
|
||||
var cfg = this.cfg;
|
||||
var iv = cfg.iv;
|
||||
var mode = cfg.mode;
|
||||
|
||||
// Reset block mode
|
||||
if (this._xformMode == this._ENC_XFORM_MODE) {
|
||||
modeCreator = mode.createEncryptor;
|
||||
} else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
|
||||
modeCreator = mode.createDecryptor;
|
||||
// Keep at least one block in the buffer for unpadding
|
||||
this._minBufferSize = 1;
|
||||
}
|
||||
|
||||
if (this._mode && this._mode.__creator == modeCreator) {
|
||||
this._mode.init(this, iv && iv.words);
|
||||
} else {
|
||||
this._mode = modeCreator.call(mode, this, iv && iv.words);
|
||||
this._mode.__creator = modeCreator;
|
||||
}
|
||||
},
|
||||
|
||||
_doProcessBlock: function(words, offset) {
|
||||
this._mode.processBlock(words, offset);
|
||||
},
|
||||
|
||||
_doFinalize: function() {
|
||||
var finalProcessedBlocks;
|
||||
|
||||
// Shortcut
|
||||
var padding = this.cfg.padding;
|
||||
|
||||
// Finalize
|
||||
if (this._xformMode == this._ENC_XFORM_MODE) {
|
||||
// Pad data
|
||||
padding.pad(this._data, this.blockSize);
|
||||
|
||||
// Process final blocks
|
||||
finalProcessedBlocks = this._process( !! 'flush');
|
||||
} else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
|
||||
// Process final blocks
|
||||
finalProcessedBlocks = this._process( !! 'flush');
|
||||
|
||||
// Unpad data
|
||||
padding.unpad(finalProcessedBlocks);
|
||||
}
|
||||
|
||||
return finalProcessedBlocks;
|
||||
},
|
||||
|
||||
blockSize: 128 / 32
|
||||
});
|
||||
|
||||
/**
|
||||
* A collection of cipher parameters.
|
||||
*
|
||||
* @property {WordArray} ciphertext The raw ciphertext.
|
||||
* @property {WordArray} key The key to this ciphertext.
|
||||
* @property {WordArray} iv The IV used in the ciphering operation.
|
||||
* @property {WordArray} salt The salt used with a key derivation function.
|
||||
* @property {Cipher} algorithm The cipher algorithm.
|
||||
* @property {Mode} mode The block mode used in the ciphering operation.
|
||||
* @property {Padding} padding The padding scheme used in the ciphering operation.
|
||||
* @property {number} blockSize The block size of the cipher.
|
||||
* @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
|
||||
*/
|
||||
var CipherParams = C_lib.CipherParams = Base.extend({
|
||||
/**
|
||||
* Initializes a newly created cipher params object.
|
||||
*
|
||||
* @param {Object} cipherParams An object with any of the possible cipher parameters.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var cipherParams = CryptoJS.lib.CipherParams.create({
|
||||
* ciphertext: ciphertextWordArray,
|
||||
* key: keyWordArray,
|
||||
* iv: ivWordArray,
|
||||
* salt: saltWordArray,
|
||||
* algorithm: CryptoJS.algo.AES,
|
||||
* mode: CryptoJS.mode.CBC,
|
||||
* padding: CryptoJS.pad.PKCS7,
|
||||
* blockSize: 4,
|
||||
* formatter: CryptoJS.format.OpenSSL
|
||||
* });
|
||||
*/
|
||||
init: function(cipherParams) {
|
||||
this.mixIn(cipherParams);
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts this cipher params object to a string.
|
||||
*
|
||||
* @param {Format} formatter (Optional) The formatting strategy to use.
|
||||
*
|
||||
* @return {string} The stringified cipher params.
|
||||
*
|
||||
* @throws Error If neither the formatter nor the default formatter is set.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var string = cipherParams + '';
|
||||
* var string = cipherParams.toString();
|
||||
* var string = cipherParams.toString(CryptoJS.format.OpenSSL);
|
||||
*/
|
||||
toString: function(formatter) {
|
||||
return (formatter || this.formatter)
|
||||
.stringify(this);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Format namespace.
|
||||
*/
|
||||
var C_format = C.format = {};
|
||||
|
||||
/**
|
||||
* OpenSSL formatting strategy.
|
||||
*/
|
||||
var OpenSSLFormatter = C_format.OpenSSL = {
|
||||
/**
|
||||
* Converts a cipher params object to an OpenSSL-compatible string.
|
||||
*
|
||||
* @param {CipherParams} cipherParams The cipher params object.
|
||||
*
|
||||
* @return {string} The OpenSSL-compatible string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
|
||||
*/
|
||||
stringify: function(cipherParams) {
|
||||
var wordArray;
|
||||
|
||||
// Shortcuts
|
||||
var ciphertext = cipherParams.ciphertext;
|
||||
var salt = cipherParams.salt;
|
||||
|
||||
// Format
|
||||
if (salt) {
|
||||
wordArray = WordArray.create([0x53616c74, 0x65645f5f])
|
||||
.concat(salt)
|
||||
.concat(ciphertext);
|
||||
} else {
|
||||
wordArray = ciphertext;
|
||||
}
|
||||
|
||||
return wordArray.toString(Base64);
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts an OpenSSL-compatible string to a cipher params object.
|
||||
*
|
||||
* @param {string} openSSLStr The OpenSSL-compatible string.
|
||||
*
|
||||
* @return {CipherParams} The cipher params object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
|
||||
*/
|
||||
parse: function(openSSLStr) {
|
||||
var salt;
|
||||
|
||||
// Parse base64
|
||||
var ciphertext = Base64.parse(openSSLStr);
|
||||
|
||||
// Shortcut
|
||||
var ciphertextWords = ciphertext.words;
|
||||
|
||||
// Test for salt
|
||||
if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
|
||||
// Extract salt
|
||||
salt = WordArray.create(ciphertextWords.slice(2, 4));
|
||||
|
||||
// Remove salt from ciphertext
|
||||
ciphertextWords.splice(0, 4);
|
||||
ciphertext.sigBytes -= 16;
|
||||
}
|
||||
|
||||
return CipherParams.create({
|
||||
ciphertext: ciphertext,
|
||||
salt: salt
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A cipher wrapper that returns ciphertext as a serializable cipher params object.
|
||||
*/
|
||||
var SerializableCipher = C_lib.SerializableCipher = Base.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
|
||||
*/
|
||||
cfg: Base.extend({
|
||||
format: OpenSSLFormatter
|
||||
}),
|
||||
|
||||
/**
|
||||
* Encrypts a message.
|
||||
*
|
||||
* @param {Cipher} cipher The cipher algorithm to use.
|
||||
* @param {WordArray|string} message The message to encrypt.
|
||||
* @param {WordArray} key The key.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @return {CipherParams} A cipher params object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
|
||||
* var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
|
||||
* var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
|
||||
*/
|
||||
encrypt: function(cipher, message, key, cfg) {
|
||||
// Apply config defaults
|
||||
cfg = this.cfg.extend(cfg);
|
||||
|
||||
// Encrypt
|
||||
var encryptor = cipher.createEncryptor(key, cfg);
|
||||
var ciphertext = encryptor.finalize(message);
|
||||
|
||||
// Shortcut
|
||||
var cipherCfg = encryptor.cfg;
|
||||
|
||||
// Create and return serializable cipher params
|
||||
return CipherParams.create({
|
||||
ciphertext: ciphertext,
|
||||
key: key,
|
||||
iv: cipherCfg.iv,
|
||||
algorithm: cipher,
|
||||
mode: cipherCfg.mode,
|
||||
padding: cipherCfg.padding,
|
||||
blockSize: cipher.blockSize,
|
||||
formatter: cfg.format
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Decrypts serialized ciphertext.
|
||||
*
|
||||
* @param {Cipher} cipher The cipher algorithm to use.
|
||||
* @param {CipherParams|string} ciphertext The ciphertext to decrypt.
|
||||
* @param {WordArray} key The key.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @return {WordArray} The plaintext.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
|
||||
* var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
|
||||
*/
|
||||
decrypt: function(cipher, ciphertext, key, cfg) {
|
||||
// Apply config defaults
|
||||
cfg = this.cfg.extend(cfg);
|
||||
|
||||
// Convert string to CipherParams
|
||||
ciphertext = this._parse(ciphertext, cfg.format);
|
||||
|
||||
// Decrypt
|
||||
var plaintext = cipher.createDecryptor(key, cfg)
|
||||
.finalize(ciphertext.ciphertext);
|
||||
|
||||
return plaintext;
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts serialized ciphertext to CipherParams,
|
||||
* else assumed CipherParams already and returns ciphertext unchanged.
|
||||
*
|
||||
* @param {CipherParams|string} ciphertext The ciphertext.
|
||||
* @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
|
||||
*
|
||||
* @return {CipherParams} The unserialized ciphertext.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
|
||||
*/
|
||||
_parse: function(ciphertext, format) {
|
||||
if (typeof ciphertext == 'string') {
|
||||
return format.parse(ciphertext, this);
|
||||
} else {
|
||||
return ciphertext;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Key derivation function namespace.
|
||||
*/
|
||||
var C_kdf = C.kdf = {};
|
||||
|
||||
/**
|
||||
* OpenSSL key derivation function.
|
||||
*/
|
||||
var OpenSSLKdf = C_kdf.OpenSSL = {
|
||||
/**
|
||||
* Derives a key and IV from a password.
|
||||
*
|
||||
* @param {string} password The password to derive from.
|
||||
* @param {number} keySize The size in words of the key to generate.
|
||||
* @param {number} ivSize The size in words of the IV to generate.
|
||||
* @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
|
||||
*
|
||||
* @return {CipherParams} A cipher params object with the key, IV, and salt.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
|
||||
* var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
|
||||
*/
|
||||
execute: function(password, keySize, ivSize, salt) {
|
||||
// Generate random salt
|
||||
if (!salt) {
|
||||
salt = WordArray.random(64 / 8);
|
||||
}
|
||||
|
||||
// Derive key and IV
|
||||
var key = EvpKDF.create({
|
||||
keySize: keySize + ivSize
|
||||
})
|
||||
.compute(password, salt);
|
||||
|
||||
// Separate key and IV
|
||||
var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
|
||||
key.sigBytes = keySize * 4;
|
||||
|
||||
// Return params
|
||||
return CipherParams.create({
|
||||
key: key,
|
||||
iv: iv,
|
||||
salt: salt
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* A serializable cipher wrapper that derives the key from a password,
|
||||
* and returns ciphertext as a serializable cipher params object.
|
||||
*/
|
||||
var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
|
||||
*/
|
||||
cfg: SerializableCipher.cfg.extend({
|
||||
kdf: OpenSSLKdf
|
||||
}),
|
||||
|
||||
/**
|
||||
* Encrypts a message using a password.
|
||||
*
|
||||
* @param {Cipher} cipher The cipher algorithm to use.
|
||||
* @param {WordArray|string} message The message to encrypt.
|
||||
* @param {string} password The password.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @return {CipherParams} A cipher params object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
|
||||
* var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
|
||||
*/
|
||||
encrypt: function(cipher, message, password, cfg) {
|
||||
// Apply config defaults
|
||||
cfg = this.cfg.extend(cfg);
|
||||
|
||||
// Derive key and other params
|
||||
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
|
||||
|
||||
// Add IV to config
|
||||
cfg.iv = derivedParams.iv;
|
||||
|
||||
// Encrypt
|
||||
var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
|
||||
|
||||
// Mix in derived params
|
||||
ciphertext.mixIn(derivedParams);
|
||||
|
||||
return ciphertext;
|
||||
},
|
||||
|
||||
/**
|
||||
* Decrypts serialized ciphertext using a password.
|
||||
*
|
||||
* @param {Cipher} cipher The cipher algorithm to use.
|
||||
* @param {CipherParams|string} ciphertext The ciphertext to decrypt.
|
||||
* @param {string} password The password.
|
||||
* @param {Object} cfg (Optional) The configuration options to use for this operation.
|
||||
*
|
||||
* @return {WordArray} The plaintext.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
|
||||
* var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
|
||||
*/
|
||||
decrypt: function(cipher, ciphertext, password, cfg) {
|
||||
// Apply config defaults
|
||||
cfg = this.cfg.extend(cfg);
|
||||
|
||||
// Convert string to CipherParams
|
||||
ciphertext = this._parse(ciphertext, cfg.format);
|
||||
|
||||
// Derive key and other params
|
||||
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
|
||||
|
||||
// Add IV to config
|
||||
cfg.iv = derivedParams.iv;
|
||||
|
||||
// Decrypt
|
||||
var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
|
||||
|
||||
return plaintext;
|
||||
}
|
||||
});
|
||||
}());
|
||||
|
||||
|
||||
/**
|
||||
* Cipher Feedback block mode.
|
||||
*/
|
||||
CryptoJS.mode.CFB = (function() {
|
||||
var CFB = CryptoJS.lib.BlockCipherMode.extend();
|
||||
|
||||
CFB.Encryptor = CFB.extend({
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher;
|
||||
var blockSize = cipher.blockSize;
|
||||
|
||||
generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
|
||||
|
||||
// Remember this block to use with next block
|
||||
this._prevBlock = words.slice(offset, offset + blockSize);
|
||||
}
|
||||
});
|
||||
|
||||
CFB.Decryptor = CFB.extend({
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher;
|
||||
var blockSize = cipher.blockSize;
|
||||
|
||||
// Remember this block to use with next block
|
||||
var thisBlock = words.slice(offset, offset + blockSize);
|
||||
|
||||
generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
|
||||
|
||||
// This block becomes the previous block
|
||||
this._prevBlock = thisBlock;
|
||||
}
|
||||
});
|
||||
|
||||
function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
|
||||
var keystream;
|
||||
|
||||
// Shortcut
|
||||
var iv = this._iv;
|
||||
|
||||
// Generate keystream
|
||||
if (iv) {
|
||||
keystream = iv.slice(0);
|
||||
|
||||
// Remove IV for subsequent blocks
|
||||
this._iv = undefined;
|
||||
} else {
|
||||
keystream = this._prevBlock;
|
||||
}
|
||||
cipher.encryptBlock(keystream, 0);
|
||||
|
||||
// Encrypt
|
||||
for (var i = 0; i < blockSize; i++) {
|
||||
words[offset + i] ^= keystream[i];
|
||||
}
|
||||
}
|
||||
|
||||
return CFB;
|
||||
}());
|
||||
|
||||
|
||||
/**
|
||||
* Counter block mode.
|
||||
*/
|
||||
CryptoJS.mode.CTR = (function() {
|
||||
var CTR = CryptoJS.lib.BlockCipherMode.extend();
|
||||
|
||||
var Encryptor = CTR.Encryptor = CTR.extend({
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher
|
||||
var blockSize = cipher.blockSize;
|
||||
var iv = this._iv;
|
||||
var counter = this._counter;
|
||||
|
||||
// Generate keystream
|
||||
if (iv) {
|
||||
counter = this._counter = iv.slice(0);
|
||||
|
||||
// Remove IV for subsequent blocks
|
||||
this._iv = undefined;
|
||||
}
|
||||
var keystream = counter.slice(0);
|
||||
cipher.encryptBlock(keystream, 0);
|
||||
|
||||
// Increment counter
|
||||
counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
|
||||
|
||||
// Encrypt
|
||||
for (var i = 0; i < blockSize; i++) {
|
||||
words[offset + i] ^= keystream[i];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
CTR.Decryptor = Encryptor;
|
||||
|
||||
return CTR;
|
||||
}());
|
||||
|
||||
|
||||
/** @preserve
|
||||
* Counter block mode compatible with Dr Brian Gladman fileenc.c
|
||||
* derived from CryptoJS.mode.CTR
|
||||
* Jan Hruby [email protected]
|
||||
*/
|
||||
CryptoJS.mode.CTRGladman = (function() {
|
||||
var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
|
||||
|
||||
function incWord(word) {
|
||||
if (((word >> 24) & 0xff) === 0xff) { //overflow
|
||||
var b1 = (word >> 16) & 0xff;
|
||||
var b2 = (word >> 8) & 0xff;
|
||||
var b3 = word & 0xff;
|
||||
|
||||
if (b1 === 0xff) // overflow b1
|
||||
{
|
||||
b1 = 0;
|
||||
if (b2 === 0xff) {
|
||||
b2 = 0;
|
||||
if (b3 === 0xff) {
|
||||
b3 = 0;
|
||||
} else {
|
||||
++b3;
|
||||
}
|
||||
} else {
|
||||
++b2;
|
||||
}
|
||||
} else {
|
||||
++b1;
|
||||
}
|
||||
|
||||
word = 0;
|
||||
word += (b1 << 16);
|
||||
word += (b2 << 8);
|
||||
word += b3;
|
||||
} else {
|
||||
word += (0x01 << 24);
|
||||
}
|
||||
return word;
|
||||
}
|
||||
|
||||
function incCounter(counter) {
|
||||
if ((counter[0] = incWord(counter[0])) === 0) {
|
||||
// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
|
||||
counter[1] = incWord(counter[1]);
|
||||
}
|
||||
return counter;
|
||||
}
|
||||
|
||||
var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher
|
||||
var blockSize = cipher.blockSize;
|
||||
var iv = this._iv;
|
||||
var counter = this._counter;
|
||||
|
||||
// Generate keystream
|
||||
if (iv) {
|
||||
counter = this._counter = iv.slice(0);
|
||||
|
||||
// Remove IV for subsequent blocks
|
||||
this._iv = undefined;
|
||||
}
|
||||
|
||||
incCounter(counter);
|
||||
|
||||
var keystream = counter.slice(0);
|
||||
cipher.encryptBlock(keystream, 0);
|
||||
|
||||
// Encrypt
|
||||
for (var i = 0; i < blockSize; i++) {
|
||||
words[offset + i] ^= keystream[i];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
CTRGladman.Decryptor = Encryptor;
|
||||
|
||||
return CTRGladman;
|
||||
}());
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Output Feedback block mode.
|
||||
*/
|
||||
CryptoJS.mode.OFB = (function() {
|
||||
var OFB = CryptoJS.lib.BlockCipherMode.extend();
|
||||
|
||||
var Encryptor = OFB.Encryptor = OFB.extend({
|
||||
processBlock: function(words, offset) {
|
||||
// Shortcuts
|
||||
var cipher = this._cipher
|
||||
var blockSize = cipher.blockSize;
|
||||
var iv = this._iv;
|
||||
var keystream = this._keystream;
|
||||
|
||||
// Generate keystream
|
||||
if (iv) {
|
||||
keystream = this._keystream = iv.slice(0);
|
||||
|
||||
// Remove IV for subsequent blocks
|
||||
this._iv = undefined;
|
||||
}
|
||||
cipher.encryptBlock(keystream, 0);
|
||||
|
||||
// Encrypt
|
||||
for (var i = 0; i < blockSize; i++) {
|
||||
words[offset + i] ^= keystream[i];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
OFB.Decryptor = Encryptor;
|
||||
|
||||
return OFB;
|
||||
}());
|
||||
|
||||
|
||||
/**
|
||||
* Electronic Codebook block mode.
|
||||
*/
|
||||
CryptoJS.mode.ECB = (function() {
|
||||
var ECB = CryptoJS.lib.BlockCipherMode.extend();
|
||||
|
||||
ECB.Encryptor = ECB.extend({
|
||||
processBlock: function(words, offset) {
|
||||
this._cipher.encryptBlock(words, offset);
|
||||
}
|
||||
});
|
||||
|
||||
ECB.Decryptor = ECB.extend({
|
||||
processBlock: function(words, offset) {
|
||||
this._cipher.decryptBlock(words, offset);
|
||||
}
|
||||
});
|
||||
|
||||
return ECB;
|
||||
}());
|
||||
|
||||
|
||||
/**
|
||||
* ANSI X.923 padding strategy.
|
||||
*/
|
||||
CryptoJS.pad.AnsiX923 = {
|
||||
pad: function(data, blockSize) {
|
||||
// Shortcuts
|
||||
var dataSigBytes = data.sigBytes;
|
||||
var blockSizeBytes = blockSize * 4;
|
||||
|
||||
// Count padding bytes
|
||||
var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
|
||||
|
||||
// Compute last byte position
|
||||
var lastBytePos = dataSigBytes + nPaddingBytes - 1;
|
||||
|
||||
// Pad
|
||||
data.clamp();
|
||||
data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
|
||||
data.sigBytes += nPaddingBytes;
|
||||
},
|
||||
|
||||
unpad: function(data) {
|
||||
// Get number of padding bytes from last byte
|
||||
var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
|
||||
|
||||
// Remove padding
|
||||
data.sigBytes -= nPaddingBytes;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* ISO 10126 padding strategy.
|
||||
*/
|
||||
CryptoJS.pad.Iso10126 = {
|
||||
pad: function(data, blockSize) {
|
||||
// Shortcut
|
||||
var blockSizeBytes = blockSize * 4;
|
||||
|
||||
// Count padding bytes
|
||||
var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
|
||||
|
||||
// Pad
|
||||
data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1))
|
||||
.
|
||||
concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
|
||||
},
|
||||
|
||||
unpad: function(data) {
|
||||
// Get number of padding bytes from last byte
|
||||
var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
|
||||
|
||||
// Remove padding
|
||||
data.sigBytes -= nPaddingBytes;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* ISO/IEC 9797-1 Padding Method 2.
|
||||
*/
|
||||
CryptoJS.pad.Iso97971 = {
|
||||
pad: function(data, blockSize) {
|
||||
// Add 0x80 byte
|
||||
data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
|
||||
|
||||
// Zero pad the rest
|
||||
CryptoJS.pad.ZeroPadding.pad(data, blockSize);
|
||||
},
|
||||
|
||||
unpad: function(data) {
|
||||
// Remove zero padding
|
||||
CryptoJS.pad.ZeroPadding.unpad(data);
|
||||
|
||||
// Remove one more byte -- the 0x80 byte
|
||||
data.sigBytes--;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Zero padding strategy.
|
||||
*/
|
||||
CryptoJS.pad.ZeroPadding = {
|
||||
pad: function(data, blockSize) {
|
||||
// Shortcut
|
||||
var blockSizeBytes = blockSize * 4;
|
||||
|
||||
// Pad
|
||||
data.clamp();
|
||||
data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
|
||||
},
|
||||
|
||||
unpad: function(data) {
|
||||
// Shortcut
|
||||
var dataWords = data.words;
|
||||
|
||||
// Unpad
|
||||
var i = data.sigBytes - 1;
|
||||
for (var i = data.sigBytes - 1; i >= 0; i--) {
|
||||
if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
|
||||
data.sigBytes = i + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A noop padding strategy.
|
||||
*/
|
||||
CryptoJS.pad.NoPadding = {
|
||||
pad: function() {},
|
||||
|
||||
unpad: function() {}
|
||||
};
|
||||
|
||||
|
||||
(function(undefined) {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var CipherParams = C_lib.CipherParams;
|
||||
var C_enc = C.enc;
|
||||
var Hex = C_enc.Hex;
|
||||
var C_format = C.format;
|
||||
|
||||
var HexFormatter = C_format.Hex = {
|
||||
/**
|
||||
* Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
|
||||
*
|
||||
* @param {CipherParams} cipherParams The cipher params object.
|
||||
*
|
||||
* @return {string} The hexadecimally encoded string.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var hexString = CryptoJS.format.Hex.stringify(cipherParams);
|
||||
*/
|
||||
stringify: function(cipherParams) {
|
||||
return cipherParams.ciphertext.toString(Hex);
|
||||
},
|
||||
|
||||
/**
|
||||
* Converts a hexadecimally encoded ciphertext string to a cipher params object.
|
||||
*
|
||||
* @param {string} input The hexadecimally encoded string.
|
||||
*
|
||||
* @return {CipherParams} The cipher params object.
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var cipherParams = CryptoJS.format.Hex.parse(hexString);
|
||||
*/
|
||||
parse: function(input) {
|
||||
var ciphertext = Hex.parse(input);
|
||||
return CipherParams.create({
|
||||
ciphertext: ciphertext
|
||||
});
|
||||
}
|
||||
};
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var BlockCipher = C_lib.BlockCipher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Lookup tables
|
||||
var SBOX = [];
|
||||
var INV_SBOX = [];
|
||||
var SUB_MIX_0 = [];
|
||||
var SUB_MIX_1 = [];
|
||||
var SUB_MIX_2 = [];
|
||||
var SUB_MIX_3 = [];
|
||||
var INV_SUB_MIX_0 = [];
|
||||
var INV_SUB_MIX_1 = [];
|
||||
var INV_SUB_MIX_2 = [];
|
||||
var INV_SUB_MIX_3 = [];
|
||||
|
||||
// Compute lookup tables
|
||||
(function() {
|
||||
// Compute double table
|
||||
var d = [];
|
||||
for (var i = 0; i < 256; i++) {
|
||||
if (i < 128) {
|
||||
d[i] = i << 1;
|
||||
} else {
|
||||
d[i] = (i << 1) ^ 0x11b;
|
||||
}
|
||||
}
|
||||
|
||||
// Walk GF(2^8)
|
||||
var x = 0;
|
||||
var xi = 0;
|
||||
for (var i = 0; i < 256; i++) {
|
||||
// Compute sbox
|
||||
var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
|
||||
sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
|
||||
SBOX[x] = sx;
|
||||
INV_SBOX[sx] = x;
|
||||
|
||||
// Compute multiplication
|
||||
var x2 = d[x];
|
||||
var x4 = d[x2];
|
||||
var x8 = d[x4];
|
||||
|
||||
// Compute sub bytes, mix columns tables
|
||||
var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
|
||||
SUB_MIX_0[x] = (t << 24) | (t >>> 8);
|
||||
SUB_MIX_1[x] = (t << 16) | (t >>> 16);
|
||||
SUB_MIX_2[x] = (t << 8) | (t >>> 24);
|
||||
SUB_MIX_3[x] = t;
|
||||
|
||||
// Compute inv sub bytes, inv mix columns tables
|
||||
var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
|
||||
INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
|
||||
INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
|
||||
INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
|
||||
INV_SUB_MIX_3[sx] = t;
|
||||
|
||||
// Compute next counter
|
||||
if (!x) {
|
||||
x = xi = 1;
|
||||
} else {
|
||||
x = x2 ^ d[d[d[x8 ^ x2]]];
|
||||
xi ^= d[d[xi]];
|
||||
}
|
||||
}
|
||||
}());
|
||||
|
||||
// Precomputed Rcon lookup
|
||||
var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
|
||||
|
||||
/**
|
||||
* AES block cipher algorithm.
|
||||
*/
|
||||
var AES = C_algo.AES = BlockCipher.extend({
|
||||
_doReset: function() {
|
||||
var t;
|
||||
|
||||
// Skip reset of nRounds has been set before and key did not change
|
||||
if (this._nRounds && this._keyPriorReset === this._key) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Shortcuts
|
||||
var key = this._keyPriorReset = this._key;
|
||||
var keyWords = key.words;
|
||||
var keySize = key.sigBytes / 4;
|
||||
|
||||
// Compute number of rounds
|
||||
var nRounds = this._nRounds = keySize + 6;
|
||||
|
||||
// Compute number of key schedule rows
|
||||
var ksRows = (nRounds + 1) * 4;
|
||||
|
||||
// Compute key schedule
|
||||
var keySchedule = this._keySchedule = [];
|
||||
for (var ksRow = 0; ksRow < ksRows; ksRow++) {
|
||||
if (ksRow < keySize) {
|
||||
keySchedule[ksRow] = keyWords[ksRow];
|
||||
} else {
|
||||
t = keySchedule[ksRow - 1];
|
||||
|
||||
if (!(ksRow % keySize)) {
|
||||
// Rot word
|
||||
t = (t << 8) | (t >>> 24);
|
||||
|
||||
// Sub word
|
||||
t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
|
||||
|
||||
// Mix Rcon
|
||||
t ^= RCON[(ksRow / keySize) | 0] << 24;
|
||||
} else if (keySize > 6 && ksRow % keySize == 4) {
|
||||
// Sub word
|
||||
t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
|
||||
}
|
||||
|
||||
keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
|
||||
}
|
||||
}
|
||||
|
||||
// Compute inv key schedule
|
||||
var invKeySchedule = this._invKeySchedule = [];
|
||||
for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
|
||||
var ksRow = ksRows - invKsRow;
|
||||
|
||||
if (invKsRow % 4) {
|
||||
var t = keySchedule[ksRow];
|
||||
} else {
|
||||
var t = keySchedule[ksRow - 4];
|
||||
}
|
||||
|
||||
if (invKsRow < 4 || ksRow <= 4) {
|
||||
invKeySchedule[invKsRow] = t;
|
||||
} else {
|
||||
invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
encryptBlock: function(M, offset) {
|
||||
this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
|
||||
},
|
||||
|
||||
decryptBlock: function(M, offset) {
|
||||
// Swap 2nd and 4th rows
|
||||
var t = M[offset + 1];
|
||||
M[offset + 1] = M[offset + 3];
|
||||
M[offset + 3] = t;
|
||||
|
||||
this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
|
||||
|
||||
// Inv swap 2nd and 4th rows
|
||||
var t = M[offset + 1];
|
||||
M[offset + 1] = M[offset + 3];
|
||||
M[offset + 3] = t;
|
||||
},
|
||||
|
||||
_doCryptBlock: function(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
|
||||
// Shortcut
|
||||
var nRounds = this._nRounds;
|
||||
|
||||
// Get input, add round key
|
||||
var s0 = M[offset] ^ keySchedule[0];
|
||||
var s1 = M[offset + 1] ^ keySchedule[1];
|
||||
var s2 = M[offset + 2] ^ keySchedule[2];
|
||||
var s3 = M[offset + 3] ^ keySchedule[3];
|
||||
|
||||
// Key schedule row counter
|
||||
var ksRow = 4;
|
||||
|
||||
// Rounds
|
||||
for (var round = 1; round < nRounds; round++) {
|
||||
// Shift rows, sub bytes, mix columns, add round key
|
||||
var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
|
||||
var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
|
||||
var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
|
||||
var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
|
||||
|
||||
// Update state
|
||||
s0 = t0;
|
||||
s1 = t1;
|
||||
s2 = t2;
|
||||
s3 = t3;
|
||||
}
|
||||
|
||||
// Shift rows, sub bytes, add round key
|
||||
var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
|
||||
var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
|
||||
var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
|
||||
var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
|
||||
|
||||
// Set output
|
||||
M[offset] = t0;
|
||||
M[offset + 1] = t1;
|
||||
M[offset + 2] = t2;
|
||||
M[offset + 3] = t3;
|
||||
},
|
||||
|
||||
keySize: 256 / 32
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.AES = BlockCipher._createHelper(AES);
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var WordArray = C_lib.WordArray;
|
||||
var BlockCipher = C_lib.BlockCipher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Permuted Choice 1 constants
|
||||
var PC1 = [
|
||||
57, 49, 41, 33, 25, 17, 9, 1,
|
||||
58, 50, 42, 34, 26, 18, 10, 2,
|
||||
59, 51, 43, 35, 27, 19, 11, 3,
|
||||
60, 52, 44, 36, 63, 55, 47, 39,
|
||||
31, 23, 15, 7, 62, 54, 46, 38,
|
||||
30, 22, 14, 6, 61, 53, 45, 37,
|
||||
29, 21, 13, 5, 28, 20, 12, 4];
|
||||
|
||||
// Permuted Choice 2 constants
|
||||
var PC2 = [
|
||||
14, 17, 11, 24, 1, 5,
|
||||
3, 28, 15, 6, 21, 10,
|
||||
23, 19, 12, 4, 26, 8,
|
||||
16, 7, 27, 20, 13, 2,
|
||||
41, 52, 31, 37, 47, 55,
|
||||
30, 40, 51, 45, 33, 48,
|
||||
44, 49, 39, 56, 34, 53,
|
||||
46, 42, 50, 36, 29, 32];
|
||||
|
||||
// Cumulative bit shift constants
|
||||
var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
|
||||
|
||||
// SBOXes and round permutation constants
|
||||
var SBOX_P = [{
|
||||
0x0: 0x808200,
|
||||
0x10000000: 0x8000,
|
||||
0x20000000: 0x808002,
|
||||
0x30000000: 0x2,
|
||||
0x40000000: 0x200,
|
||||
0x50000000: 0x808202,
|
||||
0x60000000: 0x800202,
|
||||
0x70000000: 0x800000,
|
||||
0x80000000: 0x202,
|
||||
0x90000000: 0x800200,
|
||||
0xa0000000: 0x8200,
|
||||
0xb0000000: 0x808000,
|
||||
0xc0000000: 0x8002,
|
||||
0xd0000000: 0x800002,
|
||||
0xe0000000: 0x0,
|
||||
0xf0000000: 0x8202,
|
||||
0x8000000: 0x0,
|
||||
0x18000000: 0x808202,
|
||||
0x28000000: 0x8202,
|
||||
0x38000000: 0x8000,
|
||||
0x48000000: 0x808200,
|
||||
0x58000000: 0x200,
|
||||
0x68000000: 0x808002,
|
||||
0x78000000: 0x2,
|
||||
0x88000000: 0x800200,
|
||||
0x98000000: 0x8200,
|
||||
0xa8000000: 0x808000,
|
||||
0xb8000000: 0x800202,
|
||||
0xc8000000: 0x800002,
|
||||
0xd8000000: 0x8002,
|
||||
0xe8000000: 0x202,
|
||||
0xf8000000: 0x800000,
|
||||
0x1: 0x8000,
|
||||
0x10000001: 0x2,
|
||||
0x20000001: 0x808200,
|
||||
0x30000001: 0x800000,
|
||||
0x40000001: 0x808002,
|
||||
0x50000001: 0x8200,
|
||||
0x60000001: 0x200,
|
||||
0x70000001: 0x800202,
|
||||
0x80000001: 0x808202,
|
||||
0x90000001: 0x808000,
|
||||
0xa0000001: 0x800002,
|
||||
0xb0000001: 0x8202,
|
||||
0xc0000001: 0x202,
|
||||
0xd0000001: 0x800200,
|
||||
0xe0000001: 0x8002,
|
||||
0xf0000001: 0x0,
|
||||
0x8000001: 0x808202,
|
||||
0x18000001: 0x808000,
|
||||
0x28000001: 0x800000,
|
||||
0x38000001: 0x200,
|
||||
0x48000001: 0x8000,
|
||||
0x58000001: 0x800002,
|
||||
0x68000001: 0x2,
|
||||
0x78000001: 0x8202,
|
||||
0x88000001: 0x8002,
|
||||
0x98000001: 0x800202,
|
||||
0xa8000001: 0x202,
|
||||
0xb8000001: 0x808200,
|
||||
0xc8000001: 0x800200,
|
||||
0xd8000001: 0x0,
|
||||
0xe8000001: 0x8200,
|
||||
0xf8000001: 0x808002
|
||||
}, {
|
||||
0x0: 0x40084010,
|
||||
0x1000000: 0x4000,
|
||||
0x2000000: 0x80000,
|
||||
0x3000000: 0x40080010,
|
||||
0x4000000: 0x40000010,
|
||||
0x5000000: 0x40084000,
|
||||
0x6000000: 0x40004000,
|
||||
0x7000000: 0x10,
|
||||
0x8000000: 0x84000,
|
||||
0x9000000: 0x40004010,
|
||||
0xa000000: 0x40000000,
|
||||
0xb000000: 0x84010,
|
||||
0xc000000: 0x80010,
|
||||
0xd000000: 0x0,
|
||||
0xe000000: 0x4010,
|
||||
0xf000000: 0x40080000,
|
||||
0x800000: 0x40004000,
|
||||
0x1800000: 0x84010,
|
||||
0x2800000: 0x10,
|
||||
0x3800000: 0x40004010,
|
||||
0x4800000: 0x40084010,
|
||||
0x5800000: 0x40000000,
|
||||
0x6800000: 0x80000,
|
||||
0x7800000: 0x40080010,
|
||||
0x8800000: 0x80010,
|
||||
0x9800000: 0x0,
|
||||
0xa800000: 0x4000,
|
||||
0xb800000: 0x40080000,
|
||||
0xc800000: 0x40000010,
|
||||
0xd800000: 0x84000,
|
||||
0xe800000: 0x40084000,
|
||||
0xf800000: 0x4010,
|
||||
0x10000000: 0x0,
|
||||
0x11000000: 0x40080010,
|
||||
0x12000000: 0x40004010,
|
||||
0x13000000: 0x40084000,
|
||||
0x14000000: 0x40080000,
|
||||
0x15000000: 0x10,
|
||||
0x16000000: 0x84010,
|
||||
0x17000000: 0x4000,
|
||||
0x18000000: 0x4010,
|
||||
0x19000000: 0x80000,
|
||||
0x1a000000: 0x80010,
|
||||
0x1b000000: 0x40000010,
|
||||
0x1c000000: 0x84000,
|
||||
0x1d000000: 0x40004000,
|
||||
0x1e000000: 0x40000000,
|
||||
0x1f000000: 0x40084010,
|
||||
0x10800000: 0x84010,
|
||||
0x11800000: 0x80000,
|
||||
0x12800000: 0x40080000,
|
||||
0x13800000: 0x4000,
|
||||
0x14800000: 0x40004000,
|
||||
0x15800000: 0x40084010,
|
||||
0x16800000: 0x10,
|
||||
0x17800000: 0x40000000,
|
||||
0x18800000: 0x40084000,
|
||||
0x19800000: 0x40000010,
|
||||
0x1a800000: 0x40004010,
|
||||
0x1b800000: 0x80010,
|
||||
0x1c800000: 0x0,
|
||||
0x1d800000: 0x4010,
|
||||
0x1e800000: 0x40080010,
|
||||
0x1f800000: 0x84000
|
||||
}, {
|
||||
0x0: 0x104,
|
||||
0x100000: 0x0,
|
||||
0x200000: 0x4000100,
|
||||
0x300000: 0x10104,
|
||||
0x400000: 0x10004,
|
||||
0x500000: 0x4000004,
|
||||
0x600000: 0x4010104,
|
||||
0x700000: 0x4010000,
|
||||
0x800000: 0x4000000,
|
||||
0x900000: 0x4010100,
|
||||
0xa00000: 0x10100,
|
||||
0xb00000: 0x4010004,
|
||||
0xc00000: 0x4000104,
|
||||
0xd00000: 0x10000,
|
||||
0xe00000: 0x4,
|
||||
0xf00000: 0x100,
|
||||
0x80000: 0x4010100,
|
||||
0x180000: 0x4010004,
|
||||
0x280000: 0x0,
|
||||
0x380000: 0x4000100,
|
||||
0x480000: 0x4000004,
|
||||
0x580000: 0x10000,
|
||||
0x680000: 0x10004,
|
||||
0x780000: 0x104,
|
||||
0x880000: 0x4,
|
||||
0x980000: 0x100,
|
||||
0xa80000: 0x4010000,
|
||||
0xb80000: 0x10104,
|
||||
0xc80000: 0x10100,
|
||||
0xd80000: 0x4000104,
|
||||
0xe80000: 0x4010104,
|
||||
0xf80000: 0x4000000,
|
||||
0x1000000: 0x4010100,
|
||||
0x1100000: 0x10004,
|
||||
0x1200000: 0x10000,
|
||||
0x1300000: 0x4000100,
|
||||
0x1400000: 0x100,
|
||||
0x1500000: 0x4010104,
|
||||
0x1600000: 0x4000004,
|
||||
0x1700000: 0x0,
|
||||
0x1800000: 0x4000104,
|
||||
0x1900000: 0x4000000,
|
||||
0x1a00000: 0x4,
|
||||
0x1b00000: 0x10100,
|
||||
0x1c00000: 0x4010000,
|
||||
0x1d00000: 0x104,
|
||||
0x1e00000: 0x10104,
|
||||
0x1f00000: 0x4010004,
|
||||
0x1080000: 0x4000000,
|
||||
0x1180000: 0x104,
|
||||
0x1280000: 0x4010100,
|
||||
0x1380000: 0x0,
|
||||
0x1480000: 0x10004,
|
||||
0x1580000: 0x4000100,
|
||||
0x1680000: 0x100,
|
||||
0x1780000: 0x4010004,
|
||||
0x1880000: 0x10000,
|
||||
0x1980000: 0x4010104,
|
||||
0x1a80000: 0x10104,
|
||||
0x1b80000: 0x4000004,
|
||||
0x1c80000: 0x4000104,
|
||||
0x1d80000: 0x4010000,
|
||||
0x1e80000: 0x4,
|
||||
0x1f80000: 0x10100
|
||||
}, {
|
||||
0x0: 0x80401000,
|
||||
0x10000: 0x80001040,
|
||||
0x20000: 0x401040,
|
||||
0x30000: 0x80400000,
|
||||
0x40000: 0x0,
|
||||
0x50000: 0x401000,
|
||||
0x60000: 0x80000040,
|
||||
0x70000: 0x400040,
|
||||
0x80000: 0x80000000,
|
||||
0x90000: 0x400000,
|
||||
0xa0000: 0x40,
|
||||
0xb0000: 0x80001000,
|
||||
0xc0000: 0x80400040,
|
||||
0xd0000: 0x1040,
|
||||
0xe0000: 0x1000,
|
||||
0xf0000: 0x80401040,
|
||||
0x8000: 0x80001040,
|
||||
0x18000: 0x40,
|
||||
0x28000: 0x80400040,
|
||||
0x38000: 0x80001000,
|
||||
0x48000: 0x401000,
|
||||
0x58000: 0x80401040,
|
||||
0x68000: 0x0,
|
||||
0x78000: 0x80400000,
|
||||
0x88000: 0x1000,
|
||||
0x98000: 0x80401000,
|
||||
0xa8000: 0x400000,
|
||||
0xb8000: 0x1040,
|
||||
0xc8000: 0x80000000,
|
||||
0xd8000: 0x400040,
|
||||
0xe8000: 0x401040,
|
||||
0xf8000: 0x80000040,
|
||||
0x100000: 0x400040,
|
||||
0x110000: 0x401000,
|
||||
0x120000: 0x80000040,
|
||||
0x130000: 0x0,
|
||||
0x140000: 0x1040,
|
||||
0x150000: 0x80400040,
|
||||
0x160000: 0x80401000,
|
||||
0x170000: 0x80001040,
|
||||
0x180000: 0x80401040,
|
||||
0x190000: 0x80000000,
|
||||
0x1a0000: 0x80400000,
|
||||
0x1b0000: 0x401040,
|
||||
0x1c0000: 0x80001000,
|
||||
0x1d0000: 0x400000,
|
||||
0x1e0000: 0x40,
|
||||
0x1f0000: 0x1000,
|
||||
0x108000: 0x80400000,
|
||||
0x118000: 0x80401040,
|
||||
0x128000: 0x0,
|
||||
0x138000: 0x401000,
|
||||
0x148000: 0x400040,
|
||||
0x158000: 0x80000000,
|
||||
0x168000: 0x80001040,
|
||||
0x178000: 0x40,
|
||||
0x188000: 0x80000040,
|
||||
0x198000: 0x1000,
|
||||
0x1a8000: 0x80001000,
|
||||
0x1b8000: 0x80400040,
|
||||
0x1c8000: 0x1040,
|
||||
0x1d8000: 0x80401000,
|
||||
0x1e8000: 0x400000,
|
||||
0x1f8000: 0x401040
|
||||
}, {
|
||||
0x0: 0x80,
|
||||
0x1000: 0x1040000,
|
||||
0x2000: 0x40000,
|
||||
0x3000: 0x20000000,
|
||||
0x4000: 0x20040080,
|
||||
0x5000: 0x1000080,
|
||||
0x6000: 0x21000080,
|
||||
0x7000: 0x40080,
|
||||
0x8000: 0x1000000,
|
||||
0x9000: 0x20040000,
|
||||
0xa000: 0x20000080,
|
||||
0xb000: 0x21040080,
|
||||
0xc000: 0x21040000,
|
||||
0xd000: 0x0,
|
||||
0xe000: 0x1040080,
|
||||
0xf000: 0x21000000,
|
||||
0x800: 0x1040080,
|
||||
0x1800: 0x21000080,
|
||||
0x2800: 0x80,
|
||||
0x3800: 0x1040000,
|
||||
0x4800: 0x40000,
|
||||
0x5800: 0x20040080,
|
||||
0x6800: 0x21040000,
|
||||
0x7800: 0x20000000,
|
||||
0x8800: 0x20040000,
|
||||
0x9800: 0x0,
|
||||
0xa800: 0x21040080,
|
||||
0xb800: 0x1000080,
|
||||
0xc800: 0x20000080,
|
||||
0xd800: 0x21000000,
|
||||
0xe800: 0x1000000,
|
||||
0xf800: 0x40080,
|
||||
0x10000: 0x40000,
|
||||
0x11000: 0x80,
|
||||
0x12000: 0x20000000,
|
||||
0x13000: 0x21000080,
|
||||
0x14000: 0x1000080,
|
||||
0x15000: 0x21040000,
|
||||
0x16000: 0x20040080,
|
||||
0x17000: 0x1000000,
|
||||
0x18000: 0x21040080,
|
||||
0x19000: 0x21000000,
|
||||
0x1a000: 0x1040000,
|
||||
0x1b000: 0x20040000,
|
||||
0x1c000: 0x40080,
|
||||
0x1d000: 0x20000080,
|
||||
0x1e000: 0x0,
|
||||
0x1f000: 0x1040080,
|
||||
0x10800: 0x21000080,
|
||||
0x11800: 0x1000000,
|
||||
0x12800: 0x1040000,
|
||||
0x13800: 0x20040080,
|
||||
0x14800: 0x20000000,
|
||||
0x15800: 0x1040080,
|
||||
0x16800: 0x80,
|
||||
0x17800: 0x21040000,
|
||||
0x18800: 0x40080,
|
||||
0x19800: 0x21040080,
|
||||
0x1a800: 0x0,
|
||||
0x1b800: 0x21000000,
|
||||
0x1c800: 0x1000080,
|
||||
0x1d800: 0x40000,
|
||||
0x1e800: 0x20040000,
|
||||
0x1f800: 0x20000080
|
||||
}, {
|
||||
0x0: 0x10000008,
|
||||
0x100: 0x2000,
|
||||
0x200: 0x10200000,
|
||||
0x300: 0x10202008,
|
||||
0x400: 0x10002000,
|
||||
0x500: 0x200000,
|
||||
0x600: 0x200008,
|
||||
0x700: 0x10000000,
|
||||
0x800: 0x0,
|
||||
0x900: 0x10002008,
|
||||
0xa00: 0x202000,
|
||||
0xb00: 0x8,
|
||||
0xc00: 0x10200008,
|
||||
0xd00: 0x202008,
|
||||
0xe00: 0x2008,
|
||||
0xf00: 0x10202000,
|
||||
0x80: 0x10200000,
|
||||
0x180: 0x10202008,
|
||||
0x280: 0x8,
|
||||
0x380: 0x200000,
|
||||
0x480: 0x202008,
|
||||
0x580: 0x10000008,
|
||||
0x680: 0x10002000,
|
||||
0x780: 0x2008,
|
||||
0x880: 0x200008,
|
||||
0x980: 0x2000,
|
||||
0xa80: 0x10002008,
|
||||
0xb80: 0x10200008,
|
||||
0xc80: 0x0,
|
||||
0xd80: 0x10202000,
|
||||
0xe80: 0x202000,
|
||||
0xf80: 0x10000000,
|
||||
0x1000: 0x10002000,
|
||||
0x1100: 0x10200008,
|
||||
0x1200: 0x10202008,
|
||||
0x1300: 0x2008,
|
||||
0x1400: 0x200000,
|
||||
0x1500: 0x10000000,
|
||||
0x1600: 0x10000008,
|
||||
0x1700: 0x202000,
|
||||
0x1800: 0x202008,
|
||||
0x1900: 0x0,
|
||||
0x1a00: 0x8,
|
||||
0x1b00: 0x10200000,
|
||||
0x1c00: 0x2000,
|
||||
0x1d00: 0x10002008,
|
||||
0x1e00: 0x10202000,
|
||||
0x1f00: 0x200008,
|
||||
0x1080: 0x8,
|
||||
0x1180: 0x202000,
|
||||
0x1280: 0x200000,
|
||||
0x1380: 0x10000008,
|
||||
0x1480: 0x10002000,
|
||||
0x1580: 0x2008,
|
||||
0x1680: 0x10202008,
|
||||
0x1780: 0x10200000,
|
||||
0x1880: 0x10202000,
|
||||
0x1980: 0x10200008,
|
||||
0x1a80: 0x2000,
|
||||
0x1b80: 0x202008,
|
||||
0x1c80: 0x200008,
|
||||
0x1d80: 0x0,
|
||||
0x1e80: 0x10000000,
|
||||
0x1f80: 0x10002008
|
||||
}, {
|
||||
0x0: 0x100000,
|
||||
0x10: 0x2000401,
|
||||
0x20: 0x400,
|
||||
0x30: 0x100401,
|
||||
0x40: 0x2100401,
|
||||
0x50: 0x0,
|
||||
0x60: 0x1,
|
||||
0x70: 0x2100001,
|
||||
0x80: 0x2000400,
|
||||
0x90: 0x100001,
|
||||
0xa0: 0x2000001,
|
||||
0xb0: 0x2100400,
|
||||
0xc0: 0x2100000,
|
||||
0xd0: 0x401,
|
||||
0xe0: 0x100400,
|
||||
0xf0: 0x2000000,
|
||||
0x8: 0x2100001,
|
||||
0x18: 0x0,
|
||||
0x28: 0x2000401,
|
||||
0x38: 0x2100400,
|
||||
0x48: 0x100000,
|
||||
0x58: 0x2000001,
|
||||
0x68: 0x2000000,
|
||||
0x78: 0x401,
|
||||
0x88: 0x100401,
|
||||
0x98: 0x2000400,
|
||||
0xa8: 0x2100000,
|
||||
0xb8: 0x100001,
|
||||
0xc8: 0x400,
|
||||
0xd8: 0x2100401,
|
||||
0xe8: 0x1,
|
||||
0xf8: 0x100400,
|
||||
0x100: 0x2000000,
|
||||
0x110: 0x100000,
|
||||
0x120: 0x2000401,
|
||||
0x130: 0x2100001,
|
||||
0x140: 0x100001,
|
||||
0x150: 0x2000400,
|
||||
0x160: 0x2100400,
|
||||
0x170: 0x100401,
|
||||
0x180: 0x401,
|
||||
0x190: 0x2100401,
|
||||
0x1a0: 0x100400,
|
||||
0x1b0: 0x1,
|
||||
0x1c0: 0x0,
|
||||
0x1d0: 0x2100000,
|
||||
0x1e0: 0x2000001,
|
||||
0x1f0: 0x400,
|
||||
0x108: 0x100400,
|
||||
0x118: 0x2000401,
|
||||
0x128: 0x2100001,
|
||||
0x138: 0x1,
|
||||
0x148: 0x2000000,
|
||||
0x158: 0x100000,
|
||||
0x168: 0x401,
|
||||
0x178: 0x2100400,
|
||||
0x188: 0x2000001,
|
||||
0x198: 0x2100000,
|
||||
0x1a8: 0x0,
|
||||
0x1b8: 0x2100401,
|
||||
0x1c8: 0x100401,
|
||||
0x1d8: 0x400,
|
||||
0x1e8: 0x2000400,
|
||||
0x1f8: 0x100001
|
||||
}, {
|
||||
0x0: 0x8000820,
|
||||
0x1: 0x20000,
|
||||
0x2: 0x8000000,
|
||||
0x3: 0x20,
|
||||
0x4: 0x20020,
|
||||
0x5: 0x8020820,
|
||||
0x6: 0x8020800,
|
||||
0x7: 0x800,
|
||||
0x8: 0x8020000,
|
||||
0x9: 0x8000800,
|
||||
0xa: 0x20800,
|
||||
0xb: 0x8020020,
|
||||
0xc: 0x820,
|
||||
0xd: 0x0,
|
||||
0xe: 0x8000020,
|
||||
0xf: 0x20820,
|
||||
0x80000000: 0x800,
|
||||
0x80000001: 0x8020820,
|
||||
0x80000002: 0x8000820,
|
||||
0x80000003: 0x8000000,
|
||||
0x80000004: 0x8020000,
|
||||
0x80000005: 0x20800,
|
||||
0x80000006: 0x20820,
|
||||
0x80000007: 0x20,
|
||||
0x80000008: 0x8000020,
|
||||
0x80000009: 0x820,
|
||||
0x8000000a: 0x20020,
|
||||
0x8000000b: 0x8020800,
|
||||
0x8000000c: 0x0,
|
||||
0x8000000d: 0x8020020,
|
||||
0x8000000e: 0x8000800,
|
||||
0x8000000f: 0x20000,
|
||||
0x10: 0x20820,
|
||||
0x11: 0x8020800,
|
||||
0x12: 0x20,
|
||||
0x13: 0x800,
|
||||
0x14: 0x8000800,
|
||||
0x15: 0x8000020,
|
||||
0x16: 0x8020020,
|
||||
0x17: 0x20000,
|
||||
0x18: 0x0,
|
||||
0x19: 0x20020,
|
||||
0x1a: 0x8020000,
|
||||
0x1b: 0x8000820,
|
||||
0x1c: 0x8020820,
|
||||
0x1d: 0x20800,
|
||||
0x1e: 0x820,
|
||||
0x1f: 0x8000000,
|
||||
0x80000010: 0x20000,
|
||||
0x80000011: 0x800,
|
||||
0x80000012: 0x8020020,
|
||||
0x80000013: 0x20820,
|
||||
0x80000014: 0x20,
|
||||
0x80000015: 0x8020000,
|
||||
0x80000016: 0x8000000,
|
||||
0x80000017: 0x8000820,
|
||||
0x80000018: 0x8020820,
|
||||
0x80000019: 0x8000020,
|
||||
0x8000001a: 0x8000800,
|
||||
0x8000001b: 0x0,
|
||||
0x8000001c: 0x20800,
|
||||
0x8000001d: 0x820,
|
||||
0x8000001e: 0x20020,
|
||||
0x8000001f: 0x8020800
|
||||
}];
|
||||
|
||||
// Masks that select the SBOX input
|
||||
var SBOX_MASK = [
|
||||
0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
|
||||
0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f];
|
||||
|
||||
/**
|
||||
* DES block cipher algorithm.
|
||||
*/
|
||||
var DES = C_algo.DES = BlockCipher.extend({
|
||||
_doReset: function() {
|
||||
// Shortcuts
|
||||
var key = this._key;
|
||||
var keyWords = key.words;
|
||||
|
||||
// Select 56 bits according to PC1
|
||||
var keyBits = [];
|
||||
for (var i = 0; i < 56; i++) {
|
||||
var keyBitPos = PC1[i] - 1;
|
||||
keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
|
||||
}
|
||||
|
||||
// Assemble 16 subkeys
|
||||
var subKeys = this._subKeys = [];
|
||||
for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
|
||||
// Create subkey
|
||||
var subKey = subKeys[nSubKey] = [];
|
||||
|
||||
// Shortcut
|
||||
var bitShift = BIT_SHIFTS[nSubKey];
|
||||
|
||||
// Select 48 bits according to PC2
|
||||
for (var i = 0; i < 24; i++) {
|
||||
// Select from the left 28 key bits
|
||||
subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
|
||||
|
||||
// Select from the right 28 key bits
|
||||
subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
|
||||
}
|
||||
|
||||
// Since each subkey is applied to an expanded 32-bit input,
|
||||
// the subkey can be broken into 8 values scaled to 32-bits,
|
||||
// which allows the key to be used without expansion
|
||||
subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
|
||||
for (var i = 1; i < 7; i++) {
|
||||
subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
|
||||
}
|
||||
subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
|
||||
}
|
||||
|
||||
// Compute inverse subkeys
|
||||
var invSubKeys = this._invSubKeys = [];
|
||||
for (var i = 0; i < 16; i++) {
|
||||
invSubKeys[i] = subKeys[15 - i];
|
||||
}
|
||||
},
|
||||
|
||||
encryptBlock: function(M, offset) {
|
||||
this._doCryptBlock(M, offset, this._subKeys);
|
||||
},
|
||||
|
||||
decryptBlock: function(M, offset) {
|
||||
this._doCryptBlock(M, offset, this._invSubKeys);
|
||||
},
|
||||
|
||||
_doCryptBlock: function(M, offset, subKeys) {
|
||||
// Get input
|
||||
this._lBlock = M[offset];
|
||||
this._rBlock = M[offset + 1];
|
||||
|
||||
// Initial permutation
|
||||
exchangeLR.call(this, 4, 0x0f0f0f0f);
|
||||
exchangeLR.call(this, 16, 0x0000ffff);
|
||||
exchangeRL.call(this, 2, 0x33333333);
|
||||
exchangeRL.call(this, 8, 0x00ff00ff);
|
||||
exchangeLR.call(this, 1, 0x55555555);
|
||||
|
||||
// Rounds
|
||||
for (var round = 0; round < 16; round++) {
|
||||
// Shortcuts
|
||||
var subKey = subKeys[round];
|
||||
var lBlock = this._lBlock;
|
||||
var rBlock = this._rBlock;
|
||||
|
||||
// Feistel function
|
||||
var f = 0;
|
||||
for (var i = 0; i < 8; i++) {
|
||||
f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
|
||||
}
|
||||
this._lBlock = rBlock;
|
||||
this._rBlock = lBlock ^ f;
|
||||
}
|
||||
|
||||
// Undo swap from last round
|
||||
var t = this._lBlock;
|
||||
this._lBlock = this._rBlock;
|
||||
this._rBlock = t;
|
||||
|
||||
// Final permutation
|
||||
exchangeLR.call(this, 1, 0x55555555);
|
||||
exchangeRL.call(this, 8, 0x00ff00ff);
|
||||
exchangeRL.call(this, 2, 0x33333333);
|
||||
exchangeLR.call(this, 16, 0x0000ffff);
|
||||
exchangeLR.call(this, 4, 0x0f0f0f0f);
|
||||
|
||||
// Set output
|
||||
M[offset] = this._lBlock;
|
||||
M[offset + 1] = this._rBlock;
|
||||
},
|
||||
|
||||
keySize: 64 / 32,
|
||||
|
||||
ivSize: 64 / 32,
|
||||
|
||||
blockSize: 64 / 32
|
||||
});
|
||||
|
||||
// Swap bits across the left and right words
|
||||
function exchangeLR(offset, mask) {
|
||||
var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
|
||||
this._rBlock ^= t;
|
||||
this._lBlock ^= t << offset;
|
||||
}
|
||||
|
||||
function exchangeRL(offset, mask) {
|
||||
var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
|
||||
this._lBlock ^= t;
|
||||
this._rBlock ^= t << offset;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.DES = BlockCipher._createHelper(DES);
|
||||
|
||||
/**
|
||||
* Triple-DES block cipher algorithm.
|
||||
*/
|
||||
var TripleDES = C_algo.TripleDES = BlockCipher.extend({
|
||||
_doReset: function() {
|
||||
// Shortcuts
|
||||
var key = this._key;
|
||||
var keyWords = key.words;
|
||||
// Make sure the key length is valid (64, 128 or >= 192 bit)
|
||||
if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
|
||||
throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
|
||||
}
|
||||
|
||||
// Extend the key according to the keying options defined in 3DES standard
|
||||
var key1 = keyWords.slice(0, 2);
|
||||
var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
|
||||
var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
|
||||
|
||||
// Create DES instances
|
||||
this._des1 = DES.createEncryptor(WordArray.create(key1));
|
||||
this._des2 = DES.createEncryptor(WordArray.create(key2));
|
||||
this._des3 = DES.createEncryptor(WordArray.create(key3));
|
||||
},
|
||||
|
||||
encryptBlock: function(M, offset) {
|
||||
this._des1.encryptBlock(M, offset);
|
||||
this._des2.decryptBlock(M, offset);
|
||||
this._des3.encryptBlock(M, offset);
|
||||
},
|
||||
|
||||
decryptBlock: function(M, offset) {
|
||||
this._des3.decryptBlock(M, offset);
|
||||
this._des2.encryptBlock(M, offset);
|
||||
this._des1.decryptBlock(M, offset);
|
||||
},
|
||||
|
||||
keySize: 192 / 32,
|
||||
|
||||
ivSize: 64 / 32,
|
||||
|
||||
blockSize: 64 / 32
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.TripleDES = BlockCipher._createHelper(TripleDES);
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var StreamCipher = C_lib.StreamCipher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
/**
|
||||
* RC4 stream cipher algorithm.
|
||||
*/
|
||||
var RC4 = C_algo.RC4 = StreamCipher.extend({
|
||||
_doReset: function() {
|
||||
// Shortcuts
|
||||
var key = this._key;
|
||||
var keyWords = key.words;
|
||||
var keySigBytes = key.sigBytes;
|
||||
|
||||
// Init sbox
|
||||
var S = this._S = [];
|
||||
for (var i = 0; i < 256; i++) {
|
||||
S[i] = i;
|
||||
}
|
||||
|
||||
// Key setup
|
||||
for (var i = 0, j = 0; i < 256; i++) {
|
||||
var keyByteIndex = i % keySigBytes;
|
||||
var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
|
||||
|
||||
j = (j + S[i] + keyByte) % 256;
|
||||
|
||||
// Swap
|
||||
var t = S[i];
|
||||
S[i] = S[j];
|
||||
S[j] = t;
|
||||
}
|
||||
|
||||
// Counters
|
||||
this._i = this._j = 0;
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
M[offset] ^= generateKeystreamWord.call(this);
|
||||
},
|
||||
|
||||
keySize: 256 / 32,
|
||||
|
||||
ivSize: 0
|
||||
});
|
||||
|
||||
function generateKeystreamWord() {
|
||||
// Shortcuts
|
||||
var S = this._S;
|
||||
var i = this._i;
|
||||
var j = this._j;
|
||||
|
||||
// Generate keystream word
|
||||
var keystreamWord = 0;
|
||||
for (var n = 0; n < 4; n++) {
|
||||
i = (i + 1) % 256;
|
||||
j = (j + S[i]) % 256;
|
||||
|
||||
// Swap
|
||||
var t = S[i];
|
||||
S[i] = S[j];
|
||||
S[j] = t;
|
||||
|
||||
keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
|
||||
}
|
||||
|
||||
// Update counters
|
||||
this._i = i;
|
||||
this._j = j;
|
||||
|
||||
return keystreamWord;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.RC4 = StreamCipher._createHelper(RC4);
|
||||
|
||||
/**
|
||||
* Modified RC4 stream cipher algorithm.
|
||||
*/
|
||||
var RC4Drop = C_algo.RC4Drop = RC4.extend({
|
||||
/**
|
||||
* Configuration options.
|
||||
*
|
||||
* @property {number} drop The number of keystream words to drop. Default 192
|
||||
*/
|
||||
cfg: RC4.cfg.extend({
|
||||
drop: 192
|
||||
}),
|
||||
|
||||
_doReset: function() {
|
||||
RC4._doReset.call(this);
|
||||
|
||||
// Drop
|
||||
for (var i = this.cfg.drop; i > 0; i--) {
|
||||
generateKeystreamWord.call(this);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.RC4Drop = StreamCipher._createHelper(RC4Drop);
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var StreamCipher = C_lib.StreamCipher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Reusable objects
|
||||
var S = [];
|
||||
var C_ = [];
|
||||
var G = [];
|
||||
|
||||
/**
|
||||
* Rabbit stream cipher algorithm
|
||||
*/
|
||||
var Rabbit = C_algo.Rabbit = StreamCipher.extend({
|
||||
_doReset: function() {
|
||||
// Shortcuts
|
||||
var K = this._key.words;
|
||||
var iv = this.cfg.iv;
|
||||
|
||||
// Swap endian
|
||||
for (var i = 0; i < 4; i++) {
|
||||
K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
|
||||
}
|
||||
|
||||
// Generate initial state values
|
||||
var X = this._X = [
|
||||
K[0], (K[3] << 16) | (K[2] >>> 16),
|
||||
K[1], (K[0] << 16) | (K[3] >>> 16),
|
||||
K[2], (K[1] << 16) | (K[0] >>> 16),
|
||||
K[3], (K[2] << 16) | (K[1] >>> 16)];
|
||||
|
||||
// Generate initial counter values
|
||||
var C = this._C = [
|
||||
(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)];
|
||||
|
||||
// Carry bit
|
||||
this._b = 0;
|
||||
|
||||
// Iterate the system four times
|
||||
for (var i = 0; i < 4; i++) {
|
||||
nextState.call(this);
|
||||
}
|
||||
|
||||
// Modify the counters
|
||||
for (var i = 0; i < 8; i++) {
|
||||
C[i] ^= X[(i + 4) & 7];
|
||||
}
|
||||
|
||||
// IV setup
|
||||
if (iv) {
|
||||
// Shortcuts
|
||||
var IV = iv.words;
|
||||
var IV_0 = IV[0];
|
||||
var IV_1 = IV[1];
|
||||
|
||||
// Generate four subvectors
|
||||
var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
|
||||
var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
|
||||
var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
|
||||
var i3 = (i2 << 16) | (i0 & 0x0000ffff);
|
||||
|
||||
// Modify counter values
|
||||
C[0] ^= i0;
|
||||
C[1] ^= i1;
|
||||
C[2] ^= i2;
|
||||
C[3] ^= i3;
|
||||
C[4] ^= i0;
|
||||
C[5] ^= i1;
|
||||
C[6] ^= i2;
|
||||
C[7] ^= i3;
|
||||
|
||||
// Iterate the system four times
|
||||
for (var i = 0; i < 4; i++) {
|
||||
nextState.call(this);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Shortcut
|
||||
var X = this._X;
|
||||
|
||||
// Iterate the system
|
||||
nextState.call(this);
|
||||
|
||||
// Generate four keystream words
|
||||
S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
|
||||
S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
|
||||
S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
|
||||
S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
|
||||
|
||||
for (var i = 0; i < 4; i++) {
|
||||
// Swap endian
|
||||
S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
|
||||
|
||||
// Encrypt
|
||||
M[offset + i] ^= S[i];
|
||||
}
|
||||
},
|
||||
|
||||
blockSize: 128 / 32,
|
||||
|
||||
ivSize: 64 / 32
|
||||
});
|
||||
|
||||
function nextState() {
|
||||
// Shortcuts
|
||||
var X = this._X;
|
||||
var C = this._C;
|
||||
|
||||
// Save old counter values
|
||||
for (var i = 0; i < 8; i++) {
|
||||
C_[i] = C[i];
|
||||
}
|
||||
|
||||
// Calculate new counter values
|
||||
C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
|
||||
C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
|
||||
C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
|
||||
C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
|
||||
C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
|
||||
C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
|
||||
C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
|
||||
C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
|
||||
this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
|
||||
|
||||
// Calculate the g-values
|
||||
for (var i = 0; i < 8; i++) {
|
||||
var gx = X[i] + C[i];
|
||||
|
||||
// Construct high and low argument for squaring
|
||||
var ga = gx & 0xffff;
|
||||
var gb = gx >>> 16;
|
||||
|
||||
// Calculate high and low result of squaring
|
||||
var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
|
||||
var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
|
||||
|
||||
// High XOR low
|
||||
G[i] = gh ^ gl;
|
||||
}
|
||||
|
||||
// Calculate new state values
|
||||
X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
|
||||
X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
|
||||
X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
|
||||
X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
|
||||
X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
|
||||
X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
|
||||
X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
|
||||
X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.Rabbit = StreamCipher._createHelper(Rabbit);
|
||||
}());
|
||||
|
||||
|
||||
(function() {
|
||||
// Shortcuts
|
||||
var C = CryptoJS;
|
||||
var C_lib = C.lib;
|
||||
var StreamCipher = C_lib.StreamCipher;
|
||||
var C_algo = C.algo;
|
||||
|
||||
// Reusable objects
|
||||
var S = [];
|
||||
var C_ = [];
|
||||
var G = [];
|
||||
|
||||
/**
|
||||
* Rabbit stream cipher algorithm.
|
||||
*
|
||||
* This is a legacy version that neglected to convert the key to little-endian.
|
||||
* This error doesn't affect the cipher's security,
|
||||
* but it does affect its compatibility with other implementations.
|
||||
*/
|
||||
var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
|
||||
_doReset: function() {
|
||||
// Shortcuts
|
||||
var K = this._key.words;
|
||||
var iv = this.cfg.iv;
|
||||
|
||||
// Generate initial state values
|
||||
var X = this._X = [
|
||||
K[0], (K[3] << 16) | (K[2] >>> 16),
|
||||
K[1], (K[0] << 16) | (K[3] >>> 16),
|
||||
K[2], (K[1] << 16) | (K[0] >>> 16),
|
||||
K[3], (K[2] << 16) | (K[1] >>> 16)];
|
||||
|
||||
// Generate initial counter values
|
||||
var C = this._C = [
|
||||
(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)];
|
||||
|
||||
// Carry bit
|
||||
this._b = 0;
|
||||
|
||||
// Iterate the system four times
|
||||
for (var i = 0; i < 4; i++) {
|
||||
nextState.call(this);
|
||||
}
|
||||
|
||||
// Modify the counters
|
||||
for (var i = 0; i < 8; i++) {
|
||||
C[i] ^= X[(i + 4) & 7];
|
||||
}
|
||||
|
||||
// IV setup
|
||||
if (iv) {
|
||||
// Shortcuts
|
||||
var IV = iv.words;
|
||||
var IV_0 = IV[0];
|
||||
var IV_1 = IV[1];
|
||||
|
||||
// Generate four subvectors
|
||||
var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
|
||||
var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
|
||||
var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
|
||||
var i3 = (i2 << 16) | (i0 & 0x0000ffff);
|
||||
|
||||
// Modify counter values
|
||||
C[0] ^= i0;
|
||||
C[1] ^= i1;
|
||||
C[2] ^= i2;
|
||||
C[3] ^= i3;
|
||||
C[4] ^= i0;
|
||||
C[5] ^= i1;
|
||||
C[6] ^= i2;
|
||||
C[7] ^= i3;
|
||||
|
||||
// Iterate the system four times
|
||||
for (var i = 0; i < 4; i++) {
|
||||
nextState.call(this);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_doProcessBlock: function(M, offset) {
|
||||
// Shortcut
|
||||
var X = this._X;
|
||||
|
||||
// Iterate the system
|
||||
nextState.call(this);
|
||||
|
||||
// Generate four keystream words
|
||||
S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
|
||||
S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
|
||||
S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
|
||||
S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
|
||||
|
||||
for (var i = 0; i < 4; i++) {
|
||||
// Swap endian
|
||||
S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
|
||||
|
||||
// Encrypt
|
||||
M[offset + i] ^= S[i];
|
||||
}
|
||||
},
|
||||
|
||||
blockSize: 128 / 32,
|
||||
|
||||
ivSize: 64 / 32
|
||||
});
|
||||
|
||||
function nextState() {
|
||||
// Shortcuts
|
||||
var X = this._X;
|
||||
var C = this._C;
|
||||
|
||||
// Save old counter values
|
||||
for (var i = 0; i < 8; i++) {
|
||||
C_[i] = C[i];
|
||||
}
|
||||
|
||||
// Calculate new counter values
|
||||
C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
|
||||
C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
|
||||
C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
|
||||
C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
|
||||
C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
|
||||
C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
|
||||
C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
|
||||
C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
|
||||
this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
|
||||
|
||||
// Calculate the g-values
|
||||
for (var i = 0; i < 8; i++) {
|
||||
var gx = X[i] + C[i];
|
||||
|
||||
// Construct high and low argument for squaring
|
||||
var ga = gx & 0xffff;
|
||||
var gb = gx >>> 16;
|
||||
|
||||
// Calculate high and low result of squaring
|
||||
var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
|
||||
var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
|
||||
|
||||
// High XOR low
|
||||
G[i] = gh ^ gl;
|
||||
}
|
||||
|
||||
// Calculate new state values
|
||||
X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
|
||||
X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
|
||||
X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
|
||||
X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
|
||||
X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
|
||||
X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
|
||||
X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
|
||||
X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut functions to the cipher's object interface.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
|
||||
* var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
|
||||
*/
|
||||
C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
|
||||
}());
|
||||
|
||||
|
||||
return CryptoJS;
|
||||
|
||||
}));
|
||||
Binary file not shown.
Vendored
+2819
@@ -0,0 +1,2819 @@
|
||||
import cheerio from "cheerio.min.js";
|
||||
import "crypto-js.js";
|
||||
import "jsencrypt.js";
|
||||
import "node-rsa.js";
|
||||
import "pako.min.js";
|
||||
import 模板 from "模板.js";
|
||||
import { gbkTool } from "gbk.js";
|
||||
|
||||
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 = {};
|
||||
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
|
||||
const VERSION = vercode + " 3.9.50beta32 20240625";
|
||||
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")) {
|
||||
const strTool = gbkTool();
|
||||
input = strTool.encode(input)
|
||||
}
|
||||
return input
|
||||
}
|
||||
function decodeStr(input, encoding) {
|
||||
encoding = encoding || "gbk";
|
||||
if (encoding.startsWith("gb")) {
|
||||
const strTool = gbkTool();
|
||||
input = strTool.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");
|
||||
let firststr = "";
|
||||
let maxl = 0;
|
||||
let kk = 0;
|
||||
let kkk = 2;
|
||||
let secondstr = "";
|
||||
for (let i = 0; i < ss.length; i++) {
|
||||
let s = ss[i];
|
||||
if (!s.startsWith("#")) {
|
||||
if (kk == 0) firststr = s;
|
||||
if (kk == 1) maxl = b(firststr, s);
|
||||
if (kk > 1) {
|
||||
if (maxl > b(firststr, s)) {
|
||||
if (secondstr.length < 5) secondstr = s;
|
||||
kkk = kkk + 2
|
||||
} else {
|
||||
maxl = b(firststr, s);
|
||||
kkk++
|
||||
}
|
||||
}
|
||||
kk++;
|
||||
if (kk >= 20) break
|
||||
}
|
||||
}
|
||||
if (kkk > 30) 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());
|
||||
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 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
|
||||
}
|
||||
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
|
||||
});
|
||||
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 "{}"
|
||||
}
|
||||
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) {
|
||||
if (/系统安全验证|输入验证码/.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) => {
|
||||
return (tab_order.indexOf(a) === -1 ? 9999 : tab_order.indexOf(a)) - (tab_order.indexOf(b) === -1 ? 9999 : tab_order.indexOf(b))
|
||||
});
|
||||
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 getOriginalJs(js_code) {
|
||||
let current_match = /var rule|[\u4E00-\u9FA5]+|function|let |var |const |\(|\)|"|'/;
|
||||
if (current_match.test(js_code)) {
|
||||
return js_code
|
||||
}
|
||||
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") {
|
||||
if (ext.startsWith("http") || ext.startsWith("file://")) {
|
||||
let query = getQuery(ext);
|
||||
let js = request(ext, {
|
||||
method: "GET"
|
||||
});
|
||||
if (js) {
|
||||
js = getOriginalJs(js);
|
||||
eval("(function(){" + js.replace("var rule", "rule") + "})()")
|
||||
}
|
||||
if (query.type === "url" && query.params) {
|
||||
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}`)
|
||||
}
|
||||
}
|
||||
rule_fetch_params = {
|
||||
headers: rule.headers || false,
|
||||
timeout: rule.timeout,
|
||||
encoding: rule.encoding
|
||||
};
|
||||
oheaders = rule.headers || {};
|
||||
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 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,1228 @@
|
||||
央视频道,#genre#
|
||||
CCTV1 综合,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226559/index.m3u8
|
||||
CCTV2 财经,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226540/index.m3u8
|
||||
CCTV3 综艺,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226021/index.m3u8
|
||||
CCTV4 中文国际,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226428/index.m3u8
|
||||
CCTV5 体育,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226019/index.m3u8
|
||||
CCTV5+ 体育赛事,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225603/index.m3u8
|
||||
CCTV6 电影,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226010/index.m3u8
|
||||
CCTV7 国防军事,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225733/index.m3u8
|
||||
CCTV8 电视剧,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226008/index.m3u8
|
||||
CCTV9 纪录,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225734/index.m3u8
|
||||
CCTV10 科教,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226473/index.m3u8
|
||||
CCTV11 戏曲,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226565/index.m3u8
|
||||
CCTV12 社会与法,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226568/index.m3u8
|
||||
CCTV13 新闻,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226571/index.m3u8
|
||||
CCTV14 少儿,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226591/index.m3u8
|
||||
CCTV15 音乐,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226476/index.m3u8
|
||||
CCTV16 奥林匹克,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226100/index.m3u8
|
||||
CCTV16 4K 奥林匹克,https://tv.cry33.com/ys4k.php?id=16-4k
|
||||
CCTV17 农业农村,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225765/index.m3u8
|
||||
|
||||
CCTV1 综合,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010011/1.m3u8
|
||||
CCTV5 体育,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010078/1.m3u8
|
||||
CCTV5 体育,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010145/1.m3u8
|
||||
CCTV6 电影,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010214/1.m3u8
|
||||
CCTV7 国防军事,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010215/1.m3u8
|
||||
CCTV8 电视剧,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010216/1.m3u8
|
||||
CCTV10 科教,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010203/1.m3u8
|
||||
CCTV12 社会与法,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010205/1.m3u8
|
||||
CCTV17 农业农村,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010210/1.m3u8
|
||||
|
||||
CCTV1 综合,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226016/index.m3u8
|
||||
CCTV3 综艺,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226021/index.m3u8
|
||||
CCTV5 体育,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226019/index.m3u8
|
||||
CCTV5+ 体育赛事,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225603/index.m3u8
|
||||
CCTV6 电影,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226010/index.m3u8
|
||||
CCTV7 国防军事,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225733/index.m3u8
|
||||
CCTV8 电视剧,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226008/index.m3u8
|
||||
CCTV9 纪录,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225734/index.m3u8
|
||||
CCTV10 科教,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225730/index.m3u8
|
||||
CCTV12 社会与法,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225731/index.m3u8
|
||||
CCTV14 少儿,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225732/index.m3u8
|
||||
CCTV16 奥林匹克,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226100/index.m3u8
|
||||
CCTV17 农业农村,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225765/index.m3u8
|
||||
|
||||
CCTV1 综合,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN111128BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUU6FFmRK8Hl0ytyd5e5kWGEwoDIwMxbrlyyVy9x6ZDKnldIYKOjBOUjRyoym5n7Kg0yIYstFTUfqtC14fzxhy5Y
|
||||
CCTV2 财经,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000036BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSpr1AVNI633ampcuzdN%2BfGVSARKsxkWGZw7vFUuOj2QZHeRzosIxVbl7i2QHFATHA3k5wDWG1qHkZQAleNv%2FbI
|
||||
CCTV3 综艺,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638727c125355/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSPTZ4CK5oLfjaEYe9dogNMUNNEYLCPUtKY62j1Wp5u04wipypKUQ1TTuR2lXvBl5YpHqBJmlA19x22TD9bUOjk
|
||||
CCTV4 中文国际,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000037BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSpr1AVNI633ampcuzdN%2BfH0ZQXwaiVktPr6ILPKXqwOUC2ZXft7ZULN6h9qLQPFOTSlVTfophiKaMb8h1kPV74
|
||||
CCTV5 体育,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638727e617ca0/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSPTZ4CK5oLfjaEYe9dogNMSXw4ajlL%2FoUYC2RZQQDco6uQSifXBocz5ID6RePfIKQ4rFWiHjq%2FeZoDmrzW%2FKlw
|
||||
CCTV5+ 体育赛事,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63872908d48f9/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSBx06ZL9Bo6JOM%2BSTjxZRK254G1jtietGzDaHvFNRtjXOvFnbf%2BTao33JqYlfMYYn2z3agOn9gvNMT9KmBaR9o
|
||||
CCTV6 电影,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638728804b1f9/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUdDh4EPdDnvGlSBkYaxFdazJhFQmuq4XUiks9ZrIlJN%2BknLs8H%2BSxcDXy%2BTesEc8Q0KCN89MjYoj85Sol1kbKI4
|
||||
CCTV7 国防军事,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000038BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSpr1AVNI633ampcuzdN%2BfHYKFve4MwNzRa0jPXeHjqnBjPmzSdKDNWNHhnZSaMGCXKmdx8d%2BnYdhVK5ge22ot4
|
||||
CCTV8 电视剧,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638728970aa82/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUdDh4EPdDnvGlSBkYaxFdaymid9ta2tVUW0%2FdVrFqszC1EVEkAbpip1IYxn%2Ba2aA%2BVAihIiw9D8ejUsDbfU0K68
|
||||
CCTV9 纪录,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000039BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSpr1AVNI633ampcuzdN%2BfHArfvJF2pWpm4RxcBNhZ7j9vEUeCQte%2BbQaOGNIUEEK%2B3RBE1BC9EUsM18gnb%2FyAA
|
||||
CCTV10 科教,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN3949784BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUXt3TPFwzzdHCkOT9AjSv5OuXozn3alq9%2BUx7ZLG1w9aOfkLjZvYj56D3xkOAtSOIoLsdw8c1%2BCwLDg1aS4esN4
|
||||
CCTV11 戏曲,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6000053BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTWDyIgRkFJBAHMhA2ayG0Qj2xHA4vdPGsjBbxSL3p%2FmAObVTfznR%2Fpc%2B76QYmLRMuL3Lj9iabhv8arW7kJe6%2F4
|
||||
CCTV12 社会与法,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000040BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUd3JM2PCgDefrKOVZLNt0QMAmpLefguRLiOPXiDRWhxHg8yim2giTBA8RILsb%2B8Y5pkFUyZBE%2FkNJAbwncEegkU
|
||||
CCTV13 新闻,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6000054BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTWDyIgRkFJBAHMhA2ayG0SuXozn3alq9%2BUx7ZLG1w9awc14iEUxQ5VsTsr5pEBsmF56tXUfsukRUpygmTCKvAI
|
||||
CCTV14 少儿,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN3949788BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUXt3TPFwzzdHCkOT9AjSv5PYKFve4MwNzRa0jPXeHjqnp7khdLaCMP6L4QpTf84Oz6DvCG1%2BJ81QvStkxO%2FoGm8
|
||||
CCTV15 音乐,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6000055BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTWDyIgRkFJBAHMhA2ayG0Tdo%2FUL80msfbhDYvoWpNl31Dy7jHvMl%2FzVUrNxhL1ek1YEGVDZ7lCg0LtKJY4Ku%2B8
|
||||
CCTV17 农业农村,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638728afa13b4/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUdDh4EPdDnvGlSBkYaxFdaz%2FyAI9to%2FMBBt%2FivcdSfljJ1%2FqqamWUjAiBAxNssfyBlZUDSXAIMtStS86hRHFuJM
|
||||
|
||||
CCTV1 综合,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226559/index.m3u8
|
||||
CCTV2 财经,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226540/index.m3u8
|
||||
CCTV4 中文国际,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226428/index.m3u8
|
||||
CCTV5 体育,http://[2409:8087:1a01:df::4077]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226019/index.m3u8
|
||||
CCTV5+ 体育赛事,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/8/3221225603/index.m3u8
|
||||
CCTV6 电影,http://[2409:8087:1a01:df::4077]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226010/index.m3u8
|
||||
CCTV7 国防军事,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225733/index.m3u8
|
||||
CCTV8 电视剧,http://[2409:8087:1a01:df::4077]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226008/index.m3u8
|
||||
CCTV9 纪录,http://[2409:8087:1a01:df::4077]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225734/index.m3u8
|
||||
CCTV11 戏曲,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226565/index.m3u8
|
||||
CCTV12 社会与法,http://[2409:8087:1a01:df::4077]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225731/index.m3u8
|
||||
CCTV13 新闻,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226537/index.m3u8
|
||||
CCTV14 少儿,http://[2409:8087:1a01:df::4077]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225732/index.m3u8
|
||||
CCTV15 音乐,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226476/index.m3u8
|
||||
CCTV16 奥林匹克,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/8/3221226100/index.m3u8
|
||||
CCTV17 农业农村,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225765/index.m3u8
|
||||
|
||||
CCTV1 综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226016/index.m3u8
|
||||
CCTV1 综合,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226559/index.m3u8
|
||||
CCTV1 综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226559/index.m3u8
|
||||
CCTV1 综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226419/index.m3u8
|
||||
CCTV1 综合,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226016/index.m3u8
|
||||
CCTV2 财经,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226540/index.m3u8
|
||||
CCTV2 财经,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226540/index.m3u8
|
||||
CCTV3 综艺,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226021/index.m3u8
|
||||
CCTV3 综艺,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226021/index.m3u8
|
||||
CCTV4 中文国际,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226428/index.m3u8
|
||||
CCTV4 中文国际,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226428/index.m3u8
|
||||
CCTV5 体育,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226019/index.m3u8
|
||||
CCTV5 体育,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226469/index.m3u8
|
||||
CCTV5 体育,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226019/index.m3u8
|
||||
CCTV5+ 体育赛事,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225603/index.m3u8
|
||||
CCTV5+ 体育赛事,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225603/index.m3u8
|
||||
CCTV6 电影,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226010/index.m3u8
|
||||
CCTV6 电影,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226010/index.m3u8
|
||||
CCTV7 国防军事,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225733/index.m3u8
|
||||
CCTV7 国防军事,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225671/index.m3u8
|
||||
CCTV7 国防军事,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225733/index.m3u8
|
||||
CCTV8 电视剧,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226008/index.m3u8
|
||||
CCTV8 电视剧,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226008/index.m3u8
|
||||
CCTV9 纪录,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225734/index.m3u8
|
||||
CCTV9 纪录,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225676/index.m3u8
|
||||
CCTV9 纪录,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225734/index.m3u8
|
||||
CCTV10 科教,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225730/index.m3u8
|
||||
CCTV10 科教,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225677/index.m3u8
|
||||
CCTV10 科教,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226473/index.m3u8
|
||||
CCTV10 科教,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226473/index.m3u8
|
||||
CCTV10 科教,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225730/index.m3u8
|
||||
CCTV11 戏曲,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226565/index.m3u8
|
||||
CCTV11 戏曲,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226565/index.m3u8
|
||||
CCTV12 社会与法,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225731/index.m3u8
|
||||
CCTV12 社会与法,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226568/index.m3u8
|
||||
CCTV12 社会与法,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226568/index.m3u8
|
||||
CCTV12 社会与法,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225731/index.m3u8
|
||||
CCTV13 新闻,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226537/index.m3u8
|
||||
CCTV13 新闻,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226571/index.m3u8
|
||||
CCTV13 新闻,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226571/index.m3u8
|
||||
CCTV13 新闻,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226537/index.m3u8
|
||||
CCTV14 少儿,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225732/index.m3u8
|
||||
CCTV14 少儿,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225674/index.m3u8
|
||||
CCTV14 少儿,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226591/index.m3u8
|
||||
CCTV14 少儿,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226591/index.m3u8
|
||||
CCTV14 少儿,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225732/index.m3u8
|
||||
CCTV15 音乐,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226476/index.m3u8
|
||||
CCTV15 音乐,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226476/index.m3u8
|
||||
CCTV16 奥林匹克,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226100/index.m3u8
|
||||
CCTV16 奥林匹克,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226100/index.m3u8
|
||||
CCTV17 农业农村,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225765/index.m3u8
|
||||
CCTV17 农业农村,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225708/index.m3u8
|
||||
CCTV17 农业农村,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225765/index.m3u8
|
||||
|
||||
CCTV5 体育,http://iptv123.msns.cn:9901/tsfile/live/0005_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV12 社会与法,http://iptv123.msns.cn:9901/tsfile/live/0012_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV14 少儿,http://iptv123.msns.cn:9901/tsfile/live/0014_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
|
||||
CCTV1 综合,http://1.24.190.98:10080/hls/1/index.m3u8
|
||||
CCTV2 财经,http://1.24.190.98:10080/hls/2/index.m3u8
|
||||
CCTV3 综艺,http://1.24.190.98:10080/hls/3/index.m3u8
|
||||
CCTV4 中文国际,http://1.24.190.98:10080/hls/4/index.m3u8
|
||||
CCTV5 体育,http://1.24.190.98:10080/hls/5/index.m3u8
|
||||
CCTV5+ 体育赛事,http://1.24.190.98:10080/hls/16/index.m3u8
|
||||
CCTV6 电影,http://1.24.190.98:10080/hls/6/index.m3u8
|
||||
CCTV7 国防军事,http://1.24.190.98:10080/hls/7/index.m3u8
|
||||
CCTV8 电视剧,http://1.24.190.98:10080/hls/8/index.m3u8
|
||||
CCTV9 纪录,http://1.24.190.98:10080/hls/9/index.m3u8
|
||||
CCTV10 科教,http://1.24.190.98:10080/hls/10/index.m3u8
|
||||
CCTV11 戏曲,http://1.24.190.98:10080/hls/11/index.m3u8
|
||||
CCTV12 社会与法,http://1.24.190.98:10080/hls/12/index.m3u8
|
||||
CCTV14 少儿,http://1.24.190.98:10080/hls/14/index.m3u8
|
||||
CCTV15 音乐,http://1.24.190.98:10080/hls/15/index.m3u8
|
||||
|
||||
CCTV7 国防军事,http://111.14.181.15:9901/tsfile/live/0007_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV11 戏曲,http://111.14.181.15:9901/tsfile/live/0011_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
CCTV12 社会与法,http://111.14.181.15:9901/tsfile/live/0012_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
|
||||
CCTV2 财经,http://110.80.17.38:9901/tsfile/live/0002_1.m3u8?key=txiptv
|
||||
CCTV4 中文国际,http://110.80.17.38:9901/tsfile/live/0004_1.m3u8?key=txiptv
|
||||
CCTV5 体育,http://110.80.17.38:9901/tsfile/live/0005_1.m3u8?key=txiptv
|
||||
CCTV6 电影,http://110.80.17.38:9901/tsfile/live/0005_2.m3u8?key=txiptv
|
||||
CCTV8 电视剧,http://110.80.17.38:9901/tsfile/live/0008_1.m3u8?key=txiptv
|
||||
CCTV9 纪录,http://110.80.17.38:9901/tsfile/live/0009_1.m3u8?key=txiptv
|
||||
CCTV10 科教,http://110.80.17.38:9901/tsfile/live/0010_1.m3u8?key=txiptv
|
||||
CCTV11 戏曲,http://110.80.17.38:9901/tsfile/live/0011_1.m3u8?key=txiptv
|
||||
CCTV12 社会与法,http://110.80.17.38:9901/tsfile/live/0012_1.m3u8?key=txiptv
|
||||
CCTV13 新闻,http://110.80.17.38:9901/tsfile/live/0013_1.m3u8?key=txiptv
|
||||
CCTV17 农业农村,http://110.80.17.38:9901/tsfile/live/0007_1.m3u8?key=txiptv
|
||||
|
||||
CCTV4K 超高清,https://tv.cry33.com/ys4k.php?id=4k
|
||||
CCTV4K 超高清,http://liveop.cctv.cn/hls/4KHD/playlist.m3u8
|
||||
CCTV4K 超高清,http://27.222.3.214/liveali-tp4k.cctv.cn/live/4K10M.stream/playlist.m3u8
|
||||
CCTV8K 超高清,https://tv.cry33.com/ys4k.php?id=8k
|
||||
|
||||
CHC影迷电影,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380764b172c9/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTrwI%2B%2BngB0lPRofcD8hTNS8qWmEGeaUedzcFVVumqf9cm8lJoOcrIZueLbqOJTuoPV%2FwBk6CoHYGFV14SkLW04
|
||||
CHC动作电影,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380763222d00/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTrwI%2B%2BngB0lPRofcD8hTNSXQZMUEnZPBI3Y%2BI8ABE4PJC%2B6OvlZZw5ubC%2FbrIdxFJJY1CcAGU%2BYDDQV9oJ%2FVqQ
|
||||
CHC家庭影院,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63807601b19dd/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTrwI%2B%2BngB0lPRofcD8hTNRxu2SqX2RKsLT0S7AyQ8XopIVrD6IJGxdajeuKy4iZqZ4tkZuiEpwSRPszF6PIvg4
|
||||
CHC影迷电影,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380764b172c9/index.m3u8?m3u8_level=2
|
||||
CHC动作电影,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380763222d00/index.m3u8?m3u8_level=2
|
||||
CHC家庭影院,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63807601b19dd/index.m3u8?m3u8_level=2
|
||||
|
||||
CGTN,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63806f4f64099/index.m3u8?m3u8_level=2
|
||||
CGTN纪录,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63a15d0ee63f3/index.m3u8?m3u8_level=2
|
||||
CGTN俄语,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638071d299009/index.m3u8?m3u8_level=2
|
||||
CGTN法语,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63806fb631afe/index.m3u8?m3u8_level=2
|
||||
CGTN法语,https://francais-livews.cgtn.com/hls/LSvev95OuFZtKLc6CeKEFYXj220802LSTeV6PO0Ut9r71Uq3k5goCA220802cd/playlist.m3u8
|
||||
CGTN阿拉伯语,https://arabic-livews.cgtn.com/hls/LSveq57bErWLinBnxosqjisZ220802LSTefTAS9zc9mpU08y3np9TH220802cd/playlist.m3u8
|
||||
CGTN西班牙语,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63806f81c8eb5/index.m3u8?m3u8_level=2
|
||||
|
||||
CCTV兵器科技,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638077907bdcd/1.m3u8?m3u8_level=2
|
||||
CCTV第一剧场,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638077f5ca035/1.m3u8?m3u8_level=2
|
||||
CCTV风云足球,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638077160c04a/1.m3u8?m3u8_level=2
|
||||
CCTV世界地理,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638077a61f4f3/1.m3u8?m3u8_level=2
|
||||
CCTV央视台球,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380775932cff/1.m3u8?m3u8_level=2
|
||||
CCTV高尔夫·网球,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63807743b61bb/1.m3u8?m3u8_level=2
|
||||
|
||||
卫视频道,#genre#
|
||||
安徽卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226391/index.m3u8
|
||||
安徽卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226391/index.m3u8
|
||||
北京卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226450/index.m3u8
|
||||
北京卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226450/index.m3u8
|
||||
重庆卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226409/index.m3u8
|
||||
重庆卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226409/index.m3u8
|
||||
东方卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226345/index.m3u8
|
||||
东方卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226345/index.m3u8
|
||||
东南卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226341/index.m3u8
|
||||
东南卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226341/index.m3u8
|
||||
甘肃卫视,http://[2409:8087:74F1:0021::0008]:80/270000001111/1110000322/index.m3u8?IASHttpSessionId=OTT
|
||||
甘肃卫视,http://[2409:8087:1a0b:df::4005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225633/index.m3u8
|
||||
广东卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226248/index.m3u8
|
||||
广东卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010221/1.m3u8
|
||||
广东卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226248/index.m3u8
|
||||
广西卫视,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226549/index.m3u8
|
||||
广西卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226344/index.m3u8
|
||||
广西卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226549/index.m3u8
|
||||
贵州卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226474/index.m3u8
|
||||
贵州卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226474/index.m3u8
|
||||
海南卫视,http://[2409:8087:1a0b:df::4020]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8
|
||||
海南卫视,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8
|
||||
海南卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8
|
||||
河北卫视,http://[2409:8087:1a0b:df::4020]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226406/index.m3u8
|
||||
河北卫视,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226406/index.m3u8
|
||||
河北卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226406/index.m3u8
|
||||
河南卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8
|
||||
河南卫视,http://[2409:8087:1a0b:df::4020]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8
|
||||
河南卫视,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8
|
||||
河南卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010071/1.m3u8
|
||||
河南卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8
|
||||
湖北卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226477/index.m3u8
|
||||
湖南卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226307/index.m3u8
|
||||
黑龙江卫视,http://[2409:8087:1a01:df::4001]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226327/1.m3u8
|
||||
黑龙江卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226327/index.m3u8
|
||||
黑龙江卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226327/index.m3u8
|
||||
吉林卫视,http://[2409:8087:1a0b:df::4020]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226397/index.m3u8
|
||||
吉林卫视,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226397/index.m3u8
|
||||
吉林卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010075/1.m3u8
|
||||
吉林卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226397/index.m3u8
|
||||
江苏卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226310/index.m3u8
|
||||
江苏卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226310/index.m3u8
|
||||
江西卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226344/index.m3u8
|
||||
江西卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226344/index.m3u8
|
||||
辽宁卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226546/index.m3u8
|
||||
内蒙古卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010109/1.m3u8
|
||||
宁夏卫视,http://[2409:8087:5e01:34::20]:6610/ZTE_CMS/00000001000000060000000000000309/index.m3u8?IAS
|
||||
青海卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010111/1.m3u8
|
||||
青海卫视,http://[2409:8087:1a0b:df::4002]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225628/index.m3u8
|
||||
山东卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226456/index.m3u8
|
||||
山东卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226456/index.m3u8
|
||||
山西卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010114/1.m3u8
|
||||
山西卫视,http://[2409:8087:5e01:34::21]:6610/ZTE_CMS/00000001000000060000000000000318/index.m3u8?IAS
|
||||
陕西卫视,http://iptv123.msns.cn:9901/tsfile/live/0136_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
四川卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226338/index.m3u8
|
||||
四川卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226338/index.m3u8
|
||||
深圳卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226313/index.m3u8
|
||||
深圳卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226313/index.m3u8
|
||||
三沙卫视,http://[2409:8087:5e01:34::20]:6610/ZTE_CMS/08984400000000060000000000000319/index.m3u8?
|
||||
三沙卫视,http://[2409:8087:5e01:34::21]:6610/ZTE_CMS/08984400000000060000000000000319/index.m3u8?IAS
|
||||
天津卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226459/index.m3u8
|
||||
天津卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226459/index.m3u8
|
||||
新疆卫视,http://[2409:8087:1a0b:df::4005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225635/index.m3u8
|
||||
西藏卫视,http://[2409:8087:5e01:34::23]:6610/ZTE_CMS/00000001000000060000000000000317/index.m3u8?IAS
|
||||
云南卫视,http://1.24.190.98:10080/hls/92/index.m3u8
|
||||
浙江卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226339/index.m3u8
|
||||
浙江卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010070/1.m3u8
|
||||
浙江卫视,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226339/index.m3u8
|
||||
|
||||
北京卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN181361BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUVKcU8XeU8C9ZEn2TN9C%2BRcwoDIwMxbrlyyVy9x6ZDKnfS6nBeQejvigwfjRd2x%2BU7thmluKAkd%2BIGySvIyq4AU
|
||||
东方卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN111131BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUaKz9fMrAi6%2FC6MZg8Mm9JQwoDIwMxbrlyyVy9x6ZDKnJ1LnEAwl4s1JgSBXbCxhRiWmveR7x9HhnhsF9G%2Bd4f8
|
||||
广东卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN181359BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUW%2B%2FF4NzOzOt3cAWjhMHEuMwoDIwMxbrlyyVy9x6ZDKn1U8f2vJUVL98LlyeZUOMSmC30dkrUFt%2FE8JGKMphXYE
|
||||
吉林卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000046BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUd3JM2PCgDefrKOVZLNt0QOVSARKsxkWGZw7vFUuOj2QqUR6TTs3uuC0H2mr3p6fRRazyiEPmSIyh%2BRO1%2BU3q84
|
||||
天津卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN3450000BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUZnlX6d6Ukio1jy49XlNnaUAmpLefguRLiOPXiDRWhxHtqJ1Caox489JiEKddi6MNiecVT4WDzN0xwhlk8OSvQg
|
||||
安徽卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN3540416BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUXv1bCET6%2FGP6LFvnNC2DgGVSARKsxkWGZw7vFUuOj2Qc9XJS6ezvAUx%2FdaE2fSJr3cdTmmqJgNdIzUOCi9%2BOyg
|
||||
山东卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN911992BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUYPFYDnFP%2FDAPuH7S4egu%2BwwoDIwMxbrlyyVy9x6ZDKni2tPDnaOO8v3uGUKi1hZOhPazmZ%2B8tgH3leYQIsqfKE
|
||||
广西卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000045BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUd3JM2PCgDefrKOVZLNt0QPdo%2FUL80msfbhDYvoWpNl3Ui3SDbjEyrngRN3z0PFPHWA%2BXaedl3%2F3flCrB%2Fqh7fg
|
||||
江苏卫视,http://[2409:8087:4c0a:22:1::4]:6610/170000001115/UmaiCHAN111129BESTVSMGSMG/index.m3u8?AuthInfo=NUJN2wb9BN2ZpCMOWq02OFinu7ChPwzZMEr4DA515M17sMI3p4W2558kb4tCId2lGsuMahdPCa7cTmyBxd%2BPXg%3D%3D
|
||||
河北卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN100000002BESTVSMGSMG9/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUaxEcGF7BsTm3tBZ5QM10A3THYCGyx0KiW2nghgGHiPYyNBht0ohR2xRP7wFZyAPWYATALvCqK4y6nrLdX80fn4
|
||||
河南卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN5000044BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUd3JM2PCgDefrKOVZLNt0QOuXozn3alq9%2BUx7ZLG1w9aOfw%2Ftj8uByLI%2F9b3T9xKHSKRmZDiwMOFotvfGaGd4Uw
|
||||
浙江卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN111130BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUclW6AUI%2FSIO%2Bs%2F9KaqCfRAwoDIwMxbrlyyVy9x6ZDKnvfae09h%2Fzg38THB%2B%2FvaO%2BqCb7fDXq%2F%2BRzM2c4SN6TJM
|
||||
海南卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN4252684BESTVSMGSMG9/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUaBeOsoiQC4O7YVlhWLaUupjXkJIrEMFMF2spHJh%2FN1RLi84Ue88x97wZoubXLeSwCFBwRVp81CkC12%2Foosdnmw
|
||||
深圳卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN181362BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTYjXE4%2FzHcB4DvaRB5Fv5MwoDIwMxbrlyyVy9x6ZDKneDM0LfUyK1%2BahEGNL2DZu0fEvbcgscnXPl2IbJvqKAk
|
||||
湖北卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN911989BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUTjwoxLREP8RbFWdRUM4faswoDIwMxbrlyyVy9x6ZDKnEdPk51m%2FYpbAXpN4hljdv%2Fuo7x98HZteEPqTZvSaqAE
|
||||
湖南卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN181358BESTVSMGSMG9/index.m3u8?AuthInfo=LeeLm7fxHHFwZahyMzl5ogiSnfzPlncDU3c0s0oCKsWsEZySe%2Bkut33UVqIiB65CfM7MDQ1hYUcQovfIFJ9Z6Q%3D%3D
|
||||
贵州卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN4252663BESTVSMGSMG9/index.m3u8?AuthInfo=HvxAnviJgPXDnk9P57ymipwrKylweon0UUP7l8%2Ft60bzXPxslYs8q1sd2Vjyy0qkPM1AiRtWIl9fFGxElNWd0Q%3D%3D
|
||||
重庆卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN3840707BESTVSMGSMG9/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUexeCsKxlG2LwkJhai31bTFVx1a9Sup7dkPMGVMX2%2Byf7FdK%2F47YrMnN4FTTQ%2B1lu6KCMf7MV7FmSuEDyoLe%2Bvo
|
||||
黑龙江卫视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN181356BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUXUvBVoIpV7IZ8uInlLPonswoDIwMxbrlyyVy9x6ZDKn9MTOKFsVhR5Pg7Vvr2jf7Z0qxx5spaZs3xlZNl%2FA5wE
|
||||
|
||||
四川卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226338/index.m3u8
|
||||
河北卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226406/index.m3u8
|
||||
河南卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8
|
||||
海南卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8
|
||||
东南卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226341/index.m3u8
|
||||
贵州卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226474/index.m3u8
|
||||
吉林卫视,http://[2409:8087:1a0b:df::4020]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226397/index.m3u8
|
||||
|
||||
东南卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226341/index.m3u8
|
||||
东方卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225735/index.m3u8
|
||||
东方卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226345/index.m3u8
|
||||
北京卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225728/index.m3u8
|
||||
北京卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226450/index.m3u8
|
||||
吉林卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226397/index.m3u8
|
||||
四川卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226338/index.m3u8
|
||||
天津卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225740/index.m3u8
|
||||
天津卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226459/index.m3u8
|
||||
安徽卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226391/index.m3u8
|
||||
山东卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226456/index.m3u8
|
||||
广东卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226248/index.m3u8
|
||||
江苏卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225613/index.m3u8
|
||||
江苏卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226310/index.m3u8
|
||||
江西卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226344/index.m3u8
|
||||
河北卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226406/index.m3u8
|
||||
河南卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226480/index.m3u8
|
||||
浙江卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225612/index.m3u8
|
||||
浙江卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226339/index.m3u8
|
||||
海南卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8
|
||||
湖北卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225627/index.m3u8
|
||||
湖北卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226477/index.m3u8
|
||||
湖南卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225610/index.m3u8
|
||||
湖南卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226307/index.m3u8
|
||||
贵州卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226474/index.m3u8
|
||||
重庆卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226409/index.m3u8
|
||||
深圳卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226313/index.m3u8
|
||||
深圳卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225739/index.m3u8
|
||||
江苏卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226310/index.m3u8
|
||||
江苏卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225613/index.m3u8
|
||||
东方卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226345/index.m3u8
|
||||
东方卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225735/index.m3u8
|
||||
山东卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226456/index.m3u8
|
||||
广东卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226248/index.m3u8
|
||||
安徽卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226391/index.m3u8
|
||||
浙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226339/index.m3u8
|
||||
浙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225612/index.m3u8
|
||||
北京卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226450/index.m3u8
|
||||
北京卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225728/index.m3u8
|
||||
湖南卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226307/index.m3u8
|
||||
湖南卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225610/index.m3u8
|
||||
深圳卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226313/index.m3u8
|
||||
深圳卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225739/index.m3u8
|
||||
天津卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226459/index.m3u8
|
||||
天津卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225740/index.m3u8
|
||||
湖北卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226477/index.m3u8
|
||||
湖北卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221225627/index.m3u8
|
||||
辽宁卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226546/index.m3u8
|
||||
辽宁卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226546/index.m3u8
|
||||
重庆卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226409/index.m3u8
|
||||
河北卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226406/index.m3u8
|
||||
江西卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226344/index.m3u8
|
||||
海南卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226465/index.m3u8
|
||||
吉林卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226397/index.m3u8
|
||||
贵州卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226474/index.m3u8
|
||||
东南卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226341/index.m3u8
|
||||
河南卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226480/index.m3u8
|
||||
四川卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226338/index.m3u8
|
||||
广西卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226549/index.m3u8
|
||||
广西卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226549/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226327/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226327/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226525/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226582/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226532/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226585/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226531/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226419/index.m3u8
|
||||
黑龙江卫视,http://ottrrs.hl.chinamobile.com/TVOD/88888888/224/3221226467/index.m3u8
|
||||
|
||||
湖南卫视,http://iptv123.msns.cn:9901/tsfile/live/0128_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
天津卫视,http://iptv123.msns.cn:9901/tsfile/live/0135_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
陕西卫视,http://iptv123.msns.cn:9901/tsfile/live/0136_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
山西卫视,http://iptv123.msns.cn:9901/tsfile/live/0118_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
|
||||
北京卫视,http://1.24.190.98:10080/hls/68/index.m3u8
|
||||
东方卫视,http://1.24.190.98:10080/hls/66/index.m3u8
|
||||
江苏卫视,http://1.24.190.98:10080/hls/61/index.m3u8
|
||||
深圳卫视,http://1.24.190.98:10080/hls/76/index.m3u8
|
||||
广东卫视,http://1.24.190.98:10080/hls/79/index.m3u8
|
||||
湖北卫视,http://1.24.190.98:10080/hls/65/index.m3u8
|
||||
天津卫视,http://1.24.190.98:10080/hls/69/index.m3u8
|
||||
河北卫视,http://1.24.190.98:10080/hls/78/index.m3u8
|
||||
贵州卫视,http://1.24.190.98:10080/hls/91/index.m3u8
|
||||
黑龙江卫视,http://1.24.190.98:10080/hls/70/index.m3u8
|
||||
辽宁卫视,http://1.24.190.98:10080/hls/72/index.m3u8
|
||||
山东卫视,http://1.24.190.98:10080/hls/83/index.m3u8
|
||||
安徽卫视,http://1.24.190.98:10080/hls/85/index.m3u8
|
||||
四川卫视,http://1.24.190.98:10080/hls/86/index.m3u8
|
||||
海南卫视,http://1.24.190.98:10080/hls/99/index.m3u8
|
||||
内蒙古卫视,http://1.24.190.98:10080/hls/31/index.m3u8
|
||||
东南卫视,http://1.24.190.98:10080/hls/88/index.m3u8
|
||||
广西卫视,http://1.24.190.98:10080/hls/90/index.m3u8
|
||||
吉林卫视,http://1.24.190.98:10080/hls/71/index.m3u8
|
||||
青海卫视,http://1.24.190.98:10080/hls/96/index.m3u8
|
||||
|
||||
北京卫视,http://111.14.181.15:9901/tsfile/live/0122_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
天津卫视,http://111.14.181.15:9901/tsfile/live/0135_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
贵州卫视,http://111.14.181.15:9901/tsfile/live/0120_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
东南卫视,http://111.14.181.15:9901/tsfile/live/0137_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
陕西卫视,http://111.14.181.15:9901/tsfile/live/0136_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
|
||||
山东卫视,http://58.57.21.166:9901/tsfile/live/0131_1.m3u8
|
||||
深圳卫视,http://58.57.21.166:9901/tsfile/live/0126_1.m3u8
|
||||
四川卫视,http://58.57.21.166:9901/tsfile/live/0123_1.m3u8
|
||||
云南卫视,http://58.57.21.166:9901/tsfile/live/0119_1.m3u8
|
||||
吉林卫视,http://58.57.21.166:9901/tsfile/live/0116_1.m3u8
|
||||
内蒙古卫视,http://58.57.21.166:9901/tsfile/live/0109_1.m3u8
|
||||
安徽卫视,http://58.57.21.166:9901/tsfile/live/0130_1.m3u8
|
||||
广西卫视,http://58.57.21.166:9901/tsfile/live/0113_1.m3u8
|
||||
山西卫视,http://58.57.21.166:9901/tsfile/live/0118_1.m3u8
|
||||
江西卫视,http://58.57.21.166:9901/tsfile/live/0138_1.m3u8
|
||||
青海卫视,http://58.57.21.166:9901/tsfile/live/0140_1.m3u8
|
||||
宁夏卫视,http://58.57.21.166:9901/tsfile/live/0112_1.m3u8
|
||||
甘肃卫视,http://58.57.21.166:9901/tsfile/live/0141_1.m3u8
|
||||
海南卫视,http://58.57.21.166:9901/tsfile/live/1000_1.m3u8
|
||||
|
||||
地方频道,#genre#
|
||||
安徽|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=24
|
||||
安徽|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=34
|
||||
安徽|国际,http://api2.52tb.xyz/info?id=586&token=20230405tndmhg
|
||||
安徽|影视,http://112.30.194.221:20080/live/d18ff95cb1fb4bbcb56215e189fc12be.flv
|
||||
安徽|影视,http://112.30.194.221:20080/live/d18ff95cb1fb4bbcb56215e189fc12be/hls.m3u8
|
||||
安徽|影视,http://112.30.194.221:20080/live/d18ff95cb1fb4bbcb56215e189fc12be/hls.m3u8?zanhd
|
||||
安徽|经济生活,http://112.30.194.221:20080/live/eac499adad7b49ff9cfa79ba84693959/hls.m3u8
|
||||
安徽|经济生活,http://112.30.194.221:20080/live/eac499adad7b49ff9cfa79ba84693959.flv
|
||||
安徽|综艺体育,http://112.30.194.221:20080/live/c41f112b83f644ddb082669501c8ecd3/hls.m3u8
|
||||
安徽|综艺体育,http://112.30.194.221:20080/live/c41f112b83f644ddb082669501c8ecd3/hls.m3u8?zanhd
|
||||
安徽|综艺体育,http://112.30.194.221:20080/live/c41f112b83f644ddb082669501c8ecd3.flv
|
||||
安徽|导视,https://livehls1.appcoo.com/liveshopping/949E0A98C9D0C311/6D925141BC1F8C28/index.m3u8
|
||||
安徽|合肥公共,http://api2.52tb.xyz/info?id=588&token=20230405tndmhg
|
||||
安徽|合肥新闻,http://api2.52tb.xyz/info?id=587&token=20230405tndmhg
|
||||
安徽|固镇新闻,http://www.guzhenm.com:7001/hls/hd-live.m3u8?zanhd
|
||||
安徽|歙县综合频道,http://112.30.194.221:20080/live/4b3024127d1c472986ccdcb454f81a9f/hls.m3u8?zanhd
|
||||
安徽|宿州公共,http://live.ahsz.tv/video/s10001-ggpd/index.m3u8?zanhd
|
||||
安徽|宿州公共,http://live.ahsz.tv/video/s10001-ggpd/index.m3u8
|
||||
安徽|宿州科教,http://live.ahsz.tv/video/s10001-kxjy/index.m3u8
|
||||
安徽|宿州新闻综合,http://live.ahsz.tv/video/s10001-szzh/index.m3u8
|
||||
安徽|肥西新闻,http://112.30.194.221:20080/live/7210e3a27cc64ac4a3f7aba2e2b683d5.flv
|
||||
安徽|肥西综合,http://112.30.194.221:20080/live/7210e3a27cc64ac4a3f7aba2e2b683d5/hls.m3u8
|
||||
安徽|肥西综合,http://112.30.194.221:20080/live/7210e3a27cc64ac4a3f7aba2e2b683d5/hls.m3u8?zanhd
|
||||
|
||||
北京|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225931/index.m3u8
|
||||
北京|石景山有线,http://live.sjsrm.com/bjsjs/sd/live.m3u8?zbeid
|
||||
北京|房山无线,http://live.funhillrm.com/2/sd/live.m3u8?zbeid
|
||||
|
||||
重庆|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225963/index.m3u8
|
||||
重庆|卫视,http://[2409:8087:5e01:34::22]:6610/ZTE_CMS/00000001000000060000000000000523/index.m3u8?IAS
|
||||
重庆|卫视,http://[2409:8087:5e01:34::23]:6610/ZTE_CMS/00000001000000060000000000000523/index.m3u8?IAS
|
||||
重庆|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=39
|
||||
重庆|璧山综合,http://222.179.42.129:8181/hls1.m3u8?zzhongqd
|
||||
重庆|万源新闻综合,http://live.wanyuannews.com/wytv/hd/live.m3u8
|
||||
|
||||
福建|东南卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=19
|
||||
福建|云霄综合,http://live.zzyxxw.com:85/live/xwzh.m3u8
|
||||
福建|云霄综合,http://live.zzyxxw.com:85/live/xwzh.m3u8?fujian
|
||||
福建|建宁综合,https://p2.weizan.cn/2144741973/075444991326676404/live.m3u8?zfud
|
||||
福建|漳州新闻,http://31182.hlsplay.aodianyun.com/lms_31182/tv_channel_175.m3u8
|
||||
福建|漳州新闻,http://31182.hlsplay.aodianyun.com/lms_31182/tv_channel_175.m3u8?zfud
|
||||
福建|龙岩公共,http://live.lytv.net.cn/ggpd/sd/live.m3u8
|
||||
福建|龙岩综合,http://live.lytv.net.cn/zhpwd/hd/live.m3u8
|
||||
|
||||
甘肃|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=28
|
||||
甘肃|崆峒综合,http://125.74.200.110:10080/hls/001/001_live.m3u8?gansu
|
||||
|
||||
广东|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225966/index.m3u8
|
||||
广东|卫视,http://mywlkj.ddns.net:754/tv/gdgzdx.php?id=18
|
||||
广东|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=25
|
||||
广东|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=42
|
||||
广东|珠江,http://php.jdshipin.com:8880/chudian.php?id=gdzj
|
||||
广东|体育,http://php.jdshipin.com:8880/chudian.php?id=gdty
|
||||
广东|国际,http://php.jdshipin.com:8880/chudian.php?id=gdgj
|
||||
广东|移动,http://php.jdshipin.com:8880/chudian.php?id=gdyd
|
||||
广东|广州新闻,http://php.jdshipin.com:8880/gztv.php?id=xinwen
|
||||
广东|广州竞赛,http://php.jdshipin.com:8880/gztv.php?id=jingsai
|
||||
广东|广州影视,http://php.jdshipin.com:8880/gztv.php?id=yingshi
|
||||
广东|广州法治,http://php.jdshipin.com:8880/gztv.php?id=fazhi
|
||||
广东|广州南国都市,http://php.jdshipin.com:8880/gztv.php?id=shenghuo
|
||||
广东|深圳都市,http://livepull-tcyzb.sztv.com.cn/showto_live/dushi01.m3u8
|
||||
广东|番禺电视台,http://video.epaper.pybtv.cn:8080/live/rtmp_live_demo.flv
|
||||
广东|东莞新闻综合,http://php.jdshipin.com:8880/0769.php?id=xwzh
|
||||
广东|东莞生活资讯,http://php.jdshipin.com:8880/0769.php?id=shzx
|
||||
广东|佛山综合,http://php.jdshipin.com:8880/fstv.php?id=fszh
|
||||
广东|佛山影视,http://php.jdshipin.com:8880/fstv.php?id=fsys
|
||||
广东|佛山公共,http://php.jdshipin.com:8880/fstv.php?id=fsgg
|
||||
广东|佛山南海,http://php.jdshipin.com:8880/fstv.php?id=fsnh
|
||||
广东|佛山顺德,http://php.jdshipin.com:8880/fstv.php?id=fssd
|
||||
广东|佛山三水,http://php.jdshipin.com:8880/fstv.php?id=fsss
|
||||
广东|云浮综合,https://livestream.oeeee.com/slive/17806.m3u8
|
||||
广东|云浮文旅,https://livestream.oeeee.com/slive/17807.m3u8
|
||||
广东|河源综合,http://tmpstream.hyrtv.cn/xwzh/sd/live.m3u8
|
||||
广东|河源公共,http://tmpstream.hyrtv.cn/hygg/sd/live.m3u8
|
||||
广东|潮州综合,http://time-vod-qhlive.sobeylive.com/czbtv2019/czzhpd.m3u8
|
||||
广东|潮州民生,http://time-vod-qhlive.sobeylive.com/czbtv2019/czggpd.m3u8
|
||||
广东|GRTN文化频道,https://glive.grtn.cn/live/wenhua_test0203.m3u8
|
||||
广东|GRTN生活频道,http://glive.grtn.cn/live/life.m3u8
|
||||
广东|GRTN纪录片频道,http://glive.grtn.cn/live/jilupian.m3u8
|
||||
广东|GRTN健康频道,http://glive.grtn.cn/live/health.m3u8
|
||||
广东|GRTN荔枝台,http://glive.grtn.cn/live/lizhi.m3u8
|
||||
广东|河源综合,http://php.jdshipin.com:8880/chudian.php?id=hyzh
|
||||
广东|河源公共,http://php.jdshipin.com:8880/chudian.php?id=hygg
|
||||
广东|连平台,http://php.jdshipin.com:8880/chudian.php?id=lpzh
|
||||
广东|惠东综合,http://php.jdshipin.com:8880/chudian.php?id=hdzh
|
||||
广东|开平综合,http://php.jdshipin.com:8880/chudian.php?id=kpzh
|
||||
广东|开平生活,http://php.jdshipin.com:8880/chudian.php?id=kpsh
|
||||
广东|广宁综合,http://php.jdshipin.com:8880/chudian.php?id=gnzh
|
||||
广东|化州综合,http://php.jdshipin.com:8880/chudian.php?id=hzzh
|
||||
广东|鹤山综合,http://php.jdshipin.com:8880/chudian.php?id=hszh
|
||||
广东|廉江综合,http://php.jdshipin.com:8880/chudian.php?id=ljzh
|
||||
广东|英德新闻综合,http://php.jdshipin.com:8880/chudian.php?id=ydxw
|
||||
广东|普宁综合,http://php.jdshipin.com:8880/chudian.php?id=pnzh
|
||||
广东|紫金综合,http://php.jdshipin.com:8880/chudian.php?id=zjzh
|
||||
广东|阳春综合,http://php.jdshipin.com:8880/chudian.php?id=yczh
|
||||
广东|惠阳电视台,http://php.jdshipin.com:8880/chudian.php?id=hytv
|
||||
广东|信宜综合,http://php.jdshipin.com:8880/chudian.php?id=xyzh
|
||||
广东|台山台,http://php.jdshipin.com:8880/chudian.php?id=tstv
|
||||
广东|遂溪台,http://php.jdshipin.com:8880/chudian.php?id=sxtv
|
||||
广东|新会综合,http://php.jdshipin.com:8880/chudian.php?id=xhzh
|
||||
广东|罗定综合,http://php.jdshipin.com:8880/chudian.php?id=ldzh
|
||||
广东|东源台,http://php.jdshipin.com:8880/chudian.php?id=dytv
|
||||
广东|吴川综合,http://php.jdshipin.com:8880/chudian.php?id=wczh
|
||||
广东|乐昌电视台,http://php.jdshipin.com:8880/chudian.php?id=lctv
|
||||
广东|潮安综合,http://php.jdshipin.com:8880/chudian.php?id=cazh
|
||||
广东|深圳都市,http://livepull-tcyzb.sztv.com.cn/live/dushi01.m3u8
|
||||
广东|工布江达县广播电视台,http://php.jdshipin.com:8880/chudian.php?id=gbjd
|
||||
广东|GRTN文化频道,http://glive.grtn.cn/live/wenhua_test0203.m3u8
|
||||
|
||||
广西|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=26
|
||||
广西|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=44
|
||||
广西|新闻,http://116.9.204.242:9901/tsfile/live/1001_1.m3u8
|
||||
广西|罗城综合,http://111.12.75.177:9100/lctvlive/lch.m3u8
|
||||
广西|北海新闻,http://rtmp.gdlive.gdmain.com/live/09em4xbl.flv
|
||||
广西|北海新闻,http://rtmp.gdlive.gdmain.com/live/09em4xbl.m3u8
|
||||
广西|桂林新闻,https://pull.gltvs.com/live/glxw/playlist.m3u8?v=b0528684bf934e120e1c30fc808e6576&t=1796868188
|
||||
广西|贺州,http://zhz.gxhzxw.com:2935/live/HZXW-HD/chunklist.m3u8
|
||||
广西|贺州,http://zhz.gxhzxw.com:2935/live/HZXW-HD/playlist.m3u8
|
||||
广西|罗城综合,http://111.12.75.177:9100/lctvlive/lch.m3u8?zguangxd
|
||||
|
||||
贵州|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225974/index.m3u8
|
||||
贵州|卫视,http://[2409:8087:5e01:34::22]:6610/ZTE_CMS/00000001000000060000000000000489/index.m3u8?IAS
|
||||
贵州|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=46
|
||||
贵州|松桃新闻,http://live.strmtzx.cn/stxw/sd/live.m3u8
|
||||
贵州|石阡新闻,http://111.123.209.13:9000/hls/main/playlist.m3u8
|
||||
贵州|七星关电视台,https://p8.vzan.com:443/slowlive/147077707554082780/live.m3u8
|
||||
贵州|道真新闻综合,http://live.dzrmtzx.org.cn:90/live/dspd_1M.m3u8
|
||||
贵州|凤冈综合,http://live.fgxrmtzx.cn:90/live/zhpd.m3u8
|
||||
|
||||
海南|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225978/index.m3u8
|
||||
海南|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=33
|
||||
海南|公共,http://[2409:8087:5e01:34::21]:6610/ZTE_CMS/08984400000000060000000000000382/index.m3u8?IAS
|
||||
海南|少儿,http://[2409:8087:5e00:24::1f]:6060/ZTE_CMS/08984400000000060000000000000323/1.m3u8
|
||||
海南|少儿,http://[2409:8087:5e01:34::21]:6610/ZTE_CMS/08984400000000060000000000000323/index.m3u8?
|
||||
海南|文旅,http://[2409:8087:5e00:24::1f]:6060/ZTE_CMS/08984400000000060000000000000322/1.m3u8
|
||||
海南|文旅,http://[2409:8087:5e01:34::21]:6610/ZTE_CMS/08984400000000060000000000000322/index.m3u8?fmmv6
|
||||
海南|文旅,http://[2409:8087:5e01:34::22]:6610/ZTE_CMS/08984400000000060000000000000322/index.m3u8?
|
||||
海南|文旅,http://[2409:8087:5e01:34::22]:6610/ZTE_CMS/08984400000000060000000000000322/index.m3u8?IAS
|
||||
海南|新闻,http://[2409:8087:5e00:24::1f]:6060/ZTE_CMS/08984400000000060000000000000321/1.m3u8
|
||||
海南|新闻,http://[2409:8087:5e01:34::20]:6610/ZTE_CMS/08984400000000060000000000000321/index.m3u8?
|
||||
海南|自贸,http://[2409:8087:5e01:34::20]:6610/ZTE_CMS/08984400000000060000000000000320/index.m3u8?
|
||||
|
||||
河北|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225961/index.m3u8
|
||||
河北|卫视,http://[2409:8087:5e01:34::22]:6610/ZTE_CMS/00000001000000060000000000000487/index.m3u8?IAS
|
||||
河北|卫视,http://[2409:8087:5e01:34::38]:6610/ZTE_CMS/00000001000000060000000000000487/index.m3u8?
|
||||
河北|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=30
|
||||
河北|武汉生活,http://stream.appwuhan.com/3tzb/sd/live.m3u8
|
||||
河北|武汉教育,http://stream.appwuhan.com/jyzb/sd/live.m3u8
|
||||
河北|荆门新闻,http://stream.jmtv.com.cn/xwzh/sd/live.m3u8
|
||||
河北|荆门公共,http://stream.jmtv.com.cn/ngpd/sd/live.m3u8
|
||||
河北|荆门教育,http://stream.jmtv.com.cn/ggsh/sd/live.m3u8
|
||||
河北|任丘文娱,https://jwcdnqx.hebyun.com.cn/live/rqtv2/1500k/tzwj_video.m3u8
|
||||
河北|任丘综合,https://jwcdnqx.hebyun.com.cn/live/rqtv1/1500k/tzwj_video.m3u8
|
||||
河北|兴隆综合,https://jwcdnqx.hebyun.com.cn/live/xlzh/1500k/tzwj_video.m3u8
|
||||
河北|大厂一套,http://60.10.185.184:1935/live/dc1.stream/playlist.m3u8
|
||||
河北|平泉影视,https://jwliveqxzb.hebyun.com.cn/pqys/pqys.m3u8
|
||||
河北|平泉综合,https://jwliveqxzb.hebyun.com.cn/pqzh/pqzh.m3u8
|
||||
河北|昌黎,http://jwliveqxzb.hebyun.com.cn/clzhpd/clzhpd.flv
|
||||
河北|昌黎,http://livebroadcast.ccwb.cn/live/w1619693259142907.flv
|
||||
河北|清河新闻综合,https://jwcdnqx.hebyun.com.cn/live/qinghe/1500k/tzwj_video.m3u8
|
||||
河北|清河经济综艺,https://jwcdnqx.hebyun.com.cn/live/qinghe1/1500k/tzwj_video.m3u8
|
||||
河北|石家庄娱乐,http://pluslive1.sjzntv.cn/yule/playlist.m3u8?zhebd
|
||||
河北|石家庄综合,http://pluslive1.sjzntv.cn/xmzh/playlist.m3u8?zhebd
|
||||
河北|石家庄生活,http://pluslive1.sjzntv.cn/shenghuo/playlist.m3u8?zhebd
|
||||
河北|石家庄都市,http://pluslive1.sjzntv.cn/dushi/playlist.m3u8?zhebd
|
||||
河北|衡山,http://live.hznet.tv:1935/live/live1/500K/tzwj_video.m3u8
|
||||
河北|邯郸公共,https://jwliveqxzb.hebyun.com.cn/hdgg/hdgg.m3u8
|
||||
河北|邯郸公共,https://jwcdnqx.hebyun.com.cn/live/hdgg/1500k/tzwj_video.m3u8?zhebd
|
||||
河北|邯郸新闻,https://jwliveqxzb.hebyun.com.cn/hdxwzh/hdxwzh.m3u8
|
||||
河北|邯郸科教,https://jwcdnqx.hebyun.com.cn/live/hdkj/1500k/tzwj_video.m3u8?zhebd
|
||||
河北|邯郸科教,https://jwliveqxzb.hebyun.com.cn/hdkj/hdkj.m3u8?zhebd
|
||||
河北|邯郸科教,https://jwliveqxzb.hebyun.com.cn/hdkj/hdkj.m3u8
|
||||
河北|鹿泉一套,https://jwcdnqx.hebyun.com.cn/live/luquanyi/1500k/tzwj_video.m3u8?zhebd
|
||||
河北|鹿泉一套,https://jwliveqxzb.hebyun.com.cn/luquanyi/luquanyi.m3u8
|
||||
河北|鹿泉一套,https://jwliveqxzb.hebyun.com.cn/luquanyi/luquanyi.m3u8?zhebd
|
||||
|
||||
河南|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225988/index.m3u8
|
||||
河南|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=31
|
||||
河南|梨园,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380788ba7bed/index.m3u8?AuthInfo=toEYVdLfxymUP2l9NZpQI5%2BK6T7j%2FlRm%2BvbM9VO7bA0q1S1k1f36SqqriM0FZoFSAJRfCt8SS7X6sTRmXb81a8O4H%2FdroDKjLoDeaMQdyJQ
|
||||
河南|梨园,http://live.dxhmt.cn:9080/19903718786/3159ec673c114135816d45dd52ad7396.m3u8
|
||||
河南|临颍综合,http://tvpull.dxhmt.cn:9081/tv/11122-1.m3u8
|
||||
河南|义马新闻综合,http://tvpull.dxhmt.cn:9081/tv/11281-1.m3u8
|
||||
河南|光山综合,http://tvpull.dxhmt.cn:9081/tv/11522-1.m3u8
|
||||
河南|兰考新闻,http://live.dxhmt.cn:9081/tv/10225-1.m3u8
|
||||
河南|兰考新闻,http://tvpull.dxhmt.cn:9081/tv/10225-1.m3u8
|
||||
河南|内黄综合频道,http://tvpull.dxhmt.cn:9081/tv/10527-1.m3u8?zhend
|
||||
河南|卫辉综合频道,http://tvpull.dxhmt.cn:9081/tv/10781-1.m3u8?zhend
|
||||
河南|叶县,http://tvpull.dxhmt.cn:9081/tv/10422-1.m3u8
|
||||
河南|叶县,http://live.dxhmt.cn:9081/tv/10422-1.m3u8
|
||||
河南|周口扶沟,http://live.dxhmt.cn:9081/tv/11621-1.m3u8
|
||||
河南|唐河一套,http://tvpull.dxhmt.cn:9081/tv/11328-1.m3u8
|
||||
河南|唐河一套,http://tvpull.dxhmt.cn:9081/tv/11328-1.m3u8?zhend
|
||||
河南|固始综合,http://tvpull.dxhmt.cn:9081/tv/11525-1.m3u8
|
||||
河南|宜阳综合频道,http://tvpull.dxhmt.cn:9081/tv/10327-1.m3u8?zhend
|
||||
河南|宝丰综合频道,http://tvpull.dxhmt.cn:9081/tv/10421-1.m3u8?zhend
|
||||
河南|嵩县综合新闻,http://tvpull.dxhmt.cn:9081/tv/10325-1.m3u8?zhend
|
||||
河南|巩义新闻综合,http://tvpull.dxhmt.cn:9081/tv/10181-1.m3u8?zhend
|
||||
河南|扶沟综合,http://tvpull.dxhmt.cn:9081/tv/11621-1.m3u8
|
||||
河南|扶沟综合,http://tvpull.dxhmt.cn:9081/tv/11621-1.m3u8?zhend
|
||||
河南|新乡县电视台,http://tvpull.dxhmt.cn:9081/tv/10721-1.m3u8
|
||||
河南|新乡县电视台,http://tvpull.dxhmt.cn:9081/tv/10721-1.m3u8?zhend
|
||||
河南|新县综合,http://tvpull.dxhmt.cn:9081/tv/11523-1.m3u8
|
||||
河南|新安新闻综合,http://tvpull.dxhmt.cn:9081/tv/10323-1.m3u8?zhend
|
||||
河南|新蔡综合,http://tvpull.dxhmt.cn:9081/tv/11729-1.m3u8
|
||||
河南|新野综合,http://tvpull.dxhmt.cn:9081/tv/11329-1.m3u8?zhend
|
||||
河南|方城一套,http://tvpull.dxhmt.cn:9081/tv/11322-1.m3u8?zhend
|
||||
河南|桐柏新闻综合,http://tvpull.dxhmt.cn:9081/tv/11330-1.m3u8
|
||||
河南|桐柏新闻综合,http://tvpull.dxhmt.cn:9081/tv/11330-1.m3u8?zhend
|
||||
河南|泌阳新闻综合,http://tvpull.dxhmt.cn:9081/tv/11726-1.m3u8
|
||||
河南|济源电视一套,http://tvpull.dxhmt.cn:9081/tv/19001-1.m3u8?zhend
|
||||
河南|淅川电视,http://live.dxhmt.cn:9081/tv/11326-1.m3u8
|
||||
河南|渑池新闻综合,http://tvpull.dxhmt.cn:9081/tv/11221-1.m3u8
|
||||
河南|温县综合,http://tvpull.dxhmt.cn:9081/tv/10825-1.m3u8?zhend
|
||||
河南|滑县新闻,http://tvpull.dxhmt.cn:9081/tv/10526-1.m3u8?zhend
|
||||
河南|潢川综合,http://tvpull.dxhmt.cn:9081/tv/11526-1.m3u8
|
||||
河南|灵宝新闻综合,http://tvpull.dxhmt.cn:9081/tv/11282-1.m3u8?zhend
|
||||
河南|焦作公共,http://zhpull.dxhmt.cn/jiaozuo/29b65b69130c4ef1a3283cc7b913da05/playlist.m3u8
|
||||
河南|焦作公共,http://zhpull.dxhmt.cn/jiaozuo/29b65b69130c4ef1a3283cc7b913da05/playlist.m3u8?zhend
|
||||
河南|焦作综合,http://zhpull.dxhmt.cn/jiaozuo/b75a92c9503e47cf9e89f7ff247b65f2/playlist.m3u8
|
||||
河南|焦作综合,http://zhpull.dxhmt.cn/jiaozuo/b75a92c9503e47cf9e89f7ff247b65f2/playlist.m3u8?zhend
|
||||
河南|登封综合,http://tvpull.dxhmt.cn:9081/tv/10185-1.m3u8
|
||||
河南|禹州公共,http://tvpull.dxhmt.cn/tv/11081-2.m3u8?zhend
|
||||
河南|禹州公共,http://tvpull.dxhmt.cn:9081/tv/11081-2.m3u8
|
||||
河南|禹州综合,http://live.dxhmt.cn:9081/tv/11081-1.m3u8
|
||||
河南|禹州综合,http://tvpull.dxhmt.cn:9081/tv/11081-1.m3u8
|
||||
河南|禹州综合,http://tvpull.dxhmt.cn:9081/tv/11081-1.m3u8?zhend
|
||||
河南|荥阳综合,http://tvpull.dxhmt.cn:9081/tv/10182-1.m3u8?zhend
|
||||
河南|西华综合,http://tvpull.dxhmt.cn:9081/tv/11622-1.m3u8?zhend
|
||||
河南|邓州新闻,http://tvpull.dxhmt.cn:9081/tv/11381-1.m3u8?zhend
|
||||
河南|郏县综合,http://tvpull.dxhmt.cn:9081/tv/10425-1.m3u8?zhend
|
||||
河南|郸城新闻综合,http://live.dxhmt.cn:9081/tv/11625-1.m3u8
|
||||
河南|鄢陵综合,http://tvpull.dxhmt.cn:9081/tv/11024-1.m3u8
|
||||
河南|项城新闻,http://tvpull.dxhmt.cn:9081/tv/11681-1.m3u8
|
||||
河南|鹿邑新闻频道,http://tvpull.dxhmt.cn:9081/tv/11628-1.m3u8?zhend
|
||||
|
||||
湖北|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225975/index.m3u8
|
||||
湖北|公共新闻,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380726d0ee3b/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNKgjpyhD%2FJd6SZjkcHAKXbsjwotAY57dianC4%2ByY7artm7J7F4GFO6G99D0bYMJRxI
|
||||
湖北|垄上,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638072463c333/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNL%2Be1h4FfA5QqwJ7IPOz3p2qIS7djSxm17Htd%2FckZkm%2FVqsKHEJFJt26ju9iibzMEo
|
||||
湖北|影视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN6380728abccd2/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNKU1xiiKGJYFBZK9RpEkaggogtHJZW6nJQqLppbEYE%2BqJ9kJW%2FMvKldfS2dCii9VSI
|
||||
湖北|教育,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638072a6cbbf6/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNKTFQuOKNd5i0HMa3ydMWIQ6kJ2fBJGJ77BLTXK72CqUYQsX3ZguYt0954s9hfZTfc
|
||||
湖北|生活,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638072c62e405/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNKJPodw5BcDirSOw7egztI5bUvJjqPzSNAhrA37GrbRBIAjGQpzP0QmgsmuHnQyd2c
|
||||
湖北|经视,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN63807203543e3/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNLVCQ3pDe4nBySab%2B3xPL123aTSCRugzF2ABe36IIJw2evZbYdWUo0ffUw53bflDgU
|
||||
湖北|综合,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638072216f7da/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUUAdKgLqNB5aOAUhcp5CeNLx3R3LdIBdA5q61lut1LwZcw4SC2tJubc%2Bq5t%2F61jvWCtjrJL0x%2BHncPgdmcbBW9I
|
||||
湖北|武汉新闻,http://stream.appwuhan.com/1tzb/sd/live.m3u8
|
||||
湖北|武汉经济,http://stream.appwuhan.com/4tzb/sd/live.m3u8
|
||||
湖北|荆门新闻综合,http://stream.jmtv.com.cn/xwzh/sd/live.m3u8?zhubd
|
||||
湖北|崇阳综合,http://61.184.176.248:10500/live/live.m3u8
|
||||
湖北|十堰新闻,http://p8.vzan.com/slowlive/034028687228317362/live.m3u8
|
||||
|
||||
湖南|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=36
|
||||
湖南|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=37
|
||||
湖南|金鹰纪实,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN4766929BESTVSMGSMG/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUaWf4k%2B88FALXqp3i7ExZ4HArfvJF2pWpm4RxcBNhZ7j8oKdkoj6hFDX2k81AyJk8L2ZgQL4lTNsyfhwMVyjNWA
|
||||
湖南|金鹰纪实,http://[2409:8087:5e01:34::20]:6610/ZTE_CMS/00000001000000060000000000000482/index.m3u8?IAS
|
||||
湖南|快乐垂钓,http://[2409:8087:4c0a:22:1::11]:6410/170000001115/UmaiCHAN638729b6002c4/index.m3u8?AuthInfo=9kOOdBn7MFF%2F2bWjKgahUSBx06ZL9Bo6JOM%2BSTjxZRJiJ8tFyWVQ4LIMJg%2BXyuQCUUYb4If0LygirGPvYsbTi60DjU3KKPbFtbFrR1EGj%2FI
|
||||
湖南|湘潭新闻综合,http://live.hnxttv.com:9601/live/xwzh/800K/tzwj_video.m3u8?zhund
|
||||
|
||||
黑龙江|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=40
|
||||
黑龙江|少儿,http://[2409:8087:1a01:df::4035]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8
|
||||
黑龙江|少儿,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225979/index.m3u8
|
||||
黑龙江|少儿,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8?icpid=88888888&from=1&hms_devid=1012&vqe=3
|
||||
黑龙江|少儿,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226304/index.m3u8
|
||||
黑龙江|影视,http://[2409:8087:1a01:df::4035]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8
|
||||
黑龙江|影视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225973/index.m3u8
|
||||
黑龙江|影视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8?icpid=88888888&from=1&hms_devid=1012&vqe=3
|
||||
黑龙江|影视,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226298/index.m3u8
|
||||
黑龙江|文体,http://[2409:8087:1a01:df::4025]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8
|
||||
黑龙江|文体,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225965/index.m3u8
|
||||
黑龙江|文体,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8?icpid=88888888&from=1&hms_devid=1012&vqe=3
|
||||
黑龙江|文体,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226239/index.m3u8
|
||||
黑龙江|新闻,http://[2409:8087:1a01:df::4036]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226330/1.m3u8
|
||||
黑龙江|新闻,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226330/1.m3u8?icpid=88888888&from=1&hms_devid=1012&vqe=3
|
||||
黑龙江|新闻,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226330/index.m3u8
|
||||
黑龙江|新闻,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226330/index.m3u8
|
||||
黑龙江|科教,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8?icpid=88888888&from=1&hms_devid=1012&vqe=3
|
||||
黑龙江|科教,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226242/index.m3u8
|
||||
黑龙江|科教,http://[2409:8087:1a01:df::4025]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8
|
||||
黑龙江|科教,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225994/index.m3u8
|
||||
黑龙江|都市,http://[2409:8087:1a01:df::4025]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226301/1.m3u8
|
||||
黑龙江|都市,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226301/1.m3u8?icpid=88888888&from=1&hms_devid=1012&vqe=3
|
||||
黑龙江|都市,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226301/index.m3u8
|
||||
黑龙江|都市,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226301/index.m3u8
|
||||
黑龙江|哈尔滨新闻综合,http://stream.hrbtv.net/xwzh/sd/live.m3u8?zheild
|
||||
黑龙江|哈尔滨影视,http://stream.hrbtv.net/yspd/sd/live.m3u8?zheild
|
||||
黑龙江|哈尔滨生活,http://stream.hrbtv.net/shpd/sd/live.m3u8?zheild
|
||||
黑龙江|哈尔滨生活,https://stream.hrbtv.net/shpd/sd/live.m3u8
|
||||
黑龙江|哈尔滨娱乐,http://stream.hrbtv.net/ylpd/sd/live.m3u8?zheild
|
||||
黑龙江|哈尔滨娱乐,https://stream.hrbtv.net/ylpd/sd/live.m3u8
|
||||
黑龙江|哈尔滨影视,https://stream.hrbtv.net/yspd/sd/live.m3u8
|
||||
黑龙江|哈尔滨都市资讯,https://stream.hrbtv.net/zxpd/sd/live.m3u8
|
||||
黑龙江|鹤岗新闻综合,http://[2409:8087:1a01:df::4060]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226534/index.m3u8
|
||||
黑龙江|佳木斯新闻综合,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226451/index.m3u8
|
||||
黑龙江|齐齐哈尔新闻综合,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226437/index.m3u8
|
||||
黑龙江|齐齐哈尔经济法制,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226555/index.m3u8
|
||||
黑龙江|双鸭山综合,http://[2409:8087:1a01:df::7005]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226529/index.m3u8
|
||||
黑龙江|大庆新闻综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226484/index.m3u8
|
||||
黑龙江|鹤岗新闻综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226534/index.m3u8
|
||||
黑龙江|佳木斯新闻综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226451/index.m3u8
|
||||
黑龙江|齐齐哈尔新闻综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226437/index.m3u8
|
||||
黑龙江|齐齐哈尔经济法制,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226555/index.m3u8
|
||||
黑龙江|双鸭山综合,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226529/index.m3u8
|
||||
黑龙江|七台河新闻综合,http://live.qthnews.org.cn:1935/live/live1/800k/tzwj_video.m3u8
|
||||
黑龙江|七台河民生社教,http://live.qthnews.org.cn:1935/live/live2/800k/tzwj_video.m3u8
|
||||
|
||||
吉林|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=24
|
||||
吉林|延边卫视,http://live.ybtvyun.com/video/s10016-6f0dfd97912f/index.m3u8?zjild
|
||||
吉林|延边卫视,http://live.ybtvyun.com/video/s10006-44f040627ca1/index.m3u8?zjild
|
||||
吉林|延边-1,http://live.ybtvyun.com/video/s10016-af95004b6d1a/index.m3u8?zjild
|
||||
吉林|延边-2,http://live.ybtvyun.com/video/s10006-04819ee234a7/index.m3u8?zjild
|
||||
吉林|延边朝鲜语综合,http://live.ybtvyun.com/video/s10006-b571c289a478/index.m3u8?zjild
|
||||
吉林|延边朝鲜语综合,http://live.ybtvyun.com/video/s10016-19a16c47eb99/index.m3u8?zjild
|
||||
吉林|通化县综合,http://stream5.jlntv.cn/thx/sd/live.m3u8
|
||||
吉林|龙井综合,http://stream8.jlntv.cn/ljtv/sd/live.m3u8
|
||||
吉林|德惠综合,http://stream11.jlntv.cn/dehuitv/sd/live.m3u8?zjild
|
||||
吉林|珲春新闻综合,http://stream8.jlntv.cn/hctv/sd/live.m3u8?zjild
|
||||
吉林|靖宇综合,http://stream8.jlntv.cn/jytv/sd/live.m3u8?zjild
|
||||
吉林|龙井综合,http://stream8.jlntv.cn/ljtv/sd/live.m3u8?zjild
|
||||
吉林|通化县综合,http://stream5.jlntv.cn/thx/sd/live.m3u8?zjild
|
||||
吉林|汪清综合,http://stream5.jlntv.cn/wq/sd/live.m3u8?zjild
|
||||
|
||||
江苏|卫视,http://mywlkj.ddns.net:754/tv/gdgzdx.php?id=22
|
||||
江苏|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=28
|
||||
江苏|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=39
|
||||
江苏|南京信息,http://live.nbs.cn/channels/njtv/xxpd/m3u8:500k/live.m3u8
|
||||
江苏|南京十八,http://live.nbs.cn/channels/njtv/sbpd/m3u8:500k/live.m3u8
|
||||
江苏|南京娱乐,http://live.nbs.cn/channels/njtv/ylpd/m3u8:500k/live.m3u8
|
||||
江苏|如东新闻,http://rudong-tv-hls.cm.jstv.com/rudong-tv/rdxwzh.m3u8
|
||||
江苏|常熟民生经济,http://cstvplay.21cs.cn/cstv2/cstv2.m3u8
|
||||
江苏|常熟综合,http://cstvplay.21cs.cn/cstv1/cstv1.m3u8
|
||||
江苏|无锡娱乐,http://stream.thmz.com/wxtv2/playlist.m3u8
|
||||
江苏|无锡娱乐,http://stream.thmz.com/wxtv2/sd/live.m3u8
|
||||
江苏|无锡新闻综合,http://stream.thmz.com/wxtv1/playlist.m3u8
|
||||
江苏|无锡生活,http://stream.thmz.com/wxtv4/playlist.m3u8
|
||||
江苏|无锡生活,http://stream.thmz.com/wxtv4/sd/live.m3u8
|
||||
江苏|无锡经济,http://stream.thmz.com/wxtv5/playlist.m3u8
|
||||
江苏|无锡经济,http://stream.thmz.com/wxtv5/sd/live.m3u8
|
||||
江苏|无锡都市资讯,http://stream.thmz.com/wxtv3/playlist.m3u8
|
||||
江苏|无锡都市资讯,http://stream.thmz.com/wxtv3/sd/live.m3u8
|
||||
江苏|江阴新闻综合,http://221.228.70.101:8080/live/xinwen.m3u8
|
||||
江苏|苏州文化生活,http://tylive.kan0512.com/norecord/norecord_csztv3.m3u8
|
||||
江苏|苏州新闻综合,http://tylive.kan0512.com/norecord/norecord_csztv1.m3u8
|
||||
江苏|苏州生活资讯,http://tylive.kan0512.com/norecord/norecord_csztv5.m3u8
|
||||
江苏|苏州社会经济,http://tylive.kan0512.com/norecord/norecord_csztv2.m3u8
|
||||
江苏|靖江新闻综合,http://visit.jjbctv.com:1935/live/xwzhpc/playlist.m3u8
|
||||
江苏|靖江电视,http://58.222.151.43:1935/live/xwzhpc/playlist.m3u8
|
||||
|
||||
江西|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225935/index.m3u8
|
||||
江西|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=29
|
||||
江西|卫视,http://mywlkj.ddns.net:754/tv/bst8m.php?id=38
|
||||
江西|南昌文旅,http://live.cooltv.top/tv/nctv.php?id=2
|
||||
江西|南昌新闻综合,http://live.cooltv.top/tv/nctv.php?id=1
|
||||
江西|南昌资讯,http://live.cooltv.top/tv/nctv.php?id=3
|
||||
江西|赣州公共,http://wb.jxgztv.com/live/gztv2.flv
|
||||
江西|赣州教育,http://wb.jxgztv.com/live/gztv3.flv
|
||||
江西|赣州新闻,http://wb.jxgztv.com/live/gztv1.flv
|
||||
|
||||
内蒙古卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010109/1.m3u8
|
||||
内蒙古|农牧,http://api2.52tb.xyz/info?id=886&token=20230405tndmhg
|
||||
内蒙古|新闻,http://api2.52tb.xyz/info?id=781&token=20230405tndmhg
|
||||
内蒙古|包头新闻,http://live.btgdt.com/channels/btgd/xwzh/flv:500k/live
|
||||
内蒙古|包头新闻,http://live.btgdt.com/channels/btgd/xwzh/m3u8:500k/live
|
||||
内蒙古|鄂托克旗,http://110.19.181.138:10080/hls/F509Rh7GR/F509Rh7GR_live.m3u8
|
||||
内蒙古|鄂托克旗,http://110.19.181.138:10080/hls/F509Rh7GR/F509Rh7GR_live.m3u8?
|
||||
内蒙古|鄂托克旗,http://110.19.181.138:10080/hls/F509Rh7GR/F509Rh7GR_live.m3u8?zneimd
|
||||
内蒙古|可克达拉综合,http://test5.btzx.com.cn/live/kkdl.stream/playlist.m3u8
|
||||
|
||||
宁夏|卫视,https://hls.ningxiahuangheyun.com/live/nxws1M.flv
|
||||
宁夏|公共,https://hls.ningxiahuangheyun.com/live/nxgg1M.flv
|
||||
宁夏|经济,https://hls.ningxiahuangheyun.com/live/nxjj1M.flv
|
||||
宁夏|文旅,https://hls.ningxiahuangheyun.com/live/nxwl1M.flv
|
||||
宁夏|少儿,https://hls.ningxiahuangheyun.com/live/nxse1M.flv
|
||||
宁夏|石嘴山综合,https://pili-live-hls-jrszs.szsnews.com:443/jrszs/zhpd.m3u8
|
||||
宁夏|吴忠公共,http://live.kanwz.net/ggpd/sd/live.m3u8?zningxd
|
||||
宁夏|吴忠综合,http://live.kanwz.net/zhpd/sd/live.m3u8?zningxd
|
||||
宁夏|安多卫视,http://stream.qhbtv.com/adws/playlist.m3u8?_upt=739abf201649062902
|
||||
宁夏|安多卫视,http://stream.qhbtv.com/adws/sd/live.m3u8
|
||||
宁夏|安多卫视,http://stream.qhbtv.com/adws/playlist.m3u8
|
||||
宁夏|门源综合,http://livecdn.dmqhyadmin.com/hls/xjmenyuan.m3u8?zqinghd
|
||||
宁夏|化隆综合,http://livecdn.dmqhyadmin.com/hls/xjhualong.m3u8
|
||||
宁夏|民和综合,http://livecdn.dmqhyadmin.com/hls/xjminhe.m3u8?zqinghd
|
||||
宁夏|兴海综合,http://lived.dmqhyadmin.com/xhzhpd/sd/live.m3u8
|
||||
宁夏|大通电视台,http://dtrmlive.qhdtrm.cn/testpush/sd/live.m3u8
|
||||
宁夏|湟中电视台,http://livecdn.dmqhyadmin.com/hls/xjhuangzhong.m3u8
|
||||
宁夏|西宁新闻综合,https://liveout.xntv.tv/a65jur/96iln2.m3u8?zqinghd
|
||||
宁夏|西宁生活服务,https://liveout.xntv.tv/a65jur/90p2i1.m3u8?zqinghd
|
||||
宁夏|青海经视,http://stream.qhbtv.com/qhsh/playlist.m3u8
|
||||
宁夏|青海经视,http://stream.qhbtv.com/qhsh/sd/live.m3u8?_upt=a7ec5e491648026933
|
||||
宁夏|青海经视,http://stream.qhbtv.com/qhsh/sd/live.m3u8?_upt=ba357f031594546763
|
||||
宁夏|青海经视,http://stream.qhbtv.com/qhsh/sd/live.m3u8
|
||||
宁夏|青海都市,http://stream.qhbtv.com/qhds/playlist.m3u8
|
||||
宁夏|青海都市,http://stream.qhbtv.com/qhds/sd/live.m3u8
|
||||
宁夏|青海都市,http://stream.qhbtv.com/qhds/sd/live.m3u8?_upt=f868bafe1594546577
|
||||
宁夏|青海综合,http://lmt.scqstv.com/live1/live1.m3u8
|
||||
|
||||
山东|卫视,http://[2409:8087:1a01:df::4077]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226456/index.m3u8
|
||||
山东|青州综合,http://sdqz.chinashadt.com:2036/live/stream:1.stream/playlist.m3u8?shandd
|
||||
山东|青州文化旅游,http://sdqz.chinashadt.com:2036/live/stream:3.stream/playlist.m3u8?shandd
|
||||
山东|烟台新闻综合,http://live.yantaitv.cn/live/3e81a8879da44c5dadf3bd9c10468e1c/9b776d420ee4438199b7657c8eb88f07-1.m3u8?shandd
|
||||
山东|烟台新闻综合,http://live.yantaitv.cn/live/3e81a8879da44c5dadf3bd9c10468e1c/9b776d420ee4438199b7657c8eb88f07-1.m3u8
|
||||
山东|烟台公共,http://live.yantaitv.cn/live/e50f104a4ffe4a41b2217cbda534146f/d86092e69df94668b33390278b061700-1.m3u8?shandd
|
||||
山东|烟台公共,http://live.yantaitv.cn/live/e50f104a4ffe4a41b2217cbda534146f/d86092e69df94668b33390278b061700-1.m3u8
|
||||
山东|烟台经济科技,http://live.yantaitv.cn/live/27f84144e95a4652ae9e5c211b2a6b55/405f3e33ba384aa0a16014d0becd1261-1.m3u8?shandd
|
||||
山东|烟台经济科技,http://live.yantaitv.cn/live/27f84144e95a4652ae9e5c211b2a6b55/405f3e33ba384aa0a16014d0becd1261-1.m3u8
|
||||
山东|烟台影视,http://live.yantaitv.cn/live/e9f1d9045d474c31884d13fa4ffbbd16/a4a9b3704d854756907845107cc56129-1.m3u8
|
||||
山东|枣庄新闻综合,http://stream.zztvzd.com/1/sd/live.m3u8?shandd
|
||||
山东|枣庄教育,http://stream.zztvzd.com/2/sd/live.m3u8?shandd
|
||||
山东|枣庄公共,http://stream.zztvzd.com/3/sd/live.m3u8?shandd
|
||||
山东|济宁综合,http://lives.jnnews.tv/video/s10001-JNTV-1/index.m3u8?shandd
|
||||
山东|济宁教育,http://lives.jnnews.tv/video/s10001-JNTV-2/index.m3u8?shandd
|
||||
山东|济宁公共,http://lives.jnnews.tv/video/s10001-JNTV3/index.m3u8?shandd
|
||||
山东|济宁图文,http://lives.jnnews.tv/video/s10001-JNTV4/index.m3u8?shandd
|
||||
山东|菏泽经济生活,http://live.hznet.tv:1935/live/live2/500K/tzwj_video.m3u8?shandd
|
||||
山东|菏泽影视,http://live.hznet.tv:1935/live/live3/500K/tzwj_video.m3u8
|
||||
山东|菏泽影视,http://live.hznet.tv:1935/live/live3/500K/tzwj_video.m3u8?shandd
|
||||
山东|菏泽新闻综合,http://live.hznet.tv:1935/live/live1/500k/tzwj_video.m3u8
|
||||
|
||||
山西|卫视,http://80ec27bff7f9ae80b961481da488e302.livehwc3.cn/liveflash.sxrtv.com/live/sxwshd.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=d04ce01474da4193c8863ea281ec4759
|
||||
山西|卫视,http://live.cooltv.top/tv/tide.php?id=sxiws2
|
||||
山西|卫视,http://liveflash.sxrtv.com/live/sxwshd.m3u8?sub_m3u8=true&edge_slice=true
|
||||
山西|经济,http://liveflash.sxrtv.com/live/sxfinance.m3u8?sub_m3u8=true&edge_slice=true
|
||||
山西|社会与法治,http://liveflash.sxrtv.com/live/sxedu.m3u8?sub_m3u8=true&edge_slice=true
|
||||
山西|文体生活,http://liveflash.sxrtv.com/live/sxpublic.m3u8?sub_m3u8=true&edge_slice=true
|
||||
山西|影视,http://liveflash.sxrtv.com/live/sxfilm.m3u8?sub_m3u8=true&edge_slice=true
|
||||
山西|黄河,http://liveflash.sxrtv.com/live/huanghe.m3u8?sub_m3u8=true&edge_slice=true
|
||||
山西|经济,http://live.cooltv.top/tv/cutv.php?id=sxjj
|
||||
山西|经济,http://live.cooltv.top/tv/tide.php?id=sxjj
|
||||
山西|社会与法治,http://live.cooltv.top/tv/cutv.php?id=sxkj
|
||||
山西|社会与法治,http://live.cooltv.top/tv/tide.php?id=sxshfz
|
||||
山西|社会与法治,http://api2.52tb.xyz/info?id=642&token=20230405tndmhg
|
||||
山西|文体生活,http://live.cooltv.top/tv/tide.php?id=sxwtsh
|
||||
山西|文体生活,http://live.cooltv.top/tv/cutv.php?id=sxgg
|
||||
山西|影视,http://live.cooltv.top/tv/cutv.php?id=sxys
|
||||
山西|影视,http://live.cooltv.top/tv/tide.php?id=sxys
|
||||
山西|黄河,http://live.cooltv.top/tv/cutv.php?id=sxhh
|
||||
山西|吉县新闻综合,http://jxlive.jxrmtzx.com:8091/live/xwzh.m3u8
|
||||
山西|吉县新闻综合,http://jxlive.jxrmtzx.com:8091/live/xwzh.m3u8?zshanxd
|
||||
山西|定襄综合,http://lbyzztfe.live.sxmty.com/live/hls/645ff4c60e0a49f0a203abbd73dd8be9/0720e665f10f48e98c9639f4f492fb4a-1.m3u8?zshanxd
|
||||
山西|晋中公共频道,http://jzlive.jztvnews.com:90/live/jzgg.m3u8
|
||||
山西|晋中新闻,http://jzlive.jztvnews.com:83/live/mount_for_ts/jzzh.m3u8?zshanxd
|
||||
山西|晋中新闻,http://jzlive.jztvnews.com:90/live/jzzh.m3u8
|
||||
山西|晋中新闻,http://jzlive.jztvnews.com:90/live/jzzh.m3u8?zshanxd
|
||||
山西|武乡新闻综合,http://uzoiczhh.live.sxmty.com/live/hls/0d41f1480c4042d49927858f01fde707/53130407737b417b9a6259b57246bae3.m3u8
|
||||
山西|潞城新闻综合,http://59.48.42.6:62204/lucheng.m3u8
|
||||
山西|潞城新闻综合,http://59.48.42.6:62204/lucheng.m3u8?zshanxd
|
||||
山西|灵石新闻综合,https://live-stream.lsxrmtzx.com/live/video.m3u8?zshanxd
|
||||
山西|襄垣电视,http://video.xyxrmt.com/lsdream/2MAgsgb/1000/live.m3u8?zshanxd
|
||||
山西|运城公共,http://live.0359tv.com/lsdream/t667aTY/1000/live.m3u8
|
||||
山西|运城公共,http://live.0359tv.com/lsdream/t667aTY/1000/live.m3u8?zshanxd
|
||||
山西|运城科技教育,http://live.0359tv.com/lsdream/p5eq48m/1000/live.m3u8
|
||||
山西|运城科技教育,http://live.0359tv.com/lsdream/p5eq48m/1000/live.m3u8?zshanxd
|
||||
山西|长子综合,http://zzlive.zzc-media.com:8092/live/xwzh.m3u8
|
||||
山西|长子综合,http://zzlive.zzc-media.com:8092/live/xwzh.m3u8?zshanxd
|
||||
|
||||
四川|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225970/index.m3u8
|
||||
四川|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=22
|
||||
四川|乡村,http://api2.52tb.xyz/info?id=606&token=20230405tndmhg
|
||||
四川|影视,http://api2.52tb.xyz/info?id=601&token=20230405tndmhg
|
||||
四川|文化旅游,http://api2.52tb.xyz/info?id=603&token=20230405tndmhg
|
||||
四川|新闻,http://api2.52tb.xyz/info?id=602&token=20230405tndmhg
|
||||
四川|科教,http://182.150.115.21:8030/pcgacg/pcgacg_0.m3u8
|
||||
四川|滨海新闻,http://traffic.jbh.tjbh.com/live/bhtv1/playlist.m3u8?ztianjd
|
||||
四川|滨海影院,http://traffic.jbh.tjbh.com/live/bhtv3/playlist.m3u8?ztianjd
|
||||
四川|滨海综艺,http://traffic.jbh.tjbh.com/live/bhtv2/playlist.m3u8?ztianjd
|
||||
四川|万源新闻综合,http://live.wanyuannews.com/wytv/hd/live.m3u8?zsicd
|
||||
四川|乐至综合,http://175.155.106.72:89/live1/live1.m3u8
|
||||
四川|乐至综合,http://175.155.106.72:89/live1/live1.m3u8?zsicd
|
||||
四川|乐至综合,http://rmlive.lzxrmtzx.com/live1/live1.m3u8
|
||||
四川|乐至综合,http://rmlive.lzxrmtzx.com/live1/live1.m3u8?zsicd
|
||||
四川|什邡新闻,http://live.sfrmt.com:85/live/zhpd.m3u8?zsicd
|
||||
四川|利州,http://tv.drs.lzgbdst.com:8100/channellive/lztv2.flv
|
||||
四川|利州,http://tvfile.lzgbdst.com/nmip-media/channellive/channel106876/playlist.m3u8
|
||||
四川|利州,http://tv.drs.lzgbdst.com:8100/channellive/lztv2.flv?zsicd
|
||||
四川|利州,http://tvfile.lzgbdst.com/nmip-media/channellive/channel106876/playlist.m3u8?zsicd
|
||||
四川|巴中综合,http://ocj2.kksmg.com/ocj1/ocj1.m3u8
|
||||
四川|康定,http://kdfile.ganzitv.com/nmip-media/channellive/channel100663/playlist.m3u8
|
||||
四川|康定,http://m3u8-kd.channel.ganzitv.com/nmip-media-yajiang/channellive/channel100663/playlist.m3u8
|
||||
四川|康定,http://m3u8-kd.channel.ganzitv.com/nmip-media-yajiang/channellive/channel100663/playlist.m3u8?
|
||||
四川|康定,http://m3u8-kd.channel.ganzitv.com/nmip-media-yajiang/channellive/channel100663/playlist.m3u8?zsicd
|
||||
四川|德阳新闻综合,http://scdytv.cn:1935/live/m_xwpd_livevideo/playlist.m3u8
|
||||
四川|德阳新闻综合,http://scdytv.cn:1935/live/m_xwpd_livevideo/playlist.m3u8?zsicd
|
||||
四川|攀枝花公共,http://zb.pzhgd.com:9095/live/ggpd.m3u8?zsicd
|
||||
四川|攀枝花新闻,http://zb.pzhgd.com:9095/live/xwzh.m3u8
|
||||
四川|攀枝花新闻,http://zb.pzhgd.com:9095/live/xwzh.m3u8?zsicd
|
||||
四川|松潘新闻综合,http://live.spccmc.com:90/live/spxwzh.m3u8
|
||||
四川|松潘新闻综合,http://live.spccmc.com:90/live/spxwzh.m3u8?zsicd
|
||||
四川|汶川新闻综合,http://live.iwcmt.cn:90/live/zhxw.m3u8
|
||||
四川|汶川新闻综合,http://live.iwcmt.cn:90/live/zhxw.m3u8?zsicd
|
||||
四川|泸县新闻综合,http://lxfile.lxxcb.cn/nmip-media/channellive/channel103799/playlist.m3u8?zsicd
|
||||
四川|泸州公共,http://m3u8.channel.luzhoubs.com/nmip-media/channellive/channel102221/playlist.m3u8
|
||||
四川|泸州新闻,http://m3u8.channel.luzhoubs.com/nmip-media/channellive/channel106011/playlist.m3u8
|
||||
四川|泸州科教,http://file.luzhoubs.com/nmip-media/channellive/channel103074/playlist.m3u8
|
||||
四川|泸州科教,http://m3u8.channel.luzhoubs.com/nmip-media/channellive/channel103074/playlist.m3u8
|
||||
四川|洪雅新闻综合,http://117.172.215.250:8083/videos/live/35/39/GQVbrgob5CGJM/GQVbrgob5CGJM.M3U8
|
||||
四川|甘孜综合,http://tv.drs.ganzitv.com:8100/channellive/gztv.flv?zsicd
|
||||
四川|眉山公共,http://live2.scmstv.cn/ggpd/sd/live.m3u8
|
||||
四川|眉山公共,http://live2.scmstv.cn/ggpd/sd/live.m3u8?zsicd
|
||||
四川|营山电视台,http://file.ysxtv.cn/cms/videos/nmip-media/channellive/channel4/playlist.m3u8
|
||||
四川|营山电视台,http://file.ysxtv.cn/cms/videos/nmip-media/channellive/channel4/playlist.m3u8?zsicd
|
||||
四川|蓬安新闻综合,http://palive.patv123.com:8091/live/xwpd_800K.m3u8?zsicd
|
||||
四川|西青新闻综合,http://221.238.209.44:81/hls/live1.m3u8?ztianjd
|
||||
四川|达州公共,http://tv.drs.dzxw.net/channellive/ggpd-dz2.flv
|
||||
四川|达州新闻,http://tv.drs.dzxw.net/channellive/xwzhpd-dz1.flv
|
||||
四川|达州新闻,http://tv.drs.dzxw.net:80/channellive/xwzhpd-dz1.flv
|
||||
四川|金川新闻综合,http://live.jinchuanrmt.com:90/live/zhxw.m3u8
|
||||
四川|金川新闻综合,http://live.jinchuanrmt.com:90/live/zhxw.m3u8?zsicd
|
||||
四川|长宁综合,http://cnpull.sccnfb.com/live/123456.m3u8?zsicd
|
||||
四川|青神综合,http://lmt.scqstv.com/live1/live1.m3u8?zsicd
|
||||
四川|马尔康综合,http://live.zmmek.com:90/live/zhxw.m3u8?zsicd
|
||||
四川|黑水新闻综合,http://live.schstv.com:90/live/xwzh.m3u8
|
||||
|
||||
上海|东方卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=20
|
||||
上海|崇明电视台,https://pili-live-hls.wdit.com.cn/wditlive/c038f4fafbdf4f97ba74c74ad67259b931ee.m3u8?zshangd
|
||||
上海|嘉定电视台,https://pili-live-hls.wdit.com.cn/wditlive/15472c98517744b994e85c9c60cc93cf6a3b.m3u8?zshangd
|
||||
|
||||
天津|卫视,http://[2409:8087:1a01:df::4077]/PLTV/88888888/224/3221225972/index.m3u8
|
||||
天津|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=23
|
||||
天津|滨海影视,http://traffic.jbh.tjbh.com/live/bhtv3/playlist.m3u8
|
||||
天津|滨海新闻,http://traffic.jbh.tjbh.com/live/bhtv1/playlist.m3u8
|
||||
天津|滨海综艺,http://traffic.jbh.tjbh.com/live/bhtv2/playlist.m3u8
|
||||
|
||||
新疆|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=27
|
||||
新疆|伊犁哈萨克,http://110.153.180.106:55555/out_3/index.m3u8
|
||||
新疆|伊犁哈萨克,http://110.153.180.106:55555/out_3/index.m3u8?zxinjd
|
||||
新疆|伊犁汉语综合,http://110.153.180.106:55555/out_1/index.m3u8
|
||||
新疆|伊犁汉语综合,http://110.153.180.106:55555/out_1/index.m3u8?zxinjd
|
||||
新疆|伊犁经济法制,http://110.153.180.106:55555/out_4/index.m3u8
|
||||
新疆|伊犁经济法制,http://110.153.180.106:55555/out_4/index.m3u8?zxinjd
|
||||
新疆|伊犁维吾尔,http://110.153.180.106:55555/out_2/index.m3u8
|
||||
新疆|伊犁维吾尔,http://110.153.180.106:55555/out_2/index.m3u8?zxinjd
|
||||
新疆|兵团四师可克达拉综合,http://test5.btzx.com.cn/live/kkdl.stream/playlist.m3u8?zxinjd
|
||||
新疆|兵团八师石河子教育,http://124.88.144.73:1935/live/jiaoyu/playlist.m3u8?zxinjd
|
||||
新疆|兵团八师石河子新闻综合,http://124.88.144.73:1935/live/xwzh/playlist.m3u8?zxinjd
|
||||
新疆|兵团八师石河子经济生活,http://124.88.144.73:1935/live/dywt/playlist.m3u8?zxinjd
|
||||
新疆|兵团十四师昆玉综合,http://test5.btzx.com.cn/live/14TV.stream/playlist.m3u8?zxinjd
|
||||
新疆|克拉玛依维语综合,https://klmyzb.rcsxzx.com/hls/klmy2.m3u8
|
||||
新疆|克拉玛依影视,https://klmyzb.rcsxzx.com/hls/klmy3.m3u8
|
||||
新疆|可克达拉综合,http://test5.btzx.com.cn:80/live/kkdl.stream/playlist.m3u8
|
||||
新疆|奎屯哈萨克语,http://218.84.12.186:8002/hls/main/playlist.m3u8
|
||||
新疆|奎屯汉语综合,http://218.84.12.186:8001/hls/main/playlist.m3u8
|
||||
新疆|奎屯汉语综合,http://218.84.12.186:8001/hls/main/playlist.m3u8?zxinjd
|
||||
新疆|巴音郭楞州,http://file.loulannews.cn/nmip-media/channellive/channel101476/playlist.m3u8
|
||||
新疆|巴音郭楞州,http://file.loulannews.cn/nmip-media/channellive/channel102433/playlist.m3u8
|
||||
新疆|巴音郭楞州,http://file.loulannews.cn/nmip-media/channellive/channel103824/playlist.m3u8
|
||||
新疆|巴音郭楞州,http://file.loulannews.cn/nmip-media/channellive/channel104199/playlist.m3u8
|
||||
新疆|玛纳斯综合,http://218.84.127.245:1026/hls/main1/playlist.m3u8?zxinjd
|
||||
新疆|石河子影视文体,http://124.88.144.73:1935/live/jjsh/playlist.m3u8
|
||||
新疆|石河子教育,http://124.88.144.73:1935/live/jiaoyu/playlist.m3u8
|
||||
新疆|石河子新闻综合,http://124.88.144.73:1935/live/xwzh/playlist.m3u8
|
||||
新疆|石河子经济生活,http://124.88.144.73:1935/live/dywt/playlist.m3u8
|
||||
新疆|裕民哈语,http://117.190.130.4:8081/out_2/index.m3u8?zxinjd
|
||||
新疆|裕民汉语,http://117.190.130.4:8081/out_1/index.m3u8?zxinjd
|
||||
|
||||
云南|卫视,http://[2409:8087:5e00:24::1e]:6060/200000001898/460000089800010119/1.m3u8
|
||||
云南|都市,http://tvlive.ynradio.com/live/yunnandushi/chunks.m3u8
|
||||
云南|都市,http://tvlive.ynradio.com/live/yunnandushi/playlist.m3u8
|
||||
云南|娱乐,http://tvlive.ynradio.com/live/yunnanyule/chunks.m3u8
|
||||
云南|娱乐,http://tvlive.ynradio.com/live/yunnanyule/playlist.m3u8
|
||||
云南|少儿,http://tvlive.ynradio.com/live/yunnanshaoer/chunks.m3u8
|
||||
云南|少儿,http://tvlive.ynradio.com/live/yunnanshaoer/playlist.m3u8
|
||||
云南|康旅,http://tvlive.ynradio.com/live/yunnangonggong/chunks.m3u8
|
||||
云南|康旅,http://tvlive.ynradio.com/live/yunnangonggong/playlist.m3u8
|
||||
云南|文山州新闻综合,http://m3u8.channel.wsrtv.com.cn/cms/videos/nmip-media/channellive/channel7/playlist.m3u8?zyund
|
||||
云南|文山州新闻综合,http://tvdrs.wsrtv.com.cn:8100/channellive/ch1.flv
|
||||
云南|文山州新闻综合,http://tvdrs.wsrtv.com.cn:8100/channellive/ch1.flv?zyund
|
||||
云南|红河县综合,http://tv.drs.hhtv.cc:8100/channellive/hhxdst.flv?zyund
|
||||
云南|红河州公共,http://tv.drs.hhtv.cc:8100/channellive/hhtv-2.flv?zyund
|
||||
云南|红河州新闻综合,http://tv.drs.hhtv.cc:8100/channellive/hhtv-1.flv?zyund
|
||||
云南|西双版纳公共,http://file.xsbnrtv.cn/vms/videos/nmip-media/channellive/channel3/playlist.m3u8?zyund
|
||||
云南|西双版纳综合,http://file.xsbnrtv.cn/vms/videos/nmip-media/channellive/channel1/playlist.m3u8?zyund
|
||||
云南|贡山,http://livebroadcast.ccwb.cn/live/w1609121671179943.flv
|
||||
云南|贡山,http://livebroadcast.ccwb.cn/live/w1609121671179943.m3u8
|
||||
云南|麻栗坡,http://m3u8.channel.wsrtv.com.cn/cms/videos/nmip-media/channellive/channel18/playlist.m3u8
|
||||
云南|麻栗坡,https://m3u8.channel.wsrtv.com.cn/nmip-media/channellive/channel107237/playlist.m3u8
|
||||
云南|麻栗坡,http://m3u8.channel.wsrtv.com.cn/cms/videos/nmip-media/channellive/channel18/playlist.m3u8?zyund
|
||||
云南|麻栗坡,http://tvdrs.wsrtv.com.cn:8100/channellive/mlptv.flv?zyund
|
||||
云南|新平综合,http://livebroadcast.ccwb.cn/live/w1615257519790969.m3u8?zyund
|
||||
云南|福贡综合,http://livebroadcast.ccwb.cn/live/w1612505860303999.m3u8?zyund
|
||||
云南|贡山综合,http://livebroadcast.ccwb.cn/live/w1609121671179943.m3u8?zyund
|
||||
|
||||
浙江|卫视,http://mywlkj.ddns.net:754/tv/gdgzdx.php?id=21
|
||||
浙江|卫视,http://mywlkj.ddns.net:754/tv/qqcloud.php?id=32
|
||||
浙江|钱江频道,http://ali-m-l.cztv.com/channels/lantian/channel02/1080p.m3u8
|
||||
浙江|经济生活,http://ali-m-l.cztv.com/channels/lantian/channel03/1080p.m3u8
|
||||
浙江|教科影视,http://ali-m-l.cztv.com/channels/lantian/channel04/1080p.m3u8
|
||||
浙江|民生休闲,http://ali-m-l.cztv.com/channels/lantian/channel06/1080p.m3u8
|
||||
浙江|公共新闻,http://ali-m-l.cztv.com/channels/lantian/channel07/1080p.m3u8
|
||||
浙江|杭州余杭平安,http://l.cztvcloud.com/channels/lantian/SXyuhang2/720p.m3u8
|
||||
浙江|杭州余杭未来,http://l.cztvcloud.com/channels/lantian/SXyuhang3/720p.m3u8
|
||||
浙江|杭州余杭综合,http://l.cztvcloud.com/channels/lantian/SXyuhang1/720p.m3u8
|
||||
浙江|宁波象山综合,http://l.cztvcloud.com/channels/lantian/SXxiangshan1/720p.m3u8?zzhed
|
||||
浙江|宁波余姚综合,http://l.cztvcloud.com/channels/lantian/SXyuyao1/720p.m3u8?zzhed
|
||||
浙江|上虞新闻综合,http://l.cztvcloud.com/channels/lantian/SXshangyu1/720p.m3u8?zzhed
|
||||
浙江|上虞文化影院,http://l.cztvcloud.com/channels/lantian/SXshangyu2/720p.m3u8?zzhed
|
||||
浙江|上虞新商都,http://l.cztvcloud.com/channels/lantian/SXshangyu3/720p.m3u8
|
||||
浙江|上虞新商都,http://l.cztvcloud.com/channels/lantian/SXshangyu3/720p.m3u8?zzhed
|
||||
浙江|丽水云和综合,http://l.cztvcloud.com/channels/lantian/SXyunhe1/720p.m3u8
|
||||
浙江|丽水庆元综合,http://l.cztvcloud.com/channels/lantian/SXqingyuan1/720p.m3u8
|
||||
浙江|丽水松阳综合,http://l.cztvcloud.com/channels/lantian/SXsongyang1/720p.m3u8
|
||||
浙江|丽水缙云综合,http://l.cztvcloud.com/channels/lantian/SXjinyun1/720p.m3u8
|
||||
浙江|丽水遂昌综合,http://l.cztvcloud.com/channels/lantian/SXsuichang1/720p.m3u8
|
||||
浙江|丽水青田综合,http://l.cztvcloud.com/channels/lantian/SXqingtian1/720p.m3u8
|
||||
浙江|丽水龙泉综合,http://l.cztvcloud.com/channels/lantian/SXlongquan1/720p.m3u8
|
||||
浙江|云和新闻综合,http://l.cztvcloud.com/channels/lantian/SXyunhe1/720p.m3u8?zzhed
|
||||
浙江|兰溪新闻综合,http://l.cztvcloud.com/channels/lantian/SXlanxi1/720p.m3u8?zzhed
|
||||
浙江|宁波余姚生活,http://l.cztvcloud.com/channels/lantian/SXyuyao2/720p.m3u8
|
||||
浙江|宁波余姚综合,http://l.cztvcloud.com/channels/lantian/SXyuyao1/720p.m3u8
|
||||
浙江|宁波象山综合,http://l.cztvcloud.com/channels/lantian/SXxiangshan1/720p.m3u8
|
||||
浙江|嵊州公共新闻综合,http://l.cztvcloud.com/channels/lantian/SXshengzhou1/720p.m3u8?zzhed
|
||||
浙江|平湖公共新闻综合,http://l.cztvcloud.com/channels/lantian/SXpinghu1/720p.m3u8?zzhed
|
||||
浙江|平湖新闻综合,http://l.cztvcloud.com/channels/lantian/SXpinghu1/720p.m3u8
|
||||
浙江|平湖民生休闲,http://l.cztvcloud.com/channels/lantian/SXpinghu2/720p.m3u8
|
||||
浙江|平湖民生休闲,http://l.cztvcloud.com/channels/lantian/SXpinghu2/720p.m3u8?zzhed
|
||||
浙江|庆元综合频道,http://l.cztvcloud.com/channels/lantian/SXqingyuan1/720p.m3u8?zzhed
|
||||
浙江|开化新闻综合,http://l.cztvcloud.com/channels/lantian/SXkaihua1/720p.m3u8?zzhed
|
||||
浙江|开化国家公园,http://l.cztvcloud.com/channels/lantian/SXkaihua2/720p.m3u8?zzhed
|
||||
浙江|文成二套,http://l.cztvcloud.com/channels/lantian/SXwencheng2/720p.m3u8
|
||||
浙江|文成综合频道,http://l.cztvcloud.com/channels/lantian/SXwencheng1/720p.m3u8
|
||||
浙江|文成综合频道,http://l.cztvcloud.com/channels/lantian/SXwencheng1/720p.m3u8?zzhed
|
||||
浙江|普陀新闻综合,http://l.cztvcloud.com/channels/lantian/SXputuo1/720p.m3u8?zzhed
|
||||
浙江|普陀新闻综合,http://l.cztvcloud.com/channels/lantian/SXputuo1/720p.m3u8
|
||||
浙江|松阳综合频道,http://l.cztvcloud.com/channels/lantian/SXsongyang1/720p.m3u8?zzhed
|
||||
浙江|永嘉新闻综合,http://l.cztvcloud.com/channels/lantian/SXyongjia1/720p.m3u8?zzhed
|
||||
浙江|温州永嘉综合,http://l.cztvcloud.com/channels/lantian/SXyongjia1/720p.m3u8
|
||||
浙江|绍兴上虞影视,http://l.cztvcloud.com/channels/lantian/SXshangyu2/720p.m3u8
|
||||
浙江|绍兴上虞综合,http://l.cztvcloud.com/channels/lantian/SXshangyu1/720p.m3u8
|
||||
浙江|绍兴公共频道,http://live.shaoxing.com.cn/video/s10001-sxtv2/index.m3u8
|
||||
浙江|绍兴新闻综合,http://live.shaoxing.com.cn/video/s10001-sxhb/index.m3u8?zzhed
|
||||
浙江|绍兴公共频道,http://live.shaoxing.com.cn/video/s10001-sxtv2/index.m3u8?zzhed
|
||||
浙江|绍兴嵊州综合,http://l.cztvcloud.com/channels/lantian/SXshengzhou1/720p.m3u8
|
||||
浙江|绍兴文化影视,http://live.shaoxing.com.cn/video/s10001-sxtv3/index.m3u8
|
||||
浙江|绍兴文化影视,http://live.shaoxing.com.cn/video/s10001-sxtv3/index.m3u8?zzhed
|
||||
浙江|绍兴新闻综合,http://live.shaoxing.com.cn/video/s10001-sxhb/index.m3u8
|
||||
浙江|缙云综合频道,http://l.cztvcloud.com/channels/lantian/SXjinyun1/720p.m3u8?zzhed
|
||||
浙江|舟山新闻综合,http://live1.plus.wifizs.cn/xwzh/sd/live.m3u8?zzhed
|
||||
浙江|舟山公共生活,http://live1.plus.wifizs.cn/ggsh/sd/live.m3u8?zzhed
|
||||
浙江|苍南新闻综合,http://l.cztvcloud.com/channels/lantian/SXcangnan1/720p.m3u8?zzhed
|
||||
浙江|苍南新闻综合,http://l.cztvcloud.com/channels/lantian/SXcangnan1/720p.m3u8
|
||||
浙江|萧山新闻综合,http://l.cztvcloud.com/channels/lantian/SXxiaoshan1/720p.m3u8?zzhed
|
||||
浙江|萧山新闻综合,http://l.cztvcloud.com/channels/lantian/SXxiaoshan1/720p.m3u8
|
||||
浙江|萧山生活频道,http://l.cztvcloud.com/channels/lantian/SXxiaoshan2/720p.m3u8
|
||||
浙江|萧山生活频道,http://l.cztvcloud.com/channels/lantian/SXxiaoshan2/720p.m3u8?zzhed
|
||||
浙江|衢州开化综合,http://l.cztvcloud.com/channels/lantian/SXkaihua1/720p.m3u8
|
||||
浙江|衢州衢江综合,http://l.cztvcloud.com/channels/lantian/SXqujiang1/720p.m3u8
|
||||
浙江|衢州龙游生活,https://l.cztvcloud.com/channels/lantian/SXlongyou2/720p.m3u8
|
||||
浙江|衢州龙游综合,https://l.cztvcloud.com/channels/lantian/SXlongyou1/720p.m3u8
|
||||
浙江|诸暨新闻综合,http://l.cztvcloud.com/channels/lantian/SXzhuji3/720p.m3u8
|
||||
浙江|遂昌综合频道,http://l.cztvcloud.com/channels/lantian/SXsuichang1/720p.m3u8?zzhed
|
||||
浙江|金华东阳综合,http://l.cztvcloud.com/channels/lantian/SXdongyang1/720p.m3u8
|
||||
浙江|金华兰溪综合,http://l.cztvcloud.com/channels/lantian/SXlanxi1/720p.m3u8
|
||||
浙江|青田电视台,http://l.cztvcloud.com/channels/lantian/SXqingtian1/720p.m3u8?zzhed
|
||||
浙江|龙泉公共新闻综合,http://l.cztvcloud.com/channels/lantian/SXlongquan1/720p.m3u8?zzhed
|
||||
浙江|龙游新闻综合,http://l.cztvcloud.com/channels/lantian/SXlongyou1/720p.m3u8?zzhed
|
||||
浙江|龙游新闻综合,http://l.cztvcloud.com/channels/lantian/SXlongyou1/720p.m3u8
|
||||
浙江|龙游生活娱乐,http://l.cztvcloud.com/channels/lantian/SXlongyou2/720p.m3u8
|
||||
浙江|龙游生活娱乐,http://l.cztvcloud.com/channels/lantian/SXlongyou2/720p.m3u8?zzhed
|
||||
|
||||
港·澳·台,#genre#
|
||||
凤凰卫视,http://116.162.6.192/1.v.smtcdns.net/qctv.fengshows.cn/live/0701pcc72.m3u8
|
||||
凤凰资讯,http://116.162.6.192/1.v.smtcdns.net/qctv.fengshows.cn/live/0701pin72.m3u8
|
||||
凤凰香港,http://116.162.6.192/1.v.smtcdns.net/qctv.fengshows.cn/live/0701phk72.m3u8
|
||||
凤凰卫视,http://122.224.232.218:8888/rtp/233.50.200.191:5140
|
||||
凤凰卫视,http://171.88.42.147:8888/udp/239.93.0.162:2192
|
||||
凤凰卫视,http://60.164.228.49:4040/udp/239.255.30.50:8231
|
||||
凤凰资讯,http://60.164.228.49:4040/udp/239.255.30.70:8231
|
||||
凤凰香港,http://171.108.239.77:8181/tsfile/live/1025_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
凤凰香港,http://60.164.228.49:4040/udp/239.255.30.123:8231
|
||||
东森电影,http://171.108.239.77:8181/tsfile/live/1010_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
东森电影,http://1b6467f415.iok.la:9931/tsfile/live/1043_1.m3u8
|
||||
东森超视,http://171.108.239.77:8181/tsfile/live/1023_1.m3u8?key=txiptv&playlive=1&authid=0
|
||||
半岛新闻,http://live-hls-web-aja.getaj.net/AJA/02.m3u8
|
||||
半岛新闻,http://live-hls-web-aje.getaj.net/AJE/01.m3u8
|
||||
半岛新闻,https://live-hls-web-aje.getaj.net/AJE/01.m3u8
|
||||
半岛新闻,https://live-hls-web-aje.getaj.net/AJE/02.m3u8
|
||||
大爱1,https://pulltv1.wanfudaluye.com/live/tv1.m3u8
|
||||
大爱1,https://pulltv1.wanfudaluye.com/live/tv1.m3u8?
|
||||
大爱1,https://pulltv2.wanfudaluye.com/live/tv1.m3u8
|
||||
大爱2,http://pulltv1.wanfudaluye.com/live/tv2.m3u8
|
||||
大爱2,http://pulltv2.wanfudaluye.com/live/tv2.m3u8
|
||||
大爱2,https://pulltv1.wanfudaluye.com/live/tv2.m3u8
|
||||
大爱2,https://pulltv1.wanfudaluye.com/live/tv2.m3u8?
|
||||
大爱2,https://pulltv2.wanfudaluye.com/live/tv2.m3u8
|
||||
大爱2,https://pulltv2.wanfudaluye.com/live/tv2.m3u8?
|
||||
大立电视,http://www.dalitv.com.tw:4568/live/dali/index.m3u8
|
||||
新加坡中文,https://d2e1asnsl7br7b.cloudfront.net/7782e205e72f43aeb4a48ec97f66ebbe/index_4.m3u8
|
||||
新加坡中文,https://d2e1asnsl7br7b.cloudfront.net/7782e205e72f43aeb4a48ec97f66ebbe/index_4.m3u8?zshijd
|
||||
星光视界,http://ali.hlspull.yximgs.com/live/zxcvbnm9852.flv
|
||||
有线新闻,http://61.10.2.141/live_freedirect/freehd209_h.live/playlist.m3u8
|
||||
有线新闻,http://61.10.2.141:80/live_freedirect/freehd209_h.live/chunklist.m3u8
|
||||
有线新闻,http://cm61-10-2-143.hkcable.com.hk/live_freedirect/freehd209_h.live/chunklist_w1949275579.m3u8
|
||||
有线新闻,http://cm61-10-2-143.hkcable.com.hk/live_freedirect/freehd209_h.live/playlist.m3u8
|
||||
有线财经资讯,http://61.10.2.145/live_freedirect/freehd208_h.live/chunklist.m3u8
|
||||
环球电视,http://zb.xzxwhcb.com:9999/hls/world.m3u8
|
||||
番薯111,http://61.216.67.119:1935/TWHG/E1/chunklist_w7058102.m3u8
|
||||
番薯111,http://61.216.67.119:1935/TWHG/E1/chunklist_w7058102.m3u8?blog.ntnas.top
|
||||
番薯111,http://61.216.67.119:1935/TWHG/E1/chunklist_w705811302.m3u8
|
||||
纬来体育,http://hls.szsummer.cn/live/446035/playlist.m3u8?k=32f9ec7c13e4b390289143a8e1b2a898&t=1840341130
|
||||
纬来体育,https://cloud.yumixiu768.com/tmp/123.m3u8
|
||||
香港佛陀,http://js1.amtb.cn/liveedge/_definst_/livetv/chunklist.m3u8
|
||||
香港佛陀,https://js1.amtb.cn/liveedge/_definst_/livetv/playlist.m3u8
|
||||
香港卫视,http://zhibo.hkstv.tv/livestream/mutfysrq.flv
|
||||
香港卫视,http://zhibo.hkstv.tv/livestream/mutfysrq/playlist.m3u8
|
||||
香港卫视,http://zhibo.hkstv.tv/livestream/mutfysrq/playlist.m3u8?wsSession=3c732f93c14e1bc0c07641df-156388849014752&wsIPSercert=8de23d0849e78e3b16ec92a809235421&wsMonitor=0
|
||||
香港卫视,http://zhibo.hkstv.tv/livestream/mutfysrq/playlist.m3u8?wsSession=8ee59707fee3ef96c922e680-167055218938751&wsIPSercert=d24f6d7c9d3646d9533d492d5209384b&wsMonitor=0
|
||||
香港卫视,http://zhibo.hkstv.tv:80/livestream/mutfysrq.flv
|
||||
香港国际财经,http://61.10.2.140/live_freedirect/opentvhd002_h.live/playlist.m3u8
|
||||
香港面包台,https://video.bread-tv.com:8091/hls-live24/online/index.m3u8
|
||||
ABC新闻,https://abc-iview-mediapackagestreams-2.akamaized.net/out/v1/6e1cc6d25ec0480ea099a5399d73bc4b/index_45.m3u8
|
||||
Fox新闻,https://fox-foxnewsnow-samsungus.amagi.tv/playlist720p.m3u8
|
||||
GOODTV卡通,https://dqhxk7sbp7xog.cloudfront.net/osmflivech45.m3u8
|
||||
GOODTV好消息,https://dqhxk7sbp7xog.cloudfront.net/hls-live/goodtv/_definst_/liveevent/live-ch1-2.m3u8
|
||||
|
||||
咪咕直播,#genre#
|
||||
咪咕直播 52,http://[2409:8087:1a01:df::404d]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226124/index.m3u8
|
||||
咪咕直播 53,http://[2409:8087:1a01:df::403b]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226147/index.m3u8
|
||||
咪咕直播 54,http://[2409:8087:1a01:df::4033]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226398/index.m3u8
|
||||
咪咕直播 55,http://[2409:8087:1a01:df::402a]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226469/index.m3u8
|
||||
咪咕直播 56,http://[2409:8087:1a01:df::4046]/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226472/index.m3u8
|
||||
|
||||
百视频道,#genre#
|
||||
百视电影 1,https://bp-caster.bestv.com.cn/88/3/video.m3u8
|
||||
百视电影 2,https://bp-caster.bestv.com.cn/89/3/video.m3u8
|
||||
百视电影 3,https://bp-caster.bestv.com.cn/91/3/video.m3u8
|
||||
百视电影 4,https://bp-caster.bestv.com.cn/92/3/video.m3u8
|
||||
百视电影 5,https://bp-caster.bestv.com.cn/93/3/video.m3u8
|
||||
百视电影 6,https://bp-caster.bestv.com.cn/94/3/video.m3u8
|
||||
百视电影 7,https://bp-caster.bestv.com.cn/95/3/video.m3u8
|
||||
百视电影 8,https://bp-caster.bestv.com.cn/96/3/video.m3u8
|
||||
百视电影 9,https://bp-caster.bestv.com.cn/97/3/video.m3u8
|
||||
百视电影 10,https://bp-caster.bestv.com.cn/98/3/video.m3u8
|
||||
百视电影 11,https://bp-caster.bestv.com.cn/99/3/video.m3u8
|
||||
百视电影 12,https://bp-caster.bestv.com.cn/100/3/video.m3u8
|
||||
百视电影 13,https://bp-caster.bestv.com.cn/101/3/video.m3u8
|
||||
百视电影 14,https://bp-caster.bestv.com.cn/102/3/video.m3u8
|
||||
百视电影 15,https://bp-caster.bestv.com.cn/103/3/video.m3u8
|
||||
百视电影 16,https://bp-caster.bestv.com.cn/104/3/video.m3u8
|
||||
百视电影 17,https://bp-caster.bestv.com.cn/105/3/video.m3u8
|
||||
百视电影 18,https://bp-caster.bestv.com.cn/106/3/video.m3u8
|
||||
百视电影 19,https://bp-caster.bestv.com.cn/107/3/video.m3u8
|
||||
百视电影 20,https://bp-caster.bestv.com.cn/108/3/video.m3u8
|
||||
百视电影 21,https://bp-caster.bestv.com.cn/109/3/video.m3u8
|
||||
百视电影 22,https://bp-caster.bestv.com.cn/110/3/video.m3u8
|
||||
百视电影 23,https://bp-caster.bestv.com.cn/111/3/video.m3u8
|
||||
百视电影 24,https://bp-caster.bestv.com.cn/112/3/video.m3u8
|
||||
百视电影 25,https://bp-caster.bestv.com.cn/113/3/video.m3u8
|
||||
百视电影 26,https://bp-caster.bestv.com.cn/114/3/video.m3u8
|
||||
百视电影 27,https://bp-caster.bestv.com.cn/115/3/video.m3u8
|
||||
百视电影 28,https://bp-caster.bestv.com.cn/116/3/video.m3u8
|
||||
百视电影 29,https://bp-caster.bestv.com.cn/117/3/video.m3u8
|
||||
百视电影 30,https://bp-caster.bestv.com.cn/118/3/video.m3u8
|
||||
百视电影 31,https://bp-caster.bestv.com.cn/119/3/video.m3u8
|
||||
百视电影 32,https://bp-caster.bestv.com.cn/120/3/video.m3u8
|
||||
百视电影 33,https://bp-caster.bestv.com.cn/121/3/video.m3u8
|
||||
百视电影 34,https://bp-caster.bestv.com.cn/122/3/video.m3u8
|
||||
百视电影 35,https://bp-caster.bestv.com.cn/123/3/video.m3u8
|
||||
百视电影 36,https://bp-caster.bestv.com.cn/124/3/video.m3u8
|
||||
百视电影 37,https://bp-caster.bestv.com.cn/125/3/video.m3u8
|
||||
百视电影 38,https://bp-caster.bestv.com.cn/126/3/video.m3u8
|
||||
百视电影 40,https://bp-caster.bestv.com.cn/128/3/video.m3u8
|
||||
百视电影 41,https://bp-caster.bestv.com.cn/129/3/video.m3u8
|
||||
百视电影 42,https://bp-caster.bestv.com.cn/130/3/video.m3u8
|
||||
百视搞笑 43,https://bp-caster.bestv.com.cn/131/3/video.m3u8
|
||||
百视搞笑 44,https://bp-caster.bestv.com.cn/132/3/video.m3u8
|
||||
|
||||
超高清频道,#genre#
|
||||
苏州4K,http://liveshowbak2.kan0512.com/ksz-norecord/csztv4k_4k.m3u8
|
||||
苏州4K,http://liveshowbak2.kan0512.com/norecord/csztv4k_4k.m3u8
|
||||
|
||||
NewTV频道,#genre#
|
||||
NewTV超级体育,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225715/index.m3u8
|
||||
NewTV超级电影,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225717/index.m3u8
|
||||
NewTV超级电视剧,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225716/index.m3u8
|
||||
NewTV东北热剧,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225741/index.m3u8
|
||||
NewTV欢乐剧场,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225742/index.m3u8
|
||||
NewTV海外剧场,http://[2409:8087:2001:20:2800:0:df6e:eb07]:80/wh7f454c46tw2056934744_1249676649/ott.mobaibox.com/PLTV/3/224/3221227539/index.m3u8?icpid=3&RTS=1674386467&from=40&popid=40&hms_devid=2036&prioritypopid=40&vqe=3
|
||||
NewTV中国功夫,http://[2409:8087:2001:20:2800:0:df6e:eb19]:80/wh7f454c46tw1755251107_-1720510105/ott.mobaibox.com/PLTV/3/224/3221227530/index.m3u8?icpid=3&RTS=1674386165&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV军事评论,http://[2409:8087:2001:20:2800:0:df6e:eb18]:80/wh7f454c46tw1555337016_-1312521077/ott.mobaibox.com/PLTV/3/224/3221227544/index.m3u8?icpid=3&RTS=1674385965&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV军旅剧场,http://[2409:8087:2001:20:2800:0:df6e:eb06]:80/wh7f454c46tw1755552897_-1767851709/ott.mobaibox.com/PLTV/3/224/3221227603/index.m3u8?icpid=3&RTS=1674386165&from=40&popid=40&hms_devid=2036&prioritypopid=40&vqe=3
|
||||
NewTV农业致富,http://[2409:8087:2001:20:2800:0:df6e:eb18]:80/wh7f454c46tw518731977_-1157191011/ott.mobaibox.com/PLTV/3/224/3221227588/index.m3u8?icpid=3&RTS=1674380634&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV动作电影,http://[2409:8087:2001:20:2800:0:df6e:eb06]:80/wh7f454c46tw1555700033_-766721196/ott.mobaibox.com/PLTV/3/224/3221227606/index.m3u8?icpid=3&RTS=1674385966&from=40&popid=40&hms_devid=2036&prioritypopid=40&vqe=3
|
||||
NewTV家庭剧场,http://[2409:8087:2001:20:2800:0:df6e:eb06]:80/wh7f454c46tw1555906766_991991415/ott.mobaibox.com/PLTV/3/224/3221227600/index.m3u8?icpid=3&RTS=1674385966&from=40&popid=40&hms_devid=2036&prioritypopid=40&vqe=3
|
||||
NewTV怡伴健康,http://[2409:8087:2001:20:2800:0:df6e:eb19]:80/wh7f454c46tw1755404780_1268233995/ott.mobaibox.com/PLTV/3/224/3221227612/index.m3u8?icpid=3&RTS=1674386165&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV惊悚悬疑,http://[2409:8087:2001:20:2800:0:df6e:eb19]:80/wh7f454c46tw1755704917_-721741365/ott.mobaibox.com/PLTV/3/224/3221227536/index.m3u8?icpid=3&RTS=1674386166&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV明星大片,http://[2409:8087:2001:20:2800:0:df6e:eb18]:80/wh7f454c46tw1933970761_1509977631/ott.mobaibox.com/PLTV/3/224/3221227594/index.m3u8?icpid=3&RTS=1674386344&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV武搏世界,http://[2409:8087:2001:20:2800:0:df6e:eb18]:80/wh7f454c46tw1556325430_664703954/ott.mobaibox.com/PLTV/3/224/3221227533/index.m3u8?icpid=3&RTS=1674385966&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV潮妈辣婆,http://[2409:8087:2001:20:2800:0:df6e:eb19]:80/wh7f454c46tw517872146_-1764712284/ott.mobaibox.com/PLTV/3/224/3221227527/index.m3u8?icpid=3&RTS=1674380633&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV炫舞未来,http://[2409:8087:2001:20:2800:0:df6e:eb08]:80/wh7f454c46tw519702850_-1512208436/ott.mobaibox.com/PLTV/3/224/3221227475/index.m3u8?icpid=3&RTS=1674380635&from=40&popid=40&hms_devid=2037&prioritypopid=40&vqe=3
|
||||
NewTV爱情喜剧,http://[2409:8087:2001:20:2800:0:df6e:eb1b]:80/wh7f454c46tw1755855416_118028847/ott.mobaibox.com/PLTV/3/224/3221227548/index.m3u8?icpid=3&RTS=1674386166&from=40&popid=40&hms_devid=2116&prioritypopid=40&vqe=3
|
||||
NewTV精品体育,http://[2409:8087:2001:20:2800:0:df6e:eb1a]:80/wh7f454c46tw520038825_-1252386603/ott.mobaibox.com/PLTV/3/224/3221227615/index.m3u8?icpid=3&RTS=1674380635&from=40&popid=40&hms_devid=2116&prioritypopid=40&vqe=3
|
||||
NewTV精品大剧,http://[2409:8087:2001:20:2800:0:df6e:eb1b]:80/wh7f454c46tw1755993626_-1194432913/ott.mobaibox.com/PLTV/3/224/3221227618/index.m3u8?icpid=3&RTS=1674386166&from=40&popid=40&hms_devid=2116&prioritypopid=40&vqe=3
|
||||
NewTV精品纪录,http://[2409:8087:2001:20:2800:0:df6e:eb1b]:80/wh7f454c46tw1933659217_-1788924400/ott.mobaibox.com/PLTV/3/224/3221227547/index.m3u8?icpid=3&RTS=1674386344&from=40&popid=40&hms_devid=2116&prioritypopid=40&vqe=3
|
||||
NewTV精品萌宠,http://[2409:8087:2001:20:2800:0:df6e:eb24]:80/wh7f454c46tw2442197200_-2076384633/ott.mobaibox.com/PLTV/3/224/3221228430/index.m3u8?icpid=3&RTS=1674369672&from=40&popid=40&hms_devid=2292&prioritypopid=40&vqe=3
|
||||
NewTV金牌综艺,http://[2409:8087:2001:20:2800:0:df6e:eb19]:80/wh7f454c46tw2614190807_1624483481/ott.mobaibox.com/PLTV/3/224/3221227541/index.m3u8?icpid=3&RTS=1674387024&from=40&popid=40&hms_devid=2113&prioritypopid=40&vqe=3
|
||||
NewTV东北热剧,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225741/index.m3u8
|
||||
NewTV中国功夫,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225681/index.m3u8
|
||||
NewTV军事评论,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225668/index.m3u8
|
||||
NewTV军旅剧场,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225676/index.m3u8
|
||||
NewTV农业致富,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225683/index.m3u8
|
||||
NewTV动作电影,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225661/index.m3u8
|
||||
NewTV家庭剧场,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225677/index.m3u8
|
||||
NewTV怡伴健康,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225673/index.m3u8
|
||||
NewTV惊悚悬疑,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225665/index.m3u8
|
||||
NewTV明星大片,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225664/index.m3u8
|
||||
NewTV欢乐剧场,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225742/index.m3u8
|
||||
NewTV武搏世界,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225680/index.m3u8
|
||||
NewTV海外剧场,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225671/index.m3u8
|
||||
NewTV潮妈辣婆,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225685/index.m3u8
|
||||
NewTV爱情喜剧,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225669/index.m3u8
|
||||
NewTV精品大剧,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225670/index.m3u8
|
||||
NewTV精品纪录,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225672/index.m3u8
|
||||
NewTV精品体育,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225674/index.m3u8
|
||||
NewTV超级体育,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225715/index.m3u8
|
||||
NewTV超级电影,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225717/index.m3u8
|
||||
NewTV超级电视剧,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225716/index.m3u8
|
||||
NewTV超级综艺,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225714/index.m3u8
|
||||
NewTV金牌综艺,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221225666/index.m3u8
|
||||
NewTV精品萌宠,http://ottrrs.hl.chinamobile.com/PLTV/88888888/224/3221226505/index.m3u8
|
||||
@@ -0,0 +1,5853 @@
|
||||
/*! For license information please see node-rsa.bundle.js.LICENSE.txt */ ! function(t, e) {
|
||||
"object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.NODERSA = e() : t.NODERSA = e()
|
||||
}(globalThis, (() => (() => {
|
||||
var t = {
|
||||
6395: t => {
|
||||
t.exports = {
|
||||
newInvalidAsn1Error: function(t) {
|
||||
var e = new Error;
|
||||
return e.name = "InvalidAsn1Error", e.message = t || "", e
|
||||
}
|
||||
}
|
||||
},
|
||||
5670: (t, e, r) => {
|
||||
var n = r(6395),
|
||||
i = r(6299),
|
||||
o = r(3319),
|
||||
s = r(1431);
|
||||
for (var a in t.exports = {
|
||||
Reader: o,
|
||||
Writer: s
|
||||
}, i) i.hasOwnProperty(a) && (t.exports[a] = i[a]);
|
||||
for (var f in n) n.hasOwnProperty(f) && (t.exports[f] = n[f])
|
||||
},
|
||||
3319: (t, e, r) => {
|
||||
var n = r(4529),
|
||||
i = r(4774)
|
||||
.Buffer,
|
||||
o = r(6299),
|
||||
s = r(6395)
|
||||
.newInvalidAsn1Error;
|
||||
|
||||
function a(t) {
|
||||
if (!t || !i.isBuffer(t)) throw new TypeError("data must be a node Buffer");
|
||||
this._buf = t, this._size = t.length, this._len = 0, this._offset = 0
|
||||
}
|
||||
Object.defineProperty(a.prototype, "length", {
|
||||
enumerable: !0,
|
||||
get: function() {
|
||||
return this._len
|
||||
}
|
||||
}), Object.defineProperty(a.prototype, "offset", {
|
||||
enumerable: !0,
|
||||
get: function() {
|
||||
return this._offset
|
||||
}
|
||||
}), Object.defineProperty(a.prototype, "remain", {
|
||||
get: function() {
|
||||
return this._size - this._offset
|
||||
}
|
||||
}), Object.defineProperty(a.prototype, "buffer", {
|
||||
get: function() {
|
||||
return this._buf.slice(this._offset)
|
||||
}
|
||||
}), a.prototype.readByte = function(t) {
|
||||
if (this._size - this._offset < 1) return null;
|
||||
var e = 255 & this._buf[this._offset];
|
||||
return t || (this._offset += 1), e
|
||||
}, a.prototype.peek = function() {
|
||||
return this.readByte(!0)
|
||||
}, a.prototype.readLength = function(t) {
|
||||
if (void 0 === t && (t = this._offset), t >= this._size) return null;
|
||||
var e = 255 & this._buf[t++];
|
||||
if (null === e) return null;
|
||||
if (128 & ~e) this._len = e;
|
||||
else {
|
||||
if (0 == (e &= 127)) throw s("Indefinite length not supported");
|
||||
if (e > 4) throw s("encoding too long");
|
||||
if (this._size - t < e) return null;
|
||||
this._len = 0;
|
||||
for (var r = 0; r < e; r++) this._len = (this._len << 8) + (255 & this._buf[t++])
|
||||
}
|
||||
return t
|
||||
}, a.prototype.readSequence = function(t) {
|
||||
var e = this.peek();
|
||||
if (null === e) return null;
|
||||
if (void 0 !== t && t !== e) throw s("Expected 0x" + t.toString(16) + ": got 0x" + e.toString(16));
|
||||
var r = this.readLength(this._offset + 1);
|
||||
return null === r ? null : (this._offset = r, e)
|
||||
}, a.prototype.readInt = function() {
|
||||
return this._readTag(o.Integer)
|
||||
}, a.prototype.readBoolean = function() {
|
||||
return 0 !== this._readTag(o.Boolean)
|
||||
}, a.prototype.readEnumeration = function() {
|
||||
return this._readTag(o.Enumeration)
|
||||
}, a.prototype.readString = function(t, e) {
|
||||
t || (t = o.OctetString);
|
||||
var r = this.peek();
|
||||
if (null === r) return null;
|
||||
if (r !== t) throw s("Expected 0x" + t.toString(16) + ": got 0x" + r.toString(16));
|
||||
var n = this.readLength(this._offset + 1);
|
||||
if (null === n) return null;
|
||||
if (this.length > this._size - n) return null;
|
||||
if (this._offset = n, 0 === this.length) return e ? i.alloc(0) : "";
|
||||
var a = this._buf.slice(this._offset, this._offset + this.length);
|
||||
return this._offset += this.length, e ? a : a.toString("utf8")
|
||||
}, a.prototype.readOID = function(t) {
|
||||
t || (t = o.OID);
|
||||
var e = this.readString(t, !0);
|
||||
if (null === e) return null;
|
||||
for (var r = [], n = 0, i = 0; i < e.length; i++) {
|
||||
var s = 255 & e[i];
|
||||
n <<= 7, n += 127 & s, 128 & s || (r.push(n), n = 0)
|
||||
}
|
||||
return n = r.shift(), r.unshift(n % 40), r.unshift(n / 40 | 0), r.join(".")
|
||||
}, a.prototype._readTag = function(t) {
|
||||
n.ok(void 0 !== t);
|
||||
var e = this.peek();
|
||||
if (null === e) return null;
|
||||
if (e !== t) throw s("Expected 0x" + t.toString(16) + ": got 0x" + e.toString(16));
|
||||
var r = this.readLength(this._offset + 1);
|
||||
if (null === r) return null;
|
||||
if (this.length > 4) throw s("Integer too long: " + this.length);
|
||||
if (this.length > this._size - r) return null;
|
||||
this._offset = r;
|
||||
for (var i = this._buf[this._offset], o = 0, a = 0; a < this.length; a++) o <<= 8, o |= 255 & this._buf[this._offset++];
|
||||
return 128 & ~i || 4 === a || (o -= 1 << 8 * a), 0 | o
|
||||
}, t.exports = a
|
||||
},
|
||||
6299: t => {
|
||||
t.exports = {
|
||||
EOC: 0,
|
||||
Boolean: 1,
|
||||
Integer: 2,
|
||||
BitString: 3,
|
||||
OctetString: 4,
|
||||
Null: 5,
|
||||
OID: 6,
|
||||
ObjectDescriptor: 7,
|
||||
External: 8,
|
||||
Real: 9,
|
||||
Enumeration: 10,
|
||||
PDV: 11,
|
||||
Utf8String: 12,
|
||||
RelativeOID: 13,
|
||||
Sequence: 16,
|
||||
Set: 17,
|
||||
NumericString: 18,
|
||||
PrintableString: 19,
|
||||
T61String: 20,
|
||||
VideotexString: 21,
|
||||
IA5String: 22,
|
||||
UTCTime: 23,
|
||||
GeneralizedTime: 24,
|
||||
GraphicString: 25,
|
||||
VisibleString: 26,
|
||||
GeneralString: 28,
|
||||
UniversalString: 29,
|
||||
CharacterString: 30,
|
||||
BMPString: 31,
|
||||
Constructor: 32,
|
||||
Context: 128
|
||||
}
|
||||
},
|
||||
1431: (t, e, r) => {
|
||||
var n = r(4529),
|
||||
i = r(4774)
|
||||
.Buffer,
|
||||
o = r(6299),
|
||||
s = r(6395)
|
||||
.newInvalidAsn1Error,
|
||||
a = {
|
||||
size: 1024,
|
||||
growthFactor: 8
|
||||
};
|
||||
|
||||
function f(t) {
|
||||
var e, r;
|
||||
e = a, r = t || {}, n.ok(e), n.equal(typeof e, "object"), n.ok(r), n.equal(typeof r, "object"), Object.getOwnPropertyNames(e)
|
||||
.forEach((function(t) {
|
||||
if (!r[t]) {
|
||||
var n = Object.getOwnPropertyDescriptor(e, t);
|
||||
Object.defineProperty(r, t, n)
|
||||
}
|
||||
})), t = r, this._buf = i.alloc(t.size || 1024), this._size = this._buf.length, this._offset = 0, this._options = t, this._seq = []
|
||||
}
|
||||
Object.defineProperty(f.prototype, "buffer", {
|
||||
get: function() {
|
||||
if (this._seq.length) throw s(this._seq.length + " unended sequence(s)");
|
||||
return this._buf.slice(0, this._offset)
|
||||
}
|
||||
}), f.prototype.writeByte = function(t) {
|
||||
if ("number" != typeof t) throw new TypeError("argument must be a Number");
|
||||
this._ensure(1), this._buf[this._offset++] = t
|
||||
}, f.prototype.writeInt = function(t, e) {
|
||||
if ("number" != typeof t) throw new TypeError("argument must be a Number");
|
||||
"number" != typeof e && (e = o.Integer);
|
||||
for (var r = 4;
|
||||
(!(4286578688 & t) || -8388608 == (4286578688 & t)) && r > 1;) r--, t <<= 8;
|
||||
if (r > 4) throw s("BER ints cannot be > 0xffffffff");
|
||||
for (this._ensure(2 + r), this._buf[this._offset++] = e, this._buf[this._offset++] = r; r-- > 0;) this._buf[this._offset++] = (4278190080 & t) >>> 24, t <<= 8
|
||||
}, f.prototype.writeNull = function() {
|
||||
this.writeByte(o.Null), this.writeByte(0)
|
||||
}, f.prototype.writeEnumeration = function(t, e) {
|
||||
if ("number" != typeof t) throw new TypeError("argument must be a Number");
|
||||
return "number" != typeof e && (e = o.Enumeration), this.writeInt(t, e)
|
||||
}, f.prototype.writeBoolean = function(t, e) {
|
||||
if ("boolean" != typeof t) throw new TypeError("argument must be a Boolean");
|
||||
"number" != typeof e && (e = o.Boolean), this._ensure(3), this._buf[this._offset++] = e, this._buf[this._offset++] = 1, this._buf[this._offset++] = t ? 255 : 0
|
||||
}, f.prototype.writeString = function(t, e) {
|
||||
if ("string" != typeof t) throw new TypeError("argument must be a string (was: " + typeof t + ")");
|
||||
"number" != typeof e && (e = o.OctetString);
|
||||
var r = i.byteLength(t);
|
||||
this.writeByte(e), this.writeLength(r), r && (this._ensure(r), this._buf.write(t, this._offset), this._offset += r)
|
||||
}, f.prototype.writeBuffer = function(t, e) {
|
||||
if ("number" != typeof e) throw new TypeError("tag must be a number");
|
||||
if (!i.isBuffer(t)) throw new TypeError("argument must be a buffer");
|
||||
this.writeByte(e), this.writeLength(t.length), this._ensure(t.length), t.copy(this._buf, this._offset, 0, t.length), this._offset += t.length
|
||||
}, f.prototype.writeStringArray = function(t) {
|
||||
if (!t instanceof Array) throw new TypeError("argument must be an Array[String]");
|
||||
var e = this;
|
||||
t.forEach((function(t) {
|
||||
e.writeString(t)
|
||||
}))
|
||||
}, f.prototype.writeOID = function(t, e) {
|
||||
if ("string" != typeof t) throw new TypeError("argument must be a string");
|
||||
if ("number" != typeof e && (e = o.OID), !/^([0-9]+\.){3,}[0-9]+$/.test(t)) throw new Error("argument is not a valid OID string");
|
||||
var r = t.split("."),
|
||||
n = [];
|
||||
n.push(40 * parseInt(r[0], 10) + parseInt(r[1], 10)), r.slice(2)
|
||||
.forEach((function(t) {
|
||||
! function(t, e) {
|
||||
e < 128 ? t.push(e) : e < 16384 ? (t.push(e >>> 7 | 128), t.push(127 & e)) : e < 2097152 ? (t.push(e >>> 14 | 128), t.push(e >>> 7 & 255 | 128), t.push(127 & e)) : e < 268435456 ? (t.push(e >>> 21 | 128), t.push(e >>> 14 & 255 | 128), t.push(e >>> 7 & 255 | 128), t.push(127 & e)) : (t.push(e >>> 28 & 255 | 128), t.push(e >>> 21 & 255 | 128), t.push(e >>> 14 & 255 | 128), t.push(e >>> 7 & 255 | 128), t.push(127 & e))
|
||||
}(n, parseInt(t, 10))
|
||||
}));
|
||||
var i = this;
|
||||
this._ensure(2 + n.length), this.writeByte(e), this.writeLength(n.length), n.forEach((function(t) {
|
||||
i.writeByte(t)
|
||||
}))
|
||||
}, f.prototype.writeLength = function(t) {
|
||||
if ("number" != typeof t) throw new TypeError("argument must be a Number");
|
||||
if (this._ensure(4), t <= 127) this._buf[this._offset++] = t;
|
||||
else if (t <= 255) this._buf[this._offset++] = 129, this._buf[this._offset++] = t;
|
||||
else if (t <= 65535) this._buf[this._offset++] = 130, this._buf[this._offset++] = t >> 8, this._buf[this._offset++] = t;
|
||||
else {
|
||||
if (!(t <= 16777215)) throw s("Length too long (> 4 bytes)");
|
||||
this._buf[this._offset++] = 131, this._buf[this._offset++] = t >> 16, this._buf[this._offset++] = t >> 8, this._buf[this._offset++] = t
|
||||
}
|
||||
}, f.prototype.startSequence = function(t) {
|
||||
"number" != typeof t && (t = o.Sequence | o.Constructor), this.writeByte(t), this._seq.push(this._offset), this._ensure(3), this._offset += 3
|
||||
}, f.prototype.endSequence = function() {
|
||||
var t = this._seq.pop(),
|
||||
e = t + 3,
|
||||
r = this._offset - e;
|
||||
if (r <= 127) this._shift(e, r, -2), this._buf[t] = r;
|
||||
else if (r <= 255) this._shift(e, r, -1), this._buf[t] = 129, this._buf[t + 1] = r;
|
||||
else if (r <= 65535) this._buf[t] = 130, this._buf[t + 1] = r >> 8, this._buf[t + 2] = r;
|
||||
else {
|
||||
if (!(r <= 16777215)) throw s("Sequence too long");
|
||||
this._shift(e, r, 1), this._buf[t] = 131, this._buf[t + 1] = r >> 16, this._buf[t + 2] = r >> 8, this._buf[t + 3] = r
|
||||
}
|
||||
}, f.prototype._shift = function(t, e, r) {
|
||||
n.ok(void 0 !== t), n.ok(void 0 !== e), n.ok(r), this._buf.copy(this._buf, t + r, t, t + e), this._offset += r
|
||||
}, f.prototype._ensure = function(t) {
|
||||
if (n.ok(t), this._size - this._offset < t) {
|
||||
var e = this._size * this._options.growthFactor;
|
||||
e - this._offset < t && (e += t);
|
||||
var r = i.alloc(e);
|
||||
this._buf.copy(r, 0, 0, this._offset), this._buf = r, this._size = e
|
||||
}
|
||||
}, t.exports = f
|
||||
},
|
||||
3100: (t, e, r) => {
|
||||
var n = r(5670);
|
||||
t.exports = {
|
||||
Ber: n,
|
||||
BerReader: n.Reader,
|
||||
BerWriter: n.Writer
|
||||
}
|
||||
},
|
||||
4529: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(1514)();
|
||||
|
||||
function i(t, e) {
|
||||
if (t === e) return 0;
|
||||
for (var r = t.length, n = e.length, i = 0, o = Math.min(r, n); i < o; ++i) if (t[i] !== e[i]) {
|
||||
r = t[i], n = e[i];
|
||||
break
|
||||
}
|
||||
return r < n ? -1 : n < r ? 1 : 0
|
||||
}
|
||||
function o(t) {
|
||||
return r.g.Buffer && "function" == typeof r.g.Buffer.isBuffer ? r.g.Buffer.isBuffer(t) : !(null == t || !t._isBuffer)
|
||||
}
|
||||
var s = r(4591),
|
||||
a = Object.prototype.hasOwnProperty,
|
||||
f = Array.prototype.slice,
|
||||
u = "foo" === function() {}.name;
|
||||
|
||||
function c(t) {
|
||||
return Object.prototype.toString.call(t)
|
||||
}
|
||||
function h(t) {
|
||||
return !o(t) && "function" == typeof r.g.ArrayBuffer && ("function" == typeof ArrayBuffer.isView ? ArrayBuffer.isView(t) : !! t && (t instanceof DataView || !! (t.buffer && t.buffer instanceof ArrayBuffer)))
|
||||
}
|
||||
var p = t.exports = m,
|
||||
l = /\s*function\s+([^\(\s]*)\s*/;
|
||||
|
||||
function y(t) {
|
||||
if (s.isFunction(t)) {
|
||||
if (u) return t.name;
|
||||
var e = t.toString()
|
||||
.match(l);
|
||||
return e && e[1]
|
||||
}
|
||||
}
|
||||
function g(t, e) {
|
||||
return "string" == typeof t ? t.length < e ? t : t.slice(0, e) : t
|
||||
}
|
||||
function d(t) {
|
||||
if (u || !s.isFunction(t)) return s.inspect(t);
|
||||
var e = y(t);
|
||||
return "[Function" + (e ? ": " + e : "") + "]"
|
||||
}
|
||||
function v(t, e, r, n, i) {
|
||||
throw new p.AssertionError({
|
||||
message: r,
|
||||
actual: t,
|
||||
expected: e,
|
||||
operator: n,
|
||||
stackStartFunction: i
|
||||
})
|
||||
}
|
||||
function m(t, e) {
|
||||
t || v(t, !0, e, "==", p.ok)
|
||||
}
|
||||
function S(t, e, r, n) {
|
||||
if (t === e) return !0;
|
||||
if (o(t) && o(e)) return 0 === i(t, e);
|
||||
if (s.isDate(t) && s.isDate(e)) return t.getTime() === e.getTime();
|
||||
if (s.isRegExp(t) && s.isRegExp(e)) return t.source === e.source && t.global === e.global && t.multiline === e.multiline && t.lastIndex === e.lastIndex && t.ignoreCase === e.ignoreCase;
|
||||
if (null !== t && "object" == typeof t || null !== e && "object" == typeof e) {
|
||||
if (h(t) && h(e) && c(t) === c(e) && !(t instanceof Float32Array || t instanceof Float64Array)) return 0 === i(new Uint8Array(t.buffer), new Uint8Array(e.buffer));
|
||||
if (o(t) !== o(e)) return !1;
|
||||
var a = (n = n || {
|
||||
actual: [],
|
||||
expected: []
|
||||
})
|
||||
.actual.indexOf(t);
|
||||
return -1 !== a && a === n.expected.indexOf(e) || (n.actual.push(t), n.expected.push(e), function(t, e, r, n) {
|
||||
if (null == t || null == e) return !1;
|
||||
if (s.isPrimitive(t) || s.isPrimitive(e)) return t === e;
|
||||
if (r && Object.getPrototypeOf(t) !== Object.getPrototypeOf(e)) return !1;
|
||||
var i = _(t),
|
||||
o = _(e);
|
||||
if (i && !o || !i && o) return !1;
|
||||
if (i) return S(t = f.call(t), e = f.call(e), r);
|
||||
var a, u, c = w(t),
|
||||
h = w(e);
|
||||
if (c.length !== h.length) return !1;
|
||||
for (c.sort(), h.sort(), u = c.length - 1; u >= 0; u--) if (c[u] !== h[u]) return !1;
|
||||
for (u = c.length - 1; u >= 0; u--) if (!S(t[a = c[u]], e[a], r, n)) return !1;
|
||||
return !0
|
||||
}(t, e, r, n))
|
||||
}
|
||||
return r ? t === e : t == e
|
||||
}
|
||||
function _(t) {
|
||||
return "[object Arguments]" == Object.prototype.toString.call(t)
|
||||
}
|
||||
function b(t, e) {
|
||||
if (!t || !e) return !1;
|
||||
if ("[object RegExp]" == Object.prototype.toString.call(e)) return e.test(t);
|
||||
try {
|
||||
if (t instanceof e) return !0
|
||||
} catch (t) {}
|
||||
return !Error.isPrototypeOf(e) && !0 === e.call({}, t)
|
||||
}
|
||||
function E(t, e, r, n) {
|
||||
var i;
|
||||
if ("function" != typeof e) throw new TypeError('"block" argument must be a function');
|
||||
"string" == typeof r && (n = r, r = null), i = function(t) {
|
||||
var e;
|
||||
try {
|
||||
t()
|
||||
} catch (t) {
|
||||
e = t
|
||||
}
|
||||
return e
|
||||
}(e), n = (r && r.name ? " (" + r.name + ")." : ".") + (n ? " " + n : "."), t && !i && v(i, r, "Missing expected exception" + n);
|
||||
var o = "string" == typeof n,
|
||||
a = !t && i && !r;
|
||||
if ((!t && s.isError(i) && o && b(i, r) || a) && v(i, r, "Got unwanted exception" + n), t && i && r && !b(i, r) || !t && i) throw i
|
||||
}
|
||||
p.AssertionError = function(t) {
|
||||
this.name = "AssertionError", this.actual = t.actual, this.expected = t.expected, this.operator = t.operator, t.message ? (this.message = t.message, this.generatedMessage = !1) : (this.message = g(d(this.actual), 128) + " " + this.operator + " " + g(d(this.expected), 128), this.generatedMessage = !0);
|
||||
var e = t.stackStartFunction || v;
|
||||
if (Error.captureStackTrace) Error.captureStackTrace(this, e);
|
||||
else {
|
||||
var r = new Error;
|
||||
if (r.stack) {
|
||||
var n = r.stack,
|
||||
i = y(e),
|
||||
o = n.indexOf("\n" + i);
|
||||
if (o >= 0) {
|
||||
var s = n.indexOf("\n", o + 1);
|
||||
n = n.substring(s + 1)
|
||||
}
|
||||
this.stack = n
|
||||
}
|
||||
}
|
||||
}, s.inherits(p.AssertionError, Error), p.fail = v, p.ok = m, p.equal = function(t, e, r) {
|
||||
t != e && v(t, e, r, "==", p.equal)
|
||||
}, p.notEqual = function(t, e, r) {
|
||||
t == e && v(t, e, r, "!=", p.notEqual)
|
||||
}, p.deepEqual = function(t, e, r) {
|
||||
S(t, e, !1) || v(t, e, r, "deepEqual", p.deepEqual)
|
||||
}, p.deepStrictEqual = function(t, e, r) {
|
||||
S(t, e, !0) || v(t, e, r, "deepStrictEqual", p.deepStrictEqual)
|
||||
}, p.notDeepEqual = function(t, e, r) {
|
||||
S(t, e, !1) && v(t, e, r, "notDeepEqual", p.notDeepEqual)
|
||||
}, p.notDeepStrictEqual = function t(e, r, n) {
|
||||
S(e, r, !0) && v(e, r, n, "notDeepStrictEqual", t)
|
||||
}, p.strictEqual = function(t, e, r) {
|
||||
t !== e && v(t, e, r, "===", p.strictEqual)
|
||||
}, p.notStrictEqual = function(t, e, r) {
|
||||
t === e && v(t, e, r, "!==", p.notStrictEqual)
|
||||
}, p.throws = function(t, e, r) {
|
||||
E(!0, t, e, r)
|
||||
}, p.doesNotThrow = function(t, e, r) {
|
||||
E(!1, t, e, r)
|
||||
}, p.ifError = function(t) {
|
||||
if (t) throw t
|
||||
}, p.strict = n((function t(e, r) {
|
||||
e || v(e, !0, r, "==", t)
|
||||
}), p, {
|
||||
equal: p.strictEqual,
|
||||
deepEqual: p.deepStrictEqual,
|
||||
notEqual: p.notStrictEqual,
|
||||
notDeepEqual: p.notDeepStrictEqual
|
||||
}), p.strict.strict = p.strict;
|
||||
var w = Object.keys || function(t) {
|
||||
var e = [];
|
||||
for (var r in t) a.call(t, r) && e.push(r);
|
||||
return e
|
||||
}
|
||||
},
|
||||
6100: t => {
|
||||
"function" == typeof Object.create ? t.exports = function(t, e) {
|
||||
t.super_ = e, t.prototype = Object.create(e.prototype, {
|
||||
constructor: {
|
||||
value: t,
|
||||
enumerable: !1,
|
||||
writable: !0,
|
||||
configurable: !0
|
||||
}
|
||||
})
|
||||
} : t.exports = function(t, e) {
|
||||
t.super_ = e;
|
||||
var r = function() {};
|
||||
r.prototype = e.prototype, t.prototype = new r, t.prototype.constructor = t
|
||||
}
|
||||
},
|
||||
3845: t => {
|
||||
t.exports = function(t) {
|
||||
return t && "object" == typeof t && "function" == typeof t.copy && "function" == typeof t.fill && "function" == typeof t.readUInt8
|
||||
}
|
||||
},
|
||||
4591: (t, e, r) => {
|
||||
var n = r(5606),
|
||||
i = /%[sdj%]/g;
|
||||
e.format = function(t) {
|
||||
if (!v(t)) {
|
||||
for (var e = [], r = 0; r < arguments.length; r++) e.push(a(arguments[r]));
|
||||
return e.join(" ")
|
||||
}
|
||||
r = 1;
|
||||
for (var n = arguments, o = n.length, s = String(t)
|
||||
.replace(i, (function(t) {
|
||||
if ("%%" === t) return "%";
|
||||
if (r >= o) return t;
|
||||
switch (t) {
|
||||
case "%s":
|
||||
return String(n[r++]);
|
||||
case "%d":
|
||||
return Number(n[r++]);
|
||||
case "%j":
|
||||
try {
|
||||
return JSON.stringify(n[r++])
|
||||
} catch (t) {
|
||||
return "[Circular]"
|
||||
}
|
||||
default:
|
||||
return t
|
||||
}
|
||||
})), f = n[r]; r < o; f = n[++r]) g(f) || !_(f) ? s += " " + f : s += " " + a(f);
|
||||
return s
|
||||
}, e.deprecate = function(t, i) {
|
||||
if (m(r.g.process)) return function() {
|
||||
return e.deprecate(t, i)
|
||||
.apply(this, arguments)
|
||||
};
|
||||
if (!0 === n.noDeprecation) return t;
|
||||
var o = !1;
|
||||
return function() {
|
||||
if (!o) {
|
||||
if (n.throwDeprecation) throw new Error(i);
|
||||
n.traceDeprecation ? console.trace(i) : console.error(i), o = !0
|
||||
}
|
||||
return t.apply(this, arguments)
|
||||
}
|
||||
};
|
||||
var o, s = {};
|
||||
|
||||
function a(t, r) {
|
||||
var n = {
|
||||
seen: [],
|
||||
stylize: u
|
||||
};
|
||||
return arguments.length >= 3 && (n.depth = arguments[2]), arguments.length >= 4 && (n.colors = arguments[3]), y(r) ? n.showHidden = r : r && e._extend(n, r), m(n.showHidden) && (n.showHidden = !1), m(n.depth) && (n.depth = 2), m(n.colors) && (n.colors = !1), m(n.customInspect) && (n.customInspect = !0), n.colors && (n.stylize = f), c(n, t, n.depth)
|
||||
}
|
||||
function f(t, e) {
|
||||
var r = a.styles[e];
|
||||
return r ? "[" + a.colors[r][0] + "m" + t + "[" + a.colors[r][1] + "m" : t
|
||||
}
|
||||
function u(t, e) {
|
||||
return t
|
||||
}
|
||||
function c(t, r, n) {
|
||||
if (t.customInspect && r && w(r.inspect) && r.inspect !== e.inspect && (!r.constructor || r.constructor.prototype !== r)) {
|
||||
var i = r.inspect(n, t);
|
||||
return v(i) || (i = c(t, i, n)), i
|
||||
}
|
||||
var o = function(t, e) {
|
||||
if (m(e)) return t.stylize("undefined", "undefined");
|
||||
if (v(e)) {
|
||||
var r = "'" + JSON.stringify(e)
|
||||
.replace(/^"|"$/g, "")
|
||||
.replace(/'/g, "\\'")
|
||||
.replace(/\\"/g, '"') + "'";
|
||||
return t.stylize(r, "string")
|
||||
}
|
||||
return d(e) ? t.stylize("" + e, "number") : y(e) ? t.stylize("" + e, "boolean") : g(e) ? t.stylize("null", "null") : void 0
|
||||
}(t, r);
|
||||
if (o) return o;
|
||||
var s = Object.keys(r),
|
||||
a = function(t) {
|
||||
var e = {};
|
||||
return t.forEach((function(t, r) {
|
||||
e[t] = !0
|
||||
})), e
|
||||
}(s);
|
||||
if (t.showHidden && (s = Object.getOwnPropertyNames(r)), E(r) && (s.indexOf("message") >= 0 || s.indexOf("description") >= 0)) return h(r);
|
||||
if (0 === s.length) {
|
||||
if (w(r)) {
|
||||
var f = r.name ? ": " + r.name : "";
|
||||
return t.stylize("[Function" + f + "]", "special")
|
||||
}
|
||||
if (S(r)) return t.stylize(RegExp.prototype.toString.call(r), "regexp");
|
||||
if (b(r)) return t.stylize(Date.prototype.toString.call(r), "date");
|
||||
if (E(r)) return h(r)
|
||||
}
|
||||
var u, _ = "",
|
||||
O = !1,
|
||||
B = ["{", "}"];
|
||||
return l(r) && (O = !0, B = ["[", "]"]), w(r) && (_ = " [Function" + (r.name ? ": " + r.name : "") + "]"), S(r) && (_ = " " + RegExp.prototype.toString.call(r)), b(r) && (_ = " " + Date.prototype.toUTCString.call(r)), E(r) && (_ = " " + h(r)), 0 !== s.length || O && 0 != r.length ? n < 0 ? S(r) ? t.stylize(RegExp.prototype.toString.call(r), "regexp") : t.stylize("[Object]", "special") : (t.seen.push(r), u = O ? function(t, e, r, n, i) {
|
||||
for (var o = [], s = 0, a = e.length; s < a; ++s) x(e, String(s)) ? o.push(p(t, e, r, n, String(s), !0)) : o.push("");
|
||||
return i.forEach((function(i) {
|
||||
i.match(/^\d+$/) || o.push(p(t, e, r, n, i, !0))
|
||||
})), o
|
||||
}(t, r, n, a, s) : s.map((function(e) {
|
||||
return p(t, r, n, a, e, O)
|
||||
})), t.seen.pop(), function(t, e, r) {
|
||||
return t.reduce((function(t, e) {
|
||||
return e.indexOf("\n"), t + e.replace(/\u001b\[\d\d?m/g, "")
|
||||
.length + 1
|
||||
}), 0) > 60 ? r[0] + ("" === e ? "" : e + "\n ") + " " + t.join(",\n ") + " " + r[1] : r[0] + e + " " + t.join(", ") + " " + r[1]
|
||||
}(u, _, B)) : B[0] + _ + B[1]
|
||||
}
|
||||
function h(t) {
|
||||
return "[" + Error.prototype.toString.call(t) + "]"
|
||||
}
|
||||
function p(t, e, r, n, i, o) {
|
||||
var s, a, f;
|
||||
if ((f = Object.getOwnPropertyDescriptor(e, i) || {
|
||||
value: e[i]
|
||||
})
|
||||
.get ? a = f.set ? t.stylize("[Getter/Setter]", "special") : t.stylize("[Getter]", "special") : f.set && (a = t.stylize("[Setter]", "special")), x(n, i) || (s = "[" + i + "]"), a || (t.seen.indexOf(f.value) < 0 ? (a = g(r) ? c(t, f.value, null) : c(t, f.value, r - 1))
|
||||
.indexOf("\n") > -1 && (a = o ? a.split("\n")
|
||||
.map((function(t) {
|
||||
return " " + t
|
||||
}))
|
||||
.join("\n")
|
||||
.substr(2) : "\n" + a.split("\n")
|
||||
.map((function(t) {
|
||||
return " " + t
|
||||
}))
|
||||
.join("\n")) : a = t.stylize("[Circular]", "special")), m(s)) {
|
||||
if (o && i.match(/^\d+$/)) return a;
|
||||
(s = JSON.stringify("" + i))
|
||||
.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (s = s.substr(1, s.length - 2), s = t.stylize(s, "name")) : (s = s.replace(/'/g, "\\'")
|
||||
.replace(/\\"/g, '"')
|
||||
.replace(/(^"|"$)/g, "'"), s = t.stylize(s, "string"))
|
||||
}
|
||||
return s + ": " + a
|
||||
}
|
||||
function l(t) {
|
||||
return Array.isArray(t)
|
||||
}
|
||||
function y(t) {
|
||||
return "boolean" == typeof t
|
||||
}
|
||||
function g(t) {
|
||||
return null === t
|
||||
}
|
||||
function d(t) {
|
||||
return "number" == typeof t
|
||||
}
|
||||
function v(t) {
|
||||
return "string" == typeof t
|
||||
}
|
||||
function m(t) {
|
||||
return void 0 === t
|
||||
}
|
||||
function S(t) {
|
||||
return _(t) && "[object RegExp]" === O(t)
|
||||
}
|
||||
function _(t) {
|
||||
return "object" == typeof t && null !== t
|
||||
}
|
||||
function b(t) {
|
||||
return _(t) && "[object Date]" === O(t)
|
||||
}
|
||||
function E(t) {
|
||||
return _(t) && ("[object Error]" === O(t) || t instanceof Error)
|
||||
}
|
||||
function w(t) {
|
||||
return "function" == typeof t
|
||||
}
|
||||
function O(t) {
|
||||
return Object.prototype.toString.call(t)
|
||||
}
|
||||
function B(t) {
|
||||
return t < 10 ? "0" + t.toString(10) : t.toString(10)
|
||||
}
|
||||
e.debuglog = function(t) {
|
||||
if (m(o) && (o = n.env.NODE_DEBUG || ""), t = t.toUpperCase(), !s[t]) if (new RegExp("\\b" + t + "\\b", "i")
|
||||
.test(o)) {
|
||||
var r = n.pid;
|
||||
s[t] = function() {
|
||||
var n = e.format.apply(e, arguments);
|
||||
console.error("%s %d: %s", t, r, n)
|
||||
}
|
||||
} else s[t] = function() {};
|
||||
return s[t]
|
||||
}, e.inspect = a, a.colors = {
|
||||
bold: [1, 22],
|
||||
italic: [3, 23],
|
||||
underline: [4, 24],
|
||||
inverse: [7, 27],
|
||||
white: [37, 39],
|
||||
grey: [90, 39],
|
||||
black: [30, 39],
|
||||
blue: [34, 39],
|
||||
cyan: [36, 39],
|
||||
green: [32, 39],
|
||||
magenta: [35, 39],
|
||||
red: [31, 39],
|
||||
yellow: [33, 39]
|
||||
}, a.styles = {
|
||||
special: "cyan",
|
||||
number: "yellow",
|
||||
boolean: "yellow",
|
||||
undefined: "grey",
|
||||
null: "bold",
|
||||
string: "green",
|
||||
date: "magenta",
|
||||
regexp: "red"
|
||||
}, e.isArray = l, e.isBoolean = y, e.isNull = g, e.isNullOrUndefined = function(t) {
|
||||
return null == t
|
||||
}, e.isNumber = d, e.isString = v, e.isSymbol = function(t) {
|
||||
return "symbol" == typeof t
|
||||
}, e.isUndefined = m, e.isRegExp = S, e.isObject = _, e.isDate = b, e.isError = E, e.isFunction = w, e.isPrimitive = function(t) {
|
||||
return null === t || "boolean" == typeof t || "number" == typeof t || "string" == typeof t || "symbol" == typeof t || void 0 === t
|
||||
}, e.isBuffer = r(3845);
|
||||
var A = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
||||
|
||||
function x(t, e) {
|
||||
return Object.prototype.hasOwnProperty.call(t, e)
|
||||
}
|
||||
e.log = function() {
|
||||
var t, r;
|
||||
console.log("%s - %s", (r = [B((t = new Date)
|
||||
.getHours()), B(t.getMinutes()), B(t.getSeconds())].join(":"), [t.getDate(), A[t.getMonth()], r].join(" ")), e.format.apply(e, arguments))
|
||||
}, e.inherits = r(6100), e._extend = function(t, e) {
|
||||
if (!e || !_(e)) return t;
|
||||
for (var r = Object.keys(e), n = r.length; n--;) t[r[n]] = e[r[n]];
|
||||
return t
|
||||
}
|
||||
},
|
||||
7526: (t, e) => {
|
||||
"use strict";
|
||||
e.byteLength = function(t) {
|
||||
var e = a(t),
|
||||
r = e[0],
|
||||
n = e[1];
|
||||
return 3 * (r + n) / 4 - n
|
||||
}, e.toByteArray = function(t) {
|
||||
var e, r, o = a(t),
|
||||
s = o[0],
|
||||
f = o[1],
|
||||
u = new i(function(t, e, r) {
|
||||
return 3 * (e + r) / 4 - r
|
||||
}(0, s, f)),
|
||||
c = 0,
|
||||
h = f > 0 ? s - 4 : s;
|
||||
for (r = 0; r < h; r += 4) e = n[t.charCodeAt(r)] << 18 | n[t.charCodeAt(r + 1)] << 12 | n[t.charCodeAt(r + 2)] << 6 | n[t.charCodeAt(r + 3)], u[c++] = e >> 16 & 255, u[c++] = e >> 8 & 255, u[c++] = 255 & e;
|
||||
return 2 === f && (e = n[t.charCodeAt(r)] << 2 | n[t.charCodeAt(r + 1)] >> 4, u[c++] = 255 & e), 1 === f && (e = n[t.charCodeAt(r)] << 10 | n[t.charCodeAt(r + 1)] << 4 | n[t.charCodeAt(r + 2)] >> 2, u[c++] = e >> 8 & 255, u[c++] = 255 & e), u
|
||||
}, e.fromByteArray = function(t) {
|
||||
for (var e, n = t.length, i = n % 3, o = [], s = 16383, a = 0, u = n - i; a < u; a += s) o.push(f(t, a, a + s > u ? u : a + s));
|
||||
return 1 === i ? (e = t[n - 1], o.push(r[e >> 2] + r[e << 4 & 63] + "==")) : 2 === i && (e = (t[n - 2] << 8) + t[n - 1], o.push(r[e >> 10] + r[e >> 4 & 63] + r[e << 2 & 63] + "=")), o.join("")
|
||||
};
|
||||
for (var r = [], n = [], i = "undefined" != typeof Uint8Array ? Uint8Array : Array, o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s = 0; s < 64; ++s) r[s] = o[s], n[o.charCodeAt(s)] = s;
|
||||
|
||||
function a(t) {
|
||||
var e = t.length;
|
||||
if (e % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
|
||||
var r = t.indexOf("=");
|
||||
return -1 === r && (r = e), [r, r === e ? 0 : 4 - r % 4]
|
||||
}
|
||||
function f(t, e, n) {
|
||||
for (var i, o, s = [], a = e; a < n; a += 3) i = (t[a] << 16 & 16711680) + (t[a + 1] << 8 & 65280) + (255 & t[a + 2]), s.push(r[(o = i) >> 18 & 63] + r[o >> 12 & 63] + r[o >> 6 & 63] + r[63 & o]);
|
||||
return s.join("")
|
||||
}
|
||||
n["-".charCodeAt(0)] = 62, n["_".charCodeAt(0)] = 63
|
||||
},
|
||||
8287: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(7526),
|
||||
i = r(251);
|
||||
e.Buffer = a, e.SlowBuffer = function(t) {
|
||||
return +t != t && (t = 0), a.alloc(+t)
|
||||
}, e.INSPECT_MAX_BYTES = 50;
|
||||
var o = 2147483647;
|
||||
|
||||
function s(t) {
|
||||
if (t > o) throw new RangeError('The value "' + t + '" is invalid for option "size"');
|
||||
var e = new Uint8Array(t);
|
||||
return e.__proto__ = a.prototype, e
|
||||
}
|
||||
function a(t, e, r) {
|
||||
if ("number" == typeof t) {
|
||||
if ("string" == typeof e) throw new TypeError('The "string" argument must be of type string. Received type number');
|
||||
return c(t)
|
||||
}
|
||||
return f(t, e, r)
|
||||
}
|
||||
function f(t, e, r) {
|
||||
if ("string" == typeof t) return function(t, e) {
|
||||
if ("string" == typeof e && "" !== e || (e = "utf8"), !a.isEncoding(e)) throw new TypeError("Unknown encoding: " + e);
|
||||
var r = 0 | l(t, e),
|
||||
n = s(r),
|
||||
i = n.write(t, e);
|
||||
return i !== r && (n = n.slice(0, i)), n
|
||||
}(t, e);
|
||||
if (ArrayBuffer.isView(t)) return h(t);
|
||||
if (null == t) throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof t);
|
||||
if (H(t, ArrayBuffer) || t && H(t.buffer, ArrayBuffer)) return function(t, e, r) {
|
||||
if (e < 0 || t.byteLength < e) throw new RangeError('"offset" is outside of buffer bounds');
|
||||
if (t.byteLength < e + (r || 0)) throw new RangeError('"length" is outside of buffer bounds');
|
||||
var n;
|
||||
return (n = void 0 === e && void 0 === r ? new Uint8Array(t) : void 0 === r ? new Uint8Array(t, e) : new Uint8Array(t, e, r))
|
||||
.__proto__ = a.prototype, n
|
||||
}(t, e, r);
|
||||
if ("number" == typeof t) throw new TypeError('The "value" argument must not be of type number. Received type number');
|
||||
var n = t.valueOf && t.valueOf();
|
||||
if (null != n && n !== t) return a.from(n, e, r);
|
||||
var i = function(t) {
|
||||
if (a.isBuffer(t)) {
|
||||
var e = 0 | p(t.length),
|
||||
r = s(e);
|
||||
return 0 === r.length || t.copy(r, 0, 0, e), r
|
||||
}
|
||||
return void 0 !== t.length ? "number" != typeof t.length || F(t.length) ? s(0) : h(t) : "Buffer" === t.type && Array.isArray(t.data) ? h(t.data) : void 0
|
||||
}(t);
|
||||
if (i) return i;
|
||||
if ("undefined" != typeof Symbol && null != Symbol.toPrimitive && "function" == typeof t[Symbol.toPrimitive]) return a.from(t[Symbol.toPrimitive]("string"), e, r);
|
||||
throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof t)
|
||||
}
|
||||
function u(t) {
|
||||
if ("number" != typeof t) throw new TypeError('"size" argument must be of type number');
|
||||
if (t < 0) throw new RangeError('The value "' + t + '" is invalid for option "size"')
|
||||
}
|
||||
function c(t) {
|
||||
return u(t), s(t < 0 ? 0 : 0 | p(t))
|
||||
}
|
||||
function h(t) {
|
||||
for (var e = t.length < 0 ? 0 : 0 | p(t.length), r = s(e), n = 0; n < e; n += 1) r[n] = 255 & t[n];
|
||||
return r
|
||||
}
|
||||
function p(t) {
|
||||
if (t >= o) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + o.toString(16) + " bytes");
|
||||
return 0 | t
|
||||
}
|
||||
function l(t, e) {
|
||||
if (a.isBuffer(t)) return t.length;
|
||||
if (ArrayBuffer.isView(t) || H(t, ArrayBuffer)) return t.byteLength;
|
||||
if ("string" != typeof t) throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof t);
|
||||
var r = t.length,
|
||||
n = arguments.length > 2 && !0 === arguments[2];
|
||||
if (!n && 0 === r) return 0;
|
||||
for (var i = !1;;) switch (e) {
|
||||
case "ascii":
|
||||
case "latin1":
|
||||
case "binary":
|
||||
return r;
|
||||
case "utf8":
|
||||
case "utf-8":
|
||||
return U(t)
|
||||
.length;
|
||||
case "ucs2":
|
||||
case "ucs-2":
|
||||
case "utf16le":
|
||||
case "utf-16le":
|
||||
return 2 * r;
|
||||
case "hex":
|
||||
return r >>> 1;
|
||||
case "base64":
|
||||
return M(t)
|
||||
.length;
|
||||
default:
|
||||
if (i) return n ? -1 : U(t)
|
||||
.length;
|
||||
e = ("" + e)
|
||||
.toLowerCase(), i = !0
|
||||
}
|
||||
}
|
||||
function y(t, e, r) {
|
||||
var n = !1;
|
||||
if ((void 0 === e || e < 0) && (e = 0), e > this.length) return "";
|
||||
if ((void 0 === r || r > this.length) && (r = this.length), r <= 0) return "";
|
||||
if ((r >>>= 0) <= (e >>>= 0)) return "";
|
||||
for (t || (t = "utf8");;) switch (t) {
|
||||
case "hex":
|
||||
return T(this, e, r);
|
||||
case "utf8":
|
||||
case "utf-8":
|
||||
return B(this, e, r);
|
||||
case "ascii":
|
||||
return x(this, e, r);
|
||||
case "latin1":
|
||||
case "binary":
|
||||
return P(this, e, r);
|
||||
case "base64":
|
||||
return O(this, e, r);
|
||||
case "ucs2":
|
||||
case "ucs-2":
|
||||
case "utf16le":
|
||||
case "utf-16le":
|
||||
return I(this, e, r);
|
||||
default:
|
||||
if (n) throw new TypeError("Unknown encoding: " + t);
|
||||
t = (t + "")
|
||||
.toLowerCase(), n = !0
|
||||
}
|
||||
}
|
||||
function g(t, e, r) {
|
||||
var n = t[e];
|
||||
t[e] = t[r], t[r] = n
|
||||
}
|
||||
function d(t, e, r, n, i) {
|
||||
if (0 === t.length) return -1;
|
||||
if ("string" == typeof r ? (n = r, r = 0) : r > 2147483647 ? r = 2147483647 : r < -2147483648 && (r = -2147483648), F(r = +r) && (r = i ? 0 : t.length - 1), r < 0 && (r = t.length + r), r >= t.length) {
|
||||
if (i) return -1;
|
||||
r = t.length - 1
|
||||
} else if (r < 0) {
|
||||
if (!i) return -1;
|
||||
r = 0
|
||||
}
|
||||
if ("string" == typeof e && (e = a.from(e, n)), a.isBuffer(e)) return 0 === e.length ? -1 : v(t, e, r, n, i);
|
||||
if ("number" == typeof e) return e &= 255, "function" == typeof Uint8Array.prototype.indexOf ? i ? Uint8Array.prototype.indexOf.call(t, e, r) : Uint8Array.prototype.lastIndexOf.call(t, e, r) : v(t, [e], r, n, i);
|
||||
throw new TypeError("val must be string, number or Buffer")
|
||||
}
|
||||
function v(t, e, r, n, i) {
|
||||
var o, s = 1,
|
||||
a = t.length,
|
||||
f = e.length;
|
||||
if (void 0 !== n && ("ucs2" === (n = String(n)
|
||||
.toLowerCase()) || "ucs-2" === n || "utf16le" === n || "utf-16le" === n)) {
|
||||
if (t.length < 2 || e.length < 2) return -1;
|
||||
s = 2, a /= 2, f /= 2, r /= 2
|
||||
}
|
||||
function u(t, e) {
|
||||
return 1 === s ? t[e] : t.readUInt16BE(e * s)
|
||||
}
|
||||
if (i) {
|
||||
var c = -1;
|
||||
for (o = r; o < a; o++) if (u(t, o) === u(e, -1 === c ? 0 : o - c)) {
|
||||
if (-1 === c && (c = o), o - c + 1 === f) return c * s
|
||||
} else -1 !== c && (o -= o - c), c = -1
|
||||
} else for (r + f > a && (r = a - f), o = r; o >= 0; o--) {
|
||||
for (var h = !0, p = 0; p < f; p++) if (u(t, o + p) !== u(e, p)) {
|
||||
h = !1;
|
||||
break
|
||||
}
|
||||
if (h) return o
|
||||
}
|
||||
return -1
|
||||
}
|
||||
function m(t, e, r, n) {
|
||||
r = Number(r) || 0;
|
||||
var i = t.length - r;
|
||||
n ? (n = Number(n)) > i && (n = i) : n = i;
|
||||
var o = e.length;
|
||||
n > o / 2 && (n = o / 2);
|
||||
for (var s = 0; s < n; ++s) {
|
||||
var a = parseInt(e.substr(2 * s, 2), 16);
|
||||
if (F(a)) return s;
|
||||
t[r + s] = a
|
||||
}
|
||||
return s
|
||||
}
|
||||
function S(t, e, r, n) {
|
||||
return j(U(e, t.length - r), t, r, n)
|
||||
}
|
||||
function _(t, e, r, n) {
|
||||
return j(function(t) {
|
||||
for (var e = [], r = 0; r < t.length; ++r) e.push(255 & t.charCodeAt(r));
|
||||
return e
|
||||
}(e), t, r, n)
|
||||
}
|
||||
function b(t, e, r, n) {
|
||||
return _(t, e, r, n)
|
||||
}
|
||||
function E(t, e, r, n) {
|
||||
return j(M(e), t, r, n)
|
||||
}
|
||||
function w(t, e, r, n) {
|
||||
return j(function(t, e) {
|
||||
for (var r, n, i, o = [], s = 0; s < t.length && !((e -= 2) < 0); ++s) n = (r = t.charCodeAt(s)) >> 8, i = r % 256, o.push(i), o.push(n);
|
||||
return o
|
||||
}(e, t.length - r), t, r, n)
|
||||
}
|
||||
function O(t, e, r) {
|
||||
return 0 === e && r === t.length ? n.fromByteArray(t) : n.fromByteArray(t.slice(e, r))
|
||||
}
|
||||
function B(t, e, r) {
|
||||
r = Math.min(t.length, r);
|
||||
for (var n = [], i = e; i < r;) {
|
||||
var o, s, a, f, u = t[i],
|
||||
c = null,
|
||||
h = u > 239 ? 4 : u > 223 ? 3 : u > 191 ? 2 : 1;
|
||||
if (i + h <= r) switch (h) {
|
||||
case 1:
|
||||
u < 128 && (c = u);
|
||||
break;
|
||||
case 2:
|
||||
128 == (192 & (o = t[i + 1])) && (f = (31 & u) << 6 | 63 & o) > 127 && (c = f);
|
||||
break;
|
||||
case 3:
|
||||
o = t[i + 1], s = t[i + 2], 128 == (192 & o) && 128 == (192 & s) && (f = (15 & u) << 12 | (63 & o) << 6 | 63 & s) > 2047 && (f < 55296 || f > 57343) && (c = f);
|
||||
break;
|
||||
case 4:
|
||||
o = t[i + 1], s = t[i + 2], a = t[i + 3], 128 == (192 & o) && 128 == (192 & s) && 128 == (192 & a) && (f = (15 & u) << 18 | (63 & o) << 12 | (63 & s) << 6 | 63 & a) > 65535 && f < 1114112 && (c = f)
|
||||
}
|
||||
null === c ? (c = 65533, h = 1) : c > 65535 && (c -= 65536, n.push(c >>> 10 & 1023 | 55296), c = 56320 | 1023 & c), n.push(c), i += h
|
||||
}
|
||||
return function(t) {
|
||||
var e = t.length;
|
||||
if (e <= A) return String.fromCharCode.apply(String, t);
|
||||
for (var r = "", n = 0; n < e;) r += String.fromCharCode.apply(String, t.slice(n, n += A));
|
||||
return r
|
||||
}(n)
|
||||
}
|
||||
e.kMaxLength = o, a.TYPED_ARRAY_SUPPORT = function() {
|
||||
try {
|
||||
var t = new Uint8Array(1);
|
||||
return t.__proto__ = {
|
||||
__proto__: Uint8Array.prototype,
|
||||
foo: function() {
|
||||
return 42
|
||||
}
|
||||
}, 42 === t.foo()
|
||||
} catch (t) {
|
||||
return !1
|
||||
}
|
||||
}(), a.TYPED_ARRAY_SUPPORT || "undefined" == typeof console || "function" != typeof console.error || console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."), Object.defineProperty(a.prototype, "parent", {
|
||||
enumerable: !0,
|
||||
get: function() {
|
||||
if (a.isBuffer(this)) return this.buffer
|
||||
}
|
||||
}), Object.defineProperty(a.prototype, "offset", {
|
||||
enumerable: !0,
|
||||
get: function() {
|
||||
if (a.isBuffer(this)) return this.byteOffset
|
||||
}
|
||||
}), "undefined" != typeof Symbol && null != Symbol.species && a[Symbol.species] === a && Object.defineProperty(a, Symbol.species, {
|
||||
value: null,
|
||||
configurable: !0,
|
||||
enumerable: !1,
|
||||
writable: !1
|
||||
}), a.poolSize = 8192, a.from = function(t, e, r) {
|
||||
return f(t, e, r)
|
||||
}, a.prototype.__proto__ = Uint8Array.prototype, a.__proto__ = Uint8Array, a.alloc = function(t, e, r) {
|
||||
return function(t, e, r) {
|
||||
return u(t), t <= 0 ? s(t) : void 0 !== e ? "string" == typeof r ? s(t)
|
||||
.fill(e, r) : s(t)
|
||||
.fill(e) : s(t)
|
||||
}(t, e, r)
|
||||
}, a.allocUnsafe = function(t) {
|
||||
return c(t)
|
||||
}, a.allocUnsafeSlow = function(t) {
|
||||
return c(t)
|
||||
}, a.isBuffer = function(t) {
|
||||
return null != t && !0 === t._isBuffer && t !== a.prototype
|
||||
}, a.compare = function(t, e) {
|
||||
if (H(t, Uint8Array) && (t = a.from(t, t.offset, t.byteLength)), H(e, Uint8Array) && (e = a.from(e, e.offset, e.byteLength)), !a.isBuffer(t) || !a.isBuffer(e)) throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');
|
||||
if (t === e) return 0;
|
||||
for (var r = t.length, n = e.length, i = 0, o = Math.min(r, n); i < o; ++i) if (t[i] !== e[i]) {
|
||||
r = t[i], n = e[i];
|
||||
break
|
||||
}
|
||||
return r < n ? -1 : n < r ? 1 : 0
|
||||
}, a.isEncoding = function(t) {
|
||||
switch (String(t)
|
||||
.toLowerCase()) {
|
||||
case "hex":
|
||||
case "utf8":
|
||||
case "utf-8":
|
||||
case "ascii":
|
||||
case "latin1":
|
||||
case "binary":
|
||||
case "base64":
|
||||
case "ucs2":
|
||||
case "ucs-2":
|
||||
case "utf16le":
|
||||
case "utf-16le":
|
||||
return !0;
|
||||
default:
|
||||
return !1
|
||||
}
|
||||
}, a.concat = function(t, e) {
|
||||
if (!Array.isArray(t)) throw new TypeError('"list" argument must be an Array of Buffers');
|
||||
if (0 === t.length) return a.alloc(0);
|
||||
var r;
|
||||
if (void 0 === e) for (e = 0, r = 0; r < t.length; ++r) e += t[r].length;
|
||||
var n = a.allocUnsafe(e),
|
||||
i = 0;
|
||||
for (r = 0; r < t.length; ++r) {
|
||||
var o = t[r];
|
||||
if (H(o, Uint8Array) && (o = a.from(o)), !a.isBuffer(o)) throw new TypeError('"list" argument must be an Array of Buffers');
|
||||
o.copy(n, i), i += o.length
|
||||
}
|
||||
return n
|
||||
}, a.byteLength = l, a.prototype._isBuffer = !0, a.prototype.swap16 = function() {
|
||||
var t = this.length;
|
||||
if (t % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
|
||||
for (var e = 0; e < t; e += 2) g(this, e, e + 1);
|
||||
return this
|
||||
}, a.prototype.swap32 = function() {
|
||||
var t = this.length;
|
||||
if (t % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
|
||||
for (var e = 0; e < t; e += 4) g(this, e, e + 3), g(this, e + 1, e + 2);
|
||||
return this
|
||||
}, a.prototype.swap64 = function() {
|
||||
var t = this.length;
|
||||
if (t % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
|
||||
for (var e = 0; e < t; e += 8) g(this, e, e + 7), g(this, e + 1, e + 6), g(this, e + 2, e + 5), g(this, e + 3, e + 4);
|
||||
return this
|
||||
}, a.prototype.toString = function() {
|
||||
var t = this.length;
|
||||
return 0 === t ? "" : 0 === arguments.length ? B(this, 0, t) : y.apply(this, arguments)
|
||||
}, a.prototype.toLocaleString = a.prototype.toString, a.prototype.equals = function(t) {
|
||||
if (!a.isBuffer(t)) throw new TypeError("Argument must be a Buffer");
|
||||
return this === t || 0 === a.compare(this, t)
|
||||
}, a.prototype.inspect = function() {
|
||||
var t = "",
|
||||
r = e.INSPECT_MAX_BYTES;
|
||||
return t = this.toString("hex", 0, r)
|
||||
.replace(/(.{2})/g, "$1 ")
|
||||
.trim(), this.length > r && (t += " ... "), "<Buffer " + t + ">"
|
||||
}, a.prototype.compare = function(t, e, r, n, i) {
|
||||
if (H(t, Uint8Array) && (t = a.from(t, t.offset, t.byteLength)), !a.isBuffer(t)) throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof t);
|
||||
if (void 0 === e && (e = 0), void 0 === r && (r = t ? t.length : 0), void 0 === n && (n = 0), void 0 === i && (i = this.length), e < 0 || r > t.length || n < 0 || i > this.length) throw new RangeError("out of range index");
|
||||
if (n >= i && e >= r) return 0;
|
||||
if (n >= i) return -1;
|
||||
if (e >= r) return 1;
|
||||
if (this === t) return 0;
|
||||
for (var o = (i >>>= 0) - (n >>>= 0), s = (r >>>= 0) - (e >>>= 0), f = Math.min(o, s), u = this.slice(n, i), c = t.slice(e, r), h = 0; h < f; ++h) if (u[h] !== c[h]) {
|
||||
o = u[h], s = c[h];
|
||||
break
|
||||
}
|
||||
return o < s ? -1 : s < o ? 1 : 0
|
||||
}, a.prototype.includes = function(t, e, r) {
|
||||
return -1 !== this.indexOf(t, e, r)
|
||||
}, a.prototype.indexOf = function(t, e, r) {
|
||||
return d(this, t, e, r, !0)
|
||||
}, a.prototype.lastIndexOf = function(t, e, r) {
|
||||
return d(this, t, e, r, !1)
|
||||
}, a.prototype.write = function(t, e, r, n) {
|
||||
if (void 0 === e) n = "utf8", r = this.length, e = 0;
|
||||
else if (void 0 === r && "string" == typeof e) n = e, r = this.length, e = 0;
|
||||
else {
|
||||
if (!isFinite(e)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
|
||||
e >>>= 0, isFinite(r) ? (r >>>= 0, void 0 === n && (n = "utf8")) : (n = r, r = void 0)
|
||||
}
|
||||
var i = this.length - e;
|
||||
if ((void 0 === r || r > i) && (r = i), t.length > 0 && (r < 0 || e < 0) || e > this.length) throw new RangeError("Attempt to write outside buffer bounds");
|
||||
n || (n = "utf8");
|
||||
for (var o = !1;;) switch (n) {
|
||||
case "hex":
|
||||
return m(this, t, e, r);
|
||||
case "utf8":
|
||||
case "utf-8":
|
||||
return S(this, t, e, r);
|
||||
case "ascii":
|
||||
return _(this, t, e, r);
|
||||
case "latin1":
|
||||
case "binary":
|
||||
return b(this, t, e, r);
|
||||
case "base64":
|
||||
return E(this, t, e, r);
|
||||
case "ucs2":
|
||||
case "ucs-2":
|
||||
case "utf16le":
|
||||
case "utf-16le":
|
||||
return w(this, t, e, r);
|
||||
default:
|
||||
if (o) throw new TypeError("Unknown encoding: " + n);
|
||||
n = ("" + n)
|
||||
.toLowerCase(), o = !0
|
||||
}
|
||||
}, a.prototype.toJSON = function() {
|
||||
return {
|
||||
type: "Buffer",
|
||||
data: Array.prototype.slice.call(this._arr || this, 0)
|
||||
}
|
||||
};
|
||||
var A = 4096;
|
||||
|
||||
function x(t, e, r) {
|
||||
var n = "";
|
||||
r = Math.min(t.length, r);
|
||||
for (var i = e; i < r; ++i) n += String.fromCharCode(127 & t[i]);
|
||||
return n
|
||||
}
|
||||
function P(t, e, r) {
|
||||
var n = "";
|
||||
r = Math.min(t.length, r);
|
||||
for (var i = e; i < r; ++i) n += String.fromCharCode(t[i]);
|
||||
return n
|
||||
}
|
||||
function T(t, e, r) {
|
||||
var n, i = t.length;
|
||||
(!e || e < 0) && (e = 0), (!r || r < 0 || r > i) && (r = i);
|
||||
for (var o = "", s = e; s < r; ++s) o += (n = t[s]) < 16 ? "0" + n.toString(16) : n.toString(16);
|
||||
return o
|
||||
}
|
||||
function I(t, e, r) {
|
||||
for (var n = t.slice(e, r), i = "", o = 0; o < n.length; o += 2) i += String.fromCharCode(n[o] + 256 * n[o + 1]);
|
||||
return i
|
||||
}
|
||||
function k(t, e, r) {
|
||||
if (t % 1 != 0 || t < 0) throw new RangeError("offset is not uint");
|
||||
if (t + e > r) throw new RangeError("Trying to access beyond buffer length")
|
||||
}
|
||||
function D(t, e, r, n, i, o) {
|
||||
if (!a.isBuffer(t)) throw new TypeError('"buffer" argument must be a Buffer instance');
|
||||
if (e > i || e < o) throw new RangeError('"value" argument is out of bounds');
|
||||
if (r + n > t.length) throw new RangeError("Index out of range")
|
||||
}
|
||||
function R(t, e, r, n, i, o) {
|
||||
if (r + n > t.length) throw new RangeError("Index out of range");
|
||||
if (r < 0) throw new RangeError("Index out of range")
|
||||
}
|
||||
function N(t, e, r, n, o) {
|
||||
return e = +e, r >>>= 0, o || R(t, 0, r, 4), i.write(t, e, r, n, 23, 4), r + 4
|
||||
}
|
||||
function L(t, e, r, n, o) {
|
||||
return e = +e, r >>>= 0, o || R(t, 0, r, 8), i.write(t, e, r, n, 52, 8), r + 8
|
||||
}
|
||||
a.prototype.slice = function(t, e) {
|
||||
var r = this.length;
|
||||
(t = ~~t) < 0 ? (t += r) < 0 && (t = 0) : t > r && (t = r), (e = void 0 === e ? r : ~~e) < 0 ? (e += r) < 0 && (e = 0) : e > r && (e = r), e < t && (e = t);
|
||||
var n = this.subarray(t, e);
|
||||
return n.__proto__ = a.prototype, n
|
||||
}, a.prototype.readUIntLE = function(t, e, r) {
|
||||
t >>>= 0, e >>>= 0, r || k(t, e, this.length);
|
||||
for (var n = this[t], i = 1, o = 0; ++o < e && (i *= 256);) n += this[t + o] * i;
|
||||
return n
|
||||
}, a.prototype.readUIntBE = function(t, e, r) {
|
||||
t >>>= 0, e >>>= 0, r || k(t, e, this.length);
|
||||
for (var n = this[t + --e], i = 1; e > 0 && (i *= 256);) n += this[t + --e] * i;
|
||||
return n
|
||||
}, a.prototype.readUInt8 = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 1, this.length), this[t]
|
||||
}, a.prototype.readUInt16LE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 2, this.length), this[t] | this[t + 1] << 8
|
||||
}, a.prototype.readUInt16BE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 2, this.length), this[t] << 8 | this[t + 1]
|
||||
}, a.prototype.readUInt32LE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 4, this.length), (this[t] | this[t + 1] << 8 | this[t + 2] << 16) + 16777216 * this[t + 3]
|
||||
}, a.prototype.readUInt32BE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 4, this.length), 16777216 * this[t] + (this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3])
|
||||
}, a.prototype.readIntLE = function(t, e, r) {
|
||||
t >>>= 0, e >>>= 0, r || k(t, e, this.length);
|
||||
for (var n = this[t], i = 1, o = 0; ++o < e && (i *= 256);) n += this[t + o] * i;
|
||||
return n >= (i *= 128) && (n -= Math.pow(2, 8 * e)), n
|
||||
}, a.prototype.readIntBE = function(t, e, r) {
|
||||
t >>>= 0, e >>>= 0, r || k(t, e, this.length);
|
||||
for (var n = e, i = 1, o = this[t + --n]; n > 0 && (i *= 256);) o += this[t + --n] * i;
|
||||
return o >= (i *= 128) && (o -= Math.pow(2, 8 * e)), o
|
||||
}, a.prototype.readInt8 = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 1, this.length), 128 & this[t] ? -1 * (255 - this[t] + 1) : this[t]
|
||||
}, a.prototype.readInt16LE = function(t, e) {
|
||||
t >>>= 0, e || k(t, 2, this.length);
|
||||
var r = this[t] | this[t + 1] << 8;
|
||||
return 32768 & r ? 4294901760 | r : r
|
||||
}, a.prototype.readInt16BE = function(t, e) {
|
||||
t >>>= 0, e || k(t, 2, this.length);
|
||||
var r = this[t + 1] | this[t] << 8;
|
||||
return 32768 & r ? 4294901760 | r : r
|
||||
}, a.prototype.readInt32LE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 4, this.length), this[t] | this[t + 1] << 8 | this[t + 2] << 16 | this[t + 3] << 24
|
||||
}, a.prototype.readInt32BE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 4, this.length), this[t] << 24 | this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3]
|
||||
}, a.prototype.readFloatLE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 4, this.length), i.read(this, t, !0, 23, 4)
|
||||
}, a.prototype.readFloatBE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 4, this.length), i.read(this, t, !1, 23, 4)
|
||||
}, a.prototype.readDoubleLE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 8, this.length), i.read(this, t, !0, 52, 8)
|
||||
}, a.prototype.readDoubleBE = function(t, e) {
|
||||
return t >>>= 0, e || k(t, 8, this.length), i.read(this, t, !1, 52, 8)
|
||||
}, a.prototype.writeUIntLE = function(t, e, r, n) {
|
||||
t = +t, e >>>= 0, r >>>= 0, n || D(this, t, e, r, Math.pow(2, 8 * r) - 1, 0);
|
||||
var i = 1,
|
||||
o = 0;
|
||||
for (this[e] = 255 & t; ++o < r && (i *= 256);) this[e + o] = t / i & 255;
|
||||
return e + r
|
||||
}, a.prototype.writeUIntBE = function(t, e, r, n) {
|
||||
t = +t, e >>>= 0, r >>>= 0, n || D(this, t, e, r, Math.pow(2, 8 * r) - 1, 0);
|
||||
var i = r - 1,
|
||||
o = 1;
|
||||
for (this[e + i] = 255 & t; --i >= 0 && (o *= 256);) this[e + i] = t / o & 255;
|
||||
return e + r
|
||||
}, a.prototype.writeUInt8 = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 1, 255, 0), this[e] = 255 & t, e + 1
|
||||
}, a.prototype.writeUInt16LE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 2, 65535, 0), this[e] = 255 & t, this[e + 1] = t >>> 8, e + 2
|
||||
}, a.prototype.writeUInt16BE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 2, 65535, 0), this[e] = t >>> 8, this[e + 1] = 255 & t, e + 2
|
||||
}, a.prototype.writeUInt32LE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 4, 4294967295, 0), this[e + 3] = t >>> 24, this[e + 2] = t >>> 16, this[e + 1] = t >>> 8, this[e] = 255 & t, e + 4
|
||||
}, a.prototype.writeUInt32BE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 4, 4294967295, 0), this[e] = t >>> 24, this[e + 1] = t >>> 16, this[e + 2] = t >>> 8, this[e + 3] = 255 & t, e + 4
|
||||
}, a.prototype.writeIntLE = function(t, e, r, n) {
|
||||
if (t = +t, e >>>= 0, !n) {
|
||||
var i = Math.pow(2, 8 * r - 1);
|
||||
D(this, t, e, r, i - 1, -i)
|
||||
}
|
||||
var o = 0,
|
||||
s = 1,
|
||||
a = 0;
|
||||
for (this[e] = 255 & t; ++o < r && (s *= 256);) t < 0 && 0 === a && 0 !== this[e + o - 1] && (a = 1), this[e + o] = (t / s | 0) - a & 255;
|
||||
return e + r
|
||||
}, a.prototype.writeIntBE = function(t, e, r, n) {
|
||||
if (t = +t, e >>>= 0, !n) {
|
||||
var i = Math.pow(2, 8 * r - 1);
|
||||
D(this, t, e, r, i - 1, -i)
|
||||
}
|
||||
var o = r - 1,
|
||||
s = 1,
|
||||
a = 0;
|
||||
for (this[e + o] = 255 & t; --o >= 0 && (s *= 256);) t < 0 && 0 === a && 0 !== this[e + o + 1] && (a = 1), this[e + o] = (t / s | 0) - a & 255;
|
||||
return e + r
|
||||
}, a.prototype.writeInt8 = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 1, 127, -128), t < 0 && (t = 255 + t + 1), this[e] = 255 & t, e + 1
|
||||
}, a.prototype.writeInt16LE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 2, 32767, -32768), this[e] = 255 & t, this[e + 1] = t >>> 8, e + 2
|
||||
}, a.prototype.writeInt16BE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 2, 32767, -32768), this[e] = t >>> 8, this[e + 1] = 255 & t, e + 2
|
||||
}, a.prototype.writeInt32LE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 4, 2147483647, -2147483648), this[e] = 255 & t, this[e + 1] = t >>> 8, this[e + 2] = t >>> 16, this[e + 3] = t >>> 24, e + 4
|
||||
}, a.prototype.writeInt32BE = function(t, e, r) {
|
||||
return t = +t, e >>>= 0, r || D(this, t, e, 4, 2147483647, -2147483648), t < 0 && (t = 4294967295 + t + 1), this[e] = t >>> 24, this[e + 1] = t >>> 16, this[e + 2] = t >>> 8, this[e + 3] = 255 & t, e + 4
|
||||
}, a.prototype.writeFloatLE = function(t, e, r) {
|
||||
return N(this, t, e, !0, r)
|
||||
}, a.prototype.writeFloatBE = function(t, e, r) {
|
||||
return N(this, t, e, !1, r)
|
||||
}, a.prototype.writeDoubleLE = function(t, e, r) {
|
||||
return L(this, t, e, !0, r)
|
||||
}, a.prototype.writeDoubleBE = function(t, e, r) {
|
||||
return L(this, t, e, !1, r)
|
||||
}, a.prototype.copy = function(t, e, r, n) {
|
||||
if (!a.isBuffer(t)) throw new TypeError("argument should be a Buffer");
|
||||
if (r || (r = 0), n || 0 === n || (n = this.length), e >= t.length && (e = t.length), e || (e = 0), n > 0 && n < r && (n = r), n === r) return 0;
|
||||
if (0 === t.length || 0 === this.length) return 0;
|
||||
if (e < 0) throw new RangeError("targetStart out of bounds");
|
||||
if (r < 0 || r >= this.length) throw new RangeError("Index out of range");
|
||||
if (n < 0) throw new RangeError("sourceEnd out of bounds");
|
||||
n > this.length && (n = this.length), t.length - e < n - r && (n = t.length - e + r);
|
||||
var i = n - r;
|
||||
if (this === t && "function" == typeof Uint8Array.prototype.copyWithin) this.copyWithin(e, r, n);
|
||||
else if (this === t && r < e && e < n) for (var o = i - 1; o >= 0; --o) t[o + e] = this[o + r];
|
||||
else Uint8Array.prototype.set.call(t, this.subarray(r, n), e);
|
||||
return i
|
||||
}, a.prototype.fill = function(t, e, r, n) {
|
||||
if ("string" == typeof t) {
|
||||
if ("string" == typeof e ? (n = e, e = 0, r = this.length) : "string" == typeof r && (n = r, r = this.length), void 0 !== n && "string" != typeof n) throw new TypeError("encoding must be a string");
|
||||
if ("string" == typeof n && !a.isEncoding(n)) throw new TypeError("Unknown encoding: " + n);
|
||||
if (1 === t.length) {
|
||||
var i = t.charCodeAt(0);
|
||||
("utf8" === n && i < 128 || "latin1" === n) && (t = i)
|
||||
}
|
||||
} else "number" == typeof t && (t &= 255);
|
||||
if (e < 0 || this.length < e || this.length < r) throw new RangeError("Out of range index");
|
||||
if (r <= e) return this;
|
||||
var o;
|
||||
if (e >>>= 0, r = void 0 === r ? this.length : r >>> 0, t || (t = 0), "number" == typeof t) for (o = e; o < r; ++o) this[o] = t;
|
||||
else {
|
||||
var s = a.isBuffer(t) ? t : a.from(t, n),
|
||||
f = s.length;
|
||||
if (0 === f) throw new TypeError('The value "' + t + '" is invalid for argument "value"');
|
||||
for (o = 0; o < r - e; ++o) this[o + e] = s[o % f]
|
||||
}
|
||||
return this
|
||||
};
|
||||
var C = /[^+/0-9A-Za-z-_]/g;
|
||||
|
||||
function U(t, e) {
|
||||
var r;
|
||||
e = e || 1 / 0;
|
||||
for (var n = t.length, i = null, o = [], s = 0; s < n; ++s) {
|
||||
if ((r = t.charCodeAt(s)) > 55295 && r < 57344) {
|
||||
if (!i) {
|
||||
if (r > 56319) {
|
||||
(e -= 3) > -1 && o.push(239, 191, 189);
|
||||
continue
|
||||
}
|
||||
if (s + 1 === n) {
|
||||
(e -= 3) > -1 && o.push(239, 191, 189);
|
||||
continue
|
||||
}
|
||||
i = r;
|
||||
continue
|
||||
}
|
||||
if (r < 56320) {
|
||||
(e -= 3) > -1 && o.push(239, 191, 189), i = r;
|
||||
continue
|
||||
}
|
||||
r = 65536 + (i - 55296 << 10 | r - 56320)
|
||||
} else i && (e -= 3) > -1 && o.push(239, 191, 189);
|
||||
if (i = null, r < 128) {
|
||||
if ((e -= 1) < 0) break;
|
||||
o.push(r)
|
||||
} else if (r < 2048) {
|
||||
if ((e -= 2) < 0) break;
|
||||
o.push(r >> 6 | 192, 63 & r | 128)
|
||||
} else if (r < 65536) {
|
||||
if ((e -= 3) < 0) break;
|
||||
o.push(r >> 12 | 224, r >> 6 & 63 | 128, 63 & r | 128)
|
||||
} else {
|
||||
if (!(r < 1114112)) throw new Error("Invalid code point");
|
||||
if ((e -= 4) < 0) break;
|
||||
o.push(r >> 18 | 240, r >> 12 & 63 | 128, r >> 6 & 63 | 128, 63 & r | 128)
|
||||
}
|
||||
}
|
||||
return o
|
||||
}
|
||||
function M(t) {
|
||||
return n.toByteArray(function(t) {
|
||||
if ((t = (t = t.split("=")[0])
|
||||
.trim()
|
||||
.replace(C, ""))
|
||||
.length < 2) return "";
|
||||
for (; t.length % 4 != 0;) t += "=";
|
||||
return t
|
||||
}(t))
|
||||
}
|
||||
function j(t, e, r, n) {
|
||||
for (var i = 0; i < n && !(i + r >= e.length || i >= t.length); ++i) e[i + r] = t[i];
|
||||
return i
|
||||
}
|
||||
function H(t, e) {
|
||||
return t instanceof e || null != t && null != t.constructor && null != t.constructor.name && t.constructor.name === e.name
|
||||
}
|
||||
function F(t) {
|
||||
return t != t
|
||||
}
|
||||
},
|
||||
8075: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(453),
|
||||
i = r(487),
|
||||
o = i(n("String.prototype.indexOf"));
|
||||
t.exports = function(t, e) {
|
||||
var r = n(t, !! e);
|
||||
return "function" == typeof r && o(t, ".prototype.") > -1 ? i(r) : r
|
||||
}
|
||||
},
|
||||
487: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(6743),
|
||||
i = r(453),
|
||||
o = r(6897),
|
||||
s = r(9675),
|
||||
a = i("%Function.prototype.apply%"),
|
||||
f = i("%Function.prototype.call%"),
|
||||
u = i("%Reflect.apply%", !0) || n.call(f, a),
|
||||
c = r(655),
|
||||
h = i("%Math.max%");
|
||||
t.exports = function(t) {
|
||||
if ("function" != typeof t) throw new s("a function is required");
|
||||
var e = u(n, f, arguments);
|
||||
return o(e, 1 + h(0, t.length - (arguments.length - 1)), !0)
|
||||
};
|
||||
var p = function() {
|
||||
return u(n, a, arguments)
|
||||
};
|
||||
c ? c(t.exports, "apply", {
|
||||
value: p
|
||||
}) : t.exports.apply = p
|
||||
},
|
||||
955: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(754), r(4636), r(9506), r(7165), function() {
|
||||
var t = n,
|
||||
e = t.lib.BlockCipher,
|
||||
r = t.algo,
|
||||
i = [],
|
||||
o = [],
|
||||
s = [],
|
||||
a = [],
|
||||
f = [],
|
||||
u = [],
|
||||
c = [],
|
||||
h = [],
|
||||
p = [],
|
||||
l = [];
|
||||
! function() {
|
||||
for (var t = [], e = 0; e < 256; e++) t[e] = e < 128 ? e << 1 : e << 1 ^ 283;
|
||||
var r = 0,
|
||||
n = 0;
|
||||
for (e = 0; e < 256; e++) {
|
||||
var y = n ^ n << 1 ^ n << 2 ^ n << 3 ^ n << 4;
|
||||
y = y >>> 8 ^ 255 & y ^ 99, i[r] = y, o[y] = r;
|
||||
var g = t[r],
|
||||
d = t[g],
|
||||
v = t[d],
|
||||
m = 257 * t[y] ^ 16843008 * y;
|
||||
s[r] = m << 24 | m >>> 8, a[r] = m << 16 | m >>> 16, f[r] = m << 8 | m >>> 24, u[r] = m, m = 16843009 * v ^ 65537 * d ^ 257 * g ^ 16843008 * r, c[y] = m << 24 | m >>> 8, h[y] = m << 16 | m >>> 16, p[y] = m << 8 | m >>> 24, l[y] = m, r ? (r = g ^ t[t[t[v ^ g]]], n ^= t[t[n]]) : r = n = 1
|
||||
}
|
||||
}();
|
||||
var y = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
|
||||
g = r.AES = e.extend({
|
||||
_doReset: function() {
|
||||
if (!this._nRounds || this._keyPriorReset !== this._key) {
|
||||
for (var t = this._keyPriorReset = this._key, e = t.words, r = t.sigBytes / 4, n = 4 * ((this._nRounds = r + 6) + 1), o = this._keySchedule = [], s = 0; s < n; s++) if (s < r) o[s] = e[s];
|
||||
else {
|
||||
var a = o[s - 1];
|
||||
s % r ? r > 6 && s % r == 4 && (a = i[a >>> 24] << 24 | i[a >>> 16 & 255] << 16 | i[a >>> 8 & 255] << 8 | i[255 & a]) : (a = i[(a = a << 8 | a >>> 24) >>> 24] << 24 | i[a >>> 16 & 255] << 16 | i[a >>> 8 & 255] << 8 | i[255 & a], a ^= y[s / r | 0] << 24), o[s] = o[s - r] ^ a
|
||||
}
|
||||
for (var f = this._invKeySchedule = [], u = 0; u < n; u++) s = n - u, a = u % 4 ? o[s] : o[s - 4], f[u] = u < 4 || s <= 4 ? a : c[i[a >>> 24]] ^ h[i[a >>> 16 & 255]] ^ p[i[a >>> 8 & 255]] ^ l[i[255 & a]]
|
||||
}
|
||||
},
|
||||
encryptBlock: function(t, e) {
|
||||
this._doCryptBlock(t, e, this._keySchedule, s, a, f, u, i)
|
||||
},
|
||||
decryptBlock: function(t, e) {
|
||||
var r = t[e + 1];
|
||||
t[e + 1] = t[e + 3], t[e + 3] = r, this._doCryptBlock(t, e, this._invKeySchedule, c, h, p, l, o), r = t[e + 1], t[e + 1] = t[e + 3], t[e + 3] = r
|
||||
},
|
||||
_doCryptBlock: function(t, e, r, n, i, o, s, a) {
|
||||
for (var f = this._nRounds, u = t[e] ^ r[0], c = t[e + 1] ^ r[1], h = t[e + 2] ^ r[2], p = t[e + 3] ^ r[3], l = 4, y = 1; y < f; y++) {
|
||||
var g = n[u >>> 24] ^ i[c >>> 16 & 255] ^ o[h >>> 8 & 255] ^ s[255 & p] ^ r[l++],
|
||||
d = n[c >>> 24] ^ i[h >>> 16 & 255] ^ o[p >>> 8 & 255] ^ s[255 & u] ^ r[l++],
|
||||
v = n[h >>> 24] ^ i[p >>> 16 & 255] ^ o[u >>> 8 & 255] ^ s[255 & c] ^ r[l++],
|
||||
m = n[p >>> 24] ^ i[u >>> 16 & 255] ^ o[c >>> 8 & 255] ^ s[255 & h] ^ r[l++];
|
||||
u = g, c = d, h = v, p = m
|
||||
}
|
||||
g = (a[u >>> 24] << 24 | a[c >>> 16 & 255] << 16 | a[h >>> 8 & 255] << 8 | a[255 & p]) ^ r[l++], d = (a[c >>> 24] << 24 | a[h >>> 16 & 255] << 16 | a[p >>> 8 & 255] << 8 | a[255 & u]) ^ r[l++], v = (a[h >>> 24] << 24 | a[p >>> 16 & 255] << 16 | a[u >>> 8 & 255] << 8 | a[255 & c]) ^ r[l++], m = (a[p >>> 24] << 24 | a[u >>> 16 & 255] << 16 | a[c >>> 8 & 255] << 8 | a[255 & h]) ^ r[l++], t[e] = g, t[e + 1] = d, t[e + 2] = v, t[e + 3] = m
|
||||
},
|
||||
keySize: 8
|
||||
});
|
||||
t.AES = e._createHelper(g)
|
||||
}(), n.AES)
|
||||
},
|
||||
7165: function(t, e, r) {
|
||||
var n, i, o, s, a, f, u, c, h, p, l, y, g, d, v, m, S, _, b;
|
||||
t.exports = (n = r(9021), r(9506), void(n.lib.Cipher || (i = n, o = i.lib, s = o.Base, a = o.WordArray, f = o.BufferedBlockAlgorithm, u = i.enc, u.Utf8, c = u.Base64, h = i.algo.EvpKDF, p = o.Cipher = f.extend({
|
||||
cfg: s.extend(),
|
||||
createEncryptor: function(t, e) {
|
||||
return this.create(this._ENC_XFORM_MODE, t, e)
|
||||
},
|
||||
createDecryptor: function(t, e) {
|
||||
return this.create(this._DEC_XFORM_MODE, t, e)
|
||||
},
|
||||
init: function(t, e, r) {
|
||||
this.cfg = this.cfg.extend(r), this._xformMode = t, this._key = e, this.reset()
|
||||
},
|
||||
reset: function() {
|
||||
f.reset.call(this), this._doReset()
|
||||
},
|
||||
process: function(t) {
|
||||
return this._append(t), this._process()
|
||||
},
|
||||
finalize: function(t) {
|
||||
return t && this._append(t), this._doFinalize()
|
||||
},
|
||||
keySize: 4,
|
||||
ivSize: 4,
|
||||
_ENC_XFORM_MODE: 1,
|
||||
_DEC_XFORM_MODE: 2,
|
||||
_createHelper: function() {
|
||||
function t(t) {
|
||||
return "string" == typeof t ? b : S
|
||||
}
|
||||
return function(e) {
|
||||
return {
|
||||
encrypt: function(r, n, i) {
|
||||
return t(n)
|
||||
.encrypt(e, r, n, i)
|
||||
},
|
||||
decrypt: function(r, n, i) {
|
||||
return t(n)
|
||||
.decrypt(e, r, n, i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
}), o.StreamCipher = p.extend({
|
||||
_doFinalize: function() {
|
||||
return this._process(!0)
|
||||
},
|
||||
blockSize: 1
|
||||
}), l = i.mode = {}, y = o.BlockCipherMode = s.extend({
|
||||
createEncryptor: function(t, e) {
|
||||
return this.Encryptor.create(t, e)
|
||||
},
|
||||
createDecryptor: function(t, e) {
|
||||
return this.Decryptor.create(t, e)
|
||||
},
|
||||
init: function(t, e) {
|
||||
this._cipher = t, this._iv = e
|
||||
}
|
||||
}), g = l.CBC = function() {
|
||||
var t = y.extend();
|
||||
|
||||
function e(t, e, r) {
|
||||
var n = this._iv;
|
||||
if (n) {
|
||||
var i = n;
|
||||
this._iv = void 0
|
||||
} else i = this._prevBlock;
|
||||
for (var o = 0; o < r; o++) t[e + o] ^= i[o]
|
||||
}
|
||||
return t.Encryptor = t.extend({
|
||||
processBlock: function(t, r) {
|
||||
var n = this._cipher,
|
||||
i = n.blockSize;
|
||||
e.call(this, t, r, i), n.encryptBlock(t, r), this._prevBlock = t.slice(r, r + i)
|
||||
}
|
||||
}), t.Decryptor = t.extend({
|
||||
processBlock: function(t, r) {
|
||||
var n = this._cipher,
|
||||
i = n.blockSize,
|
||||
o = t.slice(r, r + i);
|
||||
n.decryptBlock(t, r), e.call(this, t, r, i), this._prevBlock = o
|
||||
}
|
||||
}), t
|
||||
}(), d = (i.pad = {})
|
||||
.Pkcs7 = {
|
||||
pad: function(t, e) {
|
||||
for (var r = 4 * e, n = r - t.sigBytes % r, i = n << 24 | n << 16 | n << 8 | n, o = [], s = 0; s < n; s += 4) o.push(i);
|
||||
var f = a.create(o, n);
|
||||
t.concat(f)
|
||||
},
|
||||
unpad: function(t) {
|
||||
var e = 255 & t.words[t.sigBytes - 1 >>> 2];
|
||||
t.sigBytes -= e
|
||||
}
|
||||
}, o.BlockCipher = p.extend({
|
||||
cfg: p.cfg.extend({
|
||||
mode: g,
|
||||
padding: d
|
||||
}),
|
||||
reset: function() {
|
||||
p.reset.call(this);
|
||||
var t = this.cfg,
|
||||
e = t.iv,
|
||||
r = t.mode;
|
||||
if (this._xformMode == this._ENC_XFORM_MODE) var n = r.createEncryptor;
|
||||
else n = r.createDecryptor, this._minBufferSize = 1;
|
||||
this._mode && this._mode.__creator == n ? this._mode.init(this, e && e.words) : (this._mode = n.call(r, this, e && e.words), this._mode.__creator = n)
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
this._mode.processBlock(t, e)
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var t = this.cfg.padding;
|
||||
if (this._xformMode == this._ENC_XFORM_MODE) {
|
||||
t.pad(this._data, this.blockSize);
|
||||
var e = this._process(!0)
|
||||
} else e = this._process(!0), t.unpad(e);
|
||||
return e
|
||||
},
|
||||
blockSize: 4
|
||||
}), v = o.CipherParams = s.extend({
|
||||
init: function(t) {
|
||||
this.mixIn(t)
|
||||
},
|
||||
toString: function(t) {
|
||||
return (t || this.formatter)
|
||||
.stringify(this)
|
||||
}
|
||||
}), m = (i.format = {})
|
||||
.OpenSSL = {
|
||||
stringify: function(t) {
|
||||
var e = t.ciphertext,
|
||||
r = t.salt;
|
||||
if (r) var n = a.create([1398893684, 1701076831])
|
||||
.concat(r)
|
||||
.concat(e);
|
||||
else n = e;
|
||||
return n.toString(c)
|
||||
},
|
||||
parse: function(t) {
|
||||
var e = c.parse(t),
|
||||
r = e.words;
|
||||
if (1398893684 == r[0] && 1701076831 == r[1]) {
|
||||
var n = a.create(r.slice(2, 4));
|
||||
r.splice(0, 4), e.sigBytes -= 16
|
||||
}
|
||||
return v.create({
|
||||
ciphertext: e,
|
||||
salt: n
|
||||
})
|
||||
}
|
||||
}, S = o.SerializableCipher = s.extend({
|
||||
cfg: s.extend({
|
||||
format: m
|
||||
}),
|
||||
encrypt: function(t, e, r, n) {
|
||||
n = this.cfg.extend(n);
|
||||
var i = t.createEncryptor(r, n),
|
||||
o = i.finalize(e),
|
||||
s = i.cfg;
|
||||
return v.create({
|
||||
ciphertext: o,
|
||||
key: r,
|
||||
iv: s.iv,
|
||||
algorithm: t,
|
||||
mode: s.mode,
|
||||
padding: s.padding,
|
||||
blockSize: t.blockSize,
|
||||
formatter: n.format
|
||||
})
|
||||
},
|
||||
decrypt: function(t, e, r, n) {
|
||||
return n = this.cfg.extend(n), e = this._parse(e, n.format), t.createDecryptor(r, n)
|
||||
.finalize(e.ciphertext)
|
||||
},
|
||||
_parse: function(t, e) {
|
||||
return "string" == typeof t ? e.parse(t, this) : t
|
||||
}
|
||||
}), _ = (i.kdf = {})
|
||||
.OpenSSL = {
|
||||
execute: function(t, e, r, n) {
|
||||
n || (n = a.random(8));
|
||||
var i = h.create({
|
||||
keySize: e + r
|
||||
})
|
||||
.compute(t, n),
|
||||
o = a.create(i.words.slice(e), 4 * r);
|
||||
return i.sigBytes = 4 * e, v.create({
|
||||
key: i,
|
||||
iv: o,
|
||||
salt: n
|
||||
})
|
||||
}
|
||||
}, b = o.PasswordBasedCipher = S.extend({
|
||||
cfg: S.cfg.extend({
|
||||
kdf: _
|
||||
}),
|
||||
encrypt: function(t, e, r, n) {
|
||||
var i = (n = this.cfg.extend(n))
|
||||
.kdf.execute(r, t.keySize, t.ivSize);
|
||||
n.iv = i.iv;
|
||||
var o = S.encrypt.call(this, t, e, i.key, n);
|
||||
return o.mixIn(i), o
|
||||
},
|
||||
decrypt: function(t, e, r, n) {
|
||||
n = this.cfg.extend(n), e = this._parse(e, n.format);
|
||||
var i = n.kdf.execute(r, t.keySize, t.ivSize, e.salt);
|
||||
return n.iv = i.iv, S.decrypt.call(this, t, e, i.key, n)
|
||||
}
|
||||
}))))
|
||||
},
|
||||
9021: function(t, e) {
|
||||
var r;
|
||||
t.exports = (r = r || function(t, e) {
|
||||
var r = Object.create || function() {
|
||||
function t() {}
|
||||
return function(e) {
|
||||
var r;
|
||||
return t.prototype = e, r = new t, t.prototype = null, r
|
||||
}
|
||||
}(),
|
||||
n = {}, i = n.lib = {}, o = i.Base = {
|
||||
extend: function(t) {
|
||||
var e = r(this);
|
||||
return t && e.mixIn(t), e.hasOwnProperty("init") && this.init !== e.init || (e.init = function() {
|
||||
e.$super.init.apply(this, arguments)
|
||||
}), e.init.prototype = e, e.$super = this, e
|
||||
},
|
||||
create: function() {
|
||||
var t = this.extend();
|
||||
return t.init.apply(t, arguments), t
|
||||
},
|
||||
init: function() {},
|
||||
mixIn: function(t) {
|
||||
for (var e in t) t.hasOwnProperty(e) && (this[e] = t[e]);
|
||||
t.hasOwnProperty("toString") && (this.toString = t.toString)
|
||||
},
|
||||
clone: function() {
|
||||
return this.init.prototype.extend(this)
|
||||
}
|
||||
}, s = i.WordArray = o.extend({
|
||||
init: function(t, e) {
|
||||
t = this.words = t || [], this.sigBytes = null != e ? e : 4 * t.length
|
||||
},
|
||||
toString: function(t) {
|
||||
return (t || f)
|
||||
.stringify(this)
|
||||
},
|
||||
concat: function(t) {
|
||||
var e = this.words,
|
||||
r = t.words,
|
||||
n = this.sigBytes,
|
||||
i = t.sigBytes;
|
||||
if (this.clamp(), n % 4) for (var o = 0; o < i; o++) {
|
||||
var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255;
|
||||
e[n + o >>> 2] |= s << 24 - (n + o) % 4 * 8
|
||||
} else for (o = 0; o < i; o += 4) e[n + o >>> 2] = r[o >>> 2];
|
||||
return this.sigBytes += i, this
|
||||
},
|
||||
clamp: function() {
|
||||
var e = this.words,
|
||||
r = this.sigBytes;
|
||||
e[r >>> 2] &= 4294967295 << 32 - r % 4 * 8, e.length = t.ceil(r / 4)
|
||||
},
|
||||
clone: function() {
|
||||
var t = o.clone.call(this);
|
||||
return t.words = this.words.slice(0), t
|
||||
},
|
||||
random: function(e) {
|
||||
for (var r, n = [], i = function(e) {
|
||||
var r = 987654321,
|
||||
n = 4294967295;
|
||||
return function() {
|
||||
var i = ((r = 36969 * (65535 & r) + (r >> 16) & n) << 16) + (e = 18e3 * (65535 & e) + (e >> 16) & n) & n;
|
||||
return i /= 4294967296, (i += .5) * (t.random() > .5 ? 1 : -1)
|
||||
}
|
||||
}, o = 0; o < e; o += 4) {
|
||||
var a = i(4294967296 * (r || t.random()));
|
||||
r = 987654071 * a(), n.push(4294967296 * a() | 0)
|
||||
}
|
||||
return new s.init(n, e)
|
||||
}
|
||||
}),
|
||||
a = n.enc = {}, f = a.Hex = {
|
||||
stringify: function(t) {
|
||||
for (var e = t.words, r = t.sigBytes, n = [], i = 0; i < r; i++) {
|
||||
var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255;
|
||||
n.push((o >>> 4)
|
||||
.toString(16)), n.push((15 & o)
|
||||
.toString(16))
|
||||
}
|
||||
return n.join("")
|
||||
},
|
||||
parse: function(t) {
|
||||
for (var e = t.length, r = [], n = 0; n < e; n += 2) r[n >>> 3] |= parseInt(t.substr(n, 2), 16) << 24 - n % 8 * 4;
|
||||
return new s.init(r, e / 2)
|
||||
}
|
||||
}, u = a.Latin1 = {
|
||||
stringify: function(t) {
|
||||
for (var e = t.words, r = t.sigBytes, n = [], i = 0; i < r; i++) {
|
||||
var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255;
|
||||
n.push(String.fromCharCode(o))
|
||||
}
|
||||
return n.join("")
|
||||
},
|
||||
parse: function(t) {
|
||||
for (var e = t.length, r = [], n = 0; n < e; n++) r[n >>> 2] |= (255 & t.charCodeAt(n)) << 24 - n % 4 * 8;
|
||||
return new s.init(r, e)
|
||||
}
|
||||
}, c = a.Utf8 = {
|
||||
stringify: function(t) {
|
||||
try {
|
||||
return decodeURIComponent(escape(u.stringify(t)))
|
||||
} catch (t) {
|
||||
throw new Error("Malformed UTF-8 data")
|
||||
}
|
||||
},
|
||||
parse: function(t) {
|
||||
return u.parse(unescape(encodeURIComponent(t)))
|
||||
}
|
||||
}, h = i.BufferedBlockAlgorithm = o.extend({
|
||||
reset: function() {
|
||||
this._data = new s.init, this._nDataBytes = 0
|
||||
},
|
||||
_append: function(t) {
|
||||
"string" == typeof t && (t = c.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes
|
||||
},
|
||||
_process: function(e) {
|
||||
var r = this._data,
|
||||
n = r.words,
|
||||
i = r.sigBytes,
|
||||
o = this.blockSize,
|
||||
a = i / (4 * o),
|
||||
f = (a = e ? t.ceil(a) : t.max((0 | a) - this._minBufferSize, 0)) * o,
|
||||
u = t.min(4 * f, i);
|
||||
if (f) {
|
||||
for (var c = 0; c < f; c += o) this._doProcessBlock(n, c);
|
||||
var h = n.splice(0, f);
|
||||
r.sigBytes -= u
|
||||
}
|
||||
return new s.init(h, u)
|
||||
},
|
||||
clone: function() {
|
||||
var t = o.clone.call(this);
|
||||
return t._data = this._data.clone(), t
|
||||
},
|
||||
_minBufferSize: 0
|
||||
}),
|
||||
p = (i.Hasher = h.extend({
|
||||
cfg: o.extend(),
|
||||
init: function(t) {
|
||||
this.cfg = this.cfg.extend(t), this.reset()
|
||||
},
|
||||
reset: function() {
|
||||
h.reset.call(this), this._doReset()
|
||||
},
|
||||
update: function(t) {
|
||||
return this._append(t), this._process(), this
|
||||
},
|
||||
finalize: function(t) {
|
||||
return t && this._append(t), this._doFinalize()
|
||||
},
|
||||
blockSize: 16,
|
||||
_createHelper: function(t) {
|
||||
return function(e, r) {
|
||||
return new t.init(r)
|
||||
.finalize(e)
|
||||
}
|
||||
},
|
||||
_createHmacHelper: function(t) {
|
||||
return function(e, r) {
|
||||
return new p.HMAC.init(t, r)
|
||||
.finalize(e)
|
||||
}
|
||||
}
|
||||
}), n.algo = {});
|
||||
return n
|
||||
}(Math), r)
|
||||
},
|
||||
754: function(t, e, r) {
|
||||
var n, i, o;
|
||||
t.exports = (n = r(9021), o = (i = n)
|
||||
.lib.WordArray, i.enc.Base64 = {
|
||||
stringify: function(t) {
|
||||
var e = t.words,
|
||||
r = t.sigBytes,
|
||||
n = this._map;
|
||||
t.clamp();
|
||||
for (var i = [], o = 0; o < r; o += 3) for (var s = (e[o >>> 2] >>> 24 - o % 4 * 8 & 255) << 16 | (e[o + 1 >>> 2] >>> 24 - (o + 1) % 4 * 8 & 255) << 8 | e[o + 2 >>> 2] >>> 24 - (o + 2) % 4 * 8 & 255, a = 0; a < 4 && o + .75 * a < r; a++) i.push(n.charAt(s >>> 6 * (3 - a) & 63));
|
||||
var f = n.charAt(64);
|
||||
if (f) for (; i.length % 4;) i.push(f);
|
||||
return i.join("")
|
||||
},
|
||||
parse: function(t) {
|
||||
var e = t.length,
|
||||
r = this._map,
|
||||
n = this._reverseMap;
|
||||
if (!n) {
|
||||
n = this._reverseMap = [];
|
||||
for (var i = 0; i < r.length; i++) n[r.charCodeAt(i)] = i
|
||||
}
|
||||
var s = r.charAt(64);
|
||||
if (s) {
|
||||
var a = t.indexOf(s); - 1 !== a && (e = a)
|
||||
}
|
||||
return function(t, e, r) {
|
||||
for (var n = [], i = 0, s = 0; s < e; s++) if (s % 4) {
|
||||
var a = r[t.charCodeAt(s - 1)] << s % 4 * 2,
|
||||
f = r[t.charCodeAt(s)] >>> 6 - s % 4 * 2;
|
||||
n[i >>> 2] |= (a | f) << 24 - i % 4 * 8, i++
|
||||
}
|
||||
return o.create(n, i)
|
||||
}(t, e, n)
|
||||
},
|
||||
_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
||||
}, n.enc.Base64)
|
||||
},
|
||||
5503: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), function() {
|
||||
var t = n,
|
||||
e = t.lib.WordArray,
|
||||
r = t.enc;
|
||||
|
||||
function i(t) {
|
||||
return t << 8 & 4278255360 | t >>> 8 & 16711935
|
||||
}
|
||||
r.Utf16 = r.Utf16BE = {
|
||||
stringify: function(t) {
|
||||
for (var e = t.words, r = t.sigBytes, n = [], i = 0; i < r; i += 2) {
|
||||
var o = e[i >>> 2] >>> 16 - i % 4 * 8 & 65535;
|
||||
n.push(String.fromCharCode(o))
|
||||
}
|
||||
return n.join("")
|
||||
},
|
||||
parse: function(t) {
|
||||
for (var r = t.length, n = [], i = 0; i < r; i++) n[i >>> 1] |= t.charCodeAt(i) << 16 - i % 2 * 16;
|
||||
return e.create(n, 2 * r)
|
||||
}
|
||||
}, r.Utf16LE = {
|
||||
stringify: function(t) {
|
||||
for (var e = t.words, r = t.sigBytes, n = [], o = 0; o < r; o += 2) {
|
||||
var s = i(e[o >>> 2] >>> 16 - o % 4 * 8 & 65535);
|
||||
n.push(String.fromCharCode(s))
|
||||
}
|
||||
return n.join("")
|
||||
},
|
||||
parse: function(t) {
|
||||
for (var r = t.length, n = [], o = 0; o < r; o++) n[o >>> 1] |= i(t.charCodeAt(o) << 16 - o % 2 * 16);
|
||||
return e.create(n, 2 * r)
|
||||
}
|
||||
}
|
||||
}(), n.enc.Utf16)
|
||||
},
|
||||
9506: function(t, e, r) {
|
||||
var n, i, o, s, a, f, u, c;
|
||||
t.exports = (c = r(9021), r(5471), r(1025), o = (i = (n = c)
|
||||
.lib)
|
||||
.Base, s = i.WordArray, f = (a = n.algo)
|
||||
.MD5, u = a.EvpKDF = o.extend({
|
||||
cfg: o.extend({
|
||||
keySize: 4,
|
||||
hasher: f,
|
||||
iterations: 1
|
||||
}),
|
||||
init: function(t) {
|
||||
this.cfg = this.cfg.extend(t)
|
||||
},
|
||||
compute: function(t, e) {
|
||||
for (var r = this.cfg, n = r.hasher.create(), i = s.create(), o = i.words, a = r.keySize, f = r.iterations; o.length < a;) {
|
||||
u && n.update(u);
|
||||
var u = n.update(t)
|
||||
.finalize(e);
|
||||
n.reset();
|
||||
for (var c = 1; c < f; c++) u = n.finalize(u), n.reset();
|
||||
i.concat(u)
|
||||
}
|
||||
return i.sigBytes = 4 * a, i
|
||||
}
|
||||
}), n.EvpKDF = function(t, e, r) {
|
||||
return u.create(r)
|
||||
.compute(t, e)
|
||||
}, c.EvpKDF)
|
||||
},
|
||||
25: function(t, e, r) {
|
||||
var n, i, o, s;
|
||||
t.exports = (s = r(9021), r(7165), i = (n = s)
|
||||
.lib.CipherParams, o = n.enc.Hex, n.format.Hex = {
|
||||
stringify: function(t) {
|
||||
return t.ciphertext.toString(o)
|
||||
},
|
||||
parse: function(t) {
|
||||
var e = o.parse(t);
|
||||
return i.create({
|
||||
ciphertext: e
|
||||
})
|
||||
}
|
||||
}, s.format.Hex)
|
||||
},
|
||||
1025: function(t, e, r) {
|
||||
var n, i, o;
|
||||
t.exports = (i = (n = r(9021))
|
||||
.lib.Base, o = n.enc.Utf8, void(n.algo.HMAC = i.extend({
|
||||
init: function(t, e) {
|
||||
t = this._hasher = new t.init, "string" == typeof e && (e = o.parse(e));
|
||||
var r = t.blockSize,
|
||||
n = 4 * r;
|
||||
e.sigBytes > n && (e = t.finalize(e)), e.clamp();
|
||||
for (var i = this._oKey = e.clone(), s = this._iKey = e.clone(), a = i.words, f = s.words, u = 0; u < r; u++) a[u] ^= 1549556828, f[u] ^= 909522486;
|
||||
i.sigBytes = s.sigBytes = n, this.reset()
|
||||
},
|
||||
reset: function() {
|
||||
var t = this._hasher;
|
||||
t.reset(), t.update(this._iKey)
|
||||
},
|
||||
update: function(t) {
|
||||
return this._hasher.update(t), this
|
||||
},
|
||||
finalize: function(t) {
|
||||
var e = this._hasher,
|
||||
r = e.finalize(t);
|
||||
return e.reset(), e.finalize(this._oKey.clone()
|
||||
.concat(r))
|
||||
}
|
||||
})))
|
||||
},
|
||||
1396: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(3240), r(6440), r(5503), r(754), r(4636), r(5471), r(3009), r(6308), r(1380), r(9557), r(5953), r(8056), r(1025), r(19), r(9506), r(7165), r(2169), r(6939), r(6372), r(3797), r(8454), r(2073), r(4905), r(482), r(2155), r(8124), r(25), r(955), r(7628), r(7193), r(6298), r(2696), n)
|
||||
},
|
||||
6440: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), function() {
|
||||
if ("function" == typeof ArrayBuffer) {
|
||||
var t = n.lib.WordArray,
|
||||
e = t.init,
|
||||
r = t.init = function(t) {
|
||||
if (t instanceof ArrayBuffer && (t = new Uint8Array(t)), (t instanceof Int8Array || "undefined" != typeof Uint8ClampedArray && t instanceof Uint8ClampedArray || t instanceof Int16Array || t instanceof Uint16Array || t instanceof Int32Array || t instanceof Uint32Array || t instanceof Float32Array || t instanceof Float64Array) && (t = new Uint8Array(t.buffer, t.byteOffset, t.byteLength)), t instanceof Uint8Array) {
|
||||
for (var r = t.byteLength, n = [], i = 0; i < r; i++) n[i >>> 2] |= t[i] << 24 - i % 4 * 8;
|
||||
e.call(this, n, r)
|
||||
} else e.apply(this, arguments)
|
||||
};
|
||||
r.prototype = t
|
||||
}
|
||||
}(), n.lib.WordArray)
|
||||
},
|
||||
4636: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), function(t) {
|
||||
var e = n,
|
||||
r = e.lib,
|
||||
i = r.WordArray,
|
||||
o = r.Hasher,
|
||||
s = e.algo,
|
||||
a = [];
|
||||
! function() {
|
||||
for (var e = 0; e < 64; e++) a[e] = 4294967296 * t.abs(t.sin(e + 1)) | 0
|
||||
}();
|
||||
var f = s.MD5 = o.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new i.init([1732584193, 4023233417, 2562383102, 271733878])
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
for (var r = 0; r < 16; r++) {
|
||||
var n = e + r,
|
||||
i = t[n];
|
||||
t[n] = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8)
|
||||
}
|
||||
var o = this._hash.words,
|
||||
s = t[e + 0],
|
||||
f = t[e + 1],
|
||||
l = t[e + 2],
|
||||
y = t[e + 3],
|
||||
g = t[e + 4],
|
||||
d = t[e + 5],
|
||||
v = t[e + 6],
|
||||
m = t[e + 7],
|
||||
S = t[e + 8],
|
||||
_ = t[e + 9],
|
||||
b = t[e + 10],
|
||||
E = t[e + 11],
|
||||
w = t[e + 12],
|
||||
O = t[e + 13],
|
||||
B = t[e + 14],
|
||||
A = t[e + 15],
|
||||
x = o[0],
|
||||
P = o[1],
|
||||
T = o[2],
|
||||
I = o[3];
|
||||
x = u(x, P, T, I, s, 7, a[0]), I = u(I, x, P, T, f, 12, a[1]), T = u(T, I, x, P, l, 17, a[2]), P = u(P, T, I, x, y, 22, a[3]), x = u(x, P, T, I, g, 7, a[4]), I = u(I, x, P, T, d, 12, a[5]), T = u(T, I, x, P, v, 17, a[6]), P = u(P, T, I, x, m, 22, a[7]), x = u(x, P, T, I, S, 7, a[8]), I = u(I, x, P, T, _, 12, a[9]), T = u(T, I, x, P, b, 17, a[10]), P = u(P, T, I, x, E, 22, a[11]), x = u(x, P, T, I, w, 7, a[12]), I = u(I, x, P, T, O, 12, a[13]), T = u(T, I, x, P, B, 17, a[14]), x = c(x, P = u(P, T, I, x, A, 22, a[15]), T, I, f, 5, a[16]), I = c(I, x, P, T, v, 9, a[17]), T = c(T, I, x, P, E, 14, a[18]), P = c(P, T, I, x, s, 20, a[19]), x = c(x, P, T, I, d, 5, a[20]), I = c(I, x, P, T, b, 9, a[21]), T = c(T, I, x, P, A, 14, a[22]), P = c(P, T, I, x, g, 20, a[23]), x = c(x, P, T, I, _, 5, a[24]), I = c(I, x, P, T, B, 9, a[25]), T = c(T, I, x, P, y, 14, a[26]), P = c(P, T, I, x, S, 20, a[27]), x = c(x, P, T, I, O, 5, a[28]), I = c(I, x, P, T, l, 9, a[29]), T = c(T, I, x, P, m, 14, a[30]), x = h(x, P = c(P, T, I, x, w, 20, a[31]), T, I, d, 4, a[32]), I = h(I, x, P, T, S, 11, a[33]), T = h(T, I, x, P, E, 16, a[34]), P = h(P, T, I, x, B, 23, a[35]), x = h(x, P, T, I, f, 4, a[36]), I = h(I, x, P, T, g, 11, a[37]), T = h(T, I, x, P, m, 16, a[38]), P = h(P, T, I, x, b, 23, a[39]), x = h(x, P, T, I, O, 4, a[40]), I = h(I, x, P, T, s, 11, a[41]), T = h(T, I, x, P, y, 16, a[42]), P = h(P, T, I, x, v, 23, a[43]), x = h(x, P, T, I, _, 4, a[44]), I = h(I, x, P, T, w, 11, a[45]), T = h(T, I, x, P, A, 16, a[46]), x = p(x, P = h(P, T, I, x, l, 23, a[47]), T, I, s, 6, a[48]), I = p(I, x, P, T, m, 10, a[49]), T = p(T, I, x, P, B, 15, a[50]), P = p(P, T, I, x, d, 21, a[51]), x = p(x, P, T, I, w, 6, a[52]), I = p(I, x, P, T, y, 10, a[53]), T = p(T, I, x, P, b, 15, a[54]), P = p(P, T, I, x, f, 21, a[55]), x = p(x, P, T, I, S, 6, a[56]), I = p(I, x, P, T, A, 10, a[57]), T = p(T, I, x, P, v, 15, a[58]), P = p(P, T, I, x, O, 21, a[59]), x = p(x, P, T, I, g, 6, a[60]), I = p(I, x, P, T, E, 10, a[61]), T = p(T, I, x, P, l, 15, a[62]), P = p(P, T, I, x, _, 21, a[63]), o[0] = o[0] + x | 0, o[1] = o[1] + P | 0, o[2] = o[2] + T | 0, o[3] = o[3] + I | 0
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var e = this._data,
|
||||
r = e.words,
|
||||
n = 8 * this._nDataBytes,
|
||||
i = 8 * e.sigBytes;
|
||||
r[i >>> 5] |= 128 << 24 - i % 32;
|
||||
var o = t.floor(n / 4294967296),
|
||||
s = n;
|
||||
r[15 + (i + 64 >>> 9 << 4)] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), r[14 + (i + 64 >>> 9 << 4)] = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), e.sigBytes = 4 * (r.length + 1), this._process();
|
||||
for (var a = this._hash, f = a.words, u = 0; u < 4; u++) {
|
||||
var c = f[u];
|
||||
f[u] = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8)
|
||||
}
|
||||
return a
|
||||
},
|
||||
clone: function() {
|
||||
var t = o.clone.call(this);
|
||||
return t._hash = this._hash.clone(), t
|
||||
}
|
||||
});
|
||||
|
||||
function u(t, e, r, n, i, o, s) {
|
||||
var a = t + (e & r | ~e & n) + i + s;
|
||||
return (a << o | a >>> 32 - o) + e
|
||||
}
|
||||
function c(t, e, r, n, i, o, s) {
|
||||
var a = t + (e & n | r & ~n) + i + s;
|
||||
return (a << o | a >>> 32 - o) + e
|
||||
}
|
||||
function h(t, e, r, n, i, o, s) {
|
||||
var a = t + (e ^ r ^ n) + i + s;
|
||||
return (a << o | a >>> 32 - o) + e
|
||||
}
|
||||
function p(t, e, r, n, i, o, s) {
|
||||
var a = t + (r ^ (e | ~n)) + i + s;
|
||||
return (a << o | a >>> 32 - o) + e
|
||||
}
|
||||
e.MD5 = o._createHelper(f), e.HmacMD5 = o._createHmacHelper(f)
|
||||
}(Math), n.MD5)
|
||||
},
|
||||
2169: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.mode.CFB = function() {
|
||||
var t = n.lib.BlockCipherMode.extend();
|
||||
|
||||
function e(t, e, r, n) {
|
||||
var i = this._iv;
|
||||
if (i) {
|
||||
var o = i.slice(0);
|
||||
this._iv = void 0
|
||||
} else o = this._prevBlock;
|
||||
n.encryptBlock(o, 0);
|
||||
for (var s = 0; s < r; s++) t[e + s] ^= o[s]
|
||||
}
|
||||
return t.Encryptor = t.extend({
|
||||
processBlock: function(t, r) {
|
||||
var n = this._cipher,
|
||||
i = n.blockSize;
|
||||
e.call(this, t, r, i, n), this._prevBlock = t.slice(r, r + i)
|
||||
}
|
||||
}), t.Decryptor = t.extend({
|
||||
processBlock: function(t, r) {
|
||||
var n = this._cipher,
|
||||
i = n.blockSize,
|
||||
o = t.slice(r, r + i);
|
||||
e.call(this, t, r, i, n), this._prevBlock = o
|
||||
}
|
||||
}), t
|
||||
}(), n.mode.CFB)
|
||||
},
|
||||
6372: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.mode.CTRGladman = function() {
|
||||
var t = n.lib.BlockCipherMode.extend();
|
||||
|
||||
function e(t) {
|
||||
if (255 & ~ (t >> 24)) t += 1 << 24;
|
||||
else {
|
||||
var e = t >> 16 & 255,
|
||||
r = t >> 8 & 255,
|
||||
n = 255 & t;
|
||||
255 === e ? (e = 0, 255 === r ? (r = 0, 255 === n ? n = 0 : ++n) : ++r) : ++e, t = 0, t += e << 16, t += r << 8, t += n
|
||||
}
|
||||
return t
|
||||
}
|
||||
var r = t.Encryptor = t.extend({
|
||||
processBlock: function(t, r) {
|
||||
var n = this._cipher,
|
||||
i = n.blockSize,
|
||||
o = this._iv,
|
||||
s = this._counter;
|
||||
o && (s = this._counter = o.slice(0), this._iv = void 0),
|
||||
function(t) {
|
||||
0 === (t[0] = e(t[0])) && (t[1] = e(t[1]))
|
||||
}(s);
|
||||
var a = s.slice(0);
|
||||
n.encryptBlock(a, 0);
|
||||
for (var f = 0; f < i; f++) t[r + f] ^= a[f]
|
||||
}
|
||||
});
|
||||
return t.Decryptor = r, t
|
||||
}(), n.mode.CTRGladman)
|
||||
},
|
||||
6939: function(t, e, r) {
|
||||
var n, i, o;
|
||||
t.exports = (o = r(9021), r(7165), o.mode.CTR = (i = (n = o.lib.BlockCipherMode.extend())
|
||||
.Encryptor = n.extend({
|
||||
processBlock: function(t, e) {
|
||||
var r = this._cipher,
|
||||
n = r.blockSize,
|
||||
i = this._iv,
|
||||
o = this._counter;
|
||||
i && (o = this._counter = i.slice(0), this._iv = void 0);
|
||||
var s = o.slice(0);
|
||||
r.encryptBlock(s, 0), o[n - 1] = o[n - 1] + 1 | 0;
|
||||
for (var a = 0; a < n; a++) t[e + a] ^= s[a]
|
||||
}
|
||||
}), n.Decryptor = i, n), o.mode.CTR)
|
||||
},
|
||||
8454: function(t, e, r) {
|
||||
var n, i;
|
||||
t.exports = (i = r(9021), r(7165), i.mode.ECB = ((n = i.lib.BlockCipherMode.extend())
|
||||
.Encryptor = n.extend({
|
||||
processBlock: function(t, e) {
|
||||
this._cipher.encryptBlock(t, e)
|
||||
}
|
||||
}), n.Decryptor = n.extend({
|
||||
processBlock: function(t, e) {
|
||||
this._cipher.decryptBlock(t, e)
|
||||
}
|
||||
}), n), i.mode.ECB)
|
||||
},
|
||||
3797: function(t, e, r) {
|
||||
var n, i, o;
|
||||
t.exports = (o = r(9021), r(7165), o.mode.OFB = (i = (n = o.lib.BlockCipherMode.extend())
|
||||
.Encryptor = n.extend({
|
||||
processBlock: function(t, e) {
|
||||
var r = this._cipher,
|
||||
n = r.blockSize,
|
||||
i = this._iv,
|
||||
o = this._keystream;
|
||||
i && (o = this._keystream = i.slice(0), this._iv = void 0), r.encryptBlock(o, 0);
|
||||
for (var s = 0; s < n; s++) t[e + s] ^= o[s]
|
||||
}
|
||||
}), n.Decryptor = i, n), o.mode.OFB)
|
||||
},
|
||||
2073: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.pad.AnsiX923 = {
|
||||
pad: function(t, e) {
|
||||
var r = t.sigBytes,
|
||||
n = 4 * e,
|
||||
i = n - r % n,
|
||||
o = r + i - 1;
|
||||
t.clamp(), t.words[o >>> 2] |= i << 24 - o % 4 * 8, t.sigBytes += i
|
||||
},
|
||||
unpad: function(t) {
|
||||
var e = 255 & t.words[t.sigBytes - 1 >>> 2];
|
||||
t.sigBytes -= e
|
||||
}
|
||||
}, n.pad.Ansix923)
|
||||
},
|
||||
4905: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.pad.Iso10126 = {
|
||||
pad: function(t, e) {
|
||||
var r = 4 * e,
|
||||
i = r - t.sigBytes % r;
|
||||
t.concat(n.lib.WordArray.random(i - 1))
|
||||
.concat(n.lib.WordArray.create([i << 24], 1))
|
||||
},
|
||||
unpad: function(t) {
|
||||
var e = 255 & t.words[t.sigBytes - 1 >>> 2];
|
||||
t.sigBytes -= e
|
||||
}
|
||||
}, n.pad.Iso10126)
|
||||
},
|
||||
482: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.pad.Iso97971 = {
|
||||
pad: function(t, e) {
|
||||
t.concat(n.lib.WordArray.create([2147483648], 1)), n.pad.ZeroPadding.pad(t, e)
|
||||
},
|
||||
unpad: function(t) {
|
||||
n.pad.ZeroPadding.unpad(t), t.sigBytes--
|
||||
}
|
||||
}, n.pad.Iso97971)
|
||||
},
|
||||
8124: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.pad.NoPadding = {
|
||||
pad: function() {},
|
||||
unpad: function() {}
|
||||
}, n.pad.NoPadding)
|
||||
},
|
||||
2155: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(7165), n.pad.ZeroPadding = {
|
||||
pad: function(t, e) {
|
||||
var r = 4 * e;
|
||||
t.clamp(), t.sigBytes += r - (t.sigBytes % r || r)
|
||||
},
|
||||
unpad: function(t) {
|
||||
for (var e = t.words, r = t.sigBytes - 1; !(e[r >>> 2] >>> 24 - r % 4 * 8 & 255);) r--;
|
||||
t.sigBytes = r + 1
|
||||
}
|
||||
}, n.pad.ZeroPadding)
|
||||
},
|
||||
19: function(t, e, r) {
|
||||
var n, i, o, s, a, f, u, c, h;
|
||||
t.exports = (h = r(9021), r(5471), r(1025), o = (i = (n = h)
|
||||
.lib)
|
||||
.Base, s = i.WordArray, f = (a = n.algo)
|
||||
.SHA1, u = a.HMAC, c = a.PBKDF2 = o.extend({
|
||||
cfg: o.extend({
|
||||
keySize: 4,
|
||||
hasher: f,
|
||||
iterations: 1
|
||||
}),
|
||||
init: function(t) {
|
||||
this.cfg = this.cfg.extend(t)
|
||||
},
|
||||
compute: function(t, e) {
|
||||
for (var r = this.cfg, n = u.create(r.hasher, t), i = s.create(), o = s.create([1]), a = i.words, f = o.words, c = r.keySize, h = r.iterations; a.length < c;) {
|
||||
var p = n.update(e)
|
||||
.finalize(o);
|
||||
n.reset();
|
||||
for (var l = p.words, y = l.length, g = p, d = 1; d < h; d++) {
|
||||
g = n.finalize(g), n.reset();
|
||||
for (var v = g.words, m = 0; m < y; m++) l[m] ^= v[m]
|
||||
}
|
||||
i.concat(p), f[0]++
|
||||
}
|
||||
return i.sigBytes = 4 * c, i
|
||||
}
|
||||
}), n.PBKDF2 = function(t, e, r) {
|
||||
return c.create(r)
|
||||
.compute(t, e)
|
||||
}, h.PBKDF2)
|
||||
},
|
||||
2696: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(754), r(4636), r(9506), r(7165), function() {
|
||||
var t = n,
|
||||
e = t.lib.StreamCipher,
|
||||
r = t.algo,
|
||||
i = [],
|
||||
o = [],
|
||||
s = [],
|
||||
a = r.RabbitLegacy = e.extend({
|
||||
_doReset: function() {
|
||||
var t = this._key.words,
|
||||
e = this.cfg.iv,
|
||||
r = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16],
|
||||
n = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]];
|
||||
this._b = 0;
|
||||
for (var i = 0; i < 4; i++) f.call(this);
|
||||
for (i = 0; i < 8; i++) n[i] ^= r[i + 4 & 7];
|
||||
if (e) {
|
||||
var o = e.words,
|
||||
s = o[0],
|
||||
a = o[1],
|
||||
u = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8),
|
||||
c = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8),
|
||||
h = u >>> 16 | 4294901760 & c,
|
||||
p = c << 16 | 65535 & u;
|
||||
for (n[0] ^= u, n[1] ^= h, n[2] ^= c, n[3] ^= p, n[4] ^= u, n[5] ^= h, n[6] ^= c, n[7] ^= p, i = 0; i < 4; i++) f.call(this)
|
||||
}
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
var r = this._X;
|
||||
f.call(this), i[0] = r[0] ^ r[5] >>> 16 ^ r[3] << 16, i[1] = r[2] ^ r[7] >>> 16 ^ r[5] << 16, i[2] = r[4] ^ r[1] >>> 16 ^ r[7] << 16, i[3] = r[6] ^ r[3] >>> 16 ^ r[1] << 16;
|
||||
for (var n = 0; n < 4; n++) i[n] = 16711935 & (i[n] << 8 | i[n] >>> 24) | 4278255360 & (i[n] << 24 | i[n] >>> 8), t[e + n] ^= i[n]
|
||||
},
|
||||
blockSize: 4,
|
||||
ivSize: 2
|
||||
});
|
||||
|
||||
function f() {
|
||||
for (var t = this._X, e = this._C, r = 0; r < 8; r++) o[r] = e[r];
|
||||
for (e[0] = e[0] + 1295307597 + this._b | 0, e[1] = e[1] + 3545052371 + (e[0] >>> 0 < o[0] >>> 0 ? 1 : 0) | 0, e[2] = e[2] + 886263092 + (e[1] >>> 0 < o[1] >>> 0 ? 1 : 0) | 0, e[3] = e[3] + 1295307597 + (e[2] >>> 0 < o[2] >>> 0 ? 1 : 0) | 0, e[4] = e[4] + 3545052371 + (e[3] >>> 0 < o[3] >>> 0 ? 1 : 0) | 0, e[5] = e[5] + 886263092 + (e[4] >>> 0 < o[4] >>> 0 ? 1 : 0) | 0, e[6] = e[6] + 1295307597 + (e[5] >>> 0 < o[5] >>> 0 ? 1 : 0) | 0, e[7] = e[7] + 3545052371 + (e[6] >>> 0 < o[6] >>> 0 ? 1 : 0) | 0, this._b = e[7] >>> 0 < o[7] >>> 0 ? 1 : 0, r = 0; r < 8; r++) {
|
||||
var n = t[r] + e[r],
|
||||
i = 65535 & n,
|
||||
a = n >>> 16,
|
||||
f = ((i * i >>> 17) + i * a >>> 15) + a * a,
|
||||
u = ((4294901760 & n) * n | 0) + ((65535 & n) * n | 0);
|
||||
s[r] = f ^ u
|
||||
}
|
||||
t[0] = s[0] + (s[7] << 16 | s[7] >>> 16) + (s[6] << 16 | s[6] >>> 16) | 0, t[1] = s[1] + (s[0] << 8 | s[0] >>> 24) + s[7] | 0, t[2] = s[2] + (s[1] << 16 | s[1] >>> 16) + (s[0] << 16 | s[0] >>> 16) | 0, t[3] = s[3] + (s[2] << 8 | s[2] >>> 24) + s[1] | 0, t[4] = s[4] + (s[3] << 16 | s[3] >>> 16) + (s[2] << 16 | s[2] >>> 16) | 0, t[5] = s[5] + (s[4] << 8 | s[4] >>> 24) + s[3] | 0, t[6] = s[6] + (s[5] << 16 | s[5] >>> 16) + (s[4] << 16 | s[4] >>> 16) | 0, t[7] = s[7] + (s[6] << 8 | s[6] >>> 24) + s[5] | 0
|
||||
}
|
||||
t.RabbitLegacy = e._createHelper(a)
|
||||
}(), n.RabbitLegacy)
|
||||
},
|
||||
6298: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(754), r(4636), r(9506), r(7165), function() {
|
||||
var t = n,
|
||||
e = t.lib.StreamCipher,
|
||||
r = t.algo,
|
||||
i = [],
|
||||
o = [],
|
||||
s = [],
|
||||
a = r.Rabbit = e.extend({
|
||||
_doReset: function() {
|
||||
for (var t = this._key.words, e = this.cfg.iv, r = 0; r < 4; r++) t[r] = 16711935 & (t[r] << 8 | t[r] >>> 24) | 4278255360 & (t[r] << 24 | t[r] >>> 8);
|
||||
var n = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16],
|
||||
i = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]];
|
||||
for (this._b = 0, r = 0; r < 4; r++) f.call(this);
|
||||
for (r = 0; r < 8; r++) i[r] ^= n[r + 4 & 7];
|
||||
if (e) {
|
||||
var o = e.words,
|
||||
s = o[0],
|
||||
a = o[1],
|
||||
u = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8),
|
||||
c = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8),
|
||||
h = u >>> 16 | 4294901760 & c,
|
||||
p = c << 16 | 65535 & u;
|
||||
for (i[0] ^= u, i[1] ^= h, i[2] ^= c, i[3] ^= p, i[4] ^= u, i[5] ^= h, i[6] ^= c, i[7] ^= p, r = 0; r < 4; r++) f.call(this)
|
||||
}
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
var r = this._X;
|
||||
f.call(this), i[0] = r[0] ^ r[5] >>> 16 ^ r[3] << 16, i[1] = r[2] ^ r[7] >>> 16 ^ r[5] << 16, i[2] = r[4] ^ r[1] >>> 16 ^ r[7] << 16, i[3] = r[6] ^ r[3] >>> 16 ^ r[1] << 16;
|
||||
for (var n = 0; n < 4; n++) i[n] = 16711935 & (i[n] << 8 | i[n] >>> 24) | 4278255360 & (i[n] << 24 | i[n] >>> 8), t[e + n] ^= i[n]
|
||||
},
|
||||
blockSize: 4,
|
||||
ivSize: 2
|
||||
});
|
||||
|
||||
function f() {
|
||||
for (var t = this._X, e = this._C, r = 0; r < 8; r++) o[r] = e[r];
|
||||
for (e[0] = e[0] + 1295307597 + this._b | 0, e[1] = e[1] + 3545052371 + (e[0] >>> 0 < o[0] >>> 0 ? 1 : 0) | 0, e[2] = e[2] + 886263092 + (e[1] >>> 0 < o[1] >>> 0 ? 1 : 0) | 0, e[3] = e[3] + 1295307597 + (e[2] >>> 0 < o[2] >>> 0 ? 1 : 0) | 0, e[4] = e[4] + 3545052371 + (e[3] >>> 0 < o[3] >>> 0 ? 1 : 0) | 0, e[5] = e[5] + 886263092 + (e[4] >>> 0 < o[4] >>> 0 ? 1 : 0) | 0, e[6] = e[6] + 1295307597 + (e[5] >>> 0 < o[5] >>> 0 ? 1 : 0) | 0, e[7] = e[7] + 3545052371 + (e[6] >>> 0 < o[6] >>> 0 ? 1 : 0) | 0, this._b = e[7] >>> 0 < o[7] >>> 0 ? 1 : 0, r = 0; r < 8; r++) {
|
||||
var n = t[r] + e[r],
|
||||
i = 65535 & n,
|
||||
a = n >>> 16,
|
||||
f = ((i * i >>> 17) + i * a >>> 15) + a * a,
|
||||
u = ((4294901760 & n) * n | 0) + ((65535 & n) * n | 0);
|
||||
s[r] = f ^ u
|
||||
}
|
||||
t[0] = s[0] + (s[7] << 16 | s[7] >>> 16) + (s[6] << 16 | s[6] >>> 16) | 0, t[1] = s[1] + (s[0] << 8 | s[0] >>> 24) + s[7] | 0, t[2] = s[2] + (s[1] << 16 | s[1] >>> 16) + (s[0] << 16 | s[0] >>> 16) | 0, t[3] = s[3] + (s[2] << 8 | s[2] >>> 24) + s[1] | 0, t[4] = s[4] + (s[3] << 16 | s[3] >>> 16) + (s[2] << 16 | s[2] >>> 16) | 0, t[5] = s[5] + (s[4] << 8 | s[4] >>> 24) + s[3] | 0, t[6] = s[6] + (s[5] << 16 | s[5] >>> 16) + (s[4] << 16 | s[4] >>> 16) | 0, t[7] = s[7] + (s[6] << 8 | s[6] >>> 24) + s[5] | 0
|
||||
}
|
||||
t.Rabbit = e._createHelper(a)
|
||||
}(), n.Rabbit)
|
||||
},
|
||||
7193: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(754), r(4636), r(9506), r(7165), function() {
|
||||
var t = n,
|
||||
e = t.lib.StreamCipher,
|
||||
r = t.algo,
|
||||
i = r.RC4 = e.extend({
|
||||
_doReset: function() {
|
||||
for (var t = this._key, e = t.words, r = t.sigBytes, n = this._S = [], i = 0; i < 256; i++) n[i] = i;
|
||||
i = 0;
|
||||
for (var o = 0; i < 256; i++) {
|
||||
var s = i % r,
|
||||
a = e[s >>> 2] >>> 24 - s % 4 * 8 & 255;
|
||||
o = (o + n[i] + a) % 256;
|
||||
var f = n[i];
|
||||
n[i] = n[o], n[o] = f
|
||||
}
|
||||
this._i = this._j = 0
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
t[e] ^= o.call(this)
|
||||
},
|
||||
keySize: 8,
|
||||
ivSize: 0
|
||||
});
|
||||
|
||||
function o() {
|
||||
for (var t = this._S, e = this._i, r = this._j, n = 0, i = 0; i < 4; i++) {
|
||||
r = (r + t[e = (e + 1) % 256]) % 256;
|
||||
var o = t[e];
|
||||
t[e] = t[r], t[r] = o, n |= t[(t[e] + t[r]) % 256] << 24 - 8 * i
|
||||
}
|
||||
return this._i = e, this._j = r, n
|
||||
}
|
||||
t.RC4 = e._createHelper(i);
|
||||
var s = r.RC4Drop = i.extend({
|
||||
cfg: i.cfg.extend({
|
||||
drop: 192
|
||||
}),
|
||||
_doReset: function() {
|
||||
i._doReset.call(this);
|
||||
for (var t = this.cfg.drop; t > 0; t--) o.call(this)
|
||||
}
|
||||
});
|
||||
t.RC4Drop = e._createHelper(s)
|
||||
}(), n.RC4)
|
||||
},
|
||||
8056: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), function(t) {
|
||||
var e = n,
|
||||
r = e.lib,
|
||||
i = r.WordArray,
|
||||
o = r.Hasher,
|
||||
s = e.algo,
|
||||
a = i.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]),
|
||||
f = i.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]),
|
||||
u = i.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]),
|
||||
c = i.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]),
|
||||
h = i.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),
|
||||
p = i.create([1352829926, 1548603684, 1836072691, 2053994217, 0]),
|
||||
l = s.RIPEMD160 = o.extend({
|
||||
_doReset: function() {
|
||||
this._hash = i.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
for (var r = 0; r < 16; r++) {
|
||||
var n = e + r,
|
||||
i = t[n];
|
||||
t[n] = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8)
|
||||
}
|
||||
var o, s, l, _, b, E, w, O, B, A, x, P = this._hash.words,
|
||||
T = h.words,
|
||||
I = p.words,
|
||||
k = a.words,
|
||||
D = f.words,
|
||||
R = u.words,
|
||||
N = c.words;
|
||||
for (E = o = P[0], w = s = P[1], O = l = P[2], B = _ = P[3], A = b = P[4], r = 0; r < 80; r += 1) x = o + t[e + k[r]] | 0, x += r < 16 ? y(s, l, _) + T[0] : r < 32 ? g(s, l, _) + T[1] : r < 48 ? d(s, l, _) + T[2] : r < 64 ? v(s, l, _) + T[3] : m(s, l, _) + T[4], x = (x = S(x |= 0, R[r])) + b | 0, o = b, b = _, _ = S(l, 10), l = s, s = x, x = E + t[e + D[r]] | 0, x += r < 16 ? m(w, O, B) + I[0] : r < 32 ? v(w, O, B) + I[1] : r < 48 ? d(w, O, B) + I[2] : r < 64 ? g(w, O, B) + I[3] : y(w, O, B) + I[4], x = (x = S(x |= 0, N[r])) + A | 0, E = A, A = B, B = S(O, 10), O = w, w = x;
|
||||
x = P[1] + l + B | 0, P[1] = P[2] + _ + A | 0, P[2] = P[3] + b + E | 0, P[3] = P[4] + o + w | 0, P[4] = P[0] + s + O | 0, P[0] = x
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var t = this._data,
|
||||
e = t.words,
|
||||
r = 8 * this._nDataBytes,
|
||||
n = 8 * t.sigBytes;
|
||||
e[n >>> 5] |= 128 << 24 - n % 32, e[14 + (n + 64 >>> 9 << 4)] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8), t.sigBytes = 4 * (e.length + 1), this._process();
|
||||
for (var i = this._hash, o = i.words, s = 0; s < 5; s++) {
|
||||
var a = o[s];
|
||||
o[s] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8)
|
||||
}
|
||||
return i
|
||||
},
|
||||
clone: function() {
|
||||
var t = o.clone.call(this);
|
||||
return t._hash = this._hash.clone(), t
|
||||
}
|
||||
});
|
||||
|
||||
function y(t, e, r) {
|
||||
return t ^ e ^ r
|
||||
}
|
||||
function g(t, e, r) {
|
||||
return t & e | ~t & r
|
||||
}
|
||||
function d(t, e, r) {
|
||||
return (t | ~e) ^ r
|
||||
}
|
||||
function v(t, e, r) {
|
||||
return t & r | e & ~r
|
||||
}
|
||||
function m(t, e, r) {
|
||||
return t ^ (e | ~r)
|
||||
}
|
||||
function S(t, e) {
|
||||
return t << e | t >>> 32 - e
|
||||
}
|
||||
e.RIPEMD160 = o._createHelper(l), e.HmacRIPEMD160 = o._createHmacHelper(l)
|
||||
}(Math), n.RIPEMD160)
|
||||
},
|
||||
5471: function(t, e, r) {
|
||||
var n, i, o, s, a, f, u, c;
|
||||
t.exports = (i = (n = c = r(9021))
|
||||
.lib, o = i.WordArray, s = i.Hasher, a = n.algo, f = [], u = a.SHA1 = s.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new o.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
for (var r = this._hash.words, n = r[0], i = r[1], o = r[2], s = r[3], a = r[4], u = 0; u < 80; u++) {
|
||||
if (u < 16) f[u] = 0 | t[e + u];
|
||||
else {
|
||||
var c = f[u - 3] ^ f[u - 8] ^ f[u - 14] ^ f[u - 16];
|
||||
f[u] = c << 1 | c >>> 31
|
||||
}
|
||||
var h = (n << 5 | n >>> 27) + a + f[u];
|
||||
h += u < 20 ? 1518500249 + (i & o | ~i & s) : u < 40 ? 1859775393 + (i ^ o ^ s) : u < 60 ? (i & o | i & s | o & s) - 1894007588 : (i ^ o ^ s) - 899497514, a = s, s = o, o = i << 30 | i >>> 2, i = n, n = h
|
||||
}
|
||||
r[0] = r[0] + n | 0, r[1] = r[1] + i | 0, r[2] = r[2] + o | 0, r[3] = r[3] + s | 0, r[4] = r[4] + a | 0
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var t = this._data,
|
||||
e = t.words,
|
||||
r = 8 * this._nDataBytes,
|
||||
n = 8 * t.sigBytes;
|
||||
return e[n >>> 5] |= 128 << 24 - n % 32, e[14 + (n + 64 >>> 9 << 4)] = Math.floor(r / 4294967296), e[15 + (n + 64 >>> 9 << 4)] = r, t.sigBytes = 4 * e.length, this._process(), this._hash
|
||||
},
|
||||
clone: function() {
|
||||
var t = s.clone.call(this);
|
||||
return t._hash = this._hash.clone(), t
|
||||
}
|
||||
}), n.SHA1 = s._createHelper(u), n.HmacSHA1 = s._createHmacHelper(u), c.SHA1)
|
||||
},
|
||||
6308: function(t, e, r) {
|
||||
var n, i, o, s, a, f;
|
||||
t.exports = (f = r(9021), r(3009), i = (n = f)
|
||||
.lib.WordArray, o = n.algo, s = o.SHA256, a = o.SHA224 = s.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new i.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428])
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var t = s._doFinalize.call(this);
|
||||
return t.sigBytes -= 4, t
|
||||
}
|
||||
}), n.SHA224 = s._createHelper(a), n.HmacSHA224 = s._createHmacHelper(a), f.SHA224)
|
||||
},
|
||||
3009: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), function(t) {
|
||||
var e = n,
|
||||
r = e.lib,
|
||||
i = r.WordArray,
|
||||
o = r.Hasher,
|
||||
s = e.algo,
|
||||
a = [],
|
||||
f = [];
|
||||
! function() {
|
||||
function e(e) {
|
||||
for (var r = t.sqrt(e), n = 2; n <= r; n++) if (!(e % n)) return !1;
|
||||
return !0
|
||||
}
|
||||
function r(t) {
|
||||
return 4294967296 * (t - (0 | t)) | 0
|
||||
}
|
||||
for (var n = 2, i = 0; i < 64;) e(n) && (i < 8 && (a[i] = r(t.pow(n, .5))), f[i] = r(t.pow(n, 1 / 3)), i++), n++
|
||||
}();
|
||||
var u = [],
|
||||
c = s.SHA256 = o.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new i.init(a.slice(0))
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
for (var r = this._hash.words, n = r[0], i = r[1], o = r[2], s = r[3], a = r[4], c = r[5], h = r[6], p = r[7], l = 0; l < 64; l++) {
|
||||
if (l < 16) u[l] = 0 | t[e + l];
|
||||
else {
|
||||
var y = u[l - 15],
|
||||
g = (y << 25 | y >>> 7) ^ (y << 14 | y >>> 18) ^ y >>> 3,
|
||||
d = u[l - 2],
|
||||
v = (d << 15 | d >>> 17) ^ (d << 13 | d >>> 19) ^ d >>> 10;
|
||||
u[l] = g + u[l - 7] + v + u[l - 16]
|
||||
}
|
||||
var m = n & i ^ n & o ^ i & o,
|
||||
S = (n << 30 | n >>> 2) ^ (n << 19 | n >>> 13) ^ (n << 10 | n >>> 22),
|
||||
_ = p + ((a << 26 | a >>> 6) ^ (a << 21 | a >>> 11) ^ (a << 7 | a >>> 25)) + (a & c ^ ~a & h) + f[l] + u[l];
|
||||
p = h, h = c, c = a, a = s + _ | 0, s = o, o = i, i = n, n = _ + (S + m) | 0
|
||||
}
|
||||
r[0] = r[0] + n | 0, r[1] = r[1] + i | 0, r[2] = r[2] + o | 0, r[3] = r[3] + s | 0, r[4] = r[4] + a | 0, r[5] = r[5] + c | 0, r[6] = r[6] + h | 0, r[7] = r[7] + p | 0
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var e = this._data,
|
||||
r = e.words,
|
||||
n = 8 * this._nDataBytes,
|
||||
i = 8 * e.sigBytes;
|
||||
return r[i >>> 5] |= 128 << 24 - i % 32, r[14 + (i + 64 >>> 9 << 4)] = t.floor(n / 4294967296), r[15 + (i + 64 >>> 9 << 4)] = n, e.sigBytes = 4 * r.length, this._process(), this._hash
|
||||
},
|
||||
clone: function() {
|
||||
var t = o.clone.call(this);
|
||||
return t._hash = this._hash.clone(), t
|
||||
}
|
||||
});
|
||||
e.SHA256 = o._createHelper(c), e.HmacSHA256 = o._createHmacHelper(c)
|
||||
}(Math), n.SHA256)
|
||||
},
|
||||
5953: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(3240), function(t) {
|
||||
var e = n,
|
||||
r = e.lib,
|
||||
i = r.WordArray,
|
||||
o = r.Hasher,
|
||||
s = e.x64.Word,
|
||||
a = e.algo,
|
||||
f = [],
|
||||
u = [],
|
||||
c = [];
|
||||
! function() {
|
||||
for (var t = 1, e = 0, r = 0; r < 24; r++) {
|
||||
f[t + 5 * e] = (r + 1) * (r + 2) / 2 % 64;
|
||||
var n = (2 * t + 3 * e) % 5;
|
||||
t = e % 5, e = n
|
||||
}
|
||||
for (t = 0; t < 5; t++) for (e = 0; e < 5; e++) u[t + 5 * e] = e + (2 * t + 3 * e) % 5 * 5;
|
||||
for (var i = 1, o = 0; o < 24; o++) {
|
||||
for (var a = 0, h = 0, p = 0; p < 7; p++) {
|
||||
if (1 & i) {
|
||||
var l = (1 << p) - 1;
|
||||
l < 32 ? h ^= 1 << l : a ^= 1 << l - 32
|
||||
}
|
||||
128 & i ? i = i << 1 ^ 113 : i <<= 1
|
||||
}
|
||||
c[o] = s.create(a, h)
|
||||
}
|
||||
}();
|
||||
var h = [];
|
||||
! function() {
|
||||
for (var t = 0; t < 25; t++) h[t] = s.create()
|
||||
}();
|
||||
var p = a.SHA3 = o.extend({
|
||||
cfg: o.cfg.extend({
|
||||
outputLength: 512
|
||||
}),
|
||||
_doReset: function() {
|
||||
for (var t = this._state = [], e = 0; e < 25; e++) t[e] = new s.init;
|
||||
this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
for (var r = this._state, n = this.blockSize / 2, i = 0; i < n; i++) {
|
||||
var o = t[e + 2 * i],
|
||||
s = t[e + 2 * i + 1];
|
||||
o = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), s = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), (P = r[i])
|
||||
.high ^= s, P.low ^= o
|
||||
}
|
||||
for (var a = 0; a < 24; a++) {
|
||||
for (var p = 0; p < 5; p++) {
|
||||
for (var l = 0, y = 0, g = 0; g < 5; g++) l ^= (P = r[p + 5 * g])
|
||||
.high, y ^= P.low;
|
||||
var d = h[p];
|
||||
d.high = l, d.low = y
|
||||
}
|
||||
for (p = 0; p < 5; p++) {
|
||||
var v = h[(p + 4) % 5],
|
||||
m = h[(p + 1) % 5],
|
||||
S = m.high,
|
||||
_ = m.low;
|
||||
for (l = v.high ^ (S << 1 | _ >>> 31), y = v.low ^ (_ << 1 | S >>> 31), g = 0; g < 5; g++)(P = r[p + 5 * g])
|
||||
.high ^= l, P.low ^= y
|
||||
}
|
||||
for (var b = 1; b < 25; b++) {
|
||||
var E = (P = r[b])
|
||||
.high,
|
||||
w = P.low,
|
||||
O = f[b];
|
||||
O < 32 ? (l = E << O | w >>> 32 - O, y = w << O | E >>> 32 - O) : (l = w << O - 32 | E >>> 64 - O, y = E << O - 32 | w >>> 64 - O);
|
||||
var B = h[u[b]];
|
||||
B.high = l, B.low = y
|
||||
}
|
||||
var A = h[0],
|
||||
x = r[0];
|
||||
for (A.high = x.high, A.low = x.low, p = 0; p < 5; p++) for (g = 0; g < 5; g++) {
|
||||
var P = r[b = p + 5 * g],
|
||||
T = h[b],
|
||||
I = h[(p + 1) % 5 + 5 * g],
|
||||
k = h[(p + 2) % 5 + 5 * g];
|
||||
P.high = T.high ^ ~I.high & k.high, P.low = T.low ^ ~I.low & k.low
|
||||
}
|
||||
P = r[0];
|
||||
var D = c[a];
|
||||
P.high ^= D.high, P.low ^= D.low
|
||||
}
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var e = this._data,
|
||||
r = e.words,
|
||||
n = (this._nDataBytes, 8 * e.sigBytes),
|
||||
o = 32 * this.blockSize;
|
||||
r[n >>> 5] |= 1 << 24 - n % 32, r[(t.ceil((n + 1) / o) * o >>> 5) - 1] |= 128, e.sigBytes = 4 * r.length, this._process();
|
||||
for (var s = this._state, a = this.cfg.outputLength / 8, f = a / 8, u = [], c = 0; c < f; c++) {
|
||||
var h = s[c],
|
||||
p = h.high,
|
||||
l = h.low;
|
||||
p = 16711935 & (p << 8 | p >>> 24) | 4278255360 & (p << 24 | p >>> 8), l = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8), u.push(l), u.push(p)
|
||||
}
|
||||
return new i.init(u, a)
|
||||
},
|
||||
clone: function() {
|
||||
for (var t = o.clone.call(this), e = t._state = this._state.slice(0), r = 0; r < 25; r++) e[r] = e[r].clone();
|
||||
return t
|
||||
}
|
||||
});
|
||||
e.SHA3 = o._createHelper(p), e.HmacSHA3 = o._createHmacHelper(p)
|
||||
}(Math), n.SHA3)
|
||||
},
|
||||
9557: function(t, e, r) {
|
||||
var n, i, o, s, a, f, u, c;
|
||||
t.exports = (c = r(9021), r(3240), r(1380), i = (n = c)
|
||||
.x64, o = i.Word, s = i.WordArray, a = n.algo, f = a.SHA512, u = a.SHA384 = f.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new s.init([new o.init(3418070365, 3238371032), new o.init(1654270250, 914150663), new o.init(2438529370, 812702999), new o.init(355462360, 4144912697), new o.init(1731405415, 4290775857), new o.init(2394180231, 1750603025), new o.init(3675008525, 1694076839), new o.init(1203062813, 3204075428)])
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var t = f._doFinalize.call(this);
|
||||
return t.sigBytes -= 16, t
|
||||
}
|
||||
}), n.SHA384 = f._createHelper(u), n.HmacSHA384 = f._createHmacHelper(u), c.SHA384)
|
||||
},
|
||||
1380: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(3240), function() {
|
||||
var t = n,
|
||||
e = t.lib.Hasher,
|
||||
r = t.x64,
|
||||
i = r.Word,
|
||||
o = r.WordArray,
|
||||
s = t.algo;
|
||||
|
||||
function a() {
|
||||
return i.create.apply(i, arguments)
|
||||
}
|
||||
var f = [a(1116352408, 3609767458), a(1899447441, 602891725), a(3049323471, 3964484399), a(3921009573, 2173295548), a(961987163, 4081628472), a(1508970993, 3053834265), a(2453635748, 2937671579), a(2870763221, 3664609560), a(3624381080, 2734883394), a(310598401, 1164996542), a(607225278, 1323610764), a(1426881987, 3590304994), a(1925078388, 4068182383), a(2162078206, 991336113), a(2614888103, 633803317), a(3248222580, 3479774868), a(3835390401, 2666613458), a(4022224774, 944711139), a(264347078, 2341262773), a(604807628, 2007800933), a(770255983, 1495990901), a(1249150122, 1856431235), a(1555081692, 3175218132), a(1996064986, 2198950837), a(2554220882, 3999719339), a(2821834349, 766784016), a(2952996808, 2566594879), a(3210313671, 3203337956), a(3336571891, 1034457026), a(3584528711, 2466948901), a(113926993, 3758326383), a(338241895, 168717936), a(666307205, 1188179964), a(773529912, 1546045734), a(1294757372, 1522805485), a(1396182291, 2643833823), a(1695183700, 2343527390), a(1986661051, 1014477480), a(2177026350, 1206759142), a(2456956037, 344077627), a(2730485921, 1290863460), a(2820302411, 3158454273), a(3259730800, 3505952657), a(3345764771, 106217008), a(3516065817, 3606008344), a(3600352804, 1432725776), a(4094571909, 1467031594), a(275423344, 851169720), a(430227734, 3100823752), a(506948616, 1363258195), a(659060556, 3750685593), a(883997877, 3785050280), a(958139571, 3318307427), a(1322822218, 3812723403), a(1537002063, 2003034995), a(1747873779, 3602036899), a(1955562222, 1575990012), a(2024104815, 1125592928), a(2227730452, 2716904306), a(2361852424, 442776044), a(2428436474, 593698344), a(2756734187, 3733110249), a(3204031479, 2999351573), a(3329325298, 3815920427), a(3391569614, 3928383900), a(3515267271, 566280711), a(3940187606, 3454069534), a(4118630271, 4000239992), a(116418474, 1914138554), a(174292421, 2731055270), a(289380356, 3203993006), a(460393269, 320620315), a(685471733, 587496836), a(852142971, 1086792851), a(1017036298, 365543100), a(1126000580, 2618297676), a(1288033470, 3409855158), a(1501505948, 4234509866), a(1607167915, 987167468), a(1816402316, 1246189591)],
|
||||
u = [];
|
||||
! function() {
|
||||
for (var t = 0; t < 80; t++) u[t] = a()
|
||||
}();
|
||||
var c = s.SHA512 = e.extend({
|
||||
_doReset: function() {
|
||||
this._hash = new o.init([new i.init(1779033703, 4089235720), new i.init(3144134277, 2227873595), new i.init(1013904242, 4271175723), new i.init(2773480762, 1595750129), new i.init(1359893119, 2917565137), new i.init(2600822924, 725511199), new i.init(528734635, 4215389547), new i.init(1541459225, 327033209)])
|
||||
},
|
||||
_doProcessBlock: function(t, e) {
|
||||
for (var r = this._hash.words, n = r[0], i = r[1], o = r[2], s = r[3], a = r[4], c = r[5], h = r[6], p = r[7], l = n.high, y = n.low, g = i.high, d = i.low, v = o.high, m = o.low, S = s.high, _ = s.low, b = a.high, E = a.low, w = c.high, O = c.low, B = h.high, A = h.low, x = p.high, P = p.low, T = l, I = y, k = g, D = d, R = v, N = m, L = S, C = _, U = b, M = E, j = w, H = O, F = B, z = A, G = x, q = P, $ = 0; $ < 80; $++) {
|
||||
var K = u[$];
|
||||
if ($ < 16) var W = K.high = 0 | t[e + 2 * $],
|
||||
V = K.low = 0 | t[e + 2 * $ + 1];
|
||||
else {
|
||||
var Y = u[$ - 15],
|
||||
X = Y.high,
|
||||
Z = Y.low,
|
||||
J = (X >>> 1 | Z << 31) ^ (X >>> 8 | Z << 24) ^ X >>> 7,
|
||||
Q = (Z >>> 1 | X << 31) ^ (Z >>> 8 | X << 24) ^ (Z >>> 7 | X << 25),
|
||||
tt = u[$ - 2],
|
||||
et = tt.high,
|
||||
rt = tt.low,
|
||||
nt = (et >>> 19 | rt << 13) ^ (et << 3 | rt >>> 29) ^ et >>> 6,
|
||||
it = (rt >>> 19 | et << 13) ^ (rt << 3 | et >>> 29) ^ (rt >>> 6 | et << 26),
|
||||
ot = u[$ - 7],
|
||||
st = ot.high,
|
||||
at = ot.low,
|
||||
ft = u[$ - 16],
|
||||
ut = ft.high,
|
||||
ct = ft.low;
|
||||
W = (W = (W = J + st + ((V = Q + at) >>> 0 < Q >>> 0 ? 1 : 0)) + nt + ((V += it) >>> 0 < it >>> 0 ? 1 : 0)) + ut + ((V += ct) >>> 0 < ct >>> 0 ? 1 : 0), K.high = W, K.low = V
|
||||
}
|
||||
var ht, pt = U & j ^ ~U & F,
|
||||
lt = M & H ^ ~M & z,
|
||||
yt = T & k ^ T & R ^ k & R,
|
||||
gt = I & D ^ I & N ^ D & N,
|
||||
dt = (T >>> 28 | I << 4) ^ (T << 30 | I >>> 2) ^ (T << 25 | I >>> 7),
|
||||
vt = (I >>> 28 | T << 4) ^ (I << 30 | T >>> 2) ^ (I << 25 | T >>> 7),
|
||||
mt = (U >>> 14 | M << 18) ^ (U >>> 18 | M << 14) ^ (U << 23 | M >>> 9),
|
||||
St = (M >>> 14 | U << 18) ^ (M >>> 18 | U << 14) ^ (M << 23 | U >>> 9),
|
||||
_t = f[$],
|
||||
bt = _t.high,
|
||||
Et = _t.low,
|
||||
wt = G + mt + ((ht = q + St) >>> 0 < q >>> 0 ? 1 : 0),
|
||||
Ot = vt + gt;
|
||||
G = F, q = z, F = j, z = H, j = U, H = M, U = L + (wt = (wt = (wt = wt + pt + ((ht += lt) >>> 0 < lt >>> 0 ? 1 : 0)) + bt + ((ht += Et) >>> 0 < Et >>> 0 ? 1 : 0)) + W + ((ht += V) >>> 0 < V >>> 0 ? 1 : 0)) + ((M = C + ht | 0) >>> 0 < C >>> 0 ? 1 : 0) | 0, L = R, C = N, R = k, N = D, k = T, D = I, T = wt + (dt + yt + (Ot >>> 0 < vt >>> 0 ? 1 : 0)) + ((I = ht + Ot | 0) >>> 0 < ht >>> 0 ? 1 : 0) | 0
|
||||
}
|
||||
y = n.low = y + I, n.high = l + T + (y >>> 0 < I >>> 0 ? 1 : 0), d = i.low = d + D, i.high = g + k + (d >>> 0 < D >>> 0 ? 1 : 0), m = o.low = m + N, o.high = v + R + (m >>> 0 < N >>> 0 ? 1 : 0), _ = s.low = _ + C, s.high = S + L + (_ >>> 0 < C >>> 0 ? 1 : 0), E = a.low = E + M, a.high = b + U + (E >>> 0 < M >>> 0 ? 1 : 0), O = c.low = O + H, c.high = w + j + (O >>> 0 < H >>> 0 ? 1 : 0), A = h.low = A + z, h.high = B + F + (A >>> 0 < z >>> 0 ? 1 : 0), P = p.low = P + q, p.high = x + G + (P >>> 0 < q >>> 0 ? 1 : 0)
|
||||
},
|
||||
_doFinalize: function() {
|
||||
var t = this._data,
|
||||
e = t.words,
|
||||
r = 8 * this._nDataBytes,
|
||||
n = 8 * t.sigBytes;
|
||||
return e[n >>> 5] |= 128 << 24 - n % 32, e[30 + (n + 128 >>> 10 << 5)] = Math.floor(r / 4294967296), e[31 + (n + 128 >>> 10 << 5)] = r, t.sigBytes = 4 * e.length, this._process(), this._hash.toX32()
|
||||
},
|
||||
clone: function() {
|
||||
var t = e.clone.call(this);
|
||||
return t._hash = this._hash.clone(), t
|
||||
},
|
||||
blockSize: 32
|
||||
});
|
||||
t.SHA512 = e._createHelper(c), t.HmacSHA512 = e._createHmacHelper(c)
|
||||
}(), n.SHA512)
|
||||
},
|
||||
7628: function(t, e, r) {
|
||||
var n;
|
||||
t.exports = (n = r(9021), r(754), r(4636), r(9506), r(7165), function() {
|
||||
var t = n,
|
||||
e = t.lib,
|
||||
r = e.WordArray,
|
||||
i = e.BlockCipher,
|
||||
o = t.algo,
|
||||
s = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4],
|
||||
a = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32],
|
||||
f = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
|
||||
u = [{
|
||||
0: 8421888,
|
||||
268435456: 32768,
|
||||
536870912: 8421378,
|
||||
805306368: 2,
|
||||
1073741824: 512,
|
||||
1342177280: 8421890,
|
||||
1610612736: 8389122,
|
||||
1879048192: 8388608,
|
||||
2147483648: 514,
|
||||
2415919104: 8389120,
|
||||
2684354560: 33280,
|
||||
2952790016: 8421376,
|
||||
3221225472: 32770,
|
||||
3489660928: 8388610,
|
||||
3758096384: 0,
|
||||
4026531840: 33282,
|
||||
134217728: 0,
|
||||
402653184: 8421890,
|
||||
671088640: 33282,
|
||||
939524096: 32768,
|
||||
1207959552: 8421888,
|
||||
1476395008: 512,
|
||||
1744830464: 8421378,
|
||||
2013265920: 2,
|
||||
2281701376: 8389120,
|
||||
2550136832: 33280,
|
||||
2818572288: 8421376,
|
||||
3087007744: 8389122,
|
||||
3355443200: 8388610,
|
||||
3623878656: 32770,
|
||||
3892314112: 514,
|
||||
4160749568: 8388608,
|
||||
1: 32768,
|
||||
268435457: 2,
|
||||
536870913: 8421888,
|
||||
805306369: 8388608,
|
||||
1073741825: 8421378,
|
||||
1342177281: 33280,
|
||||
1610612737: 512,
|
||||
1879048193: 8389122,
|
||||
2147483649: 8421890,
|
||||
2415919105: 8421376,
|
||||
2684354561: 8388610,
|
||||
2952790017: 33282,
|
||||
3221225473: 514,
|
||||
3489660929: 8389120,
|
||||
3758096385: 32770,
|
||||
4026531841: 0,
|
||||
134217729: 8421890,
|
||||
402653185: 8421376,
|
||||
671088641: 8388608,
|
||||
939524097: 512,
|
||||
1207959553: 32768,
|
||||
1476395009: 8388610,
|
||||
1744830465: 2,
|
||||
2013265921: 33282,
|
||||
2281701377: 32770,
|
||||
2550136833: 8389122,
|
||||
2818572289: 514,
|
||||
3087007745: 8421888,
|
||||
3355443201: 8389120,
|
||||
3623878657: 0,
|
||||
3892314113: 33280,
|
||||
4160749569: 8421378
|
||||
}, {
|
||||
0: 1074282512,
|
||||
16777216: 16384,
|
||||
33554432: 524288,
|
||||
50331648: 1074266128,
|
||||
67108864: 1073741840,
|
||||
83886080: 1074282496,
|
||||
100663296: 1073758208,
|
||||
117440512: 16,
|
||||
134217728: 540672,
|
||||
150994944: 1073758224,
|
||||
167772160: 1073741824,
|
||||
184549376: 540688,
|
||||
201326592: 524304,
|
||||
218103808: 0,
|
||||
234881024: 16400,
|
||||
251658240: 1074266112,
|
||||
8388608: 1073758208,
|
||||
25165824: 540688,
|
||||
41943040: 16,
|
||||
58720256: 1073758224,
|
||||
75497472: 1074282512,
|
||||
92274688: 1073741824,
|
||||
109051904: 524288,
|
||||
125829120: 1074266128,
|
||||
142606336: 524304,
|
||||
159383552: 0,
|
||||
176160768: 16384,
|
||||
192937984: 1074266112,
|
||||
209715200: 1073741840,
|
||||
226492416: 540672,
|
||||
243269632: 1074282496,
|
||||
260046848: 16400,
|
||||
268435456: 0,
|
||||
285212672: 1074266128,
|
||||
301989888: 1073758224,
|
||||
318767104: 1074282496,
|
||||
335544320: 1074266112,
|
||||
352321536: 16,
|
||||
369098752: 540688,
|
||||
385875968: 16384,
|
||||
402653184: 16400,
|
||||
419430400: 524288,
|
||||
436207616: 524304,
|
||||
452984832: 1073741840,
|
||||
469762048: 540672,
|
||||
486539264: 1073758208,
|
||||
503316480: 1073741824,
|
||||
520093696: 1074282512,
|
||||
276824064: 540688,
|
||||
293601280: 524288,
|
||||
310378496: 1074266112,
|
||||
327155712: 16384,
|
||||
343932928: 1073758208,
|
||||
360710144: 1074282512,
|
||||
377487360: 16,
|
||||
394264576: 1073741824,
|
||||
411041792: 1074282496,
|
||||
427819008: 1073741840,
|
||||
444596224: 1073758224,
|
||||
461373440: 524304,
|
||||
478150656: 0,
|
||||
494927872: 16400,
|
||||
511705088: 1074266128,
|
||||
528482304: 540672
|
||||
}, {
|
||||
0: 260,
|
||||
1048576: 0,
|
||||
2097152: 67109120,
|
||||
3145728: 65796,
|
||||
4194304: 65540,
|
||||
5242880: 67108868,
|
||||
6291456: 67174660,
|
||||
7340032: 67174400,
|
||||
8388608: 67108864,
|
||||
9437184: 67174656,
|
||||
10485760: 65792,
|
||||
11534336: 67174404,
|
||||
12582912: 67109124,
|
||||
13631488: 65536,
|
||||
14680064: 4,
|
||||
15728640: 256,
|
||||
524288: 67174656,
|
||||
1572864: 67174404,
|
||||
2621440: 0,
|
||||
3670016: 67109120,
|
||||
4718592: 67108868,
|
||||
5767168: 65536,
|
||||
6815744: 65540,
|
||||
7864320: 260,
|
||||
8912896: 4,
|
||||
9961472: 256,
|
||||
11010048: 67174400,
|
||||
12058624: 65796,
|
||||
13107200: 65792,
|
||||
14155776: 67109124,
|
||||
15204352: 67174660,
|
||||
16252928: 67108864,
|
||||
16777216: 67174656,
|
||||
17825792: 65540,
|
||||
18874368: 65536,
|
||||
19922944: 67109120,
|
||||
20971520: 256,
|
||||
22020096: 67174660,
|
||||
23068672: 67108868,
|
||||
24117248: 0,
|
||||
25165824: 67109124,
|
||||
26214400: 67108864,
|
||||
27262976: 4,
|
||||
28311552: 65792,
|
||||
29360128: 67174400,
|
||||
30408704: 260,
|
||||
31457280: 65796,
|
||||
32505856: 67174404,
|
||||
17301504: 67108864,
|
||||
18350080: 260,
|
||||
19398656: 67174656,
|
||||
20447232: 0,
|
||||
21495808: 65540,
|
||||
22544384: 67109120,
|
||||
23592960: 256,
|
||||
24641536: 67174404,
|
||||
25690112: 65536,
|
||||
26738688: 67174660,
|
||||
27787264: 65796,
|
||||
28835840: 67108868,
|
||||
29884416: 67109124,
|
||||
30932992: 67174400,
|
||||
31981568: 4,
|
||||
33030144: 65792
|
||||
}, {
|
||||
0: 2151682048,
|
||||
65536: 2147487808,
|
||||
131072: 4198464,
|
||||
196608: 2151677952,
|
||||
262144: 0,
|
||||
327680: 4198400,
|
||||
393216: 2147483712,
|
||||
458752: 4194368,
|
||||
524288: 2147483648,
|
||||
589824: 4194304,
|
||||
655360: 64,
|
||||
720896: 2147487744,
|
||||
786432: 2151678016,
|
||||
851968: 4160,
|
||||
917504: 4096,
|
||||
983040: 2151682112,
|
||||
32768: 2147487808,
|
||||
98304: 64,
|
||||
163840: 2151678016,
|
||||
229376: 2147487744,
|
||||
294912: 4198400,
|
||||
360448: 2151682112,
|
||||
425984: 0,
|
||||
491520: 2151677952,
|
||||
557056: 4096,
|
||||
622592: 2151682048,
|
||||
688128: 4194304,
|
||||
753664: 4160,
|
||||
819200: 2147483648,
|
||||
884736: 4194368,
|
||||
950272: 4198464,
|
||||
1015808: 2147483712,
|
||||
1048576: 4194368,
|
||||
1114112: 4198400,
|
||||
1179648: 2147483712,
|
||||
1245184: 0,
|
||||
1310720: 4160,
|
||||
1376256: 2151678016,
|
||||
1441792: 2151682048,
|
||||
1507328: 2147487808,
|
||||
1572864: 2151682112,
|
||||
1638400: 2147483648,
|
||||
1703936: 2151677952,
|
||||
1769472: 4198464,
|
||||
1835008: 2147487744,
|
||||
1900544: 4194304,
|
||||
1966080: 64,
|
||||
2031616: 4096,
|
||||
1081344: 2151677952,
|
||||
1146880: 2151682112,
|
||||
1212416: 0,
|
||||
1277952: 4198400,
|
||||
1343488: 4194368,
|
||||
1409024: 2147483648,
|
||||
1474560: 2147487808,
|
||||
1540096: 64,
|
||||
1605632: 2147483712,
|
||||
1671168: 4096,
|
||||
1736704: 2147487744,
|
||||
1802240: 2151678016,
|
||||
1867776: 4160,
|
||||
1933312: 2151682048,
|
||||
1998848: 4194304,
|
||||
2064384: 4198464
|
||||
}, {
|
||||
0: 128,
|
||||
4096: 17039360,
|
||||
8192: 262144,
|
||||
12288: 536870912,
|
||||
16384: 537133184,
|
||||
20480: 16777344,
|
||||
24576: 553648256,
|
||||
28672: 262272,
|
||||
32768: 16777216,
|
||||
36864: 537133056,
|
||||
40960: 536871040,
|
||||
45056: 553910400,
|
||||
49152: 553910272,
|
||||
53248: 0,
|
||||
57344: 17039488,
|
||||
61440: 553648128,
|
||||
2048: 17039488,
|
||||
6144: 553648256,
|
||||
10240: 128,
|
||||
14336: 17039360,
|
||||
18432: 262144,
|
||||
22528: 537133184,
|
||||
26624: 553910272,
|
||||
30720: 536870912,
|
||||
34816: 537133056,
|
||||
38912: 0,
|
||||
43008: 553910400,
|
||||
47104: 16777344,
|
||||
51200: 536871040,
|
||||
55296: 553648128,
|
||||
59392: 16777216,
|
||||
63488: 262272,
|
||||
65536: 262144,
|
||||
69632: 128,
|
||||
73728: 536870912,
|
||||
77824: 553648256,
|
||||
81920: 16777344,
|
||||
86016: 553910272,
|
||||
90112: 537133184,
|
||||
94208: 16777216,
|
||||
98304: 553910400,
|
||||
102400: 553648128,
|
||||
106496: 17039360,
|
||||
110592: 537133056,
|
||||
114688: 262272,
|
||||
118784: 536871040,
|
||||
122880: 0,
|
||||
126976: 17039488,
|
||||
67584: 553648256,
|
||||
71680: 16777216,
|
||||
75776: 17039360,
|
||||
79872: 537133184,
|
||||
83968: 536870912,
|
||||
88064: 17039488,
|
||||
92160: 128,
|
||||
96256: 553910272,
|
||||
100352: 262272,
|
||||
104448: 553910400,
|
||||
108544: 0,
|
||||
112640: 553648128,
|
||||
116736: 16777344,
|
||||
120832: 262144,
|
||||
124928: 537133056,
|
||||
129024: 536871040
|
||||
}, {
|
||||
0: 268435464,
|
||||
256: 8192,
|
||||
512: 270532608,
|
||||
768: 270540808,
|
||||
1024: 268443648,
|
||||
1280: 2097152,
|
||||
1536: 2097160,
|
||||
1792: 268435456,
|
||||
2048: 0,
|
||||
2304: 268443656,
|
||||
2560: 2105344,
|
||||
2816: 8,
|
||||
3072: 270532616,
|
||||
3328: 2105352,
|
||||
3584: 8200,
|
||||
3840: 270540800,
|
||||
128: 270532608,
|
||||
384: 270540808,
|
||||
640: 8,
|
||||
896: 2097152,
|
||||
1152: 2105352,
|
||||
1408: 268435464,
|
||||
1664: 268443648,
|
||||
1920: 8200,
|
||||
2176: 2097160,
|
||||
2432: 8192,
|
||||
2688: 268443656,
|
||||
2944: 270532616,
|
||||
3200: 0,
|
||||
3456: 270540800,
|
||||
3712: 2105344,
|
||||
3968: 268435456,
|
||||
4096: 268443648,
|
||||
4352: 270532616,
|
||||
4608: 270540808,
|
||||
4864: 8200,
|
||||
5120: 2097152,
|
||||
5376: 268435456,
|
||||
5632: 268435464,
|
||||
5888: 2105344,
|
||||
6144: 2105352,
|
||||
6400: 0,
|
||||
6656: 8,
|
||||
6912: 270532608,
|
||||
7168: 8192,
|
||||
7424: 268443656,
|
||||
7680: 270540800,
|
||||
7936: 2097160,
|
||||
4224: 8,
|
||||
4480: 2105344,
|
||||
4736: 2097152,
|
||||
4992: 268435464,
|
||||
5248: 268443648,
|
||||
5504: 8200,
|
||||
5760: 270540808,
|
||||
6016: 270532608,
|
||||
6272: 270540800,
|
||||
6528: 270532616,
|
||||
6784: 8192,
|
||||
7040: 2105352,
|
||||
7296: 2097160,
|
||||
7552: 0,
|
||||
7808: 268435456,
|
||||
8064: 268443656
|
||||
}, {
|
||||
0: 1048576,
|
||||
16: 33555457,
|
||||
32: 1024,
|
||||
48: 1049601,
|
||||
64: 34604033,
|
||||
80: 0,
|
||||
96: 1,
|
||||
112: 34603009,
|
||||
128: 33555456,
|
||||
144: 1048577,
|
||||
160: 33554433,
|
||||
176: 34604032,
|
||||
192: 34603008,
|
||||
208: 1025,
|
||||
224: 1049600,
|
||||
240: 33554432,
|
||||
8: 34603009,
|
||||
24: 0,
|
||||
40: 33555457,
|
||||
56: 34604032,
|
||||
72: 1048576,
|
||||
88: 33554433,
|
||||
104: 33554432,
|
||||
120: 1025,
|
||||
136: 1049601,
|
||||
152: 33555456,
|
||||
168: 34603008,
|
||||
184: 1048577,
|
||||
200: 1024,
|
||||
216: 34604033,
|
||||
232: 1,
|
||||
248: 1049600,
|
||||
256: 33554432,
|
||||
272: 1048576,
|
||||
288: 33555457,
|
||||
304: 34603009,
|
||||
320: 1048577,
|
||||
336: 33555456,
|
||||
352: 34604032,
|
||||
368: 1049601,
|
||||
384: 1025,
|
||||
400: 34604033,
|
||||
416: 1049600,
|
||||
432: 1,
|
||||
448: 0,
|
||||
464: 34603008,
|
||||
480: 33554433,
|
||||
496: 1024,
|
||||
264: 1049600,
|
||||
280: 33555457,
|
||||
296: 34603009,
|
||||
312: 1,
|
||||
328: 33554432,
|
||||
344: 1048576,
|
||||
360: 1025,
|
||||
376: 34604032,
|
||||
392: 33554433,
|
||||
408: 34603008,
|
||||
424: 0,
|
||||
440: 34604033,
|
||||
456: 1049601,
|
||||
472: 1024,
|
||||
488: 33555456,
|
||||
504: 1048577
|
||||
}, {
|
||||
0: 134219808,
|
||||
1: 131072,
|
||||
2: 134217728,
|
||||
3: 32,
|
||||
4: 131104,
|
||||
5: 134350880,
|
||||
6: 134350848,
|
||||
7: 2048,
|
||||
8: 134348800,
|
||||
9: 134219776,
|
||||
10: 133120,
|
||||
11: 134348832,
|
||||
12: 2080,
|
||||
13: 0,
|
||||
14: 134217760,
|
||||
15: 133152,
|
||||
2147483648: 2048,
|
||||
2147483649: 134350880,
|
||||
2147483650: 134219808,
|
||||
2147483651: 134217728,
|
||||
2147483652: 134348800,
|
||||
2147483653: 133120,
|
||||
2147483654: 133152,
|
||||
2147483655: 32,
|
||||
2147483656: 134217760,
|
||||
2147483657: 2080,
|
||||
2147483658: 131104,
|
||||
2147483659: 134350848,
|
||||
2147483660: 0,
|
||||
2147483661: 134348832,
|
||||
2147483662: 134219776,
|
||||
2147483663: 131072,
|
||||
16: 133152,
|
||||
17: 134350848,
|
||||
18: 32,
|
||||
19: 2048,
|
||||
20: 134219776,
|
||||
21: 134217760,
|
||||
22: 134348832,
|
||||
23: 131072,
|
||||
24: 0,
|
||||
25: 131104,
|
||||
26: 134348800,
|
||||
27: 134219808,
|
||||
28: 134350880,
|
||||
29: 133120,
|
||||
30: 2080,
|
||||
31: 134217728,
|
||||
2147483664: 131072,
|
||||
2147483665: 2048,
|
||||
2147483666: 134348832,
|
||||
2147483667: 133152,
|
||||
2147483668: 32,
|
||||
2147483669: 134348800,
|
||||
2147483670: 134217728,
|
||||
2147483671: 134219808,
|
||||
2147483672: 134350880,
|
||||
2147483673: 134217760,
|
||||
2147483674: 134219776,
|
||||
2147483675: 0,
|
||||
2147483676: 133120,
|
||||
2147483677: 2080,
|
||||
2147483678: 131104,
|
||||
2147483679: 134350848
|
||||
}],
|
||||
c = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
|
||||
h = o.DES = i.extend({
|
||||
_doReset: function() {
|
||||
for (var t = this._key.words, e = [], r = 0; r < 56; r++) {
|
||||
var n = s[r] - 1;
|
||||
e[r] = t[n >>> 5] >>> 31 - n % 32 & 1
|
||||
}
|
||||
for (var i = this._subKeys = [], o = 0; o < 16; o++) {
|
||||
var u = i[o] = [],
|
||||
c = f[o];
|
||||
for (r = 0; r < 24; r++) u[r / 6 | 0] |= e[(a[r] - 1 + c) % 28] << 31 - r % 6, u[4 + (r / 6 | 0)] |= e[28 + (a[r + 24] - 1 + c) % 28] << 31 - r % 6;
|
||||
for (u[0] = u[0] << 1 | u[0] >>> 31, r = 1; r < 7; r++) u[r] = u[r] >>> 4 * (r - 1) + 3;
|
||||
u[7] = u[7] << 5 | u[7] >>> 27
|
||||
}
|
||||
var h = this._invSubKeys = [];
|
||||
for (r = 0; r < 16; r++) h[r] = i[15 - r]
|
||||
},
|
||||
encryptBlock: function(t, e) {
|
||||
this._doCryptBlock(t, e, this._subKeys)
|
||||
},
|
||||
decryptBlock: function(t, e) {
|
||||
this._doCryptBlock(t, e, this._invSubKeys)
|
||||
},
|
||||
_doCryptBlock: function(t, e, r) {
|
||||
this._lBlock = t[e], this._rBlock = t[e + 1], p.call(this, 4, 252645135), p.call(this, 16, 65535), l.call(this, 2, 858993459), l.call(this, 8, 16711935), p.call(this, 1, 1431655765);
|
||||
for (var n = 0; n < 16; n++) {
|
||||
for (var i = r[n], o = this._lBlock, s = this._rBlock, a = 0, f = 0; f < 8; f++) a |= u[f][((s ^ i[f]) & c[f]) >>> 0];
|
||||
this._lBlock = s, this._rBlock = o ^ a
|
||||
}
|
||||
var h = this._lBlock;
|
||||
this._lBlock = this._rBlock, this._rBlock = h, p.call(this, 1, 1431655765), l.call(this, 8, 16711935), l.call(this, 2, 858993459), p.call(this, 16, 65535), p.call(this, 4, 252645135), t[e] = this._lBlock, t[e + 1] = this._rBlock
|
||||
},
|
||||
keySize: 2,
|
||||
ivSize: 2,
|
||||
blockSize: 2
|
||||
});
|
||||
|
||||
function p(t, e) {
|
||||
var r = (this._lBlock >>> t ^ this._rBlock) & e;
|
||||
this._rBlock ^= r, this._lBlock ^= r << t
|
||||
}
|
||||
function l(t, e) {
|
||||
var r = (this._rBlock >>> t ^ this._lBlock) & e;
|
||||
this._lBlock ^= r, this._rBlock ^= r << t
|
||||
}
|
||||
t.DES = i._createHelper(h);
|
||||
var y = o.TripleDES = i.extend({
|
||||
_doReset: function() {
|
||||
var t = this._key.words;
|
||||
this._des1 = h.createEncryptor(r.create(t.slice(0, 2))), this._des2 = h.createEncryptor(r.create(t.slice(2, 4))), this._des3 = h.createEncryptor(r.create(t.slice(4, 6)))
|
||||
},
|
||||
encryptBlock: function(t, e) {
|
||||
this._des1.encryptBlock(t, e), this._des2.decryptBlock(t, e), this._des3.encryptBlock(t, e)
|
||||
},
|
||||
decryptBlock: function(t, e) {
|
||||
this._des3.decryptBlock(t, e), this._des2.encryptBlock(t, e), this._des1.decryptBlock(t, e)
|
||||
},
|
||||
keySize: 6,
|
||||
ivSize: 2,
|
||||
blockSize: 2
|
||||
});
|
||||
t.TripleDES = i._createHelper(y)
|
||||
}(), n.TripleDES)
|
||||
},
|
||||
3240: function(t, e, r) {
|
||||
var n, i, o, s, a, f;
|
||||
t.exports = (n = r(9021), o = (i = n)
|
||||
.lib, s = o.Base, a = o.WordArray, (f = i.x64 = {})
|
||||
.Word = s.extend({
|
||||
init: function(t, e) {
|
||||
this.high = t, this.low = e
|
||||
}
|
||||
}), f.WordArray = s.extend({
|
||||
init: function(t, e) {
|
||||
t = this.words = t || [], this.sigBytes = null != e ? e : 8 * t.length
|
||||
},
|
||||
toX32: function() {
|
||||
for (var t = this.words, e = t.length, r = [], n = 0; n < e; n++) {
|
||||
var i = t[n];
|
||||
r.push(i.high), r.push(i.low)
|
||||
}
|
||||
return a.create(r, this.sigBytes)
|
||||
},
|
||||
clone: function() {
|
||||
for (var t = s.clone.call(this), e = t.words = this.words.slice(0), r = e.length, n = 0; n < r; n++) e[n] = e[n].clone();
|
||||
return t
|
||||
}
|
||||
}), n)
|
||||
},
|
||||
41: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(655),
|
||||
i = r(8068),
|
||||
o = r(9675),
|
||||
s = r(5795);
|
||||
t.exports = function(t, e, r) {
|
||||
if (!t || "object" != typeof t && "function" != typeof t) throw new o("`obj` must be an object or a function`");
|
||||
if ("string" != typeof e && "symbol" != typeof e) throw new o("`property` must be a string or a symbol`");
|
||||
if (arguments.length > 3 && "boolean" != typeof arguments[3] && null !== arguments[3]) throw new o("`nonEnumerable`, if provided, must be a boolean or null");
|
||||
if (arguments.length > 4 && "boolean" != typeof arguments[4] && null !== arguments[4]) throw new o("`nonWritable`, if provided, must be a boolean or null");
|
||||
if (arguments.length > 5 && "boolean" != typeof arguments[5] && null !== arguments[5]) throw new o("`nonConfigurable`, if provided, must be a boolean or null");
|
||||
if (arguments.length > 6 && "boolean" != typeof arguments[6]) throw new o("`loose`, if provided, must be a boolean");
|
||||
var a = arguments.length > 3 ? arguments[3] : null,
|
||||
f = arguments.length > 4 ? arguments[4] : null,
|
||||
u = arguments.length > 5 ? arguments[5] : null,
|
||||
c = arguments.length > 6 && arguments[6],
|
||||
h = !! s && s(t, e);
|
||||
if (n) n(t, e, {
|
||||
configurable: null === u && h ? h.configurable : !u,
|
||||
enumerable: null === a && h ? h.enumerable : !a,
|
||||
value: r,
|
||||
writable: null === f && h ? h.writable : !f
|
||||
});
|
||||
else {
|
||||
if (!c && (a || f || u)) throw new i("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");
|
||||
t[e] = r
|
||||
}
|
||||
}
|
||||
},
|
||||
655: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(453)("%Object.defineProperty%", !0) || !1;
|
||||
if (n) try {
|
||||
n({}, "a", {
|
||||
value: 1
|
||||
})
|
||||
} catch (t) {
|
||||
n = !1
|
||||
}
|
||||
t.exports = n
|
||||
},
|
||||
1237: t => {
|
||||
"use strict";
|
||||
t.exports = EvalError
|
||||
},
|
||||
9383: t => {
|
||||
"use strict";
|
||||
t.exports = Error
|
||||
},
|
||||
9290: t => {
|
||||
"use strict";
|
||||
t.exports = RangeError
|
||||
},
|
||||
9538: t => {
|
||||
"use strict";
|
||||
t.exports = ReferenceError
|
||||
},
|
||||
8068: t => {
|
||||
"use strict";
|
||||
t.exports = SyntaxError
|
||||
},
|
||||
9675: t => {
|
||||
"use strict";
|
||||
t.exports = TypeError
|
||||
},
|
||||
5345: t => {
|
||||
"use strict";
|
||||
t.exports = URIError
|
||||
},
|
||||
9353: t => {
|
||||
"use strict";
|
||||
var e = Object.prototype.toString,
|
||||
r = Math.max,
|
||||
n = function(t, e) {
|
||||
for (var r = [], n = 0; n < t.length; n += 1) r[n] = t[n];
|
||||
for (var i = 0; i < e.length; i += 1) r[i + t.length] = e[i];
|
||||
return r
|
||||
};
|
||||
t.exports = function(t) {
|
||||
var i = this;
|
||||
if ("function" != typeof i || "[object Function]" !== e.apply(i)) throw new TypeError("Function.prototype.bind called on incompatible " + i);
|
||||
for (var o, s = function(t, e) {
|
||||
for (var r = [], n = 1, i = 0; n < t.length; n += 1, i += 1) r[i] = t[n];
|
||||
return r
|
||||
}(arguments), a = r(0, i.length - s.length), f = [], u = 0; u < a; u++) f[u] = "$" + u;
|
||||
if (o = Function("binder", "return function (" + function(t, e) {
|
||||
for (var r = "", n = 0; n < t.length; n += 1) r += t[n], n + 1 < t.length && (r += ",");
|
||||
return r
|
||||
}(f) + "){ return binder.apply(this,arguments); }")((function() {
|
||||
if (this instanceof o) {
|
||||
var e = i.apply(this, n(s, arguments));
|
||||
return Object(e) === e ? e : this
|
||||
}
|
||||
return i.apply(t, n(s, arguments))
|
||||
})), i.prototype) {
|
||||
var c = function() {};
|
||||
c.prototype = i.prototype, o.prototype = new c, c.prototype = null
|
||||
}
|
||||
return o
|
||||
}
|
||||
},
|
||||
6743: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(9353);
|
||||
t.exports = Function.prototype.bind || n
|
||||
},
|
||||
453: (t, e, r) => {
|
||||
"use strict";
|
||||
var n, i = r(9383),
|
||||
o = r(1237),
|
||||
s = r(9290),
|
||||
a = r(9538),
|
||||
f = r(8068),
|
||||
u = r(9675),
|
||||
c = r(5345),
|
||||
h = Function,
|
||||
p = function(t) {
|
||||
try {
|
||||
return h('"use strict"; return (' + t + ").constructor;")()
|
||||
} catch (t) {}
|
||||
}, l = Object.getOwnPropertyDescriptor;
|
||||
if (l) try {
|
||||
l({}, "")
|
||||
} catch (t) {
|
||||
l = null
|
||||
}
|
||||
var y = function() {
|
||||
throw new u
|
||||
}, g = l ? function() {
|
||||
try {
|
||||
return y
|
||||
} catch (t) {
|
||||
try {
|
||||
return l(arguments, "callee")
|
||||
.get
|
||||
} catch (t) {
|
||||
return y
|
||||
}
|
||||
}
|
||||
}() : y,
|
||||
d = r(4039)(),
|
||||
v = r(24)(),
|
||||
m = Object.getPrototypeOf || (v ? function(t) {
|
||||
return t.__proto__
|
||||
} : null),
|
||||
S = {}, _ = "undefined" != typeof Uint8Array && m ? m(Uint8Array) : n,
|
||||
b = {
|
||||
__proto__: null,
|
||||
"%AggregateError%": "undefined" == typeof AggregateError ? n : AggregateError,
|
||||
"%Array%": Array,
|
||||
"%ArrayBuffer%": "undefined" == typeof ArrayBuffer ? n : ArrayBuffer,
|
||||
"%ArrayIteratorPrototype%": d && m ? m([][Symbol.iterator]()) : n,
|
||||
"%AsyncFromSyncIteratorPrototype%": n,
|
||||
"%AsyncFunction%": S,
|
||||
"%AsyncGenerator%": S,
|
||||
"%AsyncGeneratorFunction%": S,
|
||||
"%AsyncIteratorPrototype%": S,
|
||||
"%Atomics%": "undefined" == typeof Atomics ? n : Atomics,
|
||||
"%BigInt%": "undefined" == typeof BigInt ? n : BigInt,
|
||||
"%BigInt64Array%": "undefined" == typeof BigInt64Array ? n : BigInt64Array,
|
||||
"%BigUint64Array%": "undefined" == typeof BigUint64Array ? n : BigUint64Array,
|
||||
"%Boolean%": Boolean,
|
||||
"%DataView%": "undefined" == typeof DataView ? n : DataView,
|
||||
"%Date%": Date,
|
||||
"%decodeURI%": decodeURI,
|
||||
"%decodeURIComponent%": decodeURIComponent,
|
||||
"%encodeURI%": encodeURI,
|
||||
"%encodeURIComponent%": encodeURIComponent,
|
||||
"%Error%": i,
|
||||
"%eval%": eval,
|
||||
"%EvalError%": o,
|
||||
"%Float32Array%": "undefined" == typeof Float32Array ? n : Float32Array,
|
||||
"%Float64Array%": "undefined" == typeof Float64Array ? n : Float64Array,
|
||||
"%FinalizationRegistry%": "undefined" == typeof FinalizationRegistry ? n : FinalizationRegistry,
|
||||
"%Function%": h,
|
||||
"%GeneratorFunction%": S,
|
||||
"%Int8Array%": "undefined" == typeof Int8Array ? n : Int8Array,
|
||||
"%Int16Array%": "undefined" == typeof Int16Array ? n : Int16Array,
|
||||
"%Int32Array%": "undefined" == typeof Int32Array ? n : Int32Array,
|
||||
"%isFinite%": isFinite,
|
||||
"%isNaN%": isNaN,
|
||||
"%IteratorPrototype%": d && m ? m(m([][Symbol.iterator]())) : n,
|
||||
"%JSON%": "object" == typeof JSON ? JSON : n,
|
||||
"%Map%": "undefined" == typeof Map ? n : Map,
|
||||
"%MapIteratorPrototype%": "undefined" != typeof Map && d && m ? m((new Map)[Symbol.iterator]()) : n,
|
||||
"%Math%": Math,
|
||||
"%Number%": Number,
|
||||
"%Object%": Object,
|
||||
"%parseFloat%": parseFloat,
|
||||
"%parseInt%": parseInt,
|
||||
"%Promise%": "undefined" == typeof Promise ? n : Promise,
|
||||
"%Proxy%": "undefined" == typeof Proxy ? n : Proxy,
|
||||
"%RangeError%": s,
|
||||
"%ReferenceError%": a,
|
||||
"%Reflect%": "undefined" == typeof Reflect ? n : Reflect,
|
||||
"%RegExp%": RegExp,
|
||||
"%Set%": "undefined" == typeof Set ? n : Set,
|
||||
"%SetIteratorPrototype%": "undefined" != typeof Set && d && m ? m((new Set)[Symbol.iterator]()) : n,
|
||||
"%SharedArrayBuffer%": "undefined" == typeof SharedArrayBuffer ? n : SharedArrayBuffer,
|
||||
"%String%": String,
|
||||
"%StringIteratorPrototype%": d && m ? m("" [Symbol.iterator]()) : n,
|
||||
"%Symbol%": d ? Symbol : n,
|
||||
"%SyntaxError%": f,
|
||||
"%ThrowTypeError%": g,
|
||||
"%TypedArray%": _,
|
||||
"%TypeError%": u,
|
||||
"%Uint8Array%": "undefined" == typeof Uint8Array ? n : Uint8Array,
|
||||
"%Uint8ClampedArray%": "undefined" == typeof Uint8ClampedArray ? n : Uint8ClampedArray,
|
||||
"%Uint16Array%": "undefined" == typeof Uint16Array ? n : Uint16Array,
|
||||
"%Uint32Array%": "undefined" == typeof Uint32Array ? n : Uint32Array,
|
||||
"%URIError%": c,
|
||||
"%WeakMap%": "undefined" == typeof WeakMap ? n : WeakMap,
|
||||
"%WeakRef%": "undefined" == typeof WeakRef ? n : WeakRef,
|
||||
"%WeakSet%": "undefined" == typeof WeakSet ? n : WeakSet
|
||||
};
|
||||
if (m) try {
|
||||
null.error
|
||||
} catch (t) {
|
||||
var E = m(m(t));
|
||||
b["%Error.prototype%"] = E
|
||||
}
|
||||
var w = function t(e) {
|
||||
var r;
|
||||
if ("%AsyncFunction%" === e) r = p("async function () {}");
|
||||
else if ("%GeneratorFunction%" === e) r = p("function* () {}");
|
||||
else if ("%AsyncGeneratorFunction%" === e) r = p("async function* () {}");
|
||||
else if ("%AsyncGenerator%" === e) {
|
||||
var n = t("%AsyncGeneratorFunction%");
|
||||
n && (r = n.prototype)
|
||||
} else if ("%AsyncIteratorPrototype%" === e) {
|
||||
var i = t("%AsyncGenerator%");
|
||||
i && m && (r = m(i.prototype))
|
||||
}
|
||||
return b[e] = r, r
|
||||
}, O = {
|
||||
__proto__: null,
|
||||
"%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"],
|
||||
"%ArrayPrototype%": ["Array", "prototype"],
|
||||
"%ArrayProto_entries%": ["Array", "prototype", "entries"],
|
||||
"%ArrayProto_forEach%": ["Array", "prototype", "forEach"],
|
||||
"%ArrayProto_keys%": ["Array", "prototype", "keys"],
|
||||
"%ArrayProto_values%": ["Array", "prototype", "values"],
|
||||
"%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"],
|
||||
"%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"],
|
||||
"%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"],
|
||||
"%BooleanPrototype%": ["Boolean", "prototype"],
|
||||
"%DataViewPrototype%": ["DataView", "prototype"],
|
||||
"%DatePrototype%": ["Date", "prototype"],
|
||||
"%ErrorPrototype%": ["Error", "prototype"],
|
||||
"%EvalErrorPrototype%": ["EvalError", "prototype"],
|
||||
"%Float32ArrayPrototype%": ["Float32Array", "prototype"],
|
||||
"%Float64ArrayPrototype%": ["Float64Array", "prototype"],
|
||||
"%FunctionPrototype%": ["Function", "prototype"],
|
||||
"%Generator%": ["GeneratorFunction", "prototype"],
|
||||
"%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"],
|
||||
"%Int8ArrayPrototype%": ["Int8Array", "prototype"],
|
||||
"%Int16ArrayPrototype%": ["Int16Array", "prototype"],
|
||||
"%Int32ArrayPrototype%": ["Int32Array", "prototype"],
|
||||
"%JSONParse%": ["JSON", "parse"],
|
||||
"%JSONStringify%": ["JSON", "stringify"],
|
||||
"%MapPrototype%": ["Map", "prototype"],
|
||||
"%NumberPrototype%": ["Number", "prototype"],
|
||||
"%ObjectPrototype%": ["Object", "prototype"],
|
||||
"%ObjProto_toString%": ["Object", "prototype", "toString"],
|
||||
"%ObjProto_valueOf%": ["Object", "prototype", "valueOf"],
|
||||
"%PromisePrototype%": ["Promise", "prototype"],
|
||||
"%PromiseProto_then%": ["Promise", "prototype", "then"],
|
||||
"%Promise_all%": ["Promise", "all"],
|
||||
"%Promise_reject%": ["Promise", "reject"],
|
||||
"%Promise_resolve%": ["Promise", "resolve"],
|
||||
"%RangeErrorPrototype%": ["RangeError", "prototype"],
|
||||
"%ReferenceErrorPrototype%": ["ReferenceError", "prototype"],
|
||||
"%RegExpPrototype%": ["RegExp", "prototype"],
|
||||
"%SetPrototype%": ["Set", "prototype"],
|
||||
"%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"],
|
||||
"%StringPrototype%": ["String", "prototype"],
|
||||
"%SymbolPrototype%": ["Symbol", "prototype"],
|
||||
"%SyntaxErrorPrototype%": ["SyntaxError", "prototype"],
|
||||
"%TypedArrayPrototype%": ["TypedArray", "prototype"],
|
||||
"%TypeErrorPrototype%": ["TypeError", "prototype"],
|
||||
"%Uint8ArrayPrototype%": ["Uint8Array", "prototype"],
|
||||
"%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"],
|
||||
"%Uint16ArrayPrototype%": ["Uint16Array", "prototype"],
|
||||
"%Uint32ArrayPrototype%": ["Uint32Array", "prototype"],
|
||||
"%URIErrorPrototype%": ["URIError", "prototype"],
|
||||
"%WeakMapPrototype%": ["WeakMap", "prototype"],
|
||||
"%WeakSetPrototype%": ["WeakSet", "prototype"]
|
||||
}, B = r(6743),
|
||||
A = r(9957),
|
||||
x = B.call(Function.call, Array.prototype.concat),
|
||||
P = B.call(Function.apply, Array.prototype.splice),
|
||||
T = B.call(Function.call, String.prototype.replace),
|
||||
I = B.call(Function.call, String.prototype.slice),
|
||||
k = B.call(Function.call, RegExp.prototype.exec),
|
||||
D = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,
|
||||
R = /\\(\\)?/g,
|
||||
N = function(t, e) {
|
||||
var r, n = t;
|
||||
if (A(O, n) && (n = "%" + (r = O[n])[0] + "%"), A(b, n)) {
|
||||
var i = b[n];
|
||||
if (i === S && (i = w(n)), void 0 === i && !e) throw new u("intrinsic " + t + " exists, but is not available. Please file an issue!");
|
||||
return {
|
||||
alias: r,
|
||||
name: n,
|
||||
value: i
|
||||
}
|
||||
}
|
||||
throw new f("intrinsic " + t + " does not exist!")
|
||||
};
|
||||
t.exports = function(t, e) {
|
||||
if ("string" != typeof t || 0 === t.length) throw new u("intrinsic name must be a non-empty string");
|
||||
if (arguments.length > 1 && "boolean" != typeof e) throw new u('"allowMissing" argument must be a boolean');
|
||||
if (null === k(/^%?[^%]*%?$/, t)) throw new f("`%` may not be present anywhere but at the beginning and end of the intrinsic name");
|
||||
var r = function(t) {
|
||||
var e = I(t, 0, 1),
|
||||
r = I(t, -1);
|
||||
if ("%" === e && "%" !== r) throw new f("invalid intrinsic syntax, expected closing `%`");
|
||||
if ("%" === r && "%" !== e) throw new f("invalid intrinsic syntax, expected opening `%`");
|
||||
var n = [];
|
||||
return T(t, D, (function(t, e, r, i) {
|
||||
n[n.length] = r ? T(i, R, "$1") : e || t
|
||||
})), n
|
||||
}(t),
|
||||
n = r.length > 0 ? r[0] : "",
|
||||
i = N("%" + n + "%", e),
|
||||
o = i.name,
|
||||
s = i.value,
|
||||
a = !1,
|
||||
c = i.alias;
|
||||
c && (n = c[0], P(r, x([0, 1], c)));
|
||||
for (var h = 1, p = !0; h < r.length; h += 1) {
|
||||
var y = r[h],
|
||||
g = I(y, 0, 1),
|
||||
d = I(y, -1);
|
||||
if (('"' === g || "'" === g || "`" === g || '"' === d || "'" === d || "`" === d) && g !== d) throw new f("property names with quotes must have matching quotes");
|
||||
if ("constructor" !== y && p || (a = !0), A(b, o = "%" + (n += "." + y) + "%")) s = b[o];
|
||||
else if (null != s) {
|
||||
if (!(y in s)) {
|
||||
if (!e) throw new u("base intrinsic for " + t + " exists, but the property is not available.");
|
||||
return
|
||||
}
|
||||
if (l && h + 1 >= r.length) {
|
||||
var v = l(s, y);
|
||||
s = (p = !! v) && "get" in v && !("originalValue" in v.get) ? v.get : s[y]
|
||||
} else p = A(s, y), s = s[y];
|
||||
p && !a && (b[o] = s)
|
||||
}
|
||||
}
|
||||
return s
|
||||
}
|
||||
},
|
||||
5795: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(453)("%Object.getOwnPropertyDescriptor%", !0);
|
||||
if (n) try {
|
||||
n([], "length")
|
||||
} catch (t) {
|
||||
n = null
|
||||
}
|
||||
t.exports = n
|
||||
},
|
||||
592: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(655),
|
||||
i = function() {
|
||||
return !!n
|
||||
};
|
||||
i.hasArrayLengthDefineBug = function() {
|
||||
if (!n) return null;
|
||||
try {
|
||||
return 1 !== n([], "length", {
|
||||
value: 1
|
||||
})
|
||||
.length
|
||||
} catch (t) {
|
||||
return !0
|
||||
}
|
||||
}, t.exports = i
|
||||
},
|
||||
24: t => {
|
||||
"use strict";
|
||||
var e = {
|
||||
__proto__: null,
|
||||
foo: {}
|
||||
}, r = Object;
|
||||
t.exports = function() {
|
||||
return {
|
||||
__proto__: e
|
||||
}.foo === e.foo && !(e instanceof r)
|
||||
}
|
||||
},
|
||||
4039: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = "undefined" != typeof Symbol && Symbol,
|
||||
i = r(1333);
|
||||
t.exports = function() {
|
||||
return "function" == typeof n && "function" == typeof Symbol && "symbol" == typeof n("foo") && "symbol" == typeof Symbol("bar") && i()
|
||||
}
|
||||
},
|
||||
1333: t => {
|
||||
"use strict";
|
||||
t.exports = function() {
|
||||
if ("function" != typeof Symbol || "function" != typeof Object.getOwnPropertySymbols) return !1;
|
||||
if ("symbol" == typeof Symbol.iterator) return !0;
|
||||
var t = {}, e = Symbol("test"),
|
||||
r = Object(e);
|
||||
if ("string" == typeof e) return !1;
|
||||
if ("[object Symbol]" !== Object.prototype.toString.call(e)) return !1;
|
||||
if ("[object Symbol]" !== Object.prototype.toString.call(r)) return !1;
|
||||
for (e in t[e] = 42, t) return !1;
|
||||
if ("function" == typeof Object.keys && 0 !== Object.keys(t)
|
||||
.length) return !1;
|
||||
if ("function" == typeof Object.getOwnPropertyNames && 0 !== Object.getOwnPropertyNames(t)
|
||||
.length) return !1;
|
||||
var n = Object.getOwnPropertySymbols(t);
|
||||
if (1 !== n.length || n[0] !== e) return !1;
|
||||
if (!Object.prototype.propertyIsEnumerable.call(t, e)) return !1;
|
||||
if ("function" == typeof Object.getOwnPropertyDescriptor) {
|
||||
var i = Object.getOwnPropertyDescriptor(t, e);
|
||||
if (42 !== i.value || !0 !== i.enumerable) return !1
|
||||
}
|
||||
return !0
|
||||
}
|
||||
},
|
||||
9957: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = Function.prototype.call,
|
||||
i = Object.prototype.hasOwnProperty,
|
||||
o = r(6743);
|
||||
t.exports = o.call(n, i)
|
||||
},
|
||||
251: (t, e) => {
|
||||
e.read = function(t, e, r, n, i) {
|
||||
var o, s, a = 8 * i - n - 1,
|
||||
f = (1 << a) - 1,
|
||||
u = f >> 1,
|
||||
c = -7,
|
||||
h = r ? i - 1 : 0,
|
||||
p = r ? -1 : 1,
|
||||
l = t[e + h];
|
||||
for (h += p, o = l & (1 << -c) - 1, l >>= -c, c += a; c > 0; o = 256 * o + t[e + h], h += p, c -= 8);
|
||||
for (s = o & (1 << -c) - 1, o >>= -c, c += n; c > 0; s = 256 * s + t[e + h], h += p, c -= 8);
|
||||
if (0 === o) o = 1 - u;
|
||||
else {
|
||||
if (o === f) return s ? NaN : 1 / 0 * (l ? -1 : 1);
|
||||
s += Math.pow(2, n), o -= u
|
||||
}
|
||||
return (l ? -1 : 1) * s * Math.pow(2, o - n)
|
||||
}, e.write = function(t, e, r, n, i, o) {
|
||||
var s, a, f, u = 8 * o - i - 1,
|
||||
c = (1 << u) - 1,
|
||||
h = c >> 1,
|
||||
p = 23 === i ? Math.pow(2, -24) - Math.pow(2, -77) : 0,
|
||||
l = n ? 0 : o - 1,
|
||||
y = n ? 1 : -1,
|
||||
g = e < 0 || 0 === e && 1 / e < 0 ? 1 : 0;
|
||||
for (e = Math.abs(e), isNaN(e) || e === 1 / 0 ? (a = isNaN(e) ? 1 : 0, s = c) : (s = Math.floor(Math.log(e) / Math.LN2), e * (f = Math.pow(2, -s)) < 1 && (s--, f *= 2), (e += s + h >= 1 ? p / f : p * Math.pow(2, 1 - h)) * f >= 2 && (s++, f /= 2), s + h >= c ? (a = 0, s = c) : s + h >= 1 ? (a = (e * f - 1) * Math.pow(2, i), s += h) : (a = e * Math.pow(2, h - 1) * Math.pow(2, i), s = 0)); i >= 8; t[r + l] = 255 & a, l += y, a /= 256, i -= 8);
|
||||
for (s = s << i | a, u += i; u > 0; t[r + l] = 255 & s, l += y, s /= 256, u -= 8);
|
||||
t[r + l - y] |= 128 * g
|
||||
}
|
||||
},
|
||||
3229: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(7449),
|
||||
o = r(5682),
|
||||
s = (r(3200), r(3100)
|
||||
.Ber, r(8226)
|
||||
._),
|
||||
a = r(8226),
|
||||
f = r(1768),
|
||||
u = r(7460);
|
||||
void 0 === i.RSA_NO_PADDING && (i.RSA_NO_PADDING = 3), t.exports = function() {
|
||||
var t = {
|
||||
node10: ["md4", "md5", "ripemd160", "sha1", "sha224", "sha256", "sha384", "sha512"],
|
||||
node: ["md4", "md5", "ripemd160", "sha1", "sha224", "sha256", "sha384", "sha512"],
|
||||
iojs: ["md4", "md5", "ripemd160", "sha1", "sha224", "sha256", "sha384", "sha512"],
|
||||
browser: ["md5", "ripemd160", "sha1", "sha256", "sha512"]
|
||||
}, e = "pkcs1_oaep",
|
||||
r = "pkcs1",
|
||||
i = {
|
||||
private: "pkcs1-private-pem",
|
||||
"private-der": "pkcs1-private-der",
|
||||
public: "pkcs8-public-pem",
|
||||
"public-der": "pkcs8-public-der"
|
||||
};
|
||||
|
||||
function c(t, i, f) {
|
||||
if (!(this instanceof c)) return new c(t, i, f);
|
||||
s.isObject(i) && (f = i, i = void 0), this.$options = {
|
||||
signingScheme: r,
|
||||
signingSchemeOptions: {
|
||||
hash: "sha256",
|
||||
saltLength: null
|
||||
},
|
||||
encryptionScheme: e,
|
||||
encryptionSchemeOptions: {
|
||||
hash: "sha1",
|
||||
label: null
|
||||
},
|
||||
environment: a.detectEnvironment(),
|
||||
rsaUtils: this
|
||||
}, this.keyPair = new o.Key, this.$cache = {}, n.isBuffer(t) || s.isString(t) ? this.importKey(t, i) : s.isObject(t) && this.generateKeyPair(t.b, t.e), this.setOptions(f)
|
||||
}
|
||||
return c.prototype.setOptions = function(n) {
|
||||
if ((n = n || {})
|
||||
.environment && (this.$options.environment = n.environment), n.signingScheme) {
|
||||
if (s.isString(n.signingScheme)) {
|
||||
var i = n.signingScheme.toLowerCase()
|
||||
.split("-");
|
||||
1 == i.length ? t.node.indexOf(i[0]) > -1 ? (this.$options.signingSchemeOptions = {
|
||||
hash: i[0]
|
||||
}, this.$options.signingScheme = r) : (this.$options.signingScheme = i[0], this.$options.signingSchemeOptions = {
|
||||
hash: null
|
||||
}) : (this.$options.signingSchemeOptions = {
|
||||
hash: i[1]
|
||||
}, this.$options.signingScheme = i[0])
|
||||
} else s.isObject(n.signingScheme) && (this.$options.signingScheme = n.signingScheme.scheme || r, this.$options.signingSchemeOptions = s.omit(n.signingScheme, "scheme"));
|
||||
if (!f.isSignature(this.$options.signingScheme)) throw Error("Unsupported signing scheme");
|
||||
if (this.$options.signingSchemeOptions.hash && -1 === t[this.$options.environment].indexOf(this.$options.signingSchemeOptions.hash)) throw Error("Unsupported hashing algorithm for " + this.$options.environment + " environment")
|
||||
}
|
||||
if (n.encryptionScheme) {
|
||||
if (s.isString(n.encryptionScheme) ? (this.$options.encryptionScheme = n.encryptionScheme.toLowerCase(), this.$options.encryptionSchemeOptions = {}) : s.isObject(n.encryptionScheme) && (this.$options.encryptionScheme = n.encryptionScheme.scheme || e, this.$options.encryptionSchemeOptions = s.omit(n.encryptionScheme, "scheme")), !f.isEncryption(this.$options.encryptionScheme)) throw Error("Unsupported encryption scheme");
|
||||
if (this.$options.encryptionSchemeOptions.hash && -1 === t[this.$options.environment].indexOf(this.$options.encryptionSchemeOptions.hash)) throw Error("Unsupported hashing algorithm for " + this.$options.environment + " environment")
|
||||
}
|
||||
this.keyPair.setOptions(this.$options)
|
||||
}, c.prototype.generateKeyPair = function(t, e) {
|
||||
if (e = e || 65537, (t = t || 2048) % 8 != 0) throw Error("Key size must be a multiple of 8.");
|
||||
return this.keyPair.generate(t, e.toString(16)), this.$cache = {}, this
|
||||
}, c.prototype.importKey = function(t, e) {
|
||||
if (!t) throw Error("Empty key given");
|
||||
if (e && (e = i[e] || e), !u.detectAndImport(this.keyPair, t, e) && void 0 === e) throw Error("Key format must be specified");
|
||||
return this.$cache = {}, this
|
||||
}, c.prototype.exportKey = function(t) {
|
||||
return t = i[t = t || "private"] || t, this.$cache[t] || (this.$cache[t] = u.detectAndExport(this.keyPair, t)), this.$cache[t]
|
||||
}, c.prototype.isPrivate = function() {
|
||||
return this.keyPair.isPrivate()
|
||||
}, c.prototype.isPublic = function(t) {
|
||||
return this.keyPair.isPublic(t)
|
||||
}, c.prototype.isEmpty = function(t) {
|
||||
return !(this.keyPair.n || this.keyPair.e || this.keyPair.d)
|
||||
}, c.prototype.encrypt = function(t, e, r) {
|
||||
return this.$$encryptKey(!1, t, e, r)
|
||||
}, c.prototype.decrypt = function(t, e) {
|
||||
return this.$$decryptKey(!1, t, e)
|
||||
}, c.prototype.encryptPrivate = function(t, e, r) {
|
||||
return this.$$encryptKey(!0, t, e, r)
|
||||
}, c.prototype.decryptPublic = function(t, e) {
|
||||
return this.$$decryptKey(!0, t, e)
|
||||
}, c.prototype.$$encryptKey = function(t, e, r, n) {
|
||||
try {
|
||||
var i = this.keyPair.encrypt(this.$getDataForEncrypt(e, n), t);
|
||||
return "buffer" != r && r ? i.toString(r) : i
|
||||
} catch (t) {
|
||||
throw Error("Error during encryption. Original error: " + t)
|
||||
}
|
||||
}, c.prototype.$$decryptKey = function(t, e, r) {
|
||||
try {
|
||||
e = s.isString(e) ? n.from(e, "base64") : e;
|
||||
var i = this.keyPair.decrypt(e, t);
|
||||
if (null === i) throw Error("Key decrypt method returns null.");
|
||||
return this.$getDecryptedData(i, r)
|
||||
} catch (t) {
|
||||
throw Error("Error during decryption (probably incorrect key). Original error: " + t)
|
||||
}
|
||||
}, c.prototype.sign = function(t, e, r) {
|
||||
if (!this.isPrivate()) throw Error("This is not private key");
|
||||
var n = this.keyPair.sign(this.$getDataForEncrypt(t, r));
|
||||
return e && "buffer" != e && (n = n.toString(e)), n
|
||||
}, c.prototype.verify = function(t, e, r, n) {
|
||||
if (!this.isPublic()) throw Error("This is not public key");
|
||||
return n = n && "buffer" != n ? n : null, this.keyPair.verify(this.$getDataForEncrypt(t, r), e, n)
|
||||
}, c.prototype.getKeySize = function() {
|
||||
return this.keyPair.keySize
|
||||
}, c.prototype.getMaxMessageSize = function() {
|
||||
return this.keyPair.maxMessageLength
|
||||
}, c.prototype.$getDataForEncrypt = function(t, e) {
|
||||
if (s.isString(t) || s.isNumber(t)) return n.from("" + t, e || "utf8");
|
||||
if (n.isBuffer(t)) return t;
|
||||
if (s.isObject(t)) return n.from(JSON.stringify(t));
|
||||
throw Error("Unexpected data type")
|
||||
}, c.prototype.$getDecryptedData = function(t, e) {
|
||||
return "buffer" == (e = e || "buffer") ? t : "json" == e ? JSON.parse(t.toString()) : t.toString(e)
|
||||
}, c
|
||||
}()
|
||||
},
|
||||
4538: (t, e, r) => {
|
||||
var n = r(3200);
|
||||
t.exports = {
|
||||
getEngine: function(t, e) {
|
||||
var i = r(7469);
|
||||
return "node" === e.environment && "function" == typeof n.publicEncrypt && "function" == typeof n.privateDecrypt && (i = "function" == typeof n.privateEncrypt && "function" == typeof n.publicDecrypt ? r(2418) : r(1957)), i(t, e)
|
||||
}
|
||||
}
|
||||
},
|
||||
2418: (t, e, r) => {
|
||||
var n = r(3200),
|
||||
i = r(7449),
|
||||
o = r(1768);
|
||||
t.exports = function(t, e) {
|
||||
var r = o.pkcs1.makeScheme(t, e);
|
||||
return {
|
||||
encrypt: function(t, o) {
|
||||
var s;
|
||||
if (o) return s = i.RSA_PKCS1_PADDING, e.encryptionSchemeOptions && e.encryptionSchemeOptions.padding && (s = e.encryptionSchemeOptions.padding), n.privateEncrypt({
|
||||
key: e.rsaUtils.exportKey("private"),
|
||||
padding: s
|
||||
}, t);
|
||||
s = i.RSA_PKCS1_OAEP_PADDING, "pkcs1" === e.encryptionScheme && (s = i.RSA_PKCS1_PADDING), e.encryptionSchemeOptions && e.encryptionSchemeOptions.padding && (s = e.encryptionSchemeOptions.padding);
|
||||
var a = t;
|
||||
return s === i.RSA_NO_PADDING && (a = r.pkcs0pad(t)), n.publicEncrypt({
|
||||
key: e.rsaUtils.exportKey("public"),
|
||||
padding: s
|
||||
}, a)
|
||||
},
|
||||
decrypt: function(t, o) {
|
||||
var s;
|
||||
if (o) return s = i.RSA_PKCS1_PADDING, e.encryptionSchemeOptions && e.encryptionSchemeOptions.padding && (s = e.encryptionSchemeOptions.padding), n.publicDecrypt({
|
||||
key: e.rsaUtils.exportKey("public"),
|
||||
padding: s
|
||||
}, t);
|
||||
s = i.RSA_PKCS1_OAEP_PADDING, "pkcs1" === e.encryptionScheme && (s = i.RSA_PKCS1_PADDING), e.encryptionSchemeOptions && e.encryptionSchemeOptions.padding && (s = e.encryptionSchemeOptions.padding);
|
||||
var a = n.privateDecrypt({
|
||||
key: e.rsaUtils.exportKey("private"),
|
||||
padding: s
|
||||
}, t);
|
||||
return s === i.RSA_NO_PADDING ? r.pkcs0unpad(a) : a
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
7469: (t, e, r) => {
|
||||
var n = r(1973),
|
||||
i = r(1768);
|
||||
t.exports = function(t, e) {
|
||||
var r = i.pkcs1.makeScheme(t, e);
|
||||
return {
|
||||
encrypt: function(e, i) {
|
||||
var o, s;
|
||||
return i ? (o = new n(r.encPad(e, {
|
||||
type: 1
|
||||
})), s = t.$doPrivate(o)) : (o = new n(t.encryptionScheme.encPad(e)), s = t.$doPublic(o)), s.toBuffer(t.encryptedDataLength)
|
||||
},
|
||||
decrypt: function(e, i) {
|
||||
var o, s = new n(e);
|
||||
return i ? (o = t.$doPublic(s), r.encUnPad(o.toBuffer(t.encryptedDataLength), {
|
||||
type: 1
|
||||
})) : (o = t.$doPrivate(s), t.encryptionScheme.encUnPad(o.toBuffer(t.encryptedDataLength)))
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
1957: (t, e, r) => {
|
||||
var n = r(3200),
|
||||
i = r(7449),
|
||||
o = r(1768);
|
||||
t.exports = function(t, e) {
|
||||
var s = r(7469)(t, e),
|
||||
a = o.pkcs1.makeScheme(t, e);
|
||||
return {
|
||||
encrypt: function(t, r) {
|
||||
if (r) return s.encrypt(t, r);
|
||||
var o = i.RSA_PKCS1_OAEP_PADDING;
|
||||
"pkcs1" === e.encryptionScheme && (o = i.RSA_PKCS1_PADDING), e.encryptionSchemeOptions && e.encryptionSchemeOptions.padding && (o = e.encryptionSchemeOptions.padding);
|
||||
var f = t;
|
||||
return o === i.RSA_NO_PADDING && (f = a.pkcs0pad(t)), n.publicEncrypt({
|
||||
key: e.rsaUtils.exportKey("public"),
|
||||
padding: o
|
||||
}, f)
|
||||
},
|
||||
decrypt: function(t, r) {
|
||||
if (r) return s.decrypt(t, r);
|
||||
var o = i.RSA_PKCS1_OAEP_PADDING;
|
||||
"pkcs1" === e.encryptionScheme && (o = i.RSA_PKCS1_PADDING), e.encryptionSchemeOptions && e.encryptionSchemeOptions.padding && (o = e.encryptionSchemeOptions.padding);
|
||||
var f = n.privateDecrypt({
|
||||
key: e.rsaUtils.exportKey("private"),
|
||||
padding: o
|
||||
}, t);
|
||||
return o === i.RSA_NO_PADDING ? a.pkcs0unpad(f) : f
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
3374: (t, e, r) => {
|
||||
r(8226)
|
||||
._, r(8226), t.exports = {
|
||||
privateExport: function(t, e) {
|
||||
return {
|
||||
n: t.n.toBuffer(),
|
||||
e: t.e,
|
||||
d: t.d.toBuffer(),
|
||||
p: t.p.toBuffer(),
|
||||
q: t.q.toBuffer(),
|
||||
dmp1: t.dmp1.toBuffer(),
|
||||
dmq1: t.dmq1.toBuffer(),
|
||||
coeff: t.coeff.toBuffer()
|
||||
}
|
||||
},
|
||||
privateImport: function(t, e, r) {
|
||||
if (!(e.n && e.e && e.d && e.p && e.q && e.dmp1 && e.dmq1 && e.coeff)) throw Error("Invalid key data");
|
||||
t.setPrivate(e.n, e.e, e.d, e.p, e.q, e.dmp1, e.dmq1, e.coeff)
|
||||
},
|
||||
publicExport: function(t, e) {
|
||||
return {
|
||||
n: t.n.toBuffer(),
|
||||
e: t.e
|
||||
}
|
||||
},
|
||||
publicImport: function(t, e, r) {
|
||||
if (!e.n || !e.e) throw Error("Invalid key data");
|
||||
t.setPublic(e.n, e.e)
|
||||
},
|
||||
autoImport: function(e, r) {
|
||||
return !(!r.n || !r.e || (r.d && r.p && r.q && r.dmp1 && r.dmq1 && r.coeff ? (t.exports.privateImport(e, r), 0) : (t.exports.publicImport(e, r), 0)))
|
||||
}
|
||||
}
|
||||
},
|
||||
7460: (t, e, r) => {
|
||||
function n(t) {
|
||||
t = t.split("-");
|
||||
for (var e = "private", r = {
|
||||
type: "default"
|
||||
}, n = 1; n < t.length; n++) if (t[n]) switch (t[n]) {
|
||||
case "public":
|
||||
case "private":
|
||||
e = t[n];
|
||||
break;
|
||||
case "pem":
|
||||
case "der":
|
||||
r.type = t[n]
|
||||
}
|
||||
return {
|
||||
scheme: t[0],
|
||||
keyType: e,
|
||||
keyOpt: r
|
||||
}
|
||||
}
|
||||
r(8226)
|
||||
._, t.exports = {
|
||||
pkcs1: r(6566),
|
||||
pkcs8: r(8573),
|
||||
components: r(3374),
|
||||
openssh: r(3194),
|
||||
isPrivateExport: function(e) {
|
||||
return t.exports[e] && "function" == typeof t.exports[e].privateExport
|
||||
},
|
||||
isPrivateImport: function(e) {
|
||||
return t.exports[e] && "function" == typeof t.exports[e].privateImport
|
||||
},
|
||||
isPublicExport: function(e) {
|
||||
return t.exports[e] && "function" == typeof t.exports[e].publicExport
|
||||
},
|
||||
isPublicImport: function(e) {
|
||||
return t.exports[e] && "function" == typeof t.exports[e].publicImport
|
||||
},
|
||||
detectAndImport: function(e, r, i) {
|
||||
if (void 0 === i) {
|
||||
for (var o in t.exports) if ("function" == typeof t.exports[o].autoImport && t.exports[o].autoImport(e, r)) return !0
|
||||
} else if (i) {
|
||||
var s = n(i);
|
||||
if (!t.exports[s.scheme]) throw Error("Unsupported key format");
|
||||
"private" === s.keyType ? t.exports[s.scheme].privateImport(e, r, s.keyOpt) : t.exports[s.scheme].publicImport(e, r, s.keyOpt)
|
||||
}
|
||||
return !1
|
||||
},
|
||||
detectAndExport: function(e, r) {
|
||||
if (r) {
|
||||
var i = n(r);
|
||||
if (t.exports[i.scheme]) {
|
||||
if ("private" === i.keyType) {
|
||||
if (!e.isPrivate()) throw Error("This is not private key");
|
||||
return t.exports[i.scheme].privateExport(e, i.keyOpt)
|
||||
}
|
||||
if (!e.isPublic()) throw Error("This is not public key");
|
||||
return t.exports[i.scheme].publicExport(e, i.keyOpt)
|
||||
}
|
||||
throw Error("Unsupported key format")
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
3194: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(8226)
|
||||
._,
|
||||
o = r(8226),
|
||||
s = r(1973);
|
||||
const a = "-----BEGIN OPENSSH PRIVATE KEY-----", f = "-----END OPENSSH PRIVATE KEY-----";
|
||||
|
||||
function u(t) {
|
||||
const e = t.buf.readInt32BE(t.off);
|
||||
t.off += 4;
|
||||
const r = t.buf.slice(t.off, t.off + e);
|
||||
return t.off += e, r
|
||||
}
|
||||
function c(t, e) {
|
||||
t.buf.writeInt32BE(e.byteLength, t.off), t.off += 4, t.off += e.copy(t.buf, t.off)
|
||||
}
|
||||
t.exports = {
|
||||
privateExport: function(t, e) {
|
||||
const r = t.n.toBuffer();
|
||||
let i = n.alloc(4);
|
||||
for (i.writeUInt32BE(t.e, 0); 0 === i[0];) i = i.slice(1);
|
||||
const s = t.d.toBuffer(), u = t.coeff.toBuffer(), h = t.p.toBuffer(), p = t.q.toBuffer();
|
||||
let l;
|
||||
l = void 0 !== t.sshcomment ? n.from(t.sshcomment) : n.from([]);
|
||||
const y = 15 + i.byteLength + 4 + r.byteLength, g = 23 + r.byteLength + 4 + i.byteLength + 4 + s.byteLength + 4 + u.byteLength + 4 + h.byteLength + 4 + p.byteLength + 4 + l.byteLength;
|
||||
let d = 43 + y + 4 + g;
|
||||
d += 8 * Math.ceil(g / 8) - g;
|
||||
const v = n.alloc(d), m = {
|
||||
buf: v,
|
||||
off: 0
|
||||
};
|
||||
v.write("openssh-key-v1", "utf8"), v.writeUInt8(0, 14), m.off += 15, c(m, n.from("none")), c(m, n.from("none")), c(m, n.from("")), m.off = m.buf.writeUInt32BE(1, m.off), m.off = m.buf.writeUInt32BE(y, m.off), c(m, n.from("ssh-rsa")), c(m, i), c(m, r), m.off = m.buf.writeUInt32BE(d - 47 - y, m.off), m.off += 8, c(m, n.from("ssh-rsa")), c(m, r), c(m, i), c(m, s), c(m, u), c(m, h), c(m, p), c(m, l);
|
||||
let S = 1;
|
||||
for (; m.off < d;) m.off = m.buf.writeUInt8(S++, m.off);
|
||||
return "der" === e.type ? m.buf : a + "\n" + o.linebrk(v.toString("base64"), 70) + "\n" + f + "\n"
|
||||
},
|
||||
privateImport: function(t, e, r) {
|
||||
var c;
|
||||
if ("der" !== (r = r || {})
|
||||
.type) {
|
||||
if (n.isBuffer(e) && (e = e.toString("utf8")), !i.isString(e)) throw Error("Unsupported key format");
|
||||
var h = o.trimSurroundingText(e, a, f)
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
c = n.from(h, "base64")
|
||||
} else {
|
||||
if (!n.isBuffer(e)) throw Error("Unsupported key format");
|
||||
c = e
|
||||
}
|
||||
const p = {
|
||||
buf: c,
|
||||
off: 0
|
||||
};
|
||||
if ("openssh-key-v1" !== c.slice(0, 14)
|
||||
.toString("ascii")) throw "Invalid file format.";
|
||||
if (p.off += 15, "none" !== u(p)
|
||||
.toString("ascii")) throw Error("Unsupported key type");
|
||||
if ("none" !== u(p)
|
||||
.toString("ascii")) throw Error("Unsupported key type");
|
||||
if ("" !== u(p)
|
||||
.toString("ascii")) throw Error("Unsupported key type");
|
||||
if (p.off += 4, p.off += 4, "ssh-rsa" !== u(p)
|
||||
.toString("ascii")) throw Error("Unsupported key type");
|
||||
if (u(p), u(p), p.off += 12, "ssh-rsa" !== u(p)
|
||||
.toString("ascii")) throw Error("Unsupported key type");
|
||||
const l = u(p), y = u(p), g = u(p), d = u(p), v = u(p), m = u(p), S = new s(g), _ = new s(m), b = new s(v), E = S.mod(b.subtract(s.ONE)), w = S.mod(_.subtract(s.ONE));
|
||||
t.setPrivate(l, y, g, v, m, E.toBuffer(), w.toBuffer(), d), t.sshcomment = u(p)
|
||||
.toString("ascii")
|
||||
},
|
||||
publicExport: function(t, e) {
|
||||
let r = n.alloc(4);
|
||||
for (r.writeUInt32BE(t.e, 0); 0 === r[0];) r = r.slice(1);
|
||||
const i = t.n.toBuffer(), o = n.alloc(r.byteLength + 4 + i.byteLength + 4 + 7 + 4), s = {
|
||||
buf: o,
|
||||
off: 0
|
||||
};
|
||||
c(s, n.from("ssh-rsa")), c(s, r), c(s, i);
|
||||
let a = t.sshcomment || "";
|
||||
return "der" === e.type ? s.buf : "ssh-rsa " + o.toString("base64") + " " + a + "\n"
|
||||
},
|
||||
publicImport: function(t, e, r) {
|
||||
var o;
|
||||
if ("der" !== (r = r || {})
|
||||
.type) {
|
||||
if (n.isBuffer(e) && (e = e.toString("utf8")), !i.isString(e)) throw Error("Unsupported key format"); {
|
||||
if ("ssh-rsa " !== e.substring(0, 8)) throw Error("Unsupported key format");
|
||||
let r = e.indexOf(" ", 8); - 1 === r ? r = e.length : t.sshcomment = e.substring(r + 1)
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
const i = e.substring(8, r)
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
o = n.from(i, "base64")
|
||||
}
|
||||
} else {
|
||||
if (!n.isBuffer(e)) throw Error("Unsupported key format");
|
||||
o = e
|
||||
}
|
||||
const s = {
|
||||
buf: o,
|
||||
off: 0
|
||||
}, a = u(s)
|
||||
.toString("ascii");
|
||||
if ("ssh-rsa" !== a) throw Error("Invalid key type: " + a);
|
||||
const f = u(s), c = u(s);
|
||||
t.setPublic(c, f)
|
||||
},
|
||||
autoImport: function(e, r) {
|
||||
return /^[\S\s]*-----BEGIN OPENSSH PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END OPENSSH PRIVATE KEY-----[\S\s]*$/g.test(r) ? (t.exports.privateImport(e, r), !0) : !! /^[\S\s]*ssh-rsa \s*(?=(([A-Za-z0-9+/=]+\s*)+))\1[\S\s]*$/g.test(r) && (t.exports.publicImport(e, r), !0)
|
||||
}
|
||||
}
|
||||
},
|
||||
6566: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(3100)
|
||||
.Ber,
|
||||
o = r(8226)
|
||||
._,
|
||||
s = r(8226);
|
||||
const a = "-----BEGIN RSA PRIVATE KEY-----", f = "-----END RSA PRIVATE KEY-----", u = "-----BEGIN RSA PUBLIC KEY-----", c = "-----END RSA PUBLIC KEY-----";
|
||||
t.exports = {
|
||||
privateExport: function(t, e) {
|
||||
e = e || {};
|
||||
var r = t.n.toBuffer(),
|
||||
n = t.d.toBuffer(),
|
||||
o = t.p.toBuffer(),
|
||||
u = t.q.toBuffer(),
|
||||
c = t.dmp1.toBuffer(),
|
||||
h = t.dmq1.toBuffer(),
|
||||
p = t.coeff.toBuffer(),
|
||||
l = r.length + n.length + o.length + u.length + c.length + h.length + p.length + 512,
|
||||
y = new i.Writer({
|
||||
size: l
|
||||
});
|
||||
return y.startSequence(), y.writeInt(0), y.writeBuffer(r, 2), y.writeInt(t.e), y.writeBuffer(n, 2), y.writeBuffer(o, 2), y.writeBuffer(u, 2), y.writeBuffer(c, 2), y.writeBuffer(h, 2), y.writeBuffer(p, 2), y.endSequence(), "der" === e.type ? y.buffer : a + "\n" + s.linebrk(y.buffer.toString("base64"), 64) + "\n" + f
|
||||
},
|
||||
privateImport: function(t, e, r) {
|
||||
var u;
|
||||
if ("der" !== (r = r || {})
|
||||
.type) {
|
||||
if (n.isBuffer(e) && (e = e.toString("utf8")), !o.isString(e)) throw Error("Unsupported key format");
|
||||
var c = s.trimSurroundingText(e, a, f)
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
u = n.from(c, "base64")
|
||||
} else {
|
||||
if (!n.isBuffer(e)) throw Error("Unsupported key format");
|
||||
u = e
|
||||
}
|
||||
var h = new i.Reader(u);
|
||||
h.readSequence(), h.readString(2, !0), t.setPrivate(h.readString(2, !0), h.readString(2, !0), h.readString(2, !0), h.readString(2, !0), h.readString(2, !0), h.readString(2, !0), h.readString(2, !0), h.readString(2, !0))
|
||||
},
|
||||
publicExport: function(t, e) {
|
||||
e = e || {};
|
||||
var r = t.n.toBuffer(),
|
||||
n = r.length + 512,
|
||||
o = new i.Writer({
|
||||
size: n
|
||||
});
|
||||
return o.startSequence(), o.writeBuffer(r, 2), o.writeInt(t.e), o.endSequence(), "der" === e.type ? o.buffer : u + "\n" + s.linebrk(o.buffer.toString("base64"), 64) + "\n" + c
|
||||
},
|
||||
publicImport: function(t, e, r) {
|
||||
var a;
|
||||
if ("der" !== (r = r || {})
|
||||
.type) {
|
||||
if (n.isBuffer(e) && (e = e.toString("utf8")), o.isString(e)) {
|
||||
var f = s.trimSurroundingText(e, u, c)
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
a = n.from(f, "base64")
|
||||
}
|
||||
} else {
|
||||
if (!n.isBuffer(e)) throw Error("Unsupported key format");
|
||||
a = e
|
||||
}
|
||||
var h = new i.Reader(a);
|
||||
h.readSequence(), t.setPublic(h.readString(2, !0), h.readString(2, !0))
|
||||
},
|
||||
autoImport: function(e, r) {
|
||||
return /^[\S\s]*-----BEGIN RSA PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PRIVATE KEY-----[\S\s]*$/g.test(r) ? (t.exports.privateImport(e, r), !0) : !! /^[\S\s]*-----BEGIN RSA PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END RSA PUBLIC KEY-----[\S\s]*$/g.test(r) && (t.exports.publicImport(e, r), !0)
|
||||
}
|
||||
}
|
||||
},
|
||||
8573: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(3100)
|
||||
.Ber,
|
||||
o = r(8226)
|
||||
._,
|
||||
s = "1.2.840.113549.1.1.1",
|
||||
a = r(8226);
|
||||
const f = "-----BEGIN PRIVATE KEY-----", u = "-----END PRIVATE KEY-----", c = "-----BEGIN PUBLIC KEY-----", h = "-----END PUBLIC KEY-----";
|
||||
t.exports = {
|
||||
privateExport: function(t, e) {
|
||||
e = e || {};
|
||||
var r = t.n.toBuffer(),
|
||||
n = t.d.toBuffer(),
|
||||
o = t.p.toBuffer(),
|
||||
c = t.q.toBuffer(),
|
||||
h = t.dmp1.toBuffer(),
|
||||
p = t.dmq1.toBuffer(),
|
||||
l = t.coeff.toBuffer(),
|
||||
y = r.length + n.length + o.length + c.length + h.length + p.length + l.length + 512,
|
||||
g = new i.Writer({
|
||||
size: y
|
||||
});
|
||||
g.startSequence(), g.writeInt(0), g.writeBuffer(r, 2), g.writeInt(t.e), g.writeBuffer(n, 2), g.writeBuffer(o, 2), g.writeBuffer(c, 2), g.writeBuffer(h, 2), g.writeBuffer(p, 2), g.writeBuffer(l, 2), g.endSequence();
|
||||
var d = new i.Writer({
|
||||
size: y
|
||||
});
|
||||
return d.startSequence(), d.writeInt(0), d.startSequence(), d.writeOID(s), d.writeNull(), d.endSequence(), d.writeBuffer(g.buffer, 4), d.endSequence(), "der" === e.type ? d.buffer : f + "\n" + a.linebrk(d.buffer.toString("base64"), 64) + "\n" + u
|
||||
},
|
||||
privateImport: function(t, e, r) {
|
||||
var c;
|
||||
if ("der" !== (r = r || {})
|
||||
.type) {
|
||||
if (n.isBuffer(e) && (e = e.toString("utf8")), !o.isString(e)) throw Error("Unsupported key format");
|
||||
var h = a.trimSurroundingText(e, f, u)
|
||||
.replace("-----END PRIVATE KEY-----", "")
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
c = n.from(h, "base64")
|
||||
} else {
|
||||
if (!n.isBuffer(e)) throw Error("Unsupported key format");
|
||||
c = e
|
||||
}
|
||||
var p = new i.Reader(c);
|
||||
if (p.readSequence(), p.readInt(0), new i.Reader(p.readString(48, !0))
|
||||
.readOID(6, !0) !== s) throw Error("Invalid Public key format");
|
||||
var l = new i.Reader(p.readString(4, !0));
|
||||
l.readSequence(), l.readString(2, !0), t.setPrivate(l.readString(2, !0), l.readString(2, !0), l.readString(2, !0), l.readString(2, !0), l.readString(2, !0), l.readString(2, !0), l.readString(2, !0), l.readString(2, !0))
|
||||
},
|
||||
publicExport: function(t, e) {
|
||||
e = e || {};
|
||||
var r = t.n.toBuffer(),
|
||||
n = r.length + 512,
|
||||
o = new i.Writer({
|
||||
size: n
|
||||
});
|
||||
o.writeByte(0), o.startSequence(), o.writeBuffer(r, 2), o.writeInt(t.e), o.endSequence();
|
||||
var f = new i.Writer({
|
||||
size: n
|
||||
});
|
||||
return f.startSequence(), f.startSequence(), f.writeOID(s), f.writeNull(), f.endSequence(), f.writeBuffer(o.buffer, 3), f.endSequence(), "der" === e.type ? f.buffer : c + "\n" + a.linebrk(f.buffer.toString("base64"), 64) + "\n" + h
|
||||
},
|
||||
publicImport: function(t, e, r) {
|
||||
var f;
|
||||
if ("der" !== (r = r || {})
|
||||
.type) {
|
||||
if (n.isBuffer(e) && (e = e.toString("utf8")), o.isString(e)) {
|
||||
var u = a.trimSurroundingText(e, c, h)
|
||||
.replace(/\s+|\n\r|\n|\r$/gm, "");
|
||||
f = n.from(u, "base64")
|
||||
}
|
||||
} else {
|
||||
if (!n.isBuffer(e)) throw Error("Unsupported key format");
|
||||
f = e
|
||||
}
|
||||
var p = new i.Reader(f);
|
||||
if (p.readSequence(), new i.Reader(p.readString(48, !0))
|
||||
.readOID(6, !0) !== s) throw Error("Invalid Public key format");
|
||||
var l = new i.Reader(p.readString(3, !0));
|
||||
l.readByte(), l.readSequence(), t.setPublic(l.readString(2, !0), l.readString(2, !0))
|
||||
},
|
||||
autoImport: function(e, r) {
|
||||
return /^[\S\s]*-----BEGIN PRIVATE KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PRIVATE KEY-----[\S\s]*$/g.test(r) ? (t.exports.privateImport(e, r), !0) : !! /^[\S\s]*-----BEGIN PUBLIC KEY-----\s*(?=(([A-Za-z0-9+/=]+\s*)+))\1-----END PUBLIC KEY-----[\S\s]*$/g.test(r) && (t.exports.publicImport(e, r), !0)
|
||||
}
|
||||
}
|
||||
},
|
||||
1973: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(3200),
|
||||
o = r(8226)
|
||||
._;
|
||||
|
||||
function s(t, e) {
|
||||
null != t && ("number" == typeof t ? this.fromNumber(t, e) : n.isBuffer(t) ? this.fromBuffer(t) : null == e && "string" != typeof t ? this.fromByteArray(t) : this.fromString(t, e))
|
||||
}
|
||||
function a() {
|
||||
return new s(null)
|
||||
}
|
||||
s.prototype.am = function(t, e, r, n, i, o) {
|
||||
for (var s = 16383 & e, a = e >> 14; --o >= 0;) {
|
||||
var f = 16383 & this[t],
|
||||
u = this[t++] >> 14,
|
||||
c = a * f + u * s;
|
||||
i = ((f = s * f + ((16383 & c) << 14) + r[n] + i) >> 28) + (c >> 14) + a * u, r[n++] = 268435455 & f
|
||||
}
|
||||
return i
|
||||
}, s.prototype.DB = 28, s.prototype.DM = 268435455, s.prototype.DV = 1 << 28, s.prototype.FV = Math.pow(2, 52), s.prototype.F1 = 24, s.prototype.F2 = 4;
|
||||
var f, u, c = new Array;
|
||||
for (f = "0".charCodeAt(0), u = 0; u <= 9; ++u) c[f++] = u;
|
||||
for (f = "a".charCodeAt(0), u = 10; u < 36; ++u) c[f++] = u;
|
||||
for (f = "A".charCodeAt(0), u = 10; u < 36; ++u) c[f++] = u;
|
||||
|
||||
function h(t) {
|
||||
return "0123456789abcdefghijklmnopqrstuvwxyz".charAt(t)
|
||||
}
|
||||
function p(t, e) {
|
||||
var r = c[t.charCodeAt(e)];
|
||||
return null == r ? -1 : r
|
||||
}
|
||||
function l(t) {
|
||||
var e = a();
|
||||
return e.fromInt(t), e
|
||||
}
|
||||
function y(t) {
|
||||
var e, r = 1;
|
||||
return 0 != (e = t >>> 16) && (t = e, r += 16), 0 != (e = t >> 8) && (t = e, r += 8), 0 != (e = t >> 4) && (t = e, r += 4), 0 != (e = t >> 2) && (t = e, r += 2), 0 != (e = t >> 1) && (t = e, r += 1), r
|
||||
}
|
||||
function g(t) {
|
||||
this.m = t
|
||||
}
|
||||
function d(t) {
|
||||
this.m = t, this.mp = t.invDigit(), this.mpl = 32767 & this.mp, this.mph = this.mp >> 15, this.um = (1 << t.DB - 15) - 1, this.mt2 = 2 * t.t
|
||||
}
|
||||
function v(t, e) {
|
||||
return t & e
|
||||
}
|
||||
function m(t, e) {
|
||||
return t | e
|
||||
}
|
||||
function S(t, e) {
|
||||
return t ^ e
|
||||
}
|
||||
function _(t, e) {
|
||||
return t & ~e
|
||||
}
|
||||
function b(t) {
|
||||
if (0 === t) return -1;
|
||||
var e = 0;
|
||||
return 65535 & t || (t >>= 16, e += 16), 255 & t || (t >>= 8, e += 8), 15 & t || (t >>= 4, e += 4), 3 & t || (t >>= 2, e += 2), 1 & t || ++e, e
|
||||
}
|
||||
function E(t) {
|
||||
for (var e = 0; 0 != t;) t &= t - 1, ++e;
|
||||
return e
|
||||
}
|
||||
function w() {}
|
||||
function O(t) {
|
||||
return t
|
||||
}
|
||||
function B(t) {
|
||||
this.r2 = a(), this.q3 = a(), s.ONE.dlShiftTo(2 * t.t, this.r2), this.mu = this.r2.divide(t), this.m = t
|
||||
}
|
||||
g.prototype.convert = function(t) {
|
||||
return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t
|
||||
}, g.prototype.revert = function(t) {
|
||||
return t
|
||||
}, g.prototype.reduce = function(t) {
|
||||
t.divRemTo(this.m, null, t)
|
||||
}, g.prototype.mulTo = function(t, e, r) {
|
||||
t.multiplyTo(e, r), this.reduce(r)
|
||||
}, g.prototype.sqrTo = function(t, e) {
|
||||
t.squareTo(e), this.reduce(e)
|
||||
}, d.prototype.convert = function(t) {
|
||||
var e = a();
|
||||
return t.abs()
|
||||
.dlShiftTo(this.m.t, e), e.divRemTo(this.m, null, e), t.s < 0 && e.compareTo(s.ZERO) > 0 && this.m.subTo(e, e), e
|
||||
}, d.prototype.revert = function(t) {
|
||||
var e = a();
|
||||
return t.copyTo(e), this.reduce(e), e
|
||||
}, d.prototype.reduce = function(t) {
|
||||
for (; t.t <= this.mt2;) t[t.t++] = 0;
|
||||
for (var e = 0; e < this.m.t; ++e) {
|
||||
var r = 32767 & t[e],
|
||||
n = r * this.mpl + ((r * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;
|
||||
for (t[r = e + this.m.t] += this.m.am(0, n, t, e, 0, this.m.t); t[r] >= t.DV;) t[r] -= t.DV, t[++r]++
|
||||
}
|
||||
t.clamp(), t.drShiftTo(this.m.t, t), t.compareTo(this.m) >= 0 && t.subTo(this.m, t)
|
||||
}, d.prototype.mulTo = function(t, e, r) {
|
||||
t.multiplyTo(e, r), this.reduce(r)
|
||||
}, d.prototype.sqrTo = function(t, e) {
|
||||
t.squareTo(e), this.reduce(e)
|
||||
}, w.prototype.convert = O, w.prototype.revert = O, w.prototype.mulTo = function(t, e, r) {
|
||||
t.multiplyTo(e, r)
|
||||
}, w.prototype.sqrTo = function(t, e) {
|
||||
t.squareTo(e)
|
||||
}, B.prototype.convert = function(t) {
|
||||
if (t.s < 0 || t.t > 2 * this.m.t) return t.mod(this.m);
|
||||
if (t.compareTo(this.m) < 0) return t;
|
||||
var e = a();
|
||||
return t.copyTo(e), this.reduce(e), e
|
||||
}, B.prototype.revert = function(t) {
|
||||
return t
|
||||
}, B.prototype.reduce = function(t) {
|
||||
for (t.drShiftTo(this.m.t - 1, this.r2), t.t > this.m.t + 1 && (t.t = this.m.t + 1, t.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0;) t.dAddOffset(1, this.m.t + 1);
|
||||
for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0;) t.subTo(this.m, t)
|
||||
}, B.prototype.mulTo = function(t, e, r) {
|
||||
t.multiplyTo(e, r), this.reduce(r)
|
||||
}, B.prototype.sqrTo = function(t, e) {
|
||||
t.squareTo(e), this.reduce(e)
|
||||
};
|
||||
var A = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997],
|
||||
x = (1 << 26) / A[A.length - 1];
|
||||
s.prototype.copyTo = function(t) {
|
||||
for (var e = this.t - 1; e >= 0; --e) t[e] = this[e];
|
||||
t.t = this.t, t.s = this.s
|
||||
}, s.prototype.fromInt = function(t) {
|
||||
this.t = 1, this.s = t < 0 ? -1 : 0, t > 0 ? this[0] = t : t < -1 ? this[0] = t + DV : this.t = 0
|
||||
}, s.prototype.fromString = function(t, e, r) {
|
||||
var n;
|
||||
switch (e) {
|
||||
case 2:
|
||||
n = 1;
|
||||
break;
|
||||
case 4:
|
||||
n = 2;
|
||||
break;
|
||||
case 8:
|
||||
n = 3;
|
||||
break;
|
||||
case 16:
|
||||
n = 4;
|
||||
break;
|
||||
case 32:
|
||||
n = 5;
|
||||
break;
|
||||
case 256:
|
||||
n = 8;
|
||||
break;
|
||||
default:
|
||||
return void this.fromRadix(t, e)
|
||||
}
|
||||
this.t = 0, this.s = 0;
|
||||
for (var i = t.length, o = !1, a = 0; --i >= 0;) {
|
||||
var f = 8 == n ? 255 & t[i] : p(t, i);
|
||||
f < 0 ? "-" == t.charAt(i) && (o = !0) : (o = !1, 0 === a ? this[this.t++] = f : a + n > this.DB ? (this[this.t - 1] |= (f & (1 << this.DB - a) - 1) << a, this[this.t++] = f >> this.DB - a) : this[this.t - 1] |= f << a, (a += n) >= this.DB && (a -= this.DB))
|
||||
}!r && 8 == n && 128 & t[0] && (this.s = -1, a > 0 && (this[this.t - 1] |= (1 << this.DB - a) - 1 << a)), this.clamp(), o && s.ZERO.subTo(this, this)
|
||||
}, s.prototype.fromByteArray = function(t, e) {
|
||||
this.fromString(t, 256, e)
|
||||
}, s.prototype.fromBuffer = function(t) {
|
||||
this.fromString(t, 256, !0)
|
||||
}, s.prototype.clamp = function() {
|
||||
for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t;)--this.t
|
||||
}, s.prototype.dlShiftTo = function(t, e) {
|
||||
var r;
|
||||
for (r = this.t - 1; r >= 0; --r) e[r + t] = this[r];
|
||||
for (r = t - 1; r >= 0; --r) e[r] = 0;
|
||||
e.t = this.t + t, e.s = this.s
|
||||
}, s.prototype.drShiftTo = function(t, e) {
|
||||
for (var r = t; r < this.t; ++r) e[r - t] = this[r];
|
||||
e.t = Math.max(this.t - t, 0), e.s = this.s
|
||||
}, s.prototype.lShiftTo = function(t, e) {
|
||||
var r, n = t % this.DB,
|
||||
i = this.DB - n,
|
||||
o = (1 << i) - 1,
|
||||
s = Math.floor(t / this.DB),
|
||||
a = this.s << n & this.DM;
|
||||
for (r = this.t - 1; r >= 0; --r) e[r + s + 1] = this[r] >> i | a, a = (this[r] & o) << n;
|
||||
for (r = s - 1; r >= 0; --r) e[r] = 0;
|
||||
e[s] = a, e.t = this.t + s + 1, e.s = this.s, e.clamp()
|
||||
}, s.prototype.rShiftTo = function(t, e) {
|
||||
e.s = this.s;
|
||||
var r = Math.floor(t / this.DB);
|
||||
if (r >= this.t) e.t = 0;
|
||||
else {
|
||||
var n = t % this.DB,
|
||||
i = this.DB - n,
|
||||
o = (1 << n) - 1;
|
||||
e[0] = this[r] >> n;
|
||||
for (var s = r + 1; s < this.t; ++s) e[s - r - 1] |= (this[s] & o) << i, e[s - r] = this[s] >> n;
|
||||
n > 0 && (e[this.t - r - 1] |= (this.s & o) << i), e.t = this.t - r, e.clamp()
|
||||
}
|
||||
}, s.prototype.subTo = function(t, e) {
|
||||
for (var r = 0, n = 0, i = Math.min(t.t, this.t); r < i;) n += this[r] - t[r], e[r++] = n & this.DM, n >>= this.DB;
|
||||
if (t.t < this.t) {
|
||||
for (n -= t.s; r < this.t;) n += this[r], e[r++] = n & this.DM, n >>= this.DB;
|
||||
n += this.s
|
||||
} else {
|
||||
for (n += this.s; r < t.t;) n -= t[r], e[r++] = n & this.DM, n >>= this.DB;
|
||||
n -= t.s
|
||||
}
|
||||
e.s = n < 0 ? -1 : 0, n < -1 ? e[r++] = this.DV + n : n > 0 && (e[r++] = n), e.t = r, e.clamp()
|
||||
}, s.prototype.multiplyTo = function(t, e) {
|
||||
var r = this.abs(),
|
||||
n = t.abs(),
|
||||
i = r.t;
|
||||
for (e.t = i + n.t; --i >= 0;) e[i] = 0;
|
||||
for (i = 0; i < n.t; ++i) e[i + r.t] = r.am(0, n[i], e, i, 0, r.t);
|
||||
e.s = 0, e.clamp(), this.s != t.s && s.ZERO.subTo(e, e)
|
||||
}, s.prototype.squareTo = function(t) {
|
||||
for (var e = this.abs(), r = t.t = 2 * e.t; --r >= 0;) t[r] = 0;
|
||||
for (r = 0; r < e.t - 1; ++r) {
|
||||
var n = e.am(r, e[r], t, 2 * r, 0, 1);
|
||||
(t[r + e.t] += e.am(r + 1, 2 * e[r], t, 2 * r + 1, n, e.t - r - 1)) >= e.DV && (t[r + e.t] -= e.DV, t[r + e.t + 1] = 1)
|
||||
}
|
||||
t.t > 0 && (t[t.t - 1] += e.am(r, e[r], t, 2 * r, 0, 1)), t.s = 0, t.clamp()
|
||||
}, s.prototype.divRemTo = function(t, e, r) {
|
||||
var n = t.abs();
|
||||
if (!(n.t <= 0)) {
|
||||
var i = this.abs();
|
||||
if (i.t < n.t) return null != e && e.fromInt(0), void(null != r && this.copyTo(r));
|
||||
null == r && (r = a());
|
||||
var o = a(),
|
||||
f = this.s,
|
||||
u = t.s,
|
||||
c = this.DB - y(n[n.t - 1]);
|
||||
c > 0 ? (n.lShiftTo(c, o), i.lShiftTo(c, r)) : (n.copyTo(o), i.copyTo(r));
|
||||
var h = o.t,
|
||||
p = o[h - 1];
|
||||
if (0 !== p) {
|
||||
var l = p * (1 << this.F1) + (h > 1 ? o[h - 2] >> this.F2 : 0),
|
||||
g = this.FV / l,
|
||||
d = (1 << this.F1) / l,
|
||||
v = 1 << this.F2,
|
||||
m = r.t,
|
||||
S = m - h,
|
||||
_ = null == e ? a() : e;
|
||||
for (o.dlShiftTo(S, _), r.compareTo(_) >= 0 && (r[r.t++] = 1, r.subTo(_, r)), s.ONE.dlShiftTo(h, _), _.subTo(o, o); o.t < h;) o[o.t++] = 0;
|
||||
for (; --S >= 0;) {
|
||||
var b = r[--m] == p ? this.DM : Math.floor(r[m] * g + (r[m - 1] + v) * d);
|
||||
if ((r[m] += o.am(0, b, r, S, 0, h)) < b) for (o.dlShiftTo(S, _), r.subTo(_, r); r[m] < --b;) r.subTo(_, r)
|
||||
}
|
||||
null != e && (r.drShiftTo(h, e), f != u && s.ZERO.subTo(e, e)), r.t = h, r.clamp(), c > 0 && r.rShiftTo(c, r), f < 0 && s.ZERO.subTo(r, r)
|
||||
}
|
||||
}
|
||||
}, s.prototype.invDigit = function() {
|
||||
if (this.t < 1) return 0;
|
||||
var t = this[0];
|
||||
if (!(1 & t)) return 0;
|
||||
var e = 3 & t;
|
||||
return (e = (e = (e = (e = e * (2 - (15 & t) * e) & 15) * (2 - (255 & t) * e) & 255) * (2 - ((65535 & t) * e & 65535)) & 65535) * (2 - t * e % this.DV) % this.DV) > 0 ? this.DV - e : -e
|
||||
}, s.prototype.isEven = function() {
|
||||
return 0 === (this.t > 0 ? 1 & this[0] : this.s)
|
||||
}, s.prototype.exp = function(t, e) {
|
||||
if (t > 4294967295 || t < 1) return s.ONE;
|
||||
var r = a(),
|
||||
n = a(),
|
||||
i = e.convert(this),
|
||||
o = y(t) - 1;
|
||||
for (i.copyTo(r); --o >= 0;) if (e.sqrTo(r, n), (t & 1 << o) > 0) e.mulTo(n, i, r);
|
||||
else {
|
||||
var f = r;
|
||||
r = n, n = f
|
||||
}
|
||||
return e.revert(r)
|
||||
}, s.prototype.chunkSize = function(t) {
|
||||
return Math.floor(Math.LN2 * this.DB / Math.log(t))
|
||||
}, s.prototype.toRadix = function(t) {
|
||||
if (null == t && (t = 10), 0 === this.signum() || t < 2 || t > 36) return "0";
|
||||
var e = this.chunkSize(t),
|
||||
r = Math.pow(t, e),
|
||||
n = l(r),
|
||||
i = a(),
|
||||
o = a(),
|
||||
s = "";
|
||||
for (this.divRemTo(n, i, o); i.signum() > 0;) s = (r + o.intValue())
|
||||
.toString(t)
|
||||
.substr(1) + s, i.divRemTo(n, i, o);
|
||||
return o.intValue()
|
||||
.toString(t) + s
|
||||
}, s.prototype.fromRadix = function(t, e) {
|
||||
this.fromInt(0), null == e && (e = 10);
|
||||
for (var r = this.chunkSize(e), n = Math.pow(e, r), i = !1, o = 0, a = 0, f = 0; f < t.length; ++f) {
|
||||
var u = p(t, f);
|
||||
u < 0 ? "-" == t.charAt(f) && 0 === this.signum() && (i = !0) : (a = e * a + u, ++o >= r && (this.dMultiply(n), this.dAddOffset(a, 0), o = 0, a = 0))
|
||||
}
|
||||
o > 0 && (this.dMultiply(Math.pow(e, o)), this.dAddOffset(a, 0)), i && s.ZERO.subTo(this, this)
|
||||
}, s.prototype.fromNumber = function(t, e) {
|
||||
if ("number" == typeof e) if (t < 2) this.fromInt(1);
|
||||
else for (this.fromNumber(t), this.testBit(t - 1) || this.bitwiseTo(s.ONE.shiftLeft(t - 1), m, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(e);) this.dAddOffset(2, 0), this.bitLength() > t && this.subTo(s.ONE.shiftLeft(t - 1), this);
|
||||
else {
|
||||
var r = i.randomBytes(1 + (t >> 3)),
|
||||
n = 7 & t;
|
||||
n > 0 ? r[0] &= (1 << n) - 1 : r[0] = 0, this.fromByteArray(r)
|
||||
}
|
||||
}, s.prototype.bitwiseTo = function(t, e, r) {
|
||||
var n, i, o = Math.min(t.t, this.t);
|
||||
for (n = 0; n < o; ++n) r[n] = e(this[n], t[n]);
|
||||
if (t.t < this.t) {
|
||||
for (i = t.s & this.DM, n = o; n < this.t; ++n) r[n] = e(this[n], i);
|
||||
r.t = this.t
|
||||
} else {
|
||||
for (i = this.s & this.DM, n = o; n < t.t; ++n) r[n] = e(i, t[n]);
|
||||
r.t = t.t
|
||||
}
|
||||
r.s = e(this.s, t.s), r.clamp()
|
||||
}, s.prototype.changeBit = function(t, e) {
|
||||
var r = s.ONE.shiftLeft(t);
|
||||
return this.bitwiseTo(r, e, r), r
|
||||
}, s.prototype.addTo = function(t, e) {
|
||||
for (var r = 0, n = 0, i = Math.min(t.t, this.t); r < i;) n += this[r] + t[r], e[r++] = n & this.DM, n >>= this.DB;
|
||||
if (t.t < this.t) {
|
||||
for (n += t.s; r < this.t;) n += this[r], e[r++] = n & this.DM, n >>= this.DB;
|
||||
n += this.s
|
||||
} else {
|
||||
for (n += this.s; r < t.t;) n += t[r], e[r++] = n & this.DM, n >>= this.DB;
|
||||
n += t.s
|
||||
}
|
||||
e.s = n < 0 ? -1 : 0, n > 0 ? e[r++] = n : n < -1 && (e[r++] = this.DV + n), e.t = r, e.clamp()
|
||||
}, s.prototype.dMultiply = function(t) {
|
||||
this[this.t] = this.am(0, t - 1, this, 0, 0, this.t), ++this.t, this.clamp()
|
||||
}, s.prototype.dAddOffset = function(t, e) {
|
||||
if (0 !== t) {
|
||||
for (; this.t <= e;) this[this.t++] = 0;
|
||||
for (this[e] += t; this[e] >= this.DV;) this[e] -= this.DV, ++e >= this.t && (this[this.t++] = 0), ++this[e]
|
||||
}
|
||||
}, s.prototype.multiplyLowerTo = function(t, e, r) {
|
||||
var n, i = Math.min(this.t + t.t, e);
|
||||
for (r.s = 0, r.t = i; i > 0;) r[--i] = 0;
|
||||
for (n = r.t - this.t; i < n; ++i) r[i + this.t] = this.am(0, t[i], r, i, 0, this.t);
|
||||
for (n = Math.min(t.t, e); i < n; ++i) this.am(0, t[i], r, i, 0, e - i);
|
||||
r.clamp()
|
||||
}, s.prototype.multiplyUpperTo = function(t, e, r) {
|
||||
--e;
|
||||
var n = r.t = this.t + t.t - e;
|
||||
for (r.s = 0; --n >= 0;) r[n] = 0;
|
||||
for (n = Math.max(e - this.t, 0); n < t.t; ++n) r[this.t + n - e] = this.am(e - n, t[n], r, 0, 0, this.t + n - e);
|
||||
r.clamp(), r.drShiftTo(1, r)
|
||||
}, s.prototype.modInt = function(t) {
|
||||
if (t <= 0) return 0;
|
||||
var e = this.DV % t,
|
||||
r = this.s < 0 ? t - 1 : 0;
|
||||
if (this.t > 0) if (0 === e) r = this[0] % t;
|
||||
else for (var n = this.t - 1; n >= 0; --n) r = (e * r + this[n]) % t;
|
||||
return r
|
||||
}, s.prototype.millerRabin = function(t) {
|
||||
var e = this.subtract(s.ONE),
|
||||
r = e.getLowestSetBit();
|
||||
if (r <= 0) return !1;
|
||||
var n = e.shiftRight(r);
|
||||
(t = t + 1 >> 1) > A.length && (t = A.length);
|
||||
for (var i = a(), o = 0; o < t; ++o) {
|
||||
i.fromInt(A[Math.floor(Math.random() * A.length)]);
|
||||
var f = i.modPow(n, this);
|
||||
if (0 != f.compareTo(s.ONE) && 0 != f.compareTo(e)) {
|
||||
for (var u = 1; u++ < r && 0 != f.compareTo(e);) if (0 === (f = f.modPowInt(2, this))
|
||||
.compareTo(s.ONE)) return !1;
|
||||
if (0 != f.compareTo(e)) return !1
|
||||
}
|
||||
}
|
||||
return !0
|
||||
}, s.prototype.toString = function(t) {
|
||||
if (this.s < 0) return "-" + this.negate()
|
||||
.toString(t);
|
||||
var e;
|
||||
if (16 == t) e = 4;
|
||||
else if (8 == t) e = 3;
|
||||
else if (2 == t) e = 1;
|
||||
else if (32 == t) e = 5;
|
||||
else {
|
||||
if (4 != t) return this.toRadix(t);
|
||||
e = 2
|
||||
}
|
||||
var r, n = (1 << e) - 1,
|
||||
i = !1,
|
||||
o = "",
|
||||
s = this.t,
|
||||
a = this.DB - s * this.DB % e;
|
||||
if (s-- > 0) for (a < this.DB && (r = this[s] >> a) > 0 && (i = !0, o = h(r)); s >= 0;) a < e ? (r = (this[s] & (1 << a) - 1) << e - a, r |= this[--s] >> (a += this.DB - e)) : (r = this[s] >> (a -= e) & n, a <= 0 && (a += this.DB, --s)), r > 0 && (i = !0), i && (o += h(r));
|
||||
return i ? o : "0"
|
||||
}, s.prototype.negate = function() {
|
||||
var t = a();
|
||||
return s.ZERO.subTo(this, t), t
|
||||
}, s.prototype.abs = function() {
|
||||
return this.s < 0 ? this.negate() : this
|
||||
}, s.prototype.compareTo = function(t) {
|
||||
var e = this.s - t.s;
|
||||
if (0 != e) return e;
|
||||
var r = this.t;
|
||||
if (0 != (e = r - t.t)) return this.s < 0 ? -e : e;
|
||||
for (; --r >= 0;) if (0 != (e = this[r] - t[r])) return e;
|
||||
return 0
|
||||
}, s.prototype.bitLength = function() {
|
||||
return this.t <= 0 ? 0 : this.DB * (this.t - 1) + y(this[this.t - 1] ^ this.s & this.DM)
|
||||
}, s.prototype.mod = function(t) {
|
||||
var e = a();
|
||||
return this.abs()
|
||||
.divRemTo(t, null, e), this.s < 0 && e.compareTo(s.ZERO) > 0 && t.subTo(e, e), e
|
||||
}, s.prototype.modPowInt = function(t, e) {
|
||||
var r;
|
||||
return r = t < 256 || e.isEven() ? new g(e) : new d(e), this.exp(t, r)
|
||||
}, s.prototype.clone = function() {
|
||||
var t = a();
|
||||
return this.copyTo(t), t
|
||||
}, s.prototype.intValue = function() {
|
||||
if (this.s < 0) {
|
||||
if (1 == this.t) return this[0] - this.DV;
|
||||
if (0 === this.t) return -1
|
||||
} else {
|
||||
if (1 == this.t) return this[0];
|
||||
if (0 === this.t) return 0
|
||||
}
|
||||
return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]
|
||||
}, s.prototype.byteValue = function() {
|
||||
return 0 == this.t ? this.s : this[0] << 24 >> 24
|
||||
}, s.prototype.shortValue = function() {
|
||||
return 0 == this.t ? this.s : this[0] << 16 >> 16
|
||||
}, s.prototype.signum = function() {
|
||||
return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1
|
||||
}, s.prototype.toByteArray = function() {
|
||||
var t = this.t,
|
||||
e = new Array;
|
||||
e[0] = this.s;
|
||||
var r, n = this.DB - t * this.DB % 8,
|
||||
i = 0;
|
||||
if (t-- > 0) for (n < this.DB && (r = this[t] >> n) != (this.s & this.DM) >> n && (e[i++] = r | this.s << this.DB - n); t >= 0;) n < 8 ? (r = (this[t] & (1 << n) - 1) << 8 - n, r |= this[--t] >> (n += this.DB - 8)) : (r = this[t] >> (n -= 8) & 255, n <= 0 && (n += this.DB, --t)), 128 & r && (r |= -256), 0 === i && (128 & this.s) != (128 & r) && ++i, (i > 0 || r != this.s) && (e[i++] = r);
|
||||
return e
|
||||
}, s.prototype.toBuffer = function(t) {
|
||||
var e = n.from(this.toByteArray());
|
||||
if (!0 === t && 0 === e[0]) e = e.slice(1);
|
||||
else if (o.isNumber(t)) {
|
||||
if (e.length > t) {
|
||||
for (var r = 0; r < e.length - t; r++) if (0 !== e[r]) return null;
|
||||
return e.slice(e.length - t)
|
||||
}
|
||||
if (e.length < t) {
|
||||
var i = n.alloc(t);
|
||||
return i.fill(0, 0, t - e.length), e.copy(i, t - e.length), i
|
||||
}
|
||||
}
|
||||
return e
|
||||
}, s.prototype.equals = function(t) {
|
||||
return 0 == this.compareTo(t)
|
||||
}, s.prototype.min = function(t) {
|
||||
return this.compareTo(t) < 0 ? this : t
|
||||
}, s.prototype.max = function(t) {
|
||||
return this.compareTo(t) > 0 ? this : t
|
||||
}, s.prototype.and = function(t) {
|
||||
var e = a();
|
||||
return this.bitwiseTo(t, v, e), e
|
||||
}, s.prototype.or = function(t) {
|
||||
var e = a();
|
||||
return this.bitwiseTo(t, m, e), e
|
||||
}, s.prototype.xor = function(t) {
|
||||
var e = a();
|
||||
return this.bitwiseTo(t, S, e), e
|
||||
}, s.prototype.andNot = function(t) {
|
||||
var e = a();
|
||||
return this.bitwiseTo(t, _, e), e
|
||||
}, s.prototype.not = function() {
|
||||
for (var t = a(), e = 0; e < this.t; ++e) t[e] = this.DM & ~this[e];
|
||||
return t.t = this.t, t.s = ~this.s, t
|
||||
}, s.prototype.shiftLeft = function(t) {
|
||||
var e = a();
|
||||
return t < 0 ? this.rShiftTo(-t, e) : this.lShiftTo(t, e), e
|
||||
}, s.prototype.shiftRight = function(t) {
|
||||
var e = a();
|
||||
return t < 0 ? this.lShiftTo(-t, e) : this.rShiftTo(t, e), e
|
||||
}, s.prototype.getLowestSetBit = function() {
|
||||
for (var t = 0; t < this.t; ++t) if (0 != this[t]) return t * this.DB + b(this[t]);
|
||||
return this.s < 0 ? this.t * this.DB : -1
|
||||
}, s.prototype.bitCount = function() {
|
||||
for (var t = 0, e = this.s & this.DM, r = 0; r < this.t; ++r) t += E(this[r] ^ e);
|
||||
return t
|
||||
}, s.prototype.testBit = function(t) {
|
||||
var e = Math.floor(t / this.DB);
|
||||
return e >= this.t ? 0 != this.s : !! (this[e] & 1 << t % this.DB)
|
||||
}, s.prototype.setBit = function(t) {
|
||||
return this.changeBit(t, m)
|
||||
}, s.prototype.clearBit = function(t) {
|
||||
return this.changeBit(t, _)
|
||||
}, s.prototype.flipBit = function(t) {
|
||||
return this.changeBit(t, S)
|
||||
}, s.prototype.add = function(t) {
|
||||
var e = a();
|
||||
return this.addTo(t, e), e
|
||||
}, s.prototype.subtract = function(t) {
|
||||
var e = a();
|
||||
return this.subTo(t, e), e
|
||||
}, s.prototype.multiply = function(t) {
|
||||
var e = a();
|
||||
return this.multiplyTo(t, e), e
|
||||
}, s.prototype.divide = function(t) {
|
||||
var e = a();
|
||||
return this.divRemTo(t, e, null), e
|
||||
}, s.prototype.remainder = function(t) {
|
||||
var e = a();
|
||||
return this.divRemTo(t, null, e), e
|
||||
}, s.prototype.divideAndRemainder = function(t) {
|
||||
var e = a(),
|
||||
r = a();
|
||||
return this.divRemTo(t, e, r), new Array(e, r)
|
||||
}, s.prototype.modPow = function(t, e) {
|
||||
var r, n, i = t.bitLength(),
|
||||
o = l(1);
|
||||
if (i <= 0) return o;
|
||||
r = i < 18 ? 1 : i < 48 ? 3 : i < 144 ? 4 : i < 768 ? 5 : 6, n = i < 8 ? new g(e) : e.isEven() ? new B(e) : new d(e);
|
||||
var s = new Array,
|
||||
f = 3,
|
||||
u = r - 1,
|
||||
c = (1 << r) - 1;
|
||||
if (s[1] = n.convert(this), r > 1) {
|
||||
var h = a();
|
||||
for (n.sqrTo(s[1], h); f <= c;) s[f] = a(), n.mulTo(h, s[f - 2], s[f]), f += 2
|
||||
}
|
||||
var p, v, m = t.t - 1,
|
||||
S = !0,
|
||||
_ = a();
|
||||
for (i = y(t[m]) - 1; m >= 0;) {
|
||||
for (i >= u ? p = t[m] >> i - u & c : (p = (t[m] & (1 << i + 1) - 1) << u - i, m > 0 && (p |= t[m - 1] >> this.DB + i - u)), f = r; !(1 & p);) p >>= 1, --f;
|
||||
if ((i -= f) < 0 && (i += this.DB, --m), S) s[p].copyTo(o), S = !1;
|
||||
else {
|
||||
for (; f > 1;) n.sqrTo(o, _), n.sqrTo(_, o), f -= 2;
|
||||
f > 0 ? n.sqrTo(o, _) : (v = o, o = _, _ = v), n.mulTo(_, s[p], o)
|
||||
}
|
||||
for (; m >= 0 && !(t[m] & 1 << i);) n.sqrTo(o, _), v = o, o = _, _ = v, --i < 0 && (i = this.DB - 1, --m)
|
||||
}
|
||||
return n.revert(o)
|
||||
}, s.prototype.modInverse = function(t) {
|
||||
var e = t.isEven();
|
||||
if (this.isEven() && e || 0 === t.signum()) return s.ZERO;
|
||||
for (var r = t.clone(), n = this.clone(), i = l(1), o = l(0), a = l(0), f = l(1); 0 != r.signum();) {
|
||||
for (; r.isEven();) r.rShiftTo(1, r), e ? (i.isEven() && o.isEven() || (i.addTo(this, i), o.subTo(t, o)), i.rShiftTo(1, i)) : o.isEven() || o.subTo(t, o), o.rShiftTo(1, o);
|
||||
for (; n.isEven();) n.rShiftTo(1, n), e ? (a.isEven() && f.isEven() || (a.addTo(this, a), f.subTo(t, f)), a.rShiftTo(1, a)) : f.isEven() || f.subTo(t, f), f.rShiftTo(1, f);
|
||||
r.compareTo(n) >= 0 ? (r.subTo(n, r), e && i.subTo(a, i), o.subTo(f, o)) : (n.subTo(r, n), e && a.subTo(i, a), f.subTo(o, f))
|
||||
}
|
||||
return 0 != n.compareTo(s.ONE) ? s.ZERO : f.compareTo(t) >= 0 ? f.subtract(t) : f.signum() < 0 ? (f.addTo(t, f), f.signum() < 0 ? f.add(t) : f) : f
|
||||
}, s.prototype.pow = function(t) {
|
||||
return this.exp(t, new w)
|
||||
}, s.prototype.gcd = function(t) {
|
||||
var e = this.s < 0 ? this.negate() : this.clone(),
|
||||
r = t.s < 0 ? t.negate() : t.clone();
|
||||
if (e.compareTo(r) < 0) {
|
||||
var n = e;
|
||||
e = r, r = n
|
||||
}
|
||||
var i = e.getLowestSetBit(),
|
||||
o = r.getLowestSetBit();
|
||||
if (o < 0) return e;
|
||||
for (i < o && (o = i), o > 0 && (e.rShiftTo(o, e), r.rShiftTo(o, r)); e.signum() > 0;)(i = e.getLowestSetBit()) > 0 && e.rShiftTo(i, e), (i = r.getLowestSetBit()) > 0 && r.rShiftTo(i, r), e.compareTo(r) >= 0 ? (e.subTo(r, e), e.rShiftTo(1, e)) : (r.subTo(e, r), r.rShiftTo(1, r));
|
||||
return o > 0 && r.lShiftTo(o, r), r
|
||||
}, s.prototype.isProbablePrime = function(t) {
|
||||
var e, r = this.abs();
|
||||
if (1 == r.t && r[0] <= A[A.length - 1]) {
|
||||
for (e = 0; e < A.length; ++e) if (r[0] == A[e]) return !0;
|
||||
return !1
|
||||
}
|
||||
if (r.isEven()) return !1;
|
||||
for (e = 1; e < A.length;) {
|
||||
for (var n = A[e], i = e + 1; i < A.length && n < x;) n *= A[i++];
|
||||
for (n = r.modInt(n); e < i;) if (n % A[e++] == 0) return !1
|
||||
}
|
||||
return r.millerRabin(t)
|
||||
}, s.int2char = h, s.ZERO = l(0), s.ONE = l(1), s.prototype.square = function() {
|
||||
var t = a();
|
||||
return this.squareTo(t), t
|
||||
}, t.exports = s
|
||||
},
|
||||
5682: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(8226)
|
||||
._,
|
||||
o = (r(3200), r(1973)),
|
||||
s = r(8226),
|
||||
a = r(1768),
|
||||
f = r(4538);
|
||||
e.BigInteger = o, t.exports.Key = function() {
|
||||
function t() {
|
||||
this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null
|
||||
}
|
||||
return t.prototype.setOptions = function(t) {
|
||||
var e = a[t.signingScheme],
|
||||
r = a[t.encryptionScheme];
|
||||
e === r ? this.signingScheme = this.encryptionScheme = r.makeScheme(this, t) : (this.encryptionScheme = r.makeScheme(this, t), this.signingScheme = e.makeScheme(this, t)), this.encryptEngine = f.getEngine(this, t)
|
||||
}, t.prototype.generate = function(t, e) {
|
||||
var r = t >> 1;
|
||||
this.e = parseInt(e, 16);
|
||||
for (var n = new o(e, 16);;) {
|
||||
for (; this.p = new o(t - r, 1), 0 !== this.p.subtract(o.ONE)
|
||||
.gcd(n)
|
||||
.compareTo(o.ONE) || !this.p.isProbablePrime(10););
|
||||
for (; this.q = new o(r, 1), 0 !== this.q.subtract(o.ONE)
|
||||
.gcd(n)
|
||||
.compareTo(o.ONE) || !this.q.isProbablePrime(10););
|
||||
if (this.p.compareTo(this.q) <= 0) {
|
||||
var i = this.p;
|
||||
this.p = this.q, this.q = i
|
||||
}
|
||||
var s = this.p.subtract(o.ONE),
|
||||
a = this.q.subtract(o.ONE),
|
||||
f = s.multiply(a);
|
||||
if (0 === f.gcd(n)
|
||||
.compareTo(o.ONE)) {
|
||||
if (this.n = this.p.multiply(this.q), this.n.bitLength() < t) continue;
|
||||
this.d = n.modInverse(f), this.dmp1 = this.d.mod(s), this.dmq1 = this.d.mod(a), this.coeff = this.q.modInverse(this.p);
|
||||
break
|
||||
}
|
||||
}
|
||||
this.$$recalculateCache()
|
||||
}, t.prototype.setPrivate = function(t, e, r, n, a, f, u, c) {
|
||||
if (!(t && e && r && t.length > 0 && (i.isNumber(e) || e.length > 0) && r.length > 0)) throw Error("Invalid RSA private key");
|
||||
this.n = new o(t), this.e = i.isNumber(e) ? e : s.get32IntFromBuffer(e, 0), this.d = new o(r), n && a && f && u && c && (this.p = new o(n), this.q = new o(a), this.dmp1 = new o(f), this.dmq1 = new o(u), this.coeff = new o(c)), this.$$recalculateCache()
|
||||
}, t.prototype.setPublic = function(t, e) {
|
||||
if (!(t && e && t.length > 0 && (i.isNumber(e) || e.length > 0))) throw Error("Invalid RSA public key");
|
||||
this.n = new o(t), this.e = i.isNumber(e) ? e : s.get32IntFromBuffer(e, 0), this.$$recalculateCache()
|
||||
}, t.prototype.$doPrivate = function(t) {
|
||||
if (this.p || this.q) return t.modPow(this.d, this.n);
|
||||
for (var e = t.mod(this.p)
|
||||
.modPow(this.dmp1, this.p), r = t.mod(this.q)
|
||||
.modPow(this.dmq1, this.q); e.compareTo(r) < 0;) e = e.add(this.p);
|
||||
return e.subtract(r)
|
||||
.multiply(this.coeff)
|
||||
.mod(this.p)
|
||||
.multiply(this.q)
|
||||
.add(r)
|
||||
}, t.prototype.$doPublic = function(t) {
|
||||
return t.modPowInt(this.e, this.n)
|
||||
}, t.prototype.encrypt = function(t, e) {
|
||||
var r = [],
|
||||
i = [],
|
||||
o = t.length,
|
||||
s = Math.ceil(o / this.maxMessageLength) || 1,
|
||||
a = Math.ceil(o / s || 1);
|
||||
if (1 == s) r.push(t);
|
||||
else for (var f = 0; f < s; f++) r.push(t.slice(f * a, (f + 1) * a));
|
||||
for (var u = 0; u < r.length; u++) i.push(this.encryptEngine.encrypt(r[u], e));
|
||||
return n.concat(i)
|
||||
}, t.prototype.decrypt = function(t, e) {
|
||||
if (t.length % this.encryptedDataLength > 0) throw Error("Incorrect data or key");
|
||||
for (var r = [], i = 0, o = 0, s = t.length / this.encryptedDataLength, a = 0; a < s; a++) o = (i = a * this.encryptedDataLength) + this.encryptedDataLength, r.push(this.encryptEngine.decrypt(t.slice(i, Math.min(o, t.length)), e));
|
||||
return n.concat(r)
|
||||
}, t.prototype.sign = function(t) {
|
||||
return this.signingScheme.sign.apply(this.signingScheme, arguments)
|
||||
}, t.prototype.verify = function(t, e, r) {
|
||||
return this.signingScheme.verify.apply(this.signingScheme, arguments)
|
||||
}, t.prototype.isPrivate = function() {
|
||||
return !!(this.n && this.e && this.d)
|
||||
}, t.prototype.isPublic = function(t) {
|
||||
return this.n && this.e && !(t && this.d) || !1
|
||||
}, Object.defineProperty(t.prototype, "keySize", {
|
||||
get: function() {
|
||||
return this.cache.keyBitLength
|
||||
}
|
||||
}), Object.defineProperty(t.prototype, "encryptedDataLength", {
|
||||
get: function() {
|
||||
return this.cache.keyByteLength
|
||||
}
|
||||
}), Object.defineProperty(t.prototype, "maxMessageLength", {
|
||||
get: function() {
|
||||
return this.encryptionScheme.maxMessageLength()
|
||||
}
|
||||
}), t.prototype.$$recalculateCache = function() {
|
||||
this.cache = this.cache || {}, this.cache.keyBitLength = this.n.bitLength(), this.cache.keyByteLength = this.cache.keyBitLength + 6 >> 3
|
||||
}, t
|
||||
}()
|
||||
},
|
||||
2487: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = (r(1973), r(3200));
|
||||
t.exports = {
|
||||
isEncryption: !0,
|
||||
isSignature: !1
|
||||
}, t.exports.digestLength = {
|
||||
md4: 16,
|
||||
md5: 16,
|
||||
ripemd160: 20,
|
||||
rmd160: 20,
|
||||
sha1: 20,
|
||||
sha224: 28,
|
||||
sha256: 32,
|
||||
sha384: 48,
|
||||
sha512: 64
|
||||
};
|
||||
var o = "sha1";
|
||||
t.exports.eme_oaep_mgf1 = function(e, r, s) {
|
||||
s = s || o;
|
||||
for (var a = t.exports.digestLength[s], f = Math.ceil(r / a), u = n.alloc(a * f), c = n.alloc(4), h = 0; h < f; ++h) {
|
||||
var p = i.createHash(s);
|
||||
p.update(e), c.writeUInt32BE(h, 0), p.update(c), p.digest()
|
||||
.copy(u, h * a)
|
||||
}
|
||||
return u.slice(0, r)
|
||||
}, t.exports.makeScheme = function(e, r) {
|
||||
function s(t, e) {
|
||||
this.key = t, this.options = e
|
||||
}
|
||||
return s.prototype.maxMessageLength = function() {
|
||||
return this.key.encryptedDataLength - 2 * t.exports.digestLength[this.options.encryptionSchemeOptions.hash || o] - 2
|
||||
}, s.prototype.encPad = function(e) {
|
||||
var r = this.options.encryptionSchemeOptions.hash || o,
|
||||
s = this.options.encryptionSchemeOptions.mgf || t.exports.eme_oaep_mgf1,
|
||||
a = this.options.encryptionSchemeOptions.label || n.alloc(0),
|
||||
f = this.key.encryptedDataLength,
|
||||
u = t.exports.digestLength[r];
|
||||
if (e.length > f - 2 * u - 2) throw new Error("Message is too long to encode into an encoded message with a length of " + f + " bytes, increaseemLen to fix this error (minimum value for given parameters and options: " + (f - 2 * u - 2) + ")");
|
||||
var c = i.createHash(r);
|
||||
c.update(a), c = c.digest();
|
||||
var h = n.alloc(f - e.length - 2 * u - 1);
|
||||
h.fill(0), h[h.length - 1] = 1;
|
||||
for (var p = n.concat([c, h, e]), l = i.randomBytes(u), y = s(l, p.length, r), g = 0; g < p.length; g++) p[g] ^= y[g];
|
||||
for (y = s(p, u, r), g = 0; g < l.length; g++) l[g] ^= y[g];
|
||||
var d = n.alloc(1 + l.length + p.length);
|
||||
return d[0] = 0, l.copy(d, 1), p.copy(d, 1 + l.length), d
|
||||
}, s.prototype.encUnPad = function(e) {
|
||||
var r = this.options.encryptionSchemeOptions.hash || o,
|
||||
s = this.options.encryptionSchemeOptions.mgf || t.exports.eme_oaep_mgf1,
|
||||
a = this.options.encryptionSchemeOptions.label || n.alloc(0),
|
||||
f = t.exports.digestLength[r];
|
||||
if (e.length < 2 * f + 2) throw new Error("Error decoding message, the supplied message is not long enough to be a valid OAEP encoded message");
|
||||
for (var u = e.slice(1, f + 1), c = e.slice(1 + f), h = s(c, f, r), p = 0; p < u.length; p++) u[p] ^= h[p];
|
||||
for (h = s(u, c.length, r), p = 0; p < c.length; p++) c[p] ^= h[p];
|
||||
var l = i.createHash(r);
|
||||
if (l.update(a), l = l.digest(), c.slice(0, f)
|
||||
.toString("hex") != l.toString("hex")) throw new Error("Error decoding message, the lHash calculated from the label provided and the lHash in the encrypted data do not match.");
|
||||
for (p = f; 0 === c[p++] && p < c.length;);
|
||||
if (1 != c[p - 1]) throw new Error("Error decoding message, there is no padding message separator byte");
|
||||
return c.slice(p)
|
||||
}, new s(e, r)
|
||||
}
|
||||
},
|
||||
8290: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(1973),
|
||||
o = r(3200),
|
||||
s = r(7449),
|
||||
a = {
|
||||
md2: n.from("3020300c06082a864886f70d020205000410", "hex"),
|
||||
md5: n.from("3020300c06082a864886f70d020505000410", "hex"),
|
||||
sha1: n.from("3021300906052b0e03021a05000414", "hex"),
|
||||
sha224: n.from("302d300d06096086480165030402040500041c", "hex"),
|
||||
sha256: n.from("3031300d060960864801650304020105000420", "hex"),
|
||||
sha384: n.from("3041300d060960864801650304020205000430", "hex"),
|
||||
sha512: n.from("3051300d060960864801650304020305000440", "hex"),
|
||||
ripemd160: n.from("3021300906052b2403020105000414", "hex"),
|
||||
rmd160: n.from("3021300906052b2403020105000414", "hex")
|
||||
}, f = {
|
||||
ripemd160: "rmd160"
|
||||
}, u = "sha256";
|
||||
t.exports = {
|
||||
isEncryption: !0,
|
||||
isSignature: !0
|
||||
}, t.exports.makeScheme = function(t, e) {
|
||||
function r(t, e) {
|
||||
this.key = t, this.options = e
|
||||
}
|
||||
return r.prototype.maxMessageLength = function() {
|
||||
return this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == s.RSA_NO_PADDING ? this.key.encryptedDataLength : this.key.encryptedDataLength - 11
|
||||
}, r.prototype.encPad = function(t, e) {
|
||||
var r;
|
||||
if (e = e || {}, t.length > this.key.maxMessageLength) throw new Error("Message too long for RSA (n=" + this.key.encryptedDataLength + ", l=" + t.length + ")");
|
||||
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == s.RSA_NO_PADDING) return (r = n.alloc(this.key.maxMessageLength - t.length))
|
||||
.fill(0), n.concat([r, t]);
|
||||
if (1 === e.type) return (r = n.alloc(this.key.encryptedDataLength - t.length - 1))
|
||||
.fill(255, 0, r.length - 1), r[0] = 1, r[r.length - 1] = 0, n.concat([r, t]);
|
||||
(r = n.alloc(this.key.encryptedDataLength - t.length))[0] = 0, r[1] = 2;
|
||||
for (var i = o.randomBytes(r.length - 3), a = 0; a < i.length; a++) {
|
||||
for (var f = i[a]; 0 === f;) f = o.randomBytes(1)[0];
|
||||
r[a + 2] = f
|
||||
}
|
||||
return r[r.length - 1] = 0, n.concat([r, t])
|
||||
}, r.prototype.encUnPad = function(t, e) {
|
||||
e = e || {};
|
||||
var r = 0;
|
||||
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == s.RSA_NO_PADDING) return "function" == typeof t.lastIndexOf ? t.slice(t.lastIndexOf("\0") + 1, t.length) : t.slice(String.prototype.lastIndexOf.call(t, "\0") + 1, t.length);
|
||||
if (t.length < 4) return null;
|
||||
if (1 === e.type) {
|
||||
if (0 !== t[0] || 1 !== t[1]) return null;
|
||||
for (r = 3; 0 !== t[r];) if (255 != t[r] || ++r >= t.length) return null
|
||||
} else {
|
||||
if (0 !== t[0] || 2 !== t[1]) return null;
|
||||
for (r = 3; 0 !== t[r];) if (++r >= t.length) return null
|
||||
}
|
||||
return t.slice(r + 1, t.length)
|
||||
}, r.prototype.sign = function(t) {
|
||||
var e = this.options.signingSchemeOptions.hash || u;
|
||||
if ("browser" === this.options.environment) {
|
||||
e = f[e] || e;
|
||||
var r = o.createHash(e);
|
||||
r.update(t);
|
||||
var n = this.pkcs1pad(r.digest(), e);
|
||||
return this.key.$doPrivate(new i(n))
|
||||
.toBuffer(this.key.encryptedDataLength)
|
||||
}
|
||||
var s = o.createSign("RSA-" + e.toUpperCase());
|
||||
return s.update(t), s.sign(this.options.rsaUtils.exportKey("private"))
|
||||
}, r.prototype.verify = function(t, e, r) {
|
||||
if (this.options.encryptionSchemeOptions && this.options.encryptionSchemeOptions.padding == s.RSA_NO_PADDING) return !1;
|
||||
var a = this.options.signingSchemeOptions.hash || u;
|
||||
if ("browser" === this.options.environment) {
|
||||
a = f[a] || a, r && (e = n.from(e, r));
|
||||
var c = o.createHash(a);
|
||||
c.update(t);
|
||||
var h = this.pkcs1pad(c.digest(), a);
|
||||
return this.key.$doPublic(new i(e))
|
||||
.toBuffer()
|
||||
.toString("hex") == h.toString("hex")
|
||||
}
|
||||
var p = o.createVerify("RSA-" + a.toUpperCase());
|
||||
return p.update(t), p.verify(this.options.rsaUtils.exportKey("public"), e, r)
|
||||
}, r.prototype.pkcs0pad = function(t) {
|
||||
var e = n.alloc(this.key.maxMessageLength - t.length);
|
||||
return e.fill(0), n.concat([e, t])
|
||||
}, r.prototype.pkcs0unpad = function(t) {
|
||||
return "function" == typeof t.lastIndexOf ? t.slice(t.lastIndexOf("\0") + 1, t.length) : t.slice(String.prototype.lastIndexOf.call(t, "\0") + 1, t.length)
|
||||
}, r.prototype.pkcs1pad = function(t, e) {
|
||||
var r = a[e];
|
||||
if (!r) throw Error("Unsupported hash algorithm");
|
||||
var i = n.concat([r, t]);
|
||||
if (i.length + 10 > this.key.encryptedDataLength) throw Error("Key is too short for signing algorithm (" + e + ")");
|
||||
var o = n.alloc(this.key.encryptedDataLength - i.length - 1);
|
||||
return o.fill(255, 0, o.length - 1), o[0] = 1, o[o.length - 1] = 0, n.concat([o, i])
|
||||
}, new r(t, e)
|
||||
}
|
||||
},
|
||||
4414: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(1973),
|
||||
o = r(3200);
|
||||
t.exports = {
|
||||
isEncryption: !1,
|
||||
isSignature: !0
|
||||
};
|
||||
var s = "sha1";
|
||||
t.exports.makeScheme = function(t, e) {
|
||||
var a = r(1768)
|
||||
.pkcs1_oaep;
|
||||
|
||||
function f(t, e) {
|
||||
this.key = t, this.options = e
|
||||
}
|
||||
return f.prototype.sign = function(t) {
|
||||
var e = o.createHash(this.options.signingSchemeOptions.hash || s);
|
||||
e.update(t);
|
||||
var r = this.emsa_pss_encode(e.digest(), this.key.keySize - 1);
|
||||
return this.key.$doPrivate(new i(r))
|
||||
.toBuffer(this.key.encryptedDataLength)
|
||||
}, f.prototype.verify = function(t, e, r) {
|
||||
r && (e = n.from(e, r)), e = new i(e);
|
||||
var a = Math.ceil((this.key.keySize - 1) / 8),
|
||||
f = this.key.$doPublic(e)
|
||||
.toBuffer(a),
|
||||
u = o.createHash(this.options.signingSchemeOptions.hash || s);
|
||||
return u.update(t), this.emsa_pss_verify(u.digest(), f, this.key.keySize - 1)
|
||||
}, f.prototype.emsa_pss_encode = function(t, e) {
|
||||
var r = this.options.signingSchemeOptions.hash || s,
|
||||
i = this.options.signingSchemeOptions.mgf || a.eme_oaep_mgf1,
|
||||
f = this.options.signingSchemeOptions.saltLength || 20,
|
||||
u = a.digestLength[r],
|
||||
c = Math.ceil(e / 8);
|
||||
if (c < u + f + 2) throw new Error("Output length passed to emBits(" + e + ") is too small for the options specified(" + r + ", " + f + "). To fix this issue increase the value of emBits. (minimum size: " + (8 * u + 8 * f + 9) + ")");
|
||||
var h = o.randomBytes(f),
|
||||
p = n.alloc(8 + u + f);
|
||||
p.fill(0, 0, 8), t.copy(p, 8), h.copy(p, 8 + t.length);
|
||||
var l = o.createHash(r);
|
||||
l.update(p), l = l.digest();
|
||||
var y = n.alloc(c - h.length - u - 2);
|
||||
y.fill(0);
|
||||
var g = n.alloc(y.length + 1 + h.length);
|
||||
y.copy(g), g[y.length] = 1, h.copy(g, y.length + 1);
|
||||
for (var d = i(l, g.length, r), v = n.alloc(g.length), m = 0; m < d.length; m++) v[m] = g[m] ^ d[m];
|
||||
var S = 8 * c - e,
|
||||
_ = 255 ^ 255 >> 8 - S << 8 - S;
|
||||
v[0] = v[0] & _;
|
||||
var b = n.alloc(v.length + l.length + 1);
|
||||
return v.copy(b, 0), l.copy(b, v.length), b[b.length - 1] = 188, b
|
||||
}, f.prototype.emsa_pss_verify = function(t, e, r) {
|
||||
var i = this.options.signingSchemeOptions.hash || s,
|
||||
f = this.options.signingSchemeOptions.mgf || a.eme_oaep_mgf1,
|
||||
u = this.options.signingSchemeOptions.saltLength || 20,
|
||||
c = a.digestLength[i],
|
||||
h = Math.ceil(r / 8);
|
||||
if (h < c + u + 2 || 188 != e[e.length - 1]) return !1;
|
||||
var p = n.alloc(h - c - 1);
|
||||
e.copy(p, 0, 0, h - c - 1);
|
||||
for (var l = 0, y = 0, g = 8 * h - r; y < g; y++) l |= 1 << 7 - y;
|
||||
if (p[0] & l) return !1;
|
||||
var d = e.slice(h - c - 1, h - 1),
|
||||
v = f(d, p.length, i);
|
||||
for (y = 0; y < p.length; y++) p[y] ^= v[y];
|
||||
for (l = 255 ^ 255 >> 8 - (g = 8 * h - r) << 8 - g, p[0] = p[0] & l, y = 0; 0 === p[y] && y < p.length; y++);
|
||||
if (1 != p[y]) return !1;
|
||||
var m = p.slice(p.length - u),
|
||||
S = n.alloc(8 + c + u);
|
||||
S.fill(0, 0, 8), t.copy(S, 8), m.copy(S, 8 + t.length);
|
||||
var _ = o.createHash(i);
|
||||
return _.update(S), _ = _.digest(), d.toString("hex") === _.toString("hex")
|
||||
}, new f(t, e)
|
||||
}
|
||||
},
|
||||
1768: (t, e, r) => {
|
||||
t.exports = {
|
||||
pkcs1: r(8290),
|
||||
pkcs1_oaep: r(2487),
|
||||
pss: r(4414),
|
||||
isEncryption: function(e) {
|
||||
return t.exports[e] && t.exports[e].isEncryption
|
||||
},
|
||||
isSignature: function(e) {
|
||||
return t.exports[e] && t.exports[e].isSignature
|
||||
}
|
||||
}
|
||||
},
|
||||
8226: (t, e, r) => {
|
||||
var n = r(5606);
|
||||
r(3200), t.exports.linebrk = function(t, e) {
|
||||
for (var r = "", n = 0; n + e < t.length;) r += t.substring(n, n + e) + "\n", n += e;
|
||||
return r + t.substring(n, t.length)
|
||||
}, t.exports.detectEnvironment = function() {
|
||||
return "browser";
|
||||
"undefined" == typeof window || !window || n && "node" === n.title ? "node" : "browser"
|
||||
}, t.exports.get32IntFromBuffer = function(t, e) {
|
||||
var r;
|
||||
if (e = e || 0, (r = t.length - e) > 0) {
|
||||
if (r >= 4) return t.readUIntBE(e, r);
|
||||
for (var n = 0, i = e + r, o = 0; i > e; i--, o += 2) n += t[i - 1] * Math.pow(16, o);
|
||||
return n
|
||||
}
|
||||
return NaN
|
||||
}, t.exports._ = {
|
||||
isObject: function(t) {
|
||||
var e = typeof t;
|
||||
return !!t && ("object" == e || "function" == e)
|
||||
},
|
||||
isString: function(t) {
|
||||
return "string" == typeof t || t instanceof String
|
||||
},
|
||||
isNumber: function(t) {
|
||||
return "number" == typeof t || !isNaN(parseFloat(t)) && isFinite(t)
|
||||
},
|
||||
omit: function(t, e) {
|
||||
var r = {};
|
||||
for (var n in t) t.hasOwnProperty(n) && n !== e && (r[n] = t[n]);
|
||||
return r
|
||||
}
|
||||
}, t.exports.trimSurroundingText = function(t, e, r) {
|
||||
var n = 0,
|
||||
i = t.length,
|
||||
o = t.indexOf(e);
|
||||
o >= 0 && (n = o + e.length);
|
||||
var s = t.indexOf(r, o);
|
||||
return s >= 0 && (i = s), t.substring(n, i)
|
||||
}
|
||||
},
|
||||
8875: (t, e, r) => {
|
||||
"use strict";
|
||||
var n;
|
||||
if (!Object.keys) {
|
||||
var i = Object.prototype.hasOwnProperty,
|
||||
o = Object.prototype.toString,
|
||||
s = r(1093),
|
||||
a = Object.prototype.propertyIsEnumerable,
|
||||
f = !a.call({
|
||||
toString: null
|
||||
}, "toString"),
|
||||
u = a.call((function() {}), "prototype"),
|
||||
c = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"],
|
||||
h = function(t) {
|
||||
var e = t.constructor;
|
||||
return e && e.prototype === t
|
||||
}, p = {
|
||||
$applicationCache: !0,
|
||||
$console: !0,
|
||||
$external: !0,
|
||||
$frame: !0,
|
||||
$frameElement: !0,
|
||||
$frames: !0,
|
||||
$innerHeight: !0,
|
||||
$innerWidth: !0,
|
||||
$onmozfullscreenchange: !0,
|
||||
$onmozfullscreenerror: !0,
|
||||
$outerHeight: !0,
|
||||
$outerWidth: !0,
|
||||
$pageXOffset: !0,
|
||||
$pageYOffset: !0,
|
||||
$parent: !0,
|
||||
$scrollLeft: !0,
|
||||
$scrollTop: !0,
|
||||
$scrollX: !0,
|
||||
$scrollY: !0,
|
||||
$self: !0,
|
||||
$webkitIndexedDB: !0,
|
||||
$webkitStorageInfo: !0,
|
||||
$window: !0
|
||||
}, l = function() {
|
||||
if ("undefined" == typeof window) return !1;
|
||||
for (var t in window) try {
|
||||
if (!p["$" + t] && i.call(window, t) && null !== window[t] && "object" == typeof window[t]) try {
|
||||
h(window[t])
|
||||
} catch (t) {
|
||||
return !0
|
||||
}
|
||||
} catch (t) {
|
||||
return !0
|
||||
}
|
||||
return !1
|
||||
}();
|
||||
n = function(t) {
|
||||
var e = null !== t && "object" == typeof t,
|
||||
r = "[object Function]" === o.call(t),
|
||||
n = s(t),
|
||||
a = e && "[object String]" === o.call(t),
|
||||
p = [];
|
||||
if (!e && !r && !n) throw new TypeError("Object.keys called on a non-object");
|
||||
var y = u && r;
|
||||
if (a && t.length > 0 && !i.call(t, 0)) for (var g = 0; g < t.length; ++g) p.push(String(g));
|
||||
if (n && t.length > 0) for (var d = 0; d < t.length; ++d) p.push(String(d));
|
||||
else for (var v in t) y && "prototype" === v || !i.call(t, v) || p.push(String(v));
|
||||
if (f) for (var m = function(t) {
|
||||
if ("undefined" == typeof window || !l) return h(t);
|
||||
try {
|
||||
return h(t)
|
||||
} catch (t) {
|
||||
return !1
|
||||
}
|
||||
}(t), S = 0; S < c.length; ++S) m && "constructor" === c[S] || !i.call(t, c[S]) || p.push(c[S]);
|
||||
return p
|
||||
}
|
||||
}
|
||||
t.exports = n
|
||||
},
|
||||
1189: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = Array.prototype.slice,
|
||||
i = r(1093),
|
||||
o = Object.keys,
|
||||
s = o ? function(t) {
|
||||
return o(t)
|
||||
} : r(8875),
|
||||
a = Object.keys;
|
||||
s.shim = function() {
|
||||
if (Object.keys) {
|
||||
var t = function() {
|
||||
var t = Object.keys(arguments);
|
||||
return t && t.length === arguments.length
|
||||
}(1, 2);
|
||||
t || (Object.keys = function(t) {
|
||||
return i(t) ? a(n.call(t)) : a(t)
|
||||
})
|
||||
} else Object.keys = s;
|
||||
return Object.keys || s
|
||||
}, t.exports = s
|
||||
},
|
||||
1093: t => {
|
||||
"use strict";
|
||||
var e = Object.prototype.toString;
|
||||
t.exports = function(t) {
|
||||
var r = e.call(t),
|
||||
n = "[object Arguments]" === r;
|
||||
return n || (n = "[object Array]" !== r && null !== t && "object" == typeof t && "number" == typeof t.length && t.length >= 0 && "[object Function]" === e.call(t.callee)), n
|
||||
}
|
||||
},
|
||||
8403: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(1189),
|
||||
i = r(1333)(),
|
||||
o = r(8075),
|
||||
s = Object,
|
||||
a = o("Array.prototype.push"),
|
||||
f = o("Object.prototype.propertyIsEnumerable"),
|
||||
u = i ? Object.getOwnPropertySymbols : null;
|
||||
t.exports = function(t, e) {
|
||||
if (null == t) throw new TypeError("target must be an object");
|
||||
var r = s(t);
|
||||
if (1 === arguments.length) return r;
|
||||
for (var o = 1; o < arguments.length; ++o) {
|
||||
var c = s(arguments[o]),
|
||||
h = n(c),
|
||||
p = i && (Object.getOwnPropertySymbols || u);
|
||||
if (p) for (var l = p(c), y = 0; y < l.length; ++y) {
|
||||
var g = l[y];
|
||||
f(c, g) && a(h, g)
|
||||
}
|
||||
for (var d = 0; d < h.length; ++d) {
|
||||
var v = h[d];
|
||||
if (f(c, v)) {
|
||||
var m = c[v];
|
||||
r[v] = m
|
||||
}
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
},
|
||||
1514: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(8403);
|
||||
t.exports = function() {
|
||||
return Object.assign ? function() {
|
||||
if (!Object.assign) return !1;
|
||||
for (var t = "abcdefghijklmnopqrst", e = t.split(""), r = {}, n = 0; n < e.length; ++n) r[e[n]] = e[n];
|
||||
var i = Object.assign({}, r),
|
||||
o = "";
|
||||
for (var s in i) o += s;
|
||||
return t !== o
|
||||
}() || function() {
|
||||
if (!Object.assign || !Object.preventExtensions) return !1;
|
||||
var t = Object.preventExtensions({
|
||||
1: 2
|
||||
});
|
||||
try {
|
||||
Object.assign(t, "xy")
|
||||
} catch (e) {
|
||||
return "y" === t[1]
|
||||
}
|
||||
return !1
|
||||
}() ? n : Object.assign : n
|
||||
}
|
||||
},
|
||||
5606: t => {
|
||||
var e, r, n = t.exports = {};
|
||||
|
||||
function i() {
|
||||
throw new Error("setTimeout has not been defined")
|
||||
}
|
||||
function o() {
|
||||
throw new Error("clearTimeout has not been defined")
|
||||
}
|
||||
function s(t) {
|
||||
if (e === setTimeout) return setTimeout(t, 0);
|
||||
if ((e === i || !e) && setTimeout) return e = setTimeout, setTimeout(t, 0);
|
||||
try {
|
||||
return e(t, 0)
|
||||
} catch (r) {
|
||||
try {
|
||||
return e.call(null, t, 0)
|
||||
} catch (r) {
|
||||
return e.call(this, t, 0)
|
||||
}
|
||||
}
|
||||
}! function() {
|
||||
try {
|
||||
e = "function" == typeof setTimeout ? setTimeout : i
|
||||
} catch (t) {
|
||||
e = i
|
||||
}
|
||||
try {
|
||||
r = "function" == typeof clearTimeout ? clearTimeout : o
|
||||
} catch (t) {
|
||||
r = o
|
||||
}
|
||||
}();
|
||||
var a, f = [],
|
||||
u = !1,
|
||||
c = -1;
|
||||
|
||||
function h() {
|
||||
u && a && (u = !1, a.length ? f = a.concat(f) : c = -1, f.length && p())
|
||||
}
|
||||
function p() {
|
||||
if (!u) {
|
||||
var t = s(h);
|
||||
u = !0;
|
||||
for (var e = f.length; e;) {
|
||||
for (a = f, f = []; ++c < e;) a && a[c].run();
|
||||
c = -1, e = f.length
|
||||
}
|
||||
a = null, u = !1,
|
||||
function(t) {
|
||||
if (r === clearTimeout) return clearTimeout(t);
|
||||
if ((r === o || !r) && clearTimeout) return r = clearTimeout, clearTimeout(t);
|
||||
try {
|
||||
return r(t)
|
||||
} catch (e) {
|
||||
try {
|
||||
return r.call(null, t)
|
||||
} catch (e) {
|
||||
return r.call(this, t)
|
||||
}
|
||||
}
|
||||
}(t)
|
||||
}
|
||||
}
|
||||
function l(t, e) {
|
||||
this.fun = t, this.array = e
|
||||
}
|
||||
function y() {}
|
||||
n.nextTick = function(t) {
|
||||
var e = new Array(arguments.length - 1);
|
||||
if (arguments.length > 1) for (var r = 1; r < arguments.length; r++) e[r - 1] = arguments[r];
|
||||
f.push(new l(t, e)), 1 !== f.length || u || s(p)
|
||||
}, l.prototype.run = function() {
|
||||
this.fun.apply(null, this.array)
|
||||
}, n.title = "browser", n.browser = !0, n.env = {}, n.argv = [], n.version = "", n.versions = {}, n.on = y, n.addListener = y, n.once = y, n.off = y, n.removeListener = y, n.removeAllListeners = y, n.emit = y, n.prependListener = y, n.prependOnceListener = y, n.listeners = function(t) {
|
||||
return []
|
||||
}, n.binding = function(t) {
|
||||
throw new Error("process.binding is not supported")
|
||||
}, n.cwd = function() {
|
||||
return "/"
|
||||
}, n.chdir = function(t) {
|
||||
throw new Error("process.chdir is not supported")
|
||||
}, n.umask = function() {
|
||||
return 0
|
||||
}
|
||||
},
|
||||
4774: (t, e, r) => {
|
||||
"use strict";
|
||||
var n, i = r(5606),
|
||||
o = r(8287),
|
||||
s = o.Buffer,
|
||||
a = {};
|
||||
for (n in o) o.hasOwnProperty(n) && "SlowBuffer" !== n && "Buffer" !== n && (a[n] = o[n]);
|
||||
var f = a.Buffer = {};
|
||||
for (n in s) s.hasOwnProperty(n) && "allocUnsafe" !== n && "allocUnsafeSlow" !== n && (f[n] = s[n]);
|
||||
if (a.Buffer.prototype = s.prototype, f.from && f.from !== Uint8Array.from || (f.from = function(t, e, r) {
|
||||
if ("number" == typeof t) throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof t);
|
||||
if (t && void 0 === t.length) throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof t);
|
||||
return s(t, e, r)
|
||||
}), f.alloc || (f.alloc = function(t, e, r) {
|
||||
if ("number" != typeof t) throw new TypeError('The "size" argument must be of type number. Received type ' + typeof t);
|
||||
if (t < 0 || t >= 2 * (1 << 30)) throw new RangeError('The value "' + t + '" is invalid for option "size"');
|
||||
var n = s(t);
|
||||
return e && 0 !== e.length ? "string" == typeof r ? n.fill(e, r) : n.fill(e) : n.fill(0), n
|
||||
}), !a.kStringMaxLength) try {
|
||||
a.kStringMaxLength = i.binding("buffer")
|
||||
.kStringMaxLength
|
||||
} catch (t) {}
|
||||
a.constants || (a.constants = {
|
||||
MAX_LENGTH: a.kMaxLength
|
||||
}, a.kStringMaxLength && (a.constants.MAX_STRING_LENGTH = a.kStringMaxLength)), t.exports = a
|
||||
},
|
||||
6897: (t, e, r) => {
|
||||
"use strict";
|
||||
var n = r(453),
|
||||
i = r(41),
|
||||
o = r(592)(),
|
||||
s = r(5795),
|
||||
a = r(9675),
|
||||
f = n("%Math.floor%");
|
||||
t.exports = function(t, e) {
|
||||
if ("function" != typeof t) throw new a("`fn` is not a function");
|
||||
if ("number" != typeof e || e < 0 || e > 4294967295 || f(e) !== e) throw new a("`length` must be a positive 32-bit integer");
|
||||
var r = arguments.length > 2 && !! arguments[2],
|
||||
n = !0,
|
||||
u = !0;
|
||||
if ("length" in t && s) {
|
||||
var c = s(t, "length");
|
||||
c && !c.configurable && (n = !1), c && !c.writable && (u = !1)
|
||||
}
|
||||
return (n || u || !r) && (o ? i(t, "length", e, !0, !0) : i(t, "length", e)), t
|
||||
}
|
||||
},
|
||||
3200: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer,
|
||||
i = r(1396),
|
||||
o = {
|
||||
randomBytes: function(t) {
|
||||
for (var e = [], r = 0; r < t; r++) e.push(Math.floor(256 * Math.random()));
|
||||
return n.from(e)
|
||||
},
|
||||
createHash(t) {
|
||||
let e = n.from([]);
|
||||
return {
|
||||
update: function(t) {
|
||||
return e = n.concat([e, t]), this
|
||||
},
|
||||
digest: function() {
|
||||
let r = i[t.toUpperCase()](i.lib.WordArray.create(new Uint8Array(e)))
|
||||
.toString();
|
||||
return n.from(r, "hex")
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
t.exports = o
|
||||
},
|
||||
7033: (t, e, r) => {
|
||||
var n = r(8287)
|
||||
.Buffer;
|
||||
const i = r(3229);
|
||||
let o = {
|
||||
outputEncoding: "",
|
||||
PublicFormat: "pkcs1-public",
|
||||
PrivateFormat: "pkcs1-private",
|
||||
options: {
|
||||
environment: "browser",
|
||||
encryptionScheme: "pkcs1"
|
||||
}
|
||||
};
|
||||
t.exports = {
|
||||
NodeRSA: i,
|
||||
encryptRSAWithPublicKey: function(t, e, r = {}) {
|
||||
return r = Object.assign({}, o, r), new i(e, r.PublicFormat, r.options)
|
||||
.encrypt(t, r.outEncoding || "base64")
|
||||
},
|
||||
encryptRSAWithPrivateKey: function(t, e, r = {}) {
|
||||
return r = Object.assign({}, o, r), new i(e, r.PrivateFormat, r.options)
|
||||
.encryptPrivate(t, r.outputEncoding || "base64")
|
||||
},
|
||||
decryptRSAWithPublicKey: function(t, e, r = {}) {
|
||||
return r = Object.assign({}, o, r), new i(e, r.PublicEncoding, r.options)
|
||||
.decryptPublic(t, r.outEncoding || "utf8")
|
||||
},
|
||||
decryptRSAWithPrivateKey: function(t, e, r = {}) {
|
||||
return r = Object.assign({}, o, r), new i(e, r.PrivateEncoding, r.options)
|
||||
.decrypt(t, r.outEncoding || "utf8")
|
||||
},
|
||||
sign: function(t, e, r = {}) {
|
||||
return r = Object.assign({}, o, r), new i(e, r.PrivateEncoding, r.options)
|
||||
.sign(t, r.outEncoding || "base64")
|
||||
},
|
||||
verify: function(t, e, r, s = {}) {
|
||||
return "string" == typeof e && e.match(/^([0-9a-fA-F]{2})*$/) ? e = n.from(e, "hex") : "string" == typeof e && (e = n.from(e, "base64")), s = Object.assign({}, o, s), new i(r, s.PublicEncoding, s.options)
|
||||
.verify(t, e)
|
||||
}
|
||||
}
|
||||
},
|
||||
7449: t => {
|
||||
"use strict";
|
||||
t.exports = JSON.parse('{"O_RDONLY":0,"O_WRONLY":1,"O_RDWR":2,"S_IFMT":61440,"S_IFREG":32768,"S_IFDIR":16384,"S_IFCHR":8192,"S_IFBLK":24576,"S_IFIFO":4096,"S_IFLNK":40960,"S_IFSOCK":49152,"O_CREAT":512,"O_EXCL":2048,"O_NOCTTY":131072,"O_TRUNC":1024,"O_APPEND":8,"O_DIRECTORY":1048576,"O_NOFOLLOW":256,"O_SYNC":128,"O_SYMLINK":2097152,"O_NONBLOCK":4,"S_IRWXU":448,"S_IRUSR":256,"S_IWUSR":128,"S_IXUSR":64,"S_IRWXG":56,"S_IRGRP":32,"S_IWGRP":16,"S_IXGRP":8,"S_IRWXO":7,"S_IROTH":4,"S_IWOTH":2,"S_IXOTH":1,"E2BIG":7,"EACCES":13,"EADDRINUSE":48,"EADDRNOTAVAIL":49,"EAFNOSUPPORT":47,"EAGAIN":35,"EALREADY":37,"EBADF":9,"EBADMSG":94,"EBUSY":16,"ECANCELED":89,"ECHILD":10,"ECONNABORTED":53,"ECONNREFUSED":61,"ECONNRESET":54,"EDEADLK":11,"EDESTADDRREQ":39,"EDOM":33,"EDQUOT":69,"EEXIST":17,"EFAULT":14,"EFBIG":27,"EHOSTUNREACH":65,"EIDRM":90,"EILSEQ":92,"EINPROGRESS":36,"EINTR":4,"EINVAL":22,"EIO":5,"EISCONN":56,"EISDIR":21,"ELOOP":62,"EMFILE":24,"EMLINK":31,"EMSGSIZE":40,"EMULTIHOP":95,"ENAMETOOLONG":63,"ENETDOWN":50,"ENETRESET":52,"ENETUNREACH":51,"ENFILE":23,"ENOBUFS":55,"ENODATA":96,"ENODEV":19,"ENOENT":2,"ENOEXEC":8,"ENOLCK":77,"ENOLINK":97,"ENOMEM":12,"ENOMSG":91,"ENOPROTOOPT":42,"ENOSPC":28,"ENOSR":98,"ENOSTR":99,"ENOSYS":78,"ENOTCONN":57,"ENOTDIR":20,"ENOTEMPTY":66,"ENOTSOCK":38,"ENOTSUP":45,"ENOTTY":25,"ENXIO":6,"EOPNOTSUPP":102,"EOVERFLOW":84,"EPERM":1,"EPIPE":32,"EPROTO":100,"EPROTONOSUPPORT":43,"EPROTOTYPE":41,"ERANGE":34,"EROFS":30,"ESPIPE":29,"ESRCH":3,"ESTALE":70,"ETIME":101,"ETIMEDOUT":60,"ETXTBSY":26,"EWOULDBLOCK":35,"EXDEV":18,"SIGHUP":1,"SIGINT":2,"SIGQUIT":3,"SIGILL":4,"SIGTRAP":5,"SIGABRT":6,"SIGIOT":6,"SIGBUS":10,"SIGFPE":8,"SIGKILL":9,"SIGUSR1":30,"SIGSEGV":11,"SIGUSR2":31,"SIGPIPE":13,"SIGALRM":14,"SIGTERM":15,"SIGCHLD":20,"SIGCONT":19,"SIGSTOP":17,"SIGTSTP":18,"SIGTTIN":21,"SIGTTOU":22,"SIGURG":16,"SIGXCPU":24,"SIGXFSZ":25,"SIGVTALRM":26,"SIGPROF":27,"SIGWINCH":28,"SIGIO":23,"SIGSYS":12,"SSL_OP_ALL":2147486719,"SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION":262144,"SSL_OP_CIPHER_SERVER_PREFERENCE":4194304,"SSL_OP_CISCO_ANYCONNECT":32768,"SSL_OP_COOKIE_EXCHANGE":8192,"SSL_OP_CRYPTOPRO_TLSEXT_BUG":2147483648,"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS":2048,"SSL_OP_EPHEMERAL_RSA":0,"SSL_OP_LEGACY_SERVER_CONNECT":4,"SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER":32,"SSL_OP_MICROSOFT_SESS_ID_BUG":1,"SSL_OP_MSIE_SSLV2_RSA_PADDING":0,"SSL_OP_NETSCAPE_CA_DN_BUG":536870912,"SSL_OP_NETSCAPE_CHALLENGE_BUG":2,"SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG":1073741824,"SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG":8,"SSL_OP_NO_COMPRESSION":131072,"SSL_OP_NO_QUERY_MTU":4096,"SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION":65536,"SSL_OP_NO_SSLv2":16777216,"SSL_OP_NO_SSLv3":33554432,"SSL_OP_NO_TICKET":16384,"SSL_OP_NO_TLSv1":67108864,"SSL_OP_NO_TLSv1_1":268435456,"SSL_OP_NO_TLSv1_2":134217728,"SSL_OP_PKCS1_CHECK_1":0,"SSL_OP_PKCS1_CHECK_2":0,"SSL_OP_SINGLE_DH_USE":1048576,"SSL_OP_SINGLE_ECDH_USE":524288,"SSL_OP_SSLEAY_080_CLIENT_DH_BUG":128,"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG":0,"SSL_OP_TLS_BLOCK_PADDING_BUG":512,"SSL_OP_TLS_D5_BUG":256,"SSL_OP_TLS_ROLLBACK_BUG":8388608,"ENGINE_METHOD_DSA":2,"ENGINE_METHOD_DH":4,"ENGINE_METHOD_RAND":8,"ENGINE_METHOD_ECDH":16,"ENGINE_METHOD_ECDSA":32,"ENGINE_METHOD_CIPHERS":64,"ENGINE_METHOD_DIGESTS":128,"ENGINE_METHOD_STORE":256,"ENGINE_METHOD_PKEY_METHS":512,"ENGINE_METHOD_PKEY_ASN1_METHS":1024,"ENGINE_METHOD_ALL":65535,"ENGINE_METHOD_NONE":0,"DH_CHECK_P_NOT_SAFE_PRIME":2,"DH_CHECK_P_NOT_PRIME":1,"DH_UNABLE_TO_CHECK_GENERATOR":4,"DH_NOT_SUITABLE_GENERATOR":8,"NPN_ENABLED":1,"RSA_PKCS1_PADDING":1,"RSA_SSLV23_PADDING":2,"RSA_NO_PADDING":3,"RSA_PKCS1_OAEP_PADDING":4,"RSA_X931_PADDING":5,"RSA_PKCS1_PSS_PADDING":6,"POINT_CONVERSION_COMPRESSED":2,"POINT_CONVERSION_UNCOMPRESSED":4,"POINT_CONVERSION_HYBRID":6,"F_OK":0,"R_OK":4,"W_OK":2,"X_OK":1,"UV_UDP_REUSEADDR":4}')
|
||||
}
|
||||
}, e = {};
|
||||
|
||||
function r(n) {
|
||||
var i = e[n];
|
||||
if (void 0 !== i) return i.exports;
|
||||
var o = e[n] = {
|
||||
exports: {}
|
||||
};
|
||||
return t[n].call(o.exports, o, o.exports, r), o.exports
|
||||
}
|
||||
return r.g = function() {
|
||||
if ("object" == typeof globalThis) return globalThis;
|
||||
try {
|
||||
return this || new Function("return this")()
|
||||
} catch (t) {
|
||||
if ("object" == typeof window) return window
|
||||
}
|
||||
}(), r(7033)
|
||||
})()));
|
||||
Vendored
+1341
@@ -0,0 +1,1341 @@
|
||||
/*! 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,99 @@
|
||||
var rule = {
|
||||
title: '360影视[官]',
|
||||
host: 'https://www.360kan.com',
|
||||
homeUrl: 'https://api.web.360kan.com/v1/rank?cat=2&size=9',
|
||||
detailUrl: 'https://api.web.360kan.com/v1/detail?cat=fyclass&id=fyid',
|
||||
searchUrl: 'https://api.so.360kan.com/index?force_v=1&kw=**&from=&pageno=fypage&v_ap=1&tab=all',
|
||||
url: 'https://api.web.360kan.com/v1/fyfilter&size=35&pageno=fypage&callback=',
|
||||
filterable: 1,
|
||||
filter_url: 'filter/list?catid=fyclass&rank={{fl.排序}}&cat={{fl.类型}}&year={{fl.年代}}&area={{fl.地区}}',
|
||||
filter: "H4sIAAAAAAAAA+2YS08jRxCA/4vPHGbMvrK3/IJcor1Eq4gDUqIlbLQhkVYrJINt1jYPA8vLa2MgYJtlMdhAiD1e4z8z3TP+Fxm7Xu0oGs2BQBRx81fVXV3V3VNV7XcxO/b8u3exV5NvY89jXrOjyouxsdj0xE+TJv82MfXr5HDgdCBW6eN+8nggDiA2O4bSrZLK1lCKQDov09TJNOoQeF7u2O2WaB4A6fTcqk5soQ6BbdbWVLtDNgHYZrYm6yHwvNy51z2heQA8r/JebCKwL5kd18mSLwCsmz/1ttZIB2DE5210JL4B8Lyt937WoXkA7Kdzorqb5CcA6dwv+/5ZA3UIbLO+5GfKZBOAfckf+Ye8LwCsW1lQ+QvSAbDNZE7PfySbAOJL1VtdYF+GwDbT126Hzg9h9uVACxdOlRpqyZELxxzpwi2kg/Fk/KjWL8jCbquuit1+taBb5zgCYXSEyjd0+4Y3ZAgc9GUjGEFBA/Dh3KyIDoF0/b1PokNgm9sVXTolmwCy3qa53qY5z19sig6B9+HmT9EhsG65oZwq6QAiH077yu0cGodDHOVw4lb8EcqGPw35uMjHTXlc5HFTbovcNuWWyC1Dbn/F8uCnIX8m8mem/KnIn5ryJyJ/Ysofi/yxKZd4bTNeW+K1zXhtidc247UlLtuMy5K4LDMuS+KyzLgsicuSuHTxSm9/Qs3UzPdvJyfejJy6XllXTl5OnXn01HUp4ffWvGRd7+yjtTcT069+eD0jSw2HuK3c6JCpiZnJX0ZGqfy2qnT985Qx6ufXP07PDBx7ORaL31aJ8o8TUhYQopSM0BQXUvbCykI/2VWtecoSAGxz7lol82QTIFIKXyi6ziLpADj2elUtUdlDiJL6Va6pettcvobAWbBS9s93KQsC8HqN5aBI0noAHPvuut6pUOxDMLdNnV0rp05LDmFEHdYwJNO6QBkfQQpj1b2hm4gQqZm4uyIGcFdFLKwYhRWxsOIXVqj0VkPl9tXuATc8xA9l56Hs/OfKzvitlZ1UU+UPvVqCPgtm/qJKe67jyAhh9ne17J1yKQHgbzWRlakIkrw+q2VuAAHYr7Oe38iQUwBmIk3tGYk0APZ2Y09fcbIE4HmFj+4XfikASE65dNurnFOGwL7MLakSvYQQjHzTPyRfECSHXasGrwfAulZLZ6iMIvC+NNZUqkf7AsBZtfvBn6dyiGC+ys7odYVgFBG9WZAiMgD5AC6Mlx5AlBebf/W716EYEHhes+t36WwRWLde1zkqsQj/j1dZ2AvqtBZcD9IB3EuSGeaPR7eVPwJP/ANODQBRGpdBaQ5uduXSKNXA/EXWN2Q2As/u5FW6RVMBojSFYV+WWljvF6gMIETJcHrlWBpwBNbNLXqZJukAWHfR0SnKcAjsS7ujk7Q1CDxv/0AVqQNFMNpPL8sxAMi1cKTpReCr7VyoOmU/BLaZ6gXfPdkE4AzQWw1WoQwAEOWBoRMn4icC60L+y/KKOV2gTIUQ0rjLvM8V4zEAILqyzvENBojSzntHN1JNEOQhtGg82AD+Vk+zdPTCUsP+UN2mMYKZRnzz4mtRI5Du2xeigt9Gj+ttnoz85zcikjfOktf5MPrfoCm6k3wclkv/scl/aNPvvU2XeG0z3n+3fQ9A4rXMeC2J1zLjtSReS+IdeQYg3FeBnv0LfL9z7fwYAAA=",
|
||||
filter_def: {},
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_name: '电视剧&电影&综艺&动漫',
|
||||
class_url: '2&1&3&4',
|
||||
limit: 5,
|
||||
multi: 1,
|
||||
searchable: 2,
|
||||
play_parse: true,
|
||||
lazy: 'js:input=input.split("?")[0];log(input);',
|
||||
// 疑似t4专用的
|
||||
// lazy:'js:input={parse: 1, playUrl: "", jx: 1, url: input.split("?")[0]}',
|
||||
// 手动调用解析请求json的url,此lazy不方便
|
||||
// lazy:'js:input="https://cache.json.icu/home/api?type=ys&uid=292796&key=fnoryABDEFJNPQV269&url="+input.split("?")[0];log(input);let html=JSON.parse(request(input));log(html);input=html.url||input',
|
||||
推荐: 'json:data;title;cover;comment;cat+ent_id;description',
|
||||
一级: 'json:data.movies;title;cover;pubdate;id;description',
|
||||
二级: '',
|
||||
二级: $js.toString(() => {
|
||||
let html = JSON.parse(fetch(input, fetch_params));
|
||||
let data = html.data;
|
||||
let tilte = data.title;
|
||||
let img = data.cdncover;
|
||||
let vod_type = data.moviecategory.join(",");
|
||||
let area = data.area.join(",");
|
||||
let director = data.director.join(",");
|
||||
let actor = data.actor.join(",");
|
||||
let content = data.description;
|
||||
let base_vod = {
|
||||
vod_id: input,
|
||||
vod_name: tilte,
|
||||
type_name: vod_type,
|
||||
vod_actor: actor,
|
||||
vod_director: director,
|
||||
vod_content: content,
|
||||
vod_remarks: area,
|
||||
vod_pic: urljoin2(input, img)
|
||||
};
|
||||
let delta = 50;
|
||||
let vod_play = {};
|
||||
let sites = data.playlink_sites;
|
||||
sites.forEach(function (site) {
|
||||
let playList = "";
|
||||
let vodItems = [];
|
||||
print(data)
|
||||
if (data.allupinfo) {
|
||||
let total = parseInt(data.allupinfo[site]);
|
||||
print(total)
|
||||
for (let j = 1; j < total; j += delta) {
|
||||
let end = Math.min(total, j + delta - 1);
|
||||
print(end)
|
||||
let url2 = buildUrl(input, { start: j, end: end, site: site });
|
||||
let vod_data = JSON.parse(fetch(url2), fetch_params).data;
|
||||
if (vod_data != null) {
|
||||
if (vod_data.allepidetail) {
|
||||
vod_data = vod_data.allepidetail[site];
|
||||
vod_data.forEach(function (item, index) {
|
||||
vodItems.push((item.playlink_num || "") + "$" + urlDeal(item.url || ""))
|
||||
})
|
||||
} else {
|
||||
vod_data = vod_data.defaultepisode;
|
||||
vod_data.forEach(function (item, index) {
|
||||
vodItems.push((item.period || "") + (item.name || "") + "$" + urlDeal(item.url) || "")
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let item = data.playlinksdetail[site];
|
||||
vodItems.push((item.sort || "") + "$" + urlDeal(item.default_url || ""))
|
||||
} if (vodItems.length > 0) {
|
||||
playList = vodItems.join("#")
|
||||
} if (playList.length < 1) {
|
||||
return
|
||||
} vod_play[site] = playList
|
||||
});
|
||||
let tabs = Object.keys(vod_play);
|
||||
let playUrls = []; for (let id in tabs) {
|
||||
print("id:" + id); playUrls.push(vod_play[tabs[id]])
|
||||
} if (tabs.length > 0) {
|
||||
let vod_play_from = tabs.join("$$$"); let vod_play_url = playUrls.join("$$$");
|
||||
base_vod.vod_play_from = vod_play_from;
|
||||
base_vod.vod_play_url = vod_play_url
|
||||
}
|
||||
VOD = base_vod;
|
||||
}),
|
||||
搜索: 'json:data.longData.rows;titleTxt||titlealias;cover;cat_name;cat_id+en_id;description',
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
var rule = {
|
||||
title:'乐鱼影视',
|
||||
// host:'https://www.leyupro.com',
|
||||
host:'https://www.yu992.com',
|
||||
// url:'/lys/fyclass/page/fypage.html',
|
||||
url: '/lys/fyclassfyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}/page/fypage{{fl.year}}',
|
||||
filter:{
|
||||
"lyMovie":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"战争","v":"/class/战争"},{"n":"犯罪","v":"/class/犯罪"},{"n":"动画","v":"/class/动画"},{"n":"奇幻","v":"/class/奇幻"},{"n":"冒险","v":"/class/冒险"},{"n":"恐怖","v":"/class/恐怖"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"历史","v":"/class/历史"},{"n":"运动","v":"/class/运动"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"意大利","v":"/area/意大利"},{"n":"西班牙","v":"/area/西班牙"},{"n":"加拿大","v":"/area/加拿大"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"}]},{"key":"by","name":"排序","value":[{"n":"按时间","v":"/by/time"},{"n":"按人气","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}],
|
||||
"lyTv":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"古装","v":"/class/古装"},{"n":"喜剧","v":"/class/喜剧"},{"n":"偶像","v":"/class/偶像"},{"n":"家庭","v":"/class/家庭"},{"n":"警匪","v":"/class/警匪"},{"n":"言情","v":"/class/言情"},{"n":"武侠","v":"/class/武侠"},{"n":"悬疑","v":"/class/悬疑"},{"n":"历史","v":"/class/历史"},{"n":"农村","v":"/class/农村"},{"n":"都市","v":"/class/都市"},{"n":"神话","v":"/class/神话"},{"n":"科幻","v":"/class/科幻"},{"n":"搞笑","v":"/class/搞笑"},{"n":"谍战","v":"/class/谍战"},{"n":"战争","v":"/class/战争"},{"n":"年代","v":"/class/年代"},{"n":"爱情","v":"/class/爱情"},{"n":"剧情","v":"/class/剧情"},{"n":"奇幻","v":"/class/奇幻"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"韩国","v":"/area/韩国"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"泰国","v":"/area/泰国"},{"n":"英国","v":"/area/英国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"}]},{"key":"by","name":"排序","value":[{"n":"按时间","v":"/by/time"},{"n":"按人气","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}],
|
||||
"lyCartoon":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"科幻","v":"/class/科幻"},{"n":"热血","v":"/class/热血"},{"n":"推理","v":"/class/推理"},{"n":"搞笑","v":"/class/搞笑"},{"n":"冒险","v":"/class/冒险"},{"n":"萝莉","v":"/class/萝莉"},{"n":"校园","v":"/class/校园"},{"n":"机战","v":"/class/机战"},{"n":"运动","v":"/class/运动"},{"n":"战争","v":"/class/战争"},{"n":"少女","v":"/class/少女"},{"n":"社会","v":"/class/社会"},{"n":"原创","v":"/class/原创"},{"n":"益智","v":"/class/益智"},{"n":"励志","v":"/class/励志"},{"n":"其他","v":"/class/其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"}]},{"key":"by","name":"排序","value":[{"n":"按时间","v":"/by/time"},{"n":"按人气","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}],
|
||||
"lyVariety":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"音乐","v":"/class/音乐"},{"n":"真人","v":"/class/真人"},{"n":"访谈","v":"/class/访谈"},{"n":"播报","v":"/class/播报"},{"n":"旅游","v":"/class/旅游"},{"n":"美食","v":"/class/美食"},{"n":"纪实","v":"/class/纪实"},{"n":"生活","v":"/class/生活"},{"n":"游戏","v":"/class/游戏"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"美国","v":"/area/美国"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"}]},{"key":"by","name":"排序","value":[{"n":"按时间","v":"/by/time"},{"n":"按人气","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}],
|
||||
"lydocumentary":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"社会","v":"/class/社会"},{"n":"动物","v":"/class/动物"},{"n":"文化","v":"/class/文化"},{"n":"自然","v":"/class/自然"},{"n":"人文","v":"/class/人文"},{"n":"军事","v":"/class/军事"},{"n":"历史","v":"/class/历史"},{"n":"记录","v":"/class/记录"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"国外","v":"/area/国外"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"}]},{"key":"by","name":"排序","value":[{"n":"按时间","v":"/by/time"},{"n":"按人气","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}],
|
||||
"lyLive":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"体育","v":"/class/体育"},{"n":"电视","v":"/class/电视"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"}]},{"key":"by","name":"排序","value":[{"n":"按时间","v":"/by/time"},{"n":"按人气","v":"/by/hits"},{"n":"按评分","v":"/by/score"}]}]
|
||||
},
|
||||
searchUrl:'/lyso/page/fypage/wd/**.html',
|
||||
searchable:2,//是否启用全局搜索,
|
||||
quickSearch:0,//是否启用快速搜索,
|
||||
headers:{
|
||||
'User-Agent':'MOBILE_UA'
|
||||
},
|
||||
class_name:'电影&电视剧&综艺&动漫&纪录片',
|
||||
class_url:'lyMovie&lyTv&lyVariety&lyCartoon&lydocumentary',
|
||||
play_parse:true,
|
||||
lazy:`js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
limit:6,
|
||||
推荐:'*',
|
||||
一级:'.gcol;a&&title;.eclazy&&data-original;.packscore&&Text;a&&href',
|
||||
二级:{
|
||||
"title":"h1&&Text;.detailinfo&&p--span:eq(0)&&Text",
|
||||
"img":".detailpic&&img&&src",
|
||||
"desc":".detailinfo&&p:eq(7)&&Text;;;.detailinfo&&p--span:eq(2)&&Text;.detailinfo&&p--span:eq(1)&&Text",
|
||||
"content":".tjuqing&&Text",
|
||||
"tabs":".downtitle:eq(1)&&li",
|
||||
"lists":".videolist:eq(#id) a"
|
||||
},
|
||||
搜索:'.search;*;img&&src;.list&&span:eq(1)&&Text;*',
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA#referer$https://www.pansearch.me",
|
||||
"搜索链接": "https://www.pansearch.me/search?keyword={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".grid&&.items-start:has(a[href~=ali(pan|yundrive)])",
|
||||
"搜索片单是否Jsoup写法": "0",
|
||||
"搜索片单图片": "src=\"&&\"",
|
||||
"搜索片单标题": "keyword\">&&<a",
|
||||
"搜索片单链接": "href=\"&&\"",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "",
|
||||
"搜索片单链接加后缀": ""
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"规则名": "云盘论坛",
|
||||
"规则作者": "",
|
||||
"请求头参数": "User-Agent$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#Cookie$bbs_sid=5npbqdo036fgd362kq4rl34j22$bbs_token=zzASNHG9Tr95D26kdNWnrx4Ig78W68SQS9dFwnQ2xPeQiQiq",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": " https://aliwp.cn/",
|
||||
"首页列表数组规则": "body&&.img",
|
||||
"首页片单列表数组规则": ".img",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://aliwp.cn/forum.php?mod=forumdisplay&fid={cateId}&page={catePg}&mobile=2",
|
||||
"分类名称": "影视电视&音乐&教程",
|
||||
"分类名称替换词": "37&47&45",
|
||||
"筛选数据": {},
|
||||
//"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "",
|
||||
//{class}
|
||||
"筛选类型名称": "",
|
||||
"筛选类型替换词": "*",
|
||||
//{area}
|
||||
"筛选地区名称": "",
|
||||
"筛选地区替换词": "*",
|
||||
//{year}
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
//{lang}
|
||||
"筛选语言名称": "",
|
||||
"筛选语言替换词": "*",
|
||||
//{by}
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": "body&&.threadlist&&ul&&li",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "a,0&&Text",
|
||||
"分类片单链接": "a,0&&href",
|
||||
"分类片单图片": "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
"分类片单副标题": "",
|
||||
"分类片单链接加前缀": "https://aliwp.cn/",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$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",
|
||||
"搜索链接": "https://aliwp.cn/search.php?mod=forum&mobile=2;post",
|
||||
"POST请求数据": "srchtxt={wd}&searchsubmit=yes",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": "body&&.threadlist&&ul&&li",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
"搜索片单标题":"a,0&&Text",
|
||||
"搜索片单链接":"a,0&&href",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "https://aliwp.cn/",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "1",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": "",
|
||||
"简介详情": "",
|
||||
"线路列表数组规则": "",
|
||||
"线路标题": "",
|
||||
"播放列表数组规则": "body&&a[href~=https://www.ali(pan|yundrive).com/s/]",
|
||||
"选集列表数组规则": "a",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA#Referer$https://res.yunpan.win/",
|
||||
"搜索链接": "https://res.yunpan.win/?PageIndex={SearchPg}&PageSize=12&Keyword={wd}&Type=&Tag=",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": "body&&.card",
|
||||
"搜索片单是否Jsoup写法": "0",
|
||||
"搜索片单图片": "img src=\"&&\"",
|
||||
"搜索片单标题": "alt=\"&&\"",
|
||||
"搜索片单链接": "window.open('&&')",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "",
|
||||
"搜索片单链接加后缀": "",
|
||||
"详情是否Jsoup写法": "1",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": "",
|
||||
"简介详情": "",
|
||||
"链接是否直接播放": "1"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
|
||||
"作者":"荷城茶秀",
|
||||
|
||||
"站名":"55影视",
|
||||
|
||||
"主页url":"https://www.55kan.com/",
|
||||
|
||||
"简介":"+<p class=\"col-pd\"&&</p>",
|
||||
|
||||
"导演":"导演:&&</p>",
|
||||
|
||||
"主演":"主演:&&</p>",
|
||||
|
||||
"线路数组":"<h3 class=\"title\">&&/h3>",
|
||||
|
||||
"线路标题":">&&<",
|
||||
|
||||
"分类url":"https://www.55kan.com/show/{cateId}-{area}-{by}------{catePg}---{year}.html;;ak",
|
||||
|
||||
"分类":"电影$1#电视剧$2#综艺$3#动漫$4"}
|
||||
@@ -0,0 +1,175 @@
|
||||
var rule = {
|
||||
title: '优酷[官]',
|
||||
host: 'https://www.%79%6f%75%6b%75.com',
|
||||
homeUrl: '',
|
||||
searchUrl: 'https://search.%79%6f%75%6b%75.com/api/search?pg=fypage&keyword=**',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable: 1,
|
||||
multi: 1,
|
||||
url: '/category/data?optionRefresh=1&pageNo=fypage¶ms=fyfilter',
|
||||
filter_url: '{{fl}}',
|
||||
filter: 'H4sIAAAAAAAAA+1cW28bu7X+K4Uf+lIFsHJ3Hw7Q3d1TbODgtA9FgYODDUNJdLKNJs6u46RIiw3IF9nyRfJNtiVLjnyRLd9081UaWdKfGXJm/sXhDMm1SElWnGxnuwECGE6+tTgccpFc6+Mix//qseJndm6CTOV6fvu//+r5W/Bdz297XgYGBvsDQ8FAj69nMPAyyEQkvOeM7ZF0icwaTPo28OJN0HtisIOSiXp+8gndRNhVsPq5wqzkSarOpVCIVoqtJZzdJJNiNXPtdcyVaLUBJZzMPpZwQaoOOqsRQ50LFJ09U0adCxQdXd1BHQM0fYS6E6VFLnCf+97VciMOB56/brWfVa6R9zNX2A+Vqv2c9UWa2JHd4gCNkrW3w0InAHQ5UqZjUicA1DlWJ5VRWScHUOdKGrvFgY/Ov7eOFrDnkYRpTMmec4DDnaKr0CQOwNKlKCstLc0BPDdyTsbm5HMcwHP5XTJ7IJ/jAN+36CT34X0eABPsN+3zaWkCDqTOrCXNxoacTxxA//K7qBMAdKNH1sqC1HEA76sf0M2IfB8H0M7COTHysp0cgC42QeaOpY4D0FVPzdq21HGAfU/T9QXouwfUGfguGBhqW8FuFfWrVjAo1Rl4t/fufSHz/qvI76H8niq/i/K7qtyPcr8q70V5ryL394Gc/VeRP0b5Y1X+COWPVPlDlD9U5Q9Q/kCV37/DfmFj/X4XY89p6pSuyknnqno1u78eDgy/aVv7dm6cblxeYXlUar4zvGfVF6yZI7oopw6azbxMOOELe/KARM5lS/HJi2NSmLVqS0KDo0OiJ6Q0YVamLaMplNgxK5PHxf9A69SPgXf9w+9+DGK3zFrCPq1e4dJalXq3okwnpDjef/3uz2394NVg31UrvxoaxsZYtUsyH6GxRWLMtTWmVak2xhrLE2OXpkPOoXRNOHWYmK6UNGP5VSXZqdvF8TYbu5rsGhs0Gm9gl77/6XufG25JvfxZY223QKvF1i7hVouwXYKuiKUdAyuJlphlpXviQAmsLERrwdrXIb5C1TK+St1Rjp5KjynAZ4i914iFZHrPrKdlEQ6glaEDEoYecHCdGNotdHeLP93iFtmZJNWabCcH8L7cAuoEuE587RqXp/eseA3t4gJo59g0HV2T7eQA2jJdZJFTtoUDeG5knoZW5HMcwPumcmgzAa4TXy3jgNSXralJ+UrA6Gc37AIsKg7Q4rN25D1Y3AOKL1Wq5QA94LlZkz0RQPdtb4aeBltn8CdEECe51cl1uVGllha+qNUPa/EGXTHzj7QSNpsFko22eTx/7+Ne6b3vfyUhN0dCsFH+Xp2E3O3t7WOSXizR65boxTb29Wrs0d/X13uH/cICj1sLPHYLPMYCj1oLPHILPMICOhPy9z3s+4VJg3m5RhYSbZPVGq1qnOmX5w0dCMAnkgo9rvW/CDwJvuj3mo9WrRhmfYPG9uzofLtVW5SafzhMkMgEaYattLS4JsJYvkKMnOYwNBGUK83ZxVMar1qX4N5UEbx3acTeDFmbR7Qsg6AmghCTm6DLEZLNoSvVRGC2y0MWYbT3aiIYtdo6o0O0PGrFM9I1qyIol86YhuH9ntFq7aCAts6OmZeyVgGgvpFDKzJB3x/gBlgTgf3qZRadrNocCVek/VQR9HemSJcXzMqKtTwr+6uKkMdN2rOSnggAY7B/REPrliGJIGJodWzGbE6TSVkCMfS5fECiMSdxRgpybWoiaO96zIoB3eEAueAGiSVI9lSjW61SeON52B6rk+mUfB1gJIdb7Bk6n6eb0nFpIkHEa5f2lHHLRPznEWyRrBJ2EJmrz8CCu6VmIu/tqkx5CADzK3NiVqXHEQApYJiOy7UiwEewbrO+ZI9KRicAVF2p0IhsrgBgzVSFbMtxEQBeu79GR2TnBcApek5KwFg5AF1yjQUhqeMAdIkYTWTsQtMuSSNpIuiPcUzy0lQCQJvjGXoK7JwDqH9lksyCw+NAmTnOdgZnjguwP2FmGeiPB9BG0zRpgI088JXQ3Rihu/2sUtfEEVdekXLiZwXCc3IldvxjU05fUG6pherpHLGdB7YwPXdcV6TTeawq7eYCuQyhpftUJSOQjAbaBaOjyW6cCTLnzUKPdfieXsbRn6MIDBxJOKk9mliWnhKwyhoqIRKVPhExRoZ9Yki1AApToFNNZ0khCwJj6uSCZFfcZk2HZCFVBOXOkrScIdFDNmdlOVWEoThNV6paOU0EPT8+MY0FpwqhELDSc7sZxm67APu1ZzcPoFMeUHWMxsBZBWKwWG3cCxyyBGIoMZY3jSNnW2YjECMvyjmJE7KXZj/AixQR9LNxwfplZSUvQYzvWqAjBrzIA7jYY6QEhxIcKG1klVnGMbZRYJiFpw0rJtUCcL5GpvcYo1f42g3t4z60Vbs6xdthE6cs0F+WTorcqQzoWiK1G4W8Lg39UMLqhqgmc6ZsDyib6gEf2x7RlVVsyXSZNFdlSzjA9TeuJDI5gOfmss52TD7nJQF9QgZGHJmxInJ7KwBM3S7HsHRjk6SkDxcAJnRzns1c2aRsg6S2fEIGrf7E9KuTj9MT6YYFUOYDUQieB0B3XKPjQEc5wGlt4A5VANDF9qx58KQc4MrucqIsEwCyG50SApyoYyHAWiG5pZeFOm3xXUcRGnF9hZwjAqspaGuqShfkqhYAKqiM2VszuIdArM74p69e/vgiOBx8htPebr6363W2myETZ23TvlWp+SCPIbCF18ZbWkmV/5bTa1/3AT03sA9AudpfP/bXr/bXj/31q/3VthIg79VTtiIr7O/VJpuasu3r+7zE8t632lkQQGiPt7XXHZYqghmazVnxC7MCh0qAwQkdJqzJMemEOAA/PD9rnchHBYBJ3ixYablTFgBaFwrRVchJcQB1noctI2fPlJ2UdCWaCOoondKNBbITYT+yJlUEPbzcoOsyzAsADitzYsVLpA7JC8DwdCFCp7OMFFjz0gaaCMqlJ+zShSzBAejKZdyqCID2j5q1STC+B0BnZGjm1AlN2Ftwx0UVgaUbuzS2JS3NAYYskfCDqCWxEoNZm0hkjSZk0lMTQU2dzkg5iSwtkPHmZ0r6ceKksSgfP1b3/dyknsbCXHZWkDv3ToeHP7z6h1jCenD49Axgl8NcZk+al8MhAPKxfRKWU00AvU7tRKHlLMGqJRiNpcth05At0kRQzkvJyxIcIPdwB1zLWGgiGLsuCTg2Sa3TLfdguABHvaoId7UnzpacdgJojOGHgRfP+jsxZRKZYIa/arKBUh2Sjlm6a5BGUq07NRnQBVDInxWHWxUc4NQ7Yq5Wo5xc5GthnqaRdUJr5GIHR14TIdmedxpJINseUOfG1L4y36aUDnTh/2RuRrkEwAFmDbxthHifvqfoRuBpftusQjKCgy7blWuxeutwxy6uSx0HHTcMLTsFs7JET/bw7AMxWCCSckIbWAIx9GfsxC5vYgnESstpsoAtdwE+HSbLsAfgAEPlulVjHr9mN8D5qiKcSqf2+TbJVEkYfIoqAksU83QFTv04ULwkk6CXdAG0Y7lE8vLekQBYZ8Pam7EbYVK8hJoVkbpeA8/bfCejVk5j/Gp+K5TqQmXsixyPSGJ9BwncvTv3UcEAKB7ceYgKBkDxiInN2o5ZkVmgR3d+6e1AS8pUiLXs6s0ftX/wwLxr/qY9jao/GT+3V+UrH8jDQbgFhFThplIcXY5l7MkDa1xGdgFgRLpcYmLhCB2+ABgMUhg/BUBfbaCfFQDp5CQpSP8sAHqZBUbewMV4APqXbeBxmACqZ4GcrQBI/zocSbXstwOD79pW5KRBlkauWpGgVEfgm29+L0RPnjz1PRkaGB54/YNCcwuYB+bA55K5bEF8KTFX8j19OvzWJ/Jk1Sabe5y58AL29KiVKrCYRxNLbpmmQr095ubxcXiDKpLl/uvV2+Cv/jsw/GYoKIq9cCWDXAKl/vgdaF/9bWDwOWh+9+s/CE0Ai//pL/8phP8XHHwa/LqXv5m9/M8607vVBM4NHXJ18NxKsuFnXaDu5JrFKfeN+2W7FEFOJgDoxstkbtvKSdeFGEqoR/wth/t24ZgYORaByDpcWlFFyFDnaOqY/eBehYt8QgYVeudyykdLgKEqZiSkQByoTgh0AkDNUwZNy9s+AsBzmapdyHO2JJ9WRTh2U2S7ZFbh9YC1mR989eMLZd7zYSXZHFlcaRu3VqU2/Q52mZqeS9Mihn3Z/hFNHzhj0l0hhjqSdXK8T9clgUAMndoK06LcWQgA9ScjzvGIXZYJZ8Tw9N60lZRcVwB4d32VzhZZgJXvBgyDsjhDV6p2BK6WAdbzAsCl2zICX937V/f+hbh3kXtB9/73gcF/DvQ/Dw4O3UgmK79sGnC3jANYZ6PHbmIow7bjkp2pIh8HdqPBmLIAbAPO2JvPilTYDxf5nLW4WdsWgP/D73xhI3bqjGlbuagdhcRCMUr2T634HuOrPno2w6zmU2WicMdNhNvCwx0u8rF9rPsP6xpNZ5ydgnbra2qGXOx8+93/yJd6+NnAO2XrnGQttnOjpCkPqTQRbhzcUdLSappIL2cai5jS4CJO8H0CeGd9AjiJsF2s+Xi20MdWF2uAj8wX7UXcf9jzs2RPJrkFgC7wm4Ki8fq1QTfVuivHVgBtvQ4Fnw8GBp++63893GH37yTOaaH9ZK9Vqc23LIu9kDDjQJmLbvfg5IFjbapW8praPSFUn06u6U8n165KBD8JPHnX3ymhEZnoktAAZY+W0PCrCQ1c7/4791DBgJLpeKhmOtDxuuLfCPnDD+UyeJuuaOpHuUtN+W/oND8mnXE9zuyt4ZvnzCR8RC5DjP8B9ZAYSsxHmbdkv0lCnutoIpWwXnWRtRspNS932cZZyzloIhiQ+Qnm6uTK5+A6mRW2e3dLI18GjEM9R8/kvRIBQFfY1J5GjP5hBfOYAoBNTpZJQ9pcANxTbFqFVZqW0wAx1Lx0rDSbA3h6ZNasrHH2LitQRZgDcr9TF7NH1KSKPk9+5i9/+FaI3NsV0ObQOWPV7h4AeqWJsN8Rs57SymkinHFFsr5r7c5pRVulwPGNmpUe4ROHyZ2kPMTsoLiOG+NJoivMgsrruLTbSsl+yE21eqLrsMKOV+pcB8bjODqwZwNvB14PvBpstatLyK48tkWl2hX100VsjHYD+mHnQXhwK5b9aOOJbwZu33g4J+9/0QYVH5x8cQa9qROMYgGvmAgAXvr8BHUCQMvm1Kspc9qllN9/8zuhcP8HXndxySnLczoBvogZIr52uv0Z0mU2fOarLy26D18xvu6fpuj6Jyc+kAh7+eb1wNN+b190Q1dj6GWcxMvKB2CAZYkXA2+DVqxEgKspApjoWyNkZ4WEK1YWprsqguXV5XM7Ui+7x1OxDH7hpongXd7c5GkM+S5VpJdjTA/ZkSbSy7X+HYVWqV765VutGIMtrVM/TtJEX8TyF18d3v7y/8gA8Zy1rf/JUGDwWWtDP4Gvut+/hMJ2dNsOwZGvKoL2LM6S6ol13LBn4NNyVYQbret9um03L8z6hvZptCaC8YssWGvj+ifUqgjKZaPW1D7bD9BIgoydkRIcUrcrcHPh5udZq0g+YTdT6ta2TQH9OzoyjThbgfjJniaCcrOHzD52aMS5lH/rRRPBStple7QNetogRTnamgjq8/4wmvs1OsxjTQR29S612iNxKwUnEaroMzAN+2zcLsDOnwPQ5bbtoswpCIChpIarQQAYmuOklVqUw8EBmKLLpTo+ZlLHAerO3Nyn+kWaJoKpHl1mW3S3QRAMNBHUx//IAJw3IoaautzItFIJa7QKvfAA9J5/VqFlW1SRXk5b2JoIRqE4Ts/kuAkAbSyNk0loIwfQxjxbY5CP4QCe63Z9MXpCV8/ZgsOnNRGW27Sm4FYqBzhzFu2pYzpVUL509ET/IWRfQIz56f8BvNNeN7lTAAA=',
|
||||
headers: {
|
||||
'User-Agent': 'PC_UA',
|
||||
'Cookie': 'cna=VvNvGX3e0ywCAavVEXlnA2bg; __ysuid=1626676228345Rl1; __ayft=1652434048647; __arycid=dm-1-00; __arcms=dm-1-00; __ayvstp=85; __arpvid=1667204023100cWWdgM-1667204023112; __ayscnt=10; __aypstp=60; isg=BBwcqxvvk3BxkWQGugbLpUSf7TrOlcC_U7GAj_YdfYfvQbzLHqYGT4Hgp6m5TvgX; tfstk=c3JOByYUH20ilVucLOhh0pCtE40lZfGc-PjLHLLfuX7SWNyAiQvkeMBsIw7PWDC..; l=eBQguS-PjdJFGJT-BOfwourza77OSIRA_uPzaNbMiOCPOb1B5UxfW6yHp4T6C3GVhsGJR3rp2umHBeYBqQd-nxvOF8qmSVDmn',
|
||||
'Referer': 'https://www.youku.com',
|
||||
},
|
||||
timeout: 5000,
|
||||
class_name: '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏',
|
||||
class_url: '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏',
|
||||
limit: 20,
|
||||
play_parse: true,
|
||||
lazy: $js.toString(() => {
|
||||
input = {
|
||||
parse: 1,
|
||||
jx: 1,
|
||||
url: input
|
||||
};
|
||||
}),
|
||||
一级: $js.toString(() => {
|
||||
let d = [];
|
||||
MY_FL.type = MY_CATE;
|
||||
let fl = stringify(MY_FL);
|
||||
fl = encodeUrl(fl);
|
||||
input = input.split("{")[0] + fl;
|
||||
if (MY_PAGE > 1) {
|
||||
let old_session = getItem("yk_session_" + MY_CATE, "{}");
|
||||
if (MY_PAGE === 2) {
|
||||
input = input.replace("optionRefresh=1", "session=" + encodeUrl(old_session))
|
||||
} else {
|
||||
input = input.replace("optionRefresh=1", "session=" + encodeUrl(old_session))
|
||||
}
|
||||
}
|
||||
let html = fetch(input, fetch_params);
|
||||
try {
|
||||
html = JSON.parse(html);
|
||||
let lists = html.data.filterData.listData;
|
||||
let session = html.data.filterData.session;
|
||||
session = stringify(session);
|
||||
if (session !== getItem("yk_session_" + MY_CATE, "{}")) {
|
||||
setItem("yk_session_" + MY_CATE, session)
|
||||
}
|
||||
lists.forEach(function (it) {
|
||||
let vid;
|
||||
if (it.videoLink.includes("id_")) {
|
||||
vid = it.videoLink.split("id_")[1].split(".html")[0]
|
||||
} else {
|
||||
vid = "msearch:"
|
||||
}
|
||||
d.push({
|
||||
title: it.title,
|
||||
img: it.img,
|
||||
desc: it.summary,
|
||||
url: "https://search.youku.com/api/search?appScene=show_episode&showIds=" + vid,
|
||||
content: it.subTitle
|
||||
})
|
||||
})
|
||||
} catch (e) {
|
||||
log("一级列表解析发生错误:" + e.message)
|
||||
}
|
||||
setResult(d);
|
||||
}),
|
||||
二级: $js.toString(() => {
|
||||
var d = [];
|
||||
VOD = {};
|
||||
let html = request(input);
|
||||
let json = JSON.parse(html);
|
||||
if (/keyword/.test(input)) {
|
||||
input = "https://search.youku.com/api/search?appScene=show_episode&showIds=" + json.pageComponentList[0].commonData.showId;
|
||||
json = JSON.parse(fetch(MY_URL, fetch_params))
|
||||
}
|
||||
let video_lists = json.serisesList;
|
||||
var name = json.sourceName;
|
||||
if (/优酷/.test(name) && video_lists.length > 0) {
|
||||
let ourl = "https://v.youku.com/v_show/id_" + video_lists[0].videoId + ".html";
|
||||
let _img = video_lists[0].thumbUrl;
|
||||
let html = fetch(ourl, {
|
||||
headers: {
|
||||
Referer: "https://v.youku.com/",
|
||||
"User-Agent": PC_UA
|
||||
}
|
||||
});
|
||||
let json = /__INITIAL_DATA__/.test(html) ? html.split("window.__INITIAL_DATA__ =")[1].split(";")[0] : "{}";
|
||||
if (json === "{}") {
|
||||
log("触发了优酷人机验证");
|
||||
VOD.vod_remarks = ourl;
|
||||
VOD.vod_pic = _img;
|
||||
VOD.vod_name = video_lists[0].title.replace(/(\d+)/g, "");
|
||||
VOD.vod_content = "触发了优酷人机验证,本次未获取详情,但不影响播放(" + ourl + ")"
|
||||
} else {
|
||||
try {
|
||||
json = JSON.parse(json);
|
||||
let data = json.data.data;
|
||||
let data_extra = data.data.extra;
|
||||
let img = data_extra.showImgV;
|
||||
let model = json.data.model;
|
||||
let m = model.detail.data.nodes[0].nodes[0].nodes[0].data;
|
||||
let _type = m.showGenre;
|
||||
let _desc = m.updateInfo || m.subtitle;
|
||||
let JJ = m.desc;
|
||||
let _title = m.introTitle;
|
||||
VOD.vod_pic = img;
|
||||
VOD.vod_name = _title;
|
||||
VOD.vod_type = _type;
|
||||
VOD.vod_remarks = _desc;
|
||||
VOD.vod_content = JJ
|
||||
} catch (e) {
|
||||
log("海报渲染发生错误:" + e.message);
|
||||
print(json);
|
||||
VOD.vod_remarks = name
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!/优酷/.test(name)) {
|
||||
VOD.vod_content = "非自家播放源,暂无视频简介及海报";
|
||||
VOD.vod_remarks = name
|
||||
}
|
||||
|
||||
function adhead(url) {
|
||||
return urlencode(url)
|
||||
}
|
||||
|
||||
play_url = play_url.replace("&play_url=", "&type=json&play_url=");
|
||||
video_lists.forEach(function (it) {
|
||||
let url = "https://v.youku.com/v_show/id_" + it.videoId + ".html";
|
||||
if (it.thumbUrl) {
|
||||
d.push({
|
||||
desc: it.showVideoStage ? it.showVideoStage.replace("期", "集") : it.displayName,
|
||||
pic_url: it.thumbUrl,
|
||||
title: it.title,
|
||||
url: play_url + adhead(url)
|
||||
})
|
||||
} else if (name !== "优酷") {
|
||||
d.push({
|
||||
title: it.displayName ? it.displayName : it.title,
|
||||
url: play_url + adhead(it.url)
|
||||
})
|
||||
}
|
||||
});
|
||||
VOD.vod_play_from = name;
|
||||
VOD.vod_play_url = d.map(function (it) {
|
||||
return it.title + "$" + it.url
|
||||
})
|
||||
.join("#");
|
||||
}),
|
||||
|
||||
搜索: $js.toString(() => {
|
||||
var d = [];
|
||||
let html = request(input);
|
||||
let json = JSON.parse(html);
|
||||
json.pageComponentList.forEach(function (it) {
|
||||
if (it.hasOwnProperty("commonData")) {
|
||||
it = it.commonData;
|
||||
d.push({
|
||||
title: it.titleDTO.displayName,
|
||||
img: it.posterDTO.vThumbUrl,
|
||||
desc: it.stripeBottom,
|
||||
content: it.updateNotice + " " + it.feature,
|
||||
url: "https://search.youku.com/api/search?appScene=show_episode&showIds=" + it.showId + "&appCaller=h5"
|
||||
})
|
||||
}
|
||||
});
|
||||
setResult(d)
|
||||
}),
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"规则名": "六趣阿狸",
|
||||
"规则作者": " 六趣",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "是",
|
||||
"首页推荐链接": "https://cms.715d.com",
|
||||
"首页列表数组规则": "body&&.module-items",
|
||||
"首页片单列表数组规则": ".module-item",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://cms.715d.com/index.php/vodshow/{cateId}-{area}-{by}-{class}-{lang}----{catePg}---{year}.html",
|
||||
"分类名称": "六趣电影&六趣电视剧&六趣动漫&六趣综艺&六趣短剧",
|
||||
"分类名称替换词": "1&2&3&4&5",
|
||||
"筛选数据": "ext",
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "*",
|
||||
"筛选类型名称": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&校园&动作&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选类型替换词": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&校园&动作&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选地区名称": "大陆&香港&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选地区替换词": "大陆&香港&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
"筛选语言名称": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选语言替换词": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".module-items&&.module-item",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": "a&&title",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".module-item-pic&&img&&data-src",
|
||||
"分类片单副标题": ".module-item-text&&Text",
|
||||
"分类片单链接加前缀": "https://cms.715d.com",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "https://cms.715d.com/index.php/vodsearch/{wd}----------{SearchPg}---.html",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-search-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-src",
|
||||
"搜索片单标题": "h3&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".video-info&&a&&Text",
|
||||
"搜索片单链接加前缀": "https://cms.715d.com/",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": ".video-info-main&&.video-info-actor,1&&Text",
|
||||
"简介详情": ".sqjj_a&&Text",
|
||||
"线路列表数组规则": ".module-tab-content&&.selected",
|
||||
"线路标题": "span&&Texe",
|
||||
"播放列表数组规则": ".module-row-one",
|
||||
"选集列表数组规则": ".module-row-one",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "h4&&Text",
|
||||
"选集链接": ".btn-down&&a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "",
|
||||
"是否开启手动嗅探": "否",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
Object.assign(muban.mxpro.二级, {
|
||||
tab_text: 'div--small&&Text',
|
||||
});
|
||||
var rule = {
|
||||
模板: 'mxpro',
|
||||
title: '剧圈圈',
|
||||
host: 'https://www.jqqzx.cc/',
|
||||
url: '/vodshow/id/fyclass/page/fypage.html',
|
||||
searchUrl: '/vodsearch**/page/fypage.html',
|
||||
class_parse: '.navbar-items li:gt(2):lt(8);a&&Text;a&&href;.*/(.*?)\.html',
|
||||
cate_exclude: '今日更新|热榜',
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
var rule = {
|
||||
title:'动漫岛',
|
||||
// host:'http://www.dmd85.com',
|
||||
// host:'http://www.88dmw.com',
|
||||
host:'http://www.dmd77.com',
|
||||
// url:'/vod-list-id-fyclass-pg-fypage-order--by-{by}-class-{class}-year-{year}-letter--area--lang-.html',
|
||||
url:'/vod-list-id-fyclass-pg-fypage-order-fyfilter-area--lang-.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'-by-{{fl.by}}-class-{{fl.class}}-year-{{fl.year}}-letter-{{fl.letter}}',
|
||||
filter: {"1":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"1"},{"n":"热血","v":"2"},{"n":"奇幻","v":"3"},{"n":"恋爱","v":"4"},{"n":"校园","v":"5"},{"n":"后宫","v":"6"},{"n":"搞笑","v":"7"},{"n":"青春","v":"8"},{"n":"百合","v":"9"},{"n":"科幻","v":"14"},{"n":"推理","v":"13"},{"n":"魔法","v":"12"},{"n":"神魔","v":"11"},{"n":"治愈","v":"10"},{"n":"竞技","v":"59"},{"n":"悬疑","v":"60"},{"n":"战争","v":"62"},{"n":"萝莉","v":"63"},{"n":"魔幻","v":"64"},{"n":"战斗","v":"65"},{"n":"歌舞","v":"98"},{"n":"历史","v":"99"},{"n":"励志","v":"108"},{"n":"偶像","v":"118"},{"n":"职场","v":"121"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"更新","v":"time"},{"n":"得分","v":"score"},{"n":"总排行","v":"hits"}]}],"3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"36"},{"n":"热血","v":"37"},{"n":"奇幻","v":"38"},{"n":"恋爱","v":"39"},{"n":"恋爱","v":"40"},{"n":"恋爱","v":"40"},{"n":"搞笑","v":"42"},{"n":"治愈","v":"43"},{"n":"神魔","v":"44"},{"n":"魔法","v":"45"},{"n":"百合","v":"46"},{"n":"推理","v":"47"},{"n":"科幻","v":"48"},{"n":"竞技","v":"49"},{"n":"悬疑","v":"66"},{"n":"战争","v":"68"},{"n":"萝莉","v":"69"},{"n":"魔幻","v":"70"},{"n":"战斗","v":"71"},{"n":"青春","v":"72"},{"n":"历史","v":"100"},{"n":"歌舞","v":"101"},{"n":"恐怖","v":"104"},{"n":"职场","v":"107"},{"n":"励志","v":"109"},{"n":"偶像","v":"119"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"更新","v":"time"},{"n":"得分","v":"score"},{"n":"总排行","v":"hits"}]}],"4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"50"},{"n":"热血","v":"51"},{"n":"武侠","v":"52"},{"n":"奇幻","v":"53"},{"n":"玄幻","v":"54"},{"n":"竞技","v":"55"},{"n":"魔幻","v":"56"},{"n":"科幻","v":"57"},{"n":"恋爱","v":"58"},{"n":"历史","v":"73"},{"n":"战斗","v":"74"},{"n":"搞笑","v":"75"},{"n":"神魔","v":"76"},{"n":"战争","v":"97"},{"n":"古风","v":"111"},{"n":"少女","v":"112"},{"n":"萝莉","v":"113"},{"n":"治愈","v":"114"},{"n":"日常","v":"115"},{"n":"歌舞","v":"116"},{"n":"偶像","v":"120"},{"n":"职场","v":"123"},{"n":"仙侠","v":"125"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"更新","v":"time"},{"n":"得分","v":"score"},{"n":"总排行","v":"hits"}]}],"16":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"77"},{"n":"热血","v":"78"},{"n":"奇幻","v":"79"},{"n":"恋爱","v":"80"},{"n":"校园","v":"81"},{"n":"后宫","v":"82"},{"n":"搞笑","v":"83"},{"n":"青春","v":"84"},{"n":"百合","v":"85"},{"n":"治愈","v":"86"},{"n":"神魔","v":"87"},{"n":"魔法","v":"88"},{"n":"推理","v":"89"},{"n":"科幻","v":"90"},{"n":"竞技","v":"91"},{"n":"悬疑","v":"92"},{"n":"战争","v":"93"},{"n":"萝莉","v":"94"},{"n":"魔幻","v":"95"},{"n":"战斗","v":"96"},{"n":"历史","v":"102"},{"n":"歌舞","v":"103"},{"n":"恐怖","v":"105"},{"n":"职场","v":"106"},{"n":"励志","v":"110"},{"n":"偶像","v":"117"},{"n":"职场","v":"124"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"更新","v":"time"},{"n":"得分","v":"score"},{"n":"总排行","v":"hits"}]}]},
|
||||
searchUrl:'/search-pg-fypage-wd-**.html',
|
||||
searchable:2,//是否启用全局搜索,
|
||||
quickSearch:0,//是否启用快速搜索,
|
||||
headers:{
|
||||
'User-Agent':'PC_UA',
|
||||
},
|
||||
class_parse:'.secNacUl li;a&&Text;a&&href;.*/(\\d+)-1.html',
|
||||
play_parse:true,
|
||||
lazy:'',
|
||||
limit:6,
|
||||
推荐:'.c1_l_wap_contact li;*;img&&src;.time:eq(0)&&Text;*',
|
||||
一级:'.list3_cn_box .cn_box2;a&&title;.list_pic&&src;.list_20 li:eq(1) span&&Text;a&&href',
|
||||
二级:{
|
||||
"title":"h1&&Text;.o_r_contact&&li:eq(0)&&Text",
|
||||
"img":".o_big_img_bg_b img&&src",
|
||||
"desc":".o_r_contact&&li:eq(6)&&Text;.o_r_contact&&li:eq(5)&&Text;.o_r_contact&&li:eq(3)&&Text;.o_r_contact&&li:eq(2)&&Text;.o_r_contact&&li:eq(1)&&Text",
|
||||
"content":".des_box&&Text",
|
||||
"tabs":".from-tabs&&label",
|
||||
"lists":".mn_list_li_movie:eq(#id) li"
|
||||
},
|
||||
搜索:'*',
|
||||
}
|
||||
@@ -0,0 +1,495 @@
|
||||
{
|
||||
"站名": "动漫巴士",
|
||||
"主页url": "https://dm84.tv",
|
||||
"分类": "国产动漫&日本动漫&欧美动漫&电影",
|
||||
"分类值": "1&2&3&4",
|
||||
"分类url": "https://dm84.tv/show-{cateId}--{by}-{class}--{year}-{catePg}.html",
|
||||
"数组": "<div class=\"item\">&&</div>",
|
||||
"图片": "data-bg=\"&&\"",
|
||||
"标题": "title=\"&&\"[替换:在线观看>>空]",
|
||||
"副标题": "desc\">&&</span>",
|
||||
"搜索模式": "1",
|
||||
"搜索url": "/s----------.html?wd={wd}",
|
||||
"搜索数组": "item\">&&</li>",
|
||||
"搜索图片": "data-bg=\"&&\"",
|
||||
"搜索标题": "title=\"&&\"",
|
||||
"搜索链接": "href=\"&&\"",
|
||||
"搜索副标题": "desc\">&&</span>",
|
||||
"导演": "导演:&&</p>",
|
||||
"主演": "主演:&&</p>",
|
||||
"简介": "剧情:&&</p>",
|
||||
"线路二次截取": "play_from\">&&</ul>",
|
||||
"线路数组": "<li&&/li>[替换:线路>>播放列表]",
|
||||
"线路标题": ">&&<",
|
||||
"播放数组": "<ul class=\"play_list&&</ul>",
|
||||
"筛选": {
|
||||
"1": [
|
||||
{
|
||||
"key": "class",
|
||||
"name": "剧情",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "奇幻",
|
||||
"v": "奇幻"
|
||||
},
|
||||
{
|
||||
"n": "战斗",
|
||||
"v": "战斗"
|
||||
},
|
||||
{
|
||||
"n": "玄幻",
|
||||
"v": "玄幻"
|
||||
},
|
||||
{
|
||||
"n": "穿越",
|
||||
"v": "穿越"
|
||||
},
|
||||
{
|
||||
"n": "科幻",
|
||||
"v": "科幻"
|
||||
},
|
||||
{
|
||||
"n": "武侠",
|
||||
"v": "武侠"
|
||||
},
|
||||
{
|
||||
"n": "热血",
|
||||
"v": "热血"
|
||||
},
|
||||
{
|
||||
"n": "耽美",
|
||||
"v": "耽美"
|
||||
},
|
||||
{
|
||||
"n": "搞笑",
|
||||
"v": "搞笑"
|
||||
},
|
||||
{
|
||||
"n": "动态漫画",
|
||||
"v": "动态漫画"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "year",
|
||||
"name": "年份",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "2023",
|
||||
"v": "2023"
|
||||
},
|
||||
{
|
||||
"n": "2022",
|
||||
"v": "2022"
|
||||
},
|
||||
{
|
||||
"n": "2021",
|
||||
"v": "2021"
|
||||
},
|
||||
{
|
||||
"n": "2020",
|
||||
"v": "2020"
|
||||
},
|
||||
{
|
||||
"n": "2019",
|
||||
"v": "2019"
|
||||
},
|
||||
{
|
||||
"n": "2018",
|
||||
"v": "2018"
|
||||
},
|
||||
{
|
||||
"n": "2017",
|
||||
"v": "2017"
|
||||
},
|
||||
{
|
||||
"n": "2016",
|
||||
"v": "2016"
|
||||
},
|
||||
{
|
||||
"n": "2015",
|
||||
"v": "2015"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "by",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
{
|
||||
"n": "时间",
|
||||
"v": "time"
|
||||
},
|
||||
{
|
||||
"n": "人气",
|
||||
"v": "hits"
|
||||
},
|
||||
{
|
||||
"n": "评分",
|
||||
"v": "score"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"2": [
|
||||
{
|
||||
"key": "class",
|
||||
"name": "剧情",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "冒险",
|
||||
"v": "冒险"
|
||||
},
|
||||
{
|
||||
"n": "奇幻",
|
||||
"v": "奇幻"
|
||||
},
|
||||
{
|
||||
"n": "战斗",
|
||||
"v": "战斗"
|
||||
},
|
||||
{
|
||||
"n": "后宫",
|
||||
"v": "后宫"
|
||||
},
|
||||
{
|
||||
"n": "热血",
|
||||
"v": "热血"
|
||||
},
|
||||
{
|
||||
"n": "励志",
|
||||
"v": "励志"
|
||||
},
|
||||
{
|
||||
"n": "搞笑",
|
||||
"v": "搞笑"
|
||||
},
|
||||
{
|
||||
"n": "校园",
|
||||
"v": "校园"
|
||||
},
|
||||
{
|
||||
"n": "机战",
|
||||
"v": "机战"
|
||||
},
|
||||
{
|
||||
"n": "悬疑",
|
||||
"v": "悬疑"
|
||||
},
|
||||
{
|
||||
"n": "治愈",
|
||||
"v": "治愈"
|
||||
},
|
||||
{
|
||||
"n": "百合",
|
||||
"v": "百合"
|
||||
},
|
||||
{
|
||||
"n": "恐怖",
|
||||
"v": "恐怖"
|
||||
},
|
||||
{
|
||||
"n": "泡面番",
|
||||
"v": "泡面番"
|
||||
},
|
||||
{
|
||||
"n": "恋爱",
|
||||
"v": "恋爱"
|
||||
},
|
||||
{
|
||||
"n": "推理",
|
||||
"v": "推理"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "year",
|
||||
"name": "年份",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "2023",
|
||||
"v": "2023"
|
||||
},
|
||||
{
|
||||
"n": "2022",
|
||||
"v": "2022"
|
||||
},
|
||||
{
|
||||
"n": "2021",
|
||||
"v": "2021"
|
||||
},
|
||||
{
|
||||
"n": "2020",
|
||||
"v": "2020"
|
||||
},
|
||||
{
|
||||
"n": "2019",
|
||||
"v": "2019"
|
||||
},
|
||||
{
|
||||
"n": "2018",
|
||||
"v": "2018"
|
||||
},
|
||||
{
|
||||
"n": "2017",
|
||||
"v": "2017"
|
||||
},
|
||||
{
|
||||
"n": "2016",
|
||||
"v": "2016"
|
||||
},
|
||||
{
|
||||
"n": "2015",
|
||||
"v": "2015"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "by",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
{
|
||||
"n": "时间",
|
||||
"v": "time"
|
||||
},
|
||||
{
|
||||
"n": "人气",
|
||||
"v": "hits"
|
||||
},
|
||||
{
|
||||
"n": "评分",
|
||||
"v": "score"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"3": [
|
||||
{
|
||||
"key": "class",
|
||||
"name": "剧情",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "科幻",
|
||||
"v": "科幻"
|
||||
},
|
||||
{
|
||||
"n": "冒险",
|
||||
"v": "冒险"
|
||||
},
|
||||
{
|
||||
"n": "战斗",
|
||||
"v": "战斗"
|
||||
},
|
||||
{
|
||||
"n": "百合",
|
||||
"v": "百合"
|
||||
},
|
||||
{
|
||||
"n": "奇幻",
|
||||
"v": "奇幻"
|
||||
},
|
||||
{
|
||||
"n": "热血",
|
||||
"v": "热血"
|
||||
},
|
||||
{
|
||||
"n": "搞笑",
|
||||
"v": "搞笑"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "year",
|
||||
"name": "年份",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "2023",
|
||||
"v": "2023"
|
||||
},
|
||||
{
|
||||
"n": "2022",
|
||||
"v": "2022"
|
||||
},
|
||||
{
|
||||
"n": "2021",
|
||||
"v": "2021"
|
||||
},
|
||||
{
|
||||
"n": "2020",
|
||||
"v": "2020"
|
||||
},
|
||||
{
|
||||
"n": "2019",
|
||||
"v": "2019"
|
||||
},
|
||||
{
|
||||
"n": "2018",
|
||||
"v": "2018"
|
||||
},
|
||||
{
|
||||
"n": "2017",
|
||||
"v": "2017"
|
||||
},
|
||||
{
|
||||
"n": "2016",
|
||||
"v": "2016"
|
||||
},
|
||||
{
|
||||
"n": "2015",
|
||||
"v": "2015"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "by",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
{
|
||||
"n": "时间",
|
||||
"v": "time"
|
||||
},
|
||||
{
|
||||
"n": "人气",
|
||||
"v": "hits"
|
||||
},
|
||||
{
|
||||
"n": "评分",
|
||||
"v": "score"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"4": [
|
||||
{
|
||||
"key": "class",
|
||||
"name": "剧情",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "搞笑",
|
||||
"v": "搞笑"
|
||||
},
|
||||
{
|
||||
"n": "奇幻",
|
||||
"v": "奇幻"
|
||||
},
|
||||
{
|
||||
"n": "治愈",
|
||||
"v": "治愈"
|
||||
},
|
||||
{
|
||||
"n": "科幻",
|
||||
"v": "科幻"
|
||||
},
|
||||
{
|
||||
"n": "喜剧",
|
||||
"v": "喜剧"
|
||||
},
|
||||
{
|
||||
"n": "冒险",
|
||||
"v": "冒险"
|
||||
},
|
||||
{
|
||||
"n": "动作",
|
||||
"v": "动作"
|
||||
},
|
||||
{
|
||||
"n": "爱情",
|
||||
"v": "爱情"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "year",
|
||||
"name": "年份",
|
||||
"value": [
|
||||
{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
},
|
||||
{
|
||||
"n": "2023",
|
||||
"v": "2023"
|
||||
},
|
||||
{
|
||||
"n": "2022",
|
||||
"v": "2022"
|
||||
},
|
||||
{
|
||||
"n": "2021",
|
||||
"v": "2021"
|
||||
},
|
||||
{
|
||||
"n": "2020",
|
||||
"v": "2020"
|
||||
},
|
||||
{
|
||||
"n": "2019",
|
||||
"v": "2019"
|
||||
},
|
||||
{
|
||||
"n": "2018",
|
||||
"v": "2018"
|
||||
},
|
||||
{
|
||||
"n": "2017",
|
||||
"v": "2017"
|
||||
},
|
||||
{
|
||||
"n": "2016",
|
||||
"v": "2016"
|
||||
},
|
||||
{
|
||||
"n": "2015",
|
||||
"v": "2015"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "by",
|
||||
"name": "排序",
|
||||
"value": [
|
||||
{
|
||||
"n": "时间",
|
||||
"v": "time"
|
||||
},
|
||||
{
|
||||
"n": "人气",
|
||||
"v": "hits"
|
||||
},
|
||||
{
|
||||
"n": "评分",
|
||||
"v": "score"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
muban.vfed.二级.title = 'h1&&Text;.fed-col-md3--span:eq(0)&&Text';
|
||||
muban.vfed.二级.desc = '.fed-col-md3:eq(3)&&Text;;;.fed-col-md6:eq(0)&&Text;.fed-col-md6--span:eq(1)&&Text';
|
||||
var rule = {
|
||||
title: '去看吧',
|
||||
模板:'vfed',
|
||||
host: 'https://www.k9dm.com',
|
||||
// url: '/index.php/vod/show/id/fyclass/page/fypage.html',
|
||||
url: '/index.php/vod/show/id/fyclassfyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}/page/fypage{{fl.year}}',
|
||||
filter:{
|
||||
"33":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"21":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"50":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"24":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"22":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"/class/搞笑"},{"n":"经典","v":"/class/经典"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"治愈","v":"/class/治愈"},{"n":"猎奇","v":"/class/猎奇"},{"n":"励志","v":"/class/励志"},{"n":"战斗","v":"/class/战斗"},{"n":"后宫","v":"/class/后宫"},{"n":"机战","v":"/class/机战"},{"n":"恋爱","v":"/class/恋爱"},{"n":"百合","v":"/class/百合"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"运动","v":"/class/运动"},{"n":"魔法","v":"/class/魔法"},{"n":"历史","v":"/class/历史"},{"n":"伪娘","v":"/class/伪娘"},{"n":"美少女","v":"/class/美少女"},{"n":"萝莉","v":"/class/萝莉"},{"n":"亲子","v":"/class/亲子"},{"n":"青春","v":"/class/青春"},{"n":"冒险","v":"/class/冒险"},{"n":"竞技","v":"/class/竞技"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"},{"n":"1999","v":"/year/1999"},{"n":"1998","v":"/year/1998"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
|
||||
},
|
||||
class_parse: '.fed-pops-list:eq(0)&&li:gt(0):lt(6);a&&Text;a&&href;.*/(.*?).html',
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* 影视TV 弹幕支持
|
||||
* https://t.me/fongmi_offical/
|
||||
* https://github.com/FongMi/Release/tree/main/apk
|
||||
* Cookie设置
|
||||
* Cookie获取方法 https://ghproxy.net/https://raw.githubusercontent.com/UndCover/PyramidStore/main/list.md
|
||||
* Cookie设置方法1: DR-PY 后台管理界面
|
||||
* CMS后台管理 > 设置中心 > 环境变量 > {"bili_cookie":"XXXXXXX","vmid":"XXXXXX"} > 保存
|
||||
* Cookie设置方法2: 手动替换Cookie
|
||||
* 底下代码 headers的
|
||||
* "Cookie":"$bili_cookie"
|
||||
* 手动替换为
|
||||
* "Cookie":"将获取的Cookie黏贴在这"
|
||||
* 客户端长期Cookie设置教程:
|
||||
* 抓包哔哩手机端搜索access_key,取任意链接里的access_key和appkey在drpy环境变量中增加同名的环境变量即可
|
||||
* 此时哔哩.js这个解析可用于此源的解析线路用
|
||||
*/
|
||||
|
||||
var rule = {
|
||||
title:'哔哩影视[官]',
|
||||
host:'https://api.bilibili.com',
|
||||
url:'/fyclass-fypage&vmid=$vmid',
|
||||
detailUrl:'/pgc/view/web/season?season_id=fyid',
|
||||
filter_url:'fl={{fl}}',
|
||||
vmid获取教程:'登录后访问https://api.bilibili.com/x/web-interface/nav,搜索mid就是,cookie需要 bili_jct,DedeUserID,SESSDATA参数',
|
||||
searchUrl:'/x/web-interface/search/type?keyword=**&page=fypage&search_type=',
|
||||
searchable:1,
|
||||
filterable:1,
|
||||
quickSearch:0,
|
||||
headers:{
|
||||
'User-Agent':'PC_UA',
|
||||
"Referer": "https://www.bilibili.com",
|
||||
"Cookie":"http://127.0.0.1:9978/file/TVBox/bilibili.txt"
|
||||
},
|
||||
tab_order:['bilibili','B站'],//线路顺序,按里面的顺序优先,没写的依次排后面
|
||||
timeout:5000,
|
||||
class_name:'番剧&国创&电影&电视剧&纪录片&综艺&全部&追番&追剧&时间表',
|
||||
class_url:'1&4&2&5&3&7&全部&追番&追剧&时间表',
|
||||
filter:{"全部":[{"key":"tid","name":"分类","value":[{"n":"番剧","v":"1"},{"n":"国创","v":"4"},{"n":"电影","v":"2"},{"n":"电视剧","v":"5"},{"n":"记录片","v":"3"},{"n":"综艺","v":"7"}]},{"key":"order","name":"排序","value":[{"n":"播放数量","v":"2"},{"n":"更新时间","v":"0"},{"n":"最高评分","v":"4"},{"n":"弹幕数量","v":"1"},{"n":"追看人数","v":"3"},{"n":"开播时间","v":"5"},{"n":"上映时间","v":"6"}]},{"key":"season_status","name":"付费","value":[{"n":"全部","v":"-1"},{"n":"免费","v":"1"},{"n":"付费","v":"2%2C6"},{"n":"大会员","v":"4%2C6"}]}],"时间表":[{"key":"tid","name":"分类","value":[{"n":"番剧","v":"1"},{"n":"国创","v":"4"}]}]},
|
||||
play_parse:true,
|
||||
// play_json:[{re:'*', json:{jx:1, parse:0,header:JSON.stringify({"user-agent":"PC_UA"})}}],
|
||||
pagecount:{"1":1,"2":1,"3":1,"4":1,"5":1,"7":1,"时间表":1},
|
||||
lazy:'',
|
||||
limit:5,
|
||||
推荐:'',
|
||||
推荐:'js:let d=[];function get_result(url){let videos=[];let html=request(url);let jo=JSON.parse(html);if(jo["code"]===0){let vodList=jo.result?jo.result.list:jo.data.list;vodList.forEach(function(vod){let aid=(vod["season_id"]+"").trim();let title=vod["title"].trim();let img=vod["cover"].trim();let remark=vod.new_ep?vod["new_ep"]["index_show"]:vod["index_show"];videos.push({vod_id:aid,vod_name:title,vod_pic:img,vod_remarks:remark})})}return videos}function get_rank(tid,pg){return get_result("https://api.bilibili.com/pgc/web/rank/list?season_type="+tid+"&pagesize=20&page="+pg+"&day=3")}function get_rank2(tid,pg){return get_result("https://api.bilibili.com/pgc/season/rank/web/list?season_type="+tid+"&pagesize=20&page="+pg+"&day=3")}function home_video(){let videos=get_rank(1).slice(0,5);[4,2,5,3,7].forEach(function(i){videos=videos.concat(get_rank2(i).slice(0,5))});return videos}VODS=home_video();',
|
||||
一级:'',
|
||||
一级:'js:let d=[];let vmid=input.split("vmid=")[1].split("&")[0];function get_result(url){let videos=[];let html=request(url);let jo=JSON.parse(html);if(jo["code"]===0){let vodList=jo.result?jo.result.list:jo.data.list;vodList.forEach(function(vod){let aid=(vod["season_id"]+"").trim();let title=vod["title"].trim();let img=vod["cover"].trim();let remark=vod.new_ep?vod["new_ep"]["index_show"]:vod["index_show"];videos.push({vod_id:aid,vod_name:title,vod_pic:img,vod_remarks:remark})})}return videos}function get_rank(tid,pg){return get_result("https://api.bilibili.com/pgc/web/rank/list?season_type="+tid+"&pagesize=20&page="+pg+"&day=3")}function get_rank2(tid,pg){return get_result("https://api.bilibili.com/pgc/season/rank/web/list?season_type="+tid+"&pagesize=20&page="+pg+"&day=3")}function get_zhui(pg,mode){let url="https://api.bilibili.com/x/space/bangumi/follow/list?type="+mode+"&follow_status=0&pn="+pg+"&ps=10&vmid="+vmid;return get_result(url)}function get_all(tid,pg,order,season_status){let url="https://api.bilibili.com/pgc/season/index/result?order="+order+"&pagesize=20&type=1&season_type="+tid+"&page="+pg+"&season_status="+season_status;return get_result(url)}function get_timeline(tid,pg){let videos=[];let url="https://api.bilibili.com/pgc/web/timeline/v2?season_type="+tid+"&day_before=2&day_after=4";let html=request(url);let jo=JSON.parse(html);if(jo["code"]===0){let videos1=[];let vodList=jo.result.latest;vodList.forEach(function(vod){let aid=(vod["season_id"]+"").trim();let title=vod["title"].trim();let img=vod["cover"].trim();let remark=vod["pub_index"]+" "+vod["follows"].replace("系列","");videos1.push({vod_id:aid,vod_name:title,vod_pic:img,vod_remarks:remark})});let videos2=[];for(let i=0;i<7;i++){let vodList=jo["result"]["timeline"][i]["episodes"];vodList.forEach(function(vod){if(vod["published"]+""==="0"){let aid=(vod["season_id"]+"").trim();let title=vod["title"].trim();let img=vod["cover"].trim();let date=vod["pub_ts"];let remark=date+" "+vod["pub_index"];videos2.push({vod_id:aid,vod_name:title,vod_pic:img,vod_remarks:remark})}})}videos=videos2.concat(videos1)}return videos}function cate_filter(d,cookie){if(MY_CATE==="1"){return get_rank(MY_CATE,MY_PAGE)}else if(["2","3","4","5","7"].includes(MY_CATE)){return get_rank2(MY_CATE,MY_PAGE)}else if(MY_CATE==="全部"){let tid=MY_FL.tid||"1";let order=MY_FL.order||"2";let season_status=MY_FL.season_status||"-1";return get_all(tid,MY_PAGE,order,season_status)}else if(MY_CATE==="追番"){return get_zhui(MY_PAGE,1)}else if(MY_CATE==="追剧"){return get_zhui(MY_PAGE,2)}else if(MY_CATE==="时间表"){let tid=MY_FL.tid||"1";return get_timeline(tid,MY_PAGE)}else{return[]}}VODS=cate_filter();',
|
||||
二级:{
|
||||
is_json:true,
|
||||
title:".result.title;.result.share_sub_title",
|
||||
img:".result.cover",
|
||||
desc:".result.new_ep.desc;.result.publish.pub_time;.result.subtitle",
|
||||
content:".result.evaluate",
|
||||
tabs:"js:pdfa=jsp.pdfa;TABS=['B站']",
|
||||
lists:".result.episodes",
|
||||
list_text:'title',
|
||||
list_url:'cid',
|
||||
},
|
||||
二级:'',
|
||||
二级:'js:function zh(num){let p="";if(Number(num)>1e8){p=(num/1e8).toFixed(2)+"亿"}else if(Number(num)>1e4){p=(num/1e4).toFixed(2)+"万"}else{p=num}return p}let html=request(input);let jo=JSON.parse(html).result;let id=jo["season_id"];let title=jo["title"];let pic=jo["cover"];let areas=jo["areas"][0]["name"];let typeName=jo["share_sub_title"];let date=jo["publish"]["pub_time"].substr(0,4);let dec=jo["evaluate"];let remark=jo["new_ep"]["desc"];let stat=jo["stat"];let status="弹幕: "+zh(stat["danmakus"])+" 点赞: "+zh(stat["likes"])+" 投币: "+zh(stat["coins"])+" 追番追剧: "+zh(stat["favorites"]);let score=jo.hasOwnProperty("rating")?"评分: "+jo["rating"]["score"]+" "+jo["subtitle"]:"暂无评分"+" "+jo["subtitle"];let vod={vod_id:id,vod_name:title,vod_pic:pic,type_name:typeName,vod_year:date,vod_area:areas,vod_remarks:remark,vod_actor:status,vod_director:score,vod_content:dec};let ja=jo["episodes"];let playurls1=[];let playurls2=[];ja.forEach(function(tmpJo){let eid=tmpJo["id"];let cid=tmpJo["cid"];let link=tmpJo["link"];let part=tmpJo["title"].replace("#","-")+" "+tmpJo["long_title"];playurls1.push(part+"$"+eid+"_"+cid);playurls2.push(part+"$"+link)});let playUrl=playurls1.join("#")+"$$$"+playurls2.join("#");vod["vod_play_from"]="B站$$$bilibili";vod["vod_play_url"]=playUrl;VOD=vod;',
|
||||
搜索:'',
|
||||
搜索:'js:let url1=input+"media_bangumi";let url2=input+"media_ft";let html=request(url1);let msg=JSON.parse(html).message;if(msg!=="0"){VODS=[{vod_name:KEY+"➢"+msg,vod_id:"no_data",vod_remarks:"别点,缺少bili_cookie",vod_pic:"https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"}]}else{let jo1=JSON.parse(html).data;html=request(url2);let jo2=JSON.parse(html).data;let videos=[];let vodList=[];if(jo1["numResults"]===0){vodList=jo2["result"]}else if(jo2["numResults"]===0){vodList=jo1["result"]}else{vodList=jo1["result"].concat(jo2["result"])}vodList.forEach(function(vod){let aid=(vod["season_id"]+"").trim();let title=KEY+"➢"+vod["title"].trim().replace(\'<em class="keyword">\',"").replace("</em>","");let img=vod["cover"].trim();let remark=vod["index_show"];videos.push({vod_id:aid,vod_name:title,vod_pic:img,vod_remarks:remark})});VODS=videos}',
|
||||
lazy:'',
|
||||
lazy:`js:
|
||||
if (/^http/.test(input)) {
|
||||
input = {
|
||||
jx: 1,
|
||||
url: input,
|
||||
parse: 0,
|
||||
header: JSON.stringify({
|
||||
"user-agent": "Mozilla/5.0"
|
||||
})
|
||||
}
|
||||
} else {
|
||||
let ids = input.split("_");
|
||||
let dan = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + ids[1];
|
||||
let result = {};
|
||||
let url = "https://api.bilibili.com/pgc/player/web/playurl?qn=116&ep_id=" + ids[0] + "&cid=" + ids[1];
|
||||
let html = request(url);
|
||||
let jRoot = JSON.parse(html);
|
||||
if (jRoot["message"] !== "success") {
|
||||
print("需要大会员权限才能观看");
|
||||
input = ""
|
||||
} else {
|
||||
let jo = jRoot["result"];
|
||||
let ja = jo["durl"];
|
||||
let maxSize = -1;
|
||||
let position = -1;
|
||||
ja.forEach(function(tmpJo, i) {
|
||||
if (maxSize < Number(tmpJo["size"])) {
|
||||
maxSize = Number(tmpJo["size"]);
|
||||
position = i
|
||||
}
|
||||
});
|
||||
let url = "";
|
||||
if (ja.length > 0) {
|
||||
if (position === -1) {
|
||||
position = 0
|
||||
}
|
||||
url = ja[position]["url"]
|
||||
}
|
||||
result["parse"] = 0;
|
||||
result["playUrl"] = "";
|
||||
result["url"] = url;
|
||||
result["header"] = {
|
||||
Referer: "https://www.bilibili.com",
|
||||
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
|
||||
};
|
||||
result["contentType"] = "video/x-flv";
|
||||
result["danmaku"] = dan;
|
||||
input = result
|
||||
}
|
||||
}
|
||||
`,
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"规则名": "哔嘀影视",
|
||||
"规则作者": "",
|
||||
"请求头参数": "User-Agent$电脑#Referer$https://www.yjys01.com",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://www.yjys01.com",
|
||||
"首页列表数组规则": "body",
|
||||
"首页片单列表数组规则": ".card-link",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
//首页片单标题
|
||||
"首页片单标题": "h3&&Text",
|
||||
//首页推荐片单链接
|
||||
"首页片单链接": "a&&href",
|
||||
//首页推荐片单图片,支持自定义图片链接
|
||||
"首页片单图片": "img&&data-src",
|
||||
//首页推荐片单副标题
|
||||
"首页片单副标题":".badge||.ribbon&&Text",
|
||||
//首页推荐片单链接补前缀
|
||||
"首页片单链接加前缀": "https://www.yjys01.com",
|
||||
//首页推荐片单链接补后缀
|
||||
"首页片单链接加后缀": "",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://www.yjys01.com/s/{cateId}/{catePg}?type={class}&year={year}&order={by}",
|
||||
"分类名称": "不限&动作&爱情&喜剧&科幻&恐怖&战争&武侠&魔幻&剧情&动画&惊悚&3D&灾难&悬疑&警匪&文艺&青春&冒险&犯罪&纪录&古装&奇幻&国语&综艺&历史&运动&原创压制&美剧&韩剧&国产电视剧&日剧&英剧&德剧&俄剧&巴剧&加剧&西剧&意大利剧&泰剧&港台剧&法剧&澳剧",
|
||||
"分类名称替换词": "all&dongzuo&aiqing&xiju&kehuan&kongbu&zhanzheng&wuxia&mohuan&juqing&donghua&jingsong&3D&zainan&xuanyi&jingfei&wenyi&qingchun&maoxian&fanzui&jilu&guzhuang&qihuan&guoyu&zongyi&lishi&yundong&yuanchuang&meiju&hanju&guoju&riju&yingju&deju&eju&baju&jiaju&spanish&yidaliju&taiju&gangtaiju&faju&aoju",
|
||||
//"筛选数据": {},
|
||||
"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "",
|
||||
//{class}
|
||||
"筛选类型名称": "全部&电影&电视剧",
|
||||
"筛选类型替换词": "&0&1",
|
||||
//{area}
|
||||
"筛选地区名称": "",
|
||||
"筛选地区替换词": "*",
|
||||
//{year}
|
||||
"筛选年份名称": "2023&2022&2021&2020&2019&2018&2017&2016&2015&2014&2013&2012&2011&2010&2009&2008&2007&2006&2005&2004&2003&2002&2001",
|
||||
"筛选年份替换词": "*",
|
||||
//{lang}
|
||||
"筛选语言名称": "",
|
||||
"筛选语言替换词": "*",
|
||||
//{by}
|
||||
"筛选排序名称": "更新时间&豆瓣评分",
|
||||
"筛选排序替换词": "0&1",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".row-cards&&.card",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "h3&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": "img&&data-src||src",
|
||||
"分类片单副标题": ".badge||p&&Text",
|
||||
"分类片单链接加前缀": "https://www.yjys01.com",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$手机#Referer$https://cn.bing.com/",
|
||||
"搜索链接": "https://cn.bing.com/search?q={wd}+site:https://www.yjys01.com&qs=ds&form=QBRE",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": "ol#b_results&&li.b_algo",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "",
|
||||
"搜索片单标题": "h2&&Text",
|
||||
"搜索片单链接": "a&&href",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "1",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "div.mb-2&&p,5&&Text!制片国家/地区:",
|
||||
"演员详情": "div.mb-2&&p,3&&Text!主演:",
|
||||
"简介详情": "#synopsis&&Text!剧情简介",
|
||||
"线路列表数组规则": "body&&.card:has(#download-list)||.card:has(#play-list)",
|
||||
"线路标题": "h3&&Text",
|
||||
"播放列表数组规则": "body&&#download-list||#play-list",
|
||||
"选集列表数组规则": "a:not([href^=http])",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "https://www.yjys01.com",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "1",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos#item/video#video_mp4",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
var rule = {
|
||||
title:'喵物次元',
|
||||
host:'https://www.mwcy.net/',
|
||||
url:'/catshow/fyclass/fypage.html',
|
||||
searchUrl:'/catsearch/page/fypage/wd/**.html',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
filterable:1,
|
||||
filter:'',
|
||||
filter_url:'',
|
||||
filter_def:{},
|
||||
headers:{
|
||||
'User-Agent':'MOBILE_UA',
|
||||
},
|
||||
timeout:5000,
|
||||
class_parse:'div.head-more a;a&&Text;a&&href;.*/(.*?)\.html',
|
||||
cate_exclude:'特摄剧|我的|专题|排行榜|周番剧表',
|
||||
play_parse:true,
|
||||
lazy:$js.toString(()=>{
|
||||
input = {parse:1,url:input,js:''};
|
||||
}),
|
||||
double:true,
|
||||
//推荐:'.public-list-div;a;a&&title;img&&data-src;.public-list-prb&&Text;a&&href',
|
||||
一级:'.public-list-div a;a&&title;img&&data-src;span:eq(1)&&Text;a&&href;详情',
|
||||
二级:{
|
||||
title:'h3&&Text;.style-detail span:eq(7)&&Text',
|
||||
img:'.style-detail&&img&&data-src',
|
||||
desc:'主要信息;.style-detail&&a&&Text;地区;.style-detail&&.slide-info:eq(2)&&Text;.style-detail&&a:eq(2)&&Text',
|
||||
content:'#height_limit&&Text',
|
||||
tabs:'.nav-swiper a',
|
||||
lists:'.anthology-list-play li',
|
||||
tab_text:'body&&Text',
|
||||
list_text:'body&&Text',
|
||||
list_url:'a&&href',
|
||||
list_url_prefix: '',
|
||||
},
|
||||
搜索:'.box-width:eq(1)&&.public-list-exp;.public-list-exp&&img&&alt;.public-list-exp&&img&&data-src;.public-list-exp&&span&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"规则名": "土豆网盘",
|
||||
"规则作者": "奇乐影视",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "是",
|
||||
"首页推荐链接": "https://tudou.lvdoui.top",
|
||||
"首页列表数组规则": "body&&.module-items",
|
||||
"首页片单列表数组规则": ".module-item",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://tudou.lvdoui.top/index.php/vod/show/area/{area}/by/{by}/class/{class}/id/{cateId}/lang/{lang}/letter/{letter}/year/{year}/page/{catePg}.html",
|
||||
"分类名称": "电影&国产剧&韩剧&美剧&综艺",
|
||||
"分类名称替换词": "1&2&21&22&3",
|
||||
"筛选数据": "ext",
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "*",
|
||||
"筛选类型名称": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选类型替换词": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选地区名称": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选地区替换词": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
"筛选语言名称": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选语言替换词": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".module-items&&.module-item",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": "a&&title",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".module-item-pic&&img&&data-src",
|
||||
"分类片单副标题": ".module-item-text&&Text",
|
||||
"分类片单链接加前缀": "https://tudou.lvdoui.top",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "https://tudou.lvdoui.top/index.php/vod/search.html?wd={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-search-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-src",
|
||||
"搜索片单标题": "h3&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".video-info&&a&&Text",
|
||||
"搜索片单链接加前缀": "https://tudou.lvdoui.top/",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": ".video-info-main&&.video-info-actor,1&&Text",
|
||||
"简介详情": ".sqjj_a&&Text",
|
||||
"线路列表数组规则": ".module-tab-content&&.selected",
|
||||
"线路标题": "span&&Texe",
|
||||
"播放列表数组规则": ".module-row-one",
|
||||
"选集列表数组规则": ".module-row-one",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "h4&&Text",
|
||||
"选集链接": ".btn-down&&a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "",
|
||||
"是否开启手动嗅探": "否",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"规则名": "多多阿里",
|
||||
"规则作者": " 天天开心",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "是",
|
||||
"首页推荐链接": "https://tv.yydsys.top",
|
||||
"首页列表数组规则": "body&&.module-items",
|
||||
"首页片单列表数组规则": ".module-item",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://tv.yydsys.top/index.php/vod/show/area/{area}/by/{by}/class/{class}/id/{cateId}/lang/{lang}/letter/{letter}/year/{year}/page/{catePg}.html",
|
||||
"分类名称": "多多电影&多多剧集&动漫&综艺&短剧",
|
||||
"分类名称替换词": "1&2&4&3&5",
|
||||
"筛选数据": "ext",
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "*",
|
||||
"筛选类型名称": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选类型替换词": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选地区名称": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选地区替换词": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
"筛选语言名称": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选语言替换词": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".module-items&&.module-item",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": "a&&title",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".module-item-pic&&img&&data-src",
|
||||
"分类片单副标题": ".module-item-text&&Text",
|
||||
"分类片单链接加前缀": "https://tv.yydsys.top/",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "https://tv.yydsys.top/index.php/vod/search.html?wd={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-search-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-src",
|
||||
"搜索片单标题": "h3&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".video-info&&a&&Text",
|
||||
"搜索片单链接加前缀": "https://tv.yydsys.top/",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": ".video-info-main&&.video-info-actor,1&&Text",
|
||||
"简介详情": ".sqjj_a&&Text",
|
||||
"线路列表数组规则": ".module-tab-content&&.selected",
|
||||
"线路标题": "span&&Texe",
|
||||
"播放列表数组规则": ".module-row-one",
|
||||
"选集列表数组规则": ".module-row-one",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "h4&&Text",
|
||||
"选集链接": ".btn-down&&a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "",
|
||||
"是否开启手动嗅探": "否",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
var rule = {
|
||||
模板: 'mxpro',
|
||||
title: '大米动漫[漫]',
|
||||
host: 'https://damidm.com/',
|
||||
url: 'show/fyclass--------fypage---.html',
|
||||
searchUrl: '/search/**----------fypage---.html',
|
||||
class_parse: '.navbar-items li;a&&Text;a&&href;/(\\d+).html',
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
var rule = {
|
||||
title: '大米星球[V2]', // csp_AppYsV2
|
||||
host:'https://www.dmxq.vip',
|
||||
hostJs:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src=jsp.pdfh(html,"ul&&li:eq(1)&&a&&href");print(src);HOST=src+"/api.php/app/"',
|
||||
url: 'video?tid=fyclassfyfilter&limit=20&pg=fypage',
|
||||
filter_url:'&class={{fl.class}}&area={{fl.area}}&lang={{fl.lang}}&letter={{fl.letter}}&year={{fl.year}}&by={{fl.by}}',
|
||||
filter: {
|
||||
"20":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"Netflix","v":"Netflix"},{"n":"仙侠","v":"仙侠"},{"n":"剧情","v":"剧情"},{"n":"科幻","v":"科幻"},{"n":"动作","v":"动作"},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"冒险","v":"冒险"},{"n":"儿童","v":"儿童"},{"n":"歌舞","v":"歌舞"},{"n":"音乐","v":"音乐"},{"n":"奇幻","v":"奇幻"},{"n":"动画","v":"动画"},{"n":"恐怖","v":"恐怖"},{"n":"惊悚","v":"惊悚"},{"n":"丧尸","v":"丧尸"},{"n":"战争","v":"战争"},{"n":"传记","v":"传记"},{"n":"纪录","v":"纪录"},{"n":"犯罪","v":"犯罪"},{"n":"悬疑","v":"悬疑"},{"n":"西部","v":"西部"},{"n":"灾难","v":"灾难"},{"n":"古装","v":"古装"},{"n":"武侠","v":"武侠"},{"n":"家庭","v":"家庭"},{"n":"短片","v":"短片"},{"n":"校园","v":"校园"},{"n":"文艺","v":"文艺"},{"n":"运动","v":"运动"},{"n":"青春","v":"青春"},{"n":"同性","v":"同性"},{"n":"励志","v":"励志"},{"n":"人性","v":"人性"},{"n":"美食","v":"美食"},{"n":"女性","v":"女性"},{"n":"治愈","v":"治愈"},{"n":"历史","v":"历史"},{"n":"真人秀","v":"真人秀"},{"n":"脱口秀","v":"脱口秀"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"英国","v":"英国"},{"n":"法国","v":"法国"},{"n":"德国","v":"德国"},{"n":"印度","v":"印度"},{"n":"泰国","v":"泰国"},{"n":"丹麦","v":"丹麦"},{"n":"瑞典","v":"瑞典"},{"n":"巴西","v":"巴西"},{"n":"加拿大","v":"加拿大"},{"n":"俄罗斯","v":"俄罗斯"},{"n":"意大利","v":"意大利"},{"n":"比利时","v":"比利时"},{"n":"爱尔兰","v":"爱尔兰"},{"n":"西班牙","v":"西班牙"},{"n":"澳大利亚","v":"澳大利亚"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"英语","v":"英语"},{"n":"法语","v":"法语"},{"n":"国语","v":"国语"},{"n":"粤语","v":"粤语"},{"n":"日语","v":"日语"},{"n":"韩语","v":"韩语"},{"n":"泰语","v":"泰语"},{"n":"德语","v":"德语"},{"n":"俄语","v":"俄语"},{"n":"闽南语","v":"闽南语"},{"n":"丹麦语","v":"丹麦语"},{"n":"波兰语","v":"波兰语"},{"n":"瑞典语","v":"瑞典语"},{"n":"印地语","v":"印地语"},{"n":"挪威语","v":"挪威语"},{"n":"意大利语","v":"意大利语"},{"n":"西班牙语","v":"西班牙语"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"}]}],
|
||||
"21":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"Netflix","v":"Netflix"},{"n":"剧情","v":"剧情"},{"n":"丧尸","v":"丧尸"},{"n":"仙侠","v":"仙侠"},{"n":"穿越","v":"穿越"},{"n":"惊悚","v":"惊悚"},{"n":"恐怖","v":"恐怖"},{"n":"言情","v":"言情"},{"n":"科幻","v":"科幻"},{"n":"动作","v":"动作"},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"偶像","v":"偶像"},{"n":"都市","v":"都市"},{"n":"军旅","v":"军旅"},{"n":"谍战","v":"谍战"},{"n":"罪案","v":"罪案"},{"n":"宫廷","v":"宫廷"},{"n":"冒险","v":"冒险"},{"n":"儿童","v":"儿童"},{"n":"歌舞","v":"歌舞"},{"n":"音乐","v":"音乐"},{"n":"奇幻","v":"奇幻"},{"n":"动画","v":"动画"},{"n":"战争","v":"战争"},{"n":"传记","v":"传记"},{"n":"记录","v":"记录"},{"n":"犯罪","v":"犯罪"},{"n":"悬疑","v":"悬疑"},{"n":"西部","v":"西部"},{"n":"灾难","v":"灾难"},{"n":"古装","v":"古装"},{"n":"武侠","v":"武侠"},{"n":"家庭","v":"家庭"},{"n":"短片","v":"短片"},{"n":"校园","v":"校园"},{"n":"文艺","v":"文艺"},{"n":"运动","v":"运动"},{"n":"青春","v":"青春"},{"n":"同性","v":"同性"},{"n":"励志","v":"励志"},{"n":"人性","v":"人性"},{"n":"美食","v":"美食"},{"n":"女性","v":"女性"},{"n":"治愈","v":"治愈"},{"n":"历史","v":"历史"},{"n":"真人秀","v":"真人秀"},{"n":"脱口秀","v":"脱口秀"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"英国","v":"英国"},{"n":"法国","v":"法国"},{"n":"德国","v":"德国"},{"n":"印度","v":"印度"},{"n":"泰国","v":"泰国"},{"n":"丹麦","v":"丹麦"},{"n":"瑞典","v":"瑞典"},{"n":"巴西","v":"巴西"},{"n":"加拿大","v":"加拿大"},{"n":"俄罗斯","v":"俄罗斯"},{"n":"意大利","v":"意大利"},{"n":"比利时","v":"比利时"},{"n":"爱尔兰","v":"爱尔兰"},{"n":"西班牙","v":"西班牙"},{"n":"澳大利亚","v":"澳大利亚"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"英语","v":"英语"},{"n":"法语","v":"法语"},{"n":"国语","v":"国语"},{"n":"粤语","v":"粤语"},{"n":"日语","v":"日语"},{"n":"韩语","v":"韩语"},{"n":"泰语","v":"泰语"},{"n":"德语","v":"德语"},{"n":"俄语","v":"俄语"},{"n":"闽南语","v":"闽南语"},{"n":"丹麦语","v":"丹麦语"},{"n":"波兰语","v":"波兰语"},{"n":"瑞典语","v":"瑞典语"},{"n":"印地语","v":"印地语"},{"n":"挪威语","v":"挪威语"},{"n":"意大利语","v":"意大利语"},{"n":"西班牙语","v":"西班牙语"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"}]}],
|
||||
"22":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"Netflix","v":"Netflix"},{"n":"热血","v":"热血"},{"n":"科幻","v":"科幻"},{"n":"美少女","v":"美少女"},{"n":"魔幻","v":"魔幻"},{"n":"经典","v":"经典"},{"n":"励志","v":"励志"},{"n":"少儿","v":"少儿"},{"n":"冒险","v":"冒险"},{"n":"搞笑","v":"搞笑"},{"n":"推理","v":"推理"},{"n":"恋爱","v":"恋爱"},{"n":"治愈","v":"治愈"},{"n":"幻想","v":"幻想"},{"n":"校园","v":"校园"},{"n":"动物","v":"动物"},{"n":"机战","v":"机战"},{"n":"亲子","v":"亲子"},{"n":"儿歌","v":"儿歌"},{"n":"运动","v":"运动"},{"n":"悬疑","v":"悬疑"},{"n":"怪物","v":"怪物"},{"n":"战争","v":"战争"},{"n":"益智","v":"益智"},{"n":"青春","v":"青春"},{"n":"童话","v":"童话"},{"n":"竞技","v":"竞技"},{"n":"动作","v":"动作"},{"n":"社会","v":"社会"},{"n":"友情","v":"友情"},{"n":"真人版","v":"真人版"},{"n":"电影版","v":"电影版"},{"n":"OVA版","v":"OVA版"},{"n":"TV版","v":"TV版"},{"n":"新番动画","v":"新番动画"},{"n":"完结动画","v":"完结动画"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"更早","v":"更早"}]}],
|
||||
"23":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"YouTube","v":"YouTube"},{"n":"脱口秀","v":"脱口秀"},{"n":"真人秀","v":"真人秀"},{"n":"选秀","v":"选秀"},{"n":"八卦","v":"八卦"},{"n":"访谈","v":"访谈"},{"n":"情感","v":"情感"},{"n":"生活","v":"生活"},{"n":"晚会","v":"晚会"},{"n":"搞笑","v":"搞笑"},{"n":"音乐","v":"音乐"},{"n":"时尚","v":"时尚"},{"n":"游戏","v":"游戏"},{"n":"少儿","v":"少儿"},{"n":"体育","v":"体育"},{"n":"纪实","v":"纪实"},{"n":"科教","v":"科教"},{"n":"曲艺","v":"曲艺"},{"n":"歌舞","v":"歌舞"},{"n":"财经","v":"财经"},{"n":"汽车","v":"汽车"},{"n":"播报","v":"播报"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"其它","v":"其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"}]}]
|
||||
},
|
||||
detailUrl:'/detail?vod_id=fyid',
|
||||
searchUrl: '/search?text=**&pg=fypage',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable:1,//是否启用分类筛选,
|
||||
// headers:{'User-Agent':'Dart/2.14 (dart:io)'},
|
||||
headers:{'User-Agent':'okhttp/4.1.0'},
|
||||
timeout:5000,
|
||||
// 分类筛选 /api.php/app/nav || /xgapp.php/v1/nav || /api.php/v1.vod/types
|
||||
class_name:'电影&电视剧&动漫&综艺',
|
||||
class_url:'20&21&22&23',
|
||||
play_parse:true,
|
||||
lazy:`js:
|
||||
let play_Url = '';
|
||||
if (/\\.m3u8|\\.mp4/.test(input)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: input,
|
||||
parse: 0
|
||||
}
|
||||
} else if (/,/.test(input) && /url=/.test(input)) {
|
||||
input = input.split('url=');
|
||||
play_Url = input[0].split(',')[0];
|
||||
input = {
|
||||
jx: 0,
|
||||
url: input[1],
|
||||
playUrl: play_Url,
|
||||
parse: 1
|
||||
}
|
||||
} else if (/url=|id=/.test(input)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: JSON.parse(request(input)).url,
|
||||
parse: 0
|
||||
}
|
||||
} else if (/youku|iqiyi|v\\.qq\\.com|pptv|sohu|le\\.com|1905\\.com|mgtv|bilibili|ixigua/.test(input)) {
|
||||
play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'https://jx.777jiexi.com/player/?url='; // type0的parse
|
||||
// play_Url = /bilibili/.test(input) ? 'https://jx.xmflv.com/?url=' : 'json:http://pandown.pro/app/kkdy.php?url='; // type1的parse可加'json:'直接解析url (除了蜂蜜的'影视TV',其它的壳皆可用)
|
||||
input = {
|
||||
jx: 0,
|
||||
url: input,
|
||||
playUrl: play_Url,
|
||||
parse: 1,
|
||||
header: JSON.stringify({
|
||||
'user-agent': 'Mozilla/5.0',
|
||||
}),
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
limit:6,
|
||||
// 图片来源:'@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36',
|
||||
推荐:`js:
|
||||
let d = [];
|
||||
let jsondata = [];
|
||||
let videoList = [];
|
||||
if (/v1\\.vod/.test(HOST)) {
|
||||
if(HOST.endsWith('/')){
|
||||
jsondata = JSON.parse(request(HOST + 'vodPhbAll'));
|
||||
} else {
|
||||
jsondata = JSON.parse(request(HOST + '/vodPhbAll'));
|
||||
}
|
||||
videoList = jsondata.data.list[0].vod_list;
|
||||
} else {
|
||||
if(HOST.endsWith('/')){
|
||||
jsondata = JSON.parse(request(HOST + 'index_video'));
|
||||
} else {
|
||||
jsondata = JSON.parse(request(HOST + '/index_video'));
|
||||
}
|
||||
videoList = /xgapp/.test(HOST)?jsondata.data[0].vlist:jsondata.list[0].vlist;
|
||||
}
|
||||
// log('videoList =========> '+stringify(videoList));
|
||||
videoList.forEach(it => {
|
||||
d.push({
|
||||
url:it.vod_id,
|
||||
title:it.vod_name,
|
||||
img:it.vod_pic.startsWith('https') ? it.vod_pic : it.vod_pic.startsWith('http') ? it.vod_pic.replace('http','https') : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
|
||||
desc:it.vod_remarks,
|
||||
});
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
一级:`js:
|
||||
let d = [];
|
||||
let jsondata = [];
|
||||
let videoList = [];
|
||||
if (/v1\\.vod/.test(HOST)) {
|
||||
input = input.replace('video','v1.vod').replace('tid','type').replace('pg=','page=');
|
||||
jsondata = JSON.parse(request(input));
|
||||
videoList = jsondata.data.list;
|
||||
} else {
|
||||
input = HOST + '/'+ input.split('/')[4];
|
||||
jsondata = JSON.parse(request(input));
|
||||
videoList = jsondata.list || jsondata.data;
|
||||
}
|
||||
// log('videoList =========> '+stringify(videoList));
|
||||
videoList.forEach(it => {
|
||||
d.push({
|
||||
url:it.vod_id,
|
||||
title:it.vod_name,
|
||||
img:it.vod_pic.startsWith('https') ? it.vod_pic : it.vod_pic.startsWith('http') ? it.vod_pic.replace('http','https') : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
|
||||
desc:it.vod_remarks,
|
||||
});
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
|
||||
二级:`js:
|
||||
if (/v1\\.vod/.test(HOST)) {
|
||||
input = HOST + '/'+ input.split('/')[3];
|
||||
} else {
|
||||
input = HOST + '/'+ input.split('/')[3].replace('detail','video_detail').replace('vod_id','id');
|
||||
}
|
||||
try {
|
||||
let html = request(input);
|
||||
html = JSON.parse(html);
|
||||
let node = /xgapp/.test(HOST) ? html.data.vod_info : html.data;
|
||||
VOD = {
|
||||
vod_id: node.vod_id,
|
||||
vod_name: node.vod_name,
|
||||
vod_pic: node.vod_pic,
|
||||
type_name: node.vod_class,
|
||||
vod_year: node.vod_year,
|
||||
vod_area: node.vod_area,
|
||||
vod_remarks: node.vod_remarks,
|
||||
vod_actor: node.vod_actor,
|
||||
vod_director: node.vod_director,
|
||||
vod_content: node.vod_content.strip()
|
||||
};
|
||||
if (typeof play_url === 'undefined') {
|
||||
var play_url = ''
|
||||
}
|
||||
var name = {
|
||||
'bfzym3u8': '暴风',
|
||||
'1080zyk': '优质',
|
||||
'kuaikan': '快看',
|
||||
'lzm3u8': '量子',
|
||||
'ffm3u8': '非凡',
|
||||
'haiwaikan': '海外看',
|
||||
'gsm3u8': '光速',
|
||||
'zuidam3u8': '最大',
|
||||
'bjm3u8': '八戒',
|
||||
'snm3u8': '索尼',
|
||||
'wolong': '卧龙',
|
||||
'xlm3u8': '新浪',
|
||||
'yhm3u8': '樱花',
|
||||
'tkm3u8': '天空',
|
||||
'jsm3u8': '极速',
|
||||
'wjm3u8': '无尽',
|
||||
'sdm3u8': '闪电',
|
||||
'kcm3u8': '快车',
|
||||
'jinyingm3u8': '金鹰',
|
||||
'fsm3u8': '飞速',
|
||||
'tpm3u8': '淘片',
|
||||
'lem3u8': '鱼乐',
|
||||
'dbm3u8': '百度',
|
||||
'tomm3u8': '番茄',
|
||||
'ukm3u8': 'U酷',
|
||||
'ikm3u8': '爱坤',
|
||||
'hnzym3u8': '红牛资源',
|
||||
'hnm3u8': '红牛',
|
||||
'68zy_m3u8': '68',
|
||||
'kdm3u8': '酷点',
|
||||
'bdxm3u8': '北斗星',
|
||||
'qhm3u8': '奇虎',
|
||||
'hhm3u8': '豪华',
|
||||
'kbm3u8': '快播'
|
||||
};
|
||||
let episodes = /v1\\.vod/.test(HOST)?node.vod_play_list:node.vod_url_with_player;
|
||||
if (episodes != '') {
|
||||
let playMap = {};
|
||||
let arr = [];
|
||||
episodes.forEach(ep => {
|
||||
let from = [];
|
||||
if (/v1\\.vod/.test(HOST)) {
|
||||
from = ep.player_info.from||ep.player_info.show||ep.from||ep.show;
|
||||
} else {
|
||||
from = ep.code||ep.name;
|
||||
}
|
||||
if (!playMap.hasOwnProperty(from)) {
|
||||
playMap[from] = []
|
||||
}
|
||||
let parse_api = '';
|
||||
if (/v1\\.vod/.test(HOST)) {
|
||||
parse_api = ep.player_info.parse != null ? ep.player_info.parse : ep.player_info.parse2;
|
||||
// parse_api = /,/.test(parse_api) ? parse_api.split(',')[1] : parse_api;
|
||||
} else {
|
||||
parse_api = ep.parse_api;
|
||||
}
|
||||
log('parse_api =========> '+parse_api);
|
||||
if (parse_api != null && !/\\.m3u8|\\.mp4/.test(ep.url)) {
|
||||
parse_api = parse_api.replaceAll('..','.') ;
|
||||
ep.url = ep.url.replaceAll('$','$'+parse_api);
|
||||
}
|
||||
if (from != null) playMap[from].push(ep.url)
|
||||
});
|
||||
for (var key in playMap) {
|
||||
if ('bfzym3u8' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 1
|
||||
})
|
||||
} else if ('1080zyk' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 2
|
||||
})
|
||||
} else if ('kuaikan' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 3
|
||||
})
|
||||
} else if ('lzm3u8' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 4
|
||||
})
|
||||
} else if ('ffm3u8' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 5
|
||||
})
|
||||
} else if ('snm3u8' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 6
|
||||
})
|
||||
} else if ('qhm3u8' == key) {
|
||||
arr.push({
|
||||
flag: name[key],
|
||||
url: playMap[key],
|
||||
sort: 7
|
||||
})
|
||||
} else {
|
||||
arr.push({
|
||||
flag: name[key] ? name[key] : key,
|
||||
url: playMap[key],
|
||||
sort: 8
|
||||
})
|
||||
}
|
||||
}
|
||||
arr.sort((a, b) => a.sort - b.sort);
|
||||
let playFrom = [];
|
||||
let playList = [];
|
||||
arr.map(val => {
|
||||
if (!/undefined/.test(val.flag)) {
|
||||
playFrom.push(val.flag);
|
||||
playList.push(val.url);
|
||||
}
|
||||
})
|
||||
VOD.vod_play_from = playFrom.join('$$$');
|
||||
VOD.vod_play_url = playList.join('$$$');
|
||||
} else {
|
||||
VOD.vod_play_from = node.vod_play_from;
|
||||
VOD.vod_play_url = node.vod_play_url;
|
||||
}
|
||||
} catch (e) {
|
||||
log("获取二级详情页发生错误:" + e.message);
|
||||
}
|
||||
`,
|
||||
搜索:`js:
|
||||
let d = [];
|
||||
let jsondata = [];
|
||||
let videoList = [];
|
||||
if (/v1\\.vod/.test(HOST)) {
|
||||
input = (HOST + '/'+ input.split('/')[3]).replace('/search','').replace('text=','wd=').replace('pg=','page=');
|
||||
jsondata = JSON.parse(request(input));
|
||||
videoList = jsondata.data.list;
|
||||
} else {
|
||||
input = HOST + '/'+ input.split('/')[3]
|
||||
jsondata = JSON.parse(request(input));
|
||||
videoList = jsondata.list || jsondata.data;
|
||||
}
|
||||
// log('videoList =========> '+stringify(videoList));
|
||||
videoList.forEach(it => {
|
||||
d.push({
|
||||
url:it.vod_id,
|
||||
title:it.vod_name,
|
||||
img:it.vod_pic.startsWith('https') ? it.vod_pic : it.vod_pic.startsWith('http') ? it.vod_pic.replace('http','https') : it.vod_pic.startsWith('//') ? 'https:' + it.vod_pic : it.vod_pic.startsWith('/') ? getHome(HOST) + it.vod_pic : getHome(HOST) + '/' + it.vod_pic,
|
||||
desc:it.vod_remarks,
|
||||
});
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"规则名": "天天开心",
|
||||
"规则作者": " 天天开心",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "是",
|
||||
"首页推荐链接": "http://ttkx.live:7728",
|
||||
"首页列表数组规则": "body&&.module-items",
|
||||
"首页片单列表数组规则": ".module-item",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "http://ttkx.live:7728/index.php/vodshow/{cateId}-{area}-{by}-{class}-{lang}----{catePg}---{year}.html",
|
||||
"分类名称": "电影&剧集&动漫&综艺&短剧&音乐",
|
||||
"分类名称替换词": "1&2&3&4&5&6",
|
||||
"筛选数据": "ext",
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "*",
|
||||
"筛选类型名称": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选类型替换词": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选地区名称": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选地区替换词": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
"筛选语言名称": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选语言替换词": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".module-items&&.module-item",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": "a&&title",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".module-item-pic&&img&&data-src",
|
||||
"分类片单副标题": ".module-item-text&&Text",
|
||||
"分类片单链接加前缀": "http://ttkx.live:7728",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "http://ttkx.live:7728/index.php/vodsearch/{wd}----------{SearchPg}---.html",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-search-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-src",
|
||||
"搜索片单标题": "h3&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".video-info&&a&&Text",
|
||||
"搜索片单链接加前缀": "http://ttkx.live:7728/",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": ".video-info-main&&.video-info-actor,1&&Text",
|
||||
"简介详情": ".sqjj_a&&Text",
|
||||
"线路列表数组规则": ".module-tab-content&&.selected",
|
||||
"线路标题": "span&&Texe",
|
||||
"播放列表数组规则": ".module-row-one",
|
||||
"选集列表数组规则": ".module-row-one",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "h4&&Text",
|
||||
"选集链接": ".btn-down&&a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "",
|
||||
"是否开启手动嗅探": "否",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
var rule={
|
||||
title:'奇米动漫',
|
||||
host:'http://www.qimiqimi.net',
|
||||
url:'/show/fyclassfyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'{{fl.area}}{{fl.by}}{{fl.class}}{{fl.letter}}/page/fypage{{fl.year}}',
|
||||
filter: {
|
||||
"xinfan":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"冒险","v":"/class/冒险"},{"n":"热血","v":"/class/热血"},{"n":"奇幻","v":"/class/奇幻"},{"n":"恋爱","v":"/class/恋爱"},{"n":"校园","v":"/class/校园"},{"n":"后宫","v":"/class/后宫"},{"n":"搞笑","v":"/class/搞笑"},{"n":"治愈","v":"/class/治愈"},{"n":"神魔","v":"/class/神魔"},{"n":"魔法","v":"/class/魔法"},{"n":"百合","v":"/class/百合"},{"n":"推理","v":"/class/推理"},{"n":"科幻","v":"/class/科幻"},{"n":"竞技","v":"/class/竞技"},{"n":"悬疑","v":"/class/悬疑"},{"n":"青春","v":"/class/青春"},{"n":"战争","v":"/class/战争"},{"n":"萝莉","v":"/class/萝莉"},{"n":"魔幻","v":"/class/魔幻"},{"n":"战斗","v":"/class/战斗"},{"n":"日常","v":"/class/日常"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"/area/日本/"},{"n":"大陆","v":"/area/中国/"},{"n":"欧美","v":"/area/欧美/"},{"n":"韩国","v":"/area/韩国/"},{"n":"港台","v":"/area/港台/"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"letter","name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"riman":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"冒险","v":"/class/冒险"},{"n":"热血","v":"/class/热血"},{"n":"奇幻","v":"/class/奇幻"},{"n":"恋爱","v":"/class/恋爱"},{"n":"校园","v":"/class/校园"},{"n":"后宫","v":"/class/后宫"},{"n":"搞笑","v":"/class/搞笑"},{"n":"治愈","v":"/class/治愈"},{"n":"神魔","v":"/class/神魔"},{"n":"魔法","v":"/class/魔法"},{"n":"百合","v":"/class/百合"},{"n":"推理","v":"/class/推理"},{"n":"科幻","v":"/class/科幻"},{"n":"竞技","v":"/class/竞技"},{"n":"悬疑","v":"/class/悬疑"},{"n":"青春","v":"/class/青春"},{"n":"战争","v":"/class/战争"},{"n":"萝莉","v":"/class/萝莉"},{"n":"魔幻","v":"/class/魔幻"},{"n":"战斗","v":"/class/战斗"},{"n":"日常","v":"/class/日常"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"/area/日本/"},{"n":"大陆","v":"/area/中国/"},{"n":"欧美","v":"/area/欧美/"},{"n":"韩国","v":"/area/韩国/"},{"n":"港台","v":"/area/港台/"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"letter","name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"guoman":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"冒险","v":"/class/冒险"},{"n":"热血","v":"/class/热血"},{"n":"奇幻","v":"/class/奇幻"},{"n":"恋爱","v":"/class/恋爱"},{"n":"校园","v":"/class/校园"},{"n":"后宫","v":"/class/后宫"},{"n":"搞笑","v":"/class/搞笑"},{"n":"治愈","v":"/class/治愈"},{"n":"神魔","v":"/class/神魔"},{"n":"魔法","v":"/class/魔法"},{"n":"百合","v":"/class/百合"},{"n":"推理","v":"/class/推理"},{"n":"科幻","v":"/class/科幻"},{"n":"竞技","v":"/class/竞技"},{"n":"悬疑","v":"/class/悬疑"},{"n":"青春","v":"/class/青春"},{"n":"战争","v":"/class/战争"},{"n":"萝莉","v":"/class/萝莉"},{"n":"魔幻","v":"/class/魔幻"},{"n":"战斗","v":"/class/战斗"},{"n":"日常","v":"/class/日常"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"/area/日本/"},{"n":"大陆","v":"/area/中国/"},{"n":"欧美","v":"/area/欧美/"},{"n":"韩国","v":"/area/韩国/"},{"n":"港台","v":"/area/港台/"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"letter","name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"jcdm":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"冒险","v":"/class/冒险"},{"n":"热血","v":"/class/热血"},{"n":"奇幻","v":"/class/奇幻"},{"n":"恋爱","v":"/class/恋爱"},{"n":"校园","v":"/class/校园"},{"n":"后宫","v":"/class/后宫"},{"n":"搞笑","v":"/class/搞笑"},{"n":"治愈","v":"/class/治愈"},{"n":"神魔","v":"/class/神魔"},{"n":"魔法","v":"/class/魔法"},{"n":"百合","v":"/class/百合"},{"n":"推理","v":"/class/推理"},{"n":"科幻","v":"/class/科幻"},{"n":"竞技","v":"/class/竞技"},{"n":"悬疑","v":"/class/悬疑"},{"n":"青春","v":"/class/青春"},{"n":"战争","v":"/class/战争"},{"n":"萝莉","v":"/class/萝莉"},{"n":"魔幻","v":"/class/魔幻"},{"n":"战斗","v":"/class/战斗"},{"n":"日常","v":"/class/日常"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"/area/日本/"},{"n":"大陆","v":"/area/中国/"},{"n":"欧美","v":"/area/欧美/"},{"n":"韩国","v":"/area/韩国/"},{"n":"港台","v":"/area/港台/"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"letter","name":"字母","value":[{"n":"字母","v":""},{"n":"A","v":"/letter/A"},{"n":"B","v":"/letter/B"},{"n":"C","v":"/letter/C"},{"n":"D","v":"/letter/D"},{"n":"E","v":"/letter/E"},{"n":"F","v":"/letter/F"},{"n":"G","v":"/letter/G"},{"n":"H","v":"/letter/H"},{"n":"I","v":"/letter/I"},{"n":"J","v":"/letter/J"},{"n":"K","v":"/letter/K"},{"n":"L","v":"/letter/L"},{"n":"M","v":"/letter/M"},{"n":"N","v":"/letter/N"},{"n":"O","v":"/letter/O"},{"n":"P","v":"/letter/P"},{"n":"Q","v":"/letter/Q"},{"n":"R","v":"/letter/R"},{"n":"S","v":"/letter/S"},{"n":"T","v":"/letter/T"},{"n":"U","v":"/letter/U"},{"n":"V","v":"/letter/V"},{"n":"W","v":"/letter/W"},{"n":"X","v":"/letter/X"},{"n":"Y","v":"/letter/Y"},{"n":"Z","v":"/letter/Z"},{"n":"0-9","v":"/letter/0-9"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
|
||||
},
|
||||
searchable:2,//是否启用全局搜索,
|
||||
headers:{//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'PC_UA',
|
||||
},
|
||||
class_parse: '#nav li;a&&Text;a&&href;.*/(\\w+).html',
|
||||
cate_exclude:'番组专题|最近更新',
|
||||
play_parse: true,
|
||||
lazy:`js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
limit:6,
|
||||
推荐:'*;*;*;.text&&Text;*',
|
||||
一级:'.img-list li;a&&title;img&&src;i&&Text;a&&href',
|
||||
二级:{
|
||||
"title":"h1&&Text;dl.fn-left:eq(3)&&Text",
|
||||
"img":".detail-pic&&img&&src",
|
||||
"desc":"dl.fn-left:eq(2)&&Text;;;.nyzhuy--dt&&Text;.fn-right:eq(0)--dt&&Text",
|
||||
"content":".tjuqing&&Text",
|
||||
"tabs":".down-title h2",
|
||||
"lists":".video_list:eq(#id) a"
|
||||
},
|
||||
searchUrl:'/index.php/ajax/suggest?mid=1&wd=**&limit=50',
|
||||
detailUrl:'/detail/fyid.html', //非必填,二级详情拼接链接
|
||||
搜索:'json:list;name;pic;;id',
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"规则名": "奇趣影视",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "手机",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "0",
|
||||
"首页推荐链接": "https://www.qqutv.com",
|
||||
"首页列表数组规则": "body&&.stui-vodlist:has(h3)",
|
||||
"首页片单列表数组规则": "li",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://www.qqutv.com/qqys/{cateId}/area/{area}/page/{catePg}/year/{year}.html",
|
||||
"分类名称": "电影&电视剧&动漫&综艺&纪录片",
|
||||
"分类名称替换词": "dianying&dianshiju&dongmna&zongyi&jilupian",
|
||||
//"筛选数据": {},
|
||||
"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "动作片&科幻片&战争片&恐怖片&喜剧片&爱情片&剧情片||国产剧&港台剧&日韩剧&海外剧",
|
||||
"筛选子分类替换词": "dzp&khp&zzp&kbp&xjp&aqp&jqp||gcj>j&rhj&hwj",
|
||||
//{class}
|
||||
"筛选类型名称": "",
|
||||
"筛选类型替换词": "*",
|
||||
//{area}
|
||||
"筛选地区名称": "大陆&香港&台湾&新加坡&日本&韩国&泰国&越南&印度&伊朗&俄罗斯&美国&法国&英国&德国&意大利&西班牙&加拿大&澳大利亚&巴西",
|
||||
"筛选地区替换词": "*",
|
||||
//{year}
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
//{lang}
|
||||
"筛选语言名称": "",
|
||||
"筛选语言替换词": "*",
|
||||
//{by}
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".stui-vodlist&&li",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "h3&&a&&Text",
|
||||
"分类片单链接": "h3&&a&&href",
|
||||
"分类片单图片": ".lazyload&&data-original",
|
||||
"分类片单副标题": ".pic-text&&Text",
|
||||
"分类片单链接加前缀": "",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$手机",
|
||||
"搜索链接": "https://www.qqutv.com/so{wd}/page/1.html",
|
||||
"POST请求数据": "searchword={wd}",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".stui-vodlist__media&&li",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": ".lazyload&&data-original",
|
||||
"搜索片单标题": "h3&&a&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".pic-text&&Text",
|
||||
"搜索片单链接加前缀": "",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "0",
|
||||
"类型详情": "类型:</span>&&</a>",
|
||||
"年代详情": "年份:</span>&&</a>",
|
||||
"地区详情": "地区:</span>&&</a>",
|
||||
"演员详情": "主演:</span>&&</p>",
|
||||
"简介详情": "detail-sketch\">&&</",
|
||||
"线路列表数组规则": ".nav-tabs&&li",
|
||||
"线路标题": "Text",
|
||||
"播放列表数组规则": "body&&.stui-content__playlist",
|
||||
"选集列表数组规则": "li",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "2",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"主页url": "https://m.haokongbu.top/",
|
||||
"分类url": "https://m.haokongbu.top/{cateId}/index_{catePg}.html[https://m.haokongbu.top/{cateId}/index.html]",
|
||||
"分类": "国产剧$guochanju#港剧$gangju#动作片$dongzuopian#喜剧片$xijupian#爱情片$aiqingpian#科幻片$kehuanpian#恐怖片$kongbupian#战争片$zhanzhengpian#剧情片$juqingpian#微电影$weidianying#记录片$m_jlp#高清$gaoqing#动漫$donghuapian#台湾$taiwanju#日本$riju#韩国$hanju#欧美$oumeiju#泰国$taiguoju#海外$haiwaiju",
|
||||
"副标题": "class=\"typeset\"&&</i>",
|
||||
"起始页": 2,
|
||||
"倒序": 1,
|
||||
"播放数组": "下载地址</h2>&&</ul>[不包含:网盘]",
|
||||
"播放列表": "<ul>&&</div>[包含:magnet]"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
var rule={
|
||||
title:'妮可动漫',
|
||||
host:'http://www.nicotv.xyz',
|
||||
url:'/video/fyclass/fyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'{{fl.class}}-{{fl.area}}-{{fl.year}}----{{fl.by}}-fypage',
|
||||
filter: {"type3":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"热血","v":"热血"},{"n":"恋爱","v":"恋爱"},{"n":"科幻","v":"科幻"},{"n":"奇幻","v":"奇幻"},{"n":"百合","v":"百合"},{"n":"后宫","v":"后宫"},{"n":"励志","v":"励志"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"校园","v":"校园"},{"n":"战斗","v":"战斗"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"萝莉","v":"萝莉"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"日本"},{"n":"大陆","v":"大陆"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2010-2000","v":"20002010"},{"n":"90年代","v":"19901999"},{"n":"更早","v":"18001989"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"addtime"},{"n":"热播","v":"hits"},{"n":"评分","v":"gold"}]}]},
|
||||
filter_def:{
|
||||
type3:{by:'addtime'}
|
||||
},
|
||||
searchUrl:'/vod-search-wd-**-p-fypage.html',
|
||||
searchable:2,//是否启用全局搜索,
|
||||
headers:{//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
class_name:'全部',
|
||||
class_url:'type3',
|
||||
play_parse: true,
|
||||
lazy:'js:let src=jsp.pd(request(input),"#cms_player&&script&&src");let cms_player=JSON.parse(request(src).match(/cms_player = (.*?);document/)[1]);/360lifan/.test(cms_player.name)?input={jx:0,url:cms_player.url+"&time="+cms_player.time+"&auth_key="+cms_player.auth_key,parse:1,header:JSON.stringify({"user-agent":"Mozilla/5.0"})}:/url=/.test(cms_player.url)?input=cms_player.url.split("url=")[1]:input={jx:0,url:cms_player.jiexi+cms_player.url+"&time="+cms_player.time+"&auth_key="+cms_player.auth_key,parse:1,header:JSON.stringify({"user-agent":"Mozilla/5.0"})}',
|
||||
limit:6,
|
||||
推荐:'*',
|
||||
一级:'.list-unstyled li;h2&&Text;img&&data-original;.continu&&Text;a&&href',
|
||||
二级:{
|
||||
"title":".media-body a&&Text;.ff-text-right:eq(2)&&Text",
|
||||
"img":".media-left&&img&&data-original",
|
||||
"desc":".ff-score&&Text;.ff-text-right:eq(4)&&Text;.ff-text-right:eq(3)&&Text;.ff-text-right:eq(0)&&Text;.ff-text-right:eq(1)&&Text",
|
||||
"content":".vod-content&&Text",
|
||||
"tabs":".nav.nav-tabs li",
|
||||
"lists":".tab-pane:eq(#id) li"
|
||||
},
|
||||
搜索:'*',
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"规则名": "子子影视",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"是否开启获取首页数据":"1",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://www.ziziys.com",
|
||||
"首页列表数组规则": "body&&.module-items:has(.module-item-pic)",
|
||||
"首页片单列表数组规则": ".module-item",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://www.ziziys.com/list/{cateId}-{catePg}.html",
|
||||
"分类名称": "电影&电视剧&动漫",
|
||||
"分类名称替换词": "1&2&3",
|
||||
//"筛选数据": {},
|
||||
"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "动漫片&恐怖片&历史传记片&战争片&情色片&武侠古装&记录片&灾难片&音乐歌舞&运动片&科幻片&动作片&剧情片&喜剧&爱情片&惊悚片&奇幻片&悬疑片||国产剧&美剧&日韩剧&泰剧||国漫&日漫&欧美动漫",
|
||||
"筛选子分类替换词": "23&24&25&26&27&28&29&30&31&32&33&6&7&8&9&10&11&12||13&14&15&16||20&21&22",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": "body&&.module-item:has(.module-item-text)",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": ".module-item-title&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".lazyloaded&&data-src",
|
||||
"分类片单副标题": ".module-item-text&&Text",
|
||||
"分类片单链接加前缀": "https://www.ziziys.com",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "https://www.ziziys.com/vsearch/--.html?wd={wd}",
|
||||
"POST请求数据": "wd={wd}&search=",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-search-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-src",
|
||||
"搜索片单标题": "h3&&a&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".video-info-header&&Text",
|
||||
"搜索片单链接加前缀": "https://www.ziziys.com",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "https://live.52sf.ga/huya/",
|
||||
"直接播放链接加后缀": "#isVideo=true#",
|
||||
"直接播放直链视频请求头": "authority$ku.peizq.online#Referer$https://play.peizq.online",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": "..video-info-main&&.video-info-items,2&&Text",
|
||||
"地区详情": "",
|
||||
"演员详情": ".video-info-main&&.video-info-items,1&&Text",
|
||||
"简介详情": ".video-info-main&&.video-info-items,-1&&Text",
|
||||
"线路列表数组规则": ".module-player-tab&&.module-tab-item",
|
||||
"线路标题": "Text",
|
||||
"播放列表数组规则": "body&&.module-player-list",
|
||||
"选集列表数组规则": ".module-tab-content&&a",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "https://www.ziziys.com",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "是",
|
||||
"是否开启手动嗅探": "否",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"主页url": "https://www.xbw20.com/",
|
||||
"编码": "gb2312",
|
||||
"图片": "data-src=\"&&\"",
|
||||
"标题": "alt=\"&&\"",
|
||||
"副标题": "class=\"time\">&&</label",
|
||||
"分类url": "https://www.xbw20.com/search.asp?page={catePg}&searchword={area}&searchtype=2[https://www.xbw20.com/vod/{cateId}.html]",
|
||||
"分类": "电影$newmovie#电视剧$newTV#4K专区$new4K#动画片$newcartoon",
|
||||
"起始页": 2,
|
||||
"倒序": 1,
|
||||
"播放数组": "迅雷下载</div>&&</div>",
|
||||
"播放列表": "<a&&</a >"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"主页url": "https://www.bugutv.org/",
|
||||
"搜索url": "https://www.bugutv.org/page/{pg}?cat&s={wd}",
|
||||
"简介": "◎简*介</p>&&</p>",
|
||||
"导演": "◎导*演&&<br>",
|
||||
"主演": "◎主*演&&<br>",
|
||||
"影片年代": "◎上映 日期&&<br>",
|
||||
"影片地区": "◎产*地&&<br>",
|
||||
"线路数组": "entry-content u-text-format u-clearfix&&\"content-template",
|
||||
"线路标题": "磁力",
|
||||
"播放数组": "entry-content u-text-format u-clearfix&&\"content-template",
|
||||
"播放列表": "<p>&&</p>[包含:magnet]",
|
||||
"播放链接": "*\">&&</a>",
|
||||
"分类": "4K蓝光原盘$4kuhd#4K电影$4kmovie#4K剧集$4ktv#杜比视界$dolbyvision#4K纪录片$4kdocu#4K演示片$4kdemo/4ktv-4ktv#杜比演示片$4kdemo/dolbydomo#DTS演示片$4kdemo/dtsdomo#8K演示片$4kdemo/8kdemo#蓝光电影$bluraymovie/bluray-movie#蓝光剧集$bluraymovie/bluraytv#3D蓝光$bluraymovie/3dmovie#蓝光纪录片$bluraymovie/documentary#蓝光演唱会$bluraymovie/audiotest",
|
||||
"分类url": "https://www.bugutv.org/{cateId}/page/{catePg}"
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
var rule={
|
||||
title:'异世界动漫',
|
||||
host:'https://www.dmmiku.com/',
|
||||
homeUrl:'/index.php/vod/show/id/22.html',
|
||||
// url:'/index.php/vod/show/class/fyclass/id/20/page/fypage.html',
|
||||
url:'/index.php/vod/show/fyclassfyfilter.html',
|
||||
filterable:1,
|
||||
filter_url:'{{fl.type}}/id/20/page/fypage{{fl.year}}',
|
||||
filter: {
|
||||
"area/日本":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"OVA","v":"/class/OVA"},{"n":"剧场版","v":"/class/剧场版"},{"n":"无修","v":"/class/BD无修"},{"n":"萝莉","v":"/class/萝莉"},{"n":"学園","v":"/class/学園"},{"n":"后宫","v":"/class/后宫"},{"n":"恋爱","v":"/class/恋爱"},{"n":"热血","v":"/class/热血"},{"n":"神魔","v":"/class/神魔"},{"n":"奇幻","v":"/class/奇幻"},{"n":"治愈","v":"/class/治愈"},{"n":"搞笑","v":"/class/搞笑"},{"n":"百合","v":"/class/百合"},{"n":"冒险","v":"/class/冒险"},{"n":"魔法","v":"/class/魔法"},{"n":"机战","v":"/class/机战"},{"n":"战争","v":"/class/战争"},{"n":"犯罪","v":"/class/犯罪"},{"n":"悬疑","v":"/class/悬疑"},{"n":"推理","v":"/class/推理"},{"n":"科幻","v":"/class/科幻"},{"n":"竞技","v":"/class/竞技"},{"n":"运动","v":"/class/运动"},{"n":"耽美","v":"/class/耽美"},{"n":"其他","v":"/class/其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"}]}],
|
||||
"area/中國":[{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"}]}]
|
||||
},
|
||||
searchUrl:'/index.php/vod/search/page/fypage/wd/**.html',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
headers:{
|
||||
'User-Agent':'MOBILE_UA'
|
||||
},
|
||||
timeout:5000,//网站的全局请求超时,默认是3000毫秒
|
||||
class_name:'日漫&国漫',
|
||||
class_url:'area/日本&area/中國',
|
||||
play_parse:true,
|
||||
lazy:`js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
var from = html.from;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/m3u8|mp4/.test(url)) {
|
||||
input = url
|
||||
} else {
|
||||
var MacPlayerConfig={};
|
||||
eval(fetch(HOST + "/static/js/playerconfig.js").replace('var Mac','Mac'));
|
||||
var jx = MacPlayerConfig.player_list[from].parse;
|
||||
if (jx == '') {
|
||||
jx = MacPlayerConfig.parse
|
||||
};
|
||||
if (jx.startsWith("/")) {
|
||||
jx = "https:" + jx;
|
||||
}
|
||||
input={
|
||||
jx:0,
|
||||
url:jx+url,
|
||||
parse:1,
|
||||
header: JSON.stringify({
|
||||
'referer': HOST
|
||||
})
|
||||
}
|
||||
}
|
||||
`,
|
||||
limit:6,
|
||||
// 图片来源:'@Referer=https://api.douban.com/@User-Agent=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/113.0.0.0%20Safari/537.36',
|
||||
推荐:'*',
|
||||
一级:'.vodlist_wi&&li;.lazyload&&title;.lazyload&&data-original;.pic_text&&Text;a&&href',
|
||||
二级:{
|
||||
"title": "h2&&Text;li.data--span:eq(0)&&Text",
|
||||
"img": ".lazyload&&data-original",
|
||||
"desc": "li.data--span:eq(1)&&Text;;;li.data--span:eq(2)&&Text;li.data--span:eq(3)&&Text",
|
||||
"content": ".full_text&&span&&Text",
|
||||
"tabs": `js:
|
||||
TABS = [];
|
||||
let tabs = pdfa(html, '#NumTab&&a');
|
||||
tabs.forEach((it) => {
|
||||
TABS.push(pdfh(it, 'a&&alt'))
|
||||
});
|
||||
`,
|
||||
// "lists": ".content_playlist:not(.list_scroll):eq(#id) a"
|
||||
"lists": "div.playlist_full:eq(#id) li"
|
||||
},
|
||||
搜索:'li.searchlist_item;*;*;*;*',
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"规则名": "影搜",
|
||||
"搜索请求头参数": "User-Agent$PC_UA#Referer$https://yingso.fun/",
|
||||
"搜索链接": "https://ys.api.yingso.fun/v3/ali/search;post",
|
||||
"POST请求数据": "{\"pageSize\":30,\"pageNum\":1,\"title\":\"{wd}\",\"root\":1,\"cat\":\"all\"}",
|
||||
"搜索截取模式": "0",
|
||||
"搜索列表数组规则": "data",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "https://vip.123pan.cn/1823165373/cally/jpg/ali.jpeg",
|
||||
"搜索片单标题": "title",
|
||||
"搜索片单链接": "key",
|
||||
"搜索片单链接加前缀": "https://www.aliyundrive.com/s/"
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
// 发布页 https://acgfans.org/pub.html
|
||||
var rule={
|
||||
title:'怡萱动漫',
|
||||
// host:'https://www.yxdmlove.com',
|
||||
host:'https://acgfans.org/pub.html',
|
||||
hostJs:'print(HOST);let html=request(HOST,{headers:{"User-Agent":PC_UA}});let src = jsp.pdfh(html,"p:eq(0)&&a&&Text");print(src);HOST=src',//网页域名根动态抓取js代码。通过HOST=赋值
|
||||
// url:'/category.html?channel=17&zhonglei=fyclass&orderby=pubdate&totalresult=2999&pageno=fypage',
|
||||
url:'/category.html?channel=17&zhonglei=fyclassfyfilter&pageno=fypage',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'&{{fl.by or "orderby=pubdate"}}&{{fl.year}}&{{fl.area}}&{{fl.sta}}&{{fl.class}}',
|
||||
filter: {
|
||||
"TV":[{"key":"sta","name":"进度","value":[{"n":"全部","v":""},{"n":"连载中","v":"status=连载中"},{"n":"已完结","v":"status=已完结"},{"n":"未播放","v":"status=未播放"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"area=日本"},{"n":"中国","v":"area=中国"},{"n":"欧美","v":"area=欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"year=2024"},{"n":"2023","v":"year=2023"},{"n":"2022","v":"year=2022"},{"n":"2021","v":"year=2021"},{"n":"2020","v":"year=2020"},{"n":"2019","v":"year=2019"},{"n":"2018","v":"year=2018"},{"n":"2017","v":"year=2017"},{"n":"2016","v":"year=2016"},{"n":"2015","v":"year=2015"},{"n":"2014","v":"year=2014"},{"n":"2013","v":"year=2013"},{"n":"2012","v":"year=2012"},{"n":"2011","v":"year=2011"},{"n":"2010","v":"year=2010"},{"n":"更早","v":"year=2010前"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"jqlx=冒险"},{"n":"热血","v":"jqlx=热血"},{"n":"爱情","v":"jqlx=爱情"},{"n":"搞笑","v":"jqlx=搞笑"},{"n":"后宫","v":"jqlx=后宫"},{"n":"校园","v":"jqlx=校园"},{"n":"机战","v":"jqlx=机战"},{"n":"幻想","v":"jqlx=幻想"},{"n":"科幻","v":"jqlx=科幻"},{"n":"竞技","v":"jqlx=竞技"},{"n":"百合","v":"jqlx=百合"},{"n":"耽美","v":"jqlx=耽美"},{"n":"悬疑","v":"jqlx=悬疑"},{"n":"剧情","v":"jqlx=剧情"},{"n":"战争","v":"jqlx=战争"},{"n":"恐怖","v":"jqlx=恐怖"},{"n":"运动","v":"jqlx=运动"},{"n":"动作","v":"jqlx=动作"},{"n":"童话","v":"jqlx=童话"},{"n":"历史","v":"jqlx=历史"},{"n":"真人","v":"jqlx=真人"},{"n":"女性向","v":"jqlx=女性向"},{"n":"泡面番","v":"jqlx=泡面番"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"orderby=pubdate"},{"n":"热度","v":"orderby=click"}]}],
|
||||
"剧场版":[{"key":"sta","name":"进度","value":[{"n":"全部","v":""},{"n":"连载中","v":"status=连载中"},{"n":"已完结","v":"status=已完结"},{"n":"未播放","v":"status=未播放"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"area=日本"},{"n":"中国","v":"area=中国"},{"n":"欧美","v":"area=欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"year=2024"},{"n":"2023","v":"year=2023"},{"n":"2022","v":"year=2022"},{"n":"2021","v":"year=2021"},{"n":"2020","v":"year=2020"},{"n":"2019","v":"year=2019"},{"n":"2018","v":"year=2018"},{"n":"2017","v":"year=2017"},{"n":"2016","v":"year=2016"},{"n":"2015","v":"year=2015"},{"n":"2014","v":"year=2014"},{"n":"2013","v":"year=2013"},{"n":"2012","v":"year=2012"},{"n":"2011","v":"year=2011"},{"n":"2010","v":"year=2010"},{"n":"更早","v":"year=2010前"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"jqlx=冒险"},{"n":"热血","v":"jqlx=热血"},{"n":"爱情","v":"jqlx=爱情"},{"n":"搞笑","v":"jqlx=搞笑"},{"n":"后宫","v":"jqlx=后宫"},{"n":"校园","v":"jqlx=校园"},{"n":"机战","v":"jqlx=机战"},{"n":"幻想","v":"jqlx=幻想"},{"n":"科幻","v":"jqlx=科幻"},{"n":"竞技","v":"jqlx=竞技"},{"n":"百合","v":"jqlx=百合"},{"n":"耽美","v":"jqlx=耽美"},{"n":"悬疑","v":"jqlx=悬疑"},{"n":"剧情","v":"jqlx=剧情"},{"n":"战争","v":"jqlx=战争"},{"n":"恐怖","v":"jqlx=恐怖"},{"n":"运动","v":"jqlx=运动"},{"n":"动作","v":"jqlx=动作"},{"n":"童话","v":"jqlx=童话"},{"n":"历史","v":"jqlx=历史"},{"n":"真人","v":"jqlx=真人"},{"n":"女性向","v":"jqlx=女性向"},{"n":"泡面番","v":"jqlx=泡面番"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"orderby=pubdate"},{"n":"热度","v":"orderby=click"}]}],
|
||||
"OVA":[{"key":"sta","name":"进度","value":[{"n":"全部","v":""},{"n":"连载中","v":"status=连载中"},{"n":"已完结","v":"status=已完结"},{"n":"未播放","v":"status=未播放"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"area=日本"},{"n":"中国","v":"area=中国"},{"n":"欧美","v":"area=欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"year=2024"},{"n":"2023","v":"year=2023"},{"n":"2022","v":"year=2022"},{"n":"2021","v":"year=2021"},{"n":"2020","v":"year=2020"},{"n":"2019","v":"year=2019"},{"n":"2018","v":"year=2018"},{"n":"2017","v":"year=2017"},{"n":"2016","v":"year=2016"},{"n":"2015","v":"year=2015"},{"n":"2014","v":"year=2014"},{"n":"2013","v":"year=2013"},{"n":"2012","v":"year=2012"},{"n":"2011","v":"year=2011"},{"n":"2010","v":"year=2010"},{"n":"更早","v":"year=2010前"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"jqlx=冒险"},{"n":"热血","v":"jqlx=热血"},{"n":"爱情","v":"jqlx=爱情"},{"n":"搞笑","v":"jqlx=搞笑"},{"n":"后宫","v":"jqlx=后宫"},{"n":"校园","v":"jqlx=校园"},{"n":"机战","v":"jqlx=机战"},{"n":"幻想","v":"jqlx=幻想"},{"n":"科幻","v":"jqlx=科幻"},{"n":"竞技","v":"jqlx=竞技"},{"n":"百合","v":"jqlx=百合"},{"n":"耽美","v":"jqlx=耽美"},{"n":"悬疑","v":"jqlx=悬疑"},{"n":"剧情","v":"jqlx=剧情"},{"n":"战争","v":"jqlx=战争"},{"n":"恐怖","v":"jqlx=恐怖"},{"n":"运动","v":"jqlx=运动"},{"n":"动作","v":"jqlx=动作"},{"n":"童话","v":"jqlx=童话"},{"n":"历史","v":"jqlx=历史"},{"n":"真人","v":"jqlx=真人"},{"n":"女性向","v":"jqlx=女性向"},{"n":"泡面番","v":"jqlx=泡面番"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"orderby=pubdate"},{"n":"热度","v":"orderby=click"}]}],
|
||||
"其他":[{"key":"sta","name":"进度","value":[{"n":"全部","v":""},{"n":"连载中","v":"status=连载中"},{"n":"已完结","v":"status=已完结"},{"n":"未播放","v":"status=未播放"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"area=日本"},{"n":"中国","v":"area=中国"},{"n":"欧美","v":"area=欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"year=2024"},{"n":"2023","v":"year=2023"},{"n":"2022","v":"year=2022"},{"n":"2021","v":"year=2021"},{"n":"2020","v":"year=2020"},{"n":"2019","v":"year=2019"},{"n":"2018","v":"year=2018"},{"n":"2017","v":"year=2017"},{"n":"2016","v":"year=2016"},{"n":"2015","v":"year=2015"},{"n":"2014","v":"year=2014"},{"n":"2013","v":"year=2013"},{"n":"2012","v":"year=2012"},{"n":"2011","v":"year=2011"},{"n":"2010","v":"year=2010"},{"n":"更早","v":"year=2010前"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"冒险","v":"jqlx=冒险"},{"n":"热血","v":"jqlx=热血"},{"n":"爱情","v":"jqlx=爱情"},{"n":"搞笑","v":"jqlx=搞笑"},{"n":"后宫","v":"jqlx=后宫"},{"n":"校园","v":"jqlx=校园"},{"n":"机战","v":"jqlx=机战"},{"n":"幻想","v":"jqlx=幻想"},{"n":"科幻","v":"jqlx=科幻"},{"n":"竞技","v":"jqlx=竞技"},{"n":"百合","v":"jqlx=百合"},{"n":"耽美","v":"jqlx=耽美"},{"n":"悬疑","v":"jqlx=悬疑"},{"n":"剧情","v":"jqlx=剧情"},{"n":"战争","v":"jqlx=战争"},{"n":"恐怖","v":"jqlx=恐怖"},{"n":"运动","v":"jqlx=运动"},{"n":"动作","v":"jqlx=动作"},{"n":"童话","v":"jqlx=童话"},{"n":"历史","v":"jqlx=历史"},{"n":"真人","v":"jqlx=真人"},{"n":"女性向","v":"jqlx=女性向"},{"n":"泡面番","v":"jqlx=泡面番"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"orderby=pubdate"},{"n":"热度","v":"orderby=click"}]}]
|
||||
},
|
||||
// filter_def:{
|
||||
// TV:{by:'orderby=pubdate'},
|
||||
// 剧场版:{by:'orderby=pubdate'},
|
||||
// OVA:{by:'orderby=pubdate'},
|
||||
// 其他:{by:'orderby=pubdate'}
|
||||
// },
|
||||
searchUrl:'/search.html?keyword=**&PageNo=fypage',
|
||||
searchable:2,//是否启用全局搜索,
|
||||
headers:{//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'PC_UA',
|
||||
},
|
||||
class_name:'TV&剧场版&OVA&其他',
|
||||
class_url:'TV&剧场版&OVA&其他',
|
||||
play_parse: true,
|
||||
lazy:'',
|
||||
limit:6,
|
||||
// 推荐:'.dhnew.adj li;*;*;*;*',
|
||||
推荐:'.dhnew.adj li;a&&title;img&&src;p:eq(-1)&&Text;a&&href',
|
||||
// 一级:'.dhnew li;a&&title;img&&src;p:eq(-1)&&Text;a&&href',
|
||||
一级:`js:
|
||||
let d = [];
|
||||
pdfh = jsp.pdfh;pdfa = jsp.pdfa;pd = jsp.pd;
|
||||
let html = '';
|
||||
let totalresult = getItem("totalresult_" + MY_CATE, '')
|
||||
if (totalresult == '') {
|
||||
html = request(input);
|
||||
totalresult = pdfh(html, ".pageinfo&&strong&&Text");
|
||||
setItem("totalresult_" + MY_CATE, totalresult)
|
||||
}
|
||||
input += '&totalresult=' + getItem("totalresult_" + MY_CATE, '');
|
||||
html = request(input);
|
||||
let list = pdfa(html, ".dhnew&&li");
|
||||
list.forEach(it => {
|
||||
d.push({
|
||||
title: pdfh(it, "a&&title"),
|
||||
desc: pdfh(it, "p:eq(-1)&&Text"),
|
||||
pic_url: pd(it, "img&&src"),
|
||||
url: pd(it, "a&&href")
|
||||
})
|
||||
});
|
||||
setResult(d)
|
||||
`,
|
||||
二级:{
|
||||
"title":"h1&&Text;.dhxx p:eq(4)&&Text",
|
||||
"img":".anime-img&&img&&src",
|
||||
"desc":".info1-left li:eq(1)&&Text;.dhxx p:eq(3)&&Text;.dhxx p:eq(2)&&Text;.info1-left li:eq(0)&&Text;.info1-left li:eq(2)&&Text",
|
||||
"content":".info2--strong&&Text",
|
||||
"tabs":".ol-select li",
|
||||
"lists":".ol-content:eq(#id) li"
|
||||
},
|
||||
// 搜索:'*;*;*;p:eq(3)&&Text;*',
|
||||
搜索:'.dhnew li;a&&title;img&&src;p:eq(3)&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"搜索请求头参数": "手机",
|
||||
"搜索链接": "https://pan666.net/?q={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": "#flarum-content&&li",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000",
|
||||
"搜索片单标题": "a&&Text",
|
||||
"搜索片单链接": "a&&href",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "https://pan666.net",
|
||||
"搜索片单链接加后缀": "",
|
||||
"详情是否Jsoup写法": "1",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": "",
|
||||
"简介详情": ".Post-body,0&&p,-1&&Text",
|
||||
"线路列表数组规则": "",
|
||||
"线路标题": "",
|
||||
"播放列表数组规则": "body&&#flarum-content",
|
||||
"选集列表数组规则": "a[href~=https://www.ali(pan|yundrive).com/s/]",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
var rule = {
|
||||
title:'菜狗[官]',
|
||||
host:'https://waptv.sogou.com',
|
||||
homeUrl:'',
|
||||
searchUrl:'/film/result?ie=utf8&query=**',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
filterable:1,
|
||||
multi:1,
|
||||
// 分类链接fypage参数支持1个()表达式
|
||||
url:'/napi/video/classlist?abtest=0&iploc=CN1304&spver=&listTab=fyclass&filter=&start=((fypage-1)*15)&len=15&fr=filter',
|
||||
filter_url:'style={{fl.style}}&zone={{fl.zone}}&year={{fl.year}}&fee={{fl.fee}}&order={{fl.order}}',
|
||||
headers:{
|
||||
'User-Agent':'PC_UA'
|
||||
},
|
||||
timeout:5000,
|
||||
class_name:'电视剧&电影&动漫&综艺&纪录片',
|
||||
class_url:'teleplay&film&cartoon&tvshow&documentary',
|
||||
filter:{'teleplay': [{'key': 'style', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '爱情', 'v': '爱情'}, {'n': '喜剧', 'v': '喜剧'}, {'n': '都市', 'v': '都市'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '古装', 'v': '古装'}, {'n': '偶像', 'v': '偶像'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '历史', 'v': '历史'}, {'n': '战争', 'v': '战争'}, {'n': '武侠', 'v': '武侠'}, {'n': '警匪', 'v': '警匪'}, {'n': '科幻', 'v': '科幻'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '谍战', 'v': '谍战'}, {'n': '农村', 'v': '农村'}, {'n': '其他', 'v': '其他'}]}, {'key': 'zone', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': '内地'}, {'n': '香港', 'v': '香港'}, {'n': '台湾', 'v': '台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '泰国', 'v': '泰国'}, {'n': '日本', 'v': '日本'}, {'n': '美国', 'v': '美国'}, {'n': '英国', 'v': '英国'}, {'n': '新加坡', 'v': '新加坡'}, {'n': '其他', 'v': '其他'}]}, {'key': 'year', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2014', 'v': '2014'}, {'n': '更早', 'v': '更早'}]}, {'key': 'fee', 'name': '资源', 'value': [{'n': '全部', 'v': ''}, {'n': '正片', 'v': '正片'}, {'n': '免费正片', 'v': '免费正片'}, {'n': '付费正片', 'v': '付费正片'}]}, {'key': 'order', 'name': '排序', 'value': [{'n': '全部', 'v': ''}, {'n': '最新', 'v': '最新'}, {'n': '好评', 'v': '好评'}]}], 'film': [{'key': 'style', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '喜剧', 'v': '喜剧'}, {'n': '爱情', 'v': '爱情'}, {'n': '动作', 'v': '动作'}, {'n': '恐怖', 'v': '恐怖'}, {'n': '科幻', 'v': '科幻'}, {'n': '惊悚', 'v': '惊悚'}, {'n': '犯罪', 'v': '犯罪'}, {'n': '奇幻', 'v': '奇幻'}, {'n': '战争', 'v': '战争'}, {'n': '悬疑', 'v': '悬疑'}, {'n': '动画', 'v': '动画'}, {'n': '文艺', 'v': '文艺'}, {'n': '传记', 'v': '传记'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '古装', 'v': '古装'}, {'n': '警匪', 'v': '警匪'}, {'n': '其他', 'v': '其他'}]}, {'key': 'zone', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': '内地'}, {'n': '香港', 'v': '香港'}, {'n': '台湾', 'v': '台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '泰国', 'v': '泰国'}, {'n': '日本', 'v': '日本'}, {'n': '美国', 'v': '美国'}, {'n': '英国', 'v': '英国'}, {'n': '新加坡', 'v': '新加坡'}, {'n': '其他', 'v': '其他'}]}, {'key': 'year', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2014', 'v': '2014'}, {'n': '更早', 'v': '更早'}]}, {'key': 'fee', 'name': '资源', 'value': [{'n': '全部', 'v': ''}, {'n': '正片', 'v': '正片'}, {'n': '免费正片', 'v': '免费正片'}, {'n': '付费正片', 'v': '付费正片'}]}, {'key': 'order', 'name': '排序', 'value': [{'n': '全部', 'v': ''}, {'n': '最新', 'v': '最新'}, {'n': '好评', 'v': '好评'}]}], 'cartoon': [{'key': 'style', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '搞笑', 'v': '搞笑'}, {'n': '热血', 'v': '热血'}, {'n': '冒险', 'v': '冒险'}, {'n': '美少女', 'v': '美少女'}, {'n': '科幻', 'v': '科幻'}, {'n': '校园', 'v': '校园'}, {'n': '恋爱', 'v': '恋爱'}, {'n': '神魔', 'v': '神魔'}, {'n': '机战', 'v': '机战'}, {'n': '益智', 'v': '益智'}, {'n': '亲子', 'v': '亲子'}, {'n': '励志', 'v': '励志'}, {'n': '童话', 'v': '童话'}, {'n': '青春', 'v': '青春'}, {'n': '原创', 'v': '原创'}, {'n': '动作', 'v': '动作'}, {'n': '耽美', 'v': '耽美'}, {'n': '魔幻', 'v': '魔幻'}, {'n': '其他', 'v': '其他'}]}, {'key': 'zone', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '日本', 'v': '日本'}, {'n': '欧美', 'v': '欧美'}, {'n': '国产', 'v': '国产'}, {'n': '其他', 'v': '其他'}]}, {'key': 'year', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2014', 'v': '2014'}, {'n': '更早', 'v': '更早'}]}, {'key': 'fee', 'name': '资源', 'value': [{'n': '全部', 'v': ''}, {'n': '正片', 'v': '正片'}, {'n': '免费正片', 'v': '免费正片'}, {'n': '付费正片', 'v': '付费正片'}]}, {'key': 'order', 'name': '排序', 'value': [{'n': '全部', 'v': ''}, {'n': '最新', 'v': '最新'}, {'n': '好评', 'v': '好评'}]}], 'tvshow': [{'key': 'style', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '真人秀', 'v': '真人秀'}, {'n': '生活', 'v': '生活'}, {'n': '搞笑', 'v': '搞笑'}, {'n': '访谈', 'v': '访谈'}, {'n': '时尚', 'v': '时尚'}, {'n': '音乐', 'v': '音乐'}, {'n': '选秀', 'v': '选秀'}, {'n': '美食', 'v': '美食'}, {'n': '游戏', 'v': '游戏'}, {'n': '纪实', 'v': '纪实'}, {'n': '旅游', 'v': '旅游'}, {'n': '情感', 'v': '情感'}, {'n': '恶搞', 'v': '恶搞'}, {'n': '吐槽', 'v': '吐槽'}, {'n': '原创', 'v': '原创'}, {'n': '歌舞', 'v': '歌舞'}, {'n': '播报', 'v': '播报'}, {'n': '曲艺', 'v': '曲艺'}, {'n': '科教', 'v': '科教'}, {'n': '其他', 'v': '其他'}]}, {'key': 'zone', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': '内地'}, {'n': '台湾', 'v': '台湾'}, {'n': '日韩', 'v': '日韩'}, {'n': '欧美', 'v': '欧美'}, {'n': '其他', 'v': '其他'}]}, {'key': 'emcee', 'name': '明星', 'value': [{'n': '全部', 'v': ''}, {'n': '何炅', 'v': '何炅'}, {'n': '撒贝宁', 'v': '撒贝宁'}, {'n': '王筱磊', 'v': '王筱磊'}, {'n': '张绍刚', 'v': '张绍刚'}, {'n': '鲁健', 'v': '鲁健'}, {'n': '王世林', 'v': '王世林'}, {'n': '倪萍', 'v': '倪萍'}, {'n': '汪涵', 'v': '汪涵'}, {'n': '舒冬', 'v': '舒冬'}, {'n': '齐思钧', 'v': '齐思钧'}, {'n': '白岩松', 'v': '白岩松'}, {'n': '曲洪禹', 'v': '曲洪禹'}, {'n': '康辉', 'v': '康辉'}, {'n': '章亭', 'v': '章亭'}, {'n': '刘洪悦', 'v': '刘洪悦'}, {'n': '尼格买提', 'v': '尼格买提'}, {'n': '钱枫', 'v': '钱枫'}, {'n': '刘婧', 'v': '刘婧'}, {'n': '赵川', 'v': '赵川'}, {'n': '谢娜', 'v': '谢娜'}]}, {'key': 'order', 'name': '排序', 'value': [{'n': '全部', 'v': ''}, {'n': '最新', 'v': '最新'}, {'n': '好评', 'v': '好评'}]}], 'documentary': [{'key': 'style', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '历史', 'v': '历史'}, {'n': '自然', 'v': '自然'}, {'n': '动物', 'v': '动物'}, {'n': '社会', 'v': '社会'}, {'n': '传记', 'v': '传记'}, {'n': '人文', 'v': '人文'}, {'n': '文化', 'v': '文化'}, {'n': '军事', 'v': '军事'}, {'n': '科技', 'v': '科技'}, {'n': '人物', 'v': '人物'}, {'n': '探索', 'v': '探索'}, {'n': '美食', 'v': '美食'}, {'n': '旅行', 'v': '旅行'}, {'n': '探险', 'v': '探险'}, {'n': '其他', 'v': '其他'}]}, {'key': 'zone', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': '内地'}, {'n': '香港', 'v': '香港'}, {'n': '台湾', 'v': '台湾'}, {'n': '韩国', 'v': '韩国'}, {'n': '泰国', 'v': '泰国'}, {'n': '日本', 'v': '日本'}, {'n': '美国', 'v': '美国'}, {'n': '英国', 'v': '英国'}, {'n': '新加坡', 'v': '新加坡'}, {'n': '其他', 'v': '其他'}]}, {'key': 'year', 'name': '年代', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': '2023'}, {'n': '2022', 'v': '2022'}, {'n': '2021', 'v': '2021'}, {'n': '2020', 'v': '2020'}, {'n': '2019', 'v': '2019'}, {'n': '2018', 'v': '2018'}, {'n': '2017', 'v': '2017'}, {'n': '2016', 'v': '2016'}, {'n': '2015', 'v': '2015'}, {'n': '2014', 'v': '2014'}, {'n': '更早', 'v': '更早'}]}, {'key': 'fee', 'name': '资源', 'value': [{'n': '全部', 'v': ''}, {'n': '正片', 'v': '正片'}, {'n': '免费正片', 'v': '免费正片'}, {'n': '付费正片', 'v': '付费正片'}]}, {'key': 'order', 'name': '排序', 'value': [{'n': '全部', 'v': ''}, {'n': '最新', 'v': '最新'}, {'n': '好评', 'v': '好评'}]}]},
|
||||
limit:20,
|
||||
play_parse:true,
|
||||
play_json:1,
|
||||
// 手动调用解析请求json的url,此lazy不方便
|
||||
lazy:'',
|
||||
lazy:`js:
|
||||
print(input);
|
||||
fetch_params.headers["User-Agent"]=MOBILE_UA;
|
||||
print(fetch_params);
|
||||
let html=request(input);
|
||||
let rurl=html.match(/window\\.open\\('(.*?)',/)[1];
|
||||
rurl=urlDeal(rurl);
|
||||
input={parse:1,jx:1,url:rurl};
|
||||
`,
|
||||
// 推荐:'.list_item;img&&alt;img&&src;a&&Text;a&&data-float',
|
||||
一级:'js:let d=[];let html=request(input);html=JSON.parse(html);let list=html.listData.results;list.forEach(function(it){let desc1=it.ipad_play_for_list.finish_episode?it.ipad_play_for_list.episode===it.ipad_play_for_list.finish_episode?"全集"+it.ipad_play_for_list.finish_episode:"连载"+it.ipad_play_for_list.episode+"/"+it.ipad_play_for_list.finish_episode:"";let desc2=it.score?"评分:"+it.score:"";let desc3=it.date?"更至:"+it.date:"";d.push({title:it.name,img:it.v_picurl,url:"https://v.sogou.com"+it.url.replace("teleplay","series").replace("cartoon","series"),desc:desc1||desc2||desc3})});setResult(d);',
|
||||
二级:'',
|
||||
二级:'js:VOD={};let html=request(input);function adhead(url){let hd="https://v.sogou.com";if(!url.startsWith(hd)){url=hd+url}return urlencode(url)}try{let json=JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).detail.itemData;let key=json.dockey;let name=json.name;let zone=json.zone;let score=json.score?json.score:"暂无";let style=json.style;let emcee=json.emcee?"主持:"+json.emcee:json.name;let director=json.director?"导演:"+json.director:name;director=director.replace(/;/g,"\\t");let starring=json.starring?"演员:"+json.starring:"声优:"+json.shengyou;starring=starring.replace(/.*undefined/,"").replace(/;/g,"\\t");let update=json.update_wordstr?json.update_wordstr:"";let tv_station=json.tv_station?json.tv_station:zone;let introduction=json.introduction;let shengyou=json.shengyou;let shows=json.play_from_open_index;let plays=json.play.item_list;if(shows){VOD.vod_name=name;VOD.vod_area=emcee+","+tv_station;VOD.vod_director=director;VOD.vod_actor=starring;VOD.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");VOD.vod_remarks=style+" 评分:"+score+","+update;VOD.vod_content=introduction}else{VOD.vod_name=name;VOD.vod_director=director;VOD.vod_actor=starring;VOD.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");VOD.vod_content=introduction}let tp="&type=json";try{let tabs=[];let lists=[];plays.forEach(function(it){lists.push(it.info);let tbn=it.sitename[0]||it.site.replace(".com","");tbn=tbn.split("").join(" ");tabs.push(tbn)});VOD.vod_play_from=tabs.join("$$$");let vod_lists=[];print("play_url1:"+play_url);play_url=play_url.replace("&play_url=","&type=json&play_url=");print("play_url2:"+play_url);lists.forEach(function(item,idex){if(item||shows){if(item&&Array.isArray(item)&&item.length>1){let tmp=item.slice(1).map(function(its){return its.index+"$"+play_url+base64Encode(adhead(its.url))});vod_lists.push(tmp.join("#"))}if(shows){let arr=[];let tmp=[];let zy=shows.item_list[idex];zy.date.forEach(function(date){let day=date.day;for(let j=0;j<day.length;j++){let dayy=day[j][0]>=10?day[j][0]:"0"+day[j][0];let Tdate=date.year+date.month+dayy;arr.push(Tdate)}});for(let k=0;k<arr.length;k++){let url="https://v.sogou.com/vc/eplay?query="+arr[k]+"&date="+arr[k]+"&key="+key+"&st=5&tvsite="+plays[idex].site;tmp.push("第"+arr[k]+"期"+"$"+play_url+base64Encode(adhead(url)))}vod_lists.push(tmp.join("#"))}}else if(plays[idex].site){let tmp=[];if(!plays[idex].flag_list.includes("trailer")){tmp.push(plays[idex].sitename[0]+"$"+play_url+base64Encode(adhead(plays[idex].url)))}else{tmp.push(plays[idex].sitename[0]+"—预告"+"$"+play_url+base64Encode(adhead(plays[idex].url)))}vod_lists.push(tmp.join("#"))}});VOD.vod_play_url=vod_lists.join("$$$")}catch(e){let img=json.photo.item_list;VOD.vod_name="本片无选集";VOD.vod_pic=img.length>0?img[0]:""}}catch(e){print("发生了错误:"+e.message)}',
|
||||
// 二级:'js:var vod={vod_id:input};let html=request(input);function adhead(url){let hd="https://v.sogou.com";if(!url.startsWith(hd)){url=hd+url}return url}try{let json=JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]).detail.itemData;let key=json.dockey;let name=json.name;let zone=json.zone;let score=json.score?json.score:"暂无";let style=json.style;let emcee=json.emcee?"主持:"+json.emcee:json.name;let director=json.director?"导演:"+json.director:name;director=director.replace(/;/g,"\\t");let starring=json.starring?"演员:"+json.starring:"声优:"+json.shengyou;starring=starring.replace(/.*undefined/,"").replace(/;/g,"\\t");let update=json.update_wordstr?json.update_wordstr:"";let tv_station=json.tv_station?json.tv_station:zone;let introduction=json.introduction;let shengyou=json.shengyou;let shows=json.play_from_open_index;let plays=json.play.item_list;if(shows){vod.vod_name=name;vod.vod_area=emcee+","+tv_station;vod.vod_director=director;vod.vod_actor=starring;vod.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");vod.vod_remarks=style+" 评分:"+score+","+update;vod.vod_content=introduction}else{vod.vod_name=name;vod.vod_director=director;vod.vod_actor=starring;vod.vod_pic=jsp.pd(html,"#thumb_img&&img&&src");vod.vod_content=introduction}let tp="&type=json";try{let tabs=[];let lists=[];plays.forEach(function(it){lists.push(it.info);let tbn=it.sitename[0]||it.site.replace(".com","");tbn=tbn.split("").join(" ");tabs.push(tbn)});vod.vod_play_from=tabs.join("$$$");vod_lists=[];play_url=play_url.replace("&play_url=","&type=json&play_url=");lists.forEach(function(item,idex){if(item||shows){if(item&&Array.isArray(item)&&item.length>1){let tmp=item.slice(1).map(function(its){return its.index+"$"+play_url+base64Encode(adhead(its.url))});vod_lists.push(tmp.join("#"))}if(shows){let arr=[];let tmp=[];let zy=shows.item_list[idex];zy.date.forEach(function(date){let day=date.day;for(let j=0;j<day.length;j++){let dayy=day[j][0]>=10?day[j][0]:"0"+day[j][0];let Tdate=date.year+date.month+dayy;arr.push(Tdate)}});for(let k=0;k<arr.length;k++){let url="https://v.sogou.com/vc/eplay?query="+arr[k]+"&date="+arr[k]+"&key="+key+"&st=5&tvsite="+plays[idex].site;tmp.push("第"+arr[k]+"期"+"$"+play_url+base64Encode(adhead(url)))}vod_lists.push(tmp.join("#"))}}else if(plays[idex].site){let tmp=[];if(!plays[idex].flag_list.includes("trailer")){tmp.push(plays[idex].sitename[0]+"$"+play_url+base64Encode(adhead(plays[idex].url)))}else{tmp.push(plays[idex].sitename[0]+"—预告"+"$"+play_url+base64Encode(adhead(plays[idex].url)))}vod_lists.push(tmp.join("#"))}});vod.vod_play_url=vod_lists.join("$$$")}catch(e){let img=json.photo.item_list;vod.vod_name="本片无选集";vod.vod_pic=img.length>0?img[0]:""}}catch(e){}',
|
||||
搜索:'',
|
||||
搜索:`js:
|
||||
let d = [];
|
||||
let html = request(input);
|
||||
let jsonA = JSON.parse(html.match(/INITIAL_STATE.*?({.*});/)[1]);
|
||||
print(jsonA);
|
||||
jsonA = jsonA.result.resultData.searchData.results;
|
||||
jsonA.forEach(function(it) {
|
||||
let name = it.name;
|
||||
let introduction = it.introduction;
|
||||
let pic = it.v_picurl;
|
||||
let url = it.tiny_url;
|
||||
let zone = it.zone;
|
||||
let score = it.score || "暂无";
|
||||
let style = it.style;
|
||||
if (it.play_info && it.play_info.play_list) {
|
||||
let r = {};
|
||||
r.title = name.replace(//, "").replace(//, "");
|
||||
r.url = "https://v.sogou.com" + url.replace(/teleplay|cartoon/g, 'series');
|
||||
r.desc = it.listCategory.join(",");
|
||||
r.content = introduction;
|
||||
r.pic_url = pic;
|
||||
d.push(r)
|
||||
}
|
||||
});
|
||||
setResult(d);`,
|
||||
|
||||
}
|
||||
@@ -0,0 +1,448 @@
|
||||
{
|
||||
|
||||
"作者":"荷城茶秀",
|
||||
|
||||
"站名":"新视觉影视",
|
||||
|
||||
"主页url":"https://www.6080yy4.com/",
|
||||
|
||||
"简介":"剧情:&&<a",
|
||||
|
||||
"导演":"导演:&&</div>",
|
||||
|
||||
"主演":"主演:&&</div>",
|
||||
|
||||
"影片类型":"video-tag-icon\">&&立即播放",
|
||||
|
||||
"影片状态":"集数:&&</div>",
|
||||
|
||||
"数组":"module-item-pic\">&&module-item\">",
|
||||
|
||||
"图片":"data-src=\"&&\"",
|
||||
|
||||
"标题":"title=\"&&\"",
|
||||
|
||||
"副标题":"module-item-text\">&&</div>",
|
||||
|
||||
"链接":"href=\"&&\"",
|
||||
|
||||
"线路数组":"data-dropdown-value=&&</div>[不包含:夸克]",
|
||||
|
||||
"线路标题":"<span>&&</small>[替换:</span><small>>>>线路共]+集",
|
||||
|
||||
"播放数组":"sort-item\"&&</div>",
|
||||
|
||||
"播放标题":"<span>&&</span>",
|
||||
|
||||
"播放列表":"<a&&</a>",
|
||||
|
||||
"分类url":"https://www.6080yy4.com/vodshow/{cateId}-{area}-{by}-{class}-{lang}----{catePg}---{year}.html;;akx",
|
||||
|
||||
"分类":"电影$1#电视剧$2#综艺$3#动漫$4",
|
||||
|
||||
"筛选":{
|
||||
"1":[
|
||||
{
|
||||
"key":"cateld",
|
||||
"name":"类型",
|
||||
"value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"动作片","v":"25"},
|
||||
{"n":"喜剧片","v":"26"},
|
||||
{"n":"爱情片","v":"27"},
|
||||
{"n":"科幻记","v":"28"},
|
||||
{"n":"恐怖片","v":"30"},
|
||||
{"n":"剧情片","v":"31"},
|
||||
{"n":"战争片","v":"33"},
|
||||
{"n":"记录片","v":"35"},
|
||||
{"n":"悬疑片","v":"36"},
|
||||
{"n":"犯罪片","v":"38"},
|
||||
{"n":"冒险片","v":"40"},
|
||||
{"n":"动画片","v":"41"},
|
||||
{"n":"惊悚片","v":"43"},
|
||||
{"n":"奇幻片","v":"44"},
|
||||
{"n":"理论片","v":"46"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"class",
|
||||
"name":"剧情",
|
||||
"value":[
|
||||
{"n":"全部剧情","v":""},
|
||||
{"n":"喜剧","v":"喜剧"},
|
||||
{"n":"爱情","v":"爱情"},
|
||||
{"n":"恐怖","v":"恐怖"},
|
||||
{"n":"动作","v":"动作"},
|
||||
{"n":"科幻","v":"科幻"},
|
||||
{"n":"剧情","v":"剧情"},
|
||||
{"n":"战争","v":"战争"},
|
||||
{"n":"警匪","v":"警匪"},
|
||||
{"n":"犯罪","v":"犯罪"},
|
||||
{"n":"动画","v":"动画"},
|
||||
{"n":"奇幻","v":"奇幻"},
|
||||
{"n":"武侠","v":"武侠"},
|
||||
{"n":"冒险","v":"冒险"},
|
||||
{"n":"枪战","v":"枪战"},
|
||||
{"n":"恐怖","v":"恐怖"},
|
||||
{"n":"悬疑","v":"悬疑"},
|
||||
{"n":"惊悚","v":"惊悚"},
|
||||
{"n":"经典","v":"经常"},
|
||||
{"n":"青春","v":"青春"},
|
||||
{"n":"文艺","v":"文艺"},
|
||||
{"n":"微电影","v":"微电影"},
|
||||
{"n":"古装","v":"古装"},
|
||||
{"n":"儿童","v":"儿童"},
|
||||
{"n":"网络电影","v":"网络电影"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"area",
|
||||
"name":"地区",
|
||||
"value":[
|
||||
{"n":"全部地区","v":""},
|
||||
{"n":"大陆","v":"大陆"},
|
||||
{"n":"香港","v":"香港"},
|
||||
{"n":"台湾","v":"台湾"},
|
||||
{"n":"美国","v":"美国"},
|
||||
{"n":"法国","v":"法国"},
|
||||
{"n":"英国","v":"英国"},
|
||||
{"n":"日本","v":"日本"},
|
||||
{"n":"韩国","v":"韩国"},
|
||||
{"n":"德国","v":"德国"},
|
||||
{"n":"泰国","v":"泰国"},
|
||||
{"n":"印度","v":"印度"},
|
||||
{"n":"意大利","v":"意大利"},
|
||||
{"n":"西班牙","v":"西班牙"},
|
||||
{"n":"加拿大","v":"加拿大"},
|
||||
{"n":"其它","v":"其它"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"lang",
|
||||
"name":"语言",
|
||||
"value":[
|
||||
{"n":"全部语言","v":""},
|
||||
{"n":"国语","v":"国语"},
|
||||
{"n":"英语","v":"英语"},
|
||||
{"n":"粤语","v":"粤语"},
|
||||
{"n":"闽南语","v":"闽南语"},
|
||||
{"n":"韩语","v":"韩语"},
|
||||
{"n":"日语","v":"日语"},
|
||||
{"n":"其它","v":"其它"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"year",
|
||||
"name":"时间",
|
||||
"value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"by",
|
||||
"name":"排序",
|
||||
"value":[
|
||||
{"n":"全部排序","v":""},
|
||||
{"n":"时间排序","v":"time"},
|
||||
{"n":"人气排序","v":"hits"},
|
||||
{"n":"评分排序","v":"score"}
|
||||
]
|
||||
}
|
||||
],
|
||||
"2":[
|
||||
{
|
||||
"key":"cateId",
|
||||
"name":"类型",
|
||||
"value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"国产剧","v":"42"},
|
||||
{"n":"欧美剧","v":"45"},
|
||||
{"n":"日韩剧","v":"47"},
|
||||
{"n":"港台剧","v":"49"},
|
||||
{"n":"泰剧","v":"51"},
|
||||
{"n":"海外剧","v":"52"}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"key":"class",
|
||||
"name":"剧情",
|
||||
"value":[
|
||||
{"n":"全部剧情","v":""},
|
||||
{"n":"古装","v":"古装"},
|
||||
{"n":"战争","v":"战争"},
|
||||
{"n":"青春偶像","v":"青春偶像"},
|
||||
{"n":"喜剧","v":"喜剧"},
|
||||
{"n":"家庭","v":"家庭"},
|
||||
{"n":"犯罪","v":"犯罪"},
|
||||
{"n":"动作","v":"动作"},
|
||||
{"n":"奇幻","v":"奇幻"},
|
||||
{"n":"剧情","v":"剧情"},
|
||||
{"n":"历史","v":"历史"},
|
||||
{"n":"经典","v":"经典"},
|
||||
{"n":"乡村","v":"乡村"},
|
||||
{"n":"情景","v":"情景"},
|
||||
{"n":"商战","v":"商战"},
|
||||
{"n":"网剧","v":"网战"},
|
||||
{"n":"其他","v":"其他"}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"key":"area",
|
||||
"name":"地区",
|
||||
"value":[
|
||||
{"n":"全部地区","v":""},
|
||||
{"n":"内地","v":"内地"},
|
||||
{"n":"韩国","v":"韩国"},
|
||||
{"n":"香港","v":"香港"},
|
||||
{"n":"台湾","v":"台湾"},
|
||||
{"n":"日本","v":"日本"},
|
||||
{"n":"美国","v":"美国"},
|
||||
{"n":"泰国","v":"泰国"},
|
||||
{"n":"英国","v":"英国"},
|
||||
{"n":"新加坡","v":"新加坡"},
|
||||
{"n":"其他","v":"其他"}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"key":"lang",
|
||||
"name":"语言",
|
||||
"value":[
|
||||
{"n":"全部语言","v":""},
|
||||
{"n":"国语","v":"国语"},
|
||||
{"n":"英语","v":"英语"},
|
||||
{"n":"粤语","v":"粤语"},
|
||||
{"n":"闽南语","v":"闽南语"},
|
||||
{"n":"韩语","v":"韩语"},
|
||||
{"n":"日语","v":"日语"},
|
||||
{"n":"其它","v":"其它"}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"key":"year",
|
||||
"name":"年份",
|
||||
"value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"by",
|
||||
"name":"排序",
|
||||
"value":[
|
||||
{"n":"全部排序","v":""},
|
||||
{"n":"时间排序","v":"time"},
|
||||
{"n":"人气排序","v":"hits"},
|
||||
{"n":"评分排序","v":"score"}
|
||||
]
|
||||
}
|
||||
],
|
||||
"3":[
|
||||
{
|
||||
"key":"cateId",
|
||||
"name":"类型",
|
||||
"value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"大陆综艺","v":"20"},
|
||||
{"n":"日韩综艺","v":"21"},
|
||||
{"n":"港台综艺","v":"22"},
|
||||
{"n":"欧美综艺","v":"23"},
|
||||
{"n":"演唱会","v":"24"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key":"class",
|
||||
"name":"剧情",
|
||||
"value":[
|
||||
{"n":"全部剧情","v":""},
|
||||
{"n":"选秀","v":"选秀"},
|
||||
{"n":"情感","v":"情感"},
|
||||
{"n":"访谈","v":"访谈"},
|
||||
{"n":"播报","v":"播报"},
|
||||
{"n":"旅游","v":"旅游"},
|
||||
{"n":"音乐","v":"音乐"},
|
||||
{"n":"美食","v":"美食"},
|
||||
{"n":"纪实","v":"纪实"},
|
||||
{"n":"曲艺","v":"曲艺"},
|
||||
{"n":"生活","v":"生活"},
|
||||
{"n":"游戏互动","v":"游戏互动"},
|
||||
{"n":"财经","v":"财经"},
|
||||
{"n":"求职","v":"求职"}
|
||||
]},
|
||||
{
|
||||
"key":"area",
|
||||
"name":"地区",
|
||||
"value":[
|
||||
{"n":"全部地区","v":""},
|
||||
{"n":"内地","v":"内地"},
|
||||
{"n":"港台","v":"港台"},
|
||||
{"n":"日韩","v":"日韩"},
|
||||
{"n":"欧美","v":"欧美"}
|
||||
]},
|
||||
{
|
||||
"key":"lang",
|
||||
"name":"语言",
|
||||
"value":[
|
||||
{"n":"全部语言","v":""},
|
||||
{"n":"国语","v":"国语"},
|
||||
{"n":"英语","v":"英语"},
|
||||
{"n":"粤语","v":"粤语"},
|
||||
{"n":"闽南语","v":"闽南语"},
|
||||
{"n":"韩语","v":"韩语"},
|
||||
{"n":"日语","v":"日语"},
|
||||
{"n":"其它","v":"其他"}
|
||||
]},
|
||||
|
||||
{
|
||||
"key":"year",
|
||||
"name":"年份",
|
||||
"value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"}]},
|
||||
{
|
||||
"key":"by",
|
||||
"name":"排序",
|
||||
"value":[
|
||||
{"n":"全部排序","v":""},
|
||||
{"n":"时间排序","v":"time"},
|
||||
{"n":"人气排序","v":"hist"},
|
||||
{"n":"评分排序","v":"score"}]}],
|
||||
|
||||
"4":[
|
||||
{
|
||||
"key":"cateId",
|
||||
"name":"类型",
|
||||
"value":[
|
||||
{"n":"全部类型","v":""},
|
||||
{"n":"国产动漫","v":"29"},
|
||||
{"n":"日韩动漫","v":"32"},
|
||||
{"n":"欧美动漫","v":"34"},
|
||||
{"n":"港台动漫","v":"37"}
|
||||
]},
|
||||
{
|
||||
"key":"class",
|
||||
"name":"剧情",
|
||||
"value":[
|
||||
{"n":"全部剧情","v":""},
|
||||
{"n":"情感","v":"情感"},
|
||||
{"n":"科幻","v":"科幻"},
|
||||
{"n":"热血","v":"热血"},
|
||||
{"n":"推理","v":"推理"},
|
||||
{"n":"搞笑","v":"搞笑"},
|
||||
{"n":"冒险","v":"冒险"},
|
||||
{"n":"萝莉","v":"萝莉"},
|
||||
{"n":"校园","v":"校园"},
|
||||
{"n":"动作","v":"动作"},
|
||||
{"n":"机战","v":"机战"},
|
||||
{"n":"运动","v":"运动"},
|
||||
{"n":"战争","v":"战争"},
|
||||
{"n":"少年","v":"少年"},
|
||||
{"n":"少女","v":"少女"},
|
||||
{"n":"社会","v":"社会"},
|
||||
{"n":"原创","v":"原创"},
|
||||
{"n":"亲子","v":"亲子"},
|
||||
{"n":"益智","v":"益智"},
|
||||
{"n":"励志","v":"励志"},
|
||||
{"n":"其他","v":"其他"}]},
|
||||
|
||||
{
|
||||
"key":"area",
|
||||
"name":"地区",
|
||||
"value":[
|
||||
{"n":"全部地区","v":""},
|
||||
{"n":"国产","v":"国产"},
|
||||
{"n":"日本","v":"日本"},
|
||||
{"n":"欧美","v":"欧美"},
|
||||
{"n":"其他","v":"其他"}]},
|
||||
{
|
||||
"key":"lang",
|
||||
"name":"语言",
|
||||
"value":[
|
||||
{"n":"全部语言","v":""},
|
||||
{"n":"国语","v":"国语"},
|
||||
{"n":"英语","v":"英语"},
|
||||
{"n":"粤语","v":"粤语"},
|
||||
{"n":"闽南语","v":"闽南语"},
|
||||
{"n":"韩语","v":"韩语"},
|
||||
{"n":"日语","v":"日语"},
|
||||
{"n":"其它","v":"其它"}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"key":"year",
|
||||
"name":"年份",
|
||||
"value":[
|
||||
{"n":"全部时间","v":""},
|
||||
{"n":"2023","v":"2023"},
|
||||
{"n":"2022","v":"2022"},
|
||||
{"n":"2021","v":"2021"},
|
||||
{"n":"2020","v":"2020"},
|
||||
{"n":"2019","v":"2019"},
|
||||
{"n":"2018","v":"2018"},
|
||||
{"n":"2017","v":"2017"},
|
||||
{"n":"2016","v":"2016"},
|
||||
{"n":"2015","v":"2015"},
|
||||
{"n":"2014","v":"2014"},
|
||||
{"n":"2013","v":"2013"},
|
||||
{"n":"2012","v":"2012"},
|
||||
{"n":"2011","v":"2011"},
|
||||
{"n":"2010","v":"2010"}]},
|
||||
{
|
||||
"key":"by",
|
||||
"name":"排序",
|
||||
"value":[
|
||||
{"n":"全部排序","v":""},
|
||||
{"n":"时间排序","v":"time"},
|
||||
{"n":"人气排序","v":"hist"},
|
||||
{"n":"评分排序","v":"score"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,394 @@
|
||||
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;
|
||||
};
|
||||
}
|
||||
|
||||
function getMubans() {
|
||||
var mubanDict = { // 模板字典
|
||||
mx: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---/',
|
||||
searchUrl: '/vodsearch/**----------fypage---/',
|
||||
class_parse: '.top_nav li;a&&Text;a&&href;.*/(.*?)/',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable: 0,
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.cbox_list;*;*;*;*;*',
|
||||
double: true,
|
||||
一级: 'ul.vodlist li;a&&title;a&&data-original;.pic_text&&Text;a&&href',
|
||||
二级: {
|
||||
title: 'h2&&Text;.detail_list&&ul:eq(1)&&li&&a:eq(2)&&Text',
|
||||
img: '.vodlist_thumb&&data-original',
|
||||
desc: '.content_detail&&li:eq(1)&&Text;.detail_list&&ul:eq(1)&&li&&a&&Text;.detail_list&&ul:eq(1)&&li&&a:eq(1)&&Text;.detail_list&&ul:eq(1)&&li:eq(2)&&Text;.detail_list&&ul:eq(1)&&li:eq(3)&&Text',
|
||||
content: '.content_desc&&span&&Text',
|
||||
tabs: '.play_source_tab&&a',
|
||||
lists: '.content_playlist:eq(#id) li',
|
||||
},
|
||||
搜索: '*',
|
||||
},
|
||||
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),ul.stui-vodlist:eq(0),#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: '',
|
||||
searchUrl: '',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable: 1,
|
||||
filter: '',
|
||||
filter_url: '',
|
||||
filter_def: {},
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: '#side-menu li;a&&Text;a&&href;/(.*?)\.html',
|
||||
cate_exclude: '',
|
||||
play_parse: true,
|
||||
lazy: `js:input = {parse: 1, url: input, js: ''}`,
|
||||
double: true,
|
||||
推荐: '列表1;列表2;标题;图片;描述;链接;详情',
|
||||
一级: '列表;标题;图片;描述;链接;详情',
|
||||
二级: {
|
||||
title: 'vod_name;vod_type',
|
||||
img: '图片链接',
|
||||
desc: '主要信息;年代;地区;演员;导演',
|
||||
content: '简介',
|
||||
tabs: '',
|
||||
lists: 'xx:eq(#id)&&a',
|
||||
tab_text: 'body&&Text',
|
||||
list_text: 'body&&Text',
|
||||
list_url: 'a&&href'
|
||||
},
|
||||
搜索: '列表;标题;图片;描述;链接;详情',
|
||||
},
|
||||
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',
|
||||
},
|
||||
采集1: {
|
||||
title: '',
|
||||
host: '',
|
||||
homeTid: '13',
|
||||
homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',
|
||||
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
|
||||
searchUrl: '/api.php/provide/vod/?wd=**&pg=fypage',
|
||||
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyclass',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000, // class_name: '电影&电视剧&综艺&动漫',
|
||||
// class_url: '1&2&3&4',
|
||||
// class_parse:'js:let html=request(input);input=JSON.parse(html).class;',
|
||||
class_parse: 'json:class;',
|
||||
limit: 20,
|
||||
multi: 1,
|
||||
searchable: 2, //是否启用全局搜索,
|
||||
quickSearch: 1, //是否启用快速搜索,
|
||||
filterable: 0, //是否启用分类筛选,
|
||||
play_parse: true,
|
||||
parse_url: '',
|
||||
lazy: `js:
|
||||
if(/\\.(m3u8|mp4)/.test(input)){
|
||||
input = {parse:0,url:input}
|
||||
}else{
|
||||
if(rule.parse_url.startsWith('json:')){
|
||||
let purl = rule.parse_url.replace('json:','')+input;
|
||||
let html = request(purl);
|
||||
input = {parse:0,url:JSON.parse(html).url}
|
||||
}else{
|
||||
input= rule.parse_url+input;
|
||||
}
|
||||
}
|
||||
`,
|
||||
推荐: '*',
|
||||
一级: 'json:list;vod_name;vod_pic;vod_remarks;vod_id;vod_play_from',
|
||||
二级: `js:
|
||||
let html=request(input);
|
||||
html=JSON.parse(html);
|
||||
let data=html.list;
|
||||
VOD=data[0];`,
|
||||
搜索: '*',
|
||||
}
|
||||
};
|
||||
return JSON.parse(JSON.stringify(mubanDict));
|
||||
}
|
||||
|
||||
var mubanDict = getMubans();
|
||||
var muban = getMubans();
|
||||
export
|
||||
default {
|
||||
muban, getMubans
|
||||
};
|
||||
@@ -0,0 +1,8 @@
|
||||
var rule = {
|
||||
模板: '首图',
|
||||
title: '樱花动漫[漫]',
|
||||
host: 'https://katedm.com/',
|
||||
url: '/list/fyclass-fypage.html',
|
||||
searchUrl: '/search/**----------fypage---.html',
|
||||
搜索: '#searchList li;a&&title;.lazyload&&data-original;.pic-tag&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
var rule = {
|
||||
title: '次元城动漫[漫]',//规则标题,没有实际作用,但是可以作为cms类名称依据
|
||||
编码: '',//不填就默认utf-8
|
||||
搜索编码: '',//不填则不编码,默认都是按utf-8.可优先于全局编码属性.比如网页源码编码是gbk,这里可以指定utf-8搜索独立编码。多数情况这个属性不填或者填写gbk应对特殊的网站搜索
|
||||
host: 'https://www.cycanime.com',//网页的域名根,包含http头如 https://www,baidu.com
|
||||
//url: '/api.php/provide/vod?ac=detail&t=fyclass&pg=fypage&f=',//网站的分类页面链接
|
||||
url: '/api.php/provide/vod?&ac=detail&t=fyclass&pg=fypage&f=',//网站的分类页面链接
|
||||
///api.php/provide/vod?&ac=detail&t=fyclass&pg=fypage
|
||||
class_name: 'TV动画&剧场版&4K专区',//静态分类名称拼接
|
||||
class_url: '20&21&26',//静态分类标识拼接
|
||||
homeUrl: '/api.php/provide/vod?ac=detail',//网站的首页链接,可以是完整路径或者相对路径,用于分类获取和推荐获取 fyclass是分类标签 fypage是页数
|
||||
searchUrl: '/api.php/provide/vod?ac=detail&wd=**&pg=fypage', //搜索链接 可以是完整路径或者相对路径,用于分类获取和推荐获取 **代表搜索词 fypage代表页数
|
||||
detailUrl: '/api.php/provide/vod?ac=detail&ids=fyid', //非必填,二级详情拼接链接,感觉没啥卵用
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
play_parse: true,
|
||||
parse_url: 'https://player.cycanime.com/?url=',
|
||||
lazy: `js:
|
||||
if(/\\.(m3u8|mp4)/.test(input)){
|
||||
input = {parse:0,url:input}
|
||||
}else{
|
||||
if(rule.parse_url.startsWith('json:')){
|
||||
let purl = rule.parse_url.replace('json:','')+input;
|
||||
let html = request(purl);
|
||||
input = {parse:0,url:JSON.parse(html).url}
|
||||
}else{
|
||||
input= rule.parse_url+input;
|
||||
}
|
||||
}
|
||||
`,
|
||||
multi: 1,
|
||||
limit: 20,// 首页推荐显示数量
|
||||
推荐: 'json:list;vod_name;vod_pic;vod_remarks;vod_id', // double: true, // 推荐内容是否双层定位
|
||||
一级: 'json:list;vod_name;vod_pic;vod_remarks;vod_id',
|
||||
/**
|
||||
* 资源采集站,二级链接解析
|
||||
*/
|
||||
//二级: `json:list;vod_name;vod_pic;vod_remarks;vod_id`,
|
||||
二级: `js:
|
||||
let html = request(input);
|
||||
let list = JSON.parse(html).list;
|
||||
if(list.length===1){
|
||||
VOD = list[0];
|
||||
VOD.vod_blurb = VOD.vod_blurb.replace(/ /g, '').replace(/<[^>]*>/g, '');
|
||||
VOD.vod_content = VOD.vod_content.replace(/ /g, '').replace(/<[^>]*>/g, '');
|
||||
}
|
||||
`,
|
||||
/**
|
||||
* 搜索解析 过滤部分资源
|
||||
*/
|
||||
搜索: 'json:list;vod_name;vod_pic;vod_remarks;vod_id',
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
muban.mxpro.二级.desc = '.module-info-item:eq(4)&&Text;;;.module-info-item-content:eq(1)&&Text;.module-info-item-content:eq(0)&&Text';
|
||||
muban.mxpro.二级.tabs = '#y-playList .module-tab-item';
|
||||
var rule={
|
||||
title:'欧帝影院',
|
||||
模板:'mxpro',
|
||||
host:'https://www.odivod.com',
|
||||
url:'/vodshow/fyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'{{fl.cateId}}-{{fl.area}}-{{fl.by}}-{{fl.class}}-{{fl.lang}}-{{fl.letter}}---fypage---{{fl.year}}',
|
||||
filter:{
|
||||
"1":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"1"},{"n":"动作片","v":"6"},{"n":"惊悚片","v":"97"},{"n":"喜剧片","v":"7"},{"n":"爱情片","v":"8"},{"n":"科幻片","v":"9"},{"n":"恐怖片","v":"10"},{"n":"剧情片","v":"11"},{"n":"战争片","v":"12"},{"n":"冒险片","v":"65"},{"n":"犯罪片","v":"61"},{"n":"灾难片","v":"67"},{"n":"奇幻片","v":"70"},{"n":"经典片","v":"71"},{"n":"动画片","v":"68"},{"n":"悬疑片","v":"73"},{"n":"歌舞片","v":"66"},{"n":"网络电影","v":"72"},{"n":"同性片","v":"69"},{"n":"记录片","v":"25"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"动作","v":"动作"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"剧情","v":"剧情"},{"n":"科幻","v":"科幻"},{"n":"喜剧","v":"喜剧"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"动画","v":"动画"},{"n":"奇幻","v":"奇幻"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"经典","v":"经典"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"微电影","v":"微电影"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"},{"n":"网络电影","v":"网络电影"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"欧美","v":"欧美"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"其它","v":"其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009.2000","v":"2009.2000"},{"n":"1999.1900","v":"1999.1900"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"2":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"2"},{"n":"国产剧","v":"74"},{"n":"香港剧","v":"13"},{"n":"台湾剧","v":"75"},{"n":"韩国剧","v":"76"},{"n":"日本剧","v":"77"},{"n":"欧美剧","v":"78"},{"n":"泰国剧","v":"79"},{"n":"新马剧","v":"80"},{"n":"其他剧","v":"81"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"欧美","v":"欧美"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"新马","v":"新马"},{"n":"其它","v":"其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"泰国语","v":"泰国语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009.2000","v":"2009.2000"},{"n":"1999.1900","v":"1999.1900"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"3":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"3"},{"n":"国产综艺","v":"88"},{"n":"港台综艺","v":"91"},{"n":"日韩综艺","v":"92"},{"n":"欧美综艺","v":"95"},{"n":"新马泰综艺","v":"96"},{"n":"其他综艺","v":"98"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"欧美","v":"欧美"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"其它","v":"其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009.2000","v":"2009.2000"},{"n":"1999.1900","v":"1999.1900"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"4":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"4"},{"n":"国产动漫","v":"62"},{"n":"港台动漫","v":"93"},{"n":"日韩动漫","v":"63"},{"n":"欧美动漫","v":"64"},{"n":"新马泰动漫","v":"86"},{"n":"其他动漫","v":"16"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"欧美","v":"欧美"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"泰国","v":"泰国"},{"n":"其它","v":"其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009.2000","v":"2009.2000"},{"n":"1999.1900","v":"1999.1900"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"5":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"奥运","v":"奥运"},{"n":"篮球","v":"篮球"},{"n":"综合","v":"综合"},{"n":"足球","v":"足球"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"港台","v":"港台"},{"n":"欧美","v":"欧美"},{"n":"日韩","v":"日韩"},{"n":"新马泰","v":"新马泰"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009.2000","v":"2009.2000"},{"n":"1999.1900","v":"1999.1900"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}]
|
||||
},
|
||||
filter_def:{
|
||||
1:{cateId:'1'},
|
||||
2:{cateId:'2'},
|
||||
3:{cateId:'3'},
|
||||
4:{cateId:'4'},
|
||||
5:{cateId:'5'}
|
||||
},
|
||||
class_parse: '.navbar-items li:gt(1):lt(7);a&&title;a&&href;.*/(.*?).html',
|
||||
lazy:`js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"规则名": "歪片星球",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "否",
|
||||
"首页推荐链接": "https://waipian14.com",
|
||||
"首页列表数组规则": "body&&.module-main.tab-list.active",
|
||||
"首页片单列表数组规则": ".module-item",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "http://waipian14.com/show-{cateId}-{area}-{by}-{class}-----{catePg}---{year}/",
|
||||
"分类名称": "电影&电视剧&综艺&动漫&纪录片",
|
||||
"分类名称替换词": "dianying&juji&zongyi&dongman&jilupian",
|
||||
//"筛选数据": {},
|
||||
"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "",
|
||||
//{class}
|
||||
"筛选类型名称": "剧情&喜剧&动作&爱情&科幻&动画&悬疑&惊悚&恐怖&犯罪&同性&历史&战争&奇幻&冒险&灾难&武侠&古装&短片&Netflix||剧情&喜剧&动作&爱情&科幻&悬疑&惊悚&恐怖&犯罪&同性&历史&战争&奇幻&冒险&灾难&武侠&古装&都市&情景&家庭&短剧&Netflix||音乐&歌舞&运动&真人秀&旅游&美食&Netflix||剧情&喜剧&动作&爱情&科幻&动画&悬疑&惊悚&恐怖&犯罪&同性&战争&冒险&灾难&Netflix||传记&历史&纪录&Netflix",
|
||||
"筛选类型替换词": "*",
|
||||
//{area}
|
||||
"筛选地区名称": "中国大陆&中国香港&中国台湾&美国&韩国&日本&泰国&新加坡&马来西亚&印度&英国&法国&加拿大&俄罗斯&澳大利亚||中国大陆&中国香港&中国台湾&韩国&日本&美国&英国&澳大利亚&西班牙&泰国&印度&新加坡&马来西亚||中国大陆&中国香港&中国台湾&日本&美国&韩国||中国大陆&中国香港&中国台湾&日本&美国&英国||中国大陆&中国香港&中国台湾&日本&美国",
|
||||
"筛选地区替换词": "*",
|
||||
//{year}
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
//{lang}
|
||||
"筛选语言名称": "",
|
||||
"筛选语言替换词": "*",
|
||||
//{by}
|
||||
"筛选排序名称": "更新时间&最多播放&实时热门&近期热播&新片上线",
|
||||
"筛选排序替换词": "time&hits&hits_day&hits_week&year",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".module-items&&.module-item",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": ".module-poster-item-title&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".lazyload&&data-original||data-src",
|
||||
"分类片单副标题": ".module-item-note&&Text",
|
||||
"分类片单链接加前缀": "https://waipian14.com",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "http://waipian20.com/search-{wd}-------------/",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-original||data-src",
|
||||
"搜索片单标题": ".module-card-item-title&&Text",
|
||||
"搜索片单链接": "a&&href",
|
||||
"搜索片单副标题": ".module-item-note&&Text",
|
||||
"搜索片单链接加前缀": "https://waipian14.com",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": ".module-info-content&&.module-info-item,3&&Text",
|
||||
"地区详情": "",
|
||||
"演员详情": ".module-info-content&&.module-info-item,2&&Text",
|
||||
"简介详情": ".module-info-content&&.module-info-item&&Text",
|
||||
"线路列表数组规则": ".module-tab-items-box&&.module-tab-item",
|
||||
"线路标题": "Text",
|
||||
"播放列表数组规则": "body&&.module-play-list-content",
|
||||
"选集列表数组规则": "a",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "https://waipian14.com",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "是",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#&next"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
var rule = {
|
||||
title:'奇珍异兽[官]',
|
||||
host:'https://www.iqiyi.com',
|
||||
homeUrl:'',
|
||||
// detailUrl:'https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=fyid&size=2000&page=1',
|
||||
detailUrl:'https://pcw-api.iqiyi.com/video/video/videoinfowithuser/fyid?agent_type=1&authcookie=&subkey=fyid&subscribe=1',
|
||||
searchUrl:'https://search.video.iqiyi.com/o?if=html5&key=**&pageNum=fypage&pos=1&pageSize=24&site=iqiyi',
|
||||
searchable:2,
|
||||
multi:1,
|
||||
filterable:1,
|
||||
filter:{'1': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': 'three_category_id', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '华语', 'v': 1}, {'n': '香港地区', 'v': 28997}, {'n': '美国', 'v': 2}, {'n': '欧洲', 'v': 3}, {'n': '韩国', 'v': 4}, {'n': '日本', 'v': 308}, {'n': '泰国', 'v': 1115}, {'n': '印度', 'v': 28999}, {'n': '其它', 'v': 5}]}, {'key': '18001', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '喜剧', 'v': 8}, {'n': '爱情', 'v': 6}, {'n': '动作', 'v': 11}, {'n': '枪战', 'v': 131}, {'n': '犯罪', 'v': 291}, {'n': '惊悚', 'v': 128}, {'n': '恐怖', 'v': 10}, {'n': '悬疑', 'v': 289}, {'n': '动画', 'v': 12}, {'n': '家庭', 'v': 27356}, {'n': '奇幻', 'v': 1284}, {'n': '魔幻', 'v': 129}, {'n': '科幻', 'v': 9}, {'n': '战争', 'v': 7}, {'n': '青春', 'v': 130}]}, {'key': '27396', 'name': '规格', 'value': [{'n': '全部', 'v': ''}, {'n': '巨制', 'v': 27397}, {'n': '院线', 'v': 27815}, {'n': '独播', 'v': 30149}, {'n': '网络电影', 'v': 27401}]}], '2': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': 'three_category_id', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': 15}, {'n': '港剧', 'v': 16}, {'n': '韩剧', 'v': 17}, {'n': '美剧', 'v': 18}, {'n': '日剧', 'v': 309}, {'n': '泰剧', 'v': 1114}, {'n': '台湾地区', 'v': 1117}, {'n': '英剧', 'v': 28916}, {'n': '其它', 'v': 19}]}, {'key': '18003', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '自制', 'v': 11992}, {'n': '古装', 'v': 24}, {'n': '言情', 'v': 20}, {'n': '武侠', 'v': 23}, {'n': '偶像', 'v': 30}, {'n': '家庭', 'v': 1654}, {'n': '青春', 'v': 1653}, {'n': '都市', 'v': 24064}, {'n': '喜剧', 'v': 135}, {'n': '战争', 'v': 27916}, {'n': '军旅', 'v': 1655}, {'n': '谍战', 'v': 290}, {'n': '悬疑', 'v': 32}, {'n': '罪案', 'v': 149}, {'n': '穿越', 'v': 148}, {'n': '宫廷', 'v': 139}, {'n': '历史', 'v': 21}, {'n': '神话', 'v': 145}, {'n': '科幻', 'v': 34}, {'n': '年代', 'v': 27}, {'n': '农村', 'v': 29}, {'n': '商战', 'v': 140}, {'n': '剧情', 'v': 24063}, {'n': '奇幻', 'v': 27881}, {'n': '网剧', 'v': 24065}, {'n': '竖短片', 'v': 32839}]}], '3': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': 'three_category_id', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '国内', 'v': 20323}, {'n': '国外', 'v': 20324}]}, {'key': '18004', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '人文', 'v': 70}, {'n': '美食', 'v': 33908}, {'n': '医疗', 'v': 33924}, {'n': '自然', 'v': 33933}, {'n': '萌宠', 'v': 33945}, {'n': '财经', 'v': 33953}, {'n': '罪案', 'v': 33960}, {'n': '竞技', 'v': 33967}, {'n': '灾难', 'v': 33974}, {'n': '军事', 'v': 72}, {'n': '历史', 'v': 74}, {'n': '探险', 'v': 73}, {'n': '社会', 'v': 71}, {'n': '科技', 'v': 28119}, {'n': '旅游', 'v': 310}]}, {'key': '28467', 'name': '出品方', 'value': [{'n': '全部', 'v': ''}, {'n': 'BBC', 'v': 28468}, {'n': '美国历史频道', 'v': 28470}, {'n': '探索频道', 'v': 28471}, {'n': '央视记录', 'v': 28472}, {'n': '北京纪实频道', 'v': 28473}, {'n': '上海纪实频道', 'v': 28474}, {'n': '朗思文化', 'v': 28476}, {'n': 'CNEX', 'v': 28477}, {'n': '五星传奇', 'v': 28478}, {'n': 'IMG', 'v': 28479}, {'n': 'NHK', 'v': 28480}, {'n': '爱奇艺出品', 'v': 31283}, {'n': 'Netflix', 'v': 31286}]}, {'key': '29076', 'name': '片种', 'value': [{'n': '全部', 'v': ''}, {'n': '纪录电影', 'v': 29077}, {'n': '系列纪录片', 'v': 29078}, {'n': '网络纪录片', 'v': 29082}, {'n': '纪实栏目', 'v': 29083}]}, {'key': '31294', 'name': '时长', 'value': [{'n': '全部', 'v': ''}, {'n': '微纪录', 'v': 29079}, {'n': '长纪录', 'v': 29080}, {'n': '短纪录', 'v': 29081}]}], '4': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': 'three_category_id', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '中国大陆', 'v': 37}, {'n': '日本', 'v': 38}, {'n': '韩国', 'v': 1106}, {'n': '欧美', 'v': 30218}, {'n': '其它', 'v': 40}]}, {'key': '30219', 'name': '版本', 'value': [{'n': '全部', 'v': ''}, {'n': '动画', 'v': 30220}, {'n': '特摄', 'v': 30223}, {'n': '布袋戏', 'v': 30224}, {'n': '特别篇', 'v': 32782}, {'n': '动态漫画', 'v': 32783}, {'n': '动画电影', 'v': 32784}, {'n': '竖版视频', 'v': 32785}, {'n': '轻动画', 'v': 33482}, {'n': '短剧', 'v': 33483}]}, {'key': '30225', 'name': '风格', 'value': [{'n': '全部', 'v': ''}, {'n': '搞笑', 'v': 30230}, {'n': '热血', 'v': 30232}, {'n': '催泪', 'v': 30233}, {'n': '治愈', 'v': 30234}, {'n': '励志', 'v': 30237}, {'n': '机战', 'v': 30241}, {'n': '恋爱', 'v': 30243}, {'n': '科幻', 'v': 30245}, {'n': '奇幻', 'v': 30247}, {'n': '推理', 'v': 30248}, {'n': '校园', 'v': 30249}, {'n': '日常', 'v': 30252}, {'n': '历史', 'v': 30254}, {'n': '美食', 'v': 30255}, {'n': '职场', 'v': 30256}, {'n': '偶像', 'v': 30258}, {'n': '泡面', 'v': 30265}, {'n': '冒险', 'v': 30267}, {'n': '竞技', 'v': 30268}, {'n': '合家欢', 'v': 30270}, {'n': '武侠', 'v': 32792}, {'n': '玄幻', 'v': 32793}]}, {'key': '32795', 'name': '新类型', 'value': [{'n': '全部', 'v': ''}, {'n': '轻小说改编', 'v': 32796}, {'n': '漫画改编', 'v': 32797}, {'n': '游戏改编', 'v': 32798}, {'n': '原创', 'v': 32799}]}], '6': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': 'three_category_id', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': 151}, {'n': '港台', 'v': 152}, {'n': '韩国', 'v': 33306}, {'n': '欧美', 'v': 154}, {'n': '其它', 'v': 1113}]}, {'key': '18014', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '播报', 'v': 155}, {'n': '访谈', 'v': 156}, {'n': '游戏', 'v': 158}, {'n': '晚会', 'v': 292}, {'n': '曲艺', 'v': 293}, {'n': '脱口秀', 'v': 2118}, {'n': '真人秀', 'v': 2224}, {'n': '竞技', 'v': 30278}, {'n': '爱奇艺出品', 'v': 30279}, {'n': '竞演', 'v': 33860}]}, {'key': '33162', 'name': '题材', 'value': [{'n': '全部', 'v': ''}, {'n': '音乐', 'v': 33163}, {'n': '舞蹈', 'v': 33172}, {'n': '文化', 'v': 33173}, {'n': '美食', 'v': 33182}, {'n': '伦理', 'v': 33184}, {'n': '相亲', 'v': 33193}, {'n': '纪实', 'v': 33195}, {'n': '生活', 'v': 33196}, {'n': '亲子', 'v': 33197}, {'n': '少儿', 'v': 33198}, {'n': '财经', 'v': 33199}, {'n': '健康', 'v': 33200}, {'n': '时尚', 'v': 33203}, {'n': '旅游', 'v': 33205}, {'n': '教育', 'v': 33206}, {'n': '其它', 'v': 33220}, {'n': '爱情', 'v': 33316}, {'n': '搞笑', 'v': 33317}, {'n': '益智', 'v': 33318}, {'n': '职场', 'v': 33319}, {'n': '语言', 'v': 33530}, {'n': '辩论', 'v': 33531}, {'n': '演讲', 'v': 33843}]}], '5': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': 'three_category_id', 'name': '地区', 'value': [{'n': '全部', 'v': ''}, {'n': '内地', 'v': 221}, {'n': '港台', 'v': 220}, {'n': '欧美', 'v': 219}, {'n': '日韩', 'v': 218}, {'n': '拉美', 'v': 217}, {'n': '亚洲地区', 'v': 216}, {'n': '非洲', 'v': 215}]}, {'key': '18009', 'name': '语种', 'value': [{'n': '全部', 'v': ''}, {'n': '普通话', 'v': 91}, {'n': '粤语', 'v': 92}, {'n': '闽南语', 'v': 93}, {'n': '英语', 'v': 94}, {'n': '日语', 'v': 95}, {'n': '韩语', 'v': 96}, {'n': '其它', 'v': 97}]}, {'key': '23554', 'name': '音乐类型', 'value': [{'n': '全部', 'v': ''}, {'n': '单曲MV', 'v': 23556}, {'n': '单曲现场', 'v': 23557}, {'n': '演唱会', 'v': 23558}, {'n': '新闻', 'v': 23559}, {'n': '访谈', 'v': 23560}, {'n': '音乐记录', 'v': 23561}, {'n': '音乐周边', 'v': 23562}, {'n': '音乐节目', 'v': 23563}, {'n': '影视原声', 'v': 23564}, {'n': '音乐短片', 'v': 23565}, {'n': '其他', 'v': 23566}]}], '16': [{'key': 'mode', 'name': '综合排序', 'value': [{'n': '全部', 'v': ''}, {'n': '热播榜', 'v': 11}, {'n': '好评榜', 'v': 8}, {'n': '新上线', 'v': 4}]}, {'key': 'year', 'name': '全部年份', 'value': [{'n': '全部', 'v': ''}, {'n': '2023', 'v': 2023}, {'n': '2022', 'v': 2022}, {'n': '2021', 'v': 2021}, {'n': '2020', 'v': 2020}, {'n': '2019', 'v': 2019}, {'n': '2018', 'v': 2018}, {'n': '2017', 'v': 2017}, {'n': '2016-2011', 'v': '2011_2016'}, {'n': '2010-2000', 'v': '2000_2010'}, {'n': '90年代', 'v': '1990_1999'}, {'n': '80年代', 'v': '1980_1989'}, {'n': '更早', 'v': '1964_1979'}]}, {'key': 'is_purchase', 'name': '全部资费', 'value': [{'n': '全部', 'v': ''}, {'n': '免费', 'v': 0}, {'n': '会员', 'v': 1}, {'n': '付费', 'v': 2}]}, {'key': '18061', 'name': '类型', 'value': [{'n': '全部', 'v': ''}, {'n': '喜剧', 'v': 1296}, {'n': '爱情', 'v': 1297}, {'n': '动作', 'v': 1298}, {'n': '奇幻', 'v': 1299}, {'n': '惊悚', 'v': 1300}, {'n': '悬疑', 'v': 1301}, {'n': '青春', 'v': 1302}]}]},
|
||||
// url:'https://pcw-api.iqiyi.com/search/recommend/list?channel_id=fyclass&data_type=1&is_purchase=&mode=24&page_id=fypage&ret_num=48&three_category_id=',
|
||||
url:'https://pcw-api.iqiyi.com/search/recommend/list?channel_id=fyclass&data_type=1&page_id=fypage&ret_num=48',
|
||||
filter_url:'is_purchase={{fl.is_purchase}}&mode={{fl.mode}}&three_category_id={{fl.three_category_id}}&market_release_date_level={{fl.year}}',
|
||||
// url:'https://pcw-api.iqiyi.com/search/video/videolists?channel_id=fyclass&pageNum=fypage&pageSize=24&data_type=1&site=iqiyi',
|
||||
headers:{
|
||||
'User-Agent':'MOBILE_UA'
|
||||
},
|
||||
timeout:5000,
|
||||
class_name:'电影&电视剧&纪录片&动漫&综艺&音乐&网络电影',
|
||||
class_url:'1&2&3&4&6&5&16',
|
||||
limit:20,
|
||||
// play_parse:true,
|
||||
// 手动调用解析请求json的url,此lazy不方便
|
||||
// lazy:'js:input="https://cache.json.icu/home/api?type=ys&uid=292796&key=fnoryABDEFJNPQV269&url="+input.split("?")[0];log(input);let html=JSON.parse(request(input));log(html);input=html.url||input',
|
||||
// 推荐:'.list_item;img&&alt;img&&src;a&&Text;a&&data-float',
|
||||
// 一级:'json:.data.list;.name;.imageUrl;.latestOrder;.albumId',
|
||||
推荐:'',
|
||||
// 推荐:'js:let d=[];fetch_params.headers["user-agent"]=PC_UA;pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;let html=fetch(HOST,fetch_params);let lists=pdfa(html,".qy-mod-li");lists.forEach(function(it){try{let title=pdfh(it,"p.sub&&title");let desc=pdfh(it,".qy-mod-label&&Text");let pic_url=pd(it,"img&&src");d.push({title:title,desc:desc,img:pic_url})}catch(e){}});res=setResult(d);',
|
||||
一级:'js:let d=[];if(MY_CATE==="16"){input=input.replace("channel_id=16","channel_id=1").split("three_category_id")[0];input+="three_category_id=27401"}else if(MY_CATE==="5"){input=input.replace("data_type=1","data_type=2")}let html=request(input);let json=JSON.parse(html);if(json.code==="A00003"){fetch_params.headers["user-agent"]=PC_UA;json=JSON.parse(fetch(input,fetch_params))}json.data.list.forEach(function(data){if(data.channelId===1){desc=data.hasOwnProperty("score")?data.score+"分\\t":""}else if(data.channelId===2||data.channelId===4){if(data.latestOrder===data.videoCount){desc=(data.hasOwnProperty("score")?data.score+"分\\t":"")+data.latestOrder+"集全"}else{if(data.videoCount){desc=(data.hasOwnProperty("score")?data.score+"分\\t":"")+data.latestOrder+"/"+data.videoCount+"集"}else{desc="更新至 "+data.latestOrder+"集"}}}else if(data.channelId===6){desc=data.period+"期"}else if(data.channelId===5){desc=data.focus}else{if(data.latestOrder){desc="更新至 第"+data.latestOrder+"期"}else if(data.period){desc=data.period}else{desc=data.focus}}url=MY_CATE+"$"+data.albumId;d.push({url:url,title:data.name,desc:desc,pic_url:data.imageUrl.replace(".jpg","_390_520.jpg?caplist=jpg,webp")})});setResult(d);',
|
||||
// 一级:'js:let d=[];if(MY_CATE==="16"){input=input.replace("channel_id=16","channel_id=1").split("three_category_id")[0];input+="three_category_id=27401"}else if(MY_CATE==="5"){input=input.replace("data_type=1","data_type=2")}let html=fetch(input,fetch_params);let json=JSON.parse(html);if(json.code==="A00003"){fetch_params.headers["user-agent"]=PC_UA;json=JSON.parse(fetch(input,fetch_params))}json.data.list.forEach(function(data){if(data.channelId===1){desc=data.hasOwnProperty("score")?data.score+"分\\t":""}else if(data.channelId===2||data.channelId===4){if(data.latestOrder===data.videoCount){desc=(data.hasOwnProperty("score")?data.score+"分\\t":"")+data.latestOrder+"集全"}else{if(data.videoCount){desc=(data.hasOwnProperty("score")?data.score+"分\\t":"")+data.latestOrder+"/"+data.videoCount+"集"}else{desc="更新至 "+data.latestOrder+"集"}}}else if(data.channelId===6){desc=data.period+"期"}else if(data.channelId===5){desc=data.focus}else{if(data.latestOrder){desc="更新至 第"+data.latestOrder+"期"}else if(data.period){desc=data.period}else{desc=data.focus}}url=MY_CATE+"$"+data.albumId;d.push({url:url,title:data.name,desc:desc,pic_url:data.imageUrl.replace(".jpg","_390_520.jpg?caplist=jpg,webp")})});setResult(d);',
|
||||
// 一级:'json:.data.list;.name;.imageUrl;.playUrl;.latestOrder',
|
||||
// 二级:{is_json:1,"title":"data.title;data.moviecategory[0]+data.moviecategory[1]","img":"data.cdncover","desc":"data.area[0];data.director[0]","content":"data.description","tabs":"data.playlink_sites;data.playlinksdetail.#idv.quality","lists":"data.playlinksdetail.#idv.default_url"},
|
||||
// 二级:{is_json:1,"title":"data.name+data.subtitle;data.latestOrder","img":"data.imageUrl","desc":"data.categories;data.areas","content":"data.description","tabs":"data.name","lists":"data.playlinksdetail.#idv.default_url"},
|
||||
二级:'',
|
||||
二级:'js:let d=[];let html=request(input);let json=JSON.parse(html).data;VOD={vod_id:"",vod_url:input,vod_name:"",type_name:"",vod_actor:"",vod_year:"",vod_director:"",vod_area:"",vod_content:"",vod_remarks:"",vod_pic:""};VOD.vod_name=json.name;try{if(json.latestOrder){VOD.vod_remarks="类型: "+(json.categories[0].name||"")+"\\t"+(json.categories[1].name||"")+"\\t"+(json.categories[2].name||"")+"\\t"+"评分:"+(json.score||"")+"\\n更新至:第"+json.latestOrder+"集(期)/共"+json.videoCount+"集(期)"}else{VOD.vod_remarks="类型: "+(json.categories[0].name||"")+"\\t"+(json.categories[1].name||"")+"\\t"+(json.categories[2].name||"")+"\\t"+"评分:"+(json.score||"")+json.period}}catch(e){VOD.vod_remarks=json.subtitle}VOD.vod_area=(json.focus||"")+"\\n资费:"+(json.payMark===1?"VIP":"免费")+"\\n地区:"+(json.areas||"");let vsize="579_772";try{vsize=json.imageSize[12]}catch(e){}VOD.vod_pic=json.imageUrl.replace(".jpg","_"+vsize+".jpg?caplist=jpg,webp");VOD.type_name=json.categories.map(function(it){return it.name}).join(",");if(json.people.main_charactor){let vod_actors=[];json.people.main_charactor.forEach(function(it){vod_actors.push(it.name)});VOD.vod_actor=vod_actors.join(",")}VOD.vod_content=json.description;let playlists=[];if(json.channelId===1||json.channelId===5){playlists=[{playUrl:json.playUrl,imageUrl:json.imageUrl,shortTitle:json.shortTitle,focus:json.focus,period:json.period}]}else{if(json.channelId===6){let qs=json.period.split("-")[0];let listUrl="https://pcw-api.iqiyi.com/album/source/svlistinfo?cid=6&sourceid="+json.albumId+"&timelist="+qs;let playData=JSON.parse(request(listUrl)).data[qs];playData.forEach(function(it){playlists.push({playUrl:it.playUrl,imageUrl:it.imageUrl,shortTitle:it.shortTitle,focus:it.focus,period:it.period})})}else{let listUrl="https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid="+json.albumId+"&size=200&page=1";let data=JSON.parse(request(listUrl)).data;let total=data.total;playlists=data.epsodelist;if(total>200){for(let i=2;i<total/200+1;i++){let listUrl="https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid="+json.albumId+"&size=200&page="+i;let data=JSON.parse(request(listUrl)).data;playlists=playlists.concat(data.epsodelist)}}}}playlists.forEach(function(it){d.push({title:it.shortTitle||"第"+it.order+"集",desc:it.subtitle||it.focus||it.period,img:it.imageUrl.replace(".jpg","_480_270.jpg?caplist=jpg,webp"),url:it.playUrl})});VOD.vod_play_from="qiyi";VOD.vod_play_url=d.map(function(it){return it.title+"$"+it.url}).join("#");',
|
||||
// 二级:'js:let d=[];let html=request(input);let json=JSON.parse(html).data;vod={vod_id:"",vod_url:input,vod_name:"",type_name:"",vod_actor:"",vod_year:"",vod_director:"",vod_area:"",vod_content:"",vod_remarks:"",vod_pic:""};vod.vod_name=json.name;try{if(json.latestOrder){vod.vod_remarks="类型: "+(json.categories[0].name||"")+"\\t"+(json.categories[1].name||"")+"\\t"+(json.categories[2].name||"")+"\\t"+"评分:"+(json.score||"")+"\\n更新至:第"+json.latestOrder+"集(期)/共"+json.videoCount+"集(期)"}else{vod.vod_remarks="类型: "+(json.categories[0].name||"")+"\\t"+(json.categories[1].name||"")+"\\t"+(json.categories[2].name||"")+"\\t"+"评分:"+(json.score||"")+json.period}}catch(e){vod.vod_remarks=json.subtitle}vod.vod_area=(json.focus||"")+"\\n资费:"+(json.payMark===1?"VIP":"免费")+"\\n地区:"+(json.areas||"");let vsize="579_772";try{vsize=json.imageSize[12]}catch(e){}vod.vod_pic=json.imageUrl.replace(".jpg","_"+vsize+".jpg?caplist=jpg,webp");vod.type_name=json.categories.map(function(it){return it.name}).join(",");if(json.people.main_charactor){vod_actors=[];json.people.main_charactor.forEach(function(it){vod_actors.push(it.name)});vod.vod_actor=vod_actors.join(",")}vod.vod_content=json.description;let playlists=[];if(json.channelId===1||json.channelId===5){playlists=[{playUrl:json.playUrl,imageUrl:json.imageUrl,shortTitle:json.shortTitle,focus:json.focus,period:json.period}]}else{if(json.channelId===6){let qs=json.period.split("-")[0];let listUrl="https://pcw-api.iqiyi.com/album/source/svlistinfo?cid=6&sourceid="+json.albumId+"&timelist="+qs;let playData=JSON.parse(request(listUrl)).data[qs];playData.forEach(function(it){playlists.push({playUrl:it.playUrl,imageUrl:it.imageUrl,shortTitle:it.shortTitle,focus:it.focus,period:it.period})})}else{let listUrl="https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid="+json.albumId+"&size=200&page=1";let data=JSON.parse(request(listUrl)).data;let total=data.total;playlists=data.epsodelist;if(total>200){for(let i=2;i<total/200+1;i++){let listUrl="https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid="+json.albumId+"&size=200&page="+i;let data=JSON.parse(request(listUrl)).data;playlists=playlists.concat(data.epsodelist)}}}}playlists.forEach(function(it){d.push({title:it.shortTitle||"第"+it.order+"集",desc:it.subtitle||it.focus||it.period,img:it.imageUrl.replace(".jpg","_480_270.jpg?caplist=jpg,webp"),url:it.playUrl})});vod.vod_play_from="qiyi";vod.vod_play_url=d.map(function(it){return it.title+"$"+it.url}).join("#");',
|
||||
搜索:'json:.data.docinfos;.albumDocInfo.albumTitle;.albumDocInfo.albumVImage;.albumDocInfo.channel;.albumDocInfo.albumId;.albumDocInfo.tvFocus',
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
muban.短视2.二级.img = '.detail-pic&&img&&data-src';
|
||||
var rule = {
|
||||
title: '爱弹幕',
|
||||
模板:'短视2',
|
||||
host: 'https://anime.girigirilove.com',
|
||||
homeUrl:'/map/',
|
||||
// url:'/show/fyclass--------fypage---/'
|
||||
url: '/show/fyclassfyfilter/',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'-{{fl.area}}-{{fl.by}}-{{fl.class}}-{{fl.lang}}-{{fl.letter}}---fypage---{{fl.year}}',
|
||||
filter: {
|
||||
"2":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"奇幻","v":"奇幻"},{"n":"冒险","v":"冒险"},{"n":"悬疑","v":"悬疑"},{"n":"校园","v":"校园"},{"n":"后宫","v":"后宫"},{"n":"热血","v":"热血"},{"n":"运动","v":"运动"},{"n":"百合","v":"百合"},{"n":"乙女","v":"乙女"},{"n":"机甲","v":"机甲"},{"n":"日常","v":"日常"},{"n":"魔法少女","v":"魔法少女"},{"n":"异世界","v":"异世界"},{"n":"爱抖露","v":"爱抖露"},{"n":"音乐","v":"音乐"},{"n":"萌","v":"萌"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"一月","v":"一月"},{"n":"四月","v":"四月"},{"n":"七月","v":"七月"},{"n":"十月","v":"十月"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"日语","v":"日语"},{"n":"国语","v":"国语"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"3":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"搞笑","v":"搞笑"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"奇幻","v":"奇幻"},{"n":"冒险","v":"冒险"},{"n":"悬疑","v":"悬疑"},{"n":"校园","v":"校园"},{"n":"后宫","v":"后宫"},{"n":"热血","v":"热血"},{"n":"运动","v":"运动"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"21":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"奇幻","v":"奇幻"},{"n":"冒险","v":"冒险"},{"n":"悬疑","v":"悬疑"},{"n":"校园","v":"校园"},{"n":"后宫","v":"后宫"},{"n":"热血","v":"热血"},{"n":"运动","v":"运动"},{"n":"百合","v":"百合"},{"n":"耽美","v":"耽美"},{"n":"机甲","v":"机甲"},{"n":"日常","v":"日常"},{"n":"魔法少女","v":"魔法少女"},{"n":"异世界","v":"异世界"},{"n":"爱抖露","v":"爱抖露"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"日语","v":"日语"},{"n":"中文","v":"中文"},{"n":"英语","v":"英语"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"20":[{"key":"class","name":"类型","value":[{"n":"全部","v":""},{"n":"爱情","v":"爱情"},{"n":"科幻","v":"科幻"},{"n":"经典","v":"经典"},{"n":"冒险","v":"冒险"},{"n":"剧情","v":"剧情"},{"n":"动作","v":"动作"},{"n":"同性","v":"同性"},{"n":"喜剧","v":"喜剧"},{"n":"奇幻","v":"奇幻"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑.惊悚","v":"悬疑.惊悚"},{"n":"战争","v":"战争"},{"n":"欧美","v":"欧美"},{"n":"歌舞","v":"歌舞"},{"n":"灾难","v":"灾难"},{"n":"记录.泰剧","v":"记录.泰剧"},{"n":"体育","v":"体育"},{"n":"烧脑","v":"烧脑"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"泰国","v":"泰国"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004.2003","v":"2004.2003"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"日语","v":"日语"},{"n":"英语","v":"英语"},{"n":"泰语","v":"泰语"}]},{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"24":[{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"26":[{"key":"by","name":"排序","value":[{"n":"最新","v":"time"},{"n":"最热","v":"hits"},{"n":"评分","v":"score"}]}]
|
||||
},
|
||||
searchUrl: '/search/**----------fypage---/',
|
||||
class_name:'日番&美番&劇場版&真人番劇&BD副音軌&其他',
|
||||
class_url:'2&3&21&20&24&26',
|
||||
play_parse:true,
|
||||
lazy:`js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
var from = html.from;
|
||||
var next = html.link_next;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
} else if (html.encrypt == '3') {
|
||||
url = url.substring(8, url.length);
|
||||
url = base64Decode(url);
|
||||
url = url.substring(8, (url.length) - 8)
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
var paurl = request(HOST + '/static/player/' + from + '.js').match(/ src="(.*?)'/)[1];
|
||||
if (/https/.test(paurl)) {
|
||||
var purl = paurl + url + '&next=' + next + '&title=';
|
||||
input = {
|
||||
jx: 0,
|
||||
url: purl,
|
||||
parse: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
推荐:'.border-box&&.public-list-box;a&&title;.lazy&&data-src;.public-list-prb&&Text;a&&href',
|
||||
double: false, // 推荐内容是否双层定位
|
||||
一级:'.border-box .public-list-box;a&&title;.lazy&&data-src;.public-list-prb&&Text;a&&href',
|
||||
搜索:'.row-right&&.search-box;.thumb-txt&&Text;.lazy&&data-src;.public-list-prb&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"规则名": "玩偶哥哥",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "MOBILE_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "否",
|
||||
"是否开启获取首页数据": "是",
|
||||
"首页推荐链接": "https://www.wogg.net",
|
||||
"首页列表数组规则": "body&&.module-items",
|
||||
"首页片单列表数组规则": ".module-item:not(:matches(饭太硬|公众号))",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://www.wogg.net/index.php/vodshow/{cateId}-{area}-{by}-{class}-{lang}----{catePg}---{year}.html",
|
||||
"分类名称": "电影&剧集&动漫&综艺&短剧&音乐",
|
||||
"分类名称替换词": "1&2&3&4&6&5",
|
||||
//"筛选数据": {},
|
||||
"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "*",
|
||||
//{class}
|
||||
"筛选类型名称": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
"筛选类型替换词": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&古装&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&历史||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||空||空||空",
|
||||
//{area}
|
||||
"筛选地区名称": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
"筛选地区替换词": "大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国&德国&泰国&印度&意大利&西班牙&加拿大&其他||大陆&香港&台湾&美国&法国&英国&日本&韩国||空||空",
|
||||
//{year}
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
//{lang}
|
||||
"筛选语言名称": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
"筛选语言替换词": "国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||国语&英语&粤语&闽南语&韩语&日语&法语&德语&其它||空||空||空",
|
||||
//{by}
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".module-items&&.module-item:not(:matches(饭太硬|公众号))",
|
||||
"分类片单是否Jsoup写法": "是",
|
||||
"分类片单标题": "a&&title",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".module-item-pic&&img&&data-src",
|
||||
"分类片单副标题": ".module-item-text&&Text",
|
||||
"分类片单链接加前缀": "https://www.wogg.net",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$MOBILE_UA",
|
||||
"搜索链接": "https://www.wogg.net/index.php/vodsearch/{wd}----------{SearchPg}---.html",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".module-items&&.module-search-item",
|
||||
"搜索片单是否Jsoup写法": "是",
|
||||
"搜索片单图片": ".lazyload&&data-src",
|
||||
"搜索片单标题": "h3&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".video-info&&a&&Text",
|
||||
"搜索片单链接加前缀": "https://www.wogg.net",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "否",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "是",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": ".video-info-main&&.video-info-actor,1&&Text",
|
||||
"简介详情": ".video-info-content&&p,-1&&Text",
|
||||
"线路列表数组规则": ".module-player-tab&&.module-tab-item",
|
||||
"线路标题": "span&&Text",
|
||||
"播放列表数组规则": "body&&.module-player-list",
|
||||
"选集列表数组规则": ".module-row-one",
|
||||
"选集标题链接是否Jsoup写法": "是",
|
||||
"选集标题": "h4&&Text",
|
||||
"选集链接": ".btn-down&&a&&href",
|
||||
"是否反转选集序列": "否",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "",
|
||||
"是否开启手动嗅探": "否",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
//写法思路来海阔视界,xpath筛选。本人是海阔用户,所以搬了海阔的jsoup写法过来。2022年9月17日
|
||||
//jsoup规则写法请查阅海阔视界或者海阔影视相关教程。不支持js写法
|
||||
//本文档为完整模板,请不要去无中生有添加多余的键值参数。
|
||||
{
|
||||
//规则名
|
||||
"title": "电影港",
|
||||
//作者
|
||||
"author": "香雅情",
|
||||
//请求头UA,键名$键值,每一组用#分开,不填则默认okhttp/3.12.11,可填MOBILE_UA或PC_UA使用内置的手机版或电脑版UA
|
||||
//多个请求头参数写法示例,"User-Agent$PC_UA#Referer$http://ww.baidu.com#Cookie$ser=ok",每一组用#分开。
|
||||
//习惯查看手机源码写建议用手机版UA,习惯查看PC版源码写建议用电脑版UA
|
||||
"Headers":"PC_UA",
|
||||
//网页编码格式默认UTF-8编码,UTF-8,GBK,GB2312
|
||||
"Coding_format":"gb2312",
|
||||
//图片是否需要代理
|
||||
"PicNeedProxy":"0",
|
||||
//是否开启获取首页数据,0关闭,1开启
|
||||
"homeContent":"0",
|
||||
//分类链接起始页码,禁止负数和含小数点。
|
||||
"firstpage": "1",
|
||||
//分类链接,{cateId}是分类,{catePg}是页码,第一页没有页码的可以这样写 第二页链接[firstPage=第一页的链接]
|
||||
"class_url": "https://www.dygang.tv/{cateId}/index_{catePg}.htm[firstPage=https://www.dygang.cc/{cateId}/index.htm]",
|
||||
//分类名,分类1&分类2&分类3
|
||||
"class_name": "最新电影&经典高清&国配电影&经典港片&国剧&日韩剧&美剧&综艺&动漫&纪录片&高清原盘&4K高清区&3D电影&电影专题",
|
||||
//分类名替换词,替换词1&替换词2&替换词3,替换词包含英文&的用两个中文&&代替,示例:&&id=0&&&id=1
|
||||
"class_value": "ys&bd&gy&gp&dsj&dsj1&yx&zy&dmq&jilupian&1080p&4K&3d&dyzt",
|
||||
//筛选数据,json格式,参考xpath的筛选写法
|
||||
"filterdata":{},
|
||||
|
||||
//分类页面截取数据模式,0为json,其它数字为普通网页。
|
||||
"cat_mode": "1",
|
||||
//分类列表数组定位,最多支持3层,能力有限,不是所有页面都能支持
|
||||
"cat_arr_rule": "body&&table[width=388]",
|
||||
//分类片单信息jsoup与xb截取写法切换,只作用于html网页,1为jsoup写法(默认),0为xb写法
|
||||
"cat_is_jsoup":"1",
|
||||
//分类片单标题
|
||||
"cat_title": "img&&alt",
|
||||
//分类片单链接
|
||||
"cat_url": "a&&href",
|
||||
//分类片单图片,支持自定义图片链接
|
||||
"cat_pic": "img&&src",
|
||||
//分类片单副标题
|
||||
"cat_subtitle":"[align=center]&&Text",
|
||||
//分类片单链接补前缀
|
||||
"cat_prefix": "https://www.dygang.tv",
|
||||
//分类片单链接补后缀
|
||||
"cat_suffix": "",
|
||||
|
||||
//搜索请求头参数,不填则默认okhttp/3.12.11,可填MOBILE_UA或PC_UA使用内置的手机版或电脑版UA
|
||||
//多个请求头参数写法示例,键名$键值,每一组用#分开。"User-Agent$PC_UA#Referer$http://ww.baidu.com#Cookie$ser=ok"。
|
||||
"SHeaders":"User-Agent$PC_UA#Content-Type$charset=gb2312",
|
||||
//搜索链接,搜索关键字用{wd}表示,post请求的最后面加;post
|
||||
//POST链接示例 http://www.lezhutv.com/index.php?m=vod-search;post
|
||||
"search_url": "https://www.dygang.tv/e/search/index123.php;post",
|
||||
//POST搜索body,填写搜索关键字的键值,一般常见的是searchword和wd,不是POST搜索的可留空或删除。
|
||||
"sea_PtBody":"keyboard={wd}&submit=搜+索&show=title,smalltext&tempid=1&tbname=article",
|
||||
|
||||
//搜索截取模式,0为json搜索,只支持列表在list数组里的,其它数字为网页截取。
|
||||
"search_mode": "1",
|
||||
//搜索列表数组定位,不填默认内置list,最多支持3层,能力有限,不是所有页面都能支持。
|
||||
"sea_arr_rule": "body&&table[width=388]",
|
||||
//搜索片单信息jsoup与xb截取写法切换,只作用于html网页,1为jsoup写法(默认),0为xb写法
|
||||
"sea_is_jsoup":"1",
|
||||
//搜索片单图片,支持自定义图片链接
|
||||
"sea_pic": "img&&src",
|
||||
//搜索片单标题
|
||||
"sea_title": "img&&alt",
|
||||
//搜索片单链接
|
||||
"sea_url": "a&&href",
|
||||
//搜索片单副标题
|
||||
"sea_subtitle":"",
|
||||
//搜索片单链接补前缀
|
||||
"search_prefix": "https://www.dygang.tv",
|
||||
//搜索片单链接补后缀,这个一般json搜索的需要
|
||||
"search_suffix": "",
|
||||
|
||||
//片单链接是否直接播放,0否,1分类片单链接直接播放,2详情选集链接直接播放。
|
||||
//设置成直接播放后,后面3个参数请注意该留空的请务必留空。
|
||||
"force_play": "0",
|
||||
//直接播放链接补前缀
|
||||
"play_prefix": "",
|
||||
//直接播放链接补后缀,设置为#isVideo=true#可强制识别为视频链接
|
||||
"play_suffix": "",
|
||||
//直接播放链接设置请求头,只对直链视频有效,每一组用#分开
|
||||
"play_header": "",
|
||||
|
||||
//项目信息jsoup与xb截取写法切换,1为jsoup写法(默认),0为xb写法
|
||||
"proj_is_jsoup":"0",
|
||||
//类型数据,截取前缀&&截取后缀
|
||||
"proj_cate": "",
|
||||
//年代数据,截取前缀&&截取后缀
|
||||
"proj_year": "",
|
||||
//地区数据,截取前缀&&截取后缀
|
||||
"proj_area": "",
|
||||
//演员数据,截取前缀&&截取后缀
|
||||
"proj_actor": "演 员&&</",
|
||||
//简介内容,截取前缀&&截取后缀
|
||||
"proj_plot": "简 介&&</",
|
||||
|
||||
//线路截取区域,如果不需要请把tab_title或tab_arr_rule置空或者全部不要填。
|
||||
//线路截取数组
|
||||
"tab_arr_rule": "#dede_content",
|
||||
//线路标题,截取前缀&&截取后缀
|
||||
"tab_title": "strong&&Text",
|
||||
|
||||
//列表数组截取,必须
|
||||
"list_arr_rule": "#dede_content",
|
||||
//集数数组截取,必须
|
||||
"epi_arr_rule": "table&&[href*=magnet]",
|
||||
//集数标题,截取前缀&&截取后缀
|
||||
"epi_title": "a&&Text",
|
||||
//集数链接,截取前缀&&截取后缀
|
||||
"epi_url": "a&&href",
|
||||
//选集是否反转显示
|
||||
"epi_reverse": "0",
|
||||
//集数链接补前缀
|
||||
"epiurl_prefix": "",
|
||||
//集数链接补后缀
|
||||
"epiurl_suffix": "",
|
||||
|
||||
//下面几个参数请勿乱用。否则可能会有副作用。
|
||||
//分析网页源码中有<script type="text/javascript">var player_aaaa={"flag":"play","encrypt这种源码的链接解析
|
||||
//如果网页源码里没有这种请设置为0
|
||||
"Anal_MacPlayer":"0",
|
||||
//是否开启手动嗅探,只对网页嗅探有效,0否,1是
|
||||
"ManualSniffer":"0",
|
||||
//手动嗅探视频链接关键字,每个用#隔开
|
||||
"VideoFormat":".mp4#.m3u8#.flv",
|
||||
//手动嗅探视频链接过滤关键词,每个用#隔开
|
||||
"VideoFilter":".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"规则名": "电影牛影院",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "手机",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "1",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://www.dianyingn.cc",
|
||||
"首页列表数组规则": "body&&.fed-list-info:has(.fed-list-remarks)",
|
||||
"首页片单列表数组规则": "li",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"首页片单标题": ".fed-list-title&&Text",
|
||||
"首页片单链接": "a&&href",
|
||||
"首页片单图片": ".fed-list-pics&&data-original",
|
||||
"首页片单副标题": ".fed-list-remarks&&Text",
|
||||
"首页片单链接加前缀": "https://www.dianyingn.cc",
|
||||
"首页片单链接加后缀": "",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://www.dianyingn.cc/vodtype/{cateId}-{catePg}.html",
|
||||
"分类名称": "电影&电视剧&综艺&动漫",
|
||||
"分类名称替换词": "dianying&dianshiju&zongyi&dongman",
|
||||
"筛选数据": "ext",
|
||||
"筛选子分类名称": "动作片&喜剧片&爱情片&科幻片&恐怖片&剧情片&战争片&纪录片||国产剧&港台剧&日韩剧&欧美剧",
|
||||
"筛选子分类替换词": "dongzuopian&xijupian&aiqingpian&kehuanpian&kongbupian&juqingpian&zhanzhengpian&jilupian||guochanju&gangtaiju&rihanju&oumeiju",
|
||||
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": "body&&.fed-list-item:has(.fed-list-remarks)",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": ".fed-list-title&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": ".fed-list-pics&&data-original",
|
||||
"分类片单副标题": ".fed-list-remarks&&Text",
|
||||
"分类片单链接加前缀": "https://www.dianyingn.cc",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "手机",
|
||||
"搜索链接": "https://www.dianyingn.cc/index.php/ajax/suggest.html?mid=1&wd={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "0",
|
||||
"搜索列表数组规则": "list",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "pic",
|
||||
"搜索片单标题": "name",
|
||||
"搜索片单链接": "id",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "https://www.dianyingn.cc/voddetail/",
|
||||
"搜索片单链接加后缀": ".html",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "https://live.52sf.ga/huya/",
|
||||
"直接播放链接加后缀": "#isVideo=true#",
|
||||
"直接播放直链视频请求头": "authority$ku.peizq.online#Referer$https://play.peizq.online",
|
||||
"详情是否Jsoup写法": "0",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": "主演:</span>&&</li>",
|
||||
"简介详情": "简介:</span>&&</li>",
|
||||
"线路列表数组规则": ".fed-tabs-item&&ul&&li",
|
||||
"线路标题": "Text",
|
||||
"播放列表数组规则": "body&&.fed-play-item",
|
||||
"选集列表数组规则": ".fed-btns-info",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "https://www.dianyingn.cc",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"规则名": "电影盒子",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "手机",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "http://kan8.tv",
|
||||
"首页列表数组规则": "body&&.stui-vodlist:has(h4)",
|
||||
"首页片单列表数组规则": "li",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"首页片单标题": "h4&&a&&Text",
|
||||
"首页片单链接": "h4&&a&&href",
|
||||
"首页片单图片": ".lazyload&&data-original",
|
||||
"首页片单副标题": ".pic-text&&Text",
|
||||
"首页片单链接加前缀": "http://kan8.tv",
|
||||
"首页片单链接加后缀": "",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "http://kan8.tv/films/{cateId}_{catePg}.html{by}",
|
||||
"分类名称": "电影&电视剧&综艺&动漫&伦理",
|
||||
"分类名称替换词": "1&2&4&3&40",
|
||||
"筛选数据": "ext",
|
||||
"筛选排序名称": "时间&人气",
|
||||
"筛选排序替换词": "?order=time&?order=hit",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".stui-vodlist&&li",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "h4&&a&&Text",
|
||||
"分类片单链接": "h4&&a&&href",
|
||||
"分类片单图片": ".lazyload&&data-original",
|
||||
"分类片单副标题": ".pic-text&&Text",
|
||||
"分类片单链接加前缀": "http://kan8.tv",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$手机",
|
||||
"搜索链接": "http://kan8.tv/search.php;post",
|
||||
"POST请求数据": "searchword={wd}",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".stui-vodlist__media&&li",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": ".lazyload&&data-original",
|
||||
"搜索片单标题": "h3&&a&&Text",
|
||||
"搜索片单链接": "h3&&a&&href",
|
||||
"搜索片单副标题": ".pic-text&&Text",
|
||||
"搜索片单链接加前缀": "http://kan8.tv",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "0",
|
||||
"类型详情": "类型:</span>&&</a>",
|
||||
"年代详情": "年份:</span>&&</a>",
|
||||
"地区详情": "地区:</span>&&</a>",
|
||||
"演员详情": "主演:</span>&&</p>",
|
||||
"简介详情": "简介:</span>&&</p>",
|
||||
"线路列表数组规则": "body&&[href^=#down]",
|
||||
"线路标题": "Text",
|
||||
"播放列表数组规则": "body&&.stui-content__playlist",
|
||||
"选集列表数组规则": "li",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "http://kan8.tv",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
// 注入全局方法 (仅支持tvbox的js1以及c#版drpy的js0,暂不支持drpy官方py版的js0)
|
||||
// 注入全局方法 (仅支持tvbox的js1以及c#版drpy的js0,暂不支持drpy官方py版的js0)
|
||||
// 注入全局方法 (仅支持tvbox的js1以及c#版drpy的js0,暂不支持drpy官方py版的js0)
|
||||
globalThis.getHeaders= function(input){
|
||||
let t = new Date().getTime().toString();
|
||||
let headers = {
|
||||
'version_name': '1.0.6',
|
||||
'version_code': '6',
|
||||
'package_name': 'com.app.nanguatv',
|
||||
'sign': md5('c431ea542cee9679#uBFszdEM0oL0JRn@' + t).toUpperCase(),
|
||||
'imei': 'c431ea542cee9679',
|
||||
'timeMillis': t,
|
||||
'User-Agent': 'okhttp/4.6.0'
|
||||
};
|
||||
return headers
|
||||
}
|
||||
|
||||
var rule = {
|
||||
title:'畅梦影视',
|
||||
host:'http://ys.changmengyun.com',
|
||||
homeUrl:'/api.php/provide/vod_rank?app=ylys&sort_type=month&imei=c431ea542cee9679&id=2&page=1',
|
||||
url:'/api.php/provide/vod_list?app=ylys&id=fyclassfyfilter&page=fypage&imei=c431ea542cee9679',
|
||||
detailUrl:'/api.php/provide/vod_detail?app=ylys&imei=c431ea542cee9679&id=fyid',
|
||||
searchUrl:'/api.php/provide/search_result_more?app=ylys&video_name=**&pageSize=20&tid=0&imei=c431ea542cee9679&page=fypage',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
filterable:1,
|
||||
filter_url:'&area={{fl.area}}&year={{fl.year}}&type={{fl.class}}&total={{fl.total or "状态"}}&order={{fl.by or "新上线"}}',
|
||||
filter:{
|
||||
"2":[{"key":"class","name":"类型","value":[{"n":"全部","v":"类型"},{"n":"国产剧","v":"国产剧"},{"n":"港台剧","v":"港台剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"地区"},{"n":"内地","v":"内地"},{"n":"香港地区","v":"香港地区"},{"n":"台湾地区","v":"台湾地区"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":"年份"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"10年代","v":"10年代"},{"n":"00年代","v":"00年代"},{"n":"90年代","v":"90年代"},{"n":"80年代","v":"80年代"}]},{"key":"by","name":"排序","value":[{"n":"热播榜","v":"热播榜"},{"n":"好评榜","v":"好评榜"},{"n":"新上线","v":"新上线"}]}],
|
||||
"1":[{"key":"class","name":"类型","value":[{"n":"全部","v":"类型"},{"n":"动作片","v":"动作片"},{"n":"喜剧片","v":"喜剧片"},{"n":"爱情片","v":"爱情片"},{"n":"科幻片","v":"科幻片"},{"n":"恐怖片","v":"恐怖片"},{"n":"剧情片","v":"剧情片"},{"n":"战争片","v":"战争片"},{"n":"惊悚片","v":"惊悚片"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"地区"},{"n":"华语","v":"华语"},{"n":"香港地区","v":"香港地区"},{"n":"美国","v":"美国"},{"n":"欧洲","v":"欧洲"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"台湾地区","v":"台湾地区"},{"n":"泰国","v":"泰国"},{"n":"台湾地区","v":"台湾地区"},{"n":"印度","v":"印度"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":"年份"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"10年代","v":"10年代"},{"n":"00年代","v":"00年代"},{"n":"90年代","v":"90年代"},{"n":"80年代","v":"80年代"}]},{"key":"by","name":"排序","value":[{"n":"热播榜","v":"热播榜"},{"n":"好评榜","v":"好评榜"},{"n":"新上线","v":"新上线"}]}],
|
||||
"4":[{"key":"class","name":"类型","value":[{"n":"全部","v":"类型"},{"n":"国产漫","v":"国产漫"},{"n":"欧美漫","v":"欧美漫"},{"n":"日韩漫","v":"日韩漫"},{"n":"港台漫","v":"港台漫"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"地区"},{"n":"中国大陆","v":"中国大陆"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"欧美","v":"欧美"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":"年份"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"10年代","v":"10年代"},{"n":"00年代","v":"00年代"},{"n":"90年代","v":"90年代"},{"n":"80年代","v":"80年代"}]},{"key":"by","name":"排序","value":[{"n":"热播榜","v":"热播榜"},{"n":"新上线","v":"新上线"}]},{"key":"total","name":"状态","value":[{"n":"全部","v":"状态"},{"n":"连载","v":"连载"},{"n":"完结","v":"完结"}]}],
|
||||
"3":[{"key":"class","name":"类型","value":[{"n":"全部","v":"类型"},{"n":"大陆","v":"大陆"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"地区"},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"},{"n":"其它","v":"其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":"年份"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"10年代","v":"10年代"},{"n":"00年代","v":"00年代"},{"n":"90年代","v":"90年代"},{"n":"80年代","v":"80年代"}]},{"key":"by","name":"排序","value":[{"n":"热播榜","v":"热播榜"},{"n":"新上线","v":"新上线"}]}],
|
||||
"46":[{"key":"class","name":"类型","value":[{"n":"全部","v":"类型"},{"n":"日韩剧","v":"日韩剧"},{"n":"欧美剧","v":"欧美剧"},{"n":"海外剧","v":"海外剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"地区"},{"n":"韩国","v":"韩国"},{"n":"美剧","v":"美剧"},{"n":"日本","v":"日本"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":"年份"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"10年代","v":"10年代"},{"n":"00年代","v":"00年代"},{"n":"90年代","v":"90年代"},{"n":"80年代","v":"80年代"}]},{"key":"by","name":"排序","value":[{"n":"热播榜","v":"热播榜"},{"n":"好评榜","v":"好评榜"},{"n":"新上线","v":"新上线"}]}]
|
||||
},
|
||||
headers:{
|
||||
"User-Agent":"okhttp/4.6.0"
|
||||
},
|
||||
timeout:5000,
|
||||
class_name:'电视剧&电影&动漫&综艺&海外精选', // /api.php/provide/home_nav
|
||||
class_url:'2&1&4&3&46',
|
||||
limit:20,
|
||||
play_parse:true,
|
||||
lazy:`js:
|
||||
try {
|
||||
function getvideo(url) {
|
||||
let jData = JSON.parse(request(url, {
|
||||
headers: getHeaders(url)
|
||||
}));
|
||||
if (jData.code == 1) {
|
||||
return jData.data.url
|
||||
} else {
|
||||
return 'http://43.154.104.152:1234/jhapi/cs.php?url=' + url.split('=')[1]
|
||||
}
|
||||
}
|
||||
if (/,/.test(input)) {
|
||||
let mjurl = input.split(',')[1]
|
||||
let videoUrl = getvideo(mjurl);
|
||||
input = {
|
||||
jx: 0,
|
||||
url: videoUrl,
|
||||
parse: 0,
|
||||
header: JSON.stringify({
|
||||
'user-agent': 'Lavf/58.12.100'
|
||||
})
|
||||
}
|
||||
} else {
|
||||
let videoUrl = getvideo(input);
|
||||
if (/jhapi/.test(videoUrl)) {
|
||||
videoUrl = getvideo(videoUrl);
|
||||
input = {
|
||||
jx: 0,
|
||||
url: videoUrl,
|
||||
parse: 0,
|
||||
header: JSON.stringify({
|
||||
'user-agent': 'Lavf/58.12.100'
|
||||
})
|
||||
}
|
||||
} else {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: videoUrl,
|
||||
parse: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
log(e.toString())
|
||||
}
|
||||
`,
|
||||
推荐:`js:
|
||||
var d = [];
|
||||
let html = request(input, {
|
||||
headers: getHeaders(input)
|
||||
});
|
||||
html = JSON.parse(html);
|
||||
html.forEach(function(it) {
|
||||
d.push({
|
||||
title: it.name,
|
||||
img: it.img,
|
||||
desc: it.remarks,
|
||||
url: it.id
|
||||
})
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
一级:`js:
|
||||
var d = [];
|
||||
let html = request(input, {
|
||||
headers: getHeaders(input)
|
||||
});
|
||||
html = JSON.parse(html);
|
||||
html.list.forEach(function(it) {
|
||||
d.push({
|
||||
title: it.name,
|
||||
img: it.img,
|
||||
desc: it.msg,
|
||||
url: it.id
|
||||
})
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
二级:`js:
|
||||
var d = [];
|
||||
VOD = {
|
||||
vod_id: input.split('id=')[1]
|
||||
};
|
||||
try {
|
||||
let html = request(input, {
|
||||
headers: getHeaders(input)
|
||||
});
|
||||
html = JSON.parse(html);
|
||||
let node = html.data;
|
||||
VOD = {
|
||||
vod_name: node['name'],
|
||||
vod_pic: node['img'],
|
||||
type_name: node['type'],
|
||||
vod_year: node['year'],
|
||||
vod_remarks: '更新至: ' + node['msg'] + ' / 评分: ' + node['score'],
|
||||
vod_content: node['info'].strip()
|
||||
};
|
||||
let episodes = node.player_info;
|
||||
let playMap = {};
|
||||
if (typeof play_url === 'undefined') {
|
||||
var play_url = ''
|
||||
}
|
||||
episodes.forEach(function(ep) {
|
||||
let playurls = ep['video_info'];
|
||||
playurls.forEach(function(playurl) {
|
||||
let source = ep['show'];
|
||||
if (!playMap.hasOwnProperty(source)) {
|
||||
playMap[source] = []
|
||||
}
|
||||
playMap[source].append(playurl['name'].strip() + '$' + play_url + urlencode(playurl['url']))
|
||||
})
|
||||
});
|
||||
let playFrom = [];
|
||||
let playList = [];
|
||||
Object.keys(playMap)
|
||||
.forEach(function(key) {
|
||||
playFrom.append(key);
|
||||
playList.append(playMap[key].join('#'))
|
||||
});
|
||||
let vod_play_from = playFrom.join('$$$');
|
||||
let vod_play_url = playList.join('$$$');
|
||||
VOD['vod_play_from'] = vod_play_from;
|
||||
VOD['vod_play_url'] = vod_play_url
|
||||
} catch (e) {
|
||||
log('获取二级详情页发生错误:' + e.message)
|
||||
}
|
||||
`,
|
||||
搜索:`js:
|
||||
var d = [];
|
||||
let html = request(input, {
|
||||
headers: getHeaders(input)
|
||||
});
|
||||
html = JSON.parse(html);
|
||||
html.data.forEach(function(it) {
|
||||
d.push({
|
||||
title: it.video_name,
|
||||
img: it.img,
|
||||
desc: it.qingxidu + '/' + it.category,
|
||||
url: it.id,
|
||||
content: it.blurb
|
||||
})
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
var rule = {
|
||||
title: '看了么',
|
||||
host: 'https://www.ksksl.com',
|
||||
// url:'/show/fyclass/page/fypage.html',
|
||||
url: '/show/fyclassfyfilter.html',
|
||||
filterable: 1,//是否启用分类筛选,
|
||||
filter_url: '{{fl.area}}{{fl.by or "/by/time"}}{{fl.class}}/page/fypage{{fl.year}}',
|
||||
filter: {
|
||||
"dy":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/中国大陆"},{"n":"中国香港","v":"/area/中国香港"},{"n":"中国台湾","v":"/area/中国台湾"},{"n":"美国","v":"/area/美国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"}]},{"key":"class","name":"分类","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"警匪","v":"/class/警匪"},{"n":"犯罪","v":"/class/犯罪"},{"n":"动画","v":"/class/动画"},{"n":"奇幻","v":"/class/奇幻"},{"n":"武侠","v":"/class/武侠"},{"n":"冒险","v":"/class/冒险"},{"n":"枪战","v":"/class/枪战"},{"n":"恐怖","v":"/class/恐怖"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"经典","v":"/class/经典"},{"n":"青春","v":"/class/青春"},{"n":"文艺","v":"/class/文艺"},{"n":"古装","v":"/class/古装"},{"n":"历史","v":"/class/历史"},{"n":"运动","v":"/class/运动"},{"n":"农村","v":"/class/农村"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"tv":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/中国大陆"},{"n":"中国香港","v":"/area/中国香港"},{"n":"中国台湾","v":"/area/中国台湾"},{"n":"美国","v":"/area/美国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"}]},{"key":"class","name":"分类","value":[{"n":"全部","v":""},{"n":"古装","v":"/class/古装"},{"n":"言情","v":"/class/言情"},{"n":"武侠","v":"/class/武侠"},{"n":"偶像","v":"/class/美国"},{"n":"家庭","v":"/class/家庭"},{"n":"喜剧","v":"/class/喜剧"},{"n":"战争","v":"/class/战争"},{"n":"军旅","v":"/class/军旅"},{"n":"谍战","v":"/class/谍战"},{"n":"悬疑","v":"/class/悬疑"},{"n":"罪案","v":"/class/罪案"},{"n":"穿越","v":"/class/穿越"},{"n":"宫廷","v":"/class/宫廷"},{"n":"历史","v":"/class/历史"},{"n":"神话","v":"/class/神话"},{"n":"科幻","v":"/class/科幻"},{"n":"年代","v":"/class/年代"},{"n":"农村","v":"/class/农村"},{"n":"商战","v":"/class/商战"},{"n":"剧情","v":"/class/剧情"},{"n":"奇幻","v":"/class/奇幻"},{"n":"网剧","v":"/class/网剧"},{"n":"都市","v":"/class/都市"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"zy":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/中国大陆"},{"n":"中国香港","v":"/area/中国香港"},{"n":"中国台湾","v":"/area/中国台湾"},{"n":"美国","v":"/area/美国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"}]},{"key":"class","name":"分类","value":[{"n":"全部","v":""},{"n":"表演","v":"/class/表演"},{"n":"播报","v":"/class/播报"},{"n":"访谈","v":"/class/访谈"},{"n":"体验","v":"/class/体验"},{"n":"养成","v":"/class/养成"},{"n":"游戏","v":"/class/游戏"},{"n":"亲子","v":"/class/亲子"},{"n":"美食","v":"/class/美食"},{"n":"情感","v":"/class/情感"},{"n":"选秀","v":"/class/选秀"},{"n":"益智","v":"/class/益智"},{"n":"晚会","v":"/class/晚会"},{"n":"音乐","v":"/class/音乐"},{"n":"文化","v":"/class/文化"},{"n":"喜剧","v":"/class/喜剧"},{"n":"曲艺","v":"/class/曲艺"},{"n":"职场","v":"/class/职场"},{"n":"脱口秀","v":"/class/脱口秀"},{"n":"文艺","v":"/class/文艺"},{"n":"竞技","v":"/class/竞技"},{"n":"潮流文化","v":"/class/潮流文化"},{"n":"体育","v":"/class/体育"},{"n":"资讯","v":"/class/资讯"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"dm":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/中国大陆"},{"n":"中国香港","v":"/area/中国香港"},{"n":"中国台湾","v":"/area/中国台湾"},{"n":"美国","v":"/area/美国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"}]},{"key":"class","name":"分类","value":[{"n":"全部","v":""},{"n":"热门","v":"/class/热门"},{"n":"搞笑","v":"/class/搞笑"},{"n":"番剧","v":"/class/番剧"},{"n":"国创","v":"/class/国创"},{"n":"大电影","v":"/class/大电影"},{"n":"热血","v":"/class/热血"},{"n":"催泪","v":"/class/催泪"},{"n":"励志","v":"/class/励志"},{"n":"机战","v":"/class/机战"},{"n":"格斗","v":"/class/格斗"},{"n":"恋爱","v":"/class/恋爱"},{"n":"科幻","v":"/class/科幻"},{"n":"奇幻","v":"/class/奇幻"},{"n":"魔幻","v":"/class/魔幻"},{"n":"推理","v":"/class/推理"},{"n":"校园","v":"/class/校园"},{"n":"日常","v":"/class/日常"},{"n":"经典","v":"/class/经典"},{"n":"历史","v":"/class/历史"},{"n":"美食","v":"/class/美食"},{"n":"武侠","v":"/class/武侠"},{"n":"玄幻","v":"/class/玄幻"},{"n":"竞技","v":"/class/竞技"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"jl":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国大陆","v":"/area/中国大陆"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"国外","v":"/area/国外"},{"n":"其他","v":"/area/其他"}]},{"key":"class","name":"分类","value":[{"n":"全部","v":""},{"n":"社会","v":"/class/社会"},{"n":"动物","v":"/class/动物"},{"n":"文化","v":"/class/文化"},{"n":"自然","v":"/class/自然"},{"n":"人文","v":"/class/人文"},{"n":"军事","v":"/class/军事"},{"n":"历史","v":"/class/历史"},{"n":"记录","v":"/class/记录"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
|
||||
},
|
||||
// searchUrl:'/ch.html?wd=**',
|
||||
searchUrl: '/ch/page/fypage/wd/**.html',
|
||||
searchable: 2,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
// class_name: '电影&电视剧&动漫&综艺&纪录片',//静态分类名称拼接
|
||||
// class_url: 'dy&tv&dm&zy&jl',//静态分类标识拼接
|
||||
class_parse: '.vi-nav.swiper-wrapper&&li:gt(0):lt(6);a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: `js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
limit: 5,
|
||||
推荐: '.dx-top;li;a&&title;a&&data-original;.vod_remarks&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: 'ul.dx-list li;a&&title;a&&data-original;.vod_remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1--span&&Text;",
|
||||
"img": ".picHover&&img&&src",
|
||||
"desc": ";;;.video-info-item:eq(0)&&Text;.item-tags&&Text",
|
||||
"content": ".vod_content&&Text",
|
||||
"tabs": ".play-title h2",
|
||||
"lists": ".play_li.fn-clear:eq(#id) a"
|
||||
},
|
||||
搜索: '*',
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
var rule = {
|
||||
title:'碟调影视',
|
||||
host:'http://www.618648.com',
|
||||
// homeUrl:'/',
|
||||
url:'/die-tiao/fyclass-fypage.html',
|
||||
searchUrl:'/diediaoch/page/fypage/wd/**.html',
|
||||
searchable:2,//是否启用全局搜索,
|
||||
quickSearch:0,//是否启用快速搜索,
|
||||
filterable:0,//是否启用分类筛选,
|
||||
headers:{//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent':'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
//class_parse:'.stui-header__menu li.hidden-xs;a&&Text;a&&href;.*/(.*?).html',
|
||||
class_name:'电影&电视剧&综艺&动漫',
|
||||
class_url:'1&2&3&4',
|
||||
play_parse:true,
|
||||
lazy:'',
|
||||
limit:8,
|
||||
推荐:'.stui-vodlist.clearfix;.stui-vodlist__box;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
double:true, // 推荐内容是否双层定位
|
||||
一级:'.stui-vodlist.clearfix li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级:{"title":"h1.title&&Text;.stui-content__detail p:eq(2)&&Text","img":".lazyload&&data-original","desc":".video-info-items:eq(-2)&&Text;.video-info-items:eq(-1)&&Text;.video-info-items:eq(-2)&&Text;.stui-content__detail p:eq(7)&&Text;.stui-content__detail p:eq(6)&&Text","content":".stui-content__detail p:eq(9)&&Text","tabs":".nav.nav-tabs li","lists":".tab-pane.fade:eq(#id)&&ul&&li"},
|
||||
搜索:'.stui-vodlist.clearfix li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
var rule = {
|
||||
title:'磁力熊[磁]',
|
||||
host:'https://www.cilixiong.com',
|
||||
homeUrl:'/top250/index.html',
|
||||
// url: '/fyclass/index_(fypage-1).html',
|
||||
url: '/fyclassfyfilter-(fypage-1).html',
|
||||
filter_url:'-{{fl.class or "0"}}-{{fl.area or "0"}}',
|
||||
filter:{
|
||||
"1":[{"key":"class","name":"类型","value":[{"n":"全部","v":"0"},{"n":"剧情","v":"1"},{"n":"喜剧","v":"2"},{"n":"惊悚","v":"3"},{"n":"动作","v":"4"},{"n":"爱情","v":"5"},{"n":"犯罪","v":"6"},{"n":"恐怖","v":"7"},{"n":"冒险","v":"8"},{"n":"悬疑","v":"9"},{"n":"科幻","v":"10"},{"n":"家庭","v":"11"},{"n":"奇幻","v":"12"},{"n":"动画","v":"13"},{"n":"战争","v":"14"},{"n":"历史","v":"15"},{"n":"传记","v":"16"},{"n":"音乐","v":"17"},{"n":"歌舞","v":"18"},{"n":"运动","v":"19"},{"n":"西部","v":"20"},{"n":"灾难","v":"21"},{"n":"古装","v":"22"},{"n":"情色","v":"23"},{"n":"同性","v":"24"},{"n":"儿童","v":"25"},{"n":"纪录片","v":"26"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"0"},{"n":"大陆","v":"1"},{"n":"香港","v":"2"},{"n":"台湾","v":"3"},{"n":"美国","v":"4"},{"n":"日本","v":"5"},{"n":"韩国","v":"6"},{"n":"英国","v":"7"},{"n":"法国","v":"8"},{"n":"德国","v":"9"},{"n":"印度","v":"10"},{"n":"泰国","v":"11"},{"n":"丹麦","v":"12"},{"n":"瑞典","v":"13"},{"n":"巴西","v":"14"},{"n":"加拿大","v":"15"},{"n":"俄罗斯","v":"16"},{"n":"意大利","v":"17"},{"n":"比利时","v":"18"},{"n":"爱尔兰","v":"19"},{"n":"西班牙","v":"20"},{"n":"澳大利亚","v":"21"},{"n":"波兰","v":"22"},{"n":"土耳其","v":"23"},{"n":"越南","v":"24"}]}],
|
||||
"2":[{"key":"class","name":"类型","value":[{"n":"全部","v":"0"},{"n":"剧情","v":"1"},{"n":"喜剧","v":"2"},{"n":"惊悚","v":"3"},{"n":"动作","v":"4"},{"n":"爱情","v":"5"},{"n":"犯罪","v":"6"},{"n":"恐怖","v":"7"},{"n":"冒险","v":"8"},{"n":"悬疑","v":"9"},{"n":"科幻","v":"10"},{"n":"家庭","v":"11"},{"n":"奇幻","v":"12"},{"n":"动画","v":"13"},{"n":"战争","v":"14"},{"n":"历史","v":"15"},{"n":"传记","v":"16"},{"n":"音乐","v":"17"},{"n":"歌舞","v":"18"},{"n":"运动","v":"19"},{"n":"西部","v":"20"},{"n":"灾难","v":"21"},{"n":"古装","v":"22"},{"n":"情色","v":"23"},{"n":"同性","v":"24"},{"n":"儿童","v":"25"},{"n":"纪录片","v":"26"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":"0"},{"n":"大陆","v":"1"},{"n":"香港","v":"2"},{"n":"台湾","v":"3"},{"n":"美国","v":"4"},{"n":"日本","v":"5"},{"n":"韩国","v":"6"},{"n":"英国","v":"7"},{"n":"法国","v":"8"},{"n":"德国","v":"9"},{"n":"印度","v":"10"},{"n":"泰国","v":"11"},{"n":"丹麦","v":"12"},{"n":"瑞典","v":"13"},{"n":"巴西","v":"14"},{"n":"加拿大","v":"15"},{"n":"俄罗斯","v":"16"},{"n":"意大利","v":"17"},{"n":"比利时","v":"18"},{"n":"爱尔兰","v":"19"},{"n":"西班牙","v":"20"},{"n":"澳大利亚","v":"21"},{"n":"波兰","v":"22"},{"n":"土耳其","v":"23"},{"n":"越南","v":"24"}]}]
|
||||
},
|
||||
searchUrl: '/e/search/index.php#classid=1,2&show=title&tempid=1&keyboard=**;post',
|
||||
searchable:2,
|
||||
quickSearch:0,
|
||||
filterable:1,
|
||||
headers:{
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout:5000,
|
||||
class_name:'电影&剧集&豆瓣电影Top250&IMDB Top250&高分悬疑片&高分喜剧片&高分传记片&高分爱情片&高分犯罪片&高分恐怖片&高分冒险片&高分武侠片&高分奇幻片&高分历史片&高分战争片&高分歌舞片&高分灾难片&高分情色片&高分西部片&高分音乐片&高分科幻片&高分动作片&高分动画片&高分纪录片&冷门佳片',
|
||||
class_url:'1&2&/top250/&/s/imdbtop250/&/s/suspense/&/s/comedy/&/s/biopic/&/s/romance/&/s/crime/&/s/horror/&/s/adventure/&/s/martial/&/s/fantasy/&/s/history/&/s/war/&/s/musical/&/s/disaster/&/s/erotic/&/s/west/&/s/music/&/s/sci-fi/&s/action/&/s/animation/&/s/documentary/&/s/unpopular/',
|
||||
play_parse:true,
|
||||
lazy:'',
|
||||
limit:6,
|
||||
推荐: `js:
|
||||
pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;
|
||||
var d = [];
|
||||
var html = request(input);
|
||||
var list = pdfa(html, 'body&&.col');
|
||||
list.forEach(it => {
|
||||
d.push({
|
||||
title: pdfh(it, 'h2&&Text'),
|
||||
desc: pdfh(it, '.me-auto&&Text') + '分 / ' + pdfh(it, '.small&&Text'),
|
||||
// pic_url: pd(it, '.card-img&&style'), // 只有 影视TV&爱佬版 有图片
|
||||
pic_url: /!'/.test(pd(it, '.card-img&&style'))?pd(it, '.card-img&&style'):pd(it, '.card-img&&style').replaceAll("'",""), // 兼容 影视TV&爱佬版 以外的其它壳子
|
||||
url: pd(it, 'a&&href')
|
||||
});
|
||||
})
|
||||
setResult(d);
|
||||
`,
|
||||
一级: `js:
|
||||
pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;
|
||||
var d = [];
|
||||
if (MY_CATE !== '1' && MY_CATE !== '2') {
|
||||
let turl = (MY_PAGE === 1)? 'index' : 'index_'+ MY_PAGE;
|
||||
input = HOST + MY_CATE + turl + '.html';
|
||||
}
|
||||
var html = request(input);
|
||||
var list = pdfa(html, 'body&&.col');
|
||||
list.forEach(it => {
|
||||
d.push({
|
||||
title: pdfh(it, 'h2&&Text'),
|
||||
desc: pdfh(it, '.me-auto&&Text') + '分 / ' + pdfh(it, '.small&&Text'),
|
||||
// pic_url: pdfh(it, '.card-img&&style'), // 只有 影视TV&爱佬版 有图片
|
||||
pic_url: /!'/.test(pd(it, '.card-img&&style'))?pd(it, '.card-img&&style'):pd(it, '.card-img&&style').replaceAll("'",""), // 兼容 影视TV&爱佬版 以外的其它壳子
|
||||
url: pd(it, 'a&&href')
|
||||
});
|
||||
})
|
||||
setResult(d);
|
||||
`,
|
||||
二级:{
|
||||
title:'h1&&Text;p.mb-2:eq(4)&&Text',
|
||||
desc:'p.mb-2:eq(1)&&Text;;;p.mb-2:eq(7)&&Text;p.mb-2:eq(5)&&Text',
|
||||
img:'.rounded-2&&src',
|
||||
content:'.mv_card_box&&Text',
|
||||
// tabs:'js:TABS = ["道长磁力"]',
|
||||
// lists:'.mv_down:eq(#id)&&.border-bottom',
|
||||
// list_text:'a&&Text',
|
||||
// list_url:'a&&href',
|
||||
|
||||
tabs:'js:TABS = ["道长磁力","道长在线预览"]',
|
||||
lists:`js:
|
||||
log(TABS);
|
||||
pdfh=jsp.pdfh;pdfa=jsp.pdfa;pd=jsp.pd;
|
||||
LISTS = [];
|
||||
var dd=[];
|
||||
TABS.forEach(function(tab) {
|
||||
if (/道长磁力/.test(tab)) {
|
||||
var d = pdfa(html, '.mv_down&&.border-bottom');
|
||||
d = d.map(function(it) {
|
||||
var title = pdfh(it, 'a&&Text');
|
||||
log('title >>>>>>>>>>>>>>>>>>>>>>>>>>' + title);
|
||||
var burl = pd(it, 'a&&href');
|
||||
log('burl >>>>>>>>>>>>>>>>>>>>>>>>>>' + burl);
|
||||
return title + '$' + burl
|
||||
});
|
||||
LISTS.push(d)
|
||||
} else if (/道长在线预览/.test(tab)) {
|
||||
var d = pd(html, 'iframe&&src');
|
||||
if (d) {
|
||||
d=['第一集在线播放预览$' + d]
|
||||
} else {
|
||||
d=['没有预览不要点$http://www.sharenice.net/douyin/23852']
|
||||
}
|
||||
LISTS.push(d)
|
||||
}
|
||||
});
|
||||
`,
|
||||
},
|
||||
搜索:'.col;h2&&Text;.card-img&&style;.me-auto&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
var rule = {
|
||||
title: '腾云驾雾[官]',
|
||||
host: 'https://v.%71%71.com',
|
||||
// homeUrl: '/x/bu/pagesheet/list?_all=1&append=1&channel=choice&listpage=1&offset=0&pagesize=21&iarea=-1&sort=18',
|
||||
homeUrl: '/x/bu/pagesheet/list?_all=1&append=1&channel=cartoon&listpage=1&offset=0&pagesize=21&iarea=-1&sort=18',
|
||||
detailUrl: 'https://node.video.%71%71.com/x/api/float_vinfo2?cid=fyid',
|
||||
searchUrl: '/x/search/?q=**&stag=fypage',
|
||||
searchable: 2,
|
||||
filterable: 1,
|
||||
multi: 1,
|
||||
// url:'/channel/fyclass?listpage=fypage&channel=fyclass&sort=18&_all=1',
|
||||
url: '/x/bu/pagesheet/list?_all=1&append=1&channel=fyclass&listpage=1&offset=((fypage-1)*21)&pagesize=21&iarea=-1',
|
||||
// filter_url: 'sort={{fl.sort or 18}}&year={{fl.year}}&pay={{fl.pay}}',
|
||||
filter_url: 'sort={{fl.sort or 75}}&year={{fl.year}}&pay={{fl.pay}}',
|
||||
filter: 'H4sIAAAAAAAAA+2UzUrDQBCA32XOEZLUJrGvIj0saaDBNisxBkIJCG3Fi4oepIg3EQoieqiH+vM23Zq+hRuaZLZ4ce9z2/lmd2d2+NgR+H0e+gF0DkdwFGTQgRMeJ2BAxIaSwvrqVnxcyzhlg9PttqjED2c/45cSy8DyIDcavr57q/lBw8XTd/E6qbnT8M3zTFyc72RtC/Jumd+2c8wy7KZ4nxSL5Z9uxHS+Gc+r83sWVp1eVttl4Dluk1h93YubWZVwduplAYuxoFguVp+P/y5om/Z+/YxyqfAW8pbKbeS2yi3kO/ebyE2Fy1nXXBm7DDzknspd5K7KHeSOytvI2+XAugYkKWlD2mhrM+RpSB8OmaNvTsriMEgycofc0XbHZ3HCeUTukDv67vTDQY/MIXO0zelxn5M4JI6mOPkvgswSEpgPAAA=',
|
||||
headers: {
|
||||
'User-Agent': 'PC_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
// class_parse:'.site_channel a;a&&Text;a&&href;channel/(.*)',
|
||||
cate_exclude: '会员|游戏|全部',
|
||||
class_name: '精选&电视剧&电影&综艺&动漫&少儿&纪录片',
|
||||
class_url: 'choice&tv&movie&variety&cartoon&child&doco',
|
||||
limit: 20,
|
||||
// play_parse:true,
|
||||
// 手动调用解析请求json的url,此lazy不方便
|
||||
lazy: 'js:input="https://cache.json.icu/home/api?type=ys&uid=292796&key=fnoryABDEFJNPQV269&url="+input.split("?")[0];log(input);let html=JSON.parse(request(input));log(html);input=html.url||input',
|
||||
推荐: '.list_item;img&&alt;img&&src;a&&Text;a&&data-float',
|
||||
一级: '.list_item;img&&alt;img&&src;a&&Text;a&&data-float',
|
||||
二级: $js.toString(() => {
|
||||
VOD = {};
|
||||
let d = [];
|
||||
let video_list = [];
|
||||
let video_lists = [];
|
||||
let list = [];
|
||||
let QZOutputJson;
|
||||
let html = fetch(input, fetch_params);
|
||||
let sourceId = /get_playsource/.test(input) ? input.match(/id=(\d*?)&/)[1] : input.split("cid=")[1];
|
||||
let cid = sourceId;
|
||||
let detailUrl = "https://v.%71%71.com/detail/m/" + cid + ".html";
|
||||
log("详情页:" + detailUrl);
|
||||
pdfh = jsp.pdfh;
|
||||
pd = jsp.pd;
|
||||
try {
|
||||
let json = JSON.parse(html);
|
||||
VOD = {
|
||||
vod_url: input,
|
||||
vod_name: json.c.title,
|
||||
type_name: json.typ.join(","),
|
||||
vod_actor: json.nam.join(","),
|
||||
vod_year: json.c.year,
|
||||
vod_content: json.c.description,
|
||||
vod_remarks: json.rec,
|
||||
vod_pic: urljoin2(input, json.c.pic)
|
||||
}
|
||||
} catch (e) {
|
||||
log("解析片名海报等基础信息发生错误:" + e.message)
|
||||
}
|
||||
if (/get_playsource/.test(input)) {
|
||||
eval(html);
|
||||
let indexList = QZOutputJson.PlaylistItem.indexList;
|
||||
indexList.forEach(function (it) {
|
||||
let dataUrl = "https://s.video.qq.com/get_playsource?id=" + sourceId + "&plat=2&type=4&data_type=3&range=" + it + "&video_type=10&plname=qq&otype=json";
|
||||
eval(fetch(dataUrl, fetch_params));
|
||||
let vdata = QZOutputJson.PlaylistItem.videoPlayList;
|
||||
vdata.forEach(function (item) {
|
||||
d.push({
|
||||
title: item.title,
|
||||
pic_url: item.pic,
|
||||
desc: item.episode_number + "\t\t\t播放量:" + item.thirdLine,
|
||||
url: item.playUrl
|
||||
})
|
||||
});
|
||||
video_lists = video_lists.concat(vdata)
|
||||
})
|
||||
} else {
|
||||
let json = JSON.parse(html);
|
||||
video_lists = json.c.video_ids;
|
||||
let url = "https://v.qq.com/x/cover/" + sourceId + ".html";
|
||||
if (video_lists.length === 1) {
|
||||
let vid = video_lists[0];
|
||||
url = "https://v.qq.com/x/cover/" + cid + "/" + vid + ".html";
|
||||
d.push({
|
||||
title: "在线播放",
|
||||
url: url
|
||||
})
|
||||
} else if (video_lists.length > 1) {
|
||||
for (let i = 0; i < video_lists.length; i += 30) {
|
||||
video_list.push(video_lists.slice(i, i + 30))
|
||||
}
|
||||
video_list.forEach(function (it, idex) {
|
||||
let o_url = "https://union.video.qq.com/fcgi-bin/data?otype=json&tid=1804&appid=20001238&appkey=6c03bbe9658448a4&union_platform=1&idlist=" + it.join(",");
|
||||
let o_html = fetch(o_url, fetch_params);
|
||||
eval(o_html);
|
||||
QZOutputJson.results.forEach(function (it1) {
|
||||
it1 = it1.fields;
|
||||
let url = "https://v.qq.com/x/cover/" + cid + "/" + it1.vid + ".html";
|
||||
d.push({
|
||||
title: it1.title,
|
||||
pic_url: it1.pic160x90.replace("/160", ""),
|
||||
desc: it1.video_checkup_time,
|
||||
url: url,
|
||||
type: it1.category_map && it1.category_map.length > 1 ? it1.category_map[1] : ""
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
let yg = d.filter(function (it) {
|
||||
return it.type && it.type !== "正片"
|
||||
});
|
||||
let zp = d.filter(function (it) {
|
||||
return !(it.type && it.type !== "正片")
|
||||
});
|
||||
VOD.vod_play_from = yg.length < 1 ? "qq" : "qq$$$qq 预告及花絮";
|
||||
VOD.vod_play_url = yg.length < 1 ? d.map(function (it) {
|
||||
return it.title + "$" + it.url
|
||||
}).join("#") : [zp, yg].map(function (it) {
|
||||
return it.map(function (its) {
|
||||
return its.title + "$" + its.url
|
||||
}).join("#")
|
||||
}).join("$$$");
|
||||
}),
|
||||
搜索: $js.toString(() => {
|
||||
let d = [];
|
||||
pdfa = jsp.pdfa;
|
||||
pdfh = jsp.pdfh;
|
||||
pd = jsp.pd;
|
||||
let html = request(input);
|
||||
let baseList = pdfa(html, "body&&.result_item_v");
|
||||
baseList.forEach(function (it) {
|
||||
let longText = pdfh(it, ".result_title&&a&&Text");
|
||||
let shortText = pdfh(it, ".type&&Text");
|
||||
let fromTag = pdfh(it, ".result_source&&Text");
|
||||
let score = pdfh(it, ".figure_info&&Text");
|
||||
let content = pdfh(it, ".desc_text&&Text");
|
||||
let url = pdfh(it, ".result_title&&a&&href");
|
||||
let img = pd(it, ".figure_pic&&src");
|
||||
url = "https://node.video.qq.com/x/api/float_vinfo2?cid=" + url.match(/.*\/(.*?)\.html/)[1];
|
||||
log(shortText + "|" + url);
|
||||
if (fromTag.match(/腾讯/)) {
|
||||
d.push({
|
||||
title: longText.split(shortText)[0],
|
||||
img: img,
|
||||
url: url,
|
||||
content: content,
|
||||
desc: shortText + " " + score
|
||||
})
|
||||
}
|
||||
});
|
||||
setResult(d);
|
||||
}),
|
||||
}
|
||||
@@ -0,0 +1,168 @@
|
||||
var rule = {
|
||||
title: '百忙无果[官]',
|
||||
host: 'https://pianku.api.%6d%67%74%76.com',
|
||||
homeUrl: '',
|
||||
searchUrl: 'https://mobileso.bz.%6d%67%74%76.com/pc/search/v1?q=**&pn=fypage&pc=10',
|
||||
detailUrl: 'https://pcweb.api.mgtv.com/episode/list?page=1&size=50&video_id=fyid',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable: 1,
|
||||
multi: 1,
|
||||
// 分类链接fypage参数支持1个()表达式
|
||||
// https://www.mgtv.com/lib/3?lastp=list_index&kind=a1&year=all&chargeInfo=a1&sort=c2
|
||||
url: '/rider/list/pcweb/v3?platform=pcweb&channelId=fyclass&pn=fypage&pc=80&hudong=1&_support=10000000&kind=a1&area=a1',
|
||||
filter_url: 'year={{fl.year or "all"}}&sort={{fl.sort or "all"}}&chargeInfo={{fl.chargeInfo or "all"}}',
|
||||
headers: {
|
||||
'User-Agent': 'PC_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_name: '电视剧&电影&综艺&动漫&纪录片&教育&少儿',
|
||||
class_url: '2&3&1&50&51&115&10',
|
||||
filter: 'H4sIAAAAAAAAA+2XvUrDUBSA3+XOHc65adraN+jm5CIdYok/GFupWiilIBalIFYoIh1EBxEKIih0MOZ1msS+hbc1yTni4mKms6XfIbnnC/mG9hSq6mZP7btdVVWNXae949aa2y1VUE3nwDVsHkw+Z378FoT3l4Z2HO/EXd3SNMPwfLoYTJfY/HA8T/UL6eDK3JUMtjDjnb3DFOoMbtTW45tpOHxPR1Y2Sk4/86PxSzotqn59Of/e+ajVPqZto9E4/Lj+tWd0dxrdviYPaNA6hseD9MEN2ih+eJr7o8XzJBxepNOfx3Zdp03Hhv5sHjz+/fVo0MUEry4Zt4hbnGvimnMkjpwDcWAc1zJuLhmvEK9wXiZe5rxEvMS5TdzmnHyR+yL5IvdF8kXui+SL3BfJF7kvkC9wXyBf4L5AvsB9gXyB+wL5AvcF8oXVl1MvKC2pSWqSWh6pWZKapCap5ZGaDdKatCat5dKa/FuT1qS1XFpD80YkNolNYvv32PpfCLkneIcUAAA=',
|
||||
limit: 20,
|
||||
play_parse: true,
|
||||
// 手动调用解析请求json的url,此lazy不方便
|
||||
// lazy:'js:print(input);fetch_params.headers["user-agent"]=MOBILE_UA;let html=request(input);let rurl=html.match(/window\\.open\\(\'(.*?)\',/)[1];rurl=urlDeal(rurl);input={parse:1,url:rurl};',
|
||||
// 推荐:'.list_item;img&&alt;img&&src;a&&Text;a&&data-float',
|
||||
一级: 'json:data.hitDocs;title;img;updateInfo||rightCorner.text;playPartId',
|
||||
// 一级:'json:data.hitDocs;title;img;updateInfo;playPartId',
|
||||
二级: $js.toString(() => {
|
||||
fetch_params.headers.Referer = "https://www.mgtv.com";
|
||||
fetch_params.headers["User-Agent"] = UA;
|
||||
pdfh = jsp.pdfh;
|
||||
pdfa = jsp.pdfa;
|
||||
pd = jsp.pd;
|
||||
VOD = {};
|
||||
let d = [];
|
||||
let html = request(input);
|
||||
let json = JSON.parse(html);
|
||||
let host = "https://www.mgtv.com";
|
||||
let ourl = json.data.list.length > 0 ? json.data.list[0].url : json.data.series[0].url;
|
||||
if (!/^http/.test(ourl)) {
|
||||
ourl = host + ourl
|
||||
}
|
||||
fetch_params.headers["User-Agent"] = MOBILE_UA;
|
||||
html = request(ourl);
|
||||
if (html.includes("window.location =")) {
|
||||
print("开始获取ourl");
|
||||
ourl = pdfh(html, "meta[http-equiv=refresh]&&content").split("url=")[1];
|
||||
print("获取到ourl:" + ourl);
|
||||
html = request(ourl)
|
||||
}
|
||||
try {
|
||||
let details = pdfh(html, ".m-details&&Html").replace(/h1>/, "h6>").replace(/div/g, "br");
|
||||
print(details);
|
||||
let actor = "",
|
||||
director = "",
|
||||
time = "";
|
||||
if (/播出时间/.test(details)) {
|
||||
actor = pdfh(html, "p:eq(5)&&Text").substr(0, 25);
|
||||
director = pdfh(html, "p:eq(4)&&Text");
|
||||
time = pdfh(html, "p:eq(3)&&Text")
|
||||
} else {
|
||||
actor = pdfh(html, "p:eq(4)&&Text").substr(0, 25);
|
||||
director = pdfh(html, "p:eq(3)&&Text");
|
||||
time = "已完结"
|
||||
}
|
||||
let _img = pd(html, ".video-img&&img&&src");
|
||||
let JJ = pdfh(html, ".desc&&Text").split("简介:")[1];
|
||||
let _desc = time;
|
||||
VOD.vod_name = pdfh(html, ".vt-txt&&Text");
|
||||
VOD.type_name = pdfh(html, "p:eq(0)&&Text").substr(0, 6);
|
||||
VOD.vod_area = pdfh(html, "p:eq(1)&&Text");
|
||||
VOD.vod_actor = actor;
|
||||
VOD.vod_director = director;
|
||||
VOD.vod_remarks = _desc;
|
||||
VOD.vod_pic = _img;
|
||||
VOD.vod_content = JJ;
|
||||
if (!VOD.vod_name) {
|
||||
VOD.vod_name = VOD.type_name;
|
||||
}
|
||||
} catch (e) {
|
||||
log("获取影片信息发生错误:" + e.message)
|
||||
}
|
||||
|
||||
function getRjpg(imgUrl, xs) {
|
||||
xs = xs || 3;
|
||||
let picSize = /jpg_/.test(imgUrl) ? imgUrl.split("jpg_")[1].split(".")[0] : false;
|
||||
let rjpg = false;
|
||||
if (picSize) {
|
||||
let a = parseInt(picSize.split("x")[0]) * xs;
|
||||
let b = parseInt(picSize.split("x")[1]) * xs;
|
||||
rjpg = a + "x" + b + ".jpg"
|
||||
}
|
||||
let img = /jpg_/.test(imgUrl) && rjpg ? imgUrl.replace(imgUrl.split("jpg_")[1], rjpg) : imgUrl;
|
||||
return img
|
||||
}
|
||||
|
||||
if (json.data.total === 1 && json.data.list.length === 1) {
|
||||
let data = json.data.list[0];
|
||||
let url = "https://www.mgtv.com" + data.url;
|
||||
d.push({
|
||||
title: data.t4,
|
||||
desc: data.t2,
|
||||
pic_url: getRjpg(data.img),
|
||||
url: url
|
||||
})
|
||||
} else if (json.data.list.length > 1) {
|
||||
for (let i = 1; i <= json.data.total_page; i++) {
|
||||
if (i > 1) {
|
||||
json = JSON.parse(fetch(input.replace("page=1", "page=" + i), {}))
|
||||
}
|
||||
json.data.list.forEach(function (data) {
|
||||
let url = "https://www.mgtv.com" + data.url;
|
||||
if (data.isIntact == "1") {
|
||||
d.push({
|
||||
title: data.t4,
|
||||
desc: data.t2,
|
||||
pic_url: getRjpg(data.img),
|
||||
url: url
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
} else {
|
||||
print(input + "暂无片源")
|
||||
}
|
||||
VOD.vod_play_from = "mgtv";
|
||||
VOD.vod_play_url = d.map(function (it) {
|
||||
return it.title + "$" + it.url
|
||||
}).join("#");
|
||||
setResult(d);
|
||||
}),
|
||||
|
||||
搜索: $js.toString(() => {
|
||||
fetch_params.headers.Referer = "https://www.mgtv.com";
|
||||
fetch_params.headers["User-Agent"] = UA;
|
||||
let d = [];
|
||||
let html = request(input);
|
||||
let json = JSON.parse(html);
|
||||
json.data.contents.forEach(function (data) {
|
||||
if (data.data.sourceList || data.data.yearList) {
|
||||
let list = data.data.sourceList ? data.data.sourceList : data.data.yearList[0].sourceList;
|
||||
let desc = "";
|
||||
list.forEach(function (it) {
|
||||
desc += it.name + "\t"
|
||||
});
|
||||
let fyclass = '';
|
||||
if (list[0].source === "imgo") {
|
||||
let img = data.data.pic ? data.data.pic : data.data.yearList[0].pic;
|
||||
try {
|
||||
fyclass = data.data.desc.find(it => it.label === '类型').url.match(/lib\/(\d+)/)[1] + '$';
|
||||
} catch (e) {
|
||||
fyclass = '';
|
||||
}
|
||||
log(fyclass);
|
||||
d.push({
|
||||
title: data.data.title ? data.data.title : data.data.yearList[0].title,
|
||||
img: img,
|
||||
content: data.data.story ? data.data.story : data.data.yearList[0].story,
|
||||
desc: data.data.playTime,
|
||||
url: fyclass + list[0].vid
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
setResult(d);
|
||||
}),
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
var rule = {
|
||||
title: '花子动漫[漫]',
|
||||
host: 'https://www.huazidm.com',
|
||||
class_name: 'TV动漫&剧场&特摄',
|
||||
class_url: '1&2&3',
|
||||
searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
url: '/index.php/api/vod#type=fyclassfyfilter&page=fypage',
|
||||
filterable: 0,
|
||||
filter_url: '&class={{fl.class}}&year={{fl.year}}&letter={{fl.letter}}&by={{fl.by}}',
|
||||
filter: 'H4sIAAAAAAAAA+2W204TURSG32WuMdnT0nbDnZzP57PhopImEhETWk0IIUFOloNQDLSigGJCLCIWhJCWgr4MM9O+hdPO2mstDzE10cSYudv/989u55t0uteUpmuVd6a0+6FJrVIbGQuGw1qZNh58ELKjdZo19lbs/Dg49ihUvG7cxsZCMj+XLGA7aNNlQK9mb9Jxa2sVCsrqCmv7sxGLQg0Bd8fWjI9HaqsTcN/ccW5/Ru1zAnaXKSt6qjonYHf4JXexrDon4PcdPDUyWfV9TlCdGX1hxhPQQSjlPs3YnvVhQ+1zAnaJAyOdVp0T8D7fbdC9QMB9n7LmvHpmELB7s2+8OladE7B7skLPBQI6LD7Pbx8qByfgvrWkFVtU+5yA3c6l/TRU5wTV5V+f3WRi0EFQXS62m1tbgg4C3WfMnInjfRYDdnPL5uxL1TkBu7P9/O5ba+u9qjHjFem0GV03NzPqCsz4HE7Wc6lzuoIyfsbVkbWZZZ+BGd0WlHRhNT1c4M67NBkKTtCrZGTOb7LXJb5KHuEpB1ZcMu4l7uXcQ9zDuU5c51wQF4zrFcjtJeOSuOQ8QDzAuZ+4n3MfcR/n5KtzX518de6rk6/OfXXy1bmvTr469xXkK7ivIF/BfQX5Cu4ryFdwX0G+gvsK8hXcV5Cv4L6CfAX3FeQruK8gX0G+ekWF8i0uGZfEJecB4gHO/cT9nPuI+zgvJ17OuZe4l3MPcQ/nOnGdc0Gc+0ryldxXkq/kvpJ8JfeV5Cu5ryRfyX0l+UruK8lXcl9JvpL7SvKV3FeSr73kfztjoUgkxP94jhNm6lmJfzy3AdxGUgWkCkk1kGokNUBqkNQCqUVSB6QOST2QeiQNQBqQNAJpRNIEpAlJM5BmJC1AWpC0AmlF0gakDUk7kHYkHUA6kHQC6UTSBaQLSTeQbiQ9QHqQ9ALpRdIHpA9JP5B+JANABpAMAhlEMgRkCIm4pd6Bwor/VO5O0s/ETFzkE+c//EzM1SVzZ8aMn8BHREbtq/F0LJb2QAblvdFImJe51LwRVbNEeOThRKjw9cNlmuefGDl/OVb+hdHxvxgPf3cEdAcidyByByK1dAcidyByByJ3IPp+IPL+qYFoOXlzvaOObieUMrb8dMRwj2736HaPbrV0j2736HaPbvfo/vbonv4K+TrlXkAbAAA=',
|
||||
filter_def: {},
|
||||
detailUrl: '/voddetail/fyid.html',
|
||||
play_parse: true,
|
||||
sniffer: 1,
|
||||
is_video: 'obj/tos|bd.xhscdn|/ugc/',
|
||||
lazy: $js.toString(() => {
|
||||
input = {
|
||||
parse: 1,
|
||||
url: input,
|
||||
//js:'try{let urls=Array.from(document.querySelectorAll("iframe")).filter(x=>x.src.includes("?url="));if(urls){location.href=urls[0].src}}catch{}document.querySelector("button").click()',
|
||||
js: 'try{location.href=document.querySelector("#playleft iframe").src}catch{}document.querySelector("button.swal-button--confirm").click()',
|
||||
parse_extra: '&is_pc=1&custom_regex=' + rule.is_video,
|
||||
}
|
||||
}),
|
||||
limit: 6,
|
||||
推荐: '.list-vod.flex .public-list-box;a&&title;.lazy&&data-original;.public-list-prb&&Text;a&&href',
|
||||
一级: $js.toString(() => {
|
||||
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',
|
||||
搜索: $js.toString(() => {
|
||||
let html = fetch(input);
|
||||
let list = pdfa(html, ".public-list-box");
|
||||
VODS = list.map(x => {
|
||||
return {
|
||||
vod_name: pdfh(x, ".thumb-txt&&Text"),
|
||||
vod_pic: pdfh(x, ".lazy&&data-src"),
|
||||
vod_remarks: pdfh(x, ".public-list-prb&&Text"),
|
||||
vod_content: pdfh(x, ".thumb-blurb&&Text"),
|
||||
vod_id: pdfh(x, "a&&href")
|
||||
}
|
||||
});
|
||||
}),
|
||||
图片替换: '&=>&'
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
/**
|
||||
* 原创诺临风
|
||||
* 原创时间:2024-05-07
|
||||
* 转载请不要删除此版权声明
|
||||
*/
|
||||
|
||||
|
||||
var rule = {
|
||||
title: "新茶杯狐",
|
||||
host: "https://www.cbhfox.com/",
|
||||
url: "/chbys/fyfilter.html",
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable: 1,
|
||||
detailUrl: "/cbhtv/fyid.html",
|
||||
homeUrl: "/label/hot.html",
|
||||
filter_url: "{{fl.cateId}}{{fl.area}}{{fl.by}}{{fl.class}}{{fl.lang}}{{fl.letter}}/page/fypage{{fl.year}}",
|
||||
filter: 'H4sIAAAAAAAAA+2ZW1MaSRiG/wvXbjFjNse7nM/nc7ZyQbJUQtaQLdGtYlNWeYKgUVFKIa4Yk43nFUHjugiF/hlmgH+xDd180/MOVYyb1F71pe/z+k331+3wfvjW83PAFwwHgi88p3566/nFH/ac8jzv8oVCng5P0Pfaz340RlbMoQj7+TdfV6+/4QvW5chqbWi1LrMfPH0dQk2mmV+o3kYlr9CalkpsS9SzLEJrWsyBSbM/abcIjR40uloupeFBXKMHrUwZe0V4ENeoCu1NqsI1WkvsQ7kwAmvhWtNSzSwbY+t2i9BoLaPZSgksQpN2VJkuOnZU18iy9M6xI6HRcjPL5f1PsFyuUZVooja7BlW4RlU+rrM9QhWuHeKMzMGNSnIKLFwjy9CoOfgHWLhGrSvGjUgeWse1pqU2nzA/LNktQqMHJd9VRwrwIK5RX/Y3K9N/G6UtaA3JZIwvVr/greEaWSaiRnwbLFyjW3MwyY4Xbg3XrJNKm/NTeFINjSzDB5W/YOtCowaWpirFdKut2Ujf0/ov8FeAr9vvk94A6ZwxVnD7Blhcqc1Gm8+pF/KW8xljriQAndnyrJnPtvAJYDU7Z+7tt6rHAe1yf4KJNp+Q6IkLa+gQEh3J+y10CImuUWrJTG/YHEKybtE/WENIVONrDh1CohrjOaOwbK/BJavGjLPGjO0pw3HWcSO2ZjeRSnteOqjEM5WRWfu2SbVeT5/M9wfsl+3LIpV8kd1yMWk3cUm+YF0+9pFDF6yazVRX+91esLkS8zcfUC/kFZJ0jOgQEl2W7UV0CIkuS6pkjKfQZKnSpXKYuCRdGXQISTpMh4NL0qVy7JlLUtuNzSG7g0ty28N+X7f0d723Uy6WXLa9U+v8sVm+XsbbECR6BOkRmXYi7ZSpjlSXqYZUk6h+EigTJHoC6QmZHkd6XKbHkB6T6VGkR2WKvdLlXunYK13ulY690uVe6dgrXe6Vjr3S5V5p2CtN7pWGvdLkXmnYDU3uhobd0ORuaNgNJtjeBv6eHr98MTMpMzvu8mKepkvfqOI9TeQMkDNEzgI5S+QckHNEzgM5T+QCkAtELgK5SOQSkEtELgO5TOQKkCtErgK5SuQakGtErgO5TuQGkBtEbgK5SeQWkFtEbgO5TeQOkDtE7gK5S+QekHtE7gO5T+QBkAdEHgJ5SOQRkEdEHgN5TOQJkCdEtB9OAqsr8p/As7B1/c2JhFGIO66/mdqtpXaadZ6FvT0BZm8+olwomLlpib4M9ISsj8TssBGLSjT0/E23v76Cpx2NGTD0MvCq93sNge3zsYupigd4Y2DXGIq3ivaCHGLyNDZ3jUIGLFw73JzWbvJ0Mae5mDxdzBAuZqPy3mfHDCE0awiLmLNZOAyu0Vpmoo6BUGjSmOE4AKG1zoaiijMcfsv0EY0wvz19csn9FNBiMmk/k8A00n5OaD+vtJ8TXMwryRyL6Mb8Z3sZUlVq/8+pXSVulbhV4laJWyVulbgPm7h/fxN8EQ58W9y2XmC1/pHKSj9kZK7JEW94wRnxmEYL3jyo5mJ2i9CoSiJjjsKXzUKzPjcjZh4SqdCsD9+v5b1JWC7XpHBU+wLLFRpZCuvG5kewcI3WMrft/M6fa1RlesHcwf8RcY2q5PNmLF4uJBzf1tsItXHnT5bAoY1co4pbg9WBMajFtf8tBrM4yyKrPRVySUpALBNhhK1L5NhYYYdid3BJhUYVGlVoVKFRhUYVGlVo/F5f07LQ+Drok1KjSggqIaiEoBKCSggqIaiEoBLCq0BX768BX1BFBBURVERQEUFFBI+KCCoiqIjQjAh9/wLqgnhI8TMAAA==',
|
||||
filter_def: {
|
||||
dianying: {cateId: "dianying"},
|
||||
dianshiju: {cateId: "dianshiju"},
|
||||
zongyi: {cateId: "zongyi"},
|
||||
dongmna: {cateId: "dongmna"},
|
||||
jilupian: {cateId: "jilupian"},
|
||||
},
|
||||
class_name: "电影&剧集&动漫&综艺&记录片",
|
||||
class_url: "dianying&dianshiju&dongmna&zongyi&jilupian",
|
||||
headers: {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/"
|
||||
},
|
||||
play_parse: true,
|
||||
lazy: `js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
var from = html.from;
|
||||
if (html.encrypt == '1') {
|
||||
url = decodeURI(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = decodeURI(base64Decode(url))
|
||||
}
|
||||
if (/\.m3u8|\.mp4/.test(url)) {
|
||||
input = url
|
||||
} else {
|
||||
var currentDate = new Date();
|
||||
var year = currentDate.getFullYear();
|
||||
var month = String(currentDate.getMonth() + 1).padStart(2, '0');
|
||||
var day = String(currentDate.getDate()).padStart(2, '0');
|
||||
const urlTime = year + month + day;
|
||||
var MacPlayerConfig = {};
|
||||
eval(fetch(HOST + '/static/js/playerconfig.js?t=' + urlTime).replace('var Mac', 'Mac'));
|
||||
var parseUrl = MacPlayerConfig.player_list[from].parse;
|
||||
if (parseUrl && parseUrl != "") {
|
||||
let $playUrl = "";
|
||||
if(parseUrl.startsWith("http")){
|
||||
$playUrl = parseUrl;
|
||||
}else{
|
||||
$playUrl = HOST + parseUrl;
|
||||
}
|
||||
input = {
|
||||
url: url,
|
||||
playUrl: $playUrl,
|
||||
parse: 1,
|
||||
header: JSON.stringify({
|
||||
'user-agent': 'Mozilla/5.0',
|
||||
'Origin': input
|
||||
})
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
}
|
||||
`,
|
||||
推荐: `js:
|
||||
let d = [];
|
||||
pdfh = jsp.pdfh;pdfa = jsp.pdfa;pd = jsp.pd;
|
||||
let html = request(input);
|
||||
let items = pdfa(html, "div.module-items div.module-card-item");
|
||||
function shuffleArray(array) {
|
||||
for (let i = array.length - 1; i > 0; i--) {
|
||||
const j = Math.floor(Math.random() * (i + 1));
|
||||
[array[i], array[j]] = [array[j], array[i]];
|
||||
}
|
||||
return array;
|
||||
}
|
||||
const shuffledArray = shuffleArray(items);
|
||||
shuffledArray.forEach(it => {
|
||||
d.push({
|
||||
url:pdfh(it,"div.module-card-item-title&&a&&href"),
|
||||
title:pdfh(it,"div.module-card-item-title&&a&&Text"),
|
||||
img:pdfh(it,"div.module-item-pic&&img&&data-original"),
|
||||
desc:pdfh(it,"div.module-card-item-class&&Text") + "/" + pdfh(it,"div.module-item-note&&Text")
|
||||
})
|
||||
});
|
||||
setResult(d);
|
||||
`,
|
||||
一级: `js:
|
||||
var d = [];
|
||||
pdfh = jsp.pdfh;pdfa = jsp.pdfa;pd = jsp.pd;
|
||||
var html = request(input);
|
||||
let items = pdfa(html, "a.module-item");
|
||||
items.forEach(it => {
|
||||
d.push({
|
||||
url:pdfh(it,"a&&href"),
|
||||
title:pdfh(it,"a&&title"),
|
||||
img:pdfh(it,"div.module-item-pic&&img&&data-original"),
|
||||
desc:pdfh(it,"div.module-item-note&&Text")
|
||||
})
|
||||
});
|
||||
setResult(d)
|
||||
`,
|
||||
二级: $js.toString(() => {
|
||||
VOD = {};
|
||||
let html = request(input);
|
||||
VOD.vod_name = pdfh(html, "h1&&Text");
|
||||
VOD.vod_pic = pd(html, ".module-item-pic&&img&&data-original");
|
||||
VOD.vod_year = pdfh(html, ".module-info-tag-link:eq(0)&&Text");
|
||||
VOD.vod_area = pdfh(html, ".module-info-tag-link:eq(1)&&Text");
|
||||
VOD.type_name = pdfh(html, ".module-info-tag-link:eq(2)&&Text");
|
||||
VOD.vod_actor = pdfh(html, ".module-info-item-content:eq(1)&&Text");
|
||||
VOD.vod_director = pdfh(html, ".module-info-item-content:eq(0)&&Text");
|
||||
VOD.vod_remarks = "不信广告就你赢了";
|
||||
VOD.vod_content = pdfh(html, ".module-info-introduction-content&&Text");
|
||||
if (typeof play_url === "undefined") {
|
||||
var play_url = ""
|
||||
}
|
||||
let playFrom = [];
|
||||
let playUrl = [];
|
||||
let tabs = pdfa(html, "div.module-tab-item");
|
||||
tabs.forEach((it, index) => {
|
||||
playFrom.push('諾临風-' + pdfh(it, 'span&&Text') + "[" + pdfh(it, 'small&&Text') + "]");
|
||||
let playTag = "div.module-play-list:eq(" + index + ") a";
|
||||
let tags = pdfa(html, playTag);
|
||||
let mapUrl = tags.map((tag) => {
|
||||
let title = pdfh(tag, "a&&Text").trim();
|
||||
let purl = pd(tag, "a&&href");
|
||||
return title + "$" + play_url + urlencode(purl);
|
||||
});
|
||||
playUrl.push(mapUrl.join("#"))
|
||||
});
|
||||
VOD.vod_play_from = playFrom.join("$$$");
|
||||
VOD.vod_play_url = playUrl.join("$$$");
|
||||
}),
|
||||
double: false,
|
||||
searchUrl: "/index.php/vod/search/wd/**.html",
|
||||
搜索: `js:
|
||||
var d = [];
|
||||
pdfh = jsp.pdfh;pdfa = jsp.pdfa;pd = jsp.pd;
|
||||
var html = request(input);
|
||||
let list = pdfa(html, "div.module-item");
|
||||
list.forEach(it => {
|
||||
d.push({
|
||||
title: pdfh(it, "div.module-card-item-title&&Text"),
|
||||
desc: pdfh(it, "div.module-item-note&&Text"),
|
||||
pic_url: pdfh(it, "div.module-item-pic&&img&&data-original"),
|
||||
url: pdfh(it, "div.module-card-item-title&&a&&href")
|
||||
})
|
||||
});
|
||||
setResult(d)
|
||||
`
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
var rule = {
|
||||
title: "路漫漫",
|
||||
host: "https://m.lmm52.com",
|
||||
url: "/vod/show/id/fyclassfyfilter.html",
|
||||
searchUrl: "https://m.lmm52.com/vod/search/page/fypage/wd/**.html",
|
||||
searchable: 2,
|
||||
quickSearch: 0,
|
||||
filterable: 1,
|
||||
filter: "H4sIAAAAAAAAAO2Su04CURCG32XqNXu/wKsYitVsAlHRcEs2hISoECuJxqhRYqMFxkIKKFgLXoY9Lm/hHtB1mPqUU87//Tt7kvm6YEN5vwtHUQxlSBez1dcraFAPTyI8d8LjdrQp1mU8mKwvJjLOB+hp29QyLOc30+MobOibAFGbUhtTi1ILU5NSE1ODUgNRs0RoHiAaUBpg6lPqY+pR6mHqUuoWVDzPxMM75c6eWQryp1dkbXsRcX2bJqP/ixTz7kXEuJ8tb+TW++nf1oNYb9Xyj4p/jvvrj8dVkojpHepUa60m6WSfl+nVEHWah6eNnUXp29P3+SKbv6BS+0y+vKKBw0axUUqNctkoNkqpUR4bxUYpNcpno9gopUYFbBQbpdCo3g8SNsur7Q0AAA==",
|
||||
filter_url: "{{fl.排序}}{{fl.年代}}/page/fypage",
|
||||
filter_def: "",
|
||||
headers: {
|
||||
"User-Agent": "MOBILE_UA"
|
||||
},
|
||||
timeout: 5000,
|
||||
class_name: "日本动漫&国产动漫&欧美动漫&日本动画电影&国产动画电影&欧美动画电影",
|
||||
class_url: "6&7&8&3&4&5",
|
||||
class_parse: "",
|
||||
cate_exclude: "",
|
||||
play_parse: true,
|
||||
lazy: $js.toString(() => {
|
||||
input = {parse: 1, url: input, js: ''};
|
||||
}),
|
||||
double: false,
|
||||
推荐: "*",
|
||||
一级: ".video-img-box;h6.title&&Text;.lazyload&&data-src;.label&&Text;a&&href",
|
||||
二级: {
|
||||
title: ".page-title&&Text;.tag-link&&Text",
|
||||
img: ".module-item-pic&&.lazyload&&src",
|
||||
desc: ".video-info-items:eq(3)&&Text;.video-info-items:eq(2)&&Text;;.video-info-items:eq(1)&&Text;.video-info-items:eq(0)&&Text",
|
||||
content: ".video-info-content&&Text",
|
||||
tabs: ".module-tab-item.tab-item",
|
||||
lists: ".module-player-list:eq(#id) a",
|
||||
tab_text: "body&&Text",
|
||||
list_text: "body&&Text",
|
||||
list_url: "a&&href"
|
||||
},
|
||||
detailUrl: "",
|
||||
搜索: "*"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
muban.首图2.二级.desc = 'p.data:eq(-1)&&Text;;;p.data:eq(-2)&&Text;p.data:eq(-3)&&Text';
|
||||
var rule = {
|
||||
title:'达达龟',
|
||||
模板:'首图2',
|
||||
host:'https://www.dadagui.me',
|
||||
// url:'/vodshow/fyclass--------fypage---.html',
|
||||
url:'/vodshow/fyclassfyfilter.html',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'-{{fl.area}}-{{fl.by}}-{{fl.class}}-{{fl.lang}}-{{fl.letter}}---fypage---{{fl.year}}',
|
||||
filter: {
|
||||
"1":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"法语","v":"法语"},{"n":"德语","v":"德语"},{"n":"其它","v":"其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"2":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"韩国","v":"韩国"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"3":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}],
|
||||
"4":[{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"国产","v":"国产"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"国语"},{"n":"英语","v":"英语"},{"n":"粤语","v":"粤语"},{"n":"闽南语","v":"闽南语"},{"n":"韩语","v":"韩语"},{"n":"日语","v":"日语"},{"n":"其它","v":"其它"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"人气","v":"hits"},{"n":"评分","v":"score"}]}]
|
||||
},
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
class_parse: '.stui-header__menu li:gt(0):lt(5);a&&Text;a&&href;.*/(.*?).html',
|
||||
lazy:`js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
// 搜索: muban.首图2.搜索1,
|
||||
搜索: 'ul.stui-vodlist&&li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
var rule = {
|
||||
title: '追剧迷',
|
||||
模板: 'vfed',
|
||||
host: 'https://www.zhuijumi.cc',
|
||||
// url:'/videotype/fyclass-fypage.html',
|
||||
url: '/mp4type/fyclass-fypage.html',
|
||||
searchUrl: '/mp4search/-.html?wd=**',
|
||||
class_parse: '.fed-part-tips li;a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '更多|申请',
|
||||
lazy: `js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
二级: {
|
||||
"title": "h1&&Text;.fed-col-xs6--span:eq(0)&&Text",
|
||||
"img": ".fed-list-info&&a&&data-original",
|
||||
"desc": ".fed-col-xs12.fed-part-eone:eq(3)&&Text;;;.fed-col-xs12.fed-part-eone--span:eq(0)&&Text;.fed-col-xs12.fed-part-eone--span:eq(1)&&Text",
|
||||
"content": ".fed-conv-text:eq(0)&&Text",
|
||||
"tabs": "ul.fed-padding&&li",
|
||||
"lists": ".fed-tabs-btm:eq(#id) li"
|
||||
},
|
||||
搜索: '.fed-list-deta;h1&&Text;.fed-lazy&&data-original;.fed-list-remarks&&Text;a&&href;.fed-col-xs12.fed-part-eone:eq(2)&&Text',
|
||||
}
|
||||
@@ -0,0 +1,377 @@
|
||||
globalThis.getRandomItem = function (items) {
|
||||
return items[Math.random() * items.length | 0];
|
||||
}
|
||||
var rule = {
|
||||
title: '采集之王[合]',
|
||||
author: '道长',
|
||||
version: '20240705 beta16',
|
||||
update_info: ``.trim(),
|
||||
host: '',
|
||||
homeTid: '',
|
||||
homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',
|
||||
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
|
||||
searchUrl: '/api.php/provide/vod/?wd=**&pg=#TruePage##page=fypage',
|
||||
classUrl: '/api.php/provide/vod/',
|
||||
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyfilter',
|
||||
filter_url: '{{fl.类型}}',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
limit: 20,
|
||||
search_limit: 5,
|
||||
searchable: 1,
|
||||
quickSearch: 0,
|
||||
filterable: 1,
|
||||
play_parse: true,
|
||||
parse_url: '',
|
||||
search_match: false,
|
||||
search_pic: true,
|
||||
预处理: $js.toString(() => {
|
||||
function getClasses(item) {
|
||||
let classes = [];
|
||||
if (item.class_name && item.class_url) {
|
||||
if (!/&|电影|电视剧|综艺|动漫[\u4E00-\u9FA5]+/.test(item.class_name)) {
|
||||
try {
|
||||
item.class_name = ungzip(item.class_name)
|
||||
} catch (e) {
|
||||
log(`不识别的class_name导致gzip解码失败:${e}`)
|
||||
return classes
|
||||
}
|
||||
}
|
||||
let names = item.class_name.split('&');
|
||||
let urls = item.class_url.split('&');
|
||||
let cnt = Math.min(names.length, urls.length);
|
||||
for (let i = 0; i < cnt; i++) {
|
||||
classes.push({
|
||||
'type_id': urls[i],
|
||||
'type_name': names[i]
|
||||
});
|
||||
}
|
||||
}
|
||||
return classes
|
||||
}
|
||||
if (typeof(batchFetch) === 'function') {
|
||||
rule.search_limit = 16;
|
||||
log('当前程序支持批量请求[batchFetch],搜索限制已设置为16');
|
||||
}
|
||||
let _url = rule.params;
|
||||
log(`传入参数:${_url}`);
|
||||
if (_url && typeof(_url) === 'string' && /^(http|file)/.test(_url)) {
|
||||
if (_url.includes('$')) {
|
||||
let _url_params = _url.split('$');
|
||||
_url = _url_params[0];
|
||||
rule.search_match = !!(_url_params[1]);
|
||||
if (_url_params.length > 2) {
|
||||
rule.search_pic = !!(_url_params[2]);
|
||||
}
|
||||
}
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
let _classes = [];
|
||||
rule.filter = {};
|
||||
rule.filter_def = {};
|
||||
json.forEach(it => {
|
||||
let _obj = {
|
||||
type_name: it.name,
|
||||
type_id: it.url,
|
||||
parse_url: it.parse_url || '',
|
||||
searchable: it.searchable !== 0,
|
||||
api: it.api || '',
|
||||
cate_exclude: it.cate_exclude || '',
|
||||
};
|
||||
_classes.push(_obj);
|
||||
try {
|
||||
let json1 = [];
|
||||
if (it.class_name && it.class_url) {
|
||||
json1 = getClasses(it);
|
||||
} else {
|
||||
json1 = JSON.parse(request(urljoin(_obj.type_id, _obj.api || rule.classUrl))).class;
|
||||
}
|
||||
if (_obj.cate_exclude) {
|
||||
json1 = json1.filter(cl => !new RegExp(_obj.cate_exclude, 'i').test(cl.type_name));
|
||||
}
|
||||
rule.filter[_obj.type_id] = [{
|
||||
"key": "类型",
|
||||
"name": "类型",
|
||||
"value": json1.map(i => {
|
||||
return {
|
||||
"n": i.type_name,
|
||||
'v': i.type_id
|
||||
}
|
||||
})
|
||||
}
|
||||
];
|
||||
if (json1.length > 0) {
|
||||
rule.filter_def[it.url] = {
|
||||
"类型": json1[0].type_id
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
rule.filter[it.url] = [{
|
||||
"key": "类型",
|
||||
"name": "类型",
|
||||
"value": [{
|
||||
"n": "全部",
|
||||
"v": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
}
|
||||
});
|
||||
rule.classes = _classes;
|
||||
}
|
||||
}),
|
||||
class_parse: $js.toString(() => {
|
||||
input = rule.classes;
|
||||
}),
|
||||
推荐: $js.toString(() => {
|
||||
VODS = [];
|
||||
if (rule.classes) {
|
||||
let randomClass = getRandomItem(rule.classes);
|
||||
let _url = urljoin(randomClass.type_id, input);
|
||||
if (randomClass.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', randomClass.api)
|
||||
}
|
||||
try {
|
||||
let html = request(_url, {
|
||||
timeout: rule.timeout
|
||||
});
|
||||
let json = JSON.parse(html);
|
||||
VODS = json.list;
|
||||
VODS.forEach(it => {
|
||||
it.vod_id = randomClass.type_id + '$' + it.vod_id;
|
||||
it.vod_remarks = it.vod_remarks + '|' + randomClass.type_name;
|
||||
});
|
||||
} catch (e) {}
|
||||
}
|
||||
}),
|
||||
一级: $js.toString(() => {
|
||||
VODS = [];
|
||||
if (rule.classes) {
|
||||
let _url = urljoin(MY_CATE, input);
|
||||
let current_vod = rule.classes.find(item => item.type_id === MY_CATE);
|
||||
if (current_vod && current_vod.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
|
||||
}
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
VODS = json.list;
|
||||
VODS.forEach(it => {
|
||||
it.vod_id = MY_CATE + '$' + it.vod_id
|
||||
});
|
||||
}
|
||||
}),
|
||||
二级: $js.toString(() => {
|
||||
VOD = {};
|
||||
if (orId === 'update_info') {
|
||||
VOD = {
|
||||
vod_content: rule.update_info.trim(),
|
||||
vod_name: '更新日志',
|
||||
type_name: '更新日志',
|
||||
vod_pic: 'https://resource-cdn.tuxiaobei.com/video/FtWhs2mewX_7nEuE51_k6zvg6awl.png',
|
||||
vod_remarks: `版本:${rule.version}`,
|
||||
vod_play_from: '道长在线',
|
||||
vod_play_url: '随机小视频$http://api.yujn.cn/api/zzxjj.php',
|
||||
};
|
||||
} else {
|
||||
if (rule.classes) {
|
||||
let _url = urljoin(fyclass, input);
|
||||
let current_vod = rule.classes.find(item => item.type_id === fyclass);
|
||||
if (current_vod && current_vod.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
|
||||
}
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
let data = json.list;
|
||||
VOD = data[0];
|
||||
if (current_vod && current_vod.type_name) {
|
||||
VOD.vod_play_from = VOD.vod_play_from.split('$$$').map(it => current_vod.type_name + '|' + it).join('$$$')
|
||||
}
|
||||
}
|
||||
}
|
||||
}),
|
||||
搜索: $js.toString(() => {
|
||||
VODS = [];
|
||||
if (rule.classes) {
|
||||
let canSearch = rule.classes.filter(it => it.searchable);
|
||||
let page = Number(MY_PAGE);
|
||||
page = (MY_PAGE - 1) % Math.ceil(canSearch.length / rule.search_limit) + 1;
|
||||
let truePage = Math.ceil(MY_PAGE / Math.ceil(canSearch.length / rule.search_limit));
|
||||
if (rule.search_limit) {
|
||||
let start = (page - 1) * rule.search_limit;
|
||||
let end = page * rule.search_limit;
|
||||
let t1 = new Date().getTime();
|
||||
let searchMode = typeof(batchFetch) === 'function' ? '批量' : '单个';
|
||||
log('start:' + start);
|
||||
log('end:' + end);
|
||||
log('搜索模式:' + searchMode);
|
||||
log('精准搜索:' + rule.search_match);
|
||||
if (start < canSearch.length) {
|
||||
let search_classes = canSearch.slice(start, end);
|
||||
let urls = [];
|
||||
search_classes.forEach(it => {
|
||||
let _url = urljoin(it.type_id, input);
|
||||
if (it.api) {
|
||||
_url = _url.replace('/api.php/provide/vod/', it.api)
|
||||
}
|
||||
_url = _url.replace("#TruePage#", "" + truePage);
|
||||
urls.push(_url);
|
||||
});
|
||||
let results_list = [];
|
||||
let results = [];
|
||||
if (typeof(batchFetch) === 'function') {
|
||||
let reqUrls = urls.map(it => {
|
||||
return {
|
||||
url: it,
|
||||
options: {
|
||||
timeout: rule.timeout
|
||||
}
|
||||
}
|
||||
});
|
||||
let rets = batchFetch(reqUrls);
|
||||
let detailUrls = [];
|
||||
let detailUrlCount = 0;
|
||||
rets.forEach((ret, idx) => {
|
||||
let it = search_classes[idx];
|
||||
if (ret) {
|
||||
try {
|
||||
let json = JSON.parse(ret);
|
||||
let data = json.list;
|
||||
data.forEach(i => {
|
||||
i.site_name = it.type_name;
|
||||
i.vod_id = it.type_id + '$' + i.vod_id;
|
||||
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
|
||||
});
|
||||
if (rule.search_match) {
|
||||
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
|
||||
}
|
||||
if (data.length > 0) {
|
||||
if (rule.search_pic && !data[0].vod_pic) {
|
||||
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
|
||||
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
|
||||
detailUrls.push(detailUrl);
|
||||
results_list.push({
|
||||
data: data,
|
||||
has_pic: false,
|
||||
detailUrlCount: detailUrlCount
|
||||
});
|
||||
detailUrlCount++;
|
||||
} else {
|
||||
results_list.push({
|
||||
data: data,
|
||||
has_pic: true
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
log(`请求:${it.type_id}发生错误:${e.message}`)
|
||||
}
|
||||
}
|
||||
});
|
||||
let reqUrls2 = detailUrls.map(it => {
|
||||
return {
|
||||
url: it,
|
||||
options: {
|
||||
timeout: rule.timeout
|
||||
}
|
||||
}
|
||||
});
|
||||
let rets2 = batchFetch(reqUrls2);
|
||||
for (let k = 0; k < results_list.length; k++) {
|
||||
let result_data = results_list[k].data;
|
||||
if (!results_list[k].has_pic) {
|
||||
try {
|
||||
let detailJson = JSON.parse(rets2[results_list[k].detailUrlCount]);
|
||||
log('二级数据列表元素数:' + detailJson.list.length);
|
||||
result_data.forEach((d, _seq) => {
|
||||
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
|
||||
if (detailVodPic) {
|
||||
Object.assign(d, {
|
||||
vod_pic: detailVodPic.vod_pic
|
||||
});
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
log(`强制获取网站${result_data[0].site_name}的搜索图片失败:${e.message}`);
|
||||
}
|
||||
}
|
||||
results = results.concat(result_data);
|
||||
}
|
||||
} else {
|
||||
urls.forEach((_url, idx) => {
|
||||
let it = search_classes[idx];
|
||||
try {
|
||||
let html = request(_url);
|
||||
let json = JSON.parse(html);
|
||||
let data = json.list;
|
||||
data.forEach(i => {
|
||||
i.vod_id = it.type_id + '$' + i.vod_id;
|
||||
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
|
||||
});
|
||||
if (rule.search_match) {
|
||||
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
|
||||
}
|
||||
if (data.length > 0) {
|
||||
if (rule.search_pic && !data[0].vod_pic) {
|
||||
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
|
||||
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
|
||||
try {
|
||||
let detailJson = JSON.parse(request(detailUrl));
|
||||
log('二级数据列表元素数:' + detailJson.list.length);
|
||||
data.forEach((d, _seq) => {
|
||||
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
|
||||
if (detailVodPic) {
|
||||
Object.assign(d, {
|
||||
vod_pic: detailVodPic.vod_pic
|
||||
});
|
||||
}
|
||||
});
|
||||
} catch (e) {
|
||||
log(`强制获取网站${it.type_id}的搜索图片失败:${e.message}`);
|
||||
}
|
||||
}
|
||||
results = results.concat(data);
|
||||
}
|
||||
results = results.concat(data);
|
||||
} catch (e) {
|
||||
log(`请求:${it.type_id}发生错误:${e.message}`)
|
||||
}
|
||||
});
|
||||
}
|
||||
VODS = results;
|
||||
let t2 = new Date().getTime();
|
||||
log(`${searchMode}搜索:${urls.length}个站耗时:${(Number(t2) - Number(t1))}ms`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}),
|
||||
lazy: $js.toString(() => {
|
||||
let parse_url = '';
|
||||
if (flag && flag.includes('|')) {
|
||||
let type_name = flag.split('|')[0];
|
||||
let current_vod = rule.classes.find(item => item.type_name === type_name);
|
||||
if (current_vod && current_vod.parse_url) {
|
||||
parse_url = current_vod.parse_url
|
||||
}
|
||||
}
|
||||
if (/\.(m3u8|mp4)/.test(input)) {
|
||||
input = {
|
||||
parse: 0,
|
||||
url: input
|
||||
}
|
||||
} else {
|
||||
if (parse_url.startsWith('json:')) {
|
||||
let purl = parse_url.replace('json:', '') + input;
|
||||
let html = request(purl);
|
||||
input = {
|
||||
parse: 0,
|
||||
url: JSON.parse(html).url
|
||||
}
|
||||
} else {
|
||||
input = parse_url + input;
|
||||
}
|
||||
}
|
||||
}),
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
muban.mxpro.二级.desc = '.module-info-item-content:eq(3)&&Text;;;.module-info-item-content:eq(1)&&Text;.module-info-item-content:eq(0)&&Text';
|
||||
muban.mxpro.二级.tabs = '#y-playList .module-tab-item';
|
||||
muban.mxpro.二级.tab_text = 'body--small&&Text';
|
||||
var rule={
|
||||
title: '金曼影视',
|
||||
模板: 'mxpro',
|
||||
host: 'https://www.jinmantv.com',
|
||||
// url:'/index.php/vod/show/id/fyclass/page/fypage.html',
|
||||
url: '/index.php/vod/show/id/fyclassfyfilter.html',
|
||||
filterable: 1,//是否启用分类筛选,
|
||||
filter_url: '{{fl.area}}{{fl.by or "/by/time"}}{{fl.class}}{{fl.lang}}{{fl.letter}}/page/fypage{{fl.year}}',
|
||||
filter: {
|
||||
"1":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"战争","v":"/class/战争"},{"n":"警匪","v":"/class/警匪"},{"n":"犯罪","v":"/class/犯罪"},{"n":"动画","v":"/class/动画"},{"n":"奇幻","v":"/class/奇幻"},{"n":"武侠","v":"/class/武侠"},{"n":"冒险","v":"/class/冒险"},{"n":"枪战","v":"/class/枪战"},{"n":"恐怖","v":"/class/恐怖"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"经典","v":"/class/经典"},{"n":"青春","v":"/class/青春"},{"n":"文艺","v":"/class/文艺"},{"n":"微电影","v":"/class/微电影"},{"n":"古装","v":"/class/古装"},{"n":"历史","v":"/class/历史"},{"n":"运动","v":"/class/运动"},{"n":"农村","v":"/class/农村"},{"n":"儿童","v":"/class/儿童"},{"n":"网络电影","v":"/class/网络电影"},{"n":"体育赛事","v":"/class/体育赛事"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"/area/内地"},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"意大利","v":"/area/意大利"},{"n":"西班牙","v":"/area/西班牙"},{"n":"加拿大","v":"/area/加拿大"},{"n":"其他","v":"/area/其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"2":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"偶像","v":"/class/偶像"},{"n":"爱情","v":"/class/爱情"},{"n":"言情","v":"/class/言情"},{"n":"古装","v":"/class/古装"},{"n":"历史","v":"/class/历史"},{"n":"玄幻","v":"/class/玄幻"},{"n":"谍战","v":"/class/谍战"},{"n":"历险","v":"/class/历险"},{"n":"都市","v":"/class/都市"},{"n":"科幻","v":"/class/科幻"},{"n":"军旅","v":"/class/军旅"},{"n":"喜剧","v":"/class/喜剧"},{"n":"武侠","v":"/class/武侠"},{"n":"江湖","v":"/class/江湖"},{"n":"罪案","v":"/class/罪案"},{"n":"青春","v":"/class/青春"},{"n":"家庭","v":"/class/家庭"},{"n":"战争","v":"/class/战争"},{"n":"悬疑","v":"/class/悬疑"},{"n":"穿越","v":"/class/穿越"},{"n":"宫廷","v":"/class/宫廷"},{"n":"神话","v":"/class/神话"},{"n":"商战","v":"/class/商战"},{"n":"警匪","v":"/class/警匪"},{"n":"动作","v":"/class/动作"},{"n":"惊悚","v":"/class/惊悚"},{"n":"剧情","v":"/class/剧情"},{"n":"同性","v":"/class/同性"},{"n":"奇幻","v":"/class/奇幻"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"内地","v":"/area/内地"},{"n":"韩国","v":"/area/韩国"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"日本","v":"/area/日本"},{"n":"美国","v":"/area/美国"},{"n":"泰国","v":"/area/泰国"},{"n":"英国","v":"/area/英国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"其他","v":"/area/其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽 南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"其它","v":"/lang/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"3":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"番剧","v":"/class/番剧"},{"n":"国创","v":"/class/国创"},{"n":"热血","v":"/class/热血"},{"n":"格斗","v":"/class/格斗"},{"n":"机战","v":"/class/机战"},{"n":"少女","v":"/class/少女"},{"n":"竞技","v":"/class/竞技"},{"n":"科幻","v":"/class/科幻"},{"n":"魔幻","v":"/class/魔幻"},{"n":"爆笑","v":"/class/爆笑"},{"n":"推理","v":"/class/推理"},{"n":"冒险","v":"/class/冒险"},{"n":"恋爱","v":"/class/恋爱"},{"n":"校园","v":"/class/校园"},{"n":"治愈","v":"/class/治愈"},{"n":"泡面","v":"/class/泡面"},{"n":"穿越","v":"/class/穿越"},{"n":"灵异","v":"/class/灵异"},{"n":"耽美","v":"/class/耽美"},{"n":"动画","v":"/class/动画"},{"n":"电影","v":"/class/电影"},{"n":"其它","v":"/class/其它"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"/area/内地"},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"4":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"综艺","v":"/class/综艺"},{"n":"选秀","v":"/class/选秀"},{"n":"情感","v":"/class/情感"},{"n":"访谈","v":"/class/访谈"},{"n":"播报","v":"/class/播报"},{"n":"旅游","v":"/class/旅游"},{"n":"音乐","v":"/class/音乐"},{"n":"美食","v":"/class/美食"},{"n":"纪实","v":"/class/纪实"},{"n":"曲艺","v":"/class/曲艺"},{"n":"生活","v":"/class/生活"},{"n":"游戏互动","v":"/class/游戏互动"},{"n":"财经","v":"/class/财经"},{"n":"求职","v":"/class/求职"},{"n":"脱口秀","v":"/class/+脱口秀"},{"n":"真人秀","v":"/class/真人秀"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"/area/内地"},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"其它","v":"/lang/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"5":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"文化","v":"/class/文化"},{"n":"探索","v":"/class/探索"},{"n":"军事","v":"/class/军事"},{"n":"解密","v":"/class/解密"},{"n":"科技","v":"/class/科技"},{"n":"历史","v":"/class/历史"},{"n":"人物","v":"/class/人物"},{"n":"自然","v":"/class/自然"},{"n":"其它","v":"/class/其它"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"韩国","v":"/area/韩国"},{"n":"日本","v":"/area/日本"},{"n":"泰国","v":"/area/泰国"},{"n":"新加坡","v":"/area/新加坡"},{"n":"马来西亚","v":"/area/马来西亚"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"俄罗斯","v":"/area/俄罗斯"},{"n":"其它","v":"/area/其它"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"其它","v":"/lang/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
|
||||
"20":[{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"爱情","v":"/class/爱情"},{"n":"恐怖","v":"/class/恐怖"},{"n":"动作","v":"/class/动作"},{"n":"科幻","v":"/class/科幻"},{"n":"剧情","v":"/class/剧情"},{"n":"战争","v":"/class/战争"},{"n":"警匪","v":"/class/警匪"},{"n":"犯罪","v":"/class/犯罪"},{"n":"动画","v":"/class/动画"},{"n":"奇幻","v":"/class/奇幻"},{"n":"武侠","v":"/class/武侠"},{"n":"冒险","v":"/class/冒险"},{"n":"枪战","v":"/class/枪战"},{"n":"恐怖","v":"/class/恐怖"},{"n":"悬疑","v":"/class/悬疑"},{"n":"惊悚","v":"/class/惊悚"},{"n":"经典","v":"/class/经典"},{"n":"青春","v":"/class/青春"},{"n":"文艺","v":"/class/文艺"},{"n":"微电影","v":"/class/微电影"},{"n":"古装","v":"/class/古装"},{"n":"历史","v":"/class/历史"},{"n":"运动","v":"/class/运动"},{"n":"农村","v":"/class/农村"},{"n":"儿童","v":"/class/儿童"},{"n":"网络电影","v":"/class/网络电影"},{"n":"伦理","v":"/class/伦理"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"/area/内地"},{"n":"大陆","v":"/area/大陆"},{"n":"香港","v":"/area/香港"},{"n":"台湾","v":"/area/台湾"},{"n":"美国","v":"/area/美国"},{"n":"法国","v":"/area/法国"},{"n":"英国","v":"/area/英国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"德国","v":"/area/德国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"意大利","v":"/area/意大利"},{"n":"西班牙","v":"/area/西班牙"},{"n":"加拿大","v":"/area/加拿大"},{"n":"其他","v":"/area/其他"}]},{"key":"lang","name":"语言","value":[{"n":"全部","v":""},{"n":"国语","v":"/lang/国语"},{"n":"英语","v":"/lang/英语"},{"n":"粤语","v":"/lang/粤语"},{"n":"闽南语","v":"/lang/闽南语"},{"n":"韩语","v":"/lang/韩语"},{"n":"日语","v":"/lang/日语"},{"n":"法语","v":"/lang/法语"},{"n":"德语","v":"/lang/德语"},{"n":"其它","v":"/lang/其它"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"},{"n":"2003","v":"/year/2003"},{"n":"2002","v":"/year/2002"},{"n":"2001","v":"/year/2001"},{"n":"2000","v":"/year/2000"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}]
|
||||
},
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
|
||||
class_parse: '.navbar-items li:gt(1):lt(8);a&&Text;a&&href;/(\\d+).html',
|
||||
lazy: `js:
|
||||
var html = JSON.parse(request(input).match(/r player_.*?=(.*?)</)[1]);
|
||||
var url = html.url;
|
||||
if (html.encrypt == '1') {
|
||||
url = unescape(url)
|
||||
} else if (html.encrypt == '2') {
|
||||
url = unescape(base64Decode(url))
|
||||
}
|
||||
if (/\\.m3u8|\\.mp4/.test(url)) {
|
||||
input = {
|
||||
jx: 0,
|
||||
url: url,
|
||||
parse: 0
|
||||
}
|
||||
} else {
|
||||
input
|
||||
}
|
||||
`,
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"规则名": "阿里susu",
|
||||
"规则作者": "",
|
||||
"请求头参数": "手机",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "0",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://susuifa.com/",
|
||||
"首页列表数组规则": "body&&.post-list-item",
|
||||
"首页片单列表数组规则": "li",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类起始页码": "1",
|
||||
"分类链接": "https://susuifa.com/{cateId}",
|
||||
"分类名称": "欧美剧集&欧美电影&日韩剧集&日韩电影&其它剧集&其他电影",
|
||||
"分类名称替换词": "omjj&omdy&rhjj&rhdy&qtjj&qtdy",
|
||||
"筛选数据": {},
|
||||
//"筛选数据": "ext",
|
||||
//{cateId}
|
||||
"筛选子分类名称": "",
|
||||
"筛选子分类替换词": "*",
|
||||
//{class}
|
||||
"筛选类型名称": "",
|
||||
"筛选类型替换词": "*",
|
||||
//{area}
|
||||
"筛选地区名称": "",
|
||||
"筛选地区替换词": "*",
|
||||
//{year}
|
||||
"筛选年份名称": "",
|
||||
"筛选年份替换词": "*",
|
||||
//{lang}
|
||||
"筛选语言名称": "",
|
||||
"筛选语言替换词": "*",
|
||||
//{by}
|
||||
"筛选排序名称": "时间&人气&评分",
|
||||
"筛选排序替换词": "time&hits&score",
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": "body&&.post-list-item",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "img&&alt",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": "img&&data-src",
|
||||
"分类片单副标题": "",
|
||||
"分类片单链接加前缀": "",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$手机",
|
||||
"搜索链接": "https://susuifa.com/?s={wd}&type=post",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": "body&&.post-list-item",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "img&&data-src",
|
||||
"搜索片单标题":"img&&alt",
|
||||
"搜索片单链接": "a&&href",
|
||||
"搜索片单副标题": "",
|
||||
"搜索片单链接加前缀": "",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "1",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": "",
|
||||
"简介详情": "body&&.entry-content&&Text",
|
||||
"线路列表数组规则": "",
|
||||
"线路标题": "",
|
||||
"播放列表数组规则": "body&&a[href~=https://www.ali(pan|yundrive).com/s/]",
|
||||
"选集列表数组规则": "a",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "a&&Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
|
||||
"手动嗅探视频链接过滤词": ".html#=http"
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"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",
|
||||
"homeUrl": "https://www.yinfans.me",
|
||||
"dcPlayUrl": "true",
|
||||
"cateNode": "//a[contains(@href,'/s/')]",
|
||||
"cateName": "concat(//span[contains(@class,'nav-link-title')]/text(),//a[contains(@class,'dropdown-item')]/text())",
|
||||
"cateId": "/@href",
|
||||
"cateIdR": "/s/(\\w+)",
|
||||
"cateManual": {
|
||||
"首页推荐": "page",
|
||||
"蓝光原盘电影": "topic/bluray-movie/movie/page",
|
||||
"蓝光原盘纪录片": "topic/bluray-movie/documentry/page",
|
||||
"4K": "topic/4k/page"
|
||||
},
|
||||
"homeVodNode": "//div[contains(@class,'mainleft')]/ul/li/div[contains(@class,'thumbnail')]",
|
||||
"homeVodName": "/a/@title",
|
||||
"homeVodId": "/a/@href",
|
||||
"homeVodIdR": "https://www.yinfans.me/movie/(\\S+)",
|
||||
"homeVodImg": "/a/img/@src",
|
||||
"homeVodImgR": "\\S+(http\\S+)",
|
||||
"homeVodMark": "../div[contains(@class,'info')]/span[2]/a/text()",
|
||||
"cateUrl": "https://www.yinfans.me/{cateId}/{catePg}",
|
||||
"cateVodNode": "//div[contains(@class,'mainleft')]/ul/li/div[contains(@class,'thumbnail')]",
|
||||
"cateVodName": "/a/@title",
|
||||
"cateVodId": "/a/@href",
|
||||
"cateVodIdR": "https://www.yinfans.me/movie/(\\S+)",
|
||||
"cateVodImg": "/a/img/@src",
|
||||
"cateVodImgR": "\\S+(http\\S+)",
|
||||
"cateVodMark": "../div[contains(@class,'info')]/span[2]/a/text()",
|
||||
"dtUrl": "https://www.yinfans.me/movie/{vid}",
|
||||
"dtNode": "//div[@class='mainleft']",
|
||||
"dtName": "/div[1]/h1/text()",
|
||||
"dtNameR": "",
|
||||
"dtImg": "/div[1]//div[@class='context']/div[1]/p[1]/a/@href",
|
||||
"dtImgR": "",
|
||||
"dtCate": "/div[1]//div[@class='context']/div[1]/p[2]/text()[5]",
|
||||
"dtArea": "/div[1]//div[@class='context']/div[1]/p[2]/text()[4]",
|
||||
"dtAreaR": "",
|
||||
"dtYear": "/div[1]//div[@class='context']/div[1]/p[2]/text()[7]",
|
||||
"dtYearR": "",
|
||||
"dtActor": "/div[1]//div[@class='context']/div[1]/p[2]/text()[14]",
|
||||
"dtDirector": "/div[1]//div[@class='context']/div[1]/p[2]/text()[13]",
|
||||
"dtDesc": "/div[1]//div[@class='context']/div[1]/p[4]/text()",
|
||||
"dtFromNode": "//div[@class='tab-pane active']",
|
||||
"dtFromName": "//div[@class='btn-group']/label/text()",
|
||||
"dtUrlNode": "//table[@id='cili']/tbody",
|
||||
"dtUrlSubNode": "/tr/td/a",
|
||||
"dtUrlId": "@href",
|
||||
"dtUrlIdR": "",
|
||||
"dtUrlName": "concat(//span/span[1]/text(),'--', //span[@class='label label-warning']/text())",
|
||||
"playUrl": "",
|
||||
"playUa": "",
|
||||
"searchUrl": "",
|
||||
"scVodNode": "json:list",
|
||||
"scVodName": "name",
|
||||
"scVodId": "id",
|
||||
"scVodIdR": "",
|
||||
"scVodImg": "pic",
|
||||
"scVodMark": ""
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
Object.assign(muban.mxpro.二级, {
|
||||
tab_text: 'div--small&&Text',
|
||||
});
|
||||
var rule = {
|
||||
模板: 'mxpro',
|
||||
title: '驴番[漫]',
|
||||
host: 'https://www.lvfan.fun',
|
||||
url: 'vodshow/fyclass--------fypage---/',
|
||||
class_parse: '.navbar-items li;a&&Text;a&&href;.*/(\\d+)/',
|
||||
searchUrl: '/vodsearch/**----------fypage---/',
|
||||
tab_exclude: '排序',
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"规则名": "高清MP4",
|
||||
"规则作者": "香雅情",
|
||||
"请求头参数": "PC_UA",
|
||||
"网页编码格式": "UTF-8",
|
||||
"图片是否需要代理": "1",
|
||||
"是否开启获取首页数据": "1",
|
||||
"首页推荐链接": "https://www.97tvs.com",
|
||||
"首页列表数组规则": "body&&.masonry",
|
||||
"首页片单列表数组规则": "li",
|
||||
"首页片单是否Jsoup写法": "1",
|
||||
"分类链接": "https://www.97tvs.com/{cateId}/page/{catePg}[firstPage=https://www.97tvs.com/{cateId}]",
|
||||
"分类名称": "动作片&科幻片&爱情片&喜剧片&剧情片&惊悚片&战争片&灾难片&罪案片&动画片&综艺&电视剧",
|
||||
"分类名称替换词": "action&science&love&comedy&story&thriller&war&disaster&crime&cartoon&variety&sitcoms",
|
||||
"筛选数据": {},
|
||||
"分类截取模式": "1",
|
||||
"分类列表数组规则": ".masonry||#posts-list&&li||.entry",
|
||||
"分类片单是否Jsoup写法": "1",
|
||||
"分类片单标题": "h2&&Text",
|
||||
"分类片单链接": "a&&href",
|
||||
"分类片单图片": "img&&src",
|
||||
"分类片单副标题": ".info_date&&Text",
|
||||
"分类片单链接加前缀": "",
|
||||
"分类片单链接加后缀": "",
|
||||
"搜索请求头参数": "User-Agent$PC_UA#Cookie$esc_search_captcha=1",
|
||||
"搜索链接": "https://www.97tvs.com/?s={wd}",
|
||||
"POST请求数据": "",
|
||||
"搜索截取模式": "1",
|
||||
"搜索列表数组规则": ".masonry&&li",
|
||||
"搜索片单是否Jsoup写法": "1",
|
||||
"搜索片单图片": "img&&src",
|
||||
"搜索片单标题": "h2&&Text",
|
||||
"搜索片单链接": "a&&href",
|
||||
"搜索片单副标题": ".info_date&&Text",
|
||||
"搜索片单链接加前缀": "",
|
||||
"搜索片单链接加后缀": "",
|
||||
"链接是否直接播放": "0",
|
||||
"直接播放链接加前缀": "",
|
||||
"直接播放链接加后缀": "",
|
||||
"直接播放直链视频请求头": "",
|
||||
"详情是否Jsoup写法": "0",
|
||||
"类型详情": "",
|
||||
"年代详情": "",
|
||||
"地区详情": "",
|
||||
"演员详情": "",
|
||||
"简介详情": "",
|
||||
"线路列表数组规则": "",
|
||||
"线路标题": "",
|
||||
"播放列表数组规则": "body&&#post_content",
|
||||
"选集列表数组规则": "a[href^=magnet]||a[href^=ed2K]",
|
||||
"选集标题链接是否Jsoup写法": "1",
|
||||
"选集标题": "Text",
|
||||
"选集链接": "a&&href",
|
||||
"是否反转选集序列": "0",
|
||||
"选集链接加前缀": "",
|
||||
"选集链接加后缀": "",
|
||||
"分析MacPlayer": "0",
|
||||
"是否开启手动嗅探": "0",
|
||||
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv",
|
||||
"手动嗅探视频链接过滤词": ".html"
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// 网址发布页 https://molicp.com
|
||||
muban.首图.二级.title = '.text-fff--font&&Text;.data--span:eq(0)&&Text';
|
||||
muban.首图.二级.desc = '#rating&&Text;;;.data--span:eq(1)&&Text;.data--span:eq(2)&&Text';
|
||||
muban.首图.二级.content = '.desc&&Text';
|
||||
var rule = {
|
||||
title:'HDmoli',
|
||||
模板:'首图',
|
||||
host:'https://www.hdmoli.pro',
|
||||
// url:'/mlist/fyclass-fypage.html',
|
||||
url:'/search.php?page=fypage&searchtype=5&tid=fyfilter',
|
||||
filterable:1,//是否启用分类筛选,
|
||||
filter_url:'{{fl.cateId}}&jq={{fl.class}}&area={{fl.area}}&year={{fl.year}}&state={{fl.state}}&order={{fl.by}}',
|
||||
filter:{
|
||||
"1":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"1"},{"n":"动作","v":"5"},{"n":"爱情","v":"6"},{"n":"科幻","v":"7"},{"n":"恐怖","v":"8"},{"n":"战争","v":"9"},{"n":"喜剧","v":"10"},{"n":"纪录片","v":"11"},{"n":"剧情","v":"12"},{"n":"犯罪","v":"30"},{"n":"动画","v":"32"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"战争","v":"战争"},{"n":"恐怖","v":"恐怖"},{"n":"剧情","v":"剧情"},{"n":"爱情","v":"爱情"},{"n":"家庭","v":"家庭"},{"n":"励志","v":"励志"},{"n":"悬疑","v":"悬疑"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"冒险","v":"冒险"},{"n":"历史","v":"历史"},{"n":"惊悚","v":"惊悚"},{"n":"音乐","v":"音乐"},{"n":"科幻","v":"科幻"},{"n":"犯罪","v":"犯罪"},{"n":"运动","v":"运动"},{"n":"喜剧","v":"喜剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"泰国","v":"泰国"},{"n":"中国","v":"中国"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"more","v":"more"}]},{"key":"state","name":"状态","value":[{"n":"全部","v":""},{"n":"完结","v":"w"},{"n":"连载中","v":"l"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"评分","v":"douban"}]}],
|
||||
"2":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"2"},{"n":"美剧","v":"15"},{"n":"韩剧","v":"16"},{"n":"日剧","v":"13"},{"n":"英剧","v":"34"},{"n":"中国","v":"14"},{"n":"泰剧","v":"29"},{"n":"综艺","v":"39"},{"n":"其他","v":"38"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"战争","v":"战争"},{"n":"恐怖","v":"恐怖"},{"n":"剧情","v":"剧情"},{"n":"爱情","v":"爱情"},{"n":"家庭","v":"家庭"},{"n":"励志","v":"励志"},{"n":"悬疑","v":"悬疑"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"冒险","v":"冒险"},{"n":"历史","v":"历史"},{"n":"惊悚","v":"惊悚"},{"n":"音乐","v":"音乐"},{"n":"科幻","v":"科幻"},{"n":"犯罪","v":"犯罪"},{"n":"运动","v":"运动"},{"n":"喜剧","v":"喜剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"泰国","v":"泰国"},{"n":"中国","v":"中国"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"more","v":"more"}]},{"key":"state","name":"状态","value":[{"n":"全部","v":""},{"n":"完结","v":"w"},{"n":"连载中","v":"l"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"评分","v":"douban"}]}],
|
||||
"41":[{"key":"cateId","name":"类型","value":[{"n":"全部","v":"41"},{"n":"日本","v":"42"},{"n":"其他","v":"43"}]},{"key":"class","name":"剧情","value":[{"n":"全部","v":""},{"n":"战争","v":"战争"},{"n":"恐怖","v":"恐怖"},{"n":"剧情","v":"剧情"},{"n":"爱情","v":"爱情"},{"n":"家庭","v":"家庭"},{"n":"励志","v":"励志"},{"n":"悬疑","v":"悬疑"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"冒险","v":"冒险"},{"n":"历史","v":"历史"},{"n":"惊悚","v":"惊悚"},{"n":"音乐","v":"音乐"},{"n":"科幻","v":"科幻"},{"n":"犯罪","v":"犯罪"},{"n":"运动","v":"运动"},{"n":"喜剧","v":"喜剧"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"美国","v":"美国"},{"n":"韩国","v":"韩国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"泰国","v":"泰国"},{"n":"中国","v":"中国"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"more","v":"more"}]},{"key":"state","name":"状态","value":[{"n":"全部","v":""},{"n":"完结","v":"w"},{"n":"连载中","v":"l"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"time"},{"n":"评分","v":"douban"}]}]
|
||||
},
|
||||
filter_def:{
|
||||
1:{cateId:'1',by:'time'},
|
||||
2:{cateId:'2',by:'time'},
|
||||
41:{cateId:'41',by:'time'}
|
||||
},
|
||||
searchUrl:'/search.php?page=fypage&searchword=**&searchtype=',
|
||||
class_parse: '.myui-header__menu li;a&&Text;a&&href;.*/index(\\d+).html',
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,2298 @@
|
||||
{
|
||||
"spider": "./spider.jar;md5;3843f962622e1fa261e6cd26ebbe2807",
|
||||
"wallpaper": "https://api.likepoems.com/img/bing",
|
||||
"sites": [
|
||||
{
|
||||
"key": "豆瓣",
|
||||
"name": "豆瓣",
|
||||
"type": 3,
|
||||
"api": "csp_Douban",
|
||||
"searchable": 0
|
||||
},
|
||||
{
|
||||
"key": "云盘登录",
|
||||
"name": "云盘登录",
|
||||
"type": 3,
|
||||
"api": "csp_AliYunPan",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"changeable": 0,
|
||||
"ext": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
{
|
||||
"key": "配置中心",
|
||||
"name": "配置中心",
|
||||
"type": 3,
|
||||
"api": "csp_Config",
|
||||
"searchable": 0,
|
||||
"changeable": 0,
|
||||
"style": {
|
||||
"type": "rect",
|
||||
"ratio": 1.597
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "韩小圈",
|
||||
"name": "韩小圈",
|
||||
"type": 3,
|
||||
"api": "csp_HanXiaoQuan",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "无忧短剧",
|
||||
"name": "无忧短剧",
|
||||
"type": 3,
|
||||
"api": "csp_Duanj",
|
||||
"searchable": 1,
|
||||
"changeable": 0,
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "采集之王",
|
||||
"name": "采集之王",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"order_num": 142,
|
||||
"ext": "./lib/采集之王.js?type=url¶ms=./JSON/采集静态.json$1$1"
|
||||
},
|
||||
{
|
||||
"key": "南瓜影视",
|
||||
"name": "南瓜影视",
|
||||
"type": 3,
|
||||
"api": "csp_WexNgys",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "天天影视",
|
||||
"name": "天天影视",
|
||||
"type": 3,
|
||||
"api": "csp_AppTT",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "热播影视",
|
||||
"name": "热播影视",
|
||||
"type": 3,
|
||||
"api": "csp_AppRB",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "追剧影视",
|
||||
"name": "追剧影视",
|
||||
"type": 3,
|
||||
"api": "csp_AppZJ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "厂长资源",
|
||||
"name": "厂长资源",
|
||||
"type": 3,
|
||||
"api": "csp_Czsapp",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "https://www.czys.pro/"
|
||||
},
|
||||
{
|
||||
"key": "低端影视",
|
||||
"name": "低端影视",
|
||||
"type": 3,
|
||||
"api": "csp_Ddys",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "快看影视",
|
||||
"name": "快看影视",
|
||||
"type": 3,
|
||||
"api": "csp_Kuaikan",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "苹果影视",
|
||||
"name": "苹果影视",
|
||||
"type": 3,
|
||||
"api": "csp_LiteApple",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "胖虎影视",
|
||||
"name": "胖虎影视",
|
||||
"type": 3,
|
||||
"api": "csp_Panghu",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "https://physvod.com"
|
||||
},
|
||||
{
|
||||
"key": "剧圈影视",
|
||||
"name": "剧圈影视",
|
||||
"type": 3,
|
||||
"api": "csp_Juqq",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "忍者影视",
|
||||
"name": "忍者影视",
|
||||
"type": 3,
|
||||
"api": "csp_AppRZ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "http://rzys.xyz/"
|
||||
},
|
||||
{
|
||||
"key": "毛驴影视",
|
||||
"name": "毛驴影视",
|
||||
"type": 3,
|
||||
"api": "csp_MaoLv",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "可可影视",
|
||||
"name": "可可影视",
|
||||
"type": 3,
|
||||
"api": "csp_Keke",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "圣城影视",
|
||||
"name": "圣城影视",
|
||||
"type": 3,
|
||||
"api": "csp_SC1080",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "视觉影视",
|
||||
"name": "视觉影视",
|
||||
"type": 3,
|
||||
"api": "csp_Xinsj",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "疯狗影视",
|
||||
"name": "疯狗影视",
|
||||
"type": 3,
|
||||
"api": "csp_FengGo",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "耐看影视",
|
||||
"name": "耐看影视",
|
||||
"type": 3,
|
||||
"api": "csp_Nkdy",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "FreeOK",
|
||||
"name": "FreeOK",
|
||||
"type": 3,
|
||||
"api": "csp_FreeOK",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "兄弟影视",
|
||||
"name": "兄弟影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexxiongdiys",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "酷看影视",
|
||||
"name": "酷看影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexkukantv",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "明日影视",
|
||||
"name": "明日影视",
|
||||
"type": 3,
|
||||
"api": "csp_WexMingriys",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "腐剧视频",
|
||||
"name": "腐剧视频",
|
||||
"type": 3,
|
||||
"api": "csp_WexFujutv",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "啾啾影视",
|
||||
"name": "啾啾影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexjiohub",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "星辰影视",
|
||||
"name": "星辰影视",
|
||||
"type": 3,
|
||||
"api": "csp_WexXingchen",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "农民影视",
|
||||
"name": "农民影视",
|
||||
"type": 3,
|
||||
"api": "csp_WexNmys",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "利播影视",
|
||||
"name": "利播影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexlibhd",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "纯享影视",
|
||||
"name": "纯享影视",
|
||||
"type": 3,
|
||||
"api": "csp_WexF4kvm",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "两个磁力",
|
||||
"name": "两个磁力",
|
||||
"type": 3,
|
||||
"api": "csp_Wexbttwo",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "骚火影视",
|
||||
"name": "骚火影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexsaohuo",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "在线之家",
|
||||
"name": "在线之家",
|
||||
"type": 3,
|
||||
"api": "csp_Wexzxzj",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "愉悦影视",
|
||||
"name": "愉悦影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexyuyueys",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "花蕊影视",
|
||||
"name": "花蕊影视",
|
||||
"type": 3,
|
||||
"api": "csp_Wexhuaruitv",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "精品短剧",
|
||||
"name": "精品短剧",
|
||||
"type": 3,
|
||||
"api": "csp_Wexvipduanju",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "良品短剧",
|
||||
"name": "良品短剧",
|
||||
"type": 3,
|
||||
"api": "csp_Wexduanjuvip",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "看看影视",
|
||||
"name": "看看影视",
|
||||
"type": 3,
|
||||
"api": "csp_WebIV",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "大米星球",
|
||||
"name": "大米星球",
|
||||
"type": 3,
|
||||
"api": "csp_AppDaMi",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "铁剧影视",
|
||||
"name": "铁剧影视",
|
||||
"type": 3,
|
||||
"api": "csp_AppBr",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "笙歌影视",
|
||||
"name": "笙歌影视",
|
||||
"type": 3,
|
||||
"api": "csp_AppYY",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0
|
||||
},
|
||||
{
|
||||
"key": "不卡影视",
|
||||
"name": "不卡影视",
|
||||
"type": 3,
|
||||
"api": "csp_App",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": "PuMSXHTlG7XuTPHibOyZteVY1Bbl6ZlsngCB5cB1aT58PUe5B3fTqNqjFlBRB9gUMb3sBH9Ft54h0DfIM8NZXSQZqL75gkSizgP2bD/FXuU7p8/Atv6nfoWFwgWWXehi2e2bdvWuIZd/iTHBLXJLOErvkwen7BleeOnRa7QzqB9XmOsv/M7AccHoiKa8JPMRfdXDPQT4Edlrk+Fij03D/m66ytOrnl7W4tGxo7UmbtKLKuR1Tr2ureKLLfmEqHCOdCwtqw2Bgi/NNxDXZQAx5ihHKNNipXEDhBXyQBJgfnsuxCd95h1gj845lEYqc/PK/WI9fbWCuQMfd50aPtxG/rRQjPClzRSEk+KOpz9njtQ="
|
||||
},
|
||||
{
|
||||
"key": "摩托影视",
|
||||
"name": "摩托影视",
|
||||
"type": 3,
|
||||
"api": "csp_App",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": "j3UE7cVyk0jKGyMPkJ35EnqUgtOg+PN9OJevxJzkfD20vgt+RqQVvc3kcbSRgThbJjVk2hC6FWnD0fWIqWd4D4S/NPFftLiwX7Yf2pvV3P2hRAjNWiPO+iJQ33XkJeUHW9gMIzn0FkxZOs+o8juC1SnSkfjblSU1wtxBOetwgC8habcRdvOZEjBSLuZj8SlIjQ9QzwZivBSQGQ44j1bkAxNO4k1MhYbM5Z6QWxv/341MNNt7lsI9pldpg5/KtM/USj9Ftmmree+9m/3E/UgIwWzCl3Ax9B8NQQ7uGFr2wq68ahEIcCZyL3l+U37oARUk"
|
||||
},
|
||||
{
|
||||
"key": "星芽短剧",
|
||||
"name": "星芽短剧",
|
||||
"type": 3,
|
||||
"api": "csp_AppXY",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "视频库",
|
||||
"name": "视频库",
|
||||
"type": 3,
|
||||
"api": "csp_WebVidHub",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": "https://vidhub1.cc"
|
||||
},
|
||||
{
|
||||
"key": "星芽短剧",
|
||||
"name": "星芽短剧",
|
||||
"type": 3,
|
||||
"api": "csp_AppXY",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0
|
||||
},
|
||||
{
|
||||
"key": "视频库",
|
||||
"name": "视频库",
|
||||
"type": 3,
|
||||
"api": "csp_WebVidHub",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": "https://vidhub1.cc"
|
||||
},
|
||||
{
|
||||
"key": "素白白",
|
||||
"name": "素白白",
|
||||
"type": 3,
|
||||
"api": "csp_Subaibai",
|
||||
"searchable": 1,
|
||||
"changeable": 1
|
||||
},
|
||||
{
|
||||
"key": "机器人",
|
||||
"name": "机器人",
|
||||
"type": 3,
|
||||
"api": "csp_Ikanbot",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"ext": "https://v.aikanbot.com"
|
||||
},
|
||||
{
|
||||
"key": "新视觉",
|
||||
"name": "新视觉",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/新视觉.json"
|
||||
},
|
||||
{
|
||||
"key": "电影牛",
|
||||
"name": "电影牛",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/电影牛.json"
|
||||
},
|
||||
{
|
||||
"key": "爱奇艺",
|
||||
"name": "爱奇艺",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/爱奇艺.js"
|
||||
},
|
||||
{
|
||||
"key": "三六零",
|
||||
"name": "三六零",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/三六零.js"
|
||||
},
|
||||
{
|
||||
"key": "剧圈圈",
|
||||
"name": "剧圈圈",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/剧圈圈.js"
|
||||
},
|
||||
{
|
||||
"key": "追剧迷",
|
||||
"name": "追剧迷",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/追剧迷.js"
|
||||
},
|
||||
{
|
||||
"key": "看了么",
|
||||
"name": "看了么",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/看了么.js"
|
||||
},
|
||||
{
|
||||
"key": "达达龟",
|
||||
"name": "达达龟",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/达达龟.js"
|
||||
},
|
||||
{
|
||||
"key": "茶杯狐",
|
||||
"name": "茶杯狐",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/茶杯狐.js"
|
||||
},
|
||||
{
|
||||
"key": "魔力高清",
|
||||
"name": "魔力高清",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/魔力高清.js"
|
||||
},
|
||||
{
|
||||
"key": "腾讯视频",
|
||||
"name": "腾讯视频",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/腾讯视频.js"
|
||||
},
|
||||
{
|
||||
"key": "优酷视频",
|
||||
"name": "优酷视频",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/优酷视频.js"
|
||||
},
|
||||
{
|
||||
"key": "芒果视频",
|
||||
"name": "芒果视频",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/芒果视频.js"
|
||||
},
|
||||
{
|
||||
"key": "搜狗视频",
|
||||
"name": "搜狗视频",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/搜狗视频.js"
|
||||
},
|
||||
{
|
||||
"key": "哔哩视频",
|
||||
"name": "哔哩视频",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/哔哩视频.js"
|
||||
},
|
||||
{
|
||||
"key": "乐鱼影视",
|
||||
"name": "乐鱼影视",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/乐鱼影视.js"
|
||||
},
|
||||
{
|
||||
"key": "碟调影视",
|
||||
"name": "碟调影视",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/碟调影视.js"
|
||||
},
|
||||
{
|
||||
"key": "大米星球",
|
||||
"name": "大米星球",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/大米星球.js"
|
||||
},
|
||||
{
|
||||
"key": "欧帝影院",
|
||||
"name": "欧帝影院",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/欧帝影院.js"
|
||||
},
|
||||
{
|
||||
"key": "金曼影视",
|
||||
"name": "金曼影视",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/金曼影视.js"
|
||||
},
|
||||
{
|
||||
"key": "畅梦影视",
|
||||
"name": "畅梦影视",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/畅梦影视.js"
|
||||
},
|
||||
{
|
||||
"key": "五五影视",
|
||||
"name": "五五影视",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/五五影视.json"
|
||||
},
|
||||
{
|
||||
"key": "子子影视",
|
||||
"name": "子子影视",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/子子影视.json"
|
||||
},
|
||||
{
|
||||
"key": "电影盒子",
|
||||
"name": "电影盒子",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/电影盒子.json"
|
||||
},
|
||||
{
|
||||
"key": "歪片星球",
|
||||
"name": "歪片星球",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/歪片星球.json"
|
||||
},
|
||||
{
|
||||
"key": "奇趣影视",
|
||||
"name": "奇趣影视",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/奇趣影视.json"
|
||||
},
|
||||
{
|
||||
"key": "蚂蚁资源",
|
||||
"name": "蚂蚁资源",
|
||||
"type": 1,
|
||||
"api": "http://dsakf23665.com/api.php/provide/vod/from/NBY",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"playUrl": "json:http://121.62.61.51:6888//api//?key=qMdg1EDXPe9NH3bG0z&url="
|
||||
},
|
||||
{
|
||||
"key": "红牛资源",
|
||||
"name": "红牛资源",
|
||||
"type": 1,
|
||||
"api": "https://www.hongniuzy2.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"爱情片",
|
||||
"科幻片",
|
||||
"恐怖片",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"国产剧",
|
||||
"港澳剧",
|
||||
"日剧",
|
||||
"欧美剧",
|
||||
"台湾剧",
|
||||
"泰剧",
|
||||
"韩剧",
|
||||
"纪录片",
|
||||
"动漫电影"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "光速资源",
|
||||
"name": "光速资源",
|
||||
"type": 1,
|
||||
"api": "http://api.guangsuapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"爱情片",
|
||||
"科幻片",
|
||||
"剧情片",
|
||||
"恐怖片",
|
||||
"战争片",
|
||||
"动漫电影",
|
||||
"大陆剧",
|
||||
"欧美剧",
|
||||
"港澳剧",
|
||||
"韩剧",
|
||||
"日剧",
|
||||
"台湾剧",
|
||||
"泰剧",
|
||||
"综艺",
|
||||
"动漫",
|
||||
"记录片"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "极速资源",
|
||||
"name": "极速资源",
|
||||
"type": 1,
|
||||
"api": "https://jszyapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"日剧",
|
||||
"马泰剧",
|
||||
"内地剧",
|
||||
"欧美剧",
|
||||
"香港剧",
|
||||
"韩剧",
|
||||
"台湾剧",
|
||||
"恐怖片",
|
||||
"动画片",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"动作片",
|
||||
"记录片",
|
||||
"爱情片",
|
||||
"喜剧片",
|
||||
"科幻片",
|
||||
"灾难片",
|
||||
"悬疑片",
|
||||
"犯罪片",
|
||||
"中国动漫",
|
||||
"日本动漫",
|
||||
"欧美动漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "快车资源",
|
||||
"name": "快车资源",
|
||||
"type": 1,
|
||||
"api": "https://caiji.kczyapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"爱情片",
|
||||
"科幻片",
|
||||
"恐怖片",
|
||||
"战争片",
|
||||
"剧情片",
|
||||
"动画片",
|
||||
"纪录片",
|
||||
"国产剧",
|
||||
"香港剧",
|
||||
"台湾剧",
|
||||
"欧美剧",
|
||||
"韩国剧",
|
||||
"日本剧",
|
||||
"泰国剧",
|
||||
"海外剧",
|
||||
"国产动漫",
|
||||
"日本动漫",
|
||||
"欧美动漫",
|
||||
"大陆综艺",
|
||||
"日韩综艺",
|
||||
"港台综艺",
|
||||
"欧美综艺"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "索尼资源",
|
||||
"name": "索尼资源",
|
||||
"type": 1,
|
||||
"api": "https://suoniapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"爱情片",
|
||||
"科幻片",
|
||||
"恐怖片",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"纪录片",
|
||||
"动画片",
|
||||
"国产剧",
|
||||
"欧美剧",
|
||||
"韩剧",
|
||||
"日剧",
|
||||
"港剧",
|
||||
"台剧",
|
||||
"泰剧",
|
||||
"海外剧",
|
||||
"大陆综艺",
|
||||
"日韩综艺",
|
||||
"港台综艺",
|
||||
"欧美综艺",
|
||||
"国产动漫",
|
||||
"日韩动漫",
|
||||
"欧美动漫",
|
||||
"港台动漫",
|
||||
"海外动漫"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "量子资源",
|
||||
"name": "量子资源",
|
||||
"type": 1,
|
||||
"api": "https://cj.lziapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"科幻片",
|
||||
"恐怖片",
|
||||
"爱情片",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"记录片",
|
||||
"国产剧",
|
||||
"欧美剧",
|
||||
"香港剧",
|
||||
"韩国剧",
|
||||
"台湾剧",
|
||||
"日本剧",
|
||||
"海外剧",
|
||||
"泰国剧",
|
||||
"国产动漫",
|
||||
"日韩动漫",
|
||||
"欧美动漫",
|
||||
"港台动漫",
|
||||
"海外动漫",
|
||||
"大陆综艺",
|
||||
"港台综艺",
|
||||
"日韩综艺",
|
||||
"欧美综艺"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "非凡资源",
|
||||
"name": "非凡资源",
|
||||
"type": 1,
|
||||
"api": "http://cj.ffzyapi.com/api.php/provide/vod/",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"categories": [
|
||||
"动作片",
|
||||
"喜剧片",
|
||||
"科幻片",
|
||||
"恐怖片",
|
||||
"爱情片",
|
||||
"剧情片",
|
||||
"战争片",
|
||||
"记录片",
|
||||
"国产剧",
|
||||
"欧美剧",
|
||||
"香港剧",
|
||||
"韩国剧",
|
||||
"台湾剧",
|
||||
"日本剧",
|
||||
"海外剧",
|
||||
"泰国剧",
|
||||
"国产动漫",
|
||||
"日韩动漫",
|
||||
"欧美动漫",
|
||||
"港台动漫",
|
||||
"海外动漫",
|
||||
"大陆综艺",
|
||||
"港台综艺",
|
||||
"日韩综艺",
|
||||
"欧美综艺"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "58动漫",
|
||||
"name": "58动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/58动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "Anime1",
|
||||
"name": "Anime1",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/Anime1.js"
|
||||
},
|
||||
{
|
||||
"key": "NT动漫",
|
||||
"name": "NT动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/NT动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "路漫漫",
|
||||
"name": "路漫漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/路漫漫.js"
|
||||
},
|
||||
{
|
||||
"key": "动漫岛",
|
||||
"name": "动漫岛",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/动漫岛.js"
|
||||
},
|
||||
{
|
||||
"key": "去看吧",
|
||||
"name": "去看吧",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/去看吧.js"
|
||||
},
|
||||
{
|
||||
"key": "爱弹幕",
|
||||
"name": "爱弹幕",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/爱弹幕.js"
|
||||
},
|
||||
{
|
||||
"key": "异世界",
|
||||
"name": "异世界",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/异世界.js"
|
||||
},
|
||||
{
|
||||
"key": "次元城",
|
||||
"name": "次元城",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/次元城.js"
|
||||
},
|
||||
{
|
||||
"key": "喵物次元",
|
||||
"name": "喵物次元",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/喵物次元.js"
|
||||
},
|
||||
{
|
||||
"key": "妮可动漫",
|
||||
"name": "妮可动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/妮可动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "奇米动漫",
|
||||
"name": "奇米动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/奇米动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "怡萱动漫",
|
||||
"name": "怡萱动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/怡萱动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "花子动漫",
|
||||
"name": "花子动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/花子动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "驴番动漫",
|
||||
"name": "驴番动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/驴番动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "动漫巴士",
|
||||
"name": "动漫巴士",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"ext": "./lib/动漫巴士.json"
|
||||
},
|
||||
{
|
||||
"key": "樱花动漫",
|
||||
"name": "樱花动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/樱花动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "大米动漫",
|
||||
"name": "大米动漫",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/大米动漫.js"
|
||||
},
|
||||
{
|
||||
"key": "暮暮动漫",
|
||||
"name": "暮暮动漫",
|
||||
"type": 3,
|
||||
"api": "csp_WebMuTeFun",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": "https://www.mutean.com"
|
||||
},
|
||||
{
|
||||
"key": "南瓜弹幕",
|
||||
"name": "弹幕|南瓜",
|
||||
"type": 3,
|
||||
"api": "csp_Nangua",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "酷看弹幕",
|
||||
"name": "弹幕|酷看",
|
||||
"type": 3,
|
||||
"api": "csp_Kkys",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "厂长弹幕",
|
||||
"name": "弹幕|厂长",
|
||||
"type": 3,
|
||||
"api": "csp_Czzy",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "天天弹幕",
|
||||
"name": "弹幕|天天",
|
||||
"type": 3,
|
||||
"api": "csp_TianTian",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "三六零弹幕",
|
||||
"name": "弹幕|三六零",
|
||||
"type": 3,
|
||||
"api": "csp_Sp360",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "机器人弹幕",
|
||||
"name": "弹幕|机器人",
|
||||
"type": 3,
|
||||
"api": "csp_Ikanbot",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "小苹果弹幕",
|
||||
"name": "弹幕|小苹果",
|
||||
"type": 3,
|
||||
"api": "csp_Xpg",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "一起看弹幕",
|
||||
"name": "弹幕|一起看",
|
||||
"type": 3,
|
||||
"api": "csp_Yqk",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "JOJO弹幕",
|
||||
"name": "弹幕|JOJO",
|
||||
"type": 3,
|
||||
"api": "csp_Jiohub",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "荐片弹幕",
|
||||
"name": "弹幕|荐片",
|
||||
"type": 3,
|
||||
"api": "csp_Jianpian",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "哔嘀弹幕",
|
||||
"name": "弹幕|哔嘀",
|
||||
"type": 3,
|
||||
"api": "csp_Bdys",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "不太灵弹幕",
|
||||
"name": "弹幕|不太灵",
|
||||
"type": 3,
|
||||
"api": "csp_Bt0",
|
||||
"searchable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "玩偶弹幕",
|
||||
"name": "弹幕|玩偶",
|
||||
"type": 3,
|
||||
"api": "csp_Wogg",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"site": "https://www.wogg.net",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "六趣弹幕",
|
||||
"name": "弹幕|六趣",
|
||||
"type": 3,
|
||||
"api": "csp_Wogg",
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"site": "https://cms.715d.com",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克玩偶弹幕",
|
||||
"name": "弹幕|玩偶",
|
||||
"type": 3,
|
||||
"api": "csp_Wobg",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克土豆弹幕",
|
||||
"name": "弹幕|土豆",
|
||||
"type": 3,
|
||||
"api": "csp_Wobg",
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"site": "https://tudou.lvdoui.top",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克多多弹幕",
|
||||
"name": "弹幕|多多",
|
||||
"type": 3,
|
||||
"api": "csp_Wobg",
|
||||
"quickSearch": 1,
|
||||
"changeable": 1,
|
||||
"filterable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"site": "https://tv.yydsys.top",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克团长弹幕",
|
||||
"name": "弹幕|团长",
|
||||
"type": 3,
|
||||
"api": "csp_Tzfile",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克影搜弹幕",
|
||||
"name": "弹幕|影搜",
|
||||
"type": 3,
|
||||
"api": "csp_Yingso",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "搜索弹幕",
|
||||
"name": "弹幕|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_PanSearch",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "云云弹幕",
|
||||
"name": "弹幕|云云",
|
||||
"type": 3,
|
||||
"api": "csp_Upys",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "云搜弹幕",
|
||||
"name": "弹幕|云搜",
|
||||
"type": 3,
|
||||
"api": "csp_UpYun",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "盘搜弹幕",
|
||||
"name": "弹幕|盘搜",
|
||||
"type": 3,
|
||||
"api": "csp_PanSou",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "易搜弹幕",
|
||||
"name": "弹幕|易搜",
|
||||
"type": 3,
|
||||
"api": "csp_YiSo",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"danmu": true,
|
||||
"cookie": "satoken=60201207-5254-4d44-8ed9-db4ed5476163"
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "云盘弹幕",
|
||||
"name": "弹幕|云盘",
|
||||
"type": 3,
|
||||
"api": "csp_Yunpan4k",
|
||||
"searchable": 1,
|
||||
"filterable": 0,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "小纸条弹幕",
|
||||
"name": "弹幕|小纸条",
|
||||
"type": 3,
|
||||
"api": "csp_XiaoZhiTiao",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
"jar": "http://127.0.0.1:9978/file/TVBoxOSC/本地仓/danmu.jar"
|
||||
},
|
||||
{
|
||||
"key": "夸克趣盘搜弹幕",
|
||||
"name": "弹幕|趣盘搜",
|
||||
"type": 3,
|
||||
"api": "csp_QuPanSou",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克爱盘搜弹幕",
|
||||
"name": "弹幕|爱盘搜",
|
||||
"type": 3,
|
||||
"api": "csp_AiPanSou",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "夸克盘搜弹幕",
|
||||
"name": "弹幕|夸克盘搜",
|
||||
"type": 3,
|
||||
"api": "csp_Qkpanso",
|
||||
"searchable": 1,
|
||||
"filterable": 1,
|
||||
"changeable": 1,
|
||||
"ext": {
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt",
|
||||
"danmu": true
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "荐片",
|
||||
"name": "磁力|荐片",
|
||||
"type": 3,
|
||||
"api": "csp_JianPian",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "http://api2.rinhome.com"
|
||||
},
|
||||
{
|
||||
"key": "New6v",
|
||||
"name": "磁力|New6V",
|
||||
"type": 3,
|
||||
"api": "csp_New6v",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "https://www.xb6v.com"
|
||||
},
|
||||
{
|
||||
"key": "SeedHub",
|
||||
"name": "磁力|SeedHub",
|
||||
"type": 3,
|
||||
"api": "csp_SeedHub",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "音范丝",
|
||||
"name": "磁力|音范丝",
|
||||
"type": 3,
|
||||
"api": "csp_XPath",
|
||||
"searchable": 1,
|
||||
"quickSearch": 0,
|
||||
"changeable": 0,
|
||||
"ext": "./lib/音范丝.json"
|
||||
},
|
||||
{
|
||||
"key": "磁力熊",
|
||||
"name": "磁力|磁力熊",
|
||||
"type": 3,
|
||||
"api": "./lib/drpy2.min.js",
|
||||
"ext": "./lib/磁力熊.js"
|
||||
},
|
||||
{
|
||||
"key": "美剧迷",
|
||||
"name": "磁力|美剧迷",
|
||||
"type": 3,
|
||||
"api": "csp_MeijuMi",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "迅雷吧",
|
||||
"name": "磁力|迅雷吧",
|
||||
"type": 3,
|
||||
"api": "csp_Xunlei8",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "电影港",
|
||||
"name": "磁力|电影港",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/电影港.json"
|
||||
},
|
||||
{
|
||||
"key": "好恐怖",
|
||||
"name": "磁力|好恐怖",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/好恐怖.json"
|
||||
},
|
||||
{
|
||||
"key": "小白网",
|
||||
"name": "磁力|小白网",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"playerType": 1,
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/小白网.json"
|
||||
},
|
||||
{
|
||||
"key": "布谷TV",
|
||||
"name": "磁力|布谷TV",
|
||||
"type": 3,
|
||||
"api": "csp_XBPQ",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/布谷TV.json"
|
||||
},
|
||||
{
|
||||
"key": "BT天堂",
|
||||
"name": "磁力|BT天堂",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/BT天堂.json"
|
||||
},
|
||||
{
|
||||
"key": "Mp4电影",
|
||||
"name": "磁力|Mp4电影",
|
||||
"type": 3,
|
||||
"api": "csp_Mp4Mov",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "高清MP4",
|
||||
"name": "磁力|高清MP4",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/高清MP4.json"
|
||||
},
|
||||
{
|
||||
"key": "哔嘀影视",
|
||||
"name": "磁力|哔嘀影视",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/哔嘀影视.json"
|
||||
},
|
||||
{
|
||||
"key": "酷吧电影",
|
||||
"name": "磁力|酷吧电影",
|
||||
"type": 3,
|
||||
"api": "csp_KubaCL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "美剧天堂",
|
||||
"name": "磁力|美剧天堂",
|
||||
"type": 3,
|
||||
"api": "csp_MeijuTT",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1
|
||||
},
|
||||
{
|
||||
"key": "我的阿里",
|
||||
"name": "我的|阿里",
|
||||
"type": 3,
|
||||
"api": "csp_MyAli",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
"style": {
|
||||
"type": "list"
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "我的夸克",
|
||||
"name": "我的|夸克",
|
||||
"type": 3,
|
||||
"api": "csp_MyQuark",
|
||||
"searchable": 0,
|
||||
"quickSearch": 0,
|
||||
"filterable": 0,
|
||||
"ext": {
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt"
|
||||
},
|
||||
"style": {
|
||||
"type": "list"
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "阿里合集",
|
||||
"name": "阿里|合集",
|
||||
"type": 3,
|
||||
"api": "csp_AliShare",
|
||||
"searchable": 1,
|
||||
"changeable": 0,
|
||||
"filterable": 0,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"share": "./lib/alishare.txt"
|
||||
},
|
||||
"style": {
|
||||
"type": "list"
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
},
|
||||
{
|
||||
"key": "玩偶哥哥",
|
||||
"name": "云盘|玩偶",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/玩偶哥哥.json"
|
||||
},
|
||||
{
|
||||
"key": "云盘六趣",
|
||||
"name": "云盘|六趣",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/六趣.json"
|
||||
},
|
||||
{
|
||||
"key": "天天开心",
|
||||
"name": "云盘|开心",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/天天开心.json"
|
||||
},
|
||||
{
|
||||
"key": "土豆网盘",
|
||||
"name": "云盘|土豆",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/土豆网盘.json"
|
||||
},
|
||||
{
|
||||
"key": "多多影音",
|
||||
"name": "云盘|多多",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/多多影音.json"
|
||||
},
|
||||
{
|
||||
"key": "云盘搜索",
|
||||
"name": "云盘|搜索",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/云盘搜索.json"
|
||||
},
|
||||
{
|
||||
"key": "影搜",
|
||||
"name": "云盘|影搜",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHiker",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/影搜.json"
|
||||
},
|
||||
{
|
||||
"key": "Upyunso",
|
||||
"name": "云盘|云搜",
|
||||
"type": 3,
|
||||
"api": "csp_Upyunso",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0,
|
||||
"ext": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
{
|
||||
"key": "AliPS",
|
||||
"name": "云盘|盘搜",
|
||||
"type": 3,
|
||||
"api": "csp_AliPS",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0,
|
||||
"ext": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
{
|
||||
"key": "Yisou",
|
||||
"name": "云盘|易搜",
|
||||
"type": 3,
|
||||
"api": "csp_Yisou",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 0,
|
||||
"ext": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
{
|
||||
"key": "阿里苏苏",
|
||||
"name": "云盘|苏苏",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/阿里苏苏.json"
|
||||
},
|
||||
{
|
||||
"key": "云盘论坛",
|
||||
"name": "云盘|论坛",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/云盘论坛.json"
|
||||
},
|
||||
{
|
||||
"key": "云盘资源",
|
||||
"name": "云盘|资源",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/云盘资源.json"
|
||||
},
|
||||
{
|
||||
"key": "我的小站",
|
||||
"name": "云盘|小站",
|
||||
"type": 3,
|
||||
"api": "csp_XYQHikerAL",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "./lib/我的小站.json"
|
||||
},
|
||||
{
|
||||
"key": "Gitcafe",
|
||||
"name": "云盘|小纸条",
|
||||
"type": 3,
|
||||
"api": "csp_Gitcafe",
|
||||
"searchable": 1,
|
||||
"quickSearch": 1,
|
||||
"filterable": 1,
|
||||
"ext": "http://127.0.0.1:9978/file/TVBox/token.txt"
|
||||
},
|
||||
{
|
||||
"key": "push_agent",
|
||||
"name": "推送",
|
||||
"type": 3,
|
||||
"api": "csp_Push",
|
||||
"searchable": 0,
|
||||
"filterable": 0,
|
||||
"changeable": 0,
|
||||
"ext": {
|
||||
"token": "http://127.0.0.1:9978/file/TVBox/token.txt",
|
||||
"cookie": "http://127.0.0.1:9978/file/TVBox/quark.txt"
|
||||
},
|
||||
"jar": "./lib/danmu.jar;md5;5d503b9413e2f2ab1eb547980b170417"
|
||||
}
|
||||
],
|
||||
"parses": [
|
||||
{
|
||||
"name": "聚合",
|
||||
"type": 3,
|
||||
"url": "Demo"
|
||||
},
|
||||
{
|
||||
"name": "线路1",
|
||||
"type": 0,
|
||||
"url": "https://jx.xmflv.com/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "线路2",
|
||||
"type": 0,
|
||||
"url": "https://jx.quankan.app/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "线路3",
|
||||
"type": 0,
|
||||
"url": "https://jx.yparse.com/index.php?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "线路4",
|
||||
"type": 0,
|
||||
"url": "https://jx.jsonplayer.com/player/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "线路5",
|
||||
"type": 0,
|
||||
"url": "https://jx.aidouer.net/?url=",
|
||||
"ext": {
|
||||
"header": {
|
||||
"user-agent": "Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36",
|
||||
"referer": "https://jiejie.uk/"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "线路6",
|
||||
"type": 0,
|
||||
"url": "https://jx.777jiexi.com/player/?url="
|
||||
},
|
||||
{
|
||||
"name": "线路7",
|
||||
"type": 0,
|
||||
"url": "https://www.8090g.cn/?url="
|
||||
},
|
||||
{
|
||||
"name": "线路8",
|
||||
"type": 0,
|
||||
"url": "https://jx.yangtu.top?url="
|
||||
},
|
||||
{
|
||||
"name": "线路9",
|
||||
"type": 0,
|
||||
"url": "https://jx.m3u8.tv/jiexi/?url="
|
||||
},
|
||||
{
|
||||
"name": "线路10",
|
||||
"type": 0,
|
||||
"url": "https://www.ckplayer.vip/jiexi/?url="
|
||||
}
|
||||
],
|
||||
"rules": [
|
||||
{
|
||||
"name": "量子广告",
|
||||
"hosts": [
|
||||
"vip.lz",
|
||||
"hd.lz",
|
||||
".cdnlz"
|
||||
],
|
||||
"regex": [
|
||||
"17.19",
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:7\\.166667,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?1o.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "非凡广告",
|
||||
"hosts": [
|
||||
"vip.ffzy",
|
||||
"hd.ffzy"
|
||||
],
|
||||
"regex": [
|
||||
"17.99",
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:6\\.400000,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?1170(20|32).*?\\.ts\\s+",
|
||||
"#EXTINF.*?\\s+.*?116977.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "索尼广告",
|
||||
"hosts": [
|
||||
"suonizy"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:1\\.000000,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXTINF.*?\\s+.*?p1ayer.*?\\.ts\\s+",
|
||||
"#EXTINF.*?\\s+.*?\\/video\\/original.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "暴风广告",
|
||||
"hosts": [
|
||||
"bfzy",
|
||||
"bfbfvip"
|
||||
],
|
||||
"regex": [
|
||||
"#EXTINF.*?\\s+.*?adjump.*?\\.ts\\s+"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "星星广告",
|
||||
"hosts": [
|
||||
"aws.ulivetv.net"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:8,[\\s\\S]*?#EXT-X-DISCONTINUITY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "快看广告",
|
||||
"hosts": [
|
||||
"kuaikan"
|
||||
],
|
||||
"regex": [
|
||||
"#EXT-X-KEY:METHOD=NONE\\r*\\n*#EXTINF:5,[\\s\\S]*?#EXT-X-DISCONTINUITY",
|
||||
"#EXT-X-KEY:METHOD=NONE\\r*\\n*#EXTINF:2\\.4,[\\s\\S]*?#EXT-X-DISCONTINUITY"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "磁力广告",
|
||||
"hosts": [
|
||||
"magnet"
|
||||
],
|
||||
"regex": [
|
||||
"更多",
|
||||
"请访问",
|
||||
"example",
|
||||
"社 區",
|
||||
"x u u",
|
||||
"直 播",
|
||||
"更 新",
|
||||
"社 区",
|
||||
"有趣",
|
||||
"有 趣",
|
||||
"英皇体育",
|
||||
"全中文AV在线",
|
||||
"澳门皇冠赌场",
|
||||
"哥哥快来",
|
||||
"美女荷官",
|
||||
"裸聊",
|
||||
"新片首发",
|
||||
"UUE29"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "一起看广告",
|
||||
"hosts": [
|
||||
"yqk88"
|
||||
],
|
||||
"regex": [
|
||||
"18.4",
|
||||
"15.1666",
|
||||
"16.5333",
|
||||
"#EXT-X-DISCONTINUITY\\r*\\n*[\\s\\S]*?#EXT-X-CUE-IN"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "火山嗅探",
|
||||
"hosts": [
|
||||
"huoshan.com"
|
||||
],
|
||||
"regex": [
|
||||
"item_id="
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "抖音嗅探",
|
||||
"hosts": [
|
||||
"douyin.com"
|
||||
],
|
||||
"regex": [
|
||||
"is_play_url="
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "农民嗅探",
|
||||
"hosts": [
|
||||
"toutiaovod.com"
|
||||
],
|
||||
"regex": [
|
||||
"video/tos/cn"
|
||||
]
|
||||
}
|
||||
],
|
||||
"doh": [
|
||||
{
|
||||
"name": "Google",
|
||||
"url": "https://dns.google/dns-query",
|
||||
"ips": [
|
||||
"8.8.4.4",
|
||||
"8.8.8.8"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Cloudflare",
|
||||
"url": "https://cloudflare-dns.com/dns-query",
|
||||
"ips": [
|
||||
"1.1.1.1",
|
||||
"1.0.0.1",
|
||||
"2606:4700:4700::1111",
|
||||
"2606:4700:4700::1001"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "AdGuard",
|
||||
"url": "https://dns.adguard.com/dns-query",
|
||||
"ips": [
|
||||
"94.140.14.140",
|
||||
"94.140.14.141"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DNSWatch",
|
||||
"url": "https://resolver2.dns.watch/dns-query",
|
||||
"ips": [
|
||||
"84.200.69.80",
|
||||
"84.200.70.40"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Quad9",
|
||||
"url": "https://dns.quad9.net/dns-quer",
|
||||
"ips": [
|
||||
"9.9.9.9",
|
||||
"149.112.112.112"
|
||||
]
|
||||
}
|
||||
],
|
||||
"lives": [
|
||||
{
|
||||
"name": "live",
|
||||
"type": 0,
|
||||
"url": "./lib/live.txt",
|
||||
"playerType": 1,
|
||||
"epg": "http://epg.112114.eu.org/?ch={name}&date={date}"
|
||||
}
|
||||
],
|
||||
"flags": [
|
||||
"youku",
|
||||
"优酷",
|
||||
"优 酷",
|
||||
"优酷视频",
|
||||
"qq",
|
||||
"腾讯",
|
||||
"腾 讯",
|
||||
"腾讯视频",
|
||||
"iqiyi",
|
||||
"qiyi",
|
||||
"奇艺",
|
||||
"爱奇艺",
|
||||
"爱 奇 艺",
|
||||
"m1905",
|
||||
"xigua",
|
||||
"letv",
|
||||
"leshi",
|
||||
"乐视",
|
||||
"乐 视",
|
||||
"sohu",
|
||||
"搜狐",
|
||||
"搜 狐",
|
||||
"搜狐视频",
|
||||
"tudou",
|
||||
"pptv",
|
||||
"mgtv",
|
||||
"芒果",
|
||||
"imgo",
|
||||
"芒果TV",
|
||||
"芒 果 T V",
|
||||
"bilibili",
|
||||
"哔 哩",
|
||||
"哔 哩 哔 哩"
|
||||
],
|
||||
"ijk": [
|
||||
{
|
||||
"group": "软解码",
|
||||
"options": [
|
||||
{
|
||||
"category": 4,
|
||||
"name": "opensles",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "overlay-format",
|
||||
"value": "842225234"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "framedrop",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "soundtouch",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "start-on-prepared",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "http-detect-range-support",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "fflags",
|
||||
"value": "fastseek"
|
||||
},
|
||||
{
|
||||
"category": 2,
|
||||
"name": "skip_loop_filter",
|
||||
"value": "48"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "reconnect",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "enable-accurate-seek",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-auto-rotate",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-handle-resolution-change",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-hevc",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "dns_cache_timeout",
|
||||
"value": "600000000"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "硬解码",
|
||||
"options": [
|
||||
{
|
||||
"category": 4,
|
||||
"name": "opensles",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "overlay-format",
|
||||
"value": "842225234"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "framedrop",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "soundtouch",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "start-on-prepared",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "http-detect-range-support",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "fflags",
|
||||
"value": "fastseek"
|
||||
},
|
||||
{
|
||||
"category": 2,
|
||||
"name": "skip_loop_filter",
|
||||
"value": "48"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "reconnect",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "enable-accurate-seek",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-auto-rotate",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-handle-resolution-change",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 4,
|
||||
"name": "mediacodec-hevc",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"category": 1,
|
||||
"name": "dns_cache_timeout",
|
||||
"value": "600000000"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"ads": [
|
||||
"static-mozai.4gtv.tv"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
http://127.0.0.1:9978/file/TVBox/quark.txt
|
||||
http://127.0.0.1:9978/file/TVBoxOSC/本地仓/danmu.jar
|
||||
@@ -0,0 +1 @@
|
||||
clan://localhost/tvbox/xiaosa/xiaosa.json
|
||||
Reference in New Issue
Block a user