Files
tvbox_collect/recha18/js/youyou.js
T
2026-07-11 04:45:19 +00:00

256 lines
6.5 KiB
JavaScript

import "assets://js/lib/cat.js";
import "assets://js/lib/crypto-js.js";
//https://link3.cc/yyvod
async function init(cfg) {
cfg.skey = '悠悠视频-动态分类';
cfg.stype = '3';
}
let url = 'http://156.225.30.65:8090';
const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36';
//解密
function AES1(data) {
const key = CryptoJS.enc.Utf8.parse('RuN9LRvwTRgpQnpK');
const iv = CryptoJS.enc.Utf8.parse('RuN9LRvwTRgpQnpK');
const decrypted = CryptoJS.AES.decrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
//加密
function AES2(data) {
const key = CryptoJS.enc.Utf8.parse('RuN9LRvwTRgpQnpK');
const iv = CryptoJS.enc.Utf8.parse('RuN9LRvwTRgpQnpK');
const encrypted = CryptoJS.AES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
async function request (reqUrl, mth) {
const res = await req (reqUrl, {
method: mth || 'get',
headers: {
'User-Agent': UA,
referer: url,
},
postType: mth === 'post' ? 'form' : '',
});
return res.content;
}
//动态分类
async function home (filter) {
let html = await request(`${url}/api.php/getappapi.index/initV119`);
let res = JSON.parse(AES1(JSON.parse(html).data));
//一级
let classes = res.type_list.map(tp => ({
type_id: tp.type_id,
type_name: tp.type_name
})).filter(item => item.type_name !== "全部");
//二级
let filterObj = res.type_list.reduce((acc, tp) => {
if (tp.filter_type_list) {
acc[tp.type_id] = tp.filter_type_list.map(filter => ({
key: filter.name,
name: filter.list[0],
value: filter.list.map(item => ({
n: item,
v: item
}))
}));
}
return acc;
}, {});
let html2 = await request(`${url}/api.php/getappapi.index/rankListV134?type_id=0&page=1`);
let res2 = JSON.parse(AES1(JSON.parse(html2).data));
//推荐
let videos = res2.rank_list.map(item => ({
vod_id: item.vod_id,
vod_name: item.vod_name,
vod_pic: item.vod_pic,
vod_remarks: item.vod_remarks,
vod_year: item.vod_year
}));
return JSON.stringify({
class: classes,
filters: filterObj,
list: videos
});
}
//主页推荐
async function homeVod() {
}
//分类
async function category (tid, pg, filter, extend) {
let html = await request(`${url}/api.php/getappapi.index/typeFilterVodList?area=${extend.area ? extend.area : ''}&year=${extend.year ? extend.year : ''}&type_id=${tid}&page=${pg}&sort=${extend.sort ? extend.sort : ''}&lang=${extend.lang ? extend.lang : ''}&class=${extend.class ? extend.class : ''}`);
let res = JSON.parse(AES1(JSON.parse(html).data)).recommend_list;
let videos = res.map(item => ({
vod_id: item.vod_id,
vod_name: item.vod_name,
vod_pic: item.vod_pic,
vod_remarks: item.vod_remarks,
vod_year: ""
}));
return JSON.stringify ({
page: pg,
pagecount: 99999,
limit: 30,
total: 99999,
list: videos
});
}
//详情
async function detail (id) {
let html = await request (`${url}/api.php/getappapi.index/vodDetail?vod_id=${id}`);
let res = JSON.parse(AES1(JSON.parse(html).data));
let play_from = res.vod_play_list.map(item => item.player_info.show).join('$$$');
let play_url = res.vod_play_list.map(play => {
let p = play.player_info.parse; // 获取 parse
return play.urls.map(item => {
let name = item.name;
let url = item.url;
let urls = p
? (p.includes('?url=') || p.includes('?key=')) // 如果 p 包含 '?url=' 或 '?key='
? `${p}${url}` // 直接拼接 p 和 url
: `${p}|${url}` // 否则使用 '|' 拼接 p 和 url
: url; // 如果 p 不存在,则 urls 为 url
return `${name}$${urls}`;
}).join('#');
}).join('$$$');
var vod = [{
"type_name": res.vod.vod_class,
"vod_year": res.vod.vod_year,
"vod_area": res.vod.vod_area,
"vod_remarks": res.vod.vod_remarks,
"vod_content": res.vod.vod_content,
"vod_play_from": play_from,
"vod_play_url": play_url
}];
return JSON.stringify ({
list: vod
});
}
//播放
async function play (flag, id, flags) {
//
if (id.indexOf("|") > -1){
let html = await request (`${url}/api.php/getappapi.index/vodParse?parse_api=${id.split("|")[0]}&url=${encodeURIComponent(AES2(id.split("|")[1]))}`);
let res = JSON.parse(AES1(JSON.parse(html).data)).json;
let playUrl = JSON.parse(res).url;
return JSON.stringify ({
parse: 0,
url: playUrl
});
}
//
if (id.includes(".m3u8")){
let ids = id.includes('?url=') ? id.split("?url=")[1] : id;
return JSON.stringify ({
parse: 0,
url: ids
});
}
//
if (id.includes('?url=') || id.includes('?key=')) {
let html = await request (`${id}`);
let url = JSON.parse(html).url;
return JSON.stringify ({
parse: 0,
url: url
});
}
//
if (id.includes("nkvod.me")){
return JSON.stringify ({
parse: 1,
url: id
});
}
//金牌
if (id.includes("/vod/play/")){
let ids = id.split("/");
let t = Date.now();
let sign = CryptoJS.SHA1(CryptoJS.MD5(`id=${ids[5]}&nid=${ids[7]}&key=cb808529bae6b6be45ecfab29a4889bc&t=${t}`).toString()).toString();
let html = await req(`https://www.cfkj86.com/api/mw-movie/anonymous/v1/video/episode/url?id=${ids[5]}&nid=${ids[7]}`, {
method: 'GET',
headers: {
'User-Agent': UA,
'Referer': url,
"t": t,
"sign": sign
},
postType: '' // 非 POST 请求时设为空
});
let res = JSON.parse(html.content).data.playUrl
return JSON.stringify ({
parse: 0,
url: res
});
}
}
//搜索
async function search (wd, quick) {
const html = await request (`${url}/api.php/getappapi.index/searchList?keywords=${wd}&type_id=0&page=1`);
let res = JSON.parse(AES1(JSON.parse(html).data)).search_list;
let videos = res.map(item => ({
vod_id: item.vod_id,
vod_name: item.vod_name,
vod_pic: item.vod_pic,
vod_remarks: item.vod_remarks,
vod_year: item.vod_year
}));
const limit = 20;
return JSON.stringify ({
limit: limit,
list: videos
});
}
export function __jsEvalReturn() {
return {
init: init,
home: home,
homeVod: homeVod,
category: category,
detail: detail,
play: play,
search: search
};
}