FIx mvlempyr (#1595)

* FIx mvlempyr

* Fix chapter ordering

* Proxy all headers
This commit is contained in:
Soopyboo32
2025-03-25 22:19:23 +08:00
committed by GitHub
parent ade1efa2e7
commit 8c38022d07
2 changed files with 61 additions and 26 deletions
+16 -5
View File
@@ -18,7 +18,13 @@ const settings: ServerSetting = {
'sec-fetch-dest', 'sec-fetch-dest',
'pragma', 'pragma',
], ],
disAllowResponseHeaders: ['link', 'set-cookie', 'set-cookie2'], disAllowResponseHeaders: [
'link',
'set-cookie',
'set-cookie2',
'content-encoding',
'content-length',
],
useUserAgent: true, useUserAgent: true,
}; };
@@ -160,10 +166,15 @@ const proxyRequest: Connect.SimpleHandleFunction = (req, res) => {
fetch(_url.href, { fetch(_url.href, {
headers: headers, headers: headers,
}) })
.then(res2 => res2.text()) .then(async res2 => [res2, await res2.text()] as const)
.then(res2 => { .then(([res2, text]) => {
res.statusCode = 200; res.statusCode = res2.status;
res.write(res2); res2.headers.forEach((val, key) => {
if (!settings.disAllowResponseHeaders.includes(key)) {
res.setHeader(key, val);
}
});
res.write(text);
res.end(); res.end();
}) })
.catch(err => { .catch(err => {
+45 -21
View File
@@ -29,9 +29,9 @@ class MVLEMPYRPlugin implements Plugin.PluginBase {
name = 'MVLEMPYR'; name = 'MVLEMPYR';
icon = 'src/en/mvlempyr/icon.png'; icon = 'src/en/mvlempyr/icon.png';
site = 'https://www.mvlempyr.com/'; site = 'https://www.mvlempyr.com/';
version = '1.0.5'; version = '1.0.6';
_chapSite = 'https://chp.mvlempyr.net/'; _chapSite = 'https://chap.mvlempyr.net/';
_allNovels: (Plugin.NovelItem & ExtraNovelData)[] | undefined; _allNovels: (Plugin.NovelItem & ExtraNovelData)[] | undefined;
_allNovelsPromise: Promise<(Plugin.NovelItem & ExtraNovelData)[]> | undefined; _allNovelsPromise: Promise<(Plugin.NovelItem & ExtraNovelData)[]> | undefined;
@@ -294,6 +294,19 @@ class MVLEMPYRPlugin implements Plugin.PluginBase {
return this.parseNovels(loadedCheerio, nextPageConsumer); return this.parseNovels(loadedCheerio, nextPageConsumer);
} }
convertNovelId(e: bigint) {
let t = 1999999997n;
let u = 1n,
c = 7n % t,
d = e;
for (
;
d > 0;
(1n & d) === 1n && (u = (u * c) % t), c = (c * c) % t, d >>= 1n
);
return u;
}
async parseNovel(novelPath: string): Promise<Plugin.SourceNovel> { async parseNovel(novelPath: string): Promise<Plugin.SourceNovel> {
const url = this.site + novelPath; const url = this.site + novelPath;
const result = await fetchApi(url); const result = await fetchApi(url);
@@ -304,39 +317,47 @@ class MVLEMPYRPlugin implements Plugin.PluginBase {
this.checkCaptcha(loadedCheerio); this.checkCaptcha(loadedCheerio);
const code = loadedCheerio('#novel-code').text(); const code = loadedCheerio('#novel-code').text();
const tags = ( const newNovelId = this.convertNovelId(BigInt(parseInt(code)));
await fetchApi(this._chapSite + 'wp-json/wp/v2/tags?slug=' + code, { const firstPostsReq = await fetchApi(
this._chapSite +
'wp-json/wp/v2/posts?tags=' +
newNovelId +
'&per_page=500&page=1',
{
headers: { headers: {
origin2: this.site.replace(/\/$/, ''), origin2: this.site.replace(/\/$/, ''),
origin: this.site.replace(/\/$/, ''), origin: this.site.replace(/\/$/, ''),
Referer: 'https://www.mvlempyr.com/',
}, },
}).then(res => res.json()) },
)[0]; );
const posts = ( const pages = parseInt(firstPostsReq.headers.get('x-wp-totalpages'));
await Promise.all(
new Array(Math.ceil(tags.count / 500)) const posts = [
await firstPostsReq.json(),
...(await Promise.all(
new Array(pages - 1)
.fill(0) .fill(0)
.map((_, i) => i + 1) .map((_, i) => i + 2)
.map(page => .map(page =>
fetchApi( fetchApi(
this._chapSite + this._chapSite +
'wp-json/wp/v2/posts?tags=' + 'wp-json/wp/v2/posts?tags=' +
tags.id + newNovelId +
'&per_page=500&page=' + '&per_page=500&page=' +
page, page,
{ {
headers: { headers: {
origin2: this.site.replace(/\/$/, ''), origin2: this.site.replace(/\/$/, ''),
origin: this.site.replace(/\/$/, ''), origin: this.site.replace(/\/$/, ''),
Referer: 'https://www.mvlempyr.com/',
}, },
}, },
).then(res => res.json()), ).then(res => res.json()),
), ),
) )),
) ].flat();
.flat()
.sort((a, b) => a.acf.chapter_number - b.acf.chapter_number);
return { return {
path: novelPath, path: novelPath,
@@ -350,12 +371,15 @@ class MVLEMPYRPlugin implements Plugin.PluginBase {
summary: loadedCheerio('.novelpaewrapper div.synopsis.w-richtext') summary: loadedCheerio('.novelpaewrapper div.synopsis.w-richtext')
.text() .text()
.trim(), .trim(),
chapters: posts.map(chap => ({ chapters: posts
name: chap.acf.ch_name, .map(chap => ({
path: 'chapter/' + chap.acf.novel_code + '-' + chap.acf.chapter_number, name: chap.acf.ch_name,
releaseTime: chap.date, path:
chapterNumber: chap.acf.chapter_number, 'chapter/' + chap.acf.novel_code + '-' + chap.acf.chapter_number,
})), releaseTime: chap.date,
chapterNumber: chap.acf.chapter_number,
}))
.reverse(),
status: loadedCheerio( status: loadedCheerio(
'.novelpaewrapper div.novelstatustextmedium', '.novelpaewrapper div.novelstatustextmedium',
).text(), ).text(),