From d725bb0240af11ee2352b9532c0524b6729e8c34 Mon Sep 17 00:00:00 2001 From: Adam Kemish <49228220+Soopyboo32@users.noreply.github.com> Date: Mon, 4 Nov 2024 23:35:10 +0800 Subject: [PATCH] Add mvlempyr (#1292) * Add mvlempyr * only return results for search page if page exists * Add search functionality to mvlempyr --- .gitignore | 1 + proxy_server.js | 43 ++++- public/static/src/en/mvlempyr/icon.png | Bin 0 -> 16920 bytes src/plugins/english/mvlempyr.ts | 243 +++++++++++++++++++++++++ 4 files changed, 280 insertions(+), 7 deletions(-) create mode 100644 public/static/src/en/mvlempyr/icon.png create mode 100644 src/plugins/english/mvlempyr.ts diff --git a/.gitignore b/.gitignore index fd49400..7a076a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules .vscode +.idea .env config.json diff --git a/proxy_server.js b/proxy_server.js index 624442d..f532512 100644 --- a/proxy_server.js +++ b/proxy_server.js @@ -3,6 +3,7 @@ import httpProxy from 'http-proxy'; const CLIENT_HOST = 'http://localhost:3000'; const proxy = httpProxy.createProxyServer({}); +const temp_cookie_fix = false; //NOTE: this may break other things, but better than nothing const disAllowedRequestHeaders = [ 'sec-ch-ua', @@ -29,11 +30,35 @@ headers:`, console.log('\t', '\x1b[32m', name + ':', '\x1b[37m', value); }); console.log('\x1b[36m', '----------------'); - proxy.web(req, res, { - target: _url.origin, - selfHandleResponse: true, - followRedirects: true, - }); + if (temp_cookie_fix) { + fetch(_url.href, { + 'headers': { + 'cookie': temp_cookies, + 'origin': req.headers.origin2, + 'user-agent': req.headers['user-agent'], + }, + }) + .then(res2 => res2.text()) + .then(res2 => { + res.writeHead(200, { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': true, + }); + res.write(res2); + res.end(); + }) + .catch(err => { + console.error(err); + res.statusCode = 500; + res.end(); + }); + } else { + proxy.web(req, res, { + target: _url.origin, + selfHandleResponse: true, + followRedirects: true, + }); + } }; proxy.on('proxyRes', function (proxyRes, req, res) { @@ -87,8 +112,8 @@ const cookiesHandler = (req, res) => { let cookies = ''; res.setHeader('Access-Control-Allow-Origin', CLIENT_HOST); res.setHeader('Access-Control-Allow-Credentials', true); - req.on('readable', () => { - cookies += req.read(); + req.on('data', chunk => { + cookies += chunk; }); req.on('end', () => { temp_cookies = cookies; @@ -134,6 +159,10 @@ http req.url = _url.toString(); res.statusCode = 200; if (req.method === 'OPTIONS') { + res.writeHead(200, { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Credentials': true, + }); res.end(); } else { proxyRequest(req, res); diff --git a/public/static/src/en/mvlempyr/icon.png b/public/static/src/en/mvlempyr/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8e95f46c97a8c0fa2b4b7feb18307bcf08bc584e GIT binary patch literal 16920 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 + _chapSite = 'https://chp.mvlempyr.com/'; + _assetsSite = 'https://assets.mvlempyr.com/'; + _allNovels: WPData[] | undefined; + + checkCaptcha(loadedCheerio: CheerioAPI) { + const title = loadedCheerio('title').text(); + if ( + title === 'Attention Required! | Cloudflare' || + title === 'Just a moment...' + ) + throw new Error('Captcha error, please open in webview'); + } + + parseNovels( + loadedCheerio: CheerioAPI, + nextPageConsumer: (nextPage: string) => void, + ) { + this.checkCaptcha(loadedCheerio); + + const nextPage = loadedCheerio('a.w-pagination-next.next').attr('href'); + if (nextPage) nextPageConsumer(nextPage); + + return loadedCheerio('.novelcolumn') + .map((i, el) => { + return { + name: parseHTML(el)('h2[fs-cmsfilter-field="name"]').text(), + path: parseHTML(el)('a').attr('href')!.replace(/^\//, ''), + cover: parseHTML(el)('img').attr('src'), + }; + }) + .toArray(); + } + + async popularNovels(pageNo: number): Promise { + let pageQuery = ''; + if (pageNo > 1) { + const query = this._pageCache.get('popularnovels-' + pageNo); + if (query) { + pageQuery += query; + } else { + return []; + } + } + + return await this.parseNovelListPage( + `${this.site}novels${pageQuery}`, + nextPage => + this._pageCache.set('popularnovels-' + (pageNo + 1), nextPage), + ); + } + + async parseNovelListPage( + url: string, + nextPageConsumer: (nextPage: string) => void, + ): Promise { + const result = await fetchApi(url); + const body = await result.text(); + + const loadedCheerio = parseHTML(body); + return this.parseNovels(loadedCheerio, nextPageConsumer); + } + + async parseNovel(novelPath: string): Promise { + const url = this.site + novelPath; + const result = await fetchApi(url); + const body = await result.text(); + + const loadedCheerio = parseHTML(body); + + this.checkCaptcha(loadedCheerio); + + const code = loadedCheerio('#novel-code').text(); + const tags = ( + await fetchApi(this._chapSite + 'wp-json/wp/v2/tags?slug=' + code, { + headers: { + origin2: this.site.replace(/\/$/, ''), + origin: this.site.replace(/\/$/, ''), + }, + }).then(res => res.json()) + )[0]; + + const posts = ( + await Promise.all( + new Array(Math.ceil(tags.count / 500)) + .fill(0) + .map((_, i) => i + 1) + .map(page => + fetchApi( + this._chapSite + + 'wp-json/wp/v2/posts?tags=' + + tags.id + + '&per_page=500&page=' + + page, + { + headers: { + // origin2: this.site.replace(/\/$/, ''), + origin: this.site.replace(/\/$/, ''), + }, + }, + ).then(res => res.json()), + ), + ) + ) + .flat() + .sort((a, b) => a.acf.chapter_number - b.acf.chapter_number); + + return { + path: novelPath, + name: + loadedCheerio('div.image-container.w-embed > img').attr('alt') || + 'Untitled', + cover: loadedCheerio('div.image-container.w-embed > img').attr('src'), + summary: loadedCheerio('div.synopsis.w-richtext').text().trim(), + chapters: posts.map(chap => ({ + name: chap.acf.ch_name, + path: 'chapter/' + chap.acf.novel_code + '-' + chap.acf.chapter_number, + date: chap.date, + chapterNumber: chap.acf.chapter_number, + })), + status: loadedCheerio('div.novelstatustextmedium').text(), + author: loadedCheerio('div.mobileauthorname').text(), + genres: loadedCheerio('div.novelgenre.mobile > div > div > a > div') + .map((i, el) => loadedCheerio(el).text()) + .toArray() + .join(','), + }; + } + + async parseChapter(chapterPath: string): Promise { + const result = await fetchApi(this.site + chapterPath); + const body = await result.text(); + + const loadedCheerio = parseHTML(body); + this.checkCaptcha(loadedCheerio); + + return loadedCheerio('#chapter').html() || ''; + } + + async searchNovels( + searchTerm: string, + page: number, + ): Promise { + if (page > 1) return []; + + const allNovels = await this.getAllNovels(); + const searchResults = allNovels.filter(novel => + novel.description.toLowerCase().includes(searchTerm.toLowerCase()), + ); + + return searchResults.map(novel => ({ + name: novel.description, + path: 'novel/' + novel.description.replace(/\s/g, '-').toLowerCase(), + cover: this._assetsSite + 'images/600/' + novel.name + '.webp', + })); + } + + async getAllNovels() { + if (this._allNovels) { + return this._allNovels; + } + this._allNovels = await this.loadAll(); + return this._allNovels; + } + + async loadAll() { + const ret: WPData[] = []; + let page = 1; + // eslint-disable-next-line no-constant-condition + while (true) { + const pages = await this.loadNPages(page, 5); + page += 5; + + pages.forEach(page => { + ret.push(...page); + }); + + if (pages[pages.length - 1].length < 100) { + break; + } + } + return ret; + } + + async loadPage(page: number): Promise { + const data = await fetch( + `https://chp.mvlempyr.com/wp-json/wp/v2/tags?per_page=100&page=${page}`, + { + 'headers': { + 'origin': 'https://www.mvlempyr.com/', + }, + }, + ); + + //filter out unneeded parts of the object to reduce memory usage + return (await data.json()).map( + ({ + id, + description, + name, + }: { + id: number; + description: string; + name: string; + }) => ({ + id, + description, + name, + }), + ); + } + + async loadNPages(startingPage: number, pageCount: number) { + return await Promise.all( + Array.from({ length: pageCount }, (_, i) => + this.loadPage(startingPage + i), + ), + ); + } +} + +type WPData = { + id: number; + name: string; + description: string; +}; + +export default new MVLEMPYRPlugin();