PizazzGY-TVNew/JS/四维空间弹幕.js

220 lines
6.9 KiB
JavaScript
Raw Permalink Normal View History

2024-10-27 22:15:06 +08:00
var rule = {
author: '小虎斑',
title: '小虎斑',
host: 'https://4k-av.com',
hostJs: '',
headers: {
'User-Agent': 'IOS_UA'
},
编码: 'utf-8',
timeout: 5000,
homeUrl: '/',
url: '/fyclassfyfilter/page-fypage.html[/fyclassfyfilter]',
filter_url: '{{fl.class}}',
detailUrl: '',
searchUrl: '/s?q=**',
searchable: 1,
quickSearch: 1,
filterable: 1,
class_name: '电影&剧集',
class_url: 'movie&tv',
filter_def: {},
play_parse: true,
proxy_rule: $js.toString(() => {
if (input) {
//console.log(url);
var url = `http://dm.sds11.top/jsdm.php?id=` + input.url;
var htt = fetch(url);
input = [200, "text/xml", htt];
}
}),
lazy: $js.toString(() => {
console.log(VOD.name);
const parts = input.split('|');
if (/m3u8|mp4/.test(parts[0])) {
// const parts = input.split('|');
input = {
jx: 0,
parse: 0,
url: parts[0],
danmaku: getProxyUrl() + '&url=' + getYoukuVideoUrl(VOD.vod_name, parts[1])
};
} else {
let matchResult = request(parts[0]).match(/<source src="(.*?)"/);
let kurl = matchResult ? matchResult[1] : '';
if (kurl) {
input = {
jx: 0,
parse: 0,
url: kurl,
danmaku: getProxyUrl() + '&url=' + getYoukuVideoUrl(VOD.vod_name, parts[1])
};
} else {
input = {
jx: 0,
parse: 1,
url: parts[0],
danmaku: getProxyUrl() + '&url=' + getYoukuVideoUrl(VOD.vod_name, parts[1])
};
}
}
}),
limit: 9,
double: false,
推荐: '*',
一级: '.NTMitem;a&&title;img&&src;.tags&&Text;a&&href',
二级: `js:
let khtml = request(input);
VOD = {};
VOD.vod_id = input;
VOD.vod_name = pdfh(khtml, '#tophead h1&&title') || '未知';
VOD.vod_name = VOD.vod_name.split(' ')[0];
VOD.type_name = pdfh(khtml, '.tags--span&&Text');
VOD.vod_pic = pdfh(khtml, '#MainContent_poster&&img&&src');
VOD.vod_remarks = pdfh(khtml, '.videodetail&&label:eq(0)&&Text');
VOD.vod_year = pdfh(khtml, '.videodetail&&a&&Text');
VOD.vod_area = pdfh(khtml, '.videodetail&&label:eq(1)&&Text');
VOD.vod_director = '未知';
VOD.vod_actor = '未知';
VOD.vod_content = pdfh(khtml, '.videodesc&&Text');
VOD.vod_play_from = '四维空间';
let klists = [];
let kcode = pdfa(khtml, 'ul#rtlist&&li');
if ( kcode == 0) {
kcode = pdfa(khtml, '#MainContent_poster&&a');
kcode.forEach((kc) => {
let kname = pdfh(kc, 'a&&title').replace('电影海报','');
let khref = pdfh(kc, 'a&&href').replace('poster.jpg','');
let klist = kname + '$' + khref + '|' + kname;;
klists.push(klist);
});
VOD.vod_play_url = klists.join('#');
} else {
kcode;
kcode.forEach((kc) => {
let kname = pdfh(kc, 'span&&Text');
let khref = pdfh(kc, 'img&&src').replace('screenshot.jpg','');
let klist = kname + '$' + khref + '|' + kname;
klists.push(klist);
});
VOD.vod_play_url = klists.join('#');
}
`,
搜索: '*',
filter: {
"tv": [{
"key": "class",
"name": "剧情",
"value": [{
"n": "全部",
"v": ""
}, {
"n": "动作",
"v": "/tag/动作"
}, {
"n": "剧情",
"v": "/tag/剧情"
}, {
"n": "冒险",
"v": "/tag/冒险"
}, {
"n": "喜剧",
"v": "/tag/喜剧"
}, {
"n": "国产剧",
"v": "/tag/国产剧"
}, {
"n": "恐怖",
"v": "/tag/恐怖"
}, {
"n": "战争",
"v": "/tag/战争"
}, {
"n": "科幻",
"v": "/tag/科幻"
}, {
"n": "动画",
"v": "/tag/动画"
}, {
"n": "韩剧",
"v": "/tag/韩剧"
}, {
"n": "犯罪",
"v": "/tag/犯罪"
}, {
"n": "纪录片",
"v": "/tag/纪录片"
}]
},
{
"key": "class",
"name": "剧情",
"value": [{
"n": "全部",
"v": ""
}, {
"n": "2024",
"v": "/2024"
}, {
"n": "2023",
"v": "/2023"
}, {
"n": "2022",
"v": "/2022"
}, {
"n": "2021",
"v": "/2021"
}, {
"n": "2020",
"v": "/2020"
}, {
"n": "2019",
"v": "/2019"
}]
}
]
}
}
globalThis.getYoukuVideoUrl = function(wd, flag) {
try {
let api = `https://search.youku.com/api/search?pg=1&keyword=${encodeURIComponent(wd)}`;
let response = request(api);
let json = JSON.parse(response);
// 获取 showId
let showId = json.pageComponentList?.[0]?.commonData?.showId;
if (!showId) {
throw new Error('ShowId not found.');
}
// 第二个 API 请求,获取集数信息
api = `https://search.youku.com/api/search?appScene=show_episode&showIds=${showId}`;
response = request(api);
// 匹配 flag 中的 "第x集" 或 "第x话"
json = JSON.parse(response);
let matches = String(flag).match(/第\s*(\d+)\s*集/) ||
String(flag).match(/第\s*(\d+)\s*话/) ||
String(flag).match(/(\d+)/);
let url = '';
if (matches && matches[1]) {
// 获取对应集数的 URL 或 videoId
let episodeIndex = parseInt(matches[1], 10) - 1;
url = json.serisesList?.[episodeIndex]?.url || json.serisesList?.[episodeIndex]?.videoId;
}
// 如果没有匹配到 flag取第一个集数的 URL
if (!url) {
url = json.serisesList?.[0]?.url || json.serisesList?.[0]?.videoId;
}
// 如果 URL 不是以 http 开头,则拼接成完整的 Youku 视频地址
if (url && !url.startsWith('http')) {
url = `https://v.youku.com/v_show/id_${url}.html`;
}
return url || 'https://v.youku.com/';
} catch {
return 'https://v.youku.com/1111';
}
}