pull/15/head
qist 2 years ago
parent e8a866b4bd
commit a1df95e46b

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,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,
};
}

File diff suppressed because one or more lines are too long

@ -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,
};
}

@ -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,
};
}

@ -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,
};
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,517 +1,244 @@
{
"video": {
"sites": [
{
"key": "豆瓣",
"name": "🟢 豆瓣👁️‍",
"type": 3,
"indexs": 1,
"api": "douban_open.js"
},
{
"key": "doubanbb",
"name": "🟢 片单",
"type": 3,
"indexs": 1,
"api": "doubanbb.js"
},
{
"key": "玩偶哥哥",
"name": "🟢 玩偶",
"type": 3,
"api": "wogg_open.js",
"ext": "填入阿里token"
},
{
"key": "玩偶表哥",
"name": "🟢 表哥",
"type": 3,
"api": "wobg_open.js",
"ext": "填入阿里token"
},
{
"key": "耐看",
"name": "🟢 耐看",
"type": 3,
"api": "nkvod_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": "厂长资源",
"name": "🟢 厂长",
"type": 3,
"api": "czzy_open.js"
},
{
"key": "素白白",
"name": "🟢 素白",
"type": 3,
"api": "subaibai_open.js"
},
{
"key": "低端影视",
"name": "🟢 低端",
"type": 3,
"api": "ddys_open.js"
},
{
"key": "高光影视",
"name": "🟢 高光",
"type": 3,
"api": "ggys_open.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": "nangua",
"name": "🟢 南瓜②",
"type": 3,
"api": "nangua_open.js"
},
{
"key": "巧技一",
"name": "🟢 巧技①",
"type": 3,
"api": "qiao2_open.js",
"ext": "https://jihulab.com/qiaoji/open/-/raw/main/qiaoji2"
},
{
"key": "巧技二",
"name": "🟢 巧技②",
"type": 3,
"api": "qiao2_open.js",
"ext": "https://jihulab.com/qiaoji/open/-/raw/main/qiaoji3"
},
{
"key": "kanqiu",
"name": "🟢 看球①",
"type": 3,
"api": "kanqiu_open.js",
"searchable": 0,
"changeable": 0,
"style": {
"type": "list"
}
},
{
"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": "555电影",
"name": "🟢 三五",
"type": 3,
"api": "555dy_open.js"
},
{
"key": "圣城影视",
"name": "🟢 圣城",
"type": 3,
"api": "sc1080_open.js"
},
{
"key": "胖虎影视",
"name": "🟢 胖虎",
"type": 3,
"api": "panghu_open.js"
},
{
"key": "人人影视",
"name": "🟢 人人",
"type": 3,
"api": "rttks_open.js"
},
{
"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": "58dm",
"name": "🟢 五八",
"type": 3,
"api": "/cat/58dm_open.js"
},
{
"key": "爱动漫",
"name": "🟢 爱漫",
"type": 3,
"api": "adm_open.js"
},
{
"key": "酷我短剧",
"name": "🟢 酷我",
"type": 3,
"api": "kuwo_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": "我的哔哩",
"name": "🟢 我哔",
"type": 3,
"api": "mybili_open.js"
},
{
"key": "哔哩",
"name": "🟢 哔哩",
"type": 3,
"api": "bili_open.js",
{"key":"豆瓣","name":"🟢 豆瓣👁️\u200d","type":3,"indexs":1,"api":"douban_open.js"},
{"key":"doubanbb","name":"🟢 片单","type":3,"indexs":1,"api":"doubanbb.js"},
{"key":"玩偶哥哥","name":"🟢 玩偶","type":3,"api":"wogg_open.js","ext":"填入阿里token"},
{"key":"玩偶表哥","name":"🟢 表哥","type":3,"api":"wobg_open.js","ext":"填入阿里token"},
{"key":"耐看","name":"🟢 耐看","type":3,"api":"nkvod_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":"厂长资源","name":"🟢 厂长","type":3,"api":"czzy_open.js"},
{"key":"素白白","name":"🟢 素白","type":3,"api":"subaibai_open.js"},
{"key":"低端影视","name":"🟢 低端","type":3,"api":"ddys_open.js"},
{"key":"高光影视","name":"🟢 高光","type":3,"api":"ggys_open.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":"nangua","name":"🟢 南瓜②","type":3,"api":"nangua_open.js"},
{"key":"巧技一","name":"🟢 巧技①","type":3,"api":"qiao2_open.js","ext":"https://jihulab.com/qiaoji/open/-/raw/main/qiaoji2"},
{"key":"巧技二","name":"🟢 巧技②","type":3,"api":"qiao2_open.js","ext":"https://jihulab.com/qiaoji/open/-/raw/main/qiaoji3"},
{"key":"kanqiu","name":"🟢 看球①","type":3,"api":"kanqiu_open.js","searchable":0,"changeable":0,"style":{"type":"list"}},
{"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":"555电影","name":"🟢 三五","type":3,"api":"555dy_open.js"},
{"key":"圣城影视","name":"🟢 圣城","type":3,"api":"sc1080_open.js"},
{"key":"胖虎影视","name":"🟢 胖虎","type":3,"api":"panghu_open.js"},
{"key":"人人影视","name":"🟢 人人","type":3,"api":"rttks_open.js"},
{"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":"58dm","name":"🟢 五八","type":3,"api":"58dm_open.js"},
{"key":"爱动漫","name":"🟢 爱漫","type":3,"api":"adm_open.js"},
{"key":"酷我短剧","name":"🟢 酷我","type":3,"api":"kuwo_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":"我的哔哩","name":"🟢 我哔","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":"kanqiu_open","name":"体育 | 看球","type":3,"api":"kanqiu_open.js"},
{"key":"xinshijue_open","name":"影视 | 新视觉","type":3,"api":"xinshijue_open.js"},
{"key":"sc1080_open","name":"影视 | 圣城","type":3,"api":"sc1080_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":"ggys_open","name":"影视 | 高光","type":3,"api":"ggys_open.js"},
{"key":"ddys_open","name":"影视 | 低端","type":3,"api":"ddys_open.js"},
{"key":"4kysxz_open","name":"影视 | 4KXZ","type":3,"api":"4kysxz_open.js"},
{"key":"nkvod_open","name":"影视 | 耐看","type":3,"api":"nkvod_open.js"},
{"key":"52ju_open","name":"影视 | 我爱剧","type":3,"api":"52ju_open.js"},
{"key":"dyxs_open","name":"影视 | 电影先生","type":3,"api":"dyxs_openn.js"},
{"key":"lz_open","name":"影视 | 量子","type":3,"api":"lz_open.js"},
{"key":"mfk_open","name":"影视 | 免费看","type":3,"api":"mfk_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":"voflix_open","name":"影视 | vofx","type":3,"api":"voflix_open.js"},
{"key":"4kys_open","name":"影视 | 4K影视","type":3,"api":"4kys_open.js"},
{"key":"zjm_open","name":"影视 | 追剧迷","type":3,"api":"zjm_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":"wpian_open","name":"影视 | pian","type":3,"api":"wpian_open.js"},
{"key":"ym_open","name":"影视 | 映迷","type":3,"api":"ym_open.js"},
{"key":"yzz_open","name":"影视 | 影渣","type":3,"api":"yzz_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":"yjys_open","name":"影视 | 悠久","type":3,"api":"yjys_open.js"},
{"key":"wogg","name":"阿里 | 玩偶哥哥","type":3,"api":"wogg.js","ext":"填自己的32位token"},
{"key":"wobg_open","name":"阿里 | 玩偶表哥","type":3,"api":"wobg_open.js","ext":"填入你的token"},
{"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":"ys996_open","name":"影视 | 996","type":3,"api":"ys996_open.js"},
{"key":"star_open","name":"影视 | 星视界","type":3,"api":"star_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":"yrzj_open","name":"影视 | 伊人","type":3,"api":"yrzj_open.js"},
{"key":"yzys_open","name":"影视 | 柚子","type":3,"api":"yzys_open.js"},
{"key":"sssp_open","name":"影视 | 速搜","type":3,"api":"sssp_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":"hmsp_open","name":"影视 | 河马","type":3,"api":"hmsp_open.js"},
{"key":"jojo_open","name":"影视 | jojo","type":3,"api":"jojo_open.js"},
{"key":"jiohub","name":"影视 | jiohub","type":3,"api":"jiohub.js"},
{"key":"dsxys_open","name":"影视 | 大师兄","type":3,"api":"dsxys_open.js"},
{"key":"mino_open","name":"影视 | Mino","type":3,"api":"mino_open.js"},
{"key":"ddmv_open","name":"影视 | DDMV","type":3,"api":"ddmv_open.js"},
{
"key": "rejumao",
"name": "影视 | 热剧猫",
"type": 3,
"api": "apptov5_open.js",
"ext": {
"categories": "音乐#动画#电影#电视剧#番剧#综艺#国创#搞笑#单机游戏#沙雕动画#沙雕穿越#沙雕",
"cookie": "DedeUserID=690781341;DedeUserID__ckMd5=cabc96906269c5b6;SESSDATA=2245ba24%2C1684212125%2C466fd%2Ab2;bili_jct=de6fdb60c10f8a83910aa55d79407b4e;"
"domains": [
"https://app-1253196701.cos.ap-shanghai.myqcloud.com/app.txt",
"https://www.daenwl.com/app.txt"
],
"aesKey": "8y8sDX3ZG22yACH3ZM5KfNGieTxEMKFe",
"aesIV": "WxRAbh68C8pP6SpN",
"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-----",
"ic": "fwEUWytkwJqHICtu/kNrXOVGQAzWUw1mGuQYdT1heOKZ6vEEI+4jf6LAHJ/f4h39ZR2WL4fccGchSoCm+pqkBRi8asSMqZzKGGfY8ejzrYHxDjiTOhs4B6p/iC8Nrj+bcCmXAjVNksfxlcjU6JlbRQ=="
}
},
{
"key": "哔哩直播",
"name": "🟢 直播",
"key": "布雷v5",
"name": "影视 | 布蕾",
"type": 3,
"api": "bililive_open.js",
"api": "apptov5_open.js",
"ext": {
"cookie": "DedeUserID=690781341;DedeUserID__ckMd5=cabc96906269c5b6;SESSDATA=2245ba24%2C1684212125%2C466fd%2Ab2;bili_jct=de6fdb60c10f8a83910aa55d79407b4e;"
"domains": [
"https://v5-public-1251970844.cos.ap-shanghai.myqcloud.com/accredits/68.json"
],
"aesKey": "xMQFiWw77QzaiBDKNWjNRAChrenE2zB2",
"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": "🟢 火狐",
"key": "追忆",
"name": "影视 | 追忆",
"type": 3,
"api": "caiji.js",
"api": "apptov5_open.js",
"ext": {
"url": "https://hhzyapi.com/api.php/provide/vod/from/hhm3u8",
"categories": [
"内地剧",
"欧美剧",
"香港剧",
"台湾剧",
"马泰剧",
"韩剧",
"日剧",
"动作片",
"爱情片",
"喜剧片",
"科幻片",
"恐怖片",
"剧情片",
"战争片",
"灾难片",
"悬疑片",
"犯罪片",
"奇幻片",
"记录片",
"伦理片",
"动画片",
"中国动漫",
"日本动漫",
"欧美动漫",
"大陆综艺",
"日韩综艺",
"港台综艺",
"欧美综艺"
]
"domains": [
"https://xtao-1253811961.cos.ap-chengdu.myqcloud.com/appto/xtao.json"
],
"aesKey": "we2CwNfG7PJppQmBfX8MMMQaWbSdcDXi",
"aesIV": "DnT3jxT8RYsa8ctc",
"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-----",
"ic": "4Dqrm2DknrkdH3qOh7rE2nwK9BUd5cMVriFc+kWKpUedUJt6cLXHcROX9ps/2rBoBEftIjKkCAB5PSxCJUoKm/1n1mEZt7hQLSyIco9fRfS1QwyZItfMvHbjPJoB0vQnOvlcl7C8lgRZHFQLVXh9iA=="
}
},
{
"key": "新浪资源",
"name": "🟢 新浪",
{"key":"czzy","name":"影视 | 厂长","type":3,"api":"czzy_open.js"},
{"key":"libvio","name":"影视 | libvio","type":3,"api":"libvio_open.js"},
{"key":"kkys","name":"影视 | 快看","type":3,"api":"kkys_open.js"},
{"key":"ikanbot_open","name":"影视 | 爱看","type":3,"api":"ikanbot_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":"subaibai","name":"影视 | 素白白","type":3,"api":"subaibai_open.js"},
{"key":"drpy_js_zxzj_open","name":"影视 | 在线之家","type":3,"api":"zxzj_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":"kuwo_open","name":"短剧 | 酷我","type":3,"api":"kuwo_open.js"},
{"key":"vsdj_open","name":"短剧 | VS","type":3,"api":"vsdj_open.js"},
{"key":"djwm_open","name":"短剧 | 完美","type":3,"api":"djwm_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":"ufc_open","name":"格斗 | 武享","type":3,"api":"ufc_open.js"},
{"key":"sharenice","name":"聚合 | 短视频","type":3,"api":"sharenice_open.js"},
{
"key": "huya",
"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",
"api": "huya_open.js",
"ext": {
"url": "https://jszyapi.com/api.php/provide/vod/from/jsm3u8/",
"categories": [
"内地剧",
"欧美剧",
"香港剧",
"台湾剧",
"马泰剧",
"韩剧",
"日剧",
"伦理片",
"动作片",
"爱情片",
"喜剧片",
"科幻片",
"恐怖片",
"剧情片",
"战争片",
"灾难片",
"悬疑片",
"犯罪片",
"奇幻片",
"记录片",
"动画片",
"中国动漫",
"日本动漫",
"欧美动漫",
"大陆综艺",
"日韩综艺",
"港台综艺",
"欧美综艺"
]
"from": "official",
"custom": "1,英雄联盟#2336,王者荣耀"
}
},
{
"key": "光速资源",
"name": "🟢 光速",
"key": "douyu",
"name": "直播 | 斗鱼",
"type": 3,
"api": "caiji.js",
"api": "douyu_open.js",
"ext": {
"url": "https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8",
"categories": [
"大陆剧",
"欧美剧",
"港澳剧",
"台湾剧",
"泰剧",
"韩剧",
"日剧",
"动作片",
"爱情片",
"喜剧片",
"科幻片",
"恐怖片",
"战争片",
"伦理片",
"动漫电影"
]
"from": "official",
"custom": "LOL,英雄联盟#wzry,王者荣耀"
}
},
{
"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":"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":"kuqimv","name":"MV | 酷奇","type":3,"api":"kuqimv_open.js"},
{"key":"zzmusic_open","name":"音乐 | 渣渣","type":3,"api":"zzmusic_open.js"},
{"key":"drpy_js_cntv_open","name":"电视 | 视聚场","type":3,"api":"cntv_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":"miniku","name":"V2 | 迷你","type":3,"api":"appysv2.js","ext":"http://www.miniku.cc/xgapp.php/v1/"},
{"key":"aidi","name":"V2 | 爱迪","type":3,"api":"appysv2.js","ext":"https://api123.adys.app/xgapp.php/v3/"},
{"key":"yaya","name":"V2 | 鸭鸭","type":3,"api":"appysv2.js","ext":"https://yayayaaapp.ynf.icu/api.php/app/"},
{"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":"kku","name":"V2 | 酷影","type":3,"api":"appysv2.js","ext":"https://www.gsjtlxy.top/xgapp.php/v3/"},
{"key":"kuu","name":"V2 | 酷客","type":3,"api":"appysv2.js","ext":"https://www.kuin.one/api.php/app/"},
{"key":"ruidou","name":"V2 | 锐豆","type":3,"api":"appysv2.js","ext":"http://ys.realdou.cn:2683/api.php/app/"},
{"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":"dadou","name":"V2 | 大豆","type":3,"api":"appysv2.js","ext":"http://www.dadou.cm/api.php/app/"},
{"key":"qtw","name":"V2 | 彩虹","type":3,"api":"appysv2.js","ext":"http://ys.qtw.asia/lvdou_api.php/v1.vod"},
{"key":"火狐","name":"采集 | 火狐","type":3,"api":"caiji.js","ext":"https://hhzyapi.com/api.php/provide/vod/from/hhm3u8"},
{"key":"16wmv","name":"采集 | 16万MV","type":3,"api":"caiji.js","ext":"https://tvbox-mv--leosam2048.repl.co/mv/vod"},
{"key":"xinlang","name":"采集 | 新浪","type":3,"api":"caiji.js","ext":"https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8"},
{"key":"bdzy","name":"采集 | 百度","type":3,"api":"caiji.js","ext":"https://api.apibdzy.com/api.php/provide/vod/from/dbm3u8/"},
{"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":"piaoling","name":"采集 | 飘零","type":3,"api":"caiji.js","ext":"https://p2100.net/api.php/provide/vod/"},
{"key":"yingtu","name":"采集 | 影图","type":3,"api":"caiji.js","ext":"https://cj.vodimg.top/api.php/provide/vod/"},
{"key":"feifan","name":"采集 | 非凡","type":3,"api":"caiji.js","ext":"https://cj.ffzyapi.com/api.php/provide/vod/from/ffm3u8/"},
{"key":"feisu","name":"采集 | 飞速","type":3,"api":"caiji.js","ext":"https://www.feisuzyapi.com/api.php/provide/vod/from/fsm3u8/"},
{"key":"guangsu","name":"采集 | 光速","type":3,"api":"caiji.js","ext":"https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
{"key":"hongniu","name":"采集 | 红牛","type":3,"api":"caiji.js","ext":"https://www.hongniuzy2.com/api.php/provide/vod/from/hnm3u8/"},
{"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":"qihu","name":"采集 | 奇虎","type":3,"api":"caiji.js","ext":"https://caiji.qhzyapi.com/api.php/provide/vod/from/qhm3u8/"},
{"key":"guangsuapi","name":"采集 | 光速","type":3,"api":"caiji.js","ext":"http://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8/"},
{
"key": "push_agent",
"name": "♻ 推送",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,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,
};
}

@ -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,
};
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,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,
};
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,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,
};
}

File diff suppressed because one or more lines are too long

@ -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,
};
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,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,
};
}

@ -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…
Cancel
Save