Skip to content

Commit d648da5

Browse files
authored
fix(route/javtrailers): replace ofetch with puppeteer for API requests (#21055)
1 parent dc68ecb commit d648da5

File tree

4 files changed

+44
-22
lines changed

4 files changed

+44
-22
lines changed

lib/routes/javtrailers/casts.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import type { Route } from '@/types';
22
import cache from '@/utils/cache';
3-
import ofetch from '@/utils/ofetch';
3+
import puppeteer from '@/utils/puppeteer';
44

5-
import { baseUrl, getItem, headers, parseList } from './utils';
5+
import { baseUrl, getItem, parseList, puppeteerFetch } from './utils';
66

77
export const route: Route = {
88
path: '/casts/:cast',
@@ -20,19 +20,21 @@ export const route: Route = {
2020
handler,
2121
features: {
2222
nsfw: true,
23+
requirePuppeteer: true,
2324
},
2425
};
2526

2627
async function handler(ctx) {
2728
const { cast } = ctx.req.param();
2829

29-
const response = await ofetch(`${baseUrl}/api/casts/${cast}?page=0`, {
30-
headers,
31-
});
30+
const browser = await puppeteer();
31+
const response = await puppeteerFetch(`${baseUrl}/api/casts/${cast}?page=0`, browser);
3232

3333
const list = parseList(response.videos);
3434

35-
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));
35+
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item, browser))));
36+
37+
await browser.close();
3638

3739
return {
3840
title: `Watch ${response.cast.name} Jav Online | Japanese Adult Video - JavTrailers.com`,

lib/routes/javtrailers/categories.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import type { Route } from '@/types';
22
import cache from '@/utils/cache';
3-
import ofetch from '@/utils/ofetch';
3+
import puppeteer from '@/utils/puppeteer';
44

5-
import { baseUrl, getItem, headers, parseList } from './utils';
5+
import { baseUrl, getItem, parseList, puppeteerFetch } from './utils';
66

77
export const route: Route = {
88
path: '/categories/:category',
@@ -20,19 +20,21 @@ export const route: Route = {
2020
handler,
2121
features: {
2222
nsfw: true,
23+
requirePuppeteer: true,
2324
},
2425
};
2526

2627
async function handler(ctx) {
2728
const { category } = ctx.req.param();
2829

29-
const response = await ofetch(`${baseUrl}/api/categories/${category}?page=0`, {
30-
headers,
31-
});
30+
const browser = await puppeteer();
31+
const response = await puppeteerFetch(`${baseUrl}/api/categories/${category}?page=0`, browser);
3232

3333
const list = parseList(response.videos);
3434

35-
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));
35+
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item, browser))));
36+
37+
await browser.close();
3638

3739
return {
3840
title: `Watch ${response.category.name} Jav Online | Japanese Adult Video - JavTrailers.com`,

lib/routes/javtrailers/studios.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import type { Route } from '@/types';
22
import cache from '@/utils/cache';
3-
import ofetch from '@/utils/ofetch';
3+
import puppeteer from '@/utils/puppeteer';
44

5-
import { baseUrl, getItem, headers, parseList } from './utils';
5+
import { baseUrl, getItem, parseList, puppeteerFetch } from './utils';
66

77
export const route: Route = {
88
path: '/studios/:studio',
@@ -19,19 +19,21 @@ export const route: Route = {
1919
handler,
2020
features: {
2121
nsfw: true,
22+
requirePuppeteer: true,
2223
},
2324
};
2425

2526
async function handler(ctx) {
2627
const { studio } = ctx.req.param();
2728

28-
const response = await ofetch(`${baseUrl}/api/studios/${studio}?page=0`, {
29-
headers,
30-
});
29+
const browser = await puppeteer();
30+
const response = await puppeteerFetch(`${baseUrl}/api/studios/${studio}?page=0`, browser);
3131

3232
const list = parseList(response.videos);
3333

34-
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));
34+
const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item, browser))));
35+
36+
await browser.close();
3537

3638
return {
3739
title: `${response.studio.hotDvdIds?.join(' ') ?? response.studio.name} Jav Online | Japanese Adult Video - JavTrailers.com`,

lib/routes/javtrailers/utils.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import ofetch from '@/utils/ofetch';
1+
import logger from '@/utils/logger';
22
import { parseDate } from '@/utils/parse-date';
33

44
import { renderDescription } from './templates/description';
@@ -27,11 +27,27 @@ export const parseList = (videos) =>
2727
contentId: item.contentId,
2828
}));
2929

30-
export const getItem = async (item) => {
31-
const response = await ofetch(`${baseUrl}/api/video/${item.contentId}`, {
32-
headers,
30+
export const puppeteerFetch = async (url: string, browser) => {
31+
const page = await browser.newPage();
32+
await page.setExtraHTTPHeaders(headers);
33+
await page.setRequestInterception(true);
34+
page.on('request', (request) => {
35+
request.resourceType() === 'document' ? request.continue() : request.abort();
3336
});
3437

38+
logger.http(`Requesting ${url}`);
39+
await page.goto(url, { waitUntil: 'domcontentloaded' });
40+
41+
const apiResponse = await page.evaluate(() => document.body.textContent || '');
42+
const response = JSON.parse(apiResponse);
43+
await page.close();
44+
45+
return response;
46+
};
47+
48+
export const getItem = async (item, browser) => {
49+
const response = await puppeteerFetch(`${baseUrl}/api/video/${item.contentId}`, browser);
50+
3551
const videoInfo: Video = response.video;
3652
videoInfo.gallery = hdGallery(videoInfo.gallery);
3753

0 commit comments

Comments
 (0)