Add faqwiki.us source (#791)
* Add Faqwiki.us source * Fix wrong class name
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
@@ -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<Plugin.NovelItem[]> {
|
||||||
|
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<Plugin.SourceNovel> {
|
||||||
|
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<string> {
|
||||||
|
const body = await fetchApi(chapterUrl).then((res) => res.text());
|
||||||
|
const loadedCheerio = parseHTML(body);
|
||||||
|
loadedCheerio("span").remove();
|
||||||
|
// Target only <p> 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<Plugin.NovelItem[]> {
|
||||||
|
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();
|
||||||
Reference in New Issue
Block a user