mirror of
https://github.com/qist/tvbox.git
synced 2025-10-28 02:32:16 +00:00
update FM
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
{
|
||||
"video": {"sites": [
|
||||
{"key":"douban_open","name":"索引 | 豆瓣","type":3,"api":"assets://js/douban_open.js"},
|
||||
{"key":"kanqiu_open","name":"体育 | 看球","type":3,"api":"assets://js/kanqiu_open.js"},
|
||||
{"key":"xinshijue_open","name":"影视 | 新视觉","type":3,"api":"assets://js/xinshijue_open.js"},
|
||||
{"key":"sc1080_open","name":"影视 | 圣城","type":3,"api":"assets://js/sc1080_open.js"},
|
||||
|
||||
{"key":"52ju_open","name":"影视 | 我爱剧","type":3,"api":"assets://js/52ju_open.js"},
|
||||
{"key":"dyxs_open","name":"影视 | 电影先生","type":3,"api":"assets://js/dyxs_openn.js"},
|
||||
{"key":"lz_open","name":"影视 | 量子","type":3,"api":"assets://js/lz_open.js"},
|
||||
|
||||
259
cat/js/kanqiu_open.js
Normal file
259
cat/js/kanqiu_open.js
Normal file
@@ -0,0 +1,259 @@
|
||||
import { Crypto, load, _ } from './lib/cat.js';
|
||||
|
||||
let siteUrl = 'http://www.88kanqiu.one';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
let headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
|
||||
};
|
||||
|
||||
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 get(reqUrl) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: headers
|
||||
});
|
||||
|
||||
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) {
|
||||
let classes = [{
|
||||
type_id: '0',
|
||||
type_name: '全部直播',
|
||||
},{
|
||||
type_id: '1',
|
||||
type_name: '篮球直播',
|
||||
},{
|
||||
type_id: '8',
|
||||
type_name: '足球直播',
|
||||
},{
|
||||
type_id: '29',
|
||||
type_name: '其他直播',
|
||||
}];
|
||||
|
||||
let filterObj = genFilterObj();
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj
|
||||
});
|
||||
}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if(pg <=0) pg = 1;
|
||||
let cateId = tid == '0'?'':tid;
|
||||
if (extend['cateId']) {
|
||||
cateId = extend['cateId'];
|
||||
}
|
||||
let url = siteUrl;
|
||||
if (cateId != '') {
|
||||
url = url + '/match/' + cateId + '/live';
|
||||
}
|
||||
const html = await get(url);
|
||||
const $ = load(html);
|
||||
let videos = [];
|
||||
let cards = $('.list-group-item');
|
||||
for(let i=0;i<cards.length;i++){
|
||||
const n = cards[i];
|
||||
let vid = $($(n).find('.btn.btn-primary')[0]).attr('href');
|
||||
|
||||
vid = vid == undefined? '':siteUrl + vid;
|
||||
let time = $($(n).find('.category-game-time')[0]).text().trim();
|
||||
let gameType = $($(n).find('.game-type')[0]).text().trim();
|
||||
let teamOne = $($(n).find('.team-name')[0]).text().trim();
|
||||
let teamTwo = $($(n).find('.team-name')[1]).text().trim();
|
||||
let liveStatus = $($(n).find('.pay-btn > a')[0]).text().trim();
|
||||
let name = '';
|
||||
if (time != '') {
|
||||
name = time + ' ' + gameType + ' ' + teamOne + ' VS ' + teamTwo + ' ' + liveStatus;
|
||||
} else {
|
||||
name = $(n).text().replaceAll('\n', '').trim();
|
||||
}
|
||||
let pic = $($(n).find('.col-xs-1 > img')[0]).attr('src');
|
||||
if(!pic || pic == '') pic = 'http://www.88kanqiu.one/static/img/default-img.png';
|
||||
if(pic.indexOf('http') < 0) pic = siteUrl + pic;
|
||||
let remark = $($(n).find('.btn.btn-primary')).text();
|
||||
if (extend['livingStatus'] != '1' || (extend['livingStatus'] === '1' && remark.length > 0)) {
|
||||
videos.push({
|
||||
vod_id: vid == ''?name:vid,
|
||||
vod_name: name,
|
||||
vod_pic: pic,
|
||||
vod_remarks: remark
|
||||
});
|
||||
}
|
||||
};
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
page: 1,
|
||||
pagecount: 1,
|
||||
limit: 0,
|
||||
total: videos.length
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
try {
|
||||
if(id.indexOf('http') < 0) {
|
||||
return '{}';
|
||||
}
|
||||
let url = id + '-url';
|
||||
const data = JSON.parse(await get(url)).links;
|
||||
let playUrls = [];
|
||||
data.forEach(item => {
|
||||
let name = item['name'];
|
||||
let playUrl = item['url'];
|
||||
playUrls.push(name + '$' + playUrl);
|
||||
});
|
||||
const video = {
|
||||
vod_id: id,
|
||||
vod_play_from: 'Leospring',
|
||||
vod_play_url: playUrls.join('#')
|
||||
};
|
||||
const list = [video];
|
||||
const result = { list };
|
||||
return JSON.stringify(result);
|
||||
} catch (e) {
|
||||
//console.log('err', e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
return JSON.stringify(await getPlayObj(id));
|
||||
}
|
||||
|
||||
async function getPlayObj(id) {
|
||||
if(id.indexOf('?url=') > 0) {
|
||||
return {parse: 0, url: id.split('?url=')[1]}
|
||||
}
|
||||
if(id.indexOf('replayer') > 0) {
|
||||
let url = 'https://dszbok.com/prod-api/match/detail?mid=' + id.split('id=')[1] + '&pid=7&langtype=vi&zoneld=Asia/Shanghai';
|
||||
let playUrl = JSON.parse(await get(url)).data.matchinfo.live_urls[0].url;
|
||||
return {parse: 0, url: playUrl}
|
||||
}
|
||||
if (id.indexOf('live.jpyex.com/player') > 0) {
|
||||
let url = id.replace('player/play.html', 'api/index/live');
|
||||
let playUrl = Object.values(JSON.parse(await get(url)).detail.play_url)[0].pCode.m3u8;
|
||||
return {parse: 0, url: playUrl}
|
||||
}
|
||||
if(id.indexOf('sportsteam1234') > 0) {
|
||||
let playUrl = await parseSportSteam1234(id);
|
||||
let parse = 0;
|
||||
if (!playUrl.startsWith('http')) {
|
||||
playUrl = id;
|
||||
parse = 1;
|
||||
}
|
||||
return {
|
||||
parse: parse,
|
||||
url: playUrl,
|
||||
header: {
|
||||
'User-Agent': headers['User-Agent'],
|
||||
'Referer': 'http://play.sportsteam1234.com/',
|
||||
'Accept': '*/*'
|
||||
}
|
||||
}
|
||||
}
|
||||
if(id.indexOf('play.926.tv') > 0) {
|
||||
let playUrl = await parse926Tv(id);
|
||||
return {
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
header: {
|
||||
'User-Agent': headers['User-Agent'],
|
||||
'Referer': 'http://play.926.tv/',
|
||||
'Accept': '*/*'
|
||||
}
|
||||
}
|
||||
}
|
||||
return {parse: 1, url: id,};
|
||||
}
|
||||
|
||||
async function parseSportSteam1234(url) {
|
||||
if (url.indexOf('gm.php') > 0 || url.indexOf('kbm.php') > 0) {
|
||||
url = url.replace('gm.php', 'kbm.php');
|
||||
const html = await get(url);
|
||||
const $ = load(html);
|
||||
for(const n of $('script')) {
|
||||
const text = $(n).text();
|
||||
if(text.indexOf('encryptedBase64Str') > 0) {
|
||||
let str = text.split("var encryptedBase64Str = '")[1].split("';")[0];
|
||||
return decodeURIComponent(aesDecode(str));
|
||||
}
|
||||
}
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
async function parse926Tv(url) {
|
||||
const html = await get(url);
|
||||
const $ = load(html);
|
||||
let str = $('div#a1 > span').attr('no-zw-zxx');
|
||||
str = base64Decode(decode926Tv(str));
|
||||
str = 'http:' + decodeURIComponent(decode926Tv(str));
|
||||
return str;
|
||||
}
|
||||
|
||||
function decode926Tv(str){
|
||||
var arr = [];
|
||||
for(var i=0;i<str.length;i=i+2){
|
||||
var v=parseInt(str.substr(i,0x02),0x10);
|
||||
arr.push(String.fromCharCode(v));
|
||||
}
|
||||
return arr.join('');
|
||||
}
|
||||
|
||||
|
||||
function genFilterObj() {
|
||||
return {
|
||||
'0': [{'key': 'livingStatus', 'name': '状态', 'value': [{'n': '全部', 'v': ''},{'n': '直播中', 'v': '1'}]}],
|
||||
'1': [{'key': 'cateId', 'name': '类型', 'value': [{'n': 'NBA', 'v': '1'}, {'n': 'CBA', 'v': '2'}, {'n': '篮球综合', 'v': '4'}, {'n': '纬来体育', 'v': '21'}]}],
|
||||
'8': [{'key': 'cateId', 'name': '类型', 'value': [{'n': '英超', 'v': '8'}, {'n': '西甲', 'v': '9'}, {'n': '意甲', 'v': '10'}, {'n': '欧冠', 'v': '12'}, {'n': '欧联', 'v': '13'}, {'n': '德甲', 'v': '14'}, {'n': '法甲', 'v': '15'}, {'n': '欧国联', 'v': '16'}, {'n': '足总杯', 'v': '27'}, {'n': '国王杯', 'v': '33'}, {'n': '中超', 'v': '7'}, {'n': '亚冠', 'v': '11'}, {'n': '足球综合', 'v': '23'}, {'n': '欧协联', 'v': '28'}, {'n': '美职联', 'v': '26'}]}],
|
||||
'29': [{'key': 'cateId', 'name': '类型', 'value': [{'n': '网球', 'v': '29'}, {'n': '斯洛克', 'v': '30'}, {'n': 'MLB', 'v': '38'}, {'n': 'UFC', 'v': '32'}, {'n': 'NFL', 'v': '25'}, {'n': 'CCTV5', 'v': '18'}]}]
|
||||
}
|
||||
}
|
||||
|
||||
function base64Decode(text) {
|
||||
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||||
}
|
||||
|
||||
//aes解密
|
||||
function aesDecode(str) {
|
||||
const key = Crypto.enc.Utf8.parse("toStringtoString");
|
||||
var bytes = Crypto.AES.decrypt(str, key, {
|
||||
iv: Crypto.enc.Utf8.parse("2202030405060719"),
|
||||
mode: Crypto.mode.CBC,
|
||||
padding: Crypto.pad.Pkcs7
|
||||
});
|
||||
return bytes.toString(Crypto.enc.Utf8);
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
};
|
||||
}
|
||||
208
cat/js/sc1080_open.js
Normal file
208
cat/js/sc1080_open.js
Normal file
@@ -0,0 +1,208 @@
|
||||
import { load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'sc1080';
|
||||
let HOST = 'https://sc1080.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';
|
||||
|
||||
async function request(reqUrl, method, data) {
|
||||
const res = await req(reqUrl, {
|
||||
method: method || 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': HOST,
|
||||
},
|
||||
data: data,
|
||||
postType: method === 'post' ? 'form' : '',
|
||||
});
|
||||
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':5,'type_name':'纪录片'},{'type_id':20,'type_name':'4K片库'},{'type_id':21,'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':'lang','name':'类型','init':'','value':[{'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':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'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':'其他'}]},{'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':'其他'}]},{'key':'lang','name':'类型','init':'','value':[{'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':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'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':'求职'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'内地','v':'内地'},{'n':'港台','v':'港台'},{'n':'日韩','v':'日韩'},{'n':'欧美','v':'欧美'}]},{'key':'lang','name':'类型','init':'','value':[{'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':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'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':'亲子'},{'n':'益智','v':'益智'},{'n':'励志','v':'励志'},{'n':'其他','v':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'国产','v':'国产'},{'n':'日本','v':'日本'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'lang','name':'类型','init':'','value':[{'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':'1999','v':'1999'},{'n':'1998','v':'1998'},{'n':'1997','v':'1997'},{'n':'1995','v':'1995'},{'n':'1994','v':'1994'},{'n':'1993','v':'1993'},{'n':'1992','v':'1992'},{'n':'1991','v':'1991'},{'n':'1990','v':'1990'}]},{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'5':[{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'20':[{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'21':[{'key':'letter','name':'字母','init':'','value':[{'n':'全部','v':''},{'n':'A','v':'A'},{'n':'B','v':'B'},{'n':'C','v':'C'},{'n':'D','v':'D'},{'n':'E','v':'E'},{'n':'F','v':'F'},{'n':'G','v':'G'},{'n':'H','v':'H'},{'n':'I','v':'I'},{'n':'J','v':'J'},{'n':'K','v':'K'},{'n':'L','v':'L'},{'n':'M','v':'M'},{'n':'N','v':'N'},{'n':'O','v':'O'},{'n':'P','v':'P'},{'n':'Q','v':'Q'},{'n':'R','v':'R'},{'n':'S','v':'S'},{'n':'T','v':'T'},{'n':'U','v':'U'},{'n':'V','v':'V'},{'n':'W','v':'W'},{'n':'X','v':'X'},{'n':'Y','v':'Y'},{'n':'Z','v':'Z'},{'n':'0-9','v':'0-9'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const area = getFilterUrlPart(extend, 'area');
|
||||
const clazz = getFilterUrlPart(extend, 'class');
|
||||
const by = getFilterUrlPart(extend, 'by');
|
||||
const lang = getFilterUrlPart(extend, 'lang');
|
||||
const year = getFilterUrlPart(extend, 'year');
|
||||
let page = '';
|
||||
if (pg > 1) {
|
||||
page = '/page/' + pg;
|
||||
}
|
||||
const link = HOST + '/index.php/vod/show' + area + by + clazz + '/id/' + tid + lang + page + year + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('.module .module-item');
|
||||
let videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const it = $item.find('a:first')[0];
|
||||
const img = $item.find('img:first')[0];
|
||||
const remarks = $item.find('.module-item-text').text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/detail\/id\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: img.attribs['data-src'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('div#page > a.page-next').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
const limit = 24;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
function getFilterUrlPart(extend, part) {
|
||||
let result = '';
|
||||
if (extend[part]) {
|
||||
result = '/' + part + '/' + extend[part];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const html = await request(HOST + '/index.php/vod/detail/id/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('.page-title').text(),
|
||||
vod_area: $('a.tag-link:last').text(),
|
||||
vod_year: $('a.tag-link:eq(1)').text(),
|
||||
vod_director: $('.video-info-main .video-info-items:contains(导演:)').text().substring(3).replace(/(^\/|\/$)/g, ''),
|
||||
vod_actor: $('.video-info-main .video-info-items:contains(主演:)').text().substring(3).replace(/(^\/|\/$)/g, ''),
|
||||
vod_pic: $('.video-cover img:first').attr('data-src'),
|
||||
vod_remarks : $('.stui-content__thumb span.pic-text').text(),
|
||||
vod_content: $('.video-info-main .video-info-items:contains(剧情:)').text().substring(3).replace(/收起$/g, ''),
|
||||
};
|
||||
const playMap = {};
|
||||
const tabs = $('.module-player-tab .tab-item');
|
||||
const playlists = $('.module-blocklist');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const from = $(tab).find('span:first').text();
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const title = it.children[0].children[0].data;
|
||||
const playUrl = it.attribs.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);
|
||||
const js = JSON.parse($('script:contains(player_)').html().replace('var player_aaaa=',''));
|
||||
const parseHtml = await request('https://jx.sc1080.top/?url=' + js.url);
|
||||
const htmlData = parseHtml.match(/var config = {([\w\W]*)}([\w\W]*)player/)[1];
|
||||
const json = JSON.parse('{' + htmlData.trim().replace(/,$/, '') + '}');
|
||||
const config = {
|
||||
url: json.url,
|
||||
key: json.key,
|
||||
time: json.time,
|
||||
};
|
||||
const parseResp = await request('https://jx.sc1080.top/api_config.php', 'post', config);
|
||||
const result = JSON.parse(parseResp);
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: result.url,
|
||||
header: {
|
||||
'User-Agent': UA,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
if (pg <= 0) pg = 1;
|
||||
const keyword = encodeURIComponent(wd);
|
||||
let path = 'search';
|
||||
if (pg == 1) {
|
||||
path += '.html?wd=' + keyword;
|
||||
} else {
|
||||
path += '/page/' + pg + '/wd/' + keyword + '.html';
|
||||
}
|
||||
const html = await request(HOST + '/index.php/vod/' + path);
|
||||
const $ = load(html);
|
||||
const items = $('.module .module-search-item');
|
||||
let videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const it = $item.find('.video-info a:first')[0];
|
||||
const img = $item.find('.video-cover img:first')[0];
|
||||
const remarks = $item.find('.video-info-header .video-serial').text().trim();
|
||||
return {
|
||||
vod_id: it.attribs.href.replace(/.*?\/detail\/id\/(.*).html/g, '$1'),
|
||||
vod_name: it.attribs.title,
|
||||
vod_pic: img.attribs['data-src'],
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('div#page > a.page-next').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
const limit = 24;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
||||
195
cat/js/xinshijue_open.js
Normal file
195
cat/js/xinshijue_open.js
Normal file
@@ -0,0 +1,195 @@
|
||||
import { Crypto, load, _ } from 'assets://js/lib/cat.js';
|
||||
|
||||
let key = 'xinshijue';
|
||||
let HOST = 'https://www.hdmyy.com';
|
||||
let siteKey = '';
|
||||
let siteType = 0;
|
||||
|
||||
const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1';
|
||||
|
||||
async function request(reqUrl, timeout = 20000) {
|
||||
let res = await req(reqUrl, {
|
||||
method: 'get',
|
||||
headers: {
|
||||
'User-Agent': UA,
|
||||
'Referer': HOST
|
||||
},
|
||||
timeout: timeout,
|
||||
});
|
||||
return res.content;
|
||||
}
|
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) {
|
||||
siteKey = cfg.skey;
|
||||
siteType = cfg.stype;
|
||||
}
|
||||
|
||||
async function home(filter) {
|
||||
let classes = [{'type_id':1,'type_name':'电影'},{'type_id':2,'type_name':'电视剧'},{'type_id':3,'type_name':'综艺'},{'type_id':4,'type_name':'动漫'},{'type_id':63,'type_name':'纪录片'}];
|
||||
let filterObj = {
|
||||
'1':[{'key':'class','name':'剧情','init':'','value':[{'n':'全部','v':''},{'n':'喜剧','v':'喜剧'},{'n':'爱情','v':'爱情'},{'n':'恐怖','v':'恐怖'},{'n':'动作','v':'动作'},{'n':'科幻','v':'科幻'},{'n':'剧情','v':'剧情'},{'n':'战争','v':'战争'},{'n':'警匪','v':'警匪'},{'n':'犯罪','v':'犯罪'},{'n':'动画','v':'动画'},{'n':'奇幻','v':'奇幻'},{'n':'武侠','v':'武侠'},{'n':'冒险','v':'冒险'},{'n':'枪战','v':'枪战'},{'n':'恐怖','v':'恐怖'},{'n':'悬疑','v':'悬疑'},{'n':'惊悚','v':'惊悚'},{'n':'经典','v':'经典'},{'n':'青春','v':'青春'},{'n':'文艺','v':'文艺'},{'n':'微电影','v':'微电影'},{'n':'古装','v':'古装'},{'n':'历史','v':'历史'},{'n':'运动','v':'运动'},{'n':'农村','v':'农村'},{'n':'儿童','v':'儿童'},{'n':'网络电影','v':'网络电影'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'中国香港','v':'中国香港'},{'n':'中国台湾','v':'中国台湾'},{'n':'美国','v':'美国'},{'n':'法国','v':'法国'},{'n':'英国','v':'英国'},{'n':'日本','v':'日本'},{'n':'韩国','v':'韩国'},{'n':'德国','v':'德国'},{'n':'泰国','v':'泰国'},{'n':'印度','v':'印度'},{'n':'意大利','v':'意大利'},{'n':'西班牙','v':'西班牙'},{'n':'加拿大','v':'加拿大'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'2019','v':'2019'},{'n':'2018','v':'2018'},{'n':'2017','v':'2017'},{'n':'2016','v':'2016'},{'n':'2015','v':'2015'},{'n':'2014','v':'2014'},{'n':'2013','v':'2013'},{'n':'2012','v':'2012'},{'n':'2011','v':'2011'},{'n':'2010','v':'2010'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'2':[{'key':'class','name':'剧情','init':'','value':[{'n':'全部','v':''},{'n':'爱情','v':'爱情'},{'n':'古装','v':'古装'},{'n':'悬疑','v':'悬疑'},{'n':'都市','v':'都市'},{'n':'喜剧','v':'喜剧'},{'n':'战争','v':'战争'},{'n':'剧情','v':'剧情'},{'n':'青春','v':'青春'},{'n':'历史','v':'历史'},{'n':'网剧','v':'网剧'},{'n':'奇幻','v':'奇幻'},{'n':'冒险','v':'冒险'},{'n':'励志','v':'励志'},{'n':'犯罪','v':'犯罪'},{'n':'商战','v':'商战'},{'n':'恐怖','v':'恐怖'},{'n':'穿越','v':'穿越'},{'n':'农村','v':'农村'},{'n':'人物','v':'人物'},{'n':'商业','v':'商业'},{'n':'生活','v':'生活'},{'n':'短剧','v':'短剧'},{'n':'其他','v':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'中国香港','v':'中国香港'},{'n':'中国台湾','v':'中国台湾'},{'n':'韩国','v':'韩国'},{'n':'香港','v':'香港'},{'n':'台湾','v':'台湾'},{'n':'日本','v':'日本'},{'n':'美国','v':'美国'},{'n':'泰国','v':'泰国'},{'n':'英国','v':'英国'},{'n':'新加坡','v':'新加坡'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'2019','v':'2019'},{'n':'2018','v':'2018'},{'n':'2017','v':'2017'},{'n':'2016','v':'2016'},{'n':'2015','v':'2015'},{'n':'2014','v':'2014'},{'n':'2013','v':'2013'},{'n':'2012','v':'2012'},{'n':'2011','v':'2011'},{'n':'2010','v':'2010'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'3':[{'key':'class','name':'剧情','init':'','value':[{'n':'全部','v':''},{'n':'音乐','v':'音乐'},{'n':'情感','v':'情感'},{'n':'生活','v':'生活'},{'n':'职场','v':'职场'},{'n':'真人秀','v':'真人秀'},{'n':'搞笑','v':'搞笑'},{'n':'公益','v':'公益'},{'n':'艺术','v':'艺术'},{'n':'访谈','v':'访谈'},{'n':'益智','v':'益智'},{'n':'体育','v':'体育'},{'n':'少儿','v':'少儿'},{'n':'时尚','v':'时尚'},{'n':'人物','v':'人物'},{'n':'其他','v':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'港台','v':'港台'},{'n':'韩国','v':'韩国'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'2019','v':'2019'},{'n':'2018','v':'2018'},{'n':'2017','v':'2017'},{'n':'2016','v':'2016'},{'n':'2015','v':'2015'},{'n':'2014','v':'2014'},{'n':'2013','v':'2013'},{'n':'2012','v':'2012'},{'n':'2011','v':'2011'},{'n':'2010','v':'2010'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'4':[{'key':'class','name':'剧情','init':'','value':[{'n':'全部','v':''},{'n':'冒险','v':'冒险'},{'n':'战斗','v':'战斗'},{'n':'搞笑','v':'搞笑'},{'n':'经典','v':'经典'},{'n':'科幻','v':'科幻'},{'n':'玄幻','v':'玄幻'},{'n':'魔幻','v':'魔幻'},{'n':'武侠','v':'武侠'},{'n':'恋爱','v':'恋爱'},{'n':'推理','v':'推理'},{'n':'日常','v':'日常'},{'n':'校园','v':'校园'},{'n':'悬疑','v':'悬疑'},{'n':'真人','v':'真人'},{'n':'历史','v':'历史'},{'n':'竞技','v':'竞技'},{'n':'其他','v':'其他'}]},{'key':'area','name':'地区','init':'','value':[{'n':'全部','v':''},{'n':'中国大陆','v':'中国大陆'},{'n':'日本','v':'日本'},{'n':'韩国','v':'韩国'},{'n':'欧美','v':'欧美'},{'n':'其他','v':'其他'}]},{'key':'year','name':'年份','init':'','value':[{'n':'全部','v':''},{'n':'2023','v':'2023'},{'n':'2022','v':'2022'},{'n':'2021','v':'2021'},{'n':'2020','v':'2020'},{'n':'2019','v':'2019'},{'n':'2018','v':'2018'},{'n':'2017','v':'2017'},{'n':'2016','v':'2016'},{'n':'2015','v':'2015'},{'n':'2014','v':'2014'},{'n':'2013','v':'2013'},{'n':'2012','v':'2012'},{'n':'2011','v':'2011'},{'n':'2010','v':'2010'}]},{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
'63':[{'key':'by','name':'排序','value':[{'n':'时间','v':'time'},{'n':'人气','v':'hits'},{'n':'评分','v':'score'}]}],
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
class: classes,
|
||||
filters: filterObj,
|
||||
});
|
||||
}
|
||||
|
||||
async function homeVod() {}
|
||||
|
||||
async function category(tid, pg, filter, extend) {
|
||||
if (pg <= 0) pg = 1;
|
||||
let page = '';
|
||||
if (pg > 1) {
|
||||
page = pg;
|
||||
}
|
||||
const link = HOST + '/vodshow/' + tid + '-' + (extend.area || '') + '-' + (extend.by || '') + '-' + (extend.class || '') + '-' + (extend.lang || '') + '-' + (extend.letter || '') + '---' + page + '---' + (extend.year || '') + '.html';
|
||||
const html = await request(link);
|
||||
const $ = load(html);
|
||||
const items = $('.module-list .module-item');
|
||||
const videos = _.map(items, (item) => {
|
||||
const $item = $(item);
|
||||
const link = $item.find('.module-item-content a:first').attr('href');
|
||||
const title = $item.find('.video-name').text().trim();
|
||||
const img = $item.find('.module-item-pic img:first').attr('data-src');
|
||||
const remarks = $item.find('.module-item-text').text().trim();
|
||||
return {
|
||||
vod_id: link.replace(/.*?\/video\/(.*).html/g, '$1'),
|
||||
vod_name: title,
|
||||
vod_pic: img,
|
||||
vod_remarks: remarks || '',
|
||||
};
|
||||
});
|
||||
const hasMore = $('#page a.page-next:contains(下一页)').length > 0;
|
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
|
||||
const limit = 40;
|
||||
return JSON.stringify({
|
||||
page: parseInt(pg),
|
||||
pagecount: pgCount,
|
||||
limit: limit,
|
||||
total: limit * pgCount,
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
async function detail(id) {
|
||||
const html = await request(HOST + '/video/' + id + '.html');
|
||||
const $ = load(html);
|
||||
const vod = {
|
||||
vod_id: id,
|
||||
vod_name: $('h1.page-title').text().trim(),
|
||||
vod_type: $('.video-info-aux a.tag-link:first').text().trim(),
|
||||
vod_area: $('.video-info-aux a.tag-link:eq(2)').text().trim(),
|
||||
vod_year: $('.video-info-aux a.tag-link:eq(1)').text().trim(),
|
||||
vod_director: $('.video-info-main .video-info-items:contains(导演:)').text().substring(3).trim().replace(/(^\/|\/$)/g, '').trim(),
|
||||
vod_actor: $('.video-info-main .video-info-items:contains(主演:)').text().substring(3).trim().replace(/(^\/|\/$)/g, '').trim(),
|
||||
vod_pic: $('.video-cover img:first').attr('data-src'),
|
||||
vod_remarks : $('.video-info-main .video-info-items:contains(备注:)').text().substring(3) || '',
|
||||
vod_content: $('.video-info-main .video-info-items:contains(剧情:)').text().substring(3).trim().replace(/收起$/g, ''),
|
||||
};
|
||||
const playMap = {};
|
||||
const tabs = $('.module-player-tab .module-tab-item');
|
||||
const playlists = $('.module-player-list > .module-blocklist');
|
||||
_.each(tabs, (tab, i) => {
|
||||
const $tab = $(tab);
|
||||
const from = $tab.find('span:first').text().trim();
|
||||
if (from.includes('夸克')) return;
|
||||
let list = playlists[i];
|
||||
list = $(list).find('a');
|
||||
_.each(list, (it) => {
|
||||
const $it = $(it);
|
||||
const title = $it.find('span:first').text().trim();
|
||||
const playUrl = $it.attr('href');
|
||||
if (!playMap.hasOwnProperty(from)) {
|
||||
playMap[from] = [];
|
||||
}
|
||||
playMap[from].push(title + '$' + playUrl);
|
||||
});
|
||||
});
|
||||
vod.vod_play_from = _.keys(playMap).join('$$$');
|
||||
const urls = _.values(playMap);
|
||||
const vod_play_url = _.map(urls, (urlist) => {
|
||||
return urlist.join('#');
|
||||
});
|
||||
vod.vod_play_url = vod_play_url.join('$$$');
|
||||
return JSON.stringify({
|
||||
list: [vod],
|
||||
});
|
||||
}
|
||||
|
||||
async function play(flag, id, flags) {
|
||||
const link = HOST + id;
|
||||
const html = await request(link);
|
||||
let $ = load(html);
|
||||
let json = $('script:contains(player_aaaa)').text().replace('var player_aaaa=','');
|
||||
let js = JSON.parse(json);
|
||||
let playUrl = js.url;
|
||||
if (js.encrypt == 1) {
|
||||
playUrl = unescape(playUrl);
|
||||
} else if (js.encrypt == 2) {
|
||||
playUrl = unescape(base64Decode(playUrl));
|
||||
}
|
||||
let playHtml = await request('https://jx3.xn--1lq90i13mxk5bolhm8k.xn--fiqs8s/player/ec.php?code=ak&if=1&url=' + playUrl);
|
||||
json = playHtml.match(/let ConFig = {([\w\W]*)},box/)[1];
|
||||
const jsConfig = JSON.parse('{' + json.trim() + '}');
|
||||
playUrl = decryptUrl(jsConfig);
|
||||
return JSON.stringify({
|
||||
parse: 0,
|
||||
url: playUrl,
|
||||
header: {
|
||||
'User-Agent': UA,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function decryptUrl(jsConfig) {
|
||||
const key = Crypto.enc.Utf8.parse('2890' + jsConfig.config.uid + 'tB959C');
|
||||
const iv = Crypto.enc.Utf8.parse('2F131BE91247866E');
|
||||
const mode = Crypto.mode.CBC;
|
||||
const padding = Crypto.pad.Pkcs7;
|
||||
const decrypted = Crypto.AES.decrypt(jsConfig.url, key, {
|
||||
'iv': iv,
|
||||
'mode': mode,
|
||||
'padding': padding
|
||||
});
|
||||
const decryptedUrl = Crypto.enc.Utf8.stringify(decrypted);
|
||||
return decryptedUrl;
|
||||
}
|
||||
|
||||
function base64Decode(text) {
|
||||
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
|
||||
}
|
||||
|
||||
async function search(wd, quick, pg) {
|
||||
let data = JSON.parse(await request(HOST + '/index.php/ajax/suggest?mid=1&limit=50&wd=' + wd)).list;
|
||||
let videos = [];
|
||||
for (const vod of data) {
|
||||
videos.push({
|
||||
vod_id: vod.id,
|
||||
vod_name: vod.name,
|
||||
vod_pic: vod.pic,
|
||||
vod_remarks: '',
|
||||
});
|
||||
}
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
});
|
||||
}
|
||||
|
||||
export function __jsEvalReturn() {
|
||||
return {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search,
|
||||
};
|
||||
}
|
||||
@@ -88,6 +88,7 @@ async function category(tid, pg, filter, extend) {
|
||||
let videos = await getVideos(url);
|
||||
return JSON.stringify({
|
||||
list: videos,
|
||||
page: pg
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user