class mangapark { constructor() { this.baseUrl = "https://mangapark.net/apo"; this.type = "book-board"; this.mediaType = "manga"; this.version = "1.0" } async search(queryObj) { const query = queryObj.query; const res = await fetch(`${this.baseUrl}/`, { method: "POST", headers: { "accept": "*/*", "content-type": "application/json", "x-apollo-operation-name": "get_searchComic", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }, body: JSON.stringify({ query: "query get_searchComic($select: SearchComic_Select) { get_searchComic(select: $select) { reqPage reqSize reqSort reqWord newPage paging { total pages page init size skip limit prev next } items { id data { id dbStatus name origLang tranLang urlPath urlCover600 urlCoverOri genres altNames authors artists is_hot is_new sfw_result score_val follows reviews comments_total max_chapterNode { id data { id dateCreate dbStatus isFinal sfw_result dname urlPath is_new userId userNode { id data { id name uniq avatarUrl urlPath } } } } } sser_follow sser_lastReadChap { date chapterNode { id data { id dbStatus isFinal sfw_result dname urlPath is_new userId userNode { id data { id name uniq avatarUrl urlPath } } } } } } } }", variables: { select: { word: query, size: 10, page: 1, sortby: "field_score" } } }) }); const data = await res.json(); if (!data.data || !data.data.get_searchComic || !data.data.get_searchComic.items) { return []; } return data.data.get_searchComic.items.map(m => ({ id: m.data.urlPath.split('/title/')[1]?.split('-')[0] || mangaId.split('/comic/')[1]?.split('-')[0], // This identifies the book title: m.data.name, image: `https://mangapark.net/${m.data.urlCoverOri}`, rating: m.data.score_val ? Math.round(m.data.score_val * 10) : null, type: "book", headers: { referer: "https://mangapark.net" } })); } async getMetadata(id) { const res = await fetch(`https://mangapark.net/title/${id}`); const html = await res.text(); const match = html.match( /