123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- 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';
- }
- }
|