Skip to content

Commit 27025d7

Browse files
committed
feat(nhentai): add Puppeteer support
1 parent d5721d4 commit 27025d7

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

lib/routes/nhentai/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const route: Route = {
1717
antiCrawler: true,
1818
supportBT: true,
1919
nsfw: true,
20+
requirePuppeteer: true,
2021
},
2122
radar: [
2223
{

lib/routes/nhentai/search.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const route: Route = {
1212
features: {
1313
antiCrawler: true,
1414
supportBT: true,
15+
requirePuppeteer: true,
1516
nsfw: true,
1617
},
1718
radar: [

lib/routes/nhentai/util.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { load } from 'cheerio';
22
import got from '@/utils/got';
3-
import ofetch from '@/utils/ofetch';
3+
import puppeteer from '@/utils/puppeteer';
44
import { config } from '@/config';
55
import { parseDate } from '@/utils/parse-date';
66
import { art } from '@/utils/render';
@@ -65,16 +65,23 @@ const getCookie = async (username, password, cache) => {
6565
return userTokenCookie;
6666
};
6767

68-
const oFetch = (url, ...options) =>
69-
ofetch(url, {
70-
...options,
71-
headers: {
72-
host: 'nhentai.net',
73-
},
68+
const puppeteerGet = async (url) => {
69+
const browser = await puppeteer();
70+
const page = await browser.newPage();
71+
await page.setRequestInterception(true);
72+
page.on('request', (request) => {
73+
request.resourceType() === 'document' ? request.continue() : request.abort();
7474
});
75+
await page.goto(url, {
76+
waitUntil: 'domcontentloaded',
77+
});
78+
const html = await page.evaluate(() => document.documentElement.innerHTML);
79+
await browser.close();
80+
return html;
81+
};
7582

7683
const getSimple = async (url) => {
77-
const data = await oFetch(url);
84+
const data = await puppeteerGet(url);
7885
const $ = load(data);
7986

8087
return $('.gallery a.cover')
@@ -103,6 +110,7 @@ const parseSimpleDetail = ($ele) => {
103110
const highResoThumbSrc = thumbSrc
104111
.replace('thumb', '1')
105112
.replace(/t(\d+)\.nhentai\.net/, 'i$1.nhentai.net')
113+
.replace(/\.(jpg|png|gif)\.webp$/, '.$1')
106114
.replace('.webp.webp', '.webp');
107115
return {
108116
title: $ele.children('.caption').text(),
@@ -113,17 +121,25 @@ const parseSimpleDetail = ($ele) => {
113121

114122
const getTorrent = async (simple, cookie) => {
115123
const { link } = simple;
116-
const response = await oFetch(link + 'download', { followRedirect: false, responseType: 'buffer', headers: { Cookie: cookie } });
124+
const browser = await puppeteer();
125+
const page = await browser.newPage();
126+
await page.setCookie(...cookie.split(';').map(c => {
127+
const [name, value] = c.trim().split('=');
128+
return { name, value, domain: 'nhentai.net' };
129+
}));
130+
const response = await page.goto(link + 'download', { waitUntil: 'networkidle2' });
131+
const buffer = await response.buffer();
132+
await browser.close();
117133
return {
118134
...simple,
119-
enclosure_url: response,
135+
enclosure_url: buffer,
120136
enclosure_type: 'application/x-bittorrent',
121137
};
122138
};
123139

124140
const getDetail = async (simple) => {
125141
const { link } = simple;
126-
const data = await oFetch(link);
142+
const data = await puppeteerGet(link);
127143
const $ = load(data);
128144

129145
const galleryImgs = $('.gallerythumb img')

0 commit comments

Comments
 (0)