Refactor webtoons search logic and add filter options

This commit is contained in:
xMohnad
2025-06-15 09:06:43 +03:00
parent ace25549b5
commit a050513224

View File

@@ -25,36 +25,11 @@ class DefaultExtension extends MProvider {
}; };
} }
async getItem(url, selector) {
const res = await new Client().get(this.source.baseUrl + url, this.headers);
const doc = new Document(res.body);
const mangas = [];
const elements = doc.select(selector);
for (const element of elements) {
const linkElement = element.selectFirst("a");
const imageElement = linkElement.selectFirst("img");
const imageUrl = imageElement.attr("src");
const name = element.selectFirst("p.subj").text;
const link = linkElement.attr("href");
const genre = [];
if (element.selectFirst("p.genre").text === "") {
genre.push(element.selectFirst("span.genre").text);
} else {
genre.push(element.selectFirst("p.genre").text);
}
mangas.push({
name: name,
imageUrl: imageUrl,
link: link,
genre: genre,
});
}
return mangas;
}
mangaFromElement(doc) { mangaFromElement(doc) {
const list = []; const list = [];
for (const el of doc.select(`div.webtoon_list_wrap li a`)) { for (const el of doc.select(
`div.webtoon_list_wrap li a, ul.webtoon_list li a`,
)) {
const imageUrl = el.selectFirst("img").getSrc; const imageUrl = el.selectFirst("img").getSrc;
const name = el.selectFirst("strong.title").text; const name = el.selectFirst("strong.title").text;
const link = el.getHref; const link = el.getHref;
@@ -91,41 +66,24 @@ class DefaultExtension extends MProvider {
} }
async search(query, page, filters) { async search(query, page, filters) {
let keyword = query.trim().replace(/\s+/g, "+"); const keyword = query.trim().replace(/\s+/g, "+");
let hasNextPage = true; const baseurl = this.source.baseUrl;
let type_originals = "WEBTOON"; let url = `${baseurl}/${this.langCode()}`;
let type_canvas = "CHALLENGE";
let fetch_originals = "ul.card_lst li";
let fetch_canvas = "div.challenge_lst.search li";
let list_originals = [];
let list_canvas = [];
let list = [];
if (query !== "") { if (query !== "") {
list_originals = await this.getItem( url += `/search/${filters[0].values[filters[0].state].value}?keyword=${keyword}&page=${page}`;
`/${this.langCode()}/search?keyword=${keyword}&searchType=` + } else if (filters) {
type_originals + url += `/genres/${filters[2].values[filters[2].state].value}`;
`&page=${page}`,
fetch_originals,
);
list_canvas = await this.getItem(
`/${this.langCode()}/search?keyword=${keyword}&searchType=` +
type_canvas +
`&page=${page}`,
fetch_canvas,
);
if (filters) {
}
list = list_originals.concat(list_canvas);
} else {
} }
if (list.length === 0) { const res = await new Client().get(url);
hasNextPage = false; const doc = new Document(res.body);
} const list = this.mangaFromElement(doc);
const hasNextPage = list.length !== 0;
return { return {
list: list, list,
hasNextPage: hasNextPage, hasNextPage,
}; };
} }
@@ -339,6 +297,23 @@ class DefaultExtension extends MProvider {
getFilterList() { getFilterList() {
return [ return [
{
type: "searchType",
name: "Search Type",
type_name: "SelectFilter",
values: [
{
type_name: "SelectOption",
name: "Originals",
value: "originals",
},
{
type_name: "SelectOption",
name: "Canvas",
value: "canvas",
},
],
},
{ {
type: "sort", type: "sort",
name: "Official or Challenge", name: "Official or Challenge",