1ac436d722
d Signed-off-by: gyjune <13759589+gyjune@user.noreply.gitee.com>
223 lines
6.8 KiB
JavaScript
223 lines
6.8 KiB
JavaScript
var rule = {
|
|
title: '八号影视',
|
|
host: 'https://www.bahaotv.com',
|
|
url: '/vodshow/fyclass--------fypage---.html',
|
|
searchUrl: '/so.html?wd=**',
|
|
searchable: 2,
|
|
quickSearch: 0,
|
|
filterable: 0,
|
|
headers: {
|
|
'User-Agent': 'MOBILE_UA'
|
|
},
|
|
timeout: 5000,
|
|
|
|
// 分类配置
|
|
class_name: '电影&电视剧&动漫',
|
|
class_url: 'movie&tvseries&anime',
|
|
|
|
// 推荐内容 - 首页和详情页猜你喜欢
|
|
推荐: `js:
|
|
let html = request(input);
|
|
let data = [];
|
|
let items = pdfa(html, '.card-box&&.content-card');
|
|
items.forEach(item => {
|
|
data.push({
|
|
title: pdfh(item, '.title&&Text'),
|
|
img: pdfh(item, '.cover-img&&img&&data-original'),
|
|
desc: pdfh(item, '.role&&Text'),
|
|
url: pdfh(item, 'a&&href')
|
|
});
|
|
});
|
|
setResult(data);
|
|
`,
|
|
|
|
// 一级内容 - 分类列表页
|
|
一级: `js:
|
|
let html = request(input);
|
|
let data = [];
|
|
let items = pdfa(html, '.card-box&&.content-card');
|
|
items.forEach(item => {
|
|
data.push({
|
|
title: pdfh(item, '.title&&Text'),
|
|
img: pdfh(item, '.cover-img&&img&&data-original'),
|
|
desc: pdfh(item, '.role&&Text'),
|
|
url: pdfh(item, 'a&&href')
|
|
});
|
|
});
|
|
setResult(data);
|
|
`,
|
|
|
|
// 二级内容 - 详情页
|
|
二级: {
|
|
title: `js:
|
|
pdfh(html, 'h1.title&&Text') || pdfh(html, '.title-box&&h1&&Text')
|
|
`,
|
|
img: `js:
|
|
pdfh(html, '.img-box&&img&&data-original') || pdfh(html, '.vod-detailll&&img&&data-original')
|
|
`,
|
|
desc: `js:
|
|
let director = pdfh(html, '.director:contains("导演")&&Text').replace('导演:', '').trim();
|
|
let actors = pdfh(html, '.director:contains("主演")&&Text').replace('主演:', '').trim();
|
|
let alias = pdfh(html, '.roles:contains("别名")&&Text').replace('别名:', '').trim();
|
|
let score = pdfh(html, '.score&&Text');
|
|
let hits = pdfh(html, '.hot-num&&Text');
|
|
|
|
// 格式化描述信息
|
|
let desc = '';
|
|
if (director) desc += '导演: ' + director + ';;';
|
|
if (actors) desc += '主演: ' + actors + ';;';
|
|
if (alias) desc += '别名: ' + alias + ';;';
|
|
if (score) desc += '评分: ' + score + ';;';
|
|
if (hits) desc += '热度: ' + hits;
|
|
|
|
desc;
|
|
`,
|
|
content: `js:
|
|
pdfh(html, '.intro&&Text') || pdfh(html, '.vod-content&&.intro&&Text')
|
|
`,
|
|
tabs: `js:
|
|
let tabs = [];
|
|
let tabElements = pdfa(html, '.player_name');
|
|
tabElements.forEach(tab => {
|
|
tabs.push(pdfh(tab, 'a&&Text'));
|
|
});
|
|
tabs;
|
|
`,
|
|
lists: `js:
|
|
let playList = [];
|
|
let tabPanes = pdfa(html, '.tab-pane');
|
|
|
|
tabPanes.forEach((pane, index) => {
|
|
let episodes = [];
|
|
let episodeElements = pdfa(pane, '.listitem');
|
|
|
|
episodeElements.forEach(ep => {
|
|
episodes.push({
|
|
name: pdfh(ep, 'a&&Text'),
|
|
url: pdfh(ep, 'a&&href')
|
|
});
|
|
});
|
|
|
|
if (episodes.length > 0) {
|
|
playList.push(episodes);
|
|
}
|
|
});
|
|
|
|
JSON.stringify(playList);
|
|
`
|
|
},
|
|
|
|
// 搜索功能
|
|
搜索: `js:
|
|
let html = request(input);
|
|
let data = [];
|
|
let items = pdfa(html, '.vod-list&&li');
|
|
|
|
items.forEach(item => {
|
|
data.push({
|
|
title: pdfh(item, '.title&&Text'),
|
|
img: pdfh(item, '.pic&&img&&data-original'),
|
|
desc: pdfh(item, '.desc&&Text'),
|
|
url: pdfh(item, 'a&&href')
|
|
});
|
|
});
|
|
|
|
setResult(data);
|
|
`,
|
|
|
|
// 播放地址解析
|
|
play_parse: true,
|
|
lazy: `js:
|
|
let html = request(input);
|
|
let playUrl = '';
|
|
|
|
// 尝试多种方式提取播放地址
|
|
let patterns = [
|
|
/player_aaaa.*?url.*?['"]([^'"]+)['"]/,
|
|
/video_url.*?['"]([^'"]+)['"]/,
|
|
/src.*?['"]([^'"]+\.m3u8[^'"]*)['"]/,
|
|
/file.*?['"]([^'"]+\.m3u8[^'"]*)['"]/
|
|
];
|
|
|
|
for (let pattern of patterns) {
|
|
let match = html.match(pattern);
|
|
if (match && match[1]) {
|
|
playUrl = match[1];
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 如果没有找到播放地址,返回原始输入
|
|
playUrl || input;
|
|
`,
|
|
|
|
// 详情页预处理
|
|
详情: `js:
|
|
let html = request(input);
|
|
|
|
// 移除广告和干扰元素
|
|
const removeSelectors = [
|
|
'ins',
|
|
'script',
|
|
'.google-auto-placed',
|
|
'.adsbygoogle',
|
|
'.ad-container',
|
|
'#theme-switcher',
|
|
'.side-top'
|
|
];
|
|
|
|
removeSelectors.forEach(selector => {
|
|
let elements = pdfa(html, selector);
|
|
elements.forEach(el => {
|
|
html = html.replace(pdfh(el, '&&outerHtml'), '');
|
|
});
|
|
});
|
|
|
|
html;
|
|
`,
|
|
|
|
// 分类解析
|
|
class_parse: `js:
|
|
let html = request(HOST);
|
|
let classes = [];
|
|
|
|
// 解析导航菜单中的分类
|
|
let navItems = pdfa(html, '.menu&&a.nav');
|
|
navItems.forEach(item => {
|
|
let text = pdfh(item, '&&Text');
|
|
let href = pdfh(item, '&&href');
|
|
|
|
if (text && href && !text.includes('首页')) {
|
|
let match = href.match(/\/vodshow\/([^\/]+)/);
|
|
if (match) {
|
|
classes.push({
|
|
type_name: text,
|
|
type_id: match[1]
|
|
});
|
|
}
|
|
}
|
|
});
|
|
|
|
// 确保有默认分类
|
|
if (classes.length === 0) {
|
|
classes = [
|
|
{type_name: '电影', type_id: 'movie'},
|
|
{type_name: '电视剧', type_id: 'tvseries'},
|
|
{type_name: '动漫', type_id: 'anime'}
|
|
];
|
|
}
|
|
|
|
JSON.stringify(classes);
|
|
`,
|
|
|
|
// 预处理函数
|
|
before: function(html) {
|
|
// 基础清理
|
|
html = html.replace(/<ins[^>]*>.*?<\/ins>/gs, '');
|
|
html = html.replace(/<script[^>]*>.*?<\/script>/gs, '');
|
|
html = html.replace(/<div class="google-auto-placed[^>]*>.*?<\/div>/gs, '');
|
|
html = html.replace(/onclick="[^"]*"/g, '');
|
|
html = html.replace(/onerror="[^"]*"/g, '');
|
|
return html;
|
|
}
|
|
}; |