mirror of
https://github.com/qist/tvbox.git
synced 2025-01-24 03:04:56 +08:00
update CAT
This commit is contained in:
parent
e8a866b4bd
commit
a1df95e46b
1
cat/js/18a_open.js
Normal file
1
cat/js/18a_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/4kys_open.js
Normal file
1
cat/js/4kys_open.js
Normal file
File diff suppressed because one or more lines are too long
183
cat/js/4kysxz_open.js
Normal file
183
cat/js/4kysxz_open.js
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
import { Crypto, load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let siteUrl = 'https://4kysxz.top';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let headers = {};
|
||||||
|
|
||||||
|
async function request(reqUrl, postData, agentSp, get) {
|
||||||
|
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: get ? 'get' : 'post',
|
||||||
|
headers: headers,
|
||||||
|
data: postData || {},
|
||||||
|
postType: get ? '' : 'form',
|
||||||
|
});
|
||||||
|
|
||||||
|
let content = res.content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let classes = [{
|
||||||
|
type_id: '16',
|
||||||
|
type_name: '高清电影',
|
||||||
|
},{
|
||||||
|
type_id: '17',
|
||||||
|
type_name: '高清剧集',
|
||||||
|
}];
|
||||||
|
|
||||||
|
//let filterObj = genFilterObj();
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
//filters: filterObj
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
let videos = await getVideos(siteUrl);
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (!pg) pg = 1;
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
let url = siteUrl + '/category-' + tid + '_' + pg + '.html';
|
||||||
|
let videos = await getVideos(url);
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
page: pg,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
try {
|
||||||
|
const html = await request(id);
|
||||||
|
const $ = load(html);
|
||||||
|
|
||||||
|
|
||||||
|
let actors = _.map($('div.entry-content.u-text-format.u-clearfix > div:nth-child(10) > div > span > span'), (n) => {
|
||||||
|
return $(n).text().split(' ')[0];
|
||||||
|
});
|
||||||
|
let actor = actors.join(' ');
|
||||||
|
|
||||||
|
let directors = _.map($('div.entry-content.u-text-format.u-clearfix > div:nth-child(8) > div > span'), (n) => {
|
||||||
|
return $(n).text().split(' ')[0];
|
||||||
|
});
|
||||||
|
let director = directors.join(' ');
|
||||||
|
|
||||||
|
let title = $('div.site-content > section > div > header > h1').text().trim();
|
||||||
|
|
||||||
|
let content = '该影视由【Leospring】采集分享';
|
||||||
|
let playUrlStr = '';
|
||||||
|
let playFromStr = '';
|
||||||
|
//高清直播
|
||||||
|
const cards = $('div.entry-content.u-text-format.u-clearfix > custag > ul > li > a');
|
||||||
|
if (cards.length > 0) {
|
||||||
|
let playUrls = _.map(cards, (n) => {
|
||||||
|
let playUrl = n.attribs['href'];
|
||||||
|
if (playUrl.indexOf('url=') > 0) {
|
||||||
|
playUrl = playUrl.split('url=')[1].split('&name')[0];
|
||||||
|
}
|
||||||
|
return $(n).text() + '$' + playUrl;
|
||||||
|
});
|
||||||
|
playUrlStr = playUrls.join('#');
|
||||||
|
playFromStr = '高清直播';
|
||||||
|
}
|
||||||
|
|
||||||
|
//磁力链接
|
||||||
|
const tbs = $('loginshow > table');
|
||||||
|
let playFrom = '';
|
||||||
|
let nameUrls = [];
|
||||||
|
for(let i = 0;i< tbs.length;i++) {
|
||||||
|
if (i%2 == 0) {
|
||||||
|
playFrom = $(tbs[i]).find('tbody > tr >td').text().replaceAll('WEB', '磁力');
|
||||||
|
} else if (i%2 == 1) {
|
||||||
|
const tds = $(tbs[i]).find('tbody > tr >td');
|
||||||
|
let nameUrl = '';
|
||||||
|
for (let j = 0;j < tds.length;j++) {
|
||||||
|
if (j%2 == 0) {
|
||||||
|
nameUrl = $(tds[j]).text().split('.')[0].split(' ')[0];
|
||||||
|
} else if (j%2==1){
|
||||||
|
nameUrl = nameUrl + '$' + $(tds[j]).text().split('【')[0];
|
||||||
|
nameUrls.push(nameUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (playFromStr.length > 0) {
|
||||||
|
playFromStr += '$$$';
|
||||||
|
playUrlStr += '$$$';
|
||||||
|
}
|
||||||
|
playFromStr += playFrom;
|
||||||
|
playUrlStr += nameUrls.join('#');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const video = {
|
||||||
|
vod_actor: actor,
|
||||||
|
vod_play_from: playFromStr,
|
||||||
|
vod_play_url: playUrlStr,
|
||||||
|
vod_director: director,
|
||||||
|
vod_content: content,
|
||||||
|
};
|
||||||
|
const list = [video];
|
||||||
|
const result = { list };
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
//console.log('err', e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let url = siteUrl + '/search.php?q=' + wd
|
||||||
|
//console.log('search url:', url);
|
||||||
|
let videos = await getVideos(url);
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getVideos(url) {
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.row.posts-wrapper >div > article > div.entry-media > div > a')
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['href'];
|
||||||
|
let name = $($(n).find('img')[0]).attr('alt').replaceAll('<strong>','').replaceAll('</strong>', '').split(' ')[0];
|
||||||
|
let pic = $($(n).find('img')[0]).attr('data-src');
|
||||||
|
return {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return videos;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
cat/js/52ju_open.js
Normal file
1
cat/js/52ju_open.js
Normal file
File diff suppressed because one or more lines are too long
894
cat/js/AppYsV2.js
Normal file
894
cat/js/AppYsV2.js
Normal file
@ -0,0 +1,894 @@
|
|||||||
|
import { Crypto, _ } from 'assets://js/lib/cat.js'
|
||||||
|
|
||||||
|
let host = '';
|
||||||
|
let header = {
|
||||||
|
'User-Agent': 'okhttp/3.12.11'
|
||||||
|
};
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = '';
|
||||||
|
let siteJx = '';
|
||||||
|
|
||||||
|
const urlPattern1 = /api\.php\/.*?\/vod/;
|
||||||
|
const urlPattern2 = /api\.php\/.+?\.vod/;
|
||||||
|
const parsePattern = /\/.+\\?.+=/;
|
||||||
|
const parsePattern1 = /.*(url|v|vid|php\?id)=/;
|
||||||
|
const parsePattern2 = /https?:\/\/[^\/]*/;
|
||||||
|
|
||||||
|
const htmlVideoKeyMatch = [
|
||||||
|
/player=new/,
|
||||||
|
/<div id="video"/,
|
||||||
|
/<div id="[^"]*?player"/,
|
||||||
|
/\/\/视频链接/,
|
||||||
|
/HlsJsPlayer\(/,
|
||||||
|
/<iframe[\s\S]*?src="[^"]+?"/,
|
||||||
|
/<video[\s\S]*?src="[^"]+?"/,
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
host = cfg.ext;
|
||||||
|
if (cfg.ext.hasOwnProperty('host')) { // for custom jx
|
||||||
|
host = cfg.ext.host;
|
||||||
|
siteJx = cfg.ext;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async function request(reqUrl, ua, timeout = 60000) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: ua ? ua : {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'},
|
||||||
|
timeout: timeout,
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
try {
|
||||||
|
let url = getCateUrl(host);
|
||||||
|
|
||||||
|
let jsonArray = null;
|
||||||
|
|
||||||
|
if (url) {
|
||||||
|
const json = await request(url, getHeaders(url));
|
||||||
|
const obj = JSON.parse(json);
|
||||||
|
if (obj.hasOwnProperty("list") && Array.isArray(obj.list)) {
|
||||||
|
jsonArray = obj.list;
|
||||||
|
} else if (
|
||||||
|
obj.hasOwnProperty("data") &&
|
||||||
|
obj.data.hasOwnProperty("list") &&
|
||||||
|
Array.isArray(obj.data.list)
|
||||||
|
) {
|
||||||
|
jsonArray = obj.data.list;
|
||||||
|
} else if (obj.hasOwnProperty("data") && Array.isArray(obj.data)) {
|
||||||
|
jsonArray = obj.data;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 通过filter列表读分类
|
||||||
|
const filterStr = getFilterTypes(url, null);
|
||||||
|
const classes = filterStr.split("\n")[0].split("+");
|
||||||
|
jsonArray = [];
|
||||||
|
for (let i = 1; i < classes.length; i++) {
|
||||||
|
const kv = classes[i].trim().split("=");
|
||||||
|
if (kv.length < 2) continue;
|
||||||
|
const newCls = {
|
||||||
|
type_name: kv[0].trim(),
|
||||||
|
type_id: kv[1].trim(),
|
||||||
|
};
|
||||||
|
jsonArray.push(newCls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = { class: [] };
|
||||||
|
if (jsonArray != null) {
|
||||||
|
for (let i = 0; i < jsonArray.length; i++) {
|
||||||
|
const jObj = jsonArray[i];
|
||||||
|
const typeName = jObj.type_name;
|
||||||
|
if (isBan(typeName)) continue;
|
||||||
|
const typeId = jObj.type_id;
|
||||||
|
const newCls = {
|
||||||
|
type_id: typeId,
|
||||||
|
type_name: typeName,
|
||||||
|
};
|
||||||
|
const typeExtend = jObj.type_extend;
|
||||||
|
if (filter) {
|
||||||
|
const filterStr = getFilterTypes(url, typeExtend);
|
||||||
|
|
||||||
|
const filters = filterStr.split("\n");
|
||||||
|
const filterArr = [];
|
||||||
|
for (let k = (url) ? 1 : 0; k < filters.length; k++) {
|
||||||
|
const l = filters[k].trim();
|
||||||
|
if (!l) continue;
|
||||||
|
const oneLine = l.split("+");
|
||||||
|
|
||||||
|
let type = oneLine[0].trim();
|
||||||
|
let typeN = type;
|
||||||
|
if (type.includes("筛选")) {
|
||||||
|
type = type.replace(/筛选/g, "");
|
||||||
|
if (type === "class") typeN = "类型";
|
||||||
|
else if (type === "area") typeN = "地区";
|
||||||
|
else if (type === "lang") typeN = "语言";
|
||||||
|
else if (type === "year") typeN = "年份";
|
||||||
|
}
|
||||||
|
const jOne = {
|
||||||
|
key: type,
|
||||||
|
name: typeN,
|
||||||
|
value: [],
|
||||||
|
};
|
||||||
|
for (let j = 1; j < oneLine.length; j++) {
|
||||||
|
const kv = oneLine[j].trim();
|
||||||
|
const sp = kv.indexOf("=");
|
||||||
|
|
||||||
|
if (sp === -1) {
|
||||||
|
if (isBan(kv)) continue;
|
||||||
|
jOne.value.push({ n: kv, v: kv });
|
||||||
|
} else {
|
||||||
|
const n = kv.substring(0, sp);
|
||||||
|
if (isBan(n)) continue;
|
||||||
|
jOne.value.push({
|
||||||
|
n: n.trim(),
|
||||||
|
v: kv.substring(sp + 1).trim(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filterArr.push(jOne);
|
||||||
|
}
|
||||||
|
if (!result.hasOwnProperty("filters")) {
|
||||||
|
result.filters = {};
|
||||||
|
}
|
||||||
|
result.filters[typeId] = filterArr;
|
||||||
|
}
|
||||||
|
result.class.push(newCls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
try {
|
||||||
|
const apiUrl = host;
|
||||||
|
let url = getRecommendUrl(apiUrl);
|
||||||
|
let isTV = false;
|
||||||
|
|
||||||
|
if (!url) {
|
||||||
|
url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start=";
|
||||||
|
isTV = true;
|
||||||
|
}
|
||||||
|
const json = await request(url, getHeaders(url));
|
||||||
|
const obj = JSON.parse(json);
|
||||||
|
const videos = [];
|
||||||
|
if (isTV) {
|
||||||
|
const jsonArray = obj.data;
|
||||||
|
for (let i = 0; i < jsonArray.length; i++) {
|
||||||
|
const vObj = jsonArray[i];
|
||||||
|
const v = {
|
||||||
|
vod_id: vObj.nextlink,
|
||||||
|
vod_name: vObj.title,
|
||||||
|
vod_pic: vObj.pic,
|
||||||
|
vod_remarks: vObj.state,
|
||||||
|
};
|
||||||
|
videos.push(v);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const arrays = [];
|
||||||
|
findJsonArray(obj, "vlist", arrays);
|
||||||
|
if (arrays.length === 0) {
|
||||||
|
findJsonArray(obj, "vod_list", arrays);
|
||||||
|
}
|
||||||
|
const ids = [];
|
||||||
|
for (const jsonArray of arrays) {
|
||||||
|
for (let i = 0; i < jsonArray.length; i++) {
|
||||||
|
const vObj = jsonArray[i];
|
||||||
|
const vid = vObj.vod_id;
|
||||||
|
if (ids.includes(vid)) continue;
|
||||||
|
ids.push(vid);
|
||||||
|
const v = {
|
||||||
|
vod_id: vid,
|
||||||
|
vod_name: vObj.vod_name,
|
||||||
|
vod_pic: vObj.vod_pic,
|
||||||
|
vod_remarks: vObj.vod_remarks,
|
||||||
|
};
|
||||||
|
videos.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
list: videos,
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
try {
|
||||||
|
const apiUrl = host;
|
||||||
|
|
||||||
|
let url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl);
|
||||||
|
url = url.replace(/#PN#/g, pg);
|
||||||
|
url = url.replace(/筛选class/g, extend?.class ?? "");
|
||||||
|
url = url.replace(/筛选area/g, extend?.area ?? "");
|
||||||
|
url = url.replace(/筛选lang/g, extend?.lang ?? "");
|
||||||
|
url = url.replace(/筛选year/g, extend?.year ?? "");
|
||||||
|
url = url.replace(/排序/g, extend?.排序 ?? "");
|
||||||
|
|
||||||
|
|
||||||
|
const json = await request(url, getHeaders(url));
|
||||||
|
const obj = JSON.parse(json);
|
||||||
|
|
||||||
|
let totalPg = Infinity;
|
||||||
|
try {
|
||||||
|
if (obj.totalpage !== undefined && typeof obj.totalpage === "number") {
|
||||||
|
totalPg = obj.totalpage;
|
||||||
|
} else if (
|
||||||
|
obj.pagecount !== undefined &&
|
||||||
|
typeof obj.pagecount === "number"
|
||||||
|
) {
|
||||||
|
totalPg = obj.pagecount;
|
||||||
|
} else if (
|
||||||
|
obj.data !== undefined &&
|
||||||
|
typeof obj.data === "object" &&
|
||||||
|
obj.data.total !== undefined &&
|
||||||
|
typeof obj.data.total === "number" &&
|
||||||
|
obj.data.limit !== undefined &&
|
||||||
|
typeof obj.data.limit === "number"
|
||||||
|
) {
|
||||||
|
const limit = obj.data.limit;
|
||||||
|
const total = obj.data.total;
|
||||||
|
totalPg = total % limit === 0 ? total / limit : Math.floor(total / limit) + 1;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const jsonArray =
|
||||||
|
obj.list !== undefined
|
||||||
|
? obj.list
|
||||||
|
: obj.data !== undefined && obj.data.list !== undefined
|
||||||
|
? obj.data.list
|
||||||
|
: obj.data;
|
||||||
|
const videos = [];
|
||||||
|
|
||||||
|
if (jsonArray !== undefined) {
|
||||||
|
for (let i = 0; i < jsonArray.length; i++) {
|
||||||
|
const vObj = jsonArray[i];
|
||||||
|
const v = {
|
||||||
|
vod_id: vObj.vod_id !== undefined ? vObj.vod_id : vObj.nextlink,
|
||||||
|
vod_name: vObj.vod_name !== undefined ? vObj.vod_name : vObj.title,
|
||||||
|
vod_pic: vObj.vod_pic !== undefined ? vObj.vod_pic : vObj.pic,
|
||||||
|
vod_remarks: vObj.vod_remarks !== undefined ? vObj.vod_remarks : vObj.state,
|
||||||
|
};
|
||||||
|
videos.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
page: pg,
|
||||||
|
pagecount: totalPg,
|
||||||
|
limit: 90,
|
||||||
|
total: Infinity,
|
||||||
|
list: videos,
|
||||||
|
};
|
||||||
|
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(ids) {
|
||||||
|
try {
|
||||||
|
const apiUrl = host;
|
||||||
|
const url = getPlayUrlPrefix(apiUrl) + ids;
|
||||||
|
|
||||||
|
const json = await request(url, getHeaders(url));
|
||||||
|
const obj = JSON.parse(json);
|
||||||
|
const result = {
|
||||||
|
list: [],
|
||||||
|
};
|
||||||
|
const vod = {};
|
||||||
|
genPlayList(apiUrl, obj, json, vod, ids);
|
||||||
|
result.list.push(vod);
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const parseUrlMap = new Map();
|
||||||
|
|
||||||
|
function genPlayList(URL, object, json, vod, vid) {
|
||||||
|
const playUrls = [];
|
||||||
|
const playFlags = [];
|
||||||
|
|
||||||
|
if (URL.includes("lfytyl.com")) {
|
||||||
|
const data = object.data;
|
||||||
|
vod.vod_id = data.vod_id || vid;
|
||||||
|
vod.vod_name = data.vod_name;
|
||||||
|
vod.vod_pic = data.vod_pic;
|
||||||
|
vod.type_name = data.vod_class || "";
|
||||||
|
vod.vod_year = data.vod_year || "";
|
||||||
|
vod.vod_area = data.vod_area || "";
|
||||||
|
vod.vod_remarks = data.vod_remarks || "";
|
||||||
|
vod.vod_actor = data.vod_actor || "";
|
||||||
|
vod.vod_director = data.vod_director || "";
|
||||||
|
vod.vod_content = data.vod_content || "";
|
||||||
|
|
||||||
|
vod.vod_play_from = data.vod_play_from;
|
||||||
|
vod.vod_play_url = data.vod_play_url;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (URL.includes("api.php/app")) {
|
||||||
|
const data = object.data;
|
||||||
|
vod.vod_id = data.vod_id || vid;
|
||||||
|
vod.vod_name = data.vod_name;
|
||||||
|
vod.vod_pic = data.vod_pic;
|
||||||
|
vod.type_name = data.vod_class || "";
|
||||||
|
vod.vod_year = data.vod_year || "";
|
||||||
|
vod.vod_area = data.vod_area || "";
|
||||||
|
vod.vod_remarks = data.vod_remarks || "";
|
||||||
|
vod.vod_actor = data.vod_actor || "";
|
||||||
|
vod.vod_director = data.vod_director || "";
|
||||||
|
vod.vod_content = data.vod_content || "";
|
||||||
|
|
||||||
|
const vodUrlWithPlayer = data.vod_url_with_player;
|
||||||
|
for (let i = 0; i < vodUrlWithPlayer.length; i++) {
|
||||||
|
const from = vodUrlWithPlayer[i];
|
||||||
|
let flag = from.code.trim();
|
||||||
|
if (flag === "") flag = from.name.trim();
|
||||||
|
playFlags.push(flag);
|
||||||
|
playUrls.push(from.url);
|
||||||
|
|
||||||
|
let purl = from.parse_api;
|
||||||
|
const parseUrls = parseUrlMap.get(flag) || [];
|
||||||
|
if (purl && !parseUrls.includes(purl)) {
|
||||||
|
parseUrls.push(purl);
|
||||||
|
}
|
||||||
|
parseUrlMap.set(flag, parseUrls);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else if (URL.includes("xgapp")) {
|
||||||
|
const data = object.data.vod_info;
|
||||||
|
vod.vod_id = data.vod_id || vid;
|
||||||
|
vod.vod_name = data.vod_name;
|
||||||
|
vod.vod_pic = data.vod_pic;
|
||||||
|
vod.type_name = data.vod_class || "";
|
||||||
|
vod.vod_year = data.vod_year || "";
|
||||||
|
vod.vod_area = data.vod_area || "";
|
||||||
|
vod.vod_remarks = data.vod_remarks || "";
|
||||||
|
vod.vod_actor = data.vod_actor || "";
|
||||||
|
vod.vod_director = data.vod_director || "";
|
||||||
|
vod.vod_content = data.vod_content || "";
|
||||||
|
|
||||||
|
const vodUrlWithPlayer = data.vod_url_with_player;
|
||||||
|
for (let i = 0; i < vodUrlWithPlayer.length; i++) {
|
||||||
|
const from = vodUrlWithPlayer[i];
|
||||||
|
let flag = from.code.trim();
|
||||||
|
if (flag === "") flag = from.name.trim();
|
||||||
|
playFlags.push(flag);
|
||||||
|
playUrls.push(from.url);
|
||||||
|
|
||||||
|
const purl = from.parse_api.trim();
|
||||||
|
const parseUrls = parseUrlMap.get(flag) || [];
|
||||||
|
if (purl && !parseUrls.includes(purl)) {
|
||||||
|
parseUrls.push(purl);
|
||||||
|
}
|
||||||
|
parseUrlMap.set(flag, parseUrls);
|
||||||
|
}
|
||||||
|
} else if (URL.includes(".vod")) {
|
||||||
|
const data = object.data;
|
||||||
|
vod.vod_id = data.vod_id || vid;
|
||||||
|
vod.vod_name = data.vod_name;
|
||||||
|
vod.vod_pic = data.vod_pic;
|
||||||
|
vod.type_name = data.vod_class || "";
|
||||||
|
vod.vod_year = data.vod_year || "";
|
||||||
|
vod.vod_area = data.vod_area || "";
|
||||||
|
vod.vod_remarks = data.vod_remarks || "";
|
||||||
|
vod.vod_actor = data.vod_actor || "";
|
||||||
|
vod.vod_director = data.vod_director || "";
|
||||||
|
vod.vod_content = data.vod_content || "";
|
||||||
|
|
||||||
|
const vodUrlWithPlayer = data.vod_play_list;
|
||||||
|
for (let i = 0; i < vodUrlWithPlayer.length; i++) {
|
||||||
|
const from = vodUrlWithPlayer[i];
|
||||||
|
let flag = from.player_info.from.trim();
|
||||||
|
if (flag === "") flag = from.player_info.show.trim();
|
||||||
|
playFlags.push(flag);
|
||||||
|
playUrls.push(from.url);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const parses = [];
|
||||||
|
const parse1 = from.player_info.parse.split(",");
|
||||||
|
const parse2 = from.player_info.parse2.split(",");
|
||||||
|
parses.push(...parse1, ...parse2);
|
||||||
|
const parseUrls = parseUrlMap.get(flag) || [];
|
||||||
|
for (const purl of parses) {
|
||||||
|
if (purl.includes("http")) {
|
||||||
|
const match = purl.match(parsePattern1);
|
||||||
|
if (match) {
|
||||||
|
parseUrls.push(match[0]);
|
||||||
|
}
|
||||||
|
} else if (purl.includes("//")) {
|
||||||
|
const match = purl.match(parsePattern1);
|
||||||
|
if (match) {
|
||||||
|
parseUrls.push("http:" + match[0]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const urlMatch = URL.match(parsePattern2);
|
||||||
|
if (urlMatch) {
|
||||||
|
const match = URL.match(parsePattern1);
|
||||||
|
if (match) {
|
||||||
|
parseUrls.push(urlMatch[0] + match[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (purl.includes("..")) purl = purl.replace(/\.\./g, ".").trim();
|
||||||
|
|
||||||
|
if (purl && !parseUrls.includes(purl)) {
|
||||||
|
parseUrls.push(purl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parseUrlMap.set(flag, parseUrls);
|
||||||
|
} catch (e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (URLPattern1.matcher(URL).find()) {
|
||||||
|
// Same implementation as the previous cases
|
||||||
|
}
|
||||||
|
|
||||||
|
vod.vod_play_from = playFlags.join("$$$");
|
||||||
|
vod.vod_play_url = playUrls.join("$$$");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function play(flag, id, vipFlags) {
|
||||||
|
try {
|
||||||
|
// let parseUrls = parseUrlMap.get(flag);
|
||||||
|
let parseUrls = siteJx[flag]; // custom sitejx
|
||||||
|
if (!parseUrls) {
|
||||||
|
if (siteJx.hasOwnProperty('*')) { // all jx
|
||||||
|
parseUrls = siteJx['*'];
|
||||||
|
} else {
|
||||||
|
parseUrls = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseUrls.length > 0) {
|
||||||
|
const result = await getFinalVideo(flag, parseUrls, id);
|
||||||
|
if (result !== null) {
|
||||||
|
return JSON.stringify(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVideo(id)) {
|
||||||
|
const result = {
|
||||||
|
parse: 0,
|
||||||
|
playUrl: "",
|
||||||
|
url: id
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} else {
|
||||||
|
const result = {
|
||||||
|
parse: 1,
|
||||||
|
jx: "1",
|
||||||
|
url: id
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Handle any error here
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(key, quick) {
|
||||||
|
try {
|
||||||
|
const apiUrl = host;
|
||||||
|
const url = getSearchUrl(apiUrl, encodeURIComponent(key));
|
||||||
|
const json = await request(url, getHeaders(url));
|
||||||
|
const obj = JSON.parse(json);
|
||||||
|
let jsonArray = null;
|
||||||
|
const videos = [];
|
||||||
|
|
||||||
|
if (obj.list instanceof Array) {
|
||||||
|
jsonArray = obj.list;
|
||||||
|
} else if (obj.data instanceof Object && obj.data.list instanceof Array) {
|
||||||
|
jsonArray = obj.data.list;
|
||||||
|
} else if (obj.data instanceof Array) {
|
||||||
|
jsonArray = obj.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonArray !== null) {
|
||||||
|
for (const vObj of jsonArray) {
|
||||||
|
if (vObj.vod_id) {
|
||||||
|
const v = {
|
||||||
|
vod_id: vObj.vod_id,
|
||||||
|
vod_name: vObj.vod_name,
|
||||||
|
vod_pic: vObj.vod_pic,
|
||||||
|
vod_remarks: vObj.vod_remarks
|
||||||
|
};
|
||||||
|
videos.push(v);
|
||||||
|
} else {
|
||||||
|
const v = {
|
||||||
|
vod_id: vObj.nextlink,
|
||||||
|
vod_name: vObj.title,
|
||||||
|
vod_pic: vObj.pic,
|
||||||
|
vod_remarks: vObj.state
|
||||||
|
};
|
||||||
|
videos.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = { list: videos };
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async function getFinalVideo(flag, parseUrls, url) {
|
||||||
|
let htmlPlayUrl = "";
|
||||||
|
for (const parseUrl of parseUrls) {
|
||||||
|
if (parseUrl === "" || parseUrl === "null") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const playUrl = parseUrl + url;
|
||||||
|
const content = await request(playUrl, null, 10000); // 10秒请求,能更好过滤webjx
|
||||||
|
let tryJson = null;
|
||||||
|
try {
|
||||||
|
tryJson = jsonParse(url, content);
|
||||||
|
} catch (error) { }
|
||||||
|
|
||||||
|
if (tryJson !== null && tryJson.hasOwnProperty("url") && tryJson.hasOwnProperty("header")) {
|
||||||
|
tryJson.header = JSON.stringify(tryJson.header);
|
||||||
|
return tryJson;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (content.includes("<html")) {
|
||||||
|
let sniffer = false;
|
||||||
|
for (const p of htmlVideoKeyMatch) {
|
||||||
|
if (p.test(content)) {
|
||||||
|
sniffer = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sniffer) {
|
||||||
|
htmlPlayUrl = parseUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (htmlPlayUrl !== "") { // 不支持sniffer
|
||||||
|
const result = {
|
||||||
|
parse: 0,
|
||||||
|
playUrl: "",
|
||||||
|
url: url
|
||||||
|
};
|
||||||
|
return JSON.stringify(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function jsonParse(input, json) {
|
||||||
|
try {
|
||||||
|
// 处理解析接口返回的报文,如果返回的报文中包含header信息,就加到返回值中
|
||||||
|
let jsonPlayData = JSON.parse(json);
|
||||||
|
// 处理293的解析结果url在data字段的解析
|
||||||
|
if (jsonPlayData.hasOwnProperty("data") && typeof jsonPlayData.data === "object" && !jsonPlayData.hasOwnProperty("url")) {
|
||||||
|
jsonPlayData = jsonPlayData.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
let url = jsonPlayData.url;
|
||||||
|
|
||||||
|
if (url.startsWith("//")) {
|
||||||
|
url = "https:" + url;
|
||||||
|
}
|
||||||
|
if (!url.trim().startsWith("http")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (url === input) {
|
||||||
|
if (isVip(url) || !isVideoFormat(url)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isBlackVodUrl(input, url)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let headers = {};
|
||||||
|
if (jsonPlayData.hasOwnProperty("header")) {
|
||||||
|
headers = jsonPlayData.header;
|
||||||
|
} else if (jsonPlayData.hasOwnProperty("Header")) {
|
||||||
|
headers = jsonPlayData.Header;
|
||||||
|
} else if (jsonPlayData.hasOwnProperty("headers")) {
|
||||||
|
headers = jsonPlayData.headers;
|
||||||
|
} else if (jsonPlayData.hasOwnProperty("Headers")) {
|
||||||
|
headers = jsonPlayData.Headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
let ua = "";
|
||||||
|
if (jsonPlayData.hasOwnProperty("user-agent")) {
|
||||||
|
ua = jsonPlayData["user-agent"];
|
||||||
|
} else if (jsonPlayData.hasOwnProperty("User-Agent")) {
|
||||||
|
ua = jsonPlayData["User-Agent"];
|
||||||
|
}
|
||||||
|
if (ua.trim().length > 0) {
|
||||||
|
headers["User-Agent"] = " " + ua;
|
||||||
|
}
|
||||||
|
|
||||||
|
let referer = "";
|
||||||
|
if (jsonPlayData.hasOwnProperty("referer")) {
|
||||||
|
referer = jsonPlayData.referer;
|
||||||
|
} else if (jsonPlayData.hasOwnProperty("Referer")) {
|
||||||
|
referer = jsonPlayData.Referer;
|
||||||
|
}
|
||||||
|
if (referer.trim().length > 0) {
|
||||||
|
headers["Referer"] = " " + referer;
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = fixJsonVodHeader(headers, input, url);
|
||||||
|
|
||||||
|
const taskResult = {
|
||||||
|
header: headers,
|
||||||
|
url: url,
|
||||||
|
parse: "0"
|
||||||
|
};
|
||||||
|
|
||||||
|
return taskResult;
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isVip(url) {
|
||||||
|
try {
|
||||||
|
let isVip = false;
|
||||||
|
const host = new URL(url).hostname;
|
||||||
|
const vipWebsites = ["iqiyi.com", "v.qq.com", "youku.com", "le.com", "tudou.com", "mgtv.com", "sohu.com", "acfun.cn", "bilibili.com", "baofeng.com", "pptv.com"];
|
||||||
|
for (let b = 0; b < vipWebsites.length; b++) {
|
||||||
|
if (host.includes(vipWebsites[b])) {
|
||||||
|
if (vipWebsites[b] === "iqiyi.com") {
|
||||||
|
// 爱奇艺需要特殊处理
|
||||||
|
if (url.includes("iqiyi.com/a_") || url.includes("iqiyi.com/w_") || url.includes("iqiyi.com/v_")) {
|
||||||
|
isVip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
isVip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isVip;
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function isBlackVodUrl(input, url) {
|
||||||
|
return url.includes("973973.xyz") || url.includes(".fit:");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function fixJsonVodHeader(headers, input, url) {
|
||||||
|
if (headers === null) {
|
||||||
|
headers = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input.includes("www.mgtv.com")) {
|
||||||
|
headers["Referer"] = " ";
|
||||||
|
headers["User-Agent"] = " Mozilla/5.0";
|
||||||
|
} else if (url.includes("titan.mgtv")) {
|
||||||
|
headers["Referer"] = " ";
|
||||||
|
headers["User-Agent"] = " Mozilla/5.0";
|
||||||
|
} else if (input.includes("bilibili")) {
|
||||||
|
headers["Referer"] = " https://www.bilibili.com/";
|
||||||
|
headers["User-Agent"] = " " + Misc.UaWinChrome;
|
||||||
|
}
|
||||||
|
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const snifferMatch = /http((?!http).){26,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\?.*|http((?!http).){26,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}\/m3u8\?pt=m3u8.*|http((?!http).)*?default\.ixigua\.com\/.*|http((?!http).)*?cdn-tos[^\?]*|http((?!http).)*?\/obj\/tos[^\?]*|http.*?\/player\/m3u8play\.php\?url=.*|http.*?\/player\/.*?[pP]lay\.php\?url=.*|http.*?\/playlist\/m3u8\/\?vid=.*|http.*?\.php\?type=m3u8&.*|http.*?\/download.aspx\?.*|http.*?\/api\/up_api.php\?.*|https.*?\.66yk\.cn.*|http((?!http).)*?netease\.com\/file\/.*/;
|
||||||
|
|
||||||
|
function isVideoFormat(url) {
|
||||||
|
if (snifferMatch.test(url)) {
|
||||||
|
return !url.includes("cdn-tos") || !url.includes(".js");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function isVideo(url) {
|
||||||
|
if (!url.includes(".mp4") || !url.includes(".m3u8")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function UA(url) {
|
||||||
|
if (url.includes(".vod")) {
|
||||||
|
return "okhttp/4.1.0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCateUrl(URL) {
|
||||||
|
if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
return URL + "nav?token=";
|
||||||
|
} else if (URL.includes(".vod")) {
|
||||||
|
return URL + "/types";
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPlayUrlPrefix(URL) {
|
||||||
|
if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
return URL + "video_detail?id=";
|
||||||
|
} else if (URL.includes(".vod")) {
|
||||||
|
return URL + "/detail?vod_id=";
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRecommendUrl(URL) {
|
||||||
|
if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
return URL + "index_video?token=";
|
||||||
|
} else if (URL.includes(".vod")) {
|
||||||
|
return URL + "/vodPhbAll";
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFilterTypes(URL, typeExtend) {
|
||||||
|
let str = "";
|
||||||
|
|
||||||
|
if (typeExtend !== null) {
|
||||||
|
for (let key in typeExtend) {
|
||||||
|
if (key === "class" || key === "area" || key === "lang" || key === "year") {
|
||||||
|
try {
|
||||||
|
|
||||||
|
str += "筛选" + key + "+全部=+" + typeExtend[key].replace(/,/g, "+") + "\n";
|
||||||
|
} catch (e) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (URL.includes(".vod")) {
|
||||||
|
str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
|
||||||
|
} else if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
// Do nothing, leave the string as it is.
|
||||||
|
} else {
|
||||||
|
str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2023+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCateFilterUrlSuffix(URL) {
|
||||||
|
if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&limit=18&pg=#PN#";
|
||||||
|
} else if (URL.includes(".vod")) {
|
||||||
|
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&by=排序&limit=18&page=#PN#";
|
||||||
|
} else {
|
||||||
|
return "&page=#PN#&area=筛选area&type=筛选class&start=筛选year";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCateFilterUrlPrefix(URL) {
|
||||||
|
if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
return URL + "video?tid=";
|
||||||
|
} else if (URL.includes(".vod")) {
|
||||||
|
return URL + "?type=";
|
||||||
|
} else {
|
||||||
|
return URL + "?ac=list&class=";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isBan(key) {
|
||||||
|
return key === "伦理" || key === "情色" || key === "福利";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSearchUrl(URL, KEY) {
|
||||||
|
if (URL.includes(".vod")) {
|
||||||
|
return URL + "?wd=" + KEY + "&page=";
|
||||||
|
} else if (URL.includes("api.php/app") || URL.includes("xgapp")) {
|
||||||
|
return URL + "search?text=" + KEY + "&pg=";
|
||||||
|
} else if (urlPattern1.test(URL)) {
|
||||||
|
return URL + "?ac=list&zm=" + KEY + "&page=";
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function findJsonArray(obj, match, result) {
|
||||||
|
Object.keys(obj).forEach((k) => {
|
||||||
|
try {
|
||||||
|
const o = obj[k];
|
||||||
|
if (k === match && Array.isArray(o)) {
|
||||||
|
result.push(o);
|
||||||
|
}
|
||||||
|
if (typeof o === "object" && o !== null) {
|
||||||
|
if (Array.isArray(o)) {
|
||||||
|
o.forEach((item) => {
|
||||||
|
if (typeof item === "object" && item !== null) {
|
||||||
|
findJsonArray(item, match, result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
findJsonArray(o, match, result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function jsonArr2Str(array) {
|
||||||
|
const strings = [];
|
||||||
|
for (let i = 0; i < array.length; i++) {
|
||||||
|
try {
|
||||||
|
strings.push(array[i]);
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strings.join(",");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getHeaders(URL) {
|
||||||
|
const headers = {};
|
||||||
|
headers["User-Agent"] = UA(URL);
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isJsonString(str) {
|
||||||
|
try {
|
||||||
|
JSON.parse(str);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
144
cat/js/MyCatBookan.js
Normal file
144
cat/js/MyCatBookan.js
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
import { _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'bookan';
|
||||||
|
let url = 'https://api.bookan.com.cn';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return JSON.stringify({
|
||||||
|
class: [
|
||||||
|
{ type_id: '1305', type_name: '少年读物' },
|
||||||
|
{ type_id: '1304', type_name: '儿童文学' },
|
||||||
|
{ type_id: '1320', type_name: '国学经典' },
|
||||||
|
{ type_id: '1306', type_name: '文艺少年' },
|
||||||
|
{ type_id: '1309', type_name: '育儿心经' },
|
||||||
|
{ type_id: '1310', type_name: '心理哲学' },
|
||||||
|
{ type_id: '1307', type_name: '青春励志' },
|
||||||
|
{ type_id: '1312', type_name: '历史小说' },
|
||||||
|
{ type_id: '1303', type_name: '故事会' },
|
||||||
|
{ type_id: '1317', type_name: '音乐戏剧' },
|
||||||
|
{ type_id: '1319', type_name: '相声评书' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
pg = pg || 1;
|
||||||
|
if (pg == 0) pg = 1;
|
||||||
|
let content = await request(`${url}/voice/book/list?instance_id=25304&page=${pg}&category_id=${tid}&num=24`);
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
let books = [];
|
||||||
|
for (const book of data.list) {
|
||||||
|
books.push({
|
||||||
|
vod_id: book.id,
|
||||||
|
vod_name: book.name,
|
||||||
|
vod_pic: book.cover,
|
||||||
|
vod_remarks: book.extra.author,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: data.current_page,
|
||||||
|
pagecount: data.last_page,
|
||||||
|
limit: 24,
|
||||||
|
total: data.total,
|
||||||
|
list: books,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
let content = await request(`${url}/voice/album/units?album_id=${id}&page=1&num=200&order=1`);
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
console.log(JSON.stringify(data));
|
||||||
|
|
||||||
|
let book = {
|
||||||
|
vod_id: id,
|
||||||
|
type_name: '',
|
||||||
|
vod_year: '',
|
||||||
|
vod_area: '',
|
||||||
|
vod_remarks: '',
|
||||||
|
vod_actor: '',
|
||||||
|
vod_director: '',
|
||||||
|
vod_content: '',
|
||||||
|
};
|
||||||
|
let us = _.map(data.list, function (b) {
|
||||||
|
return formatPlayUrl(b.title) + '$' + b.file;
|
||||||
|
}).join('#');
|
||||||
|
book.vod_play_from = '书卷';
|
||||||
|
book.vod_play_url = us;
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [book],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatPlayUrl(name) {
|
||||||
|
return name
|
||||||
|
.trim()
|
||||||
|
.replace(/<|>|\.《.*?》/g, '. ')
|
||||||
|
.replace(/\$|#/g, ' ')
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
pg = pg || 1;
|
||||||
|
if (pg == 0) pg = 1;
|
||||||
|
let content = await request(`https://es.bookan.com.cn/api/v3/voice/book?instanceId=25304&keyword=${wd}&pageNum=${pg}&limitNum=20`);
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
let books = [];
|
||||||
|
for (const book of data.list) {
|
||||||
|
books.push({
|
||||||
|
vod_id: book.id,
|
||||||
|
vod_name: book.name,
|
||||||
|
vod_pic: book.cover,
|
||||||
|
vod_remarks: book.extra.author,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: data.current_page,
|
||||||
|
pagecount: data.last_page,
|
||||||
|
limit: 20,
|
||||||
|
total: data.total,
|
||||||
|
list: books,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
137
cat/js/bookan_open.js
Normal file
137
cat/js/bookan_open.js
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
import { _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'bookkan';
|
||||||
|
let url = 'https://api.bookan.com.cn';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
return JSON.stringify({
|
||||||
|
class: [
|
||||||
|
{ type_id: '1305', type_name: '少年读物' },
|
||||||
|
{ type_id: '1304', type_name: '儿童文学' },
|
||||||
|
{ type_id: '1320', type_name: '国学经典' },
|
||||||
|
{ type_id: '1306', type_name: '文艺少年' },
|
||||||
|
{ type_id: '1309', type_name: '育儿心经' },
|
||||||
|
{ type_id: '1310', type_name: '心理哲学' },
|
||||||
|
{ type_id: '1307', type_name: '青春励志' },
|
||||||
|
{ type_id: '1312', type_name: '历史小说' },
|
||||||
|
{ type_id: '1303', type_name: '故事会' },
|
||||||
|
{ type_id: '1317', type_name: '音乐戏剧' },
|
||||||
|
{ type_id: '1319', type_name: '相声评书' },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
pg = pg || 1;
|
||||||
|
if (pg == 0) pg = 1;
|
||||||
|
let content = await request(`${url}/voice/book/list?instance_id=25304&page=${pg}&category_id=${tid}&num=24`);
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
let books = [];
|
||||||
|
for (const book of data.list) {
|
||||||
|
books.push({
|
||||||
|
book_id: book.id,
|
||||||
|
book_name: book.name,
|
||||||
|
book_pic: book.cover,
|
||||||
|
book_remarks: book.extra.author,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: data.current_page,
|
||||||
|
pagecount: data.last_page,
|
||||||
|
limit: 24,
|
||||||
|
total: data.total,
|
||||||
|
list: books,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
let content = await request(`${url}/voice/album/units?album_id=${id}&page=1&num=200&order=1`);
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
|
||||||
|
let book = {
|
||||||
|
audio: 1,
|
||||||
|
book_id: id,
|
||||||
|
type_name: '',
|
||||||
|
book_year: '',
|
||||||
|
book_area: '',
|
||||||
|
book_remarks: '',
|
||||||
|
book_actor: '',
|
||||||
|
book_director: '',
|
||||||
|
book_content: '',
|
||||||
|
};
|
||||||
|
let us = _.map(data.list, function (b) {
|
||||||
|
return formatPlayUrl(b.title) + '$' + b.file;
|
||||||
|
}).join('#');
|
||||||
|
book.volumes = '书卷';
|
||||||
|
book.urls = us;
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [book],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatPlayUrl(name) {
|
||||||
|
return name
|
||||||
|
.trim()
|
||||||
|
.replace(/<|>|《|》/g, '')
|
||||||
|
.replace(/\$|#/g, ' ')
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
pg = pg || 1;
|
||||||
|
if (pg == 0) pg = 1;
|
||||||
|
let content = await request(`https://es.bookan.com.cn/api/v3/voice/book?instanceId=25304&keyword=${wd}&pageNum=${pg}&limitNum=20`);
|
||||||
|
let data = JSON.parse(content).data;
|
||||||
|
let books = [];
|
||||||
|
for (const book of data.list) {
|
||||||
|
books.push({
|
||||||
|
book_id: book.id,
|
||||||
|
book_name: book.name,
|
||||||
|
book_pic: book.cover,
|
||||||
|
book_remarks: book.extra.author,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: data.current_page,
|
||||||
|
pagecount: data.last_page,
|
||||||
|
limit: 20,
|
||||||
|
total: data.total,
|
||||||
|
list: books,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
cat/js/bulei_open.js
Normal file
1
cat/js/bulei_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/cartoon18_open.js
Normal file
1
cat/js/cartoon18_open.js
Normal file
File diff suppressed because one or more lines are too long
@ -1,517 +1,244 @@
|
|||||||
{
|
{
|
||||||
"video": {
|
"video": {
|
||||||
"sites": [
|
"sites": [
|
||||||
{
|
{"key":"豆瓣","name":"🟢 豆瓣👁️\u200d","type":3,"indexs":1,"api":"douban_open.js"},
|
||||||
"key": "豆瓣",
|
{"key":"doubanbb","name":"🟢 片单","type":3,"indexs":1,"api":"doubanbb.js"},
|
||||||
"name": "🟢 豆瓣👁️",
|
{"key":"玩偶哥哥","name":"🟢 玩偶","type":3,"api":"wogg_open.js","ext":"填入阿里token"},
|
||||||
"type": 3,
|
{"key":"玩偶表哥","name":"🟢 表哥","type":3,"api":"wobg_open.js","ext":"填入阿里token"},
|
||||||
"indexs": 1,
|
{"key":"耐看","name":"🟢 耐看","type":3,"api":"nkvod_open.js"},
|
||||||
"api": "douban_open.js"
|
{"key":"爱看机器人","name":"🟢 爱看","type":3,"api":"ikanbot_open.js"},
|
||||||
},
|
{"key":"tiantian","name":"🟢 天天","type":3,"api":"tiantian_open.js"},
|
||||||
{
|
{"key":"快看影视","name":"🟢 快看","type":3,"api":"kkys_open.js"},
|
||||||
"key": "doubanbb",
|
{"key":"厂长资源","name":"🟢 厂长","type":3,"api":"czzy_open.js"},
|
||||||
"name": "🟢 片单",
|
{"key":"素白白","name":"🟢 素白","type":3,"api":"subaibai_open.js"},
|
||||||
"type": 3,
|
{"key":"低端影视","name":"🟢 低端","type":3,"api":"ddys_open.js"},
|
||||||
"indexs": 1,
|
{"key":"高光影视","name":"🟢 高光","type":3,"api":"ggys_open.js"},
|
||||||
"api": "doubanbb.js"
|
{"key":"libvio","name":"🟢 立波","type":3,"api":"libvio_open.js"},
|
||||||
},
|
{"key":"电视直播","name":"🟢 电视","type":3,"api":"caiji.js","ext":"https://tvbox.serv00.net/live.php"},
|
||||||
{
|
{"key":"南瓜","name":"🟢 南瓜①","type":3,"api":"ng_open.js"},
|
||||||
"key": "玩偶哥哥",
|
{"key":"nangua","name":"🟢 南瓜②","type":3,"api":"nangua_open.js"},
|
||||||
"name": "🟢 玩偶",
|
{"key":"巧技一","name":"🟢 巧技①","type":3,"api":"qiao2_open.js","ext":"https://jihulab.com/qiaoji/open/-/raw/main/qiaoji2"},
|
||||||
"type": 3,
|
{"key":"巧技二","name":"🟢 巧技②","type":3,"api":"qiao2_open.js","ext":"https://jihulab.com/qiaoji/open/-/raw/main/qiaoji3"},
|
||||||
"api": "wogg_open.js",
|
{"key":"kanqiu","name":"🟢 看球①","type":3,"api":"kanqiu_open.js","searchable":0,"changeable":0,"style":{"type":"list"}},
|
||||||
"ext": "填入阿里token"
|
{"key":"360ba","name":"🟢 看球②","type":3,"api":"360ba_open.js","searchable":0,"changeable":0,"style":{"type":"list"}},
|
||||||
},
|
{"key":"在线之家","name":"🟢 在线","type":3,"api":"zxzj_open.js"},
|
||||||
{
|
{"key":"一起看","name":"🟢 一起","type":3,"api":"yqktv_open.js"},
|
||||||
"key": "玩偶表哥",
|
{"key":"555电影","name":"🟢 三五","type":3,"api":"555dy_open.js"},
|
||||||
"name": "🟢 表哥",
|
{"key":"圣城影视","name":"🟢 圣城","type":3,"api":"sc1080_open.js"},
|
||||||
"type": 3,
|
{"key":"胖虎影视","name":"🟢 胖虎","type":3,"api":"panghu_open.js"},
|
||||||
"api": "wobg_open.js",
|
{"key":"人人影视","name":"🟢 人人","type":3,"api":"rttks_open.js"},
|
||||||
"ext": "填入阿里token"
|
{"key":"图图影视","name":"🟢 图图","type":3,"api":"tutu_open.js"},
|
||||||
},
|
{"key":"农民影视","name":"🟢 农民","type":3,"api":"nmddd_open.js"},
|
||||||
{
|
{"key":"anfun","name":"🟢 Afun","type":3,"api":"anfun_open.js"},
|
||||||
"key": "耐看",
|
{"key":"58dm","name":"🟢 五八","type":3,"api":"58dm_open.js"},
|
||||||
"name": "🟢 耐看",
|
{"key":"爱动漫","name":"🟢 爱漫","type":3,"api":"adm_open.js"},
|
||||||
"type": 3,
|
{"key":"酷我短剧","name":"🟢 酷我","type":3,"api":"kuwo_open.js"},
|
||||||
"api": "nkvod_open.js"
|
{"key":"短剧网","name":"🟢 短剧","type":3,"api":"duanju5_open.js"},
|
||||||
},
|
{"key":"斗鱼直播","name":"🟢 斗鱼","type":3,"api":"douyu_open.js","ext":{"from":"official","custom":"Popkart,跑跑卡丁车#KartRiderDrift,跑跑卡丁车:漂移#PPKDCSY,跑跑手游#PathofExile,流放之路#hjzgwx,火炬之光:无限#CrossGate,魔力宝贝#g_jyhx,劲乐幻想#xjcs,仙境传说#yqk,一起看"}},
|
||||||
{
|
{"key":"虎牙直播","name":"🟢 虎牙","type":3,"api":"huya_open.js","ext":{"from":"official","custom":"2135,一起看#6245,放映厅#427,流放之路#6399,火炬之光:无限#2891,魔力宝贝#2620,跑跑卡丁车手游#162,跑跑卡丁车#7691,劲乐幻想#2675,仙境传说RO"}},
|
||||||
"key": "爱看机器人",
|
{"key":"我的哔哩","name":"🟢 我哔","type":3,"api":"mybili_open.js"},
|
||||||
"name": "🟢 爱看",
|
{"key":"哔哩","name":"🟢 哔哩","type":3,"api":"bili_open.js","ext":{"categories":"音乐#动画#电影#电视剧#番剧#综艺#国创#搞笑#单机游戏#沙雕动画#沙雕穿越#沙雕","cookie":"DedeUserID=690781341;DedeUserID__ckMd5=cabc96906269c5b6;SESSDATA=2245ba24%2C1684212125%2C466fd%2Ab2;bili_jct=de6fdb60c10f8a83910aa55d79407b4e;"}},
|
||||||
"type": 3,
|
{"key":"哔哩直播","name":"🟢 直播","type":3,"api":"bililive_open.js","ext":{"cookie":"DedeUserID=690781341;DedeUserID__ckMd5=cabc96906269c5b6;SESSDATA=2245ba24%2C1684212125%2C466fd%2Ab2;bili_jct=de6fdb60c10f8a83910aa55d79407b4e;"}},
|
||||||
"api": "ikanbot_open.js"
|
{"key":"火狐资源","name":"🟢 火狐","type":3,"api":"caiji.js","ext":{"url":"https://hhzyapi.com/api.php/provide/vod/from/hhm3u8","categories":["内地剧","欧美剧","香港剧","台湾剧","马泰剧","韩剧","日剧","动作片","爱情片","喜剧片","科幻片","恐怖片","剧情片","战争片","灾难片","悬疑片","犯罪片","奇幻片","记录片","伦理片","动画片","中国动漫","日本动漫","欧美动漫","大陆综艺","日韩综艺","港台综艺","欧美综艺"]}},
|
||||||
},
|
{"key":"新浪资源","name":"🟢 新浪","type":3,"api":"caiji.js","ext":{"url":"https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8","categories":["大陆剧","港澳剧","台湾剧","欧美剧","韩剧","日剧","泰剧","动漫","动漫电影","综艺","动作片","爱情片","科幻片","战争片","剧情片","恐怖片","喜剧片","纪录片","伦理片"]}},
|
||||||
{
|
{"key":"红牛资源","name":"🟢 红牛","type":3,"api":"caiji.js","ext":{"url":"https://www.hongniuzy2.com/api.php/provide/vod/from/hnm3u8/","categories":["国产剧","港澳剧","台湾剧","欧美剧","日剧","泰剧","韩剧","综艺","动漫","动漫电影","动作片","喜剧片","爱情片","科幻片","恐怖片","剧情片","战争片","纪录片","伦理片"]}},
|
||||||
"key": "tiantian",
|
{"key":"速播资源","name":"🟢 速播","type":3,"api":"caiji.js","ext":{"url":"https://subocaiji.com/api.php/provide/vod/from/subm3u8/","categories":["大陆剧","台湾剧","韩剧","美剧","港澳剧","日剧","泰剧","动作片","爱情片","科幻片","战争片","剧情片","恐怖片","喜剧片","纪录片","伦理片","动漫电影","中国动漫","日本动漫","欧美动漫","综艺"]}},
|
||||||
"name": "🟢 天天",
|
{"key":"极速资源","name":"🟢 极速","type":3,"api":"caiji.js","ext":{"url":"https://jszyapi.com/api.php/provide/vod/from/jsm3u8/","categories":["内地剧","欧美剧","香港剧","台湾剧","马泰剧","韩剧","日剧","伦理片","动作片","爱情片","喜剧片","科幻片","恐怖片","剧情片","战争片","灾难片","悬疑片","犯罪片","奇幻片","记录片","动画片","中国动漫","日本动漫","欧美动漫","大陆综艺","日韩综艺","港台综艺","欧美综艺"]}},
|
||||||
"type": 3,
|
{"key":"光速资源","name":"🟢 光速","type":3,"api":"caiji.js","ext":{"url":"https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8","categories":["大陆剧","欧美剧","港澳剧","台湾剧","泰剧","韩剧","日剧","动作片","爱情片","喜剧片","科幻片","恐怖片","战争片","伦理片","动漫电影"]}},
|
||||||
"api": "tiantian_open.js"
|
{"key":"宅腐TV","name":"🟢 宅腐","type":3,"api":"appysv2.js","ext":"http://app.zhaifutvapp.com/ruifenglb_api.php/v1.vod"},
|
||||||
},
|
{"key":"聚视网","name":"🟢 央视","type":3,"api":"cntv_open.js"},
|
||||||
{
|
{"key":"武享UFC","name":"🟢 UFC","type":3,"api":"ufc_open.js"},
|
||||||
"key": "快看影视",
|
{"key":"武享吧","name":"🟢 武享","type":3,"api":"hula8_open.js"},
|
||||||
"name": "🟢 快看",
|
{"key":"兔小贝","name":"🟢 小贝","type":3,"api":"tuxiaobei_open.js"},
|
||||||
"type": 3,
|
{"key":"贝乐虎","name":"🟢 乐虎","type":3,"api":"ubestkid_open.js"},
|
||||||
"api": "kkys_open.js"
|
{"key":"酷奇MV","name":"🟢 酷奇","type":3,"api":"kuqimv_open.js"},
|
||||||
},
|
{"key":"播视网","name":"🟢 童趣","type":3,"api":"boosj_open.js"},
|
||||||
{
|
{"key":"短视频","name":"🟢 短视频","type":3,"api":"sharenice_open.js"},
|
||||||
"key": "厂长资源",
|
{"key":"kanqiu_open","name":"体育 | 看球","type":3,"api":"kanqiu_open.js"},
|
||||||
"name": "🟢 厂长",
|
{"key":"xinshijue_open","name":"影视 | 新视觉","type":3,"api":"xinshijue_open.js"},
|
||||||
"type": 3,
|
{"key":"sc1080_open","name":"影视 | 圣城","type":3,"api":"sc1080_open.js"},
|
||||||
"api": "czzy_open.js"
|
|
||||||
},
|
{"key":"ff_open","name":"影视 | 非凡","type":3,"api":"ff_open.js"},
|
||||||
{
|
{"key":"push_agent","name":"影视 | 推送","type":4,"api":"push_open.js","ext":{"token":"ali_token","cookie":"quark_cookie"}},
|
||||||
"key": "素白白",
|
{"key":"ggys_open","name":"影视 | 高光","type":3,"api":"ggys_open.js"},
|
||||||
"name": "🟢 素白",
|
{"key":"ddys_open","name":"影视 | 低端","type":3,"api":"ddys_open.js"},
|
||||||
"type": 3,
|
{"key":"4kysxz_open","name":"影视 | 4KXZ","type":3,"api":"4kysxz_open.js"},
|
||||||
"api": "subaibai_open.js"
|
{"key":"nkvod_open","name":"影视 | 耐看","type":3,"api":"nkvod_open.js"},
|
||||||
},
|
|
||||||
{
|
{"key":"52ju_open","name":"影视 | 我爱剧","type":3,"api":"52ju_open.js"},
|
||||||
"key": "低端影视",
|
{"key":"dyxs_open","name":"影视 | 电影先生","type":3,"api":"dyxs_openn.js"},
|
||||||
"name": "🟢 低端",
|
{"key":"lz_open","name":"影视 | 量子","type":3,"api":"lz_open.js"},
|
||||||
"type": 3,
|
{"key":"mfk_open","name":"影视 | 免费看","type":3,"api":"mfk_open.js"},
|
||||||
"api": "ddys_open.js"
|
{"key":"mgys_open","name":"影视 | 蘑菇","type":3,"api":"mgys_open.js"},
|
||||||
},
|
{"key":"wf_open","name":"影视 | 奈飞","type":3,"api":"wf_open.js"},
|
||||||
{
|
{"key":"dnys_open","name":"影视 | 大拿","type":3,"api":"dnys_open.js"},
|
||||||
"key": "高光影视",
|
{"key":"voflix_open","name":"影视 | vofx","type":3,"api":"voflix_open.js"},
|
||||||
"name": "🟢 高光",
|
{"key":"4kys_open","name":"影视 | 4K影视","type":3,"api":"4kys_open.js"},
|
||||||
"type": 3,
|
{"key":"zjm_open","name":"影视 | 追剧迷","type":3,"api":"zjm_open.js"},
|
||||||
"api": "ggys_open.js"
|
{"key":"rbzj_open","name":"影视 | 热播追剧","type":3,"api":"rbzj_open.js"},
|
||||||
},
|
{"key":"mayiya_open","name":"影视 | 蚂蚁","type":3,"api":"mayiya_open.js"},
|
||||||
{
|
{"key":"rbk_open","name":"影视 | 热播库","type":3,"api":"rbk_open.js"},
|
||||||
"key": "libvio",
|
{"key":"wpian_open","name":"影视 | pian","type":3,"api":"wpian_open.js"},
|
||||||
"name": "🟢 立波",
|
{"key":"ym_open","name":"影视 | 映迷","type":3,"api":"ym_open.js"},
|
||||||
"type": 3,
|
{"key":"yzz_open","name":"影视 | 影渣","type":3,"api":"yzz_open.js"},
|
||||||
"api": "libvio_open.js"
|
{"key":"1080kk_open","name":"影视 | 1080看看","type":3,"api":"1080kk_open.js"},
|
||||||
},
|
{"key":"panghu_open","name":"影视 | 胖虎","type":3,"api":"panghu_open.js"},
|
||||||
{
|
{"key":"mimiju_open","name":"影视 | 迷迷剧","type":3,"api":"mimiju_open.js"},
|
||||||
"key": "电视直播",
|
{"key":"yjys_open","name":"影视 | 悠久","type":3,"api":"yjys_open.js"},
|
||||||
"name": "🟢 电视",
|
|
||||||
"type": 3,
|
{"key":"wogg","name":"阿里 | 玩偶哥哥","type":3,"api":"wogg.js","ext":"填自己的32位token"},
|
||||||
"api": "caiji.js",
|
{"key":"wobg_open","name":"阿里 | 玩偶表哥","type":3,"api":"wobg_open.js","ext":"填入你的token"},
|
||||||
"ext": "https://tvbox.serv00.net/live.php"
|
{"key":"dovx_open","name":"阿里 | 七夜","type":3,"api":"dovx_open.js","ext":"填入你的token"},
|
||||||
},
|
{"key":"pansearch_open","name":"阿里 | 盘搜索","type":3,"api":"pansearch_open.js","ext":"填入你的token"},
|
||||||
{
|
{"key":"funletu","name":"夸克 | 趣盘搜","type":3,"api":"funletu.js","ext":"夸克cookie,可http"},
|
||||||
"key": "南瓜",
|
|
||||||
"name": "🟢 南瓜①",
|
{"key":"ys996_open","name":"影视 | 996","type":3,"api":"ys996_open.js"},
|
||||||
"type": 3,
|
{"key":"star_open","name":"影视 | 星视界","type":3,"api":"star_open.js"},
|
||||||
"api": "ng_open.js"
|
{"key":"ytvip","name":"影视 | 影探","type":3,"api":"yt.js","ext":"http://ytcms.lyyytv.cn/api.php/app/"},
|
||||||
},
|
{"key":"yqktv_open","name":"影视 | 一起看","type":3,"api":"yqktv_open.js"},
|
||||||
{
|
{"key":"555dy_open","name":"影视 | 555","type":3,"api":"555dy_open.js"},
|
||||||
"key": "nangua",
|
{"key":"yrzj_open","name":"影视 | 伊人","type":3,"api":"yrzj_open.js"},
|
||||||
"name": "🟢 南瓜②",
|
{"key":"yzys_open","name":"影视 | 柚子","type":3,"api":"yzys_open.js"},
|
||||||
"type": 3,
|
{"key":"sssp_open","name":"影视 | 速搜","type":3,"api":"sssp_open.js"},
|
||||||
"api": "nangua_open.js"
|
{"key":"bulei_open","name":"影视 | 布雷","type":3,"api":"bulei_open.js"},
|
||||||
},
|
{"key":"miku_open","name":"影视 | 咪咕","type":3,"api":"miku_open.js"},
|
||||||
{
|
{"key":"tutu_open","name":"影视 | 图图","type":3,"api":"tutu_open.js"},
|
||||||
"key": "巧技一",
|
{"key":"hmsp_open","name":"影视 | 河马","type":3,"api":"hmsp_open.js"},
|
||||||
"name": "🟢 巧技①",
|
{"key":"jojo_open","name":"影视 | jojo","type":3,"api":"jojo_open.js"},
|
||||||
"type": 3,
|
{"key":"jiohub","name":"影视 | jiohub","type":3,"api":"jiohub.js"},
|
||||||
"api": "qiao2_open.js",
|
{"key":"dsxys_open","name":"影视 | 大师兄","type":3,"api":"dsxys_open.js"},
|
||||||
"ext": "https://jihulab.com/qiaoji/open/-/raw/main/qiaoji2"
|
{"key":"mino_open","name":"影视 | Mino","type":3,"api":"mino_open.js"},
|
||||||
},
|
{"key":"ddmv_open","name":"影视 | DDMV","type":3,"api":"ddmv_open.js"},
|
||||||
{
|
{
|
||||||
"key": "巧技二",
|
"key": "rejumao",
|
||||||
"name": "🟢 巧技②",
|
"name": "影视 | 热剧猫",
|
||||||
"type": 3,
|
"type": 3,
|
||||||
"api": "qiao2_open.js",
|
"api": "apptov5_open.js",
|
||||||
"ext": "https://jihulab.com/qiaoji/open/-/raw/main/qiaoji3"
|
"ext": {
|
||||||
},
|
"domains": [
|
||||||
{
|
"https://app-1253196701.cos.ap-shanghai.myqcloud.com/app.txt",
|
||||||
"key": "kanqiu",
|
"https://www.daenwl.com/app.txt"
|
||||||
"name": "🟢 看球①",
|
],
|
||||||
"type": 3,
|
"aesKey": "8y8sDX3ZG22yACH3ZM5KfNGieTxEMKFe",
|
||||||
"api": "kanqiu_open.js",
|
"aesIV": "WxRAbh68C8pP6SpN",
|
||||||
"searchable": 0,
|
"rasPublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Ykikz4aIqkJC899VxwX\nwx27bZJGV/fDbgAHtXxZ73Mq8QWuPfeAanWDWiGPhJu5aVQndADi7B0L5RBIrirf\n6lIzA+l8Ubt6+nvPYQ9NSlRkObE4ML2Hw7ccAmcqzDD0vplJz7Y8o7qKIoyfK5NP\nXDuiv52HgbyEP6KlWCiDfMuIsAA+/3x9C/0RDRgjf3x+24EuGOD6Gnw+rVJCOb64\nW4KZ7vH/uhaQSLLnNYF9VD00c072tOeaBt2mElexJN66gcP65kmrkI5grFz2RcEg\nIEkwUcYBNiFeHUcFyQZuDj/DLqQidwMhFJfkcUuMtByR9cYl9BpqT/3NKVQ1EPrV\n7QIDAQAB\n-----END PUBLIC KEY-----",
|
||||||
"changeable": 0,
|
"ic": "fwEUWytkwJqHICtu/kNrXOVGQAzWUw1mGuQYdT1heOKZ6vEEI+4jf6LAHJ/f4h39ZR2WL4fccGchSoCm+pqkBRi8asSMqZzKGGfY8ejzrYHxDjiTOhs4B6p/iC8Nrj+bcCmXAjVNksfxlcjU6JlbRQ=="
|
||||||
"style": {
|
}
|
||||||
"type": "list"
|
},
|
||||||
}
|
{
|
||||||
},
|
"key": "布雷v5",
|
||||||
{
|
"name": "影视 | 布蕾",
|
||||||
"key": "360ba",
|
"type": 3,
|
||||||
"name": "🟢 看球②",
|
"api": "apptov5_open.js",
|
||||||
"type": 3,
|
"ext": {
|
||||||
"api": "360ba_open.js",
|
"domains": [
|
||||||
"searchable": 0,
|
"https://v5-public-1251970844.cos.ap-shanghai.myqcloud.com/accredits/68.json"
|
||||||
"changeable": 0,
|
],
|
||||||
"style": {
|
"aesKey": "xMQFiWw77QzaiBDKNWjNRAChrenE2zB2",
|
||||||
"type": "list"
|
"aesIV": "j2WbrZph6G7m2mRM",
|
||||||
}
|
"rasPublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvBB/JjVWPpKFAWJCiQc5\neP6FrwNG8mXt/Y/yk98sigh/vNtX0sQX56eQi1YNvZ8sIiqoVWMl1/5NlANA0A/G\n/BiH5hCFYqY5L8adZIZgSd/QR8zMAyEDccVaNog6nmXQkGWjm/269Gl+gFaCOtXO\nzyEullcgevPcGHXwAGbGc1U3XaQjydC3mF290Mk4wKSjCn3sVfMSlgh8lsPhFvBo\n5MqqBWEkIz+eF+3ni2jQqHz1oy23RLPx9cV02GAHCQWFDlEZFUXvQHJU7RJP0X0z\nfpSg9bqVQ22iRvSWIE13S4SRf18eKt7S3yeH53sv/se/evXKyYE7P4wGhxhNuhOe\nXQIDAQAB\n-----END PUBLIC KEY-----\n",
|
||||||
},
|
"ic": "fVO1y5qVGVto+xbgx3hgGlmgOBmxt1sr5g+uWbrh8ENTyZcVFduzilI0OHY/uAMcLNe4EjaSZjmsc8t2SCdcIxZ1q2i+OJHTB90YjwjG+5mLjKf8gbTBhztyxJk68atX5msA1qsFJVhxnqHCGBkViA=="
|
||||||
{
|
}
|
||||||
"key": "在线之家",
|
},
|
||||||
"name": "🟢 在线",
|
{
|
||||||
"type": 3,
|
"key": "追忆",
|
||||||
"api": "zxzj_open.js"
|
"name": "影视 | 追忆",
|
||||||
},
|
"type": 3,
|
||||||
{
|
"api": "apptov5_open.js",
|
||||||
"key": "一起看",
|
"ext": {
|
||||||
"name": "🟢 一起",
|
"domains": [
|
||||||
"type": 3,
|
"https://xtao-1253811961.cos.ap-chengdu.myqcloud.com/appto/xtao.json"
|
||||||
"api": "yqktv_open.js"
|
],
|
||||||
},
|
"aesKey": "we2CwNfG7PJppQmBfX8MMMQaWbSdcDXi",
|
||||||
{
|
"aesIV": "DnT3jxT8RYsa8ctc",
|
||||||
"key": "555电影",
|
"rasPublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsKLhkMcBpvQ7x1bhAVDg\nNWdhJpkVUhWQaunZoDD7IwUNkkzl3cgHOBVo6H8IkoTnMAHwWnLIK9xHTwtN0ikA\nbZvlIOrOWwrhWwGYUAVSAtZm7FDHyVQlW3ZSv+oeBceIE7MZbCi7ZmS3Ft2XedEE\nyjXdvaQN8f+1ORmf/AsMTwfX2QhsjD1qNtq+pCw9wnd+AWGW6lAG8mxNTygfWqKT\n2GZsor5v3qq/qsMiFL7aUy/ZiBlHInzC3R9ZP6mWICt72Su+C9VzH+LHdiSMWmpZ\n1uT7EPJfh0MgzQUbIhNPVMeOBkDcf93DzO+zTDznpPCed12OORZL5PDg/2lK8i+H\nCwIDAQAB\n-----END PUBLIC KEY-----",
|
||||||
"name": "🟢 三五",
|
"ic": "4Dqrm2DknrkdH3qOh7rE2nwK9BUd5cMVriFc+kWKpUedUJt6cLXHcROX9ps/2rBoBEftIjKkCAB5PSxCJUoKm/1n1mEZt7hQLSyIco9fRfS1QwyZItfMvHbjPJoB0vQnOvlcl7C8lgRZHFQLVXh9iA=="
|
||||||
"type": 3,
|
}
|
||||||
"api": "555dy_open.js"
|
},
|
||||||
},
|
|
||||||
{
|
{"key":"czzy","name":"影视 | 厂长","type":3,"api":"czzy_open.js"},
|
||||||
"key": "圣城影视",
|
{"key":"libvio","name":"影视 | libvio","type":3,"api":"libvio_open.js"},
|
||||||
"name": "🟢 圣城",
|
{"key":"kkys","name":"影视 | 快看","type":3,"api":"kkys_open.js"},
|
||||||
"type": 3,
|
{"key":"ikanbot_open","name":"影视 | 爱看","type":3,"api":"ikanbot_open.js"},
|
||||||
"api": "sc1080_open.js"
|
{"key":"ngys","name":"影视 | 南瓜","type":3,"api":"ng_open.js"},
|
||||||
},
|
{"key":"nivod","name":"影视 | 泥巴","type":3,"api":"nivod_op.js"},
|
||||||
{
|
{"key":"duboku2_open","name":"影视 | 独播库","type":3,"api":"duboku2_open.js"},
|
||||||
"key": "胖虎影视",
|
{"key":"subaibai","name":"影视 | 素白白","type":3,"api":"subaibai_open.js"},
|
||||||
"name": "🟢 胖虎",
|
{"key":"drpy_js_zxzj_open","name":"影视 | 在线之家","type":3,"api":"zxzj_open.js"},
|
||||||
"type": 3,
|
|
||||||
"api": "panghu_open.js"
|
{"key":"drpy_js_boosj_open","name":"少儿 | 童趣","type":3,"api":"boosj_open.js"},
|
||||||
},
|
{"key":"drpy_js_tuxiaobei_open","name":"少儿 | 兔小贝","type":3,"api":"tuxiaobei_open.js"},
|
||||||
{
|
{"key":"drpy_js_ubestkid_open","name":"少儿 | 贝乐虎","type":3,"api":"ubestkid_open.js"},
|
||||||
"key": "人人影视",
|
{"key":"kuwo_open","name":"短剧 | 酷我","type":3,"api":"kuwo_open.js"},
|
||||||
"name": "🟢 人人",
|
{"key":"vsdj_open","name":"短剧 | VS","type":3,"api":"vsdj_open.js"},
|
||||||
"type": 3,
|
{"key":"djwm_open","name":"短剧 | 完美","type":3,"api":"djwm_open.js"},
|
||||||
"api": "rttks_open.js"
|
{"key":"adm_open","name":"动漫 | 爱动漫","type":3,"api":"adm_open.js"},
|
||||||
},
|
{"key":"anfun_open","name":"动漫 | 爱番","type":3,"api":"anfun_open.js"},
|
||||||
{
|
{"key":"58dm_open","name":"动漫 | 58动漫","type":3,"api":"58dm_open.js"},
|
||||||
"key": "图图影视",
|
{"key":"ufc_open","name":"格斗 | 武享","type":3,"api":"ufc_open.js"},
|
||||||
"name": "🟢 图图",
|
{"key":"sharenice","name":"聚合 | 短视频","type":3,"api":"sharenice_open.js"},
|
||||||
"type": 3,
|
{
|
||||||
"api": "tutu_open.js"
|
"key": "huya",
|
||||||
},
|
"name": "直播 | 虎牙",
|
||||||
{
|
"type": 3,
|
||||||
"key": "农民影视",
|
"api": "huya_open.js",
|
||||||
"name": "🟢 农民",
|
"ext": {
|
||||||
"type": 3,
|
"from": "official",
|
||||||
"api": "nmddd_open.js"
|
"custom": "1,英雄联盟#2336,王者荣耀"
|
||||||
},
|
}
|
||||||
{
|
},
|
||||||
"key": "anfun",
|
{
|
||||||
"name": "🟢 Afun",
|
"key": "douyu",
|
||||||
"type": 3,
|
"name": "直播 | 斗鱼",
|
||||||
"api": "anfun_open.js"
|
"type": 3,
|
||||||
},
|
"api": "douyu_open.js",
|
||||||
{
|
"ext": {
|
||||||
"key": "58dm",
|
"from": "official",
|
||||||
"name": "🟢 五八",
|
"custom": "LOL,英雄联盟#wzry,王者荣耀"
|
||||||
"type": 3,
|
}
|
||||||
"api": "/cat/58dm_open.js"
|
},
|
||||||
},
|
{"key":"mybili","name":"B站 | 哔哩综合","type":3,"api":"mybili_open.js"},
|
||||||
{
|
{"key":"bili_open","name":"B站 | 我的哔哩","type":3,"api":"bili_open.js","ext":{"categories":"沙雕动画#健身#音乐#舞蹈#风景#美食#科普#历史#法考#医考","cookie":"填自己的cookie"}},
|
||||||
"key": "爱动漫",
|
{"key":"kuqimv","name":"MV | 酷奇","type":3,"api":"kuqimv_open.js"},
|
||||||
"name": "🟢 爱漫",
|
{"key":"zzmusic_open","name":"音乐 | 渣渣","type":3,"api":"zzmusic_open.js"},
|
||||||
"type": 3,
|
{"key":"drpy_js_cntv_open","name":"电视 | 视聚场","type":3,"api":"cntv_open.js"},
|
||||||
"api": "adm_open.js"
|
|
||||||
},
|
{"key":"哈喽","name":"V2 | 哈喽","type":3,"api":"appysv2.js","ext":"http://www.miniku.cc/xgapp.php/v1/"},
|
||||||
{
|
{"key":"1080dyw","name":"V2 | 视界","type":3,"api":"appysv2.js","ext":"https://www.1080dyw.cc/api.php/v1.vod"},
|
||||||
"key": "酷我短剧",
|
{"key":"miniku","name":"V2 | 迷你","type":3,"api":"appysv2.js","ext":"http://www.miniku.cc/xgapp.php/v1/"},
|
||||||
"name": "🟢 酷我",
|
{"key":"aidi","name":"V2 | 爱迪","type":3,"api":"appysv2.js","ext":"https://api123.adys.app/xgapp.php/v3/"},
|
||||||
"type": 3,
|
{"key":"yaya","name":"V2 | 鸭鸭","type":3,"api":"appysv2.js","ext":"https://yayayaaapp.ynf.icu/api.php/app/"},
|
||||||
"api": "kuwo_open.js"
|
{"key":"kuku","name":"V2 | 酷酷","type":3,"api":"appysv2.js","ext":"http://cms.realdou.cn:35264/api.php/app/"},
|
||||||
},
|
{"key":"beijihu","name":"V2 | 极狐","type":3,"api":"appysv2.js","ext":"https://www.kuin.one/api.php/app/"},
|
||||||
{
|
{"key":"kuk","name":"V2 | 天堂","type":3,"api":"appysv2.js","ext":"http://dytt996.com/api.php/app/"},
|
||||||
"key": "短剧网",
|
{"key":"kku","name":"V2 | 酷影","type":3,"api":"appysv2.js","ext":"https://www.gsjtlxy.top/xgapp.php/v3/"},
|
||||||
"name": "🟢 短剧",
|
{"key":"kuu","name":"V2 | 酷客","type":3,"api":"appysv2.js","ext":"https://www.kuin.one/api.php/app/"},
|
||||||
"type": 3,
|
{"key":"ruidou","name":"V2 | 锐豆","type":3,"api":"appysv2.js","ext":"http://ys.realdou.cn:2683/api.php/app/"},
|
||||||
"api": "duanju5_open.js"
|
{"key":"mayi","name":"V2 | 蚂蚁","type":3,"api":"appysv2.js","ext":"http://wushutvcms.byzz.top/api.php/app/"},
|
||||||
},
|
{"key":"sukan","name":"V2 | 速看","type":3,"api":"appysv2.js","ext":"https://sk100.tv/api.php/app/"},
|
||||||
{
|
{"key":"midi","name":"V2 | 明帝","type":3,"api":"appysv2.js","ext":"https://ys.md214.cn/api.php/app/"},
|
||||||
"key": "斗鱼直播",
|
{"key":"dadou","name":"V2 | 大豆","type":3,"api":"appysv2.js","ext":"http://www.dadou.cm/api.php/app/"},
|
||||||
"name": "🟢 斗鱼",
|
{"key":"qtw","name":"V2 | 彩虹","type":3,"api":"appysv2.js","ext":"http://ys.qtw.asia/lvdou_api.php/v1.vod"},
|
||||||
"type": 3,
|
{"key":"火狐","name":"采集 | 火狐","type":3,"api":"caiji.js","ext":"https://hhzyapi.com/api.php/provide/vod/from/hhm3u8"},
|
||||||
"api": "douyu_open.js",
|
{"key":"16wmv","name":"采集 | 16万MV","type":3,"api":"caiji.js","ext":"https://tvbox-mv--leosam2048.repl.co/mv/vod"},
|
||||||
"ext": {
|
{"key":"xinlang","name":"采集 | 新浪","type":3,"api":"caiji.js","ext":"https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8"},
|
||||||
"from": "official",
|
{"key":"bdzy","name":"采集 | 百度","type":3,"api":"caiji.js","ext":"https://api.apibdzy.com/api.php/provide/vod/from/dbm3u8/"},
|
||||||
"custom": "Popkart,跑跑卡丁车#KartRiderDrift,跑跑卡丁车:漂移#PPKDCSY,跑跑手游#PathofExile,流放之路#hjzgwx,火炬之光:无限#CrossGate,魔力宝贝#g_jyhx,劲乐幻想#xjcs,仙境传说#yqk,一起看"
|
{"key":"bfzy","name":"采集 | 暴风","type":3,"api":"caiji.js","ext":"https://bfzyapi.com/api.php/provide/vod/"},
|
||||||
}
|
{"key":"394tv","name":"采集 | 39","type":3,"api":"caiji.js","ext":"https://www.394tv.com/api.php/provide/vod/"},
|
||||||
},
|
{"key":"languang","name":"采集 | 蓝光","type":3,"api":"caiji.js","ext":"http://www.zzrhgg.com/api.php/provide/vod/"},
|
||||||
{
|
{"key":"lehuo","name":"采集 | 乐活","type":3,"api":"caiji.js","ext":"https://cj.vodimg.top/api.php/provide/vod/"},
|
||||||
"key": "虎牙直播",
|
{"key":"piaoling","name":"采集 | 飘零","type":3,"api":"caiji.js","ext":"https://p2100.net/api.php/provide/vod/"},
|
||||||
"name": "🟢 虎牙",
|
{"key":"yingtu","name":"采集 | 影图","type":3,"api":"caiji.js","ext":"https://cj.vodimg.top/api.php/provide/vod/"},
|
||||||
"type": 3,
|
{"key":"feifan","name":"采集 | 非凡","type":3,"api":"caiji.js","ext":"https://cj.ffzyapi.com/api.php/provide/vod/from/ffm3u8/"},
|
||||||
"api": "huya_open.js",
|
{"key":"feisu","name":"采集 | 飞速","type":3,"api":"caiji.js","ext":"https://www.feisuzyapi.com/api.php/provide/vod/from/fsm3u8/"},
|
||||||
"ext": {
|
{"key":"guangsu","name":"采集 | 光速","type":3,"api":"caiji.js","ext":"https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
|
||||||
"from": "official",
|
{"key":"hongniu","name":"采集 | 红牛","type":3,"api":"caiji.js","ext":"https://www.hongniuzy2.com/api.php/provide/vod/from/hnm3u8/"},
|
||||||
"custom": "2135,一起看#6245,放映厅#427,流放之路#6399,火炬之光:无限#2891,魔力宝贝#2620,跑跑卡丁车手游#162,跑跑卡丁车#7691,劲乐幻想#2675,仙境传说RO"
|
{"key":"jinying","name":"采集 | 金鹰","type":3,"api":"caiji.js","ext":"https://jinyingzy.com/provide/vod/from/jinyingm3u8/"},
|
||||||
}
|
{"key":"jisu","name":"采集 | 极速","type":3,"api":"caiji.js","ext":"https://jszyapi.com/api.php/provide/vod/from/jsm3u8/"},
|
||||||
},
|
{"key":"kuaiche","name":"采集 | 快车","type":3,"api":"caiji.js","ext":"https://caiji.kczyapi.com/api.php/provide/vod/from/kcm3u8/"},
|
||||||
{
|
{"key":"liangzi","name":"采集 | 量子","type":3,"api":"caiji.js","ext":"https://cj.lziapi.com/api.php/provide/vod/from/lzm3u8/"},
|
||||||
"key": "我的哔哩",
|
{"key":"qihu","name":"采集 | 奇虎","type":3,"api":"caiji.js","ext":"https://caiji.qhzyapi.com/api.php/provide/vod/from/qhm3u8/"},
|
||||||
"name": "🟢 我哔",
|
{"key":"guangsuapi","name":"采集 | 光速","type":3,"api":"caiji.js","ext":"http://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
|
||||||
"type": 3,
|
|
||||||
"api": "mybili_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "哔哩",
|
|
||||||
"name": "🟢 哔哩",
|
|
||||||
"type": 3,
|
|
||||||
"api": "bili_open.js",
|
|
||||||
"ext": {
|
|
||||||
"categories": "音乐#动画#电影#电视剧#番剧#综艺#国创#搞笑#单机游戏#沙雕动画#沙雕穿越#沙雕",
|
|
||||||
"cookie": "DedeUserID=690781341;DedeUserID__ckMd5=cabc96906269c5b6;SESSDATA=2245ba24%2C1684212125%2C466fd%2Ab2;bili_jct=de6fdb60c10f8a83910aa55d79407b4e;"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "哔哩直播",
|
|
||||||
"name": "🟢 直播",
|
|
||||||
"type": 3,
|
|
||||||
"api": "bililive_open.js",
|
|
||||||
"ext": {
|
|
||||||
"cookie": "DedeUserID=690781341;DedeUserID__ckMd5=cabc96906269c5b6;SESSDATA=2245ba24%2C1684212125%2C466fd%2Ab2;bili_jct=de6fdb60c10f8a83910aa55d79407b4e;"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "火狐资源",
|
|
||||||
"name": "🟢 火狐",
|
|
||||||
"type": 3,
|
|
||||||
"api": "caiji.js",
|
|
||||||
"ext": {
|
|
||||||
"url": "https://hhzyapi.com/api.php/provide/vod/from/hhm3u8",
|
|
||||||
"categories": [
|
|
||||||
"内地剧",
|
|
||||||
"欧美剧",
|
|
||||||
"香港剧",
|
|
||||||
"台湾剧",
|
|
||||||
"马泰剧",
|
|
||||||
"韩剧",
|
|
||||||
"日剧",
|
|
||||||
"动作片",
|
|
||||||
"爱情片",
|
|
||||||
"喜剧片",
|
|
||||||
"科幻片",
|
|
||||||
"恐怖片",
|
|
||||||
"剧情片",
|
|
||||||
"战争片",
|
|
||||||
"灾难片",
|
|
||||||
"悬疑片",
|
|
||||||
"犯罪片",
|
|
||||||
"奇幻片",
|
|
||||||
"记录片",
|
|
||||||
"伦理片",
|
|
||||||
"动画片",
|
|
||||||
"中国动漫",
|
|
||||||
"日本动漫",
|
|
||||||
"欧美动漫",
|
|
||||||
"大陆综艺",
|
|
||||||
"日韩综艺",
|
|
||||||
"港台综艺",
|
|
||||||
"欧美综艺"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "新浪资源",
|
|
||||||
"name": "🟢 新浪",
|
|
||||||
"type": 3,
|
|
||||||
"api": "caiji.js",
|
|
||||||
"ext": {
|
|
||||||
"url": "https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8",
|
|
||||||
"categories": [
|
|
||||||
"大陆剧",
|
|
||||||
"港澳剧",
|
|
||||||
"台湾剧",
|
|
||||||
"欧美剧",
|
|
||||||
"韩剧",
|
|
||||||
"日剧",
|
|
||||||
"泰剧",
|
|
||||||
"动漫",
|
|
||||||
"动漫电影",
|
|
||||||
"综艺",
|
|
||||||
"动作片",
|
|
||||||
"爱情片",
|
|
||||||
"科幻片",
|
|
||||||
"战争片",
|
|
||||||
"剧情片",
|
|
||||||
"恐怖片",
|
|
||||||
"喜剧片",
|
|
||||||
"纪录片",
|
|
||||||
"伦理片"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "红牛资源",
|
|
||||||
"name": "🟢 红牛",
|
|
||||||
"type": 3,
|
|
||||||
"api": "caiji.js",
|
|
||||||
"ext": {
|
|
||||||
"url": "https://www.hongniuzy2.com/api.php/provide/vod/from/hnm3u8/",
|
|
||||||
"categories": [
|
|
||||||
"国产剧",
|
|
||||||
"港澳剧",
|
|
||||||
"台湾剧",
|
|
||||||
"欧美剧",
|
|
||||||
"日剧",
|
|
||||||
"泰剧",
|
|
||||||
"韩剧",
|
|
||||||
"综艺",
|
|
||||||
"动漫",
|
|
||||||
"动漫电影",
|
|
||||||
"动作片",
|
|
||||||
"喜剧片",
|
|
||||||
"爱情片",
|
|
||||||
"科幻片",
|
|
||||||
"恐怖片",
|
|
||||||
"剧情片",
|
|
||||||
"战争片",
|
|
||||||
"纪录片",
|
|
||||||
"伦理片"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "速播资源",
|
|
||||||
"name": "🟢 速播",
|
|
||||||
"type": 3,
|
|
||||||
"api": "caiji.js",
|
|
||||||
"ext": {
|
|
||||||
"url": "https://subocaiji.com/api.php/provide/vod/from/subm3u8/",
|
|
||||||
"categories": [
|
|
||||||
"大陆剧",
|
|
||||||
"台湾剧",
|
|
||||||
"韩剧",
|
|
||||||
"美剧",
|
|
||||||
"港澳剧",
|
|
||||||
"日剧",
|
|
||||||
"泰剧",
|
|
||||||
"动作片",
|
|
||||||
"爱情片",
|
|
||||||
"科幻片",
|
|
||||||
"战争片",
|
|
||||||
"剧情片",
|
|
||||||
"恐怖片",
|
|
||||||
"喜剧片",
|
|
||||||
"纪录片",
|
|
||||||
"伦理片",
|
|
||||||
"动漫电影",
|
|
||||||
"中国动漫",
|
|
||||||
"日本动漫",
|
|
||||||
"欧美动漫",
|
|
||||||
"综艺"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "极速资源",
|
|
||||||
"name": "🟢 极速",
|
|
||||||
"type": 3,
|
|
||||||
"api": "caiji.js",
|
|
||||||
"ext": {
|
|
||||||
"url": "https://jszyapi.com/api.php/provide/vod/from/jsm3u8/",
|
|
||||||
"categories": [
|
|
||||||
"内地剧",
|
|
||||||
"欧美剧",
|
|
||||||
"香港剧",
|
|
||||||
"台湾剧",
|
|
||||||
"马泰剧",
|
|
||||||
"韩剧",
|
|
||||||
"日剧",
|
|
||||||
"伦理片",
|
|
||||||
"动作片",
|
|
||||||
"爱情片",
|
|
||||||
"喜剧片",
|
|
||||||
"科幻片",
|
|
||||||
"恐怖片",
|
|
||||||
"剧情片",
|
|
||||||
"战争片",
|
|
||||||
"灾难片",
|
|
||||||
"悬疑片",
|
|
||||||
"犯罪片",
|
|
||||||
"奇幻片",
|
|
||||||
"记录片",
|
|
||||||
"动画片",
|
|
||||||
"中国动漫",
|
|
||||||
"日本动漫",
|
|
||||||
"欧美动漫",
|
|
||||||
"大陆综艺",
|
|
||||||
"日韩综艺",
|
|
||||||
"港台综艺",
|
|
||||||
"欧美综艺"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "光速资源",
|
|
||||||
"name": "🟢 光速",
|
|
||||||
"type": 3,
|
|
||||||
"api": "caiji.js",
|
|
||||||
"ext": {
|
|
||||||
"url": "https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8",
|
|
||||||
"categories": [
|
|
||||||
"大陆剧",
|
|
||||||
"欧美剧",
|
|
||||||
"港澳剧",
|
|
||||||
"台湾剧",
|
|
||||||
"泰剧",
|
|
||||||
"韩剧",
|
|
||||||
"日剧",
|
|
||||||
"动作片",
|
|
||||||
"爱情片",
|
|
||||||
"喜剧片",
|
|
||||||
"科幻片",
|
|
||||||
"恐怖片",
|
|
||||||
"战争片",
|
|
||||||
"伦理片",
|
|
||||||
"动漫电影"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "宅腐TV",
|
|
||||||
"name": "🟢 宅腐",
|
|
||||||
"type": 3,
|
|
||||||
"api": "appysv2.js",
|
|
||||||
"ext": "http://app.zhaifutvapp.com/ruifenglb_api.php/v1.vod"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "聚视网",
|
|
||||||
"name": "🟢 央视",
|
|
||||||
"type": 3,
|
|
||||||
"api": "cntv_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "武享UFC",
|
|
||||||
"name": "🟢 UFC",
|
|
||||||
"type": 3,
|
|
||||||
"api": "ufc_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "武享吧",
|
|
||||||
"name": "🟢 武享",
|
|
||||||
"type": 3,
|
|
||||||
"api": "hula8_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "兔小贝",
|
|
||||||
"name": "🟢 小贝",
|
|
||||||
"type": 3,
|
|
||||||
"api": "tuxiaobei_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "贝乐虎",
|
|
||||||
"name": "🟢 乐虎",
|
|
||||||
"type": 3,
|
|
||||||
"api": "ubestkid_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "酷奇MV",
|
|
||||||
"name": "🟢 酷奇",
|
|
||||||
"type": 3,
|
|
||||||
"api": "kuqimv_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "播视网",
|
|
||||||
"name": "🟢 童趣",
|
|
||||||
"type": 3,
|
|
||||||
"api": "boosj_open.js"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "短视频",
|
|
||||||
"name": "🟢 短视频",
|
|
||||||
"type": 3,
|
|
||||||
"api": "sharenice_open.js"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"key": "push_agent",
|
"key": "push_agent",
|
||||||
"name": "♻ 推送",
|
"name": "♻ 推送",
|
||||||
|
1
cat/js/funletu.js
Normal file
1
cat/js/funletu.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/hmsp_open.js
Normal file
1
cat/js/hmsp_open.js
Normal file
File diff suppressed because one or more lines are too long
261
cat/js/ikanbot.js
Normal file
261
cat/js/ikanbot.js
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
import { Crypto, load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'ikanbot';
|
||||||
|
let url = 'https://www.ikanbot.com';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
const 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';
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': agentSp || UA,
|
||||||
|
'referer': url
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getClass($) {
|
||||||
|
const nav = $('ul.nav-pills:eq(1) > li > a');
|
||||||
|
let tags = {
|
||||||
|
key: 'tag',
|
||||||
|
name: '标签',
|
||||||
|
value: _.map(nav, (n) => {
|
||||||
|
return { n: n.children[0].data, v: n.attribs.href };
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
tags['init'] = tags.value[0].v;
|
||||||
|
const title = $('title:first').text().split('-')[0].substring(2);
|
||||||
|
return { cls: { type_id: tags.value[0].v, type_name: title }, tags: [tags] };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let classes = [];
|
||||||
|
let filterObj = {};
|
||||||
|
for (const cate of ['/hot/index-movie-热门.html', '/hot/index-tv-热门.html']) {
|
||||||
|
const html = await request(url + cate);
|
||||||
|
const $ = load(html);
|
||||||
|
const { cls, tags } = getClass($);
|
||||||
|
classes.push(cls);
|
||||||
|
filterObj[cls.type_id] = tags;
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.v-list a.item');
|
||||||
|
var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
return {
|
||||||
|
vod_id: item.attribs.href,
|
||||||
|
vod_name: img.attribs.alt,
|
||||||
|
vod_pic: jsBase + base64Encode(img.attribs['data-src']),
|
||||||
|
vod_remarks: '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
const link = url + (extend.tag || tid).replace('.html', pg > 1 ? `-p-${pg}.html` : '.html');
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.v-list a.item');
|
||||||
|
var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
return {
|
||||||
|
vod_id: item.attribs.href,
|
||||||
|
vod_name: img.attribs.alt,
|
||||||
|
vod_pic: jsBase + base64Encode(img.attribs['data-src']),
|
||||||
|
vod_remarks: '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('div.page-more > a:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: 24,
|
||||||
|
total: 24 * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(url + id);
|
||||||
|
const $ = load(html);
|
||||||
|
var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||||
|
const detail = $('div.detail');
|
||||||
|
const remarks = $('span#line-tips').text();
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_pic: jsBase + base64Encode($('div.item-root > img')[0].attribs['data-src']),
|
||||||
|
vod_remarks: '',
|
||||||
|
vod_content: remarks || '',
|
||||||
|
vod_name: $(detail).find('h2').text().trim(),
|
||||||
|
vod_year: $(detail).find('h3:nth-child(3)').text(),
|
||||||
|
vod_area: $(detail).find('h3:nth-child(4)').text(),
|
||||||
|
vod_actor: $(detail).find('h3:nth-child(5)').text(),
|
||||||
|
};
|
||||||
|
const res = await req(url + '/api/getResN?videoId=' + id.substring(id.lastIndexOf('/') + 1) + '&mtype=2&token=9109590b194731fde643ce27924fcf6f', {
|
||||||
|
headers: {
|
||||||
|
Referer: 'play',
|
||||||
|
'User-Agent': UA,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const list = JSON.parse(res.content).data.list;
|
||||||
|
let playlist = {};
|
||||||
|
let arr = []
|
||||||
|
for (const l of list) {
|
||||||
|
const flagData = JSON.parse(l.resData);
|
||||||
|
for (const f of flagData) {
|
||||||
|
const from = f.flag;
|
||||||
|
const urls = f.url;
|
||||||
|
if (!from || !urls) continue;
|
||||||
|
if (playlist[from]) continue;
|
||||||
|
playlist[from] = urls;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var key in playlist) {
|
||||||
|
if ('kuaikan' == key) {
|
||||||
|
arr.push({
|
||||||
|
flag: '快看',
|
||||||
|
url: playlist[key],
|
||||||
|
sort: 1
|
||||||
|
})
|
||||||
|
} else if ('bfzym3u8' == key) {
|
||||||
|
arr.push({
|
||||||
|
flag: '暴风',
|
||||||
|
url: playlist[key],
|
||||||
|
sort: 2
|
||||||
|
})
|
||||||
|
} else if ('ffm3u8' == key) {
|
||||||
|
arr.push({
|
||||||
|
flag: '非凡',
|
||||||
|
url: playlist[key],
|
||||||
|
sort: 3
|
||||||
|
})
|
||||||
|
} else if ('lzm3u8' == key) {
|
||||||
|
arr.push({
|
||||||
|
flag: '量子',
|
||||||
|
url: playlist[key],
|
||||||
|
sort: 4
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
arr.push({
|
||||||
|
flag: key,
|
||||||
|
url: playlist[key],
|
||||||
|
sort: 5
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arr.sort((a, b) => a.sort - b.sort);
|
||||||
|
let playFrom = [];
|
||||||
|
let playList = [];
|
||||||
|
arr.map(val => {
|
||||||
|
playFrom.push(val.flag);
|
||||||
|
playList.push(val.url);
|
||||||
|
})
|
||||||
|
vod.vod_play_from = playFrom.join("$$$");
|
||||||
|
vod.vod_play_url = playList.join("$$$");
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64Encode(text) {
|
||||||
|
return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64Decode(text) {
|
||||||
|
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function proxy(segments, headers) {
|
||||||
|
let what = segments[0];
|
||||||
|
let url = base64Decode(segments[1]);
|
||||||
|
if (what == 'img') {
|
||||||
|
var resp = await req(url, {
|
||||||
|
buffer: 2,
|
||||||
|
headers: {
|
||||||
|
Referer: url,
|
||||||
|
'User-Agent': UA,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
code: resp.code,
|
||||||
|
buffer: 2,
|
||||||
|
content: resp.content,
|
||||||
|
headers: resp.headers,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
code: 500,
|
||||||
|
content: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
if (pg <= 0 || typeof(pg) == 'undefined') pg = 1;
|
||||||
|
const html = await request(url + '/search?q=' + wd + '&p=' + pg);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.media');
|
||||||
|
var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {});
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const a = $(item).find('a:first')[0];
|
||||||
|
const img = $(item).find('img:first')[0];
|
||||||
|
const remarks = $($(item).find('span.label')[0]).text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: a.attribs.href,
|
||||||
|
vod_name: img.attribs.alt,
|
||||||
|
vod_pic: jsBase + base64Encode(img.attribs['data-src']),
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('div.page-more > a:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
proxy: proxy,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
206
cat/js/jiohub.js
Normal file
206
cat/js/jiohub.js
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
import { Crypto, load, _, dayjs } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'jiohub';
|
||||||
|
let url = 'https://jiohub.top';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
const 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 cookie = {};
|
||||||
|
|
||||||
|
async function request(reqUrl, referer, mth, data, hd) {
|
||||||
|
const headers = {
|
||||||
|
'User-Agent': UA,
|
||||||
|
Cookie: _.map(cookie, (value, key) => {
|
||||||
|
return `${key}=${value}`;
|
||||||
|
}).join(';'),
|
||||||
|
};
|
||||||
|
if (referer) headers.referer = encodeURIComponent(referer);
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: mth || 'get',
|
||||||
|
headers: headers,
|
||||||
|
data: data,
|
||||||
|
postType: mth === 'post' ? 'form' : '',
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const series = $('.nav-list a[href*=/video]');
|
||||||
|
let classes = _.map(series, (s) => {
|
||||||
|
let typeId = s.attribs['href'];
|
||||||
|
let typeName = typeId.match(/\/video\/(.*)\?/)[1];
|
||||||
|
typeName = decodeURIComponent(typeName);
|
||||||
|
return {
|
||||||
|
type_id: typeName,
|
||||||
|
type_name: typeName,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
return '{}';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
let page = pg || 1;
|
||||||
|
if (page == 0) page = 1;
|
||||||
|
const link = url + '/video/' + tid + "?page=" + page + '&size=18';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.content-body > a');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0].attribs['src'];
|
||||||
|
const a = item.attribs['href'].match(/\/watch\/(.*)/)[1];
|
||||||
|
const n = ($(item).find('p.card-title')[0]).children[0].data;
|
||||||
|
let speed = ($(item).find('p.item-speed')[0]).children[0].data || '';
|
||||||
|
const score = ($(item).find('p.score')[0]).children[0].data || '';
|
||||||
|
if (speed == tid) speed = '';
|
||||||
|
return {
|
||||||
|
vod_id: a,
|
||||||
|
vod_name: n,
|
||||||
|
vod_pic: img,
|
||||||
|
vod_remarks: speed || score || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
let total = 18;
|
||||||
|
const pag = $('ui-pagination');
|
||||||
|
if (pag.length > 0) {
|
||||||
|
try {
|
||||||
|
total = parseInt(pag[0].attribs['total']);
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
page: page,
|
||||||
|
pagecount: _.ceil(total / 18),
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function stripHtmlTag(src) {
|
||||||
|
return src
|
||||||
|
.replace(/<\/?[^>]+(>|$)/g, '')
|
||||||
|
.replace(/&.{1,5};/g, '')
|
||||||
|
.replace(/\s{2,}/g, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(url + '/watch/' + id);
|
||||||
|
const $ = load(html);
|
||||||
|
const detail = $('div.content-detail > p');
|
||||||
|
let vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_content: stripHtmlTag($('div.content-detail span.detail-sketch').html()).trim(),
|
||||||
|
};
|
||||||
|
for (const info of detail) {
|
||||||
|
const i = $(info).text().trim();
|
||||||
|
if (i.startsWith('地区:')) {
|
||||||
|
vod.vod_area = i.substring(3);
|
||||||
|
} else if (i.startsWith('年份:')) {
|
||||||
|
vod.vod_year = i.substring(3);
|
||||||
|
} else if (i.startsWith('类型:')) {
|
||||||
|
vod.vod_type = i.substring(3);
|
||||||
|
} else if (i.startsWith('导演:')) {
|
||||||
|
vod.vod_director = i.substring(3);
|
||||||
|
} else if (i.startsWith('主演:')) {
|
||||||
|
vod.vod_actor = i.substring(3);
|
||||||
|
} else if (i.startsWith('语言:')) {
|
||||||
|
vod.vod_lang = i.substring(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const urls = html.match(/let urls = \"(.*)\";/)[1].replace(/_/g, '/').replace(/-/g, '+');
|
||||||
|
var key = Crypto.enc.Utf8.parse("cf2d1a-6a4d-9ef8");
|
||||||
|
var playlist = Crypto.AES.decrypt(urls, key, { iv: key, padding: Crypto.pad.Pkcs7 });
|
||||||
|
playlist = Crypto.enc.Utf8.stringify(playlist).split('\n');
|
||||||
|
vod.vod_play_from = 'JOJO';
|
||||||
|
vod.vod_play_url = playlist.join('#');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function playPid() {
|
||||||
|
var key = Crypto.enc.Utf8.parse('VSmJTRRE'+dayjs().format('YYYYMMDD'));
|
||||||
|
var iv = Crypto.enc.Hex.parse("00000000000000000000000000000000");
|
||||||
|
var pid = Crypto.AES.encrypt(dayjs().format('YYYY-MM-DD HH:mm'), key, { iv: iv, padding: Crypto.pad.Pkcs7 });
|
||||||
|
pid = pid.toString().replace(/\+/g, '-');
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id + '?pid=' + playPid(),
|
||||||
|
header: {
|
||||||
|
'User-Agent': UA,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let page = pg || 1;
|
||||||
|
if (page == 0) page = 1;
|
||||||
|
const link = url + '/video/search?q=' + wd + "&page=" + page + '&size=18&pid=' + playPid();
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('div.content-body > a');
|
||||||
|
let videos = _.map(items, (item) => {
|
||||||
|
const img = $(item).find('img:first')[0].attribs['src'];
|
||||||
|
const a = item.attribs['href'].match(/\/watch\/(.*)/)[1];
|
||||||
|
const n = ($(item).find('p.card-title')[0]).children[0].data;
|
||||||
|
let speed = ($(item).find('p.item-speed')[0]).children[0].data || '';
|
||||||
|
const score = ($(item).find('p.score')[0]).children[0].data || '';
|
||||||
|
if (speed == '电影') speed = '';
|
||||||
|
return {
|
||||||
|
vod_id: a,
|
||||||
|
vod_name: n,
|
||||||
|
vod_pic: img,
|
||||||
|
vod_remarks: speed || score || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
let total = 18;
|
||||||
|
const pag = $('ui-pagination');
|
||||||
|
if (pag.length > 0) {
|
||||||
|
try {
|
||||||
|
total = parseInt(pag[0].attribs['total']);
|
||||||
|
} catch (error) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
page: page,
|
||||||
|
pagecount: _.ceil(total / 18),
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
cat/js/jojo_open.js
Normal file
1
cat/js/jojo_open.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/kunyu77.js
Normal file
1
cat/js/kunyu77.js
Normal file
File diff suppressed because one or more lines are too long
346
cat/js/kunyu77_open.js
Normal file
346
cat/js/kunyu77_open.js
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
import { Crypto, dayjs, jinja2, Uri, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'kunyu77';
|
||||||
|
let url = 'http://api.tyun77.cn';
|
||||||
|
let device = {};
|
||||||
|
let timeOffset = 0;
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
async function request(reqUrl, agentSp) {
|
||||||
|
let sj = dayjs().unix() - timeOffset;
|
||||||
|
let uri = new Uri(reqUrl);
|
||||||
|
uri.addQueryParam('pcode', '010110005');
|
||||||
|
uri.addQueryParam('version', '2.1.6');
|
||||||
|
uri.addQueryParam('devid', device.id);
|
||||||
|
uri.addQueryParam('package', 'com.sevenVideo.app.android');
|
||||||
|
uri.addQueryParam('sys', 'android');
|
||||||
|
uri.addQueryParam('sysver', device.release);
|
||||||
|
uri.addQueryParam('brand', device.brand);
|
||||||
|
uri.addQueryParam('model', device.model.replaceAll(' ', '_'));
|
||||||
|
uri.addQueryParam('sj', sj);
|
||||||
|
let keys = [];
|
||||||
|
for (var i = 0; i < uri.queryPairs.length; i++) {
|
||||||
|
keys.push(uri.queryPairs[i][0]);
|
||||||
|
}
|
||||||
|
keys = _.sortBy(keys, function (name) {
|
||||||
|
return name;
|
||||||
|
});
|
||||||
|
let tkSrc = uri.path();
|
||||||
|
for (let k of keys) {
|
||||||
|
let v = uri.getQueryParamValue(k);
|
||||||
|
v = encodeURIComponent(v);
|
||||||
|
tkSrc += v;
|
||||||
|
}
|
||||||
|
tkSrc += sj;
|
||||||
|
tkSrc += 'XSpeUFjJ';
|
||||||
|
console.log(tkSrc);
|
||||||
|
let tk = Crypto.MD5(tkSrc).toString().toLowerCase();
|
||||||
|
console.log(tk);
|
||||||
|
let header = {
|
||||||
|
'user-agent': agentSp || 'okhttp/3.12.0',
|
||||||
|
t: sj,
|
||||||
|
TK: tk,
|
||||||
|
};
|
||||||
|
let res = await req(uri.toString(), {
|
||||||
|
headers: header,
|
||||||
|
});
|
||||||
|
|
||||||
|
let serverTime = res.headers.date; // dart all response header key is lowercase
|
||||||
|
let content = res.content;
|
||||||
|
let serverTimeS = dayjs(serverTime).unix();
|
||||||
|
timeOffset = dayjs().unix() - serverTimeS;
|
||||||
|
// console.log(content);
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
var deviceKey = 'device';
|
||||||
|
var deviceInfo = await local.get(key, deviceKey);
|
||||||
|
if (deviceInfo.length > 0) {
|
||||||
|
try {
|
||||||
|
device = JSON.parse(deviceInfo);
|
||||||
|
} catch (error) {}
|
||||||
|
}
|
||||||
|
if (_.isEmpty(device)) {
|
||||||
|
device = randDevice();
|
||||||
|
device.id = randStr(32).toLowerCase();
|
||||||
|
device.ua = 'Dalvik/2.1.0 (Linux; U; Android ' + device.release + '; ' + device.model + ' Build/' + device.buildId + ')';
|
||||||
|
await local.set(key, deviceKey, JSON.stringify(device));
|
||||||
|
}
|
||||||
|
|
||||||
|
await request(url + '/api.php/provide/getDomain');
|
||||||
|
await request(url + '/api.php/provide/config');
|
||||||
|
await request(url + '/api.php/provide/checkUpgrade');
|
||||||
|
await request(url + '/api.php/provide/channel');
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let data = JSON.parse(await request(url + '/api.php/provide/filter')).data;
|
||||||
|
let classes = [];
|
||||||
|
let filterObj = {};
|
||||||
|
let filterAll = [];
|
||||||
|
for (const key in data) {
|
||||||
|
classes.push({
|
||||||
|
type_id: key,
|
||||||
|
type_name: data[key][0].cat,
|
||||||
|
});
|
||||||
|
if (!filter) continue;
|
||||||
|
try {
|
||||||
|
let typeId = key.toString();
|
||||||
|
if (_.isEmpty(filterAll)) {
|
||||||
|
let filterData = JSON.parse(await request(url + '/api.php/provide/searchFilter?type_id=0&pagenum=1&pagesize=1')).data.conditions;
|
||||||
|
// console.log(filterData);
|
||||||
|
// 年份
|
||||||
|
let year = {
|
||||||
|
key: 'year',
|
||||||
|
name: '年份',
|
||||||
|
init: '',
|
||||||
|
};
|
||||||
|
let yearValues = [];
|
||||||
|
yearValues.push({ n: '全部', v: '' });
|
||||||
|
filterData.y.forEach((e) => {
|
||||||
|
yearValues.push({ n: e.name, v: e.value });
|
||||||
|
});
|
||||||
|
year['value'] = yearValues;
|
||||||
|
// 地区
|
||||||
|
let area = {
|
||||||
|
key: 'area',
|
||||||
|
name: '地区',
|
||||||
|
init: '',
|
||||||
|
};
|
||||||
|
let areaValues = [];
|
||||||
|
areaValues.push({ n: '全部', v: '' });
|
||||||
|
filterData.a.forEach((e) => {
|
||||||
|
areaValues.push({ n: e.name, v: e.value });
|
||||||
|
});
|
||||||
|
area['value'] = areaValues;
|
||||||
|
// 类型
|
||||||
|
let type = {
|
||||||
|
key: 'category',
|
||||||
|
name: '类型',
|
||||||
|
init: '',
|
||||||
|
};
|
||||||
|
let typeValues = [];
|
||||||
|
typeValues.push({ n: '全部', v: '' });
|
||||||
|
filterData.scat.forEach((e) => {
|
||||||
|
typeValues.push({ n: e.name, v: e.value });
|
||||||
|
});
|
||||||
|
type['value'] = typeValues;
|
||||||
|
|
||||||
|
filterAll.push(year, area, type);
|
||||||
|
}
|
||||||
|
if (!_.isEmpty(filterAll)) {
|
||||||
|
filterObj[typeId] = filterAll;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// console.log(classes);
|
||||||
|
// console.log(filterObj);
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
let data = JSON.parse(await request(url + '/api.php/provide/homeBlock?type_id=0')).data;
|
||||||
|
let blocks = data.blocks;
|
||||||
|
let videos = [];
|
||||||
|
for (const block of blocks) {
|
||||||
|
let name = block.block_name;
|
||||||
|
if (name.indexOf('热播') >= 0) continue;
|
||||||
|
let contents = block.contents;
|
||||||
|
for (const content of contents) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: content.id,
|
||||||
|
vod_name: content.title,
|
||||||
|
vod_pic: content.videoCover,
|
||||||
|
vod_remarks: content.msg,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
let reqUrl = url + '/api.php/provide/searchFilter?type_id=' + tid + '&pagenum=' + pg + '&pagesize=24&';
|
||||||
|
reqUrl += jinja2('year={{ext.year}}&category={{ext.category}}&area={{ext.area}}', { ext: extend });
|
||||||
|
let data = JSON.parse(await request(reqUrl)).data;
|
||||||
|
let videos = [];
|
||||||
|
for (const vod of data.result) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.title,
|
||||||
|
vod_pic: vod.videoCover,
|
||||||
|
vod_remarks: vod.msg,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(data.page),
|
||||||
|
pagecount: data.pagesize,
|
||||||
|
limit: 24,
|
||||||
|
total: data.total,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
let data = JSON.parse(await request(url + '/api.php/provide/videoDetail?ids=' + id)).data;
|
||||||
|
console.log(data);
|
||||||
|
let vod = {
|
||||||
|
vod_id: data.id,
|
||||||
|
vod_name: data.videoName,
|
||||||
|
vod_pic: data.videoCover,
|
||||||
|
type_name: data.subCategory,
|
||||||
|
vod_year: data.year,
|
||||||
|
vod_area: data.area,
|
||||||
|
vod_remarks: data.msg,
|
||||||
|
vod_actor: data.actor,
|
||||||
|
vod_director: data.director,
|
||||||
|
vod_content: data.brief.trim(),
|
||||||
|
};
|
||||||
|
let episodes = JSON.parse(await request(url + '/api.php/provide/videoPlaylist?ids=' + id)).data.episodes;
|
||||||
|
let playlist = {};
|
||||||
|
for (const episode of episodes) {
|
||||||
|
let playurls = episode.playurls;
|
||||||
|
for (const playurl of playurls) {
|
||||||
|
let from = playurl.playfrom;
|
||||||
|
let t = formatPlayUrl(vod.vod_name, playurl.title);
|
||||||
|
if (t.length == 0) t = playurl.title.trim();
|
||||||
|
if (!playlist.hasOwnProperty(from)) {
|
||||||
|
playlist[from] = [];
|
||||||
|
}
|
||||||
|
playlist[from].push(t + '$' + playurl.playurl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vod.vod_play_from = _.keys(playlist).join('$$$');
|
||||||
|
let urls = _.values(playlist);
|
||||||
|
let vod_play_url = [];
|
||||||
|
for (const urlist of urls) {
|
||||||
|
vod_play_url.push(urlist.join('#'));
|
||||||
|
}
|
||||||
|
vod.vod_play_url = vod_play_url.join('$$$');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
try {
|
||||||
|
let data = JSON.parse(await request(url + '/api.php/provide/parserUrl?url=' + id + '&retryNum=0')).data;
|
||||||
|
let playHeader = data.playHeader;
|
||||||
|
let jxUrl = data.url;
|
||||||
|
let res = await req(jxUrl, {
|
||||||
|
headers: {
|
||||||
|
'user-agent': 'okhttp/3.12.0',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
let result = jsonParse(id, JSON.parse(res.content));
|
||||||
|
result['parse'] = 0;
|
||||||
|
if (playHeader) {
|
||||||
|
result.header = _.merge(result.header, playHeader);
|
||||||
|
}
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let page = pg || 1;
|
||||||
|
if (page == 0) page = 1;
|
||||||
|
let data = JSON.parse(await request(url + '/api.php/provide/searchVideo?searchName=' + wd + '&pg=' + page, 'okhttp/3.12.0'));
|
||||||
|
let videos = [];
|
||||||
|
for (const vod of data.data) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.videoName,
|
||||||
|
vod_pic: vod.videoCover,
|
||||||
|
vod_remarks: vod.msg,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
page: page,
|
||||||
|
pagecount: data.pages,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const charStr = 'abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789';
|
||||||
|
function randStr(len, withNum) {
|
||||||
|
var _str = '';
|
||||||
|
let containsNum = withNum === undefined ? true : withNum;
|
||||||
|
for (var i = 0; i < len; i++) {
|
||||||
|
let idx = _.random(0, containsNum ? charStr.length - 1 : charStr.length - 11);
|
||||||
|
_str += charStr[idx];
|
||||||
|
}
|
||||||
|
return _str;
|
||||||
|
}
|
||||||
|
|
||||||
|
function randDevice() {
|
||||||
|
return {
|
||||||
|
brand: 'Huawei',
|
||||||
|
model: 'HUAWEI Mate 20',
|
||||||
|
release: '10',
|
||||||
|
buildId: randStr(3, false).toUpperCase() + _.random(11, 99) + randStr(1, false).toUpperCase(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatPlayUrl(src, name) {
|
||||||
|
return name
|
||||||
|
.trim()
|
||||||
|
.replaceAll(src, '')
|
||||||
|
.replace(/<|>|《|》/g, '')
|
||||||
|
.replace(/\$|#/g, ' ')
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function jsonParse(input, json) {
|
||||||
|
try {
|
||||||
|
let url = json.url ?? '';
|
||||||
|
if (url.startsWith('//')) {
|
||||||
|
url = 'https:' + url;
|
||||||
|
}
|
||||||
|
if (!url.startsWith('http')) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
let headers = json['headers'] || {};
|
||||||
|
let ua = (json['user-agent'] || '').trim();
|
||||||
|
if (ua.length > 0) {
|
||||||
|
headers['User-Agent'] = ua;
|
||||||
|
}
|
||||||
|
let referer = (json['referer'] || '').trim();
|
||||||
|
if (referer.length > 0) {
|
||||||
|
headers['Referer'] = referer;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
header: headers,
|
||||||
|
url: url,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
cat/js/wogg.js
Normal file
1
cat/js/wogg.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/xiaoya_open.js
Normal file
1
cat/js/xiaoya_open.js
Normal file
File diff suppressed because one or more lines are too long
195
cat/js/xinshijue_open.js
Normal file
195
cat/js/xinshijue_open.js
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||||
|
|
||||||
|
let key = 'xinshijue';
|
||||||
|
let HOST = 'https://www.hdmyy.com';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
|
||||||
|
const 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';
|
||||||
|
|
||||||
|
async function request(reqUrl, timeout = 20000) {
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: 'get',
|
||||||
|
headers: {
|
||||||
|
'User-Agent': UA,
|
||||||
|
'Referer': HOST
|
||||||
|
},
|
||||||
|
timeout: timeout,
|
||||||
|
});
|
||||||
|
return res.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cfg = {skey: siteKey, ext: extend}
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let classes = [{'type_id':1,'type_name':'电影'},{'type_id':2,'type_name':'电视剧'},{'type_id':3,'type_name':'综艺'},{'type_id':4,'type_name':'动漫'},{'type_id':63,'type_name':'纪录片'}];
|
||||||
|
let filterObj = {
|
||||||
|
'1':[{'key':'class','name':'剧情','init':'','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':'地区','init':'','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':'年份','init':'','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':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||||
|
'2':[{'key':'class','name':'剧情','init':'','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':'地区','init':'','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':'其他'}]},{'key':'year','name':'年份','init':'','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':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||||
|
'3':[{'key':'class','name':'剧情','init':'','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':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'港台','v':'港台'},{'n':'韩国','v':'韩国'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','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':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||||
|
'4':[{'key':'class','name':'剧情','init':'','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':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'日本','v':'日本'},{'n':'韩国','v':'韩国'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','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':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||||
|
'63':[{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||||
|
};
|
||||||
|
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
let page = '';
|
||||||
|
if (pg > 1) {
|
||||||
|
page = pg;
|
||||||
|
}
|
||||||
|
const link = HOST + '/vodshow/' + tid + '-' + (extend.area || '') + '-' + (extend.by || '') + '-' + (extend.class || '') + '-' + (extend.lang || '') + '-' + (extend.letter || '') + '---' + page + '---' + (extend.year || '') + '.html';
|
||||||
|
const html = await request(link);
|
||||||
|
const $ = load(html);
|
||||||
|
const items = $('.module-list .module-item');
|
||||||
|
const videos = _.map(items, (item) => {
|
||||||
|
const $item = $(item);
|
||||||
|
const link = $item.find('.module-item-content a:first').attr('href');
|
||||||
|
const title = $item.find('.video-name').text().trim();
|
||||||
|
const img = $item.find('.module-item-pic img:first').attr('data-src');
|
||||||
|
const remarks = $item.find('.module-item-text').text().trim();
|
||||||
|
return {
|
||||||
|
vod_id: link.replace(/.*?\/video\/(.*).html/g, '$1'),
|
||||||
|
vod_name: title,
|
||||||
|
vod_pic: img,
|
||||||
|
vod_remarks: remarks || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
const hasMore = $('#page a.page-next:contains(下一页)').length > 0;
|
||||||
|
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||||
|
const limit = 40;
|
||||||
|
return JSON.stringify({
|
||||||
|
page: parseInt(pg),
|
||||||
|
pagecount: pgCount,
|
||||||
|
limit: limit,
|
||||||
|
total: limit * pgCount,
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
const html = await request(HOST + '/video/' + id + '.html');
|
||||||
|
const $ = load(html);
|
||||||
|
const vod = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: $('h1.page-title').text().trim(),
|
||||||
|
vod_type: $('.video-info-aux a.tag-link:first').text().trim(),
|
||||||
|
vod_area: $('.video-info-aux a.tag-link:eq(2)').text().trim(),
|
||||||
|
vod_year: $('.video-info-aux a.tag-link:eq(1)').text().trim(),
|
||||||
|
vod_director: $('.video-info-main .video-info-items:contains(导演:)').text().substring(3).trim().replace(/(^\/|\/$)/g, '').trim(),
|
||||||
|
vod_actor: $('.video-info-main .video-info-items:contains(主演:)').text().substring(3).trim().replace(/(^\/|\/$)/g, '').trim(),
|
||||||
|
vod_pic: $('.video-cover img:first').attr('data-src'),
|
||||||
|
vod_remarks : $('.video-info-main .video-info-items:contains(备注:)').text().substring(3) || '',
|
||||||
|
vod_content: $('.video-info-main .video-info-items:contains(剧情:)').text().substring(3).trim().replace(/收起$/g, ''),
|
||||||
|
};
|
||||||
|
const playMap = {};
|
||||||
|
const tabs = $('.module-player-tab .module-tab-item');
|
||||||
|
const playlists = $('.module-player-list > .module-blocklist');
|
||||||
|
_.each(tabs, (tab, i) => {
|
||||||
|
const $tab = $(tab);
|
||||||
|
const from = $tab.find('span:first').text().trim();
|
||||||
|
if (from.includes('夸克')) return;
|
||||||
|
let list = playlists[i];
|
||||||
|
list = $(list).find('a');
|
||||||
|
_.each(list, (it) => {
|
||||||
|
const $it = $(it);
|
||||||
|
const title = $it.find('span:first').text().trim();
|
||||||
|
const playUrl = $it.attr('href');
|
||||||
|
if (!playMap.hasOwnProperty(from)) {
|
||||||
|
playMap[from] = [];
|
||||||
|
}
|
||||||
|
playMap[from].push(title + '$' + playUrl);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
vod.vod_play_from = _.keys(playMap).join('$$$');
|
||||||
|
const urls = _.values(playMap);
|
||||||
|
const vod_play_url = _.map(urls, (urlist) => {
|
||||||
|
return urlist.join('#');
|
||||||
|
});
|
||||||
|
vod.vod_play_url = vod_play_url.join('$$$');
|
||||||
|
return JSON.stringify({
|
||||||
|
list: [vod],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
const link = HOST + id;
|
||||||
|
const html = await request(link);
|
||||||
|
let $ = load(html);
|
||||||
|
let json = $('script:contains(player_aaaa)').text().replace('var player_aaaa=','');
|
||||||
|
let js = JSON.parse(json);
|
||||||
|
let playUrl = js.url;
|
||||||
|
if (js.encrypt == 1) {
|
||||||
|
playUrl = unescape(playUrl);
|
||||||
|
} else if (js.encrypt == 2) {
|
||||||
|
playUrl = unescape(base64Decode(playUrl));
|
||||||
|
}
|
||||||
|
let playHtml = await request('https://jx3.xn--1lq90i13mxk5bolhm8k.xn--fiqs8s/player/ec.php?code=ak&if=1&url=' + playUrl);
|
||||||
|
json = playHtml.match(/let ConFig = {([\w\W]*)},box/)[1];
|
||||||
|
const jsConfig = JSON.parse('{' + json.trim() + '}');
|
||||||
|
playUrl = decryptUrl(jsConfig);
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
header: {
|
||||||
|
'User-Agent': UA,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function decryptUrl(jsConfig) {
|
||||||
|
const key = Crypto.enc.Utf8.parse('2890' + jsConfig.config.uid + 'tB959C');
|
||||||
|
const iv = Crypto.enc.Utf8.parse('2F131BE91247866E');
|
||||||
|
const mode = Crypto.mode.CBC;
|
||||||
|
const padding = Crypto.pad.Pkcs7;
|
||||||
|
const decrypted = Crypto.AES.decrypt(jsConfig.url, key, {
|
||||||
|
'iv': iv,
|
||||||
|
'mode': mode,
|
||||||
|
'padding': padding
|
||||||
|
});
|
||||||
|
const decryptedUrl = Crypto.enc.Utf8.stringify(decrypted);
|
||||||
|
return decryptedUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64Decode(text) {
|
||||||
|
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let data = JSON.parse(await request(HOST + '/index.php/ajax/suggest?mid=1&limit=50&wd=' + wd)).list;
|
||||||
|
let videos = [];
|
||||||
|
for (const vod of data) {
|
||||||
|
videos.push({
|
||||||
|
vod_id: vod.id,
|
||||||
|
vod_name: vod.name,
|
||||||
|
vod_pic: vod.pic,
|
||||||
|
vod_remarks: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
cat/js/yrzj.js
Normal file
1
cat/js/yrzj.js
Normal file
File diff suppressed because one or more lines are too long
272
cat/js/ys996_open.js
Normal file
272
cat/js/ys996_open.js
Normal file
@ -0,0 +1,272 @@
|
|||||||
|
import { Crypto, load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let siteUrl = 'https://www.cs1369.com';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let headers = {};
|
||||||
|
|
||||||
|
async function request(reqUrl, postData, agentSp, get) {
|
||||||
|
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: get ? 'get' : 'post',
|
||||||
|
headers: headers,
|
||||||
|
data: postData || {},
|
||||||
|
postType: get ? '' : 'form',
|
||||||
|
});
|
||||||
|
|
||||||
|
let content = res.content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
let classes = [{
|
||||||
|
type_id: '1',
|
||||||
|
type_name: '电影',
|
||||||
|
},{
|
||||||
|
type_id: '2',
|
||||||
|
type_name: '电视',
|
||||||
|
},{
|
||||||
|
type_id: '3',
|
||||||
|
type_name: '动漫',
|
||||||
|
}];
|
||||||
|
|
||||||
|
let filterObj = genFilterObj();
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
filters: filterObj
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
let videos = await getVideos(siteUrl);
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
let url = siteUrl;
|
||||||
|
if (filter) {
|
||||||
|
url = url + '/show';
|
||||||
|
let area = extend['area'];
|
||||||
|
if (area && area != '') {
|
||||||
|
url = url + '/area/' + area;
|
||||||
|
}
|
||||||
|
let clazz = extend['class']
|
||||||
|
if (clazz && clazz != '') {
|
||||||
|
url = url + '/class/' + clazz;
|
||||||
|
}
|
||||||
|
let id = extend['id'];
|
||||||
|
if(id && id != '') {
|
||||||
|
url = url + '/id/' + id;
|
||||||
|
} else {
|
||||||
|
url = url + '/id/' + tid;
|
||||||
|
}
|
||||||
|
let year = extend['year'];
|
||||||
|
if (year && year != '') {
|
||||||
|
url = url + '/year/' + year;
|
||||||
|
}
|
||||||
|
if (pg && pg > 1) {
|
||||||
|
url = url + '/page/' + pg;
|
||||||
|
}
|
||||||
|
url = url + '.html';
|
||||||
|
} else {
|
||||||
|
url = url + '/vod/type';
|
||||||
|
url = url + '/id/' + tid;
|
||||||
|
if (pg && pg > 1) {
|
||||||
|
url = url + '/page/' + pg;
|
||||||
|
}
|
||||||
|
url = url + '.html';
|
||||||
|
}
|
||||||
|
//console.log('cate page url:', url);
|
||||||
|
|
||||||
|
let videos = await getVideos(url);
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
page: pg
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
try {
|
||||||
|
let url = siteUrl + id;
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
let actors = _.map($('div.stui-content__detail > p:nth-child(3) > a'), (n) => {
|
||||||
|
return $(n).text();
|
||||||
|
});
|
||||||
|
let actor = actors.join(' ');
|
||||||
|
let director = $('div.stui-content__detail > p:nth-child(4) > a').text();
|
||||||
|
let title = $('div.stui-content__detail > h1.title').text();
|
||||||
|
let content = $('div.stui-pannel_bd > p').text();
|
||||||
|
const cards = $('div.stui-pannel_bd.col-pd.clearfix > ul > li > a');
|
||||||
|
let playUrls = _.map(cards, (n) => {
|
||||||
|
return $(n).text() + '$' + n.attribs['href'];
|
||||||
|
});
|
||||||
|
|
||||||
|
const video = {
|
||||||
|
vod_actor: actor,
|
||||||
|
vod_play_from: 'Leospring',
|
||||||
|
vod_play_url: playUrls.join('#'),
|
||||||
|
vod_director: director,
|
||||||
|
vod_content: content,
|
||||||
|
};
|
||||||
|
const list = [video];
|
||||||
|
const result = { list };
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {
|
||||||
|
//console.log('err', e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let url = siteUrl + '/search/wd/' + wd + '.html';
|
||||||
|
//console.log('search url:', url);
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.stui-pannel_bd > ul.stui-vodlist__media.col-pd.clearfix > li');
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = $($(n).find('div.thumb > a')[0]).attr('href');
|
||||||
|
let name = $($(n).find('div.thumb > a')[0]).attr('title');
|
||||||
|
let pic = $($(n).find('div.thumb > a')[0]).attr('data-original');
|
||||||
|
let remark = $($(n).find('div.thumb > a > span:nth-child(2)')[0]).text();
|
||||||
|
|
||||||
|
return {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: remark,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
let url = siteUrl + id;
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
let info = '';
|
||||||
|
for(const n of $('script')) {
|
||||||
|
if($(n).text().indexOf('player_aaaa=') > 0) {
|
||||||
|
info = $(n).text().split('player_aaaa=')[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//console.log('info', info);
|
||||||
|
let obj = JSON.parse(info);
|
||||||
|
let playUrl = obj.url;
|
||||||
|
if(obj.encrypt == 1) {
|
||||||
|
playUrl = unescape(playUrl);
|
||||||
|
} else if (obj.encrypt == 2) {
|
||||||
|
playUrl = unescape(base64Decode(playUrl))
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: playUrl,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function genFilterObj() {
|
||||||
|
return {
|
||||||
|
'1':[
|
||||||
|
{
|
||||||
|
key: 'id',
|
||||||
|
name: '类型',
|
||||||
|
value: [{n:'全部',v:''},{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'}]
|
||||||
|
},{
|
||||||
|
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:'网络电影'}]
|
||||||
|
},{
|
||||||
|
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:'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'}]
|
||||||
|
}],
|
||||||
|
'2':[{
|
||||||
|
key: 'id',
|
||||||
|
name: '类型',
|
||||||
|
value: [{n:'全部',v:''},{n:'内地',v:'15'},{n:'美国',v:'16'},{n:'英国',v:'17'},{n:'韩国',v:'18'},{n:'泰国',v:'20'},{n:'日本',v:'21'},{n:'香港',v:'22'},{n:'台湾',v:'23'}]
|
||||||
|
},{
|
||||||
|
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:'美国'},{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:'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'}]
|
||||||
|
}],
|
||||||
|
'3':[{
|
||||||
|
key: 'id',
|
||||||
|
name: '类型',
|
||||||
|
value: [{n:'全部',v:''},{n:'内地',v:'25'},{n:'日漫',v:'26'},{n:'欧美',v:'27'},{n:'其他',v:'28'}]
|
||||||
|
},{
|
||||||
|
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:'励志'}]
|
||||||
|
},{
|
||||||
|
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:'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'}]
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getVideos(url) {
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.stui-vodlist__box > a')
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['href'];
|
||||||
|
let name = n.attribs['title'];
|
||||||
|
let pic = n.attribs['data-original'];
|
||||||
|
let remark = $($(n).find('span:nth-child(2)')[0]).text();
|
||||||
|
return {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: remark,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return videos;
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64Encode(text) {
|
||||||
|
return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64Decode(text) {
|
||||||
|
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
1
cat/js/yt.js
Normal file
1
cat/js/yt.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/yzys.js
Normal file
1
cat/js/yzys.js
Normal file
File diff suppressed because one or more lines are too long
1
cat/js/zz123_book_open.js
Normal file
1
cat/js/zz123_book_open.js
Normal file
File diff suppressed because one or more lines are too long
162
cat/js/zzmusic_book_open.js
Normal file
162
cat/js/zzmusic_book_open.js
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
import { Crypto, load, _ } from './lib/cat.js';
|
||||||
|
|
||||||
|
let siteUrl = 'https://gh.7761.cf/https://zz123.com';
|
||||||
|
let imgUrl = 'https://music.jsbaidu.com';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let headers = {};
|
||||||
|
|
||||||
|
async function request(reqUrl, postData, agentSp, get) {
|
||||||
|
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: get ? 'get' : 'post',
|
||||||
|
headers: headers,
|
||||||
|
data: postData || {},
|
||||||
|
postType: get ? '' : 'form',
|
||||||
|
});
|
||||||
|
|
||||||
|
let content = res.content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
if (cfg.ext) {
|
||||||
|
siteUrl = cfg.ext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
const html = await request(siteUrl);
|
||||||
|
const $ = load(html);
|
||||||
|
const cates = $('ul.aside-menu-list.channel > li')
|
||||||
|
let classes = _.map(cates, (n) => {
|
||||||
|
let id = n.attribs['data-id'];
|
||||||
|
let name = $($(n).find('a > span')[0]).text();
|
||||||
|
return {
|
||||||
|
type_id: id,
|
||||||
|
type_name: name,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
const html = await request(siteUrl);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.page-main-wrap > div > div > div.card-list.d-none.d-md-block > div')
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['data-id'];
|
||||||
|
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||||
|
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||||
|
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||||
|
return {
|
||||||
|
book_id: id,
|
||||||
|
book_name: name,
|
||||||
|
book_pic: pic,
|
||||||
|
book_remarks: remark,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
let url = siteUrl + '/ajax/';
|
||||||
|
let res = await req(url, {
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
act: 'tag_music',
|
||||||
|
type: 'tuijian',
|
||||||
|
tid: tid,
|
||||||
|
page: pg,
|
||||||
|
lang: '',
|
||||||
|
},
|
||||||
|
postType: 'form',
|
||||||
|
});
|
||||||
|
//console.log('catedata:', res);
|
||||||
|
let data = JSON.parse(res.content).data;
|
||||||
|
let videos = [];
|
||||||
|
for(let i=0;i<data.length;i++){
|
||||||
|
const item = data[i];
|
||||||
|
videos.push({
|
||||||
|
book_id: item['mp3'],
|
||||||
|
book_name: item['mname'],
|
||||||
|
book_pic: item['pic'].replace('/img', imgUrl),
|
||||||
|
book_remarks: item['play_time'],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
try {
|
||||||
|
let playUrl = id;
|
||||||
|
if(!id.startsWith('http')) {
|
||||||
|
playUrl = siteUrl + '/xplay/?act=songplay&id=' + id;
|
||||||
|
}
|
||||||
|
|
||||||
|
const video = {
|
||||||
|
book_id: id,
|
||||||
|
book_actor: 'Leospring',
|
||||||
|
book_play_from: 'Leospring',
|
||||||
|
urls: '播放$' + playUrl,
|
||||||
|
book_director: 'Leospring',
|
||||||
|
book_content: '该音乐由公众号【蚂蚁科技杂谈】用爱发电制作,欢迎收听!',
|
||||||
|
};
|
||||||
|
const list = [video];
|
||||||
|
const result = { list };
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let url = siteUrl + '/search/?key=' + wd;
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.tab-item.tab-song > div.card-list.d-none.d-md-block > div')
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['data-id'];
|
||||||
|
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||||
|
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||||
|
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||||
|
|
||||||
|
return {
|
||||||
|
book_id: id,
|
||||||
|
book_name: name,
|
||||||
|
book_pic: pic,
|
||||||
|
book_remarks: remark,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
163
cat/js/zzmusic_open.js
Normal file
163
cat/js/zzmusic_open.js
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
import { Crypto, load, _ } from './lib/cat.js';
|
||||||
|
//代理地址
|
||||||
|
let siteUrl = 'https://gh.7761.cf/https://zz123.com';
|
||||||
|
let imgUrl = 'https://music.jsbaidu.com';
|
||||||
|
let siteKey = '';
|
||||||
|
let siteType = 0;
|
||||||
|
let headers = {};
|
||||||
|
|
||||||
|
async function request(reqUrl, postData, agentSp, get) {
|
||||||
|
|
||||||
|
let res = await req(reqUrl, {
|
||||||
|
method: get ? 'get' : 'post',
|
||||||
|
headers: headers,
|
||||||
|
data: postData || {},
|
||||||
|
postType: get ? '' : 'form',
|
||||||
|
});
|
||||||
|
|
||||||
|
let content = res.content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function init(cfg) {
|
||||||
|
siteKey = cfg.skey;
|
||||||
|
siteType = cfg.stype;
|
||||||
|
if (cfg.ext) {
|
||||||
|
siteUrl = cfg.ext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function home(filter) {
|
||||||
|
const html = await request(siteUrl);
|
||||||
|
const $ = load(html);
|
||||||
|
const cates = $('ul.aside-menu-list.channel > li')
|
||||||
|
let classes = _.map(cates, (n) => {
|
||||||
|
let id = n.attribs['data-id'];
|
||||||
|
let name = $($(n).find('a > span')[0]).text();
|
||||||
|
return {
|
||||||
|
type_id: id,
|
||||||
|
type_name: name
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
class: classes
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function homeVod() {
|
||||||
|
const html = await request(siteUrl);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.page-main-wrap > div > div > div.card-list.d-none.d-md-block > div');
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['data-id'];
|
||||||
|
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||||
|
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||||
|
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||||
|
return {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: remark
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function category(tid, pg, filter, extend) {
|
||||||
|
if (pg <= 0) pg = 1;
|
||||||
|
let url = siteUrl + '/ajax/';
|
||||||
|
let res = await req(url, {
|
||||||
|
method: 'post',
|
||||||
|
data: {
|
||||||
|
act: 'tag_music',
|
||||||
|
type: 'tuijian',
|
||||||
|
tid: tid,
|
||||||
|
page: pg,
|
||||||
|
lang: ''
|
||||||
|
},
|
||||||
|
postType: 'form'
|
||||||
|
});
|
||||||
|
//console.log('catedata:', res);
|
||||||
|
let data = JSON.parse(res.content).data;
|
||||||
|
let videos = [];
|
||||||
|
for(let i=0;i<data.length;i++){
|
||||||
|
const item = data[i];
|
||||||
|
videos.push({
|
||||||
|
vod_id: item['mp3'],
|
||||||
|
vod_name: item['mname'],
|
||||||
|
vod_pic: item['pic'].replace('/img', imgUrl),
|
||||||
|
vod_remarks: item['play_time']
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detail(id) {
|
||||||
|
try {
|
||||||
|
let playUrl = id;
|
||||||
|
if(!id.startsWith('http')) {
|
||||||
|
playUrl = siteUrl + '/xplay/?act=songplay&id=' + id;
|
||||||
|
}
|
||||||
|
|
||||||
|
const video = {
|
||||||
|
vod_id: id,
|
||||||
|
vod_actor: 'Leospring',
|
||||||
|
vod_play_from: 'Leospring',
|
||||||
|
vod_play_url: '播放$' + playUrl,
|
||||||
|
vod_director: 'Leospring',
|
||||||
|
vod_content: '该音乐由公众号【蚂蚁科技杂谈】用爱发电制作,欢迎收听!',
|
||||||
|
};
|
||||||
|
const list = [video];
|
||||||
|
const result = { list };
|
||||||
|
return JSON.stringify(result);
|
||||||
|
} catch (e) {}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function play(flag, id, flags) {
|
||||||
|
return JSON.stringify({
|
||||||
|
parse: 0,
|
||||||
|
url: id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function search(wd, quick, pg) {
|
||||||
|
let url = siteUrl + '/search/?key=' + wd;
|
||||||
|
const html = await request(url);
|
||||||
|
const $ = load(html);
|
||||||
|
const cards = $('div.tab-item.tab-song > div.card-list.d-none.d-md-block > div')
|
||||||
|
let videos = _.map(cards, (n) => {
|
||||||
|
let id = n.attribs['data-id'];
|
||||||
|
let name = $($(n).find('div.item-info > div > div.songname.text-ellipsis.color-link-content-primary > a')[0]).text();
|
||||||
|
let pic = $($(n).find('div.item-cover-wrap > a > img')[0]).attr('data-src').replace('/img', imgUrl);
|
||||||
|
let remark = $($(n).find('div.item-cover-wrap > div.item-time')[0]).text();
|
||||||
|
|
||||||
|
return {
|
||||||
|
vod_id: id,
|
||||||
|
vod_name: name,
|
||||||
|
vod_pic: pic,
|
||||||
|
vod_remarks: remark,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return JSON.stringify({
|
||||||
|
list: videos,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function __jsEvalReturn() {
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
home: home,
|
||||||
|
homeVod: homeVod,
|
||||||
|
category: category,
|
||||||
|
detail: detail,
|
||||||
|
play: play,
|
||||||
|
search: search,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user