mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-09-01 14:57:14 +08:00
fix(route): JavBus alternative domain related links (#9336)
* fix(route): JavBus alternative domain related links * fix: add magnets and previews in cache * fix: remove redundant cache
This commit is contained in:
+8
-4
@@ -399,15 +399,15 @@ BT 之家的域名会变更,本路由以 <https://www.btbtt20.com> 为默认
|
||||
|
||||
::: tip 提示
|
||||
|
||||
JavBus 有多个备用域名,本路由默认使用永久域名 <https://javbus.com> ,若该域名无法访问,可以通过在路由最后加上 `?domain=<域名>` 指定路由访问的域名。如指定备用域名为 <https://javsee.icu>,则在所有 JavBus 路由最后加上 `?domain=javsee.icu` 即可,此时路由为 [`/javbus/home?domain=javsee.icu`](https://rsshub.app/javbus/home?domain=javsee.icu)
|
||||
JavBus 有多个备用域名,本路由默认使用永久域名 <https://javbus.com> ,若该域名无法访问,可以通过在路由最后加上 `?domain=<域名>` 指定路由访问的域名。如指定备用域名为 <https://javsee.icu>,则在所有 JavBus 路由最后加上 `?domain=javsee.icu` 即可,此时路由为 [`/javbus?domain=javsee.icu`](https://rsshub.app/javbus?domain=javsee.icu)
|
||||
|
||||
值得注意的是 **欧陆风云** 的域名与主域名有所不同,其备用域名亦然,本路由默认使用域名 <https://javbus.red> ,若该域名无法访问,可以通过在路由最后加上 `?western_domain=<域名>` 指定路由访问的域名。如指定备用域名为 <https://javsee.one>,则在所有 JavBus **欧陆风云** 路由最后加上 `?western_domain=javsee.one` 即可,此时路由为 [`/javbus/western/home?western_domain=javsee.one`](https://rsshub.app/javbus/western/home?western_domain=javsee.one)
|
||||
值得注意的是 **欧陆风云** 的域名与主域名有所不同,其备用域名亦然,本路由默认使用域名 <https://javbus.red> ,若该域名无法访问,可以通过在路由最后加上 `?western_domain=<域名>` 指定路由访问的域名。如指定备用域名为 <https://javsee.one>,则在所有 JavBus **欧陆风云** 路由最后加上 `?western_domain=javsee.one` 即可,此时路由为 [`/javbus/western?western_domain=javsee.one`](https://rsshub.app/javbus/western?western_domain=javsee.one)
|
||||
|
||||
:::
|
||||
|
||||
### 首页
|
||||
|
||||
<Route author="MegrezZhu CoderTonyChan" example="/javbus/home" path="/javbus/home"/>
|
||||
<Route author="MegrezZhu CoderTonyChan nczitzk" example="/javbus" path="/javbus"/>
|
||||
|
||||
### 分类
|
||||
|
||||
@@ -429,6 +429,10 @@ JavBus 有多个备用域名,本路由默认使用永久域名 <https://javbus
|
||||
|
||||
<Route author="MegrezZhu CoderTonyChan Felix2yu" example="/javbus/label/x8" path="/javbus/label/:labelid" :paramsDesc="['发行商id,详见作品右侧发行商的链接']" />
|
||||
|
||||
### 导演
|
||||
|
||||
<Route author="MegrezZhu CoderTonyChan Felix2yu" example="/javbus/director/4gv" path="/javbus/director/:directorId" :paramsDesc="['导演id,详见作品右侧导演的链接']" />
|
||||
|
||||
### 首页 / 步兵
|
||||
|
||||
<Route author="MegrezZhu CoderTonyChan" example="/javbus/uncensored/home" path="/javbus/uncensored/home"/>
|
||||
@@ -447,7 +451,7 @@ JavBus 有多个备用域名,本路由默认使用永久域名 <https://javbus
|
||||
|
||||
### 首页 / 欧陆风云
|
||||
|
||||
<Route author="MegrezZhu CoderTonyChan" example="/javbus/western/home" path="/javbus/western/home"/>
|
||||
<Route author="MegrezZhu CoderTonyChan" example="/javbus/western" path="/javbus/western"/>
|
||||
|
||||
### 分类 / 欧陆风云
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { gid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/genre/${gid}`, ctx);
|
||||
};
|
||||
@@ -1,5 +0,0 @@
|
||||
const { getPage, getDomain } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
ctx.state.data = await getPage(getDomain(ctx), ctx);
|
||||
};
|
||||
@@ -0,0 +1,153 @@
|
||||
const got = require('@/utils/got');
|
||||
const cheerio = require('cheerio');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
const { art } = require('@/utils/render');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const isWestern = /^\/western/.test(ctx.path);
|
||||
|
||||
const rootUrl = `https://www.${ctx.query.domain ?? 'javbus.com'}`;
|
||||
const westernUrl = `https://www.${ctx.query.western_domain ?? 'javbus.red'}`;
|
||||
const currentUrl = `${isWestern ? westernUrl : rootUrl}${ctx.path.replace(/^\/western/, '').replace(/\/home/, '')}`;
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: currentUrl,
|
||||
});
|
||||
|
||||
const $ = cheerio.load(response.data);
|
||||
|
||||
let items = $('.movie-box')
|
||||
.slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 30)
|
||||
.toArray()
|
||||
.map((item) => {
|
||||
item = $(item);
|
||||
|
||||
return {
|
||||
link: item.attr('href'),
|
||||
guid: item.find('date').first().text(),
|
||||
pubDate: parseDate(item.find('date').last().text()),
|
||||
};
|
||||
});
|
||||
|
||||
items = await Promise.all(
|
||||
items.map((item) =>
|
||||
ctx.cache.tryGet(item.link, async () => {
|
||||
const detailResponse = await got({
|
||||
method: 'get',
|
||||
url: item.link,
|
||||
});
|
||||
|
||||
const content = cheerio.load(detailResponse.data);
|
||||
|
||||
content('.genre').last().parent().remove();
|
||||
content('input[type="checkbox"], button').remove();
|
||||
|
||||
const stars = content('.avatar-box span')
|
||||
.toArray()
|
||||
.map((s) => content(s).text());
|
||||
|
||||
const cache = {
|
||||
author: stars.join(', '),
|
||||
title: content('h3').text(),
|
||||
category: content('.genre label')
|
||||
.toArray()
|
||||
.map((c) => content(c).text())
|
||||
.concat(stars),
|
||||
info: content('.row.movie').html(),
|
||||
thumbs: content('.sample-box')
|
||||
.toArray()
|
||||
.map((i) => {
|
||||
const thumbSrc = content(i).attr('href');
|
||||
return /^http/.test(thumbSrc) ? thumbSrc : `${rootUrl}${thumbSrc}`;
|
||||
}),
|
||||
};
|
||||
|
||||
let magnets, videoSrc, videoPreview;
|
||||
|
||||
// To fetch magnets.
|
||||
|
||||
try {
|
||||
const matches = detailResponse.data.match(/var gid = (\d+);[\s\S]*var uc = (\d+);[\s\S]*var img = '(.*)';/);
|
||||
|
||||
const magnetResponse = await got({
|
||||
method: 'get',
|
||||
url: `${rootUrl}/ajax/uncledatoolsbyajax.php`,
|
||||
searchParams: {
|
||||
gid: matches[1],
|
||||
lang: 'zh',
|
||||
img: matches[3],
|
||||
uc: matches[2],
|
||||
floor: 800,
|
||||
},
|
||||
headers: {
|
||||
Referer: item.link,
|
||||
},
|
||||
});
|
||||
|
||||
const content = cheerio.load(`<table>${magnetResponse.data}</table>`);
|
||||
|
||||
magnets = content('tr')
|
||||
.toArray()
|
||||
.map((tr) => {
|
||||
const td = content(tr).find('a[href]');
|
||||
|
||||
return {
|
||||
title: td.first().text().trim(),
|
||||
link: td.first().attr('href'),
|
||||
size: td.eq(1).text().trim(),
|
||||
date: td.last().text().trim(),
|
||||
};
|
||||
});
|
||||
|
||||
if (magnets) {
|
||||
item.enclosure_url = magnets[0].link;
|
||||
item.enclosure_type = 'application/x-bittorrent';
|
||||
}
|
||||
} catch (e) {
|
||||
// no-empty
|
||||
}
|
||||
|
||||
// If the video is not western, go fetch preview.
|
||||
|
||||
if (!isWestern) {
|
||||
try {
|
||||
const avgleResponse = await got({
|
||||
method: 'get',
|
||||
url: `https://api.avgle.com/v1/jav/${item.guid}/0`,
|
||||
});
|
||||
|
||||
// full video
|
||||
videoSrc = avgleResponse.data.response.videos[0]?.embedded_url ?? '';
|
||||
// video preview
|
||||
videoPreview = avgleResponse.data.response.videos[0]?.preview_video_url ?? '';
|
||||
} catch (e) {
|
||||
// no-empty
|
||||
}
|
||||
}
|
||||
|
||||
item.author = cache.author;
|
||||
item.title = cache.title;
|
||||
item.category = cache.category;
|
||||
item.description = art(path.join(__dirname, 'templates/description.art'), {
|
||||
info: cache.info,
|
||||
thumbs: cache.thumbs,
|
||||
magnets,
|
||||
videoSrc,
|
||||
videoPreview,
|
||||
});
|
||||
|
||||
return item;
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
const title = $('head title').text();
|
||||
|
||||
ctx.state.data = {
|
||||
title: `${/^JavBus/.test(title) ? '' : 'JavBus - '}${title.replace(/ - AV磁力連結分享/, '')}`,
|
||||
link: currentUrl,
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { labelid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/label/${labelid}`, ctx);
|
||||
};
|
||||
@@ -1,4 +1,5 @@
|
||||
module.exports = {
|
||||
'/': ['MegrezZhu', 'CoderTonyChan', 'nczitzk'],
|
||||
'/genre/:gid': ['MegrezZhu', 'CoderTonyChan'],
|
||||
'/home': ['MegrezZhu', 'CoderTonyChan'],
|
||||
'/label/:labelid': ['MegrezZhu', 'CoderTonyChan', 'Felix2yu'],
|
||||
@@ -9,6 +10,7 @@ module.exports = {
|
||||
'/uncensored/genre/:gid': ['MegrezZhu', 'CoderTonyChan'],
|
||||
'/uncensored/series/:seriesid': ['MegrezZhu', 'CoderTonyChan', 'Felix2yu'],
|
||||
'/uncensored/star/:sid': ['MegrezZhu', 'CoderTonyChan'],
|
||||
'/western': ['MegrezZhu', 'CoderTonyChan', 'nczitzk'],
|
||||
'/western/home': ['MegrezZhu', 'CoderTonyChan'],
|
||||
'/western/genre/:gid': ['MegrezZhu', 'CoderTonyChan'],
|
||||
'/western/series/:seriesid': ['MegrezZhu', 'CoderTonyChan', 'Felix2yu'],
|
||||
|
||||
+79
-65
@@ -1,3 +1,69 @@
|
||||
const javbus = {
|
||||
_name: 'JavBus',
|
||||
www: [
|
||||
{
|
||||
title: '首页',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/',
|
||||
target: '/javbus/home',
|
||||
},
|
||||
{
|
||||
title: '分类',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/genre/:gid',
|
||||
target: '/javbus/genre/:gid',
|
||||
},
|
||||
{
|
||||
title: '演员',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/star/:sid',
|
||||
target: '/javbus/star/:sid',
|
||||
},
|
||||
{
|
||||
title: '系列',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/series/:seriesid',
|
||||
target: '/javbus/series/:seriesid',
|
||||
},
|
||||
{
|
||||
title: '制作商',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/studio/:studioid',
|
||||
target: '/javbus/studio/:studioid',
|
||||
},
|
||||
{
|
||||
title: '发行商',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/label/:labelid',
|
||||
target: '/javbus/label/:labelid',
|
||||
},
|
||||
{
|
||||
title: '首页 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored',
|
||||
target: '/javbus/uncensored/home',
|
||||
},
|
||||
{
|
||||
title: '分类 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored/genre/:gid',
|
||||
target: '/javbus/uncensored/genre/:gid',
|
||||
},
|
||||
{
|
||||
title: '演员 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored/star/:sid',
|
||||
target: '/javbus/uncensored/star/:sid',
|
||||
},
|
||||
{
|
||||
title: '系列 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored/series/:seriesid',
|
||||
target: '/javbus/uncensored/series/:seriesid',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const westernJavbus = {
|
||||
_name: 'JavBus',
|
||||
www: [
|
||||
@@ -29,71 +95,19 @@ const westernJavbus = {
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
'javbus.com': {
|
||||
_name: 'JavBus',
|
||||
www: [
|
||||
{
|
||||
title: '首页',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/',
|
||||
target: '/javbus/home',
|
||||
},
|
||||
{
|
||||
title: '分类',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/genre/:gid',
|
||||
target: '/javbus/genre/:gid',
|
||||
},
|
||||
{
|
||||
title: '演员',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/star/:sid',
|
||||
target: '/javbus/star/:sid',
|
||||
},
|
||||
{
|
||||
title: '系列',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/series/:seriesid',
|
||||
target: '/javbus/series/:seriesid',
|
||||
},
|
||||
{
|
||||
title: '制作商',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/studio/:studioid',
|
||||
target: '/javbus/studio/:studioid',
|
||||
},
|
||||
{
|
||||
title: '发行商',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/label/:labelid',
|
||||
target: '/javbus/label/:labelid',
|
||||
},
|
||||
{
|
||||
title: '首页 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored',
|
||||
target: '/javbus/uncensored/home',
|
||||
},
|
||||
{
|
||||
title: '分类 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored/genre/:gid',
|
||||
target: '/javbus/uncensored/genre/:gid',
|
||||
},
|
||||
{
|
||||
title: '演员 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored/star/:sid',
|
||||
target: '/javbus/uncensored/star/:sid',
|
||||
},
|
||||
{
|
||||
title: '系列 / 步兵',
|
||||
docs: 'https://docs.rsshub.app/multimedia.html#javbus',
|
||||
source: '/uncensored/series/:seriesid',
|
||||
target: '/javbus/uncensored/series/:seriesid',
|
||||
},
|
||||
],
|
||||
},
|
||||
'javbus.com': javbus,
|
||||
'javsee.club': javbus,
|
||||
'javsee.icu': javbus,
|
||||
'javsee.work': javbus,
|
||||
'seejav.bar': javbus,
|
||||
'seejav.bid': javbus,
|
||||
'seejav.blog': javbus,
|
||||
'seejav.cloud': javbus,
|
||||
'seejav.club': javbus,
|
||||
'seejav.men': javbus,
|
||||
'seejav.pw': javbus,
|
||||
|
||||
'javbus.one': westernJavbus,
|
||||
'javbus.org': westernJavbus,
|
||||
'javbus.red': westernJavbus,
|
||||
};
|
||||
|
||||
+1
-14
@@ -1,16 +1,3 @@
|
||||
module.exports = (router) => {
|
||||
router.get('/genre/:gid', require('./genre'));
|
||||
router.get('/home', require('./home'));
|
||||
router.get('/label/:labelid', require('./label'));
|
||||
router.get('/series/:seriesid', require('./series'));
|
||||
router.get('/star/:sid', require('./star'));
|
||||
router.get('/studio/:studioid', require('./studio'));
|
||||
router.get('/uncensored/home', require('./uncensored/home'));
|
||||
router.get('/uncensored/genre/:gid', require('./uncensored/genre'));
|
||||
router.get('/uncensored/series/:seriesid', require('./uncensored/series'));
|
||||
router.get('/uncensored/star/:sid', require('./uncensored/star'));
|
||||
router.get('/western/home', require('./western/home'));
|
||||
router.get('/western/genre/:gid', require('./western/genre'));
|
||||
router.get('/western/series/:seriesid', require('./western/series'));
|
||||
router.get('/western/star/:sid', require('./western/star'));
|
||||
router.get(/([\w\d/-]+)?/, require('./index'));
|
||||
};
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { seriesid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/series/${seriesid}`, ctx);
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { sid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/star/${sid}`, ctx);
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('./util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { studioid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/studio/${studioid}`, ctx);
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
{{@ info }}
|
||||
<br>
|
||||
{{if videoSrc}}
|
||||
<a href="{{ videoSrc }}">觀看完整影片</a>
|
||||
{{ /if }}
|
||||
<br>
|
||||
{{if videoPreview}}
|
||||
<video controls><source src="{{ videoPreview }}" type="video/mp4"></video>
|
||||
{{/if}}
|
||||
<br>
|
||||
<h4>磁力連結投稿</h4>
|
||||
{{each magnets magnet}}
|
||||
<li><a href="{{ magnet.link }}">{{ magnet.title }} [{{ magnet.size }}] ({{ magnet.date }})</a></li>
|
||||
{{/each}}
|
||||
<h4>樣品圖像</h4>
|
||||
{{each thumbs}}
|
||||
<img src="{{ $value }}">
|
||||
{{/each}}
|
||||
@@ -1,6 +0,0 @@
|
||||
const { getPage, getDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { gid } = ctx.params;
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/uncensored/genre/${gid}`, ctx);
|
||||
};
|
||||
@@ -1,5 +0,0 @@
|
||||
const { getPage, getDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/uncensored`, ctx);
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { seriesid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/uncensored/series/${seriesid}`, ctx);
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { sid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getDomain(ctx)}/uncensored/star/${sid}`, ctx);
|
||||
};
|
||||
@@ -1,211 +0,0 @@
|
||||
const got = require('@/utils/got');
|
||||
const { load } = require('cheerio');
|
||||
const { parseDate } = require('@/utils/parse-date');
|
||||
|
||||
exports.getDomain = (ctx) => `https://www.${ctx.query.domain ?? 'javbus.com'}`;
|
||||
|
||||
exports.getWesternDomain = (ctx) => `https://www.${ctx.query.western_domain ?? 'javbus.red'}`;
|
||||
|
||||
exports.getPage = async (url, ctx) => {
|
||||
const { data } = await got(url);
|
||||
const $ = load(data);
|
||||
|
||||
const pageTitle = `JavBus - ${$('head > title').text().replace(' - JavBus', '')}`;
|
||||
|
||||
return {
|
||||
title: pageTitle,
|
||||
link: url,
|
||||
description: pageTitle,
|
||||
item: await Promise.all(parseItems($, ctx)),
|
||||
};
|
||||
};
|
||||
|
||||
const parseItems = ($, ctx) =>
|
||||
$('.movie-box')
|
||||
.map((_, ele) => ({
|
||||
title: $(ele).find('img').attr('title'),
|
||||
thumb: $(ele).find('img').attr('src'),
|
||||
link: $(ele).attr('href'),
|
||||
pubDate: parseDate($(ele).find('date:nth-child(4)').text(), 'YYYY-MM-DD'),
|
||||
aid: $(ele).find('date:nth-child(3)').text(),
|
||||
}))
|
||||
.toArray()
|
||||
.map(async ({ title, thumb, link, pubDate, aid }) => {
|
||||
const detail = await getDetail(link, ctx);
|
||||
title = `${aid} ${title}${detail.filmTime}`;
|
||||
if (detail.screenData) {
|
||||
detail.imgHTML = detail.screenData.map((url) => `<img src="${url}"><br />`);
|
||||
}
|
||||
return {
|
||||
title,
|
||||
link,
|
||||
pubDate,
|
||||
description: `
|
||||
<h3>${title}</h3>
|
||||
<br />
|
||||
<img src="${thumb.replace(/\/thumbs?\//, '/cover/').replace('.jpg', '_b.jpg')}" />
|
||||
${detail.filmId ? `<h3>識別碼 : ${detail.filmId}</h3>` : ''}
|
||||
${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.filmLast ? `<h3>影片时长 : ${detail.filmLast}</h3>` : ''}
|
||||
${detail.screenData ? `<h3>影片截图 : </h3>${detail.imgHTML.join('')}` : ''}
|
||||
${detail.videolink ? `<h3>在线观看 : ${detail.videolink}</h3>` : ''}
|
||||
${detail.magnetlinks ? `<h3>下载地址 : </h3><br />${detail.magnetlinks.join('')}` : ''}
|
||||
${detail.videoplayer ? `<hr /><h3>视频预览 : </h3><br />${detail.videoplayer}` : ''}
|
||||
`.trim(),
|
||||
};
|
||||
});
|
||||
|
||||
const getDetail = async (link, ctx) =>
|
||||
await ctx.cache.tryGet(link, async () => {
|
||||
const resp = await got(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 filmId = /<span style="color:#CC0000;">([\s\S]*?)<\/span>/.exec(detailPage);
|
||||
if (filmId) {
|
||||
filmId = filmId[1];
|
||||
} else {
|
||||
filmId = null;
|
||||
}
|
||||
|
||||
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]);
|
||||
if (lastmins) {
|
||||
const hours = Math.floor(lastmins / 60);
|
||||
let mins = lastmins % 60;
|
||||
mins = mins === 0 ? '00' : mins;
|
||||
filmLast = hours + ':' + mins;
|
||||
} else {
|
||||
filmLast = null;
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
|
||||
let magnetlinks = [];
|
||||
try {
|
||||
const filmGid = /gid = ([0-9]*?);/.exec(detailPage);
|
||||
const filmUc = /uc = ([0-9]*?);/.exec(detailPage);
|
||||
const filmImg = /var img = '(.*?)';/.exec(detailPage);
|
||||
const filmFloor = Math.floor(Math.random() * 1000 + 1);
|
||||
const apiurl = `${exports.getDomain(ctx)}/ajax/uncledatoolsbyajax.php?gid=${filmGid[1]}&lang=zh&img=${filmImg[1]}&uc=${filmUc[1]}&floor=${filmFloor}`;
|
||||
const apiresp = await got({
|
||||
method: 'get',
|
||||
url: apiurl,
|
||||
headers: {
|
||||
Referer: link,
|
||||
},
|
||||
});
|
||||
const magnettable = apiresp.data;
|
||||
match = magnettable.match(/<tr onmouseover=[\s\S]*?<\/tr>/gm);
|
||||
if (match) {
|
||||
magnetlinks = match.map((str) => {
|
||||
// magnet地址
|
||||
const mlink = /td width="70%" onclick="window.open\('(magnet.*?)',/.exec(str)[1];
|
||||
// console.log(str);
|
||||
// 提取a链接
|
||||
const mrow = str.match(/<a [\s\S]*?magnet[\s\S]*?">([\s\S]*?)</gm);
|
||||
// magnet名称
|
||||
const mname = /<a [\s\S]*?magnet[\s\S]*?">([\s\S]*?)</.exec(mrow[0])[1].trim();
|
||||
// magnet大小
|
||||
const msize = /<a [\s\S]*?magnet[\s\S]*?">([\s\S]*?)</.exec(mrow[1])[1].trim();
|
||||
// return "<a href=\""+mlink+"\">"+mname+" -- "+msize+ "<\/a><textarea readonly rows=\"5\" cols=\"50\">"+ mlink + "<\/textarea><br \/>";
|
||||
return '<a href="' + mlink + '">' + mname + ' -- ' + msize + '</a><br />';
|
||||
});
|
||||
} else {
|
||||
magnetlinks = null;
|
||||
}
|
||||
} catch (e) {
|
||||
magnetlinks = null;
|
||||
}
|
||||
|
||||
let videolink = null;
|
||||
let videoplayer = null;
|
||||
const avgleurl = `https://api.avgle.com/v1/jav/${filmId}/0`;
|
||||
try {
|
||||
// 尝试通过Avgle接口获取视频信息
|
||||
const avgleresp = await got.get(avgleurl);
|
||||
// 获取到的视频数量
|
||||
const videonum = avgleresp.data.response.total_videos;
|
||||
// 获取到的视频地址
|
||||
const videos = avgleresp.data.response.videos;
|
||||
if (videonum > 0) {
|
||||
// 获取完整的视频地址
|
||||
const embedded_url = videos[0].embedded_url;
|
||||
videolink = `<a href="${embedded_url}?referer=t66y.com">点击观看完整视频</a>`;
|
||||
const preview_url = videos[0].preview_url;
|
||||
if (videos[0].hasOwnProperty('preview_video_url')) {
|
||||
// 获取预览视频地址
|
||||
const preview_video_url = videos[0].preview_video_url;
|
||||
videoplayer = `<video controls="controls" poster="${preview_url}?referer=t66y.com" src="${preview_video_url}?referer=t66y.com"> </video>`;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// 无需处理
|
||||
}
|
||||
|
||||
const detail = { actresses, filmId, filmTime, filmLast, filmEstabName, filmMakerbName, seriesName, directorName, code, screenData, magnetlinks, videoplayer, videolink };
|
||||
return detail;
|
||||
});
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getWesternDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { gid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getWesternDomain(ctx)}/genre/${gid}`, ctx);
|
||||
};
|
||||
@@ -1,5 +0,0 @@
|
||||
const { getPage, getWesternDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
ctx.state.data = await getPage(getWesternDomain(ctx), ctx);
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getWesternDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { seriesid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getWesternDomain(ctx)}/series/${seriesid}`, ctx);
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
const { getPage, getWesternDomain } = require('../util');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const { sid } = ctx.params;
|
||||
|
||||
ctx.state.data = await getPage(`${getWesternDomain(ctx)}/star/${sid}`, ctx);
|
||||
};
|
||||
Reference in New Issue
Block a user