mirror of https://github.com/gaotianliuyun/gao
parent
3b2aae040c
commit
6f45087c4f
@ -0,0 +1,190 @@ |
||||
import { load, _ } from './lib/cat.js'; |
||||
|
||||
let key = '童趣'; |
||||
let HOST = 'https://www.boosj.com'; |
||||
let siteKey = ''; |
||||
let siteType = 0; |
||||
|
||||
const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; |
||||
|
||||
async function request(reqUrl, agentSp) { |
||||
let res = await req(reqUrl, { |
||||
method: 'get', |
||||
headers: { |
||||
'User-Agent': agentSp || MOBILE_UA, |
||||
'Referer': HOST |
||||
}, |
||||
}); |
||||
return res.content; |
||||
} |
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype; |
||||
} |
||||
|
||||
async function home(filter) { |
||||
const classes = [{ type_id: '', type_name: '全部' }, { type_id: 28, type_name: '辅食' }, { type_id: 582, type_name: '动画' }, { type_id: 3364, type_name: '儿童舞蹈' }, { type_id: 3366, type_name: '少儿英语' }, { type_id: 3367, type_name: '儿童歌曲' }, { type_id: 3622, type_name: '才艺' }, { type_id: 3782, type_name: '播视自制' }, { type_id: 3822, type_name: '故事' }, { type_id: 3842, type_name: '亲子教育' }, { type_id: 4402, type_name: '美术' }, { type_id: 4583, type_name: '其他' }, { type_id: 4762, type_name: '儿童游戏' }, { type_id: 4842, type_name: '识物' }, { type_id: 4843, type_name: '绘本' }, { type_id: 4844, type_name: '古诗' }, { type_id: 4845, type_name: '科普' }, { type_id: 5102, type_name: '儿童玩具' }, { type_id: 5142, type_name: '播视童趣儿童玩具' }]; |
||||
const filterObj = {}; |
||||
const jsonData = [ |
||||
{ |
||||
key: 'age', |
||||
name: '年龄段', |
||||
value: [ |
||||
{ n: '全部', v: '' }, |
||||
{ n: '6岁以上', v: '?p367=370' }, |
||||
{ n: '3~6岁', v: '?p367=369' }, |
||||
{ n: '0~3岁', v: '?p367=368' }, |
||||
], |
||||
init: '', |
||||
}, |
||||
{ |
||||
key: 'by', |
||||
name: '排序', |
||||
value: [ |
||||
{ n: '全部', v: '' }, |
||||
{ n: '最新发布', v: 'lately' }, |
||||
{ n: '最多播放', v: 'pop' }, |
||||
{ n: '最多评论', v: 'view' }, |
||||
], |
||||
init: '', |
||||
}, |
||||
]; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
cls.land = 1; |
||||
cls.ratio = 1.78; |
||||
filterObj[cls.type_id] = jsonData; |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}); |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const link = HOST + '/search_res_3362__3364_1_.html'; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const items = $('body div.bj-col4:has(h3)'); |
||||
let videos = _.map(items, (it) => { |
||||
const a = $(it).find('a:first')[0]; |
||||
const img = $(it).find('img:first')[0]; |
||||
const remarks = $(it).find('span.played')[0]; |
||||
return { |
||||
vod_id: a.attribs.href, |
||||
vod_name: a.attribs.title, |
||||
vod_pic: img.attribs['data-original'], |
||||
vod_remarks: remarks.children[0].data || '', |
||||
}; |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof (pg) == 'undefined') pg = 1; |
||||
const link = HOST + '/search_res_3362__' + tid + '_' + pg + '_' + (extend.by || '') + '.html' + (extend.age || ''); |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const items = $('body div.bj-col4:has(h3)'); |
||||
let videos = _.map(items, (it) => { |
||||
const a = $(it).find('a:first')[0]; |
||||
const img = $(it).find('img:first')[0]; |
||||
const remarks = $(it).find('span.played')[0]; |
||||
return { |
||||
vod_id: a.attribs.href, |
||||
vod_name: a.attribs.title, |
||||
vod_pic: img.attribs['data-original'], |
||||
vod_remarks: remarks.children[0].data || '', |
||||
}; |
||||
}); |
||||
const hasMore = $('div.pub_paging > a:contains(下一页)').length > 0; |
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: pgCount, |
||||
limit: 30, |
||||
total: 30 * pgCount, |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
async function detail(id) { |
||||
const vod = { |
||||
vod_id: id, |
||||
vod_remarks: "", |
||||
}; |
||||
const playlist = ["点击播放" + "$" + vod.vod_id]; |
||||
vod.vod_play_from = "道长在线"; |
||||
vod.vod_play_url = playlist.join("#"); |
||||
return JSON.stringify({ |
||||
list: [vod], |
||||
}); |
||||
} |
||||
|
||||
async function play(flag, id, flags) { |
||||
const body = JSON.parse(await request('https://gslb.boosj.com/ipv2.json')); |
||||
body._id = id.match(/\d+/)[0]; |
||||
const json = JSON.parse(await request(buildUrl(body.gslb, body))); |
||||
const purl = json.url + '?' + json.t |
||||
// console.debug('童趣purl =====>' + purl); // js_debug.log
|
||||
let headers = { |
||||
'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; 22081212C Build/PQ3B.190801.002)', |
||||
}; |
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: purl, |
||||
header: headers, |
||||
}); |
||||
} |
||||
|
||||
async function search(wd, quick) { |
||||
var data = JSON.parse(await request('https://search.boosj.com/m_ajax?q=' + wd + '&p=' + pg + '&typeId=3362')).body; |
||||
let videos = _.map(data.result, (it) => { |
||||
return { |
||||
vod_id: it.playUrl, |
||||
vod_name: it.resourceName, |
||||
vod_pic: it.imageUrl, |
||||
vod_remarks: it.clickNumStr || '', |
||||
} |
||||
}); |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: data.pageCount, |
||||
limit: 30, |
||||
total: data.rowCount, |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
function buildUrl(url, obj) { |
||||
obj = obj || {}; |
||||
if (url.indexOf('?') < 0) { |
||||
url += '?' |
||||
} |
||||
let param_list = []; |
||||
let keys = Object.keys(obj); |
||||
keys.forEach(it => { |
||||
param_list.push(it + '=' + obj[it]) |
||||
}); |
||||
let prs = param_list.join('&'); |
||||
if (keys.length > 0 && !url.endsWith('?')) { |
||||
url += '&' |
||||
} |
||||
url += prs; |
||||
return url |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
search: search, |
||||
}; |
||||
} |
||||
@ -0,0 +1,109 @@ |
||||
// 无搜索功能
|
||||
import { _ } from './lib/cat.js'; |
||||
let key = '视聚场'; |
||||
let HOST = 'http://api.cntv.cn'; |
||||
let siteKey = ''; |
||||
let siteType = 0; |
||||
const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; |
||||
|
||||
async function request(reqUrl, agentSp) { |
||||
let res = await req(reqUrl, { |
||||
method: 'get', |
||||
headers: { |
||||
'User-Agent': agentSp || MOBILE_UA, |
||||
}, |
||||
}); |
||||
return res.content |
||||
} |
||||
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype |
||||
} |
||||
|
||||
async function home(filter) { |
||||
const classes = [{ type_id: "TOPC1451528971114112", type_name: "新闻联播" }, { type_id: "TOPC1451558976694518", type_name: "焦点访谈" }, { type_id: "TOPC1451464665008914", type_name: "今日说法" }, { type_id: "TOPC1451378757637200", type_name: "等着我" }, { type_id: "TOPC1451559129520755", type_name: "新闻直播间" }, { type_id: "TOPC1451540328102649", type_name: "海峡两岸" }, { type_id: "TOPC1451530382483536", type_name: "天网" }, { type_id: "TOPC1451540389082713", type_name: "今日关注" }, { type_id: "TOPC1451557893544236", type_name: "探索·发现" }, { type_id: "TOPC1665739007799851", type_name: "高端访谈" }, { type_id: "TOPC1451557052519584", type_name: "百家讲坛" }, { type_id: "TOPC1451464884159276", type_name: "开讲啦" }, { type_id: "TOPC1451464884159276", type_name: "故事里的中国" }, { type_id: "TOPC1514182710380601", type_name: "对话" }, { type_id: "TOPC1451559038345600", type_name: "面对面" }, { type_id: "TOPC1451378967257534", type_name: "动物世界" }, { type_id: "TOPC1451558190239536", type_name: "走进科学" }, { type_id: "TOPC1451525103989666", type_name: "人与自然" }, { type_id: "TOPC1451557421544786", type_name: "地理·中国" }, { type_id: "TOPC1451541349400938", type_name: "远方的家" }, { type_id: "TOPC1451558150787467", type_name: "自然传奇" }, { type_id: "TOPC1451534366388377", type_name: "是真的吗" }, { type_id: "TOPC1451467630488780", type_name: "星光大道" }, { type_id: "TOPC1451557646802924", type_name: "健康之路" }, { type_id: "TOPC1451559025546574", type_name: "动画大放映" }, { type_id: "TOPC1451378857272262", type_name: "第一动画乐园" }, { type_id: "TOPC1451541414450906", type_name: "精彩音乐汇" }, { type_id: "TOPC1451534421925242", type_name: "音乐厅" }, { type_id: "TOPC1451541994820527", type_name: "民歌·中国" }, { type_id: "TOPC1575253587571324", type_name: "跟着书本去旅行" }, { type_id: "TOPC1451354597100320", type_name: "中国电影报道" }, { type_id: "TOPC1451469943519994", type_name: "星推荐" }, { type_id: "TOPC1571217727564820", type_name: "方圆剧阵" }, { type_id: "TOPC1451558856402351", type_name: "空中剧院" }, { type_id: "TOPC1650782829200997", type_name: "正大综艺" }, { type_id: "TOPC1451550970356385", type_name: "体坛快讯" }, { type_id: "TOPC1451530259915198", type_name: "第一时间" }, { type_id: "TOPC1451465894294259", type_name: "开门大吉" }, { type_id: "TOPC1451464884159276", type_name: "开讲啦" }, { type_id: "TOPC1451558858788377", type_name: "共同关注" }, { type_id: "TOPC1451527941788652", type_name: "军事报道" }, { type_id: "TOPC1451558819463311", type_name: "新闻调查" }, { type_id: "TOPC1451559097947700", type_name: "新闻30分" }, { type_id: "TOPC1451559066181661", type_name: "新闻1+1" }, { type_id: "TOPC1451540448405749", type_name: "今日亚洲" }, { type_id: "TOPC1451559129520755", type_name: "新闻直播间" }, { type_id: "TOPC1451558428005729", type_name: "24小时" }, { type_id: "TOPC1451539894330405", type_name: "中国新闻" }, { type_id: "TOPC1451558779639282", type_name: "午夜新闻" }, { type_id: "TOPC1451558496100826", type_name: "朝闻天下" }, { type_id: "TOPC1451528792881669", type_name: "晚间新闻" }, { type_id: "TOPC1451559180488841", type_name: "新闻周刊" }, { type_id: "TOPC1601362002656197", type_name: "经济半小时" }, { type_id: "TOPC1451533652476962", type_name: "经济大讲堂" }, { type_id: "TOPC1453100395512779", type_name: "正点财经" }, { type_id: "TOPC1451546588784893", type_name: "生活圈" }, { type_id: "TOPC1451526037568184", type_name: "生活提示" }, { type_id: "TOPC1451558532019883", type_name: "东方时空" }, { type_id: "TOPC1451533782742171", type_name: "经济信息联播" }, { type_id: "TOPC1571034705435323", type_name: "今日环球" }, { type_id: "TOPC1451543462858283", type_name: "一线" }]; |
||||
const filterObj = {}; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
cls.land = 1; |
||||
cls.ratio = 1.78; |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}) |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const data = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=TOPC1451558856402351&n=10&sort=desc&p=1&mode=0&serviceId=tvcctv')); |
||||
let videos = _.map(data.data.list, (it) => { |
||||
return { |
||||
vod_id: it.guid, |
||||
vod_name: it.title, |
||||
vod_pic: it.image, |
||||
vod_remarks: it.time || '', |
||||
} |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}) |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof pg == 'undefined') pg = 1; |
||||
const data = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=' + tid + '&n=10&sort=desc&p=' + pg + '&mode=0&serviceId=tvcctv')); |
||||
let videos = _.map(data.data.list, (it) => { |
||||
return { |
||||
vod_id: it.guid, |
||||
vod_name: it.title, |
||||
vod_pic: it.image, |
||||
vod_remarks: it.time || '', |
||||
} |
||||
}); |
||||
const pgChk = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=' + tid + '&n=10&sort=desc&p=' + (parseInt(pg) + 1) + '&mode=0&serviceId=tvcctv')).data.list; |
||||
const pgCount = pgChk.length > 0 ? parseInt(pg) + 1 : parseInt(pg); |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: parseInt(pgCount), |
||||
limit: 10, |
||||
total: parseInt(data.total), |
||||
list: videos, |
||||
}) |
||||
} |
||||
|
||||
async function detail(id) { |
||||
const vod = { |
||||
vod_id: id, |
||||
vod_remarks: '', |
||||
}; |
||||
const playlist = ['点击播放' + '$' + 'https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/' + id + '/2000.m3u8']; |
||||
vod.vod_play_from = key; |
||||
vod.vod_play_url = playlist.join('#'); |
||||
return JSON.stringify({ |
||||
list: [vod], |
||||
}); |
||||
} |
||||
|
||||
async function play(flag, id, flags) { |
||||
// console.debug('视聚场 id =====>' + id); // js_debug.log
|
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: id, |
||||
}) |
||||
} |
||||
|
||||
async function search(wd, quick, pg) { |
||||
return '{}' |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
search: search, |
||||
} |
||||
} |
||||
@ -0,0 +1,156 @@ |
||||
import { load, _ } from "assets://js/lib/cat.js"; |
||||
|
||||
let key = "世纪DJ音乐网"; |
||||
let HOST = "http://m.dj0898.com"; |
||||
let siteKey = ""; |
||||
let siteType = 0; |
||||
|
||||
const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36"; |
||||
|
||||
async function request(reqUrl, agentSp) { |
||||
let res = await req(reqUrl, { |
||||
method: "get", |
||||
headers: { |
||||
"User-Agent": agentSp || MOBILE_UA, |
||||
Referer: HOST, |
||||
}, |
||||
}); |
||||
return res.content; |
||||
} |
||||
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype; |
||||
} |
||||
|
||||
async function home(filter) { |
||||
const 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: 6, type_name: "🎧国外电音" }, { type_id: 8, type_name: "🎧慢歌连版" }, { type_id: 9, type_name: "🎧酒吧潮歌" }, { type_id: 10, type_name: "🎧中文串烧" }, { type_id: 11, type_name: "🎧外文串烧" }, { type_id: 12, type_name: "🎧中外串烧" }, { type_id: 13, type_name: "🎧车载串烧" }, { type_id: 14, type_name: "🎧越鼓串烧" }, { type_id: 40, type_name: "🎧3D/环绕" }, { type_id: 45, type_name: "🎧口水旋律" }, { type_id: 46, type_name: "🎧精品收藏" }, { type_id: 47, type_name: "🎧开场舞曲" }, { type_id: 48, type_name: "🎧印度舞曲" }, { type_id: 49, type_name: "🎧编排套曲" }, { type_id: 20, type_name: "🎧DuTch" }, { type_id: 21, type_name: "🎧Mash up" }, { type_id: 22, type_name: "🎧ClubHouse" }, { type_id: 23, type_name: "🎧ElectroHouse" }, { type_id: 24, type_name: "🎧越南鼓Dj" }, { type_id: 30, type_name: "🎧Funky" }, { type_id: 31, type_name: "🎧Reggae" }, { type_id: 32, type_name: "🎧Rnb" }, { type_id: 33, type_name: "🎧Hip Hop" }, { type_id: 34, type_name: "🎧Dubstep" }, { type_id: 8017, type_name: "🎧Hardstyle" }, { type_id: 8018, type_name: "🎧Hands Up" }]; |
||||
const filterObj = {}; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
cls.land = 1; |
||||
cls.ratio = 1.78; |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}); |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const link = HOST + "/dance/lists/id/10/1"; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const list = $("ul.djddv_djList > li"); |
||||
let videos = _.map(list, (it) => { |
||||
const a = $(it).find("a")[1]; |
||||
const img = $(it).find("img:first")[0]; |
||||
const tt = $(it).find("strong:first")[0]; |
||||
const remarks = $(it).find("font")[5]; |
||||
return { |
||||
vod_id: a.attribs.href, |
||||
vod_name: tt.children[0].data, |
||||
vod_pic: img.attribs["src"], |
||||
vod_remarks: "🎵" + remarks.children[0].data || "", |
||||
}; |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof pg == "undefined") pg = 1; |
||||
const link = HOST + "/dance/lists/id/" + tid + "/" + pg; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const list = $("ul.djddv_djList > li"); |
||||
let videos = _.map(list, (it) => { |
||||
const a = $(it).find("a")[1]; |
||||
const img = $(it).find("img:first")[0]; |
||||
const tt = $(it).find("strong:first")[0]; |
||||
const remarks = $(it).find("font")[5]; |
||||
return { |
||||
vod_id: a.attribs.href, |
||||
vod_name: tt.children[0].data, |
||||
vod_pic: img.attribs["src"], |
||||
vod_remarks: "🎵" + remarks.children[0].data || "", |
||||
}; |
||||
}); |
||||
const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0; |
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: pgCount, |
||||
limit: 60, |
||||
total: 60 * pgCount, |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
async function detail(id) { |
||||
const vod = { |
||||
vod_id: id, |
||||
vod_remarks: "", |
||||
}; |
||||
const playlist = ["点击播放" + "$" + vod.vod_id]; |
||||
vod.vod_play_from = "道长在线"; |
||||
vod.vod_play_url = playlist.join("#"); |
||||
return JSON.stringify({ |
||||
list: [vod], |
||||
}); |
||||
} |
||||
|
||||
async function play(flag, id, flags) { |
||||
const html = await request(id); |
||||
const $ = load(html); |
||||
const audio = $("body audio[src*=http]"); |
||||
const audioUrl = audio[0].attribs.src; |
||||
// console.debug('世纪DJ音乐网 audioUrl =====>' + audioUrl); // js_debug.log
|
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: audioUrl, |
||||
}); |
||||
} |
||||
|
||||
async function search(wd, quick, pg) { |
||||
if (pg <= 0 || typeof pg == "undefined") pg = 1; |
||||
const link = HOST + "/index.php/dance/so/key?key=" + wd + "&cid=0&p=" + pg; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const list = $("ul.djddv_djList > li"); |
||||
let videos = _.map(list, (it) => { |
||||
const a = $(it).find("a")[1]; |
||||
const img = $(it).find("img:first")[0]; |
||||
const tt = $(it).find("strong:first")[0]; |
||||
const remarks = $(it).find("font:first")[0]; |
||||
return { |
||||
vod_id: a.attribs.href, |
||||
vod_name: tt.children[0].data, |
||||
vod_pic: img.attribs["src"], |
||||
vod_remarks: "🎵" + remarks.children[0].data || "", |
||||
}; |
||||
}); |
||||
const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0; |
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: pgCount, |
||||
limit: 60, |
||||
total: 60 * pgCount, |
||||
list: videos, |
||||
land: 1, |
||||
ratio: 1.78, |
||||
}); |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
search: search, |
||||
}; |
||||
} |
||||
@ -0,0 +1,173 @@ |
||||
// 修正:分类改静态 (网站频繁变动分类)
|
||||
import { load, _ } from "assets://js/lib/cat.js"; |
||||
|
||||
let key = "酷奇MV"; |
||||
let HOST = "https://www.kuqimv.com"; |
||||
let siteKey = ""; |
||||
let siteType = 0; |
||||
const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"; |
||||
|
||||
async function request(reqUrl, referer, mth, data, hd) { |
||||
const headers = { |
||||
"User-Agent": PC_UA, |
||||
}; |
||||
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; |
||||
} |
||||
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype; |
||||
} |
||||
|
||||
async function home(filter) { |
||||
var classes = [{ "type_id": "1", "type_name": "华语高清" }, { "type_id": "2", "type_name": "日韩精选" }, { "type_id": "3", "type_name": "欧美MV" }, { "type_id": "4", "type_name": "高清现场" }, { "type_id": "5", "type_name": "影视MV" }, { "type_id": "6", "type_name": "夜店视频" }, { "type_id": "7", "type_name": "车模视频" }, { "type_id": "8", "type_name": "热舞视频" }, { "type_id": "9", "type_name": "美女写真" }, { "type_id": "10", "type_name": "美女打碟" }]; |
||||
// const html = await request(HOST);
|
||||
// const $ = load(html);
|
||||
// const class_parse = $(".lei_fl > a[href*=play]");
|
||||
// const classes = [];
|
||||
// classes = _.map(class_parse, (cls) => {
|
||||
// const typeId = cls.attribs["href"];
|
||||
// typeId = typeId.substring(typeId.lastIndexOf("/") + 1).replace(".html", "");
|
||||
// return {
|
||||
// type_id: typeId,
|
||||
// type_name: cls.children[0].data,
|
||||
// };
|
||||
// });
|
||||
const filterObj = {}; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
cls.land = 1; |
||||
cls.ratio = 1.78; |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}); |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const link = HOST + "/play/9_1.html"; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const items = $("div.mv_list > li"); |
||||
let videos = _.map(items, (it) => { |
||||
const a = $(it).find("a:first")[0]; |
||||
const img = $(it).find("img:first")[0]; |
||||
const singer = $($(it).find("div.singer")[0]).text().trim(); |
||||
const remarks = $($(it).find("span.lei_03")[0]).text().trim(); |
||||
return { |
||||
vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), |
||||
vod_name: a.attribs.title, |
||||
vod_pic: img.attribs["src"], |
||||
vod_remarks: "🎤" + singer + "|" + remarks || "", |
||||
}; |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof pg == "undefined") pg = 1; |
||||
const link = HOST + "/play/" + tid + "_" + pg + ".html"; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const items = $("div.mv_list > li"); |
||||
let videos = _.map(items, (it) => { |
||||
const a = $(it).find("a:first")[0]; |
||||
const img = $(it).find("img:first")[0]; |
||||
const singer = $($(it).find("div.singer")[0]).text().trim(); |
||||
const remarks = $($(it).find("span.lei_03")[0]).text().trim(); |
||||
return { |
||||
vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), |
||||
vod_name: a.attribs.title, |
||||
vod_pic: img.attribs["src"], |
||||
vod_remarks: "🎤" + singer + "|" + remarks || "", |
||||
}; |
||||
}); |
||||
const hasMore = $("div.lei_page > 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 vod = { |
||||
vod_id: id, |
||||
vod_remarks: "", |
||||
}; |
||||
const playlist = ["观看视频" + "$" + id]; |
||||
vod.vod_play_from = "道长在线"; |
||||
vod.vod_play_url = playlist.join("#"); |
||||
return JSON.stringify({ |
||||
list: [vod], |
||||
}); |
||||
} |
||||
|
||||
async function play(flag, id, flags) { |
||||
const link = HOST + "/skin/kuqimv/play.php"; |
||||
const ref = HOST + "/play/" + id + ".html"; |
||||
const pdata = { id: id }; |
||||
const playUrl = JSON.parse(await request(link, ref, "post", pdata)).url; |
||||
const headers = { |
||||
Referer: HOST, |
||||
}; |
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: playUrl, |
||||
header: headers, |
||||
}); |
||||
} |
||||
|
||||
async function search(wd, quick, pg) { |
||||
if (pg <= 0 || typeof pg == "undefined") pg = 1; |
||||
const link = HOST + "/search.php?key=" + wd + "&pages=" + pg; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const items = $("div.video_list > li"); |
||||
let videos = _.map(items, (it) => { |
||||
const a = $(it).find("a:first")[0]; |
||||
const singer = $($(it).find("div.singer")[0]).text().trim(); |
||||
const remarks = $($(it).find("span.lei_04")[0]).text().trim(); |
||||
return { |
||||
vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), |
||||
vod_name: a.attribs.title, |
||||
vod_pic: "https://www.kuqimv.com/static/images/cover/singer.jpg", |
||||
vod_remarks: "🎤" + singer + "|" + remarks || "", |
||||
}; |
||||
}); |
||||
const hasMore = $("div.lei_page > a:contains(>)").length > 0; |
||||
const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: pgCount, |
||||
limit: 20, |
||||
total: 20 * pgCount, |
||||
list: videos, |
||||
land: 1, |
||||
ratio: 1.78, |
||||
}); |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
search: search, |
||||
}; |
||||
} |
||||
@ -0,0 +1,135 @@ |
||||
import { load, _ } from './lib/cat.js'; |
||||
let key = '🐰兔小贝'; |
||||
let HOST = 'https://www.tuxiaobei.com'; |
||||
let siteKey = ''; |
||||
let siteType = 0; |
||||
const IOS_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; |
||||
|
||||
async function request(reqUrl, agentSp) { |
||||
let res = await req(reqUrl, { |
||||
method: 'get', |
||||
headers: { |
||||
'User-Agent': agentSp || IOS_UA, |
||||
}, |
||||
}); |
||||
return res.content |
||||
} |
||||
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype |
||||
} |
||||
|
||||
async function home(filter) { |
||||
const classes = [{ type_id: '', type_name: '🐰全部' }, { type_id: 2, type_name: '🐰儿歌' }, { type_id: 3, type_name: '🐰故事' }, { type_id: 27, type_name: '🐰公益' }, { type_id: 9, type_name: '🐰十万个为什么' }, { type_id: 28, type_name: '🐰安全教育' }, { type_id: 29, type_name: '🐰动物奇缘' }, { type_id: 7, type_name: '🐰弟子规' }, { type_id: 5, type_name: '🐰古诗' }, { type_id: 6, type_name: '🐰三字经' }, { type_id: 8, type_name: '🐰千字文' }, { type_id: 11, type_name: '🐰数学' }, { type_id: 25, type_name: '🐰英语' }, { type_id: 24, type_name: '🐰折纸' }]; |
||||
const filterObj = {}; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
cls.land = 1; |
||||
cls.ratio = 1.78; |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}) |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const link = await request(HOST + '/list/mip-data?typeId=9&page=1&callback='); |
||||
const html = link.match(/\((.*?)\);/)[1]; |
||||
const data = JSON.parse(html).data; |
||||
let videos = _.map(data.items, (it) => { |
||||
return { |
||||
vod_id: it.video_id, |
||||
vod_name: it.name, |
||||
vod_pic: it.image, |
||||
vod_remarks: it.root_category_name + ' | ' + it.duration_string || '', |
||||
} |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}) |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof pg == 'undefined') pg = 1; |
||||
const link = await request(HOST + '/list/mip-data?typeId=' + tid + '&page=' + pg + '&callback='); |
||||
const html = link.match(/\((.*?)\);/)[1]; |
||||
const data = JSON.parse(html).data; |
||||
let videos = _.map(data.items, (it) => { |
||||
return { |
||||
vod_id: it.video_id, |
||||
vod_name: it.name, |
||||
vod_pic: it.image, |
||||
vod_remarks: it.root_category_name + ' | ' + it.duration_string || '', |
||||
} |
||||
}); |
||||
const pgCount = pg * 30 > data.totalCount ? parseInt(pg) : parseInt(pg) + 1; |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: pgCount, |
||||
limit: 30, |
||||
total: data.totalCount, |
||||
list: videos, |
||||
}) |
||||
} |
||||
|
||||
async function detail(id) { |
||||
const vod = { |
||||
vod_id: id, |
||||
vod_remarks: '', |
||||
}; |
||||
const playlist = ['点击播放' + '$' + HOST + '/play/' + id]; |
||||
vod.vod_play_from = "道长在线"; |
||||
vod.vod_play_url = playlist.join('#'); |
||||
return JSON.stringify({ |
||||
list: [vod], |
||||
}); |
||||
} |
||||
|
||||
async function play(flag, id, flags) { |
||||
const html = await request(id); |
||||
const $ = load(html); |
||||
const pvideo = $("body mip-search-video[video-src*=http]"); |
||||
const purl = pvideo[0].attribs['video-src']; |
||||
// console.debug('兔小贝 purl =====>' + purl); // js_debug.log
|
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: purl, |
||||
}); |
||||
} |
||||
|
||||
async function search(wd, quick) { |
||||
const link = HOST + "/search/" + wd; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const list = $("div.list-con > div.items"); |
||||
let videos = _.map(list, (it) => { |
||||
const a = $(it).find("a:first")[0]; |
||||
const img = $(it).find("mip-img:first")[0]; |
||||
const tt = $(it).find("p:first")[0]; |
||||
const remarks = $(it).find("p")[1]; |
||||
return { |
||||
vod_id: a.attribs.href.replace(/.*?\/play\/(.*)/g, '$1'), |
||||
vod_name: tt.children[0].data, |
||||
vod_pic: img.attribs["src"], |
||||
vod_remarks: remarks.children[0].data || "", |
||||
}; |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
land: 1, |
||||
ratio: 1.78, |
||||
}); |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
search: search, |
||||
} |
||||
} |
||||
@ -0,0 +1,118 @@ |
||||
// 无搜索功能
|
||||
import { _ } from './lib/cat.js'; |
||||
let key = '🐯贝乐虎'; |
||||
let HOST = 'https://vd.ubestkid.com'; |
||||
let siteKey = ''; |
||||
let siteType = 0; |
||||
const MOBILE_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, referer, mth, data, hd) { |
||||
const headers = { |
||||
"User-Agent": MOBILE_UA, |
||||
}; |
||||
if (referer) headers.referer = encodeURIComponent(referer); |
||||
let res = await req(reqUrl, { |
||||
method: mth || "get", |
||||
headers: headers, |
||||
data: data, |
||||
postType: mth === "post" ? "json" : "", |
||||
}); |
||||
return res.content; |
||||
} |
||||
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype |
||||
} |
||||
|
||||
async function home(filter) { |
||||
const classes = [{ type_id: 65, type_name: '🐯最新上架' }, { type_id: 113, type_name: '🐯人气热播' }, { type_id: 56, type_name: '🐯经典童谣' }, { type_id: 137, type_name: '🐯开心贝乐虎' }, { type_id: 53, type_name: '🐯律动儿歌' }, { type_id: 59, type_name: '🐯经典儿歌' }, { type_id: 101, type_name: '🐯超级汽车1' }, { type_id: 119, type_name: '🐯超级汽车第二季' }, { type_id: 136, type_name: '🐯超级汽车第三季' }, { type_id: 95, type_name: '🐯三字经' }, { type_id: 133, type_name: '🐯幼儿手势舞' }, { type_id: 117, type_name: '🐯哄睡儿歌' }, { type_id: 70, type_name: '🐯英文儿歌' }, { type_id: 116, type_name: '🐯节日与节气' }, { type_id: 97, type_name: '🐯恐龙世界' }, { type_id: 55, type_name: '🐯动画片儿歌' }, { type_id: 57, type_name: '🐯流行歌曲' }, { type_id: 118, type_name: '🐯贝乐虎入园记' }, { type_id: 106, type_name: '🐯贝乐虎大百科' }, { type_id: 62, type_name: '🐯经典古诗' }, { type_id: 63, type_name: '🐯经典故事' }, { type_id: 128, type_name: '🐯萌虎学功夫' }, { type_id: 100, type_name: '🐯绘本故事' }, { type_id: 121, type_name: '🐯开心贝乐虎英文版' }, { type_id: 96, type_name: '🐯嗨贝乐虎情商动画' }, { type_id: 108, type_name: '🐯动物音乐派对' }, { type_id: 126, type_name: '🐯动物音乐派对英文版' }, { type_id: 105, type_name: '🐯奇妙的身体' }, { type_id: 124, type_name: '🐯奇妙的身体英文版' }, { type_id: 64, type_name: '🐯认知卡片' }, { type_id: 109, type_name: '🐯趣味简笔画' }, { type_id: 78, type_name: '🐯数字儿歌' }, { type_id: 120, type_name: '🐯识字体验版' }, { type_id: 127, type_name: '🐯启蒙系列体验版' }]; |
||||
const filterObj = {}; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
cls.land = 1; |
||||
cls.ratio = 1.78; |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}) |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const link = HOST + "/api/v1/bv/video"; |
||||
const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: 56, "p": 1 }; |
||||
const jo = JSON.parse(await request(link, "", "post", pdata)).result; |
||||
const videos = []; |
||||
_.each(jo.items, (it) => { |
||||
videos.push({ |
||||
vod_id: it.url, |
||||
vod_name: it.title, |
||||
vod_pic: it.image, |
||||
vod_remarks: '👀' + it.viewcount || '', |
||||
}) |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}) |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof pg == 'undefined') pg = 1; |
||||
const link = HOST + "/api/v1/bv/video"; |
||||
const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: tid, "p": pg }; |
||||
const jo = JSON.parse(await request(link, "", "post", pdata)).result; |
||||
const videos = []; |
||||
_.each(jo.items, (it) => { |
||||
videos.push({ |
||||
vod_id: it.url, |
||||
vod_name: it.title, |
||||
vod_pic: it.image, |
||||
vod_remarks: '👀' + it.viewcount || '', |
||||
}) |
||||
}); |
||||
const pgCount = pg * 60 > jo.total ? parseInt(pg) : parseInt(pg) + 1; |
||||
return JSON.stringify({ |
||||
page: parseInt(pg), |
||||
pagecount: pgCount, |
||||
limit: 60, |
||||
total: jo.total, |
||||
list: videos, |
||||
}) |
||||
} |
||||
|
||||
async function detail(id) { |
||||
const vod = { |
||||
vod_id: id, |
||||
vod_remarks: '', |
||||
}; |
||||
const playlist = ['点击播放' + '$' + id]; |
||||
vod.vod_play_from = "道长在线"; |
||||
vod.vod_play_url = playlist.join('#'); |
||||
return JSON.stringify({ |
||||
list: [vod], |
||||
}); |
||||
} |
||||
|
||||
async function play(flag, id, flags) { |
||||
// console.debug('贝乐虎 id =====>' + id); // js_debug.log
|
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: id, |
||||
}); |
||||
} |
||||
|
||||
async function search(wd, quick) { |
||||
return '{}' |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
search: search, |
||||
} |
||||
} |
||||
@ -0,0 +1,258 @@ |
||||
// 自动从 地址发布页 获取&跳转url地址
|
||||
import { Crypto, load, _ } from './lib/cat.js'; |
||||
|
||||
let key = '在线之家'; |
||||
let HOST = 'https://www.zxzj.site'; // 地址发布页
|
||||
let host = ''; |
||||
let siteKey = ''; |
||||
let siteType = 0; |
||||
|
||||
const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; |
||||
|
||||
async function request(reqUrl, agentSp) { |
||||
let res = await req(reqUrl, { |
||||
method: 'get', |
||||
headers: { |
||||
'User-Agent': agentSp || MOBILE_UA, |
||||
'Referer': host |
||||
}, |
||||
}); |
||||
return res.content; |
||||
} |
||||
|
||||
// cfg = {skey: siteKey, ext: extend}
|
||||
async function init(cfg) { |
||||
siteKey = cfg.skey; |
||||
siteType = cfg.stype; |
||||
const html = await request(HOST); |
||||
const $ = load(html); |
||||
host = $('div.content-top > ul > li').find('a:first')[0].attribs.href; |
||||
console.debug('在线之家 跳转地址 =====>' + host); // js_debug.log
|
||||
} |
||||
|
||||
async function home(filter) { |
||||
const html = await request(host); |
||||
const $ = load(html); |
||||
const class_parse = $('ul.stui-header__menu > li > a[href*=list]'); |
||||
let classes = _.map(class_parse, (cls) => { |
||||
let typeId = cls.attribs['href']; |
||||
typeId = typeId.substring(typeId.lastIndexOf('/') + 1).replace('.html', ''); |
||||
return { |
||||
type_id: typeId, |
||||
type_name: cls.children[0].data, |
||||
}; |
||||
}); |
||||
const filterObj = { |
||||
1: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '恐怖', v: '恐怖' }, { n: '动作', v: '动作' }, { n: '科幻', v: '科幻' }, { n: '剧情', v: '剧情' }, { n: '战争', v: '战争' }, { n: '警匪', v: '警匪' }, { n: '犯罪', v: '犯罪' }, { n: '动画', v: '动画' }, { 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: '其他' }] }], |
||||
2: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '剧情', v: '剧情' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '动作', v: '动作' }, { n: '悬疑', v: '悬疑' }, { n: '恐怖', v: '恐怖' }, { n: '奇幻', v: '奇幻' }, { n: '惊悚', v: '惊悚' }, { n: '犯罪', v: '犯罪' }, { n: '科幻', v: '科幻' }, { n: '音乐', v: '音乐' }, { n: '其他', v: '其他' }] }], |
||||
3: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '剧情', v: '剧情' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '动作', v: '动作' }, { n: '悬疑', v: '悬疑' }, { n: '恐怖', v: '恐怖' }, { n: '奇幻', v: '奇幻' }, { n: '惊悚', v: '惊悚' }, { n: '犯罪', v: '犯罪' }, { n: '科幻', v: '科幻' }, { n: '音乐', v: '音乐' }, { n: '其他', v: '其他' }] }], |
||||
4: [{ 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: '其他' }] }], |
||||
6: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '情感', v: '情感' }, { n: '科幻', v: '科幻' }, { n: '热血', v: '热血' }, { n: '推理', v: '推理' }, { n: '搞笑', v: '搞笑' }, { n: '冒险', v: '冒险' }, { n: '萝莉', v: '萝莉' }, { n: '校园', v: '校园' }, { n: '动作', v: '动作' }, { n: '机战', v: '机战' }, { n: '运动', v: '运动' }, { n: '战争', v: '战争' }, { n: '少年', v: '少年' }] }, { key: 'area', name: '地区', value: [{ n: '全部', v: '' }, { n: '国产', v: '国产' }, { n: '日本', v: '日本' }, { n: '欧美', v: '欧美' }, { n: '其他', v: '其他' }] }] |
||||
}; |
||||
let filYer = { 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' }] }; |
||||
filYer['init'] = filYer.value[0].v; |
||||
let filBy = { key: 'by', name: '排序', value: [{ n: '时间', v: 'time' }, { n: '人气', v: 'hits' }, { n: '评分', v: 'score' }] }; |
||||
filBy['init'] = filBy.value[0].v; |
||||
return JSON.stringify({ |
||||
class: _.map(classes, (cls) => { |
||||
if (filterObj[cls.type_id]) { |
||||
filterObj[cls.type_id].push(filYer, filBy); |
||||
filterObj[cls.type_id][0]['init'] = filterObj[cls.type_id][0].value[0].v; |
||||
} else { |
||||
filterObj[cls.type_id] = []; |
||||
filterObj[cls.type_id].push(filYer, filBy) |
||||
} |
||||
return cls; |
||||
}), |
||||
filters: filterObj, |
||||
}); |
||||
} |
||||
|
||||
async function homeVod() { |
||||
const link = host + '/vodshow/1--hits---------2023.html'; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); |
||||
const items = $('ul.stui-vodlist > li'); |
||||
let videos = _.map(items, (item) => { |
||||
const a = $(item).find('a:first')[0]; |
||||
const remarks = $($(item).find('span.pic-text')[0]).text().trim(); |
||||
return { |
||||
vod_id: a.attribs.href.replace(/.*?\/detail\/(.*).html/g, '$1'), |
||||
vod_name: a.attribs.title, |
||||
vod_pic: js2Base + base64Encode(a.attribs['data-original']), |
||||
vod_remarks: remarks || '', |
||||
}; |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
}); |
||||
} |
||||
|
||||
async function category(tid, pg, filter, extend) { |
||||
if (pg <= 0 || typeof (pg) == 'undefined') pg = 1; |
||||
const link = host + '/vodshow/' + tid + '-' + (extend.area || '') + '-' + (extend.by || 'time') + '-' + (extend.class || '') + '-' + (extend.lang || '') + '-' + (extend.letter || '') + '---' + pg + '---' + (extend.year || '') + '.html'; |
||||
const html = await request(link); |
||||
const $ = load(html); |
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); |
||||
const items = $('ul.stui-vodlist > li'); |
||||
let videos = _.map(items, (item) => { |
||||
const a = $(item).find('a:first')[0]; |
||||
const remarks = $($(item).find('span.pic-text')[0]).text().trim(); |
||||
return { |
||||
vod_id: a.attribs.href.replace(/.*?\/detail\/(.*).html/g, '$1'), |
||||
vod_name: a.attribs.title, |
||||
vod_pic: js2Base + base64Encode(a.attribs['data-original']), |
||||
vod_remarks: remarks || '', |
||||
}; |
||||
}); |
||||
const hasMore = $('ul.stui-page__item > li > 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(host + '/detail/' + id + '.html'); |
||||
const $ = load(html); |
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); |
||||
const vod = { |
||||
vod_id: id, |
||||
vod_name: $('h1:first').text().trim(), |
||||
vod_type: $('.stui-content__detail p:first a').text(), |
||||
vod_actor: $('.stui-content__detail p:nth-child(3)').text().replace('主演:', ''), |
||||
vod_director: $('.stui-content__detail p:nth-child(4)').text().replace('导演:', ''), |
||||
vod_pic: js2Base + base64Encode($('.stui-content__thumb img:first').attr('data-original')), |
||||
vod_remarks: $('.stui-content__detail p:nth-child(5)').text() || '', |
||||
vod_content: $('span.detail-content').text().trim(), |
||||
}; |
||||
let playMap = {}; |
||||
const tabs = $('div.stui-vodlist__head > h3'); |
||||
const playlists = $('ul.stui-content__playlist'); |
||||
_.each(tabs, (tab, i) => { |
||||
const from = tab.children[0].data; |
||||
let list = playlists[i]; |
||||
list = $(list).find('a'); |
||||
_.each(list, (it) => { |
||||
const title = it.children[0].data; |
||||
const playUrl = it.attribs.href; |
||||
if (title.length == 0) title = it.children[0].data.trim(); |
||||
if (!playMap.hasOwnProperty(from)) { |
||||
playMap[from] = []; |
||||
} |
||||
playMap[from].push(title + '$' + playUrl); |
||||
}); |
||||
}); |
||||
vod.vod_play_from = _.keys(playMap).join('$$$'); |
||||
const urls = _.values(playMap); |
||||
let 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 html = await request(host + id); |
||||
const mhtml = html.match(/r player_.*?=(.*?)</)[1]; |
||||
const json = JSON.parse(mhtml); |
||||
const url = json.url; |
||||
const from = json.from; |
||||
if (json.encrypt == '1') { |
||||
url = unescape(url) |
||||
} else if (json.encrypt == '2') { |
||||
url = unescape(base64Decode(url)) |
||||
} |
||||
if (url.indexOf('m3u8') >= 0 || url.indexOf('mp4') >= 0) { |
||||
// console.debug('在线之家url =====>' + url); // js_debug.log
|
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: url, |
||||
}); |
||||
} else if (from.indexOf('line3') >= 0 || from.indexOf('line5') >= 0) { |
||||
const ifrwy = await request(url); |
||||
const code = ifrwy.match(/var url = '(.*?)'/)[1].split('').reverse().join(''); |
||||
let temp = ''; |
||||
for (let i = 0x0; i < code.length; i = i + 0x2) { |
||||
temp += String.fromCharCode(parseInt(code[i] + code[i + 0x1], 0x10)) |
||||
} |
||||
const purl = temp.substring(0x0, (temp.length - 0x7) / 0x2) + temp.substring((temp.length - 0x7) / 0x2 + 0x7); |
||||
// console.debug('在线之家purl =====>' + purl); // js_debug.log
|
||||
return JSON.stringify({ |
||||
parse: 0, |
||||
url: purl, |
||||
}); |
||||
} else { |
||||
// console.debug('在线之家url =====>' + '空'); // js_debug.log
|
||||
return '{}'; |
||||
} |
||||
} |
||||
|
||||
async function search(wd, quick) { |
||||
var data = JSON.parse(await request(host + '/index.php/ajax/suggest?mid=1&wd=' + wd + '&limit=50')).list; |
||||
const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); |
||||
let videos = _.map(data, (it) => { |
||||
return { |
||||
vod_id: it.id, |
||||
vod_name: it.name, |
||||
vod_pic: js2Base + base64Encode(it.pic), |
||||
vod_remarks: '', |
||||
} |
||||
}); |
||||
return JSON.stringify({ |
||||
list: videos, |
||||
limit: 50, |
||||
}); |
||||
} |
||||
|
||||
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: 'https://api.douban.com/', |
||||
'User-Agent': MOBILE_UA, |
||||
}, |
||||
}); |
||||
return JSON.stringify({ |
||||
code: resp.code, |
||||
buffer: 2, |
||||
content: resp.content, |
||||
headers: resp.headers, |
||||
}); |
||||
} |
||||
return JSON.stringify({ |
||||
code: 500, |
||||
content: '', |
||||
}); |
||||
} |
||||
|
||||
export function __jsEvalReturn() { |
||||
return { |
||||
init: init, |
||||
home: home, |
||||
homeVod: homeVod, |
||||
category: category, |
||||
detail: detail, |
||||
play: play, |
||||
proxy: proxy, |
||||
search: search, |
||||
}; |
||||
} |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue