From 5bac2f3b47fd8e6a25ef206d5e380f643f402579 Mon Sep 17 00:00:00 2001 From: Adam Kemish <49228220+Soopyboo32@users.noreply.github.com> Date: Sun, 2 Feb 2025 16:42:53 +0800 Subject: [PATCH] Add chrysanthemumgarden (#1489) --- .../src/en/chrysanthemumgarden/icon.png | Bin 0 -> 2573 bytes src/plugins/english/chrysanthemumgarden.ts | 142 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 public/static/src/en/chrysanthemumgarden/icon.png create mode 100644 src/plugins/english/chrysanthemumgarden.ts diff --git a/public/static/src/en/chrysanthemumgarden/icon.png b/public/static/src/en/chrysanthemumgarden/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3543bf8a98c68c7e6bf702fb7e9d7aa13838d2 GIT binary patch literal 2573 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 Nn4!5r%}tl5{{>nz>, + ): Promise { + const req = await fetchApi( + this.site + (pageNo === 1 ? '/books' : '/books/page/' + pageNo) + '/', + ); + const body = await req.text(); + const loadedCheerio = loadCheerio(body); + return loadedCheerio('article') + .map((i, el) => { + if ( + loadedCheerio(el) + .find('div.series-genres > a') + .text() + .includes('Manhua') + ) + return; + return { + name: loadedCheerio(el).find('h2.novel-title > a').text(), + path: loadedCheerio(el) + .find('h2.novel-title > a') + .attr('href') + ?.replace(this.site, '') + .replace(/^\//, '') + .replace(/\/$/, ''), + cover: loadedCheerio(el) + .find('div.novel-cover > img') + .attr('data-breeze'), + }; + }) + .toArray() + .filter(Boolean); + } + + async parseNovel(novelPath: string): Promise { + const req = await fetchApi(this.site + '/' + novelPath + '/'); + const body = await req.text(); + const loadedCheerio = loadCheerio(body); + loadedCheerio('h1.novel-title > span.novel-raw-title').remove(); + const novel: Plugin.SourceNovel = { + path: novelPath, + name: loadedCheerio('h1.novel-title').text(), + cover: loadedCheerio('div.novel-cover > img').attr('data-breeze'), + summary: loadedCheerio('div.entry-content').text(), + }; + + novel.author = loadedCheerio('div.novel-info') + .html() + .match(/Author:\s*([^<]*)
/)?.[1] + .trim(); + novel.genres = [ + ...loadedCheerio('div.series-genres > a') + .map((i, el) => loadedCheerio(el).text()) + .toArray(), + ...loadedCheerio('a.series-tag') + .map((i, el) => loadedCheerio(el).text().split('(')[0].trim()) + .toArray(), + ].join(', '); + + novel.chapters = loadedCheerio('div.chapter-item > a').map((i, el) => { + return { + name: loadedCheerio(el).text().trim(), + path: loadedCheerio(el) + .attr('href') + ?.replace(this.site, '') + .replace(/^\//, '') + .replace(/\/$/, ''), + }; + }); + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const req = await fetchApi(this.site + '/' + chapterPath + '/'); + const body = await req.text(); + const loadedCheerio = loadCheerio(body); + + return loadedCheerio('div#novel-content').html() || ''; + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + return this.paginate( + (await this.getAllNovels()).filter(novel => + novel.name.toLowerCase().includes(searchTerm.toLowerCase()), + ), + pageNo, + ); + } + + paginate(data: T[], page: number): T[] { + const startIndex = (page - 1) * 20; + const endIndex = startIndex + 20; + return data.slice(startIndex, endIndex); + } + + allNovelsCache: { name: string; path: string; cover: string }[] | undefined; + + async getAllNovels() { + if (this.allNovelsCache) return this.allNovelsCache; + const req = await fetchApi(this.site + '/wp-json/melimeli/novels'); + const body = await req.json(); + this.allNovelsCache = body.map(novel => ({ + name: novel.name, + path: novel.link + .replace(this.site, '') + .replace(/\/$/, '') + .replace(/^\//, ''), + cover: defaultCover, + })); + return this.allNovelsCache; + } + + resolveUrl = (path: string, isNovel?: boolean) => + this.site + (isNovel ? '/book/' : '/chapter/') + path; +} + +export default new Chrysanthemumgarden();