mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-11 15:47:48 +08:00
Javbus Enhancement (#1482)
close #1475 本地测试没啥问题  
This commit is contained in:
@@ -2782,23 +2782,23 @@ board 和 build 可在[这里](http://api.ineal.me/tss/status)查看
|
|||||||
|
|
||||||
### JavBus
|
### JavBus
|
||||||
|
|
||||||
<route name="首页" author="MegrezZhu" example="/javbus/home" path="/javbus/home" />
|
<route name="首页" author="MegrezZhu CoderTonyChan" example="/javbus/home" path="/javbus/home"/>
|
||||||
|
|
||||||
<route name="分类" author="MegrezZhu" example="/javbus/genre/7g" path="/javbus/genre/:gid" :paramsDesc="['分类id,详见[网站里](https://www.javbus.com/genre)的链接']" />
|
<route name="分类" author="MegrezZhu CoderTonyChan" example="/javbus/genre/7g" path="/javbus/genre/:gid" :paramsDesc="['分类id,详见[网站里](https://www.javbus.com/genre)的链接']" />
|
||||||
|
|
||||||
<route name="演员" author="MegrezZhu" example="/javbus/star/2jv" path="/javbus/star/:sid" :paramsDesc="['演员id,详见[网站里](https://www.javbus.com/actresses)的链接']" />
|
<route name="演员" author="MegrezZhu CoderTonyChan" example="/javbus/star/2jv" path="/javbus/star/:sid" :paramsDesc="['演员id,详见[网站里](https://www.javbus.com/actresses)的链接']" />
|
||||||
|
|
||||||
<route name="首页/步兵" author="MegrezZhu" example="/javbus/uncensored/home" path="/javbus/uncensored/home" />
|
<route name="首页/步兵" author="MegrezZhu CoderTonyChan" example="/javbus/uncensored/home" path="/javbus/uncensored/home"/>
|
||||||
|
|
||||||
<route name="分类/步兵" author="MegrezZhu" example="/javbus/uncensored/genre/1bc" path="/javbus/uncensored/genre/:gid" :paramsDesc="['分类id,详见[网站里](https://www.javbus.com/uncensored/genre)的链接']" />
|
<route name="分类/步兵" author="MegrezZhu CoderTonyChan" example="/javbus/uncensored/genre/1bc" path="/javbus/uncensored/genre/:gid" :paramsDesc="['分类id,详见[网站里](https://www.javbus.com/uncensored/genre)的链接']" />
|
||||||
|
|
||||||
<route name="演员/步兵" author="MegrezZhu" example="/javbus/uncensored/star/b5b" path="/javbus/uncensored/star/:sid" :paramsDesc="['演员id,详见[网站里](https://www.javbus.com/uncensored/actresses)的链接']" />
|
<route name="演员/步兵" author="MegrezZhu CoderTonyChan" example="/javbus/uncensored/star/b5b" path="/javbus/uncensored/star/:sid" :paramsDesc="['演员id,详见[网站里](https://www.javbus.com/uncensored/actresses)的链接']" />
|
||||||
|
|
||||||
<route name="首页/欧陆风云" author="MegrezZhu" example="/javbus/western/home" path="/javbus/western/home" />
|
<route name="首页/欧陆风云" author="MegrezZhu CoderTonyChan" example="/javbus/western/home" path="/javbus/western/home"/>
|
||||||
|
|
||||||
<route name="分类/欧陆风云" author="MegrezZhu" example="/javbus/western/genre/86" path="/javbus/western/genre/:gid" :paramsDesc="['分类id,详见[网站里](https://www.javbus.work/genre)的链接']" />
|
<route name="分类/欧陆风云" author="MegrezZhu CoderTonyChan" example="/javbus/western/genre/86" path="/javbus/western/genre/:gid" :paramsDesc="['分类id,详见[网站里](https://www.javbus.work/genre)的链接']" />
|
||||||
|
|
||||||
<route name="演员/欧陆风云" author="MegrezZhu" example="/javbus/western/star/4hv" path="/javbus/western/star/:sid" :paramsDesc="['演员id,详见[网站里](https://www.javbus.work/actresses)的链接']" />
|
<route name="演员/欧陆风云" author="MegrezZhu CoderTonyChan" example="/javbus/western/star/4hv" path="/javbus/western/star/:sid" :paramsDesc="['演员id,详见[网站里](https://www.javbus.work/actresses)的链接']" />
|
||||||
|
|
||||||
### 虎嗅
|
### 虎嗅
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ const { getPage } = require('./util');
|
|||||||
module.exports = async (ctx) => {
|
module.exports = async (ctx) => {
|
||||||
const { gid } = ctx.params;
|
const { gid } = ctx.params;
|
||||||
|
|
||||||
ctx.state.data = await getPage(`https://www.javbus.com/genre/${gid}`);
|
ctx.state.data = await getPage(`https://www.javbus.com/genre/${gid}`, ctx);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ const { getPage } = require('./util');
|
|||||||
module.exports = async (ctx) => {
|
module.exports = async (ctx) => {
|
||||||
const { sid } = ctx.params;
|
const { sid } = ctx.params;
|
||||||
|
|
||||||
ctx.state.data = await getPage(`https://www.javbus.com/star/${sid}`);
|
ctx.state.data = await getPage(`https://www.javbus.com/star/${sid}`, ctx);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,6 +2,5 @@ const { getPage } = require('../util');
|
|||||||
|
|
||||||
module.exports = async (ctx) => {
|
module.exports = async (ctx) => {
|
||||||
const { gid } = ctx.params;
|
const { gid } = ctx.params;
|
||||||
|
ctx.state.data = await getPage(`https://www.javbus.com/uncensored/genre/${gid}`, ctx);
|
||||||
ctx.state.data = await getPage(`https://www.javbus.com/uncensored/genre/${gid}`);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ const { getPage } = require('../util');
|
|||||||
module.exports = async (ctx) => {
|
module.exports = async (ctx) => {
|
||||||
const { sid } = ctx.params;
|
const { sid } = ctx.params;
|
||||||
|
|
||||||
ctx.state.data = await getPage(`https://www.javbus.com/uncensored/star/${sid}`);
|
ctx.state.data = await getPage(`https://www.javbus.com/uncensored/star/${sid}`, ctx);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
const axios = require('../../utils/axios');
|
const axios = require('../../utils/axios');
|
||||||
const { load } = require('cheerio');
|
const { load } = require('cheerio');
|
||||||
|
|
||||||
exports.getPage = async (url) => {
|
exports.getPage = async (url, ctx) => {
|
||||||
const { data } = await axios.get(url);
|
const { data } = await axios(url);
|
||||||
const $ = load(data);
|
const $ = load(data);
|
||||||
|
|
||||||
const pageTitle = `JavBus - ${$('head > title')
|
const pageTitle = `JavBus - ${$('head > title')
|
||||||
@@ -13,15 +13,15 @@ exports.getPage = async (url) => {
|
|||||||
title: pageTitle,
|
title: pageTitle,
|
||||||
link: url,
|
link: url,
|
||||||
description: pageTitle,
|
description: pageTitle,
|
||||||
item: parseItems($),
|
item: await Promise.all(parseItems($, ctx)),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.createHandler = (url) => async (ctx) => {
|
exports.createHandler = (url) => async (ctx) => {
|
||||||
ctx.state.data = await exports.getPage(url);
|
ctx.state.data = await exports.getPage(url, ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
const parseItems = ($) =>
|
const parseItems = ($, ctx) =>
|
||||||
$('.movie-box')
|
$('.movie-box')
|
||||||
.map((_, ele) => ({
|
.map((_, ele) => ({
|
||||||
title: $(ele)
|
title: $(ele)
|
||||||
@@ -41,15 +41,108 @@ const parseItems = ($) =>
|
|||||||
.text(),
|
.text(),
|
||||||
}))
|
}))
|
||||||
.toArray()
|
.toArray()
|
||||||
.map(render);
|
.map(async ({ title, thumb, link, pubDate, aid }) => {
|
||||||
|
const detail = await getDetail(link, ctx);
|
||||||
const render = ({ title, thumb, link, pubDate, aid }) => ({
|
title = `${aid} ${title}${detail.filmTime}`;
|
||||||
title,
|
if (detail.screenData) {
|
||||||
link,
|
detail.imgHTML = detail.screenData.map((url) => `<img referrerpolicy="no-referrer" src="${url}"><br />`);
|
||||||
pubDate,
|
}
|
||||||
description: `
|
return {
|
||||||
<h1>${aid} - ${title}</h1>
|
title,
|
||||||
|
link,
|
||||||
|
pubDate,
|
||||||
|
description: `
|
||||||
|
<h3>${title}</h3>
|
||||||
<br />
|
<br />
|
||||||
<img referrerpolicy="no-referrer" src="${thumb.replace(/\/thumbs?\//, '/cover/').replace('.jpg', '_b.jpg')}" />
|
<img referrerpolicy="no-referrer" src="${thumb.replace(/\/thumbs?\//, '/cover/').replace('.jpg', '_b.jpg')}" />
|
||||||
|
${detail.filmTime ? `<h3>发售日期 : ${detail.filmTime}</h3>` : ''}
|
||||||
|
${detail.actresses ? `<h3>女优 : ${detail.actresses}</h3>` : ''}
|
||||||
|
${detail.filmEstabName ? `<h3>發行商 : ${detail.filmEstabName}</h3>` : ''}
|
||||||
|
${detail.filmMakerbName ? `<h3>製作商 : ${detail.filmMakerbName}</h3>` : ''}
|
||||||
|
${detail.seriesName ? `<h3>系列 : ${detail.seriesName}</h3>` : ''}
|
||||||
|
${detail.screenData ? `<h3>影片截图 : </h3>${detail.imgHTML.join('')}` : ''}
|
||||||
`.trim(),
|
`.trim(),
|
||||||
});
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const getDetail = async (link, ctx) => {
|
||||||
|
const cache = await ctx.cache.get(link);
|
||||||
|
if (cache) {
|
||||||
|
return JSON.parse(cache);
|
||||||
|
} else {
|
||||||
|
const resp = await axios(link);
|
||||||
|
const detailPage = resp.data;
|
||||||
|
// 演员
|
||||||
|
const actressReg = /<a class="avatar-box"[\s\S]*?<\/a>/g;
|
||||||
|
let match = detailPage.match(actressReg);
|
||||||
|
let actresses = [];
|
||||||
|
if (match) {
|
||||||
|
match.map((i) => {
|
||||||
|
const name = /<span>(.*?)<\/span>/.exec(i)[1];
|
||||||
|
actresses = actresses.concat(name);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
actresses = null; // []
|
||||||
|
}
|
||||||
|
// 影片详情
|
||||||
|
const filmCover = /<a class="bigImage" href="(.*?)"/.exec(detailPage)[1];
|
||||||
|
const filmName = /<a class="bigImage" href="(.*?)" title="(.*?)"/.exec(detailPage)[2];
|
||||||
|
let filmTime = /<span class="header">發行日期:<\/span>([\s\S]*?)<\/p>/.exec(detailPage);
|
||||||
|
if (filmTime) {
|
||||||
|
filmTime = filmTime[1];
|
||||||
|
} else {
|
||||||
|
filmTime = null; // "????-??-??";
|
||||||
|
}
|
||||||
|
|
||||||
|
let filmLast = /<span class="header">長度:<\/span>([\s\S]*?)<\/p>/.exec(detailPage);
|
||||||
|
if (filmLast) {
|
||||||
|
const lastmins = /\d+/.exec(filmLast[1]);
|
||||||
|
const hours = Math.floor(lastmins / 60);
|
||||||
|
let mins = lastmins % 60;
|
||||||
|
mins = mins === '0' ? '00' : mins;
|
||||||
|
filmLast = hours + ':' + mins;
|
||||||
|
} else {
|
||||||
|
filmLast = null; // "???分钟";
|
||||||
|
}
|
||||||
|
let filmEstabName = /<span class="header">發行商:[\s\S]*?"(.*?)">(.*?)<\/a>/.exec(detailPage);
|
||||||
|
if (filmEstabName) {
|
||||||
|
filmEstabName = filmEstabName[2];
|
||||||
|
} else {
|
||||||
|
filmEstabName = null; // "未知";
|
||||||
|
}
|
||||||
|
|
||||||
|
let filmMakerbName = /<span class="header">製作商:[\s\S]*?"(.*?)">(.*?)<\/a>/.exec(detailPage);
|
||||||
|
if (filmMakerbName) {
|
||||||
|
filmMakerbName = filmMakerbName[2];
|
||||||
|
} else {
|
||||||
|
filmMakerbName = null; // "未知";
|
||||||
|
}
|
||||||
|
let seriesName = /<span class="header">系列:[\s\S]*?"(.*?)">(.*?)<\/a>/.exec(detailPage);
|
||||||
|
if (seriesName) {
|
||||||
|
seriesName = seriesName[2];
|
||||||
|
} else {
|
||||||
|
seriesName = null; // "未知";
|
||||||
|
}
|
||||||
|
let directorName = /<span class="header">導演:[\s\S]*?"(.*?)">(.*?)<\/a>/.exec(detailPage);
|
||||||
|
if (directorName) {
|
||||||
|
directorName = directorName[2];
|
||||||
|
} else {
|
||||||
|
directorName = null; // "未知";
|
||||||
|
}
|
||||||
|
|
||||||
|
const code = /<span class="header">識別碼:[\s\S]*?">([\s\S]*?)<\/span>/.exec(detailPage)[1];
|
||||||
|
// 影片截图
|
||||||
|
const regScreenshot = /<a class="sample-box" href="(.*?)"[\s\S]*?<img src="(.*?)">/g;
|
||||||
|
match = detailPage.match(regScreenshot);
|
||||||
|
let screenData = [];
|
||||||
|
if (match) {
|
||||||
|
screenData = match.map((i) => /<a class="sample-box" href="(.*?)"[\s\S]*?<img src="(.*?)">/g.exec(i)[1]);
|
||||||
|
} else {
|
||||||
|
screenData = null; // [];
|
||||||
|
}
|
||||||
|
const detail = { actresses, filmCover, filmName, filmTime, filmLast, filmEstabName, filmMakerbName, seriesName, directorName, code, screenData };
|
||||||
|
ctx.cache.set(link, JSON.stringify(detail), 24 * 60 * 60);
|
||||||
|
return detail;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ const { getPage } = require('../util');
|
|||||||
module.exports = async (ctx) => {
|
module.exports = async (ctx) => {
|
||||||
const { gid } = ctx.params;
|
const { gid } = ctx.params;
|
||||||
|
|
||||||
ctx.state.data = await getPage(`https://www.javbus.work/genre/${gid}`);
|
ctx.state.data = await getPage(`https://www.javbus.work/genre/${gid}`, ctx);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ const { getPage } = require('../util');
|
|||||||
module.exports = async (ctx) => {
|
module.exports = async (ctx) => {
|
||||||
const { sid } = ctx.params;
|
const { sid } = ctx.params;
|
||||||
|
|
||||||
ctx.state.data = await getPage(`https://www.javbus.work/star/${sid}`);
|
ctx.state.data = await getPage(`https://www.javbus.work/star/${sid}`, ctx);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user