FIx mvlempyr (#1595)
* FIx mvlempyr * Fix chapter ordering * Proxy all headers
This commit is contained in:
@@ -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 => {
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user