338 lines
12 KiB
JavaScript
338 lines
12 KiB
JavaScript
import {Crypto, dayjs, jinja2, _} from "./lib/cat.js";
|
|
let key = "kkys"
|
|
, url = "https://api1.baibaipei.com:8899"
|
|
, device = {}
|
|
, siteKey = ""
|
|
, siteType = 0;
|
|
async function request(reqUrl, postData, agentSp, get) {
|
|
let ts = dayjs().valueOf().toString();
|
|
let rand = randStr(32);
|
|
let sign = Crypto.enc.Hex.stringify(Crypto.MD5('H58d2%gLbeingX*%D4Y8!C!!@G_' + ts + '_' + rand))
|
|
.toString()
|
|
.toLowerCase();
|
|
let headers = {
|
|
'user-agent': agentSp || device.ua,
|
|
};
|
|
if (reqUrl.includes('baibaipei')) {
|
|
headers['device-id'] = device.id;
|
|
headers['push-token'] = '';
|
|
headers['sign'] = sign;
|
|
headers['time'] = ts;
|
|
headers['md5'] = rand;
|
|
headers['version'] = '2.1.5';
|
|
headers['system-model'] = device.model;
|
|
headers['system-brand'] = device.brand;
|
|
headers['system-version'] = device.release;
|
|
}
|
|
if (!get) {
|
|
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
}
|
|
let res = await req(reqUrl, {
|
|
method: get ? 'get' : 'post',
|
|
headers: headers,
|
|
data: postData || {},
|
|
});
|
|
|
|
let content = res.data;
|
|
// console.log(content);
|
|
if (typeof content === 'string') {
|
|
var key = Crypto.enc.Utf8.parse('IjhHsCB2B5^#%0Ag');
|
|
var iv = Crypto.enc.Utf8.parse('y8_m.3rauW/>j,}.');
|
|
var src = Crypto.enc.Base64.parse(content);
|
|
let dst = Crypto.AES.decrypt({ ciphertext: src }, key, { iv: iv, padding: Crypto.pad.Pkcs7 });
|
|
dst = Crypto.enc.Utf8.stringify(dst);
|
|
// console.log(dst);
|
|
return JSON.parse(dst);
|
|
}
|
|
return content;
|
|
}
|
|
|
|
async function init(cfg) {
|
|
siteKey = cfg.skey,
|
|
siteType = cfg.stype;
|
|
cfg = await local.get(key, "device");
|
|
if (0 < cfg.length)
|
|
try {
|
|
device = JSON.parse(cfg)
|
|
} catch (error) {}
|
|
_.isEmpty(device) && ((device = randDevice()).id = randStr(33).toLowerCase(),
|
|
device.ua = "okhttp/4.1.0",
|
|
await local.set(key, "device", JSON.stringify(device)))
|
|
}
|
|
|
|
async function home(filter) {
|
|
var classes = []
|
|
, filterObj = {};
|
|
for (const type of JSON.parse(await request(url + "/api.php/Index/getTopVideoCategory")).data) {
|
|
//console.log('type', type);
|
|
var typeName = type.nav_name;
|
|
if ("推荐" != typeName) {
|
|
var typeId = type.nav_type_id.toString();
|
|
if (classes.push({
|
|
type_id: typeId,
|
|
type_name: typeName
|
|
}),
|
|
filter)
|
|
try {
|
|
var key, filterAll = [], filterData = JSON.parse(await request(url + "/api.php/Video/getFilterType", {
|
|
type: typeId
|
|
})).data;
|
|
//console.log('filterData', filterData);
|
|
for (key of Object.keys(filterData)) {
|
|
var itemValues = filterData[key];
|
|
//console.log('key', key);
|
|
if ("plot" === key) key = "class";
|
|
let typeExtendName = "";
|
|
switch (key) {
|
|
case "class":
|
|
typeExtendName = "类型";
|
|
break;
|
|
case "area":
|
|
typeExtendName = "地区";
|
|
break;
|
|
case "lang":
|
|
typeExtendName = "语言";
|
|
break;
|
|
case "year":
|
|
typeExtendName = "年代";
|
|
break;
|
|
case "sort":
|
|
typeExtendName = "排序"
|
|
}
|
|
if (0 !== typeExtendName.length) {
|
|
var newTypeExtend = {
|
|
key: key,
|
|
name: typeExtendName
|
|
}
|
|
, newTypeExtendKV = [];
|
|
for (let j = 0; j < itemValues.length; j++) {
|
|
var name = itemValues[j]
|
|
, value = "sort" === key ? j + "" : "全部" === name ? "0" : name;
|
|
newTypeExtendKV.push({
|
|
n: name,
|
|
v: value
|
|
})
|
|
}
|
|
newTypeExtend.init = "sort" === key ? "1" : newTypeExtendKV[0].v,
|
|
newTypeExtend.value = newTypeExtendKV,
|
|
filterAll.push(newTypeExtend)
|
|
}
|
|
}
|
|
_.isEmpty(filterAll) || (filterObj[typeId] = filterAll)
|
|
} catch (e) {
|
|
console.log(e)
|
|
}
|
|
}
|
|
}
|
|
return JSON.stringify({
|
|
class: classes,
|
|
filters: filterObj
|
|
})
|
|
}
|
|
async function homeVod() {
|
|
var videos = [];
|
|
for (const item of JSON.parse(await request(url + "/api.php/Index/getHomePage", {
|
|
type: 1,
|
|
p: 1
|
|
})).data.video)
|
|
if (0 === item.title.styleType)
|
|
for (const vObj of item.list)
|
|
videos.push({
|
|
vod_id: vObj.vod_id,
|
|
vod_name: vObj.vod_name,
|
|
vod_pic: vObj.vod_pic,
|
|
vod_remarks: vObj.vod_remarks || vObj.vod_score || ""
|
|
});
|
|
return JSON.stringify({
|
|
list: videos
|
|
})
|
|
}
|
|
async function category(tid, pg, filter, extend) {
|
|
0 == pg && (pg = 1);
|
|
var reqUrl = url + "/api.php/Video/getFilterVideoList"
|
|
, extend = JSON.parse(jinja2(`{
|
|
"type": "{{tid}}",
|
|
"p": "{{pg}}",
|
|
"area": "{{ext.area|default(0)}}",
|
|
"year": "{{ext.year|default(0)}}",
|
|
"sort": "{{ext.sort|default(0)}}",
|
|
"class": "{{ext.class|default(0)}}"
|
|
}`, {
|
|
ext: extend,
|
|
tid: tid,
|
|
pg: pg
|
|
}))
|
|
, tid = (console.log(extend),
|
|
JSON.parse(await request(reqUrl, extend)).data)
|
|
, videos = [];
|
|
for (const vod of tid.data)
|
|
videos.push({
|
|
vod_id: vod.vod_id,
|
|
vod_name: vod.vod_name,
|
|
vod_pic: vod.vod_pic,
|
|
vod_remarks: vod.vod_remarks || vod.vod_score || ""
|
|
});
|
|
return JSON.stringify({
|
|
page: parseInt(tid.current_page),
|
|
pagecount: parseInt(tid.last_page),
|
|
limit: parseInt(tid.per_page),
|
|
total: parseInt(tid.total),
|
|
list: videos
|
|
})
|
|
}
|
|
async function detail(id) {
|
|
var id = JSON.parse(await request(url + "/api.php/Video/getVideoInfo", {
|
|
video_id: id
|
|
})).data.video
|
|
, vod = {
|
|
vod_id: id.vod_id,
|
|
vod_name: id.vod_name,
|
|
vod_pic: id.vod_pic,
|
|
type_name: id.vod_class,
|
|
vod_year: id.vod_year,
|
|
vod_area: id.vod_area,
|
|
vod_remarks: id.vod_remarks || "",
|
|
vod_actor: id.vod_actor,
|
|
vod_director: id.vod_director,
|
|
vod_content: id.vod_content.trim()
|
|
}
|
|
, playlist = {};
|
|
for (const item of id.vod_play) {
|
|
var from = item.playerForm;
|
|
if ("jp" !== from && "xg" !== from) {
|
|
let urls = [];
|
|
for (const u of item.url)
|
|
urls.push(formatPlayUrl(vod.vod_name, u.title) + "$" + u.play_url);
|
|
!playlist.hasOwnProperty(from) && 0 < urls.length && (playlist[from] = urls)
|
|
}
|
|
}
|
|
parse = id.parse || [],
|
|
vod.vod_play_from = _.keys(playlist).join("$$$");
|
|
var vod_play_url = [];
|
|
for (const urlist of _.values(playlist))
|
|
vod_play_url.push(urlist.join("#"));
|
|
return vod.vod_play_url = vod_play_url.join("$$$"),
|
|
JSON.stringify({
|
|
list: [vod]
|
|
})
|
|
}
|
|
var parse = [];
|
|
async function play(flag, id, flags) {
|
|
try {
|
|
if ((0 <= id.indexOf("youku") || 0 <= id.indexOf("iqiyi") || 0 <= id.indexOf("v.qq.com") || 0 <= id.indexOf("pptv") || 0 <= id.indexOf("le.com") || 0 <= id.indexOf("1905.com") || 0 <= id.indexOf("mgtv")) && 0 < parse.length)
|
|
for (let index = 0; index < parse.length; index++)
|
|
try {
|
|
var p = parse[index];
|
|
let res = await req(p + id, {
|
|
headers: {
|
|
"user-agent": "okhttp/4.1.0"
|
|
}
|
|
});
|
|
if ((result = jsonParse(id, JSON.parse(res.content))).url)
|
|
return result.parse = 0,
|
|
JSON.stringify(result)
|
|
} catch (error) {}
|
|
if (0 <= id.indexOf("jqq-")) {
|
|
var jqqHeader = await request(url + "/jqqheader.json", null, null, !0)
|
|
, jqqHeaders = JSON.parse(jqqHeader)
|
|
, ids = id.split("-")
|
|
, jxJqq = await req("https://api.juquanquanapp.com/app/drama/detail?dramaId=" + ids[1] + "&episodeSid=" + ids[2] + "&quality=LD", {
|
|
headers: jqqHeaders
|
|
})
|
|
, jqqInfo = JSON.parse(jxJqq.content);
|
|
if (jqqInfo.data.playInfo.url)
|
|
return JSON.stringify({
|
|
parse: 0,
|
|
playUrl: "",
|
|
url: jqqInfo.data.playInfo.url
|
|
})
|
|
}
|
|
var result, res = await request(url + "/video.php", {
|
|
url: id
|
|
});
|
|
return (result = jsonParse(id, JSON.parse(res).data)).url ? (result.parse = 0,
|
|
JSON.stringify(result)) : JSON.stringify({
|
|
parse: 0,
|
|
playUrl: "",
|
|
url: id
|
|
})
|
|
} catch (e) {
|
|
return console.log(e),
|
|
JSON.stringify({
|
|
parse: 0,
|
|
url: id
|
|
})
|
|
}
|
|
}
|
|
async function search(wd, quick) {
|
|
var videos = [];
|
|
for (const vod of JSON.parse(await request(url + "/api.php/Search/getSearch", {
|
|
key: wd,
|
|
type_id: 0,
|
|
p: 1
|
|
})).data.data)
|
|
videos.push({
|
|
vod_id: vod.vod_id,
|
|
vod_name: vod.vod_name,
|
|
vod_pic: vod.vod_pic,
|
|
vod_remarks: vod.vod_remarks || vod.vod_score || ""
|
|
});
|
|
return JSON.stringify({
|
|
list: videos
|
|
})
|
|
}
|
|
const charStr = "abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789";
|
|
function randStr(len, withNum) {
|
|
for (var _str = "", containsNum = void 0 === withNum || withNum, i = 0; i < len; i++) {
|
|
var 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, !1).toUpperCase() + _.random(11, 99) + randStr(1, !1).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 = url.startsWith("//") ? "https:" + url : url).startsWith("http"))
|
|
return {};
|
|
let headers = json.headers || {};
|
|
var ua = (json["user-agent"] || "").trim()
|
|
, referer = (0 < ua.length && (headers["User-Agent"] = ua),
|
|
(json.referer || "").trim());
|
|
return 0 < referer.length && (headers.Referer = referer),
|
|
_.keys(headers).forEach(hk=>{
|
|
headers[hk] || delete headers[hk]
|
|
}
|
|
),
|
|
{
|
|
header: headers,
|
|
url: url
|
|
}
|
|
} catch (error) {
|
|
console.log(error)
|
|
}
|
|
return {}
|
|
}
|
|
function __jsEvalReturn() {
|
|
return {
|
|
init: init,
|
|
home: home,
|
|
homeVod: homeVod,
|
|
category: category,
|
|
detail: detail,
|
|
play: play,
|
|
search: search
|
|
}
|
|
}
|
|
export {__jsEvalReturn};
|