From a673cd22dffa1a359fffffd5818d37a990b028de Mon Sep 17 00:00:00 2001 From: bregassa Date: Wed, 21 Feb 2024 16:14:40 +0700 Subject: [PATCH] Add faqwiki.us source (#791) * Add Faqwiki.us source * Fix wrong class name --- icons/src/en/faqwikius/icon.png | Bin 0 -> 3355 bytes plugins/english/faqwikius.ts | 120 ++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 icons/src/en/faqwikius/icon.png create mode 100644 plugins/english/faqwikius.ts diff --git a/icons/src/en/faqwikius/icon.png b/icons/src/en/faqwikius/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..30fbe21d36e057222e9be7515b577efee01246e7 GIT binary patch literal 3355 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 literal 0 HcmV?d00001 diff --git a/plugins/english/faqwikius.ts b/plugins/english/faqwikius.ts new file mode 100644 index 0000000..25b0699 --- /dev/null +++ b/plugins/english/faqwikius.ts @@ -0,0 +1,120 @@ +import { Plugin } from "@typings/plugin"; +import { fetchApi, fetchFile } from "@libs/fetch"; +import { NovelStatus } from "@libs/novelStatus"; +import { load as parseHTML } from "cheerio"; + +class FaqWikiUs implements Plugin.PluginBase { + id = "FWK.US"; + name = "Faq Wiki"; + site = "https://faqwiki.us/"; + version = "1.0.0"; + icon = "src/en/faqwikius/icon.png"; + + async popularNovels( + page: number, + { showLatestNovels }: Plugin.PopularNovelsOptions, + ): Promise { + const sort = showLatestNovels + ? "" + : ""; + + const body = await fetchApi(this.site + sort).then((res) => res.text()); + const loadedCheerio = parseHTML(body); + + const novels: Plugin.NovelItem[] = loadedCheerio(".wp-block-table > table > tbody > tr") + .map((index, element) => { + const name = loadedCheerio(element).find("strong").first().text(); + let cover = loadedCheerio(element).find("img").attr("data-ezsrc"); + + // Remove the appended query string + if (cover) { + cover = cover.replace(/\?ezimgfmt=.*$/, ''); // Regular expression magic! + } + + const url = "" + loadedCheerio(element).find("a").attr("href"); + + return { name, cover, url }; + }) + .get(); + + return novels; + } + + async parseNovelAndChapters(url: string): Promise { + const body = await fetchApi(url).then((res) => res.text()); + const loadedCheerio = parseHTML(body); + + const novel: Plugin.SourceNovel = { url }; + novel.name = loadedCheerio(".entry-title").text().replace("Novel – All Chapters", "").trim(); + + let cover = loadedCheerio(".wp-block-image").find("img").attr("data-ezsrc"); + + // Remove the appended query string + if (cover) { + cover = cover.replace(/\?ezimgfmt=.*$/, ''); // Regular expression magic! + } + novel.cover = cover; + + novel.summary = loadedCheerio(".book-review-block__meta-item-value").text().trim(); + + const chapters: Plugin.ChapterItem[] = loadedCheerio(".lcp_catlist > li > a") + .map((chapterIndex, element) => ({ + name: loadedCheerio(element).text().replace(novel.name + "", "").replace("Novel" + "", "").trim(), + url: ""+loadedCheerio(element).attr("href"), + releaseTime: null, + chapterNumber: chapterIndex + 1, + })) + .get(); + + novel.chapters = chapters; + return novel; + } + + async parseChapter(chapterUrl: string): Promise { + const body = await fetchApi(chapterUrl).then((res) => res.text()); + const loadedCheerio = parseHTML(body); + loadedCheerio("span").remove(); + // Target only

tags within .entry-content + const chapterParagraphs = loadedCheerio(".entry-content p"); + + // Extract text from individual paragraphs and join + const chapterText = chapterParagraphs.map((index, element) => { + return loadedCheerio(element).text().trim(); + }).get().join('\n\n'); // Add newlines between paragraphs + + return chapterText; + } + + async searchNovels( + searchTerm: string, + ): Promise { + const body = await fetchApi(this.site).then((res) => res.text()); + const loadedCheerio = parseHTML(body); + + const novels: Plugin.NovelItem[] = loadedCheerio(".wp-block-table > table > tbody > tr") + .map((index, element) => { + const name = loadedCheerio(element).find("strong").first().text(); + let cover = loadedCheerio(element).find("img").attr("data-ezsrc"); + + // Remove the appended query string + if (cover) { + cover = cover.replace(/\?ezimgfmt=.*$/, ''); // Regular expression magic! + } + + const url = "" + loadedCheerio(element).find("a").attr("href"); + + return { name, cover, url }; + }) + .get(); + + const normalizedQuery = searchTerm.toLowerCase(); + return novels.filter(novel => novel.name.toLowerCase().includes(normalizedQuery) + ); + + return novels; + } + + fetchImage = fetchFile; +} + +export default new FaqWikiUs();