From d6c137996432726bdaaab5db0437403ea1e66c4d Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 7 Jan 2025 00:32:42 +0100 Subject: [PATCH 1/3] + --- javascript/icon/en.wuxiaclick.png | Bin 0 -> 14403 bytes javascript/novel/src/en/wuxiaclick.js | 156 ++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 javascript/icon/en.wuxiaclick.png create mode 100644 javascript/novel/src/en/wuxiaclick.js diff --git a/javascript/icon/en.wuxiaclick.png b/javascript/icon/en.wuxiaclick.png new file mode 100644 index 0000000000000000000000000000000000000000..2da99a513dc96f6205aa97d03e3dd2e71e55efb6 GIT binary patch literal 14403 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 JPDHLkV1hk~&p-eG literal 0 HcmV?d00001 diff --git a/javascript/novel/src/en/wuxiaclick.js b/javascript/novel/src/en/wuxiaclick.js new file mode 100644 index 00000000..4fa8a6b1 --- /dev/null +++ b/javascript/novel/src/en/wuxiaclick.js @@ -0,0 +1,156 @@ +const mangayomiSources = [{ + "name": "WuxiaClick", + "lang": "en", + "baseUrl": "https://wuxia.click", + "apiUrl": "", + "iconUrl": + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.wuxiaclick.png", + "typeSource": "single", + "itemType": 2, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "novel/src/en/wuxiaclick.js", + "appMinVerReq": "0.4.0", + "isNsfw": false, + "hasCloudflare": false + }]; + + class DefaultExtension extends MProvider { + getHeaders(url) { + throw new Error("getHeaders not implemented"); + } + + mangaListFromPage(res) { + const doc = new Document(res.body); + const mangaElements = doc.select("div.page-item-detail"); + const list = []; + for (const element of mangaElements) { + const name = element.selectFirst(".item-thumb > a").attr("title"); + const link = element.selectFirst(".item-thumb > a").getHref; + const imageUrl = element.selectFirst("img").getSrc; + list.push({ name, imageUrl, link }); + } + const hasNextPage = + doc.selectFirst("nav > div.nav-links > a").text?.includes("Posts") ?? false; + return { list: list, hasNextPage }; + } + + toStatus(status) { + if (status.includes("OnGoing")) return 0; + else if (status.includes("Completed")) return 1; + else if (status.includes("Hiatus")) return 2; + else if (status.includes("Dropped")) return 3; + else return 5; + } + + async getPopular(page) { + const res = await new Client().get( + `${this.source.baseUrl}/manga-genre/novel/page/${page}/?m_orderby=trending`, + ); + return this.mangaListFromPage(res); + } + + async getLatestUpdates(page) { + const res = await new Client().get( + `${this.source.baseUrl}/manga-genre/novel/page/${page}/?m_orderby=latest`, + ); + return this.mangaListFromPage(res); + } + + async search(query, page, filters) { + let url = `${this.source.baseUrl}/?s=${query}`; + const res = await new Client().get(url); + return this.mangaListFromPage(res); + } + + async getDetail(url) { + const client = new Client(); + const res = await client.get(url); + const doc = new Document(res.body); + const imageUrl = doc.selectFirst("div.summary_image > a > img")?.getSrc; + const description = doc.select("div.summary__content > p > span").map((el) => el.text).join(" "); + const author = doc.selectFirst("div.author-content > a")?.text.trim(); + const artist = doc.selectFirst("div.artist-content > a")?.text.trim(); + const status = this.toStatus(doc.selectFirst("div.post-status > div.post-content_item > div.summary-content")?.text.trim()); + const tags = doc.select("div.summary-content > div.tags-content > a").map((el) => el.text.trim()); + let genre = doc.select("div.summary-content > div.genres-content > a").map((el) => el.text.trim()); + if (tags.length != 0) { + genre.push(tags); + } + + const chapters = []; + const chapterRes = await client.post(`${url}ajax/chapters/`, { + Priority: "u=0, i", + "Origin": this.source.baseUrl, + "Referer": url, + }); + const chapterDoc = new Document(chapterRes.body); + + const chapterElements = chapterDoc.select("li.free-chap"); + for (const el of chapterElements) { + let chapterName = el.selectFirst("a")?.text.trim(); + const chapterUrl = el.selectFirst("a").getHref; + let dateUpload; + try { + dateUpload = this.parseDate(el.selectFirst("span.chapter-release-date > i")?.text.trim()); + } catch (_) { + dateUpload = null; + } + chapters.push({ + name: chapterName, + url: chapterUrl, + dateUpload: dateUpload, + scanlator: null, + }); + } + + chapters.reverse(); + + return { + imageUrl, + description, + genre, + author, + artist, + status, + chapters, + }; + } + + async getHtmlContent(url) { + const client = await new Client(); + const res = await client.get(url); + const doc = new Document(res.body); + const title = + doc.selectFirst("#chapter-heading")?.text.trim() || + ""; + const content = doc.selectFirst(".entry-content")?.innerHtml; + return `

${title}



${content}`; + } + + getFilterList() { + return []; + } + + getSourcePreferences() { + throw new Error("getSourcePreferences not implemented"); + } + + parseDate(date) { + const months = { + "January": "01", "February": "02", "March": "03", "April": "04", "May": "05", "June": "06", + "July": "07", "August": "08", "September": "09", "October": "10", "November": "11", "December": "12" + }; + date = date.toLowerCase().replace(",", "").split(" "); + + if (!(date[0] in months)) { + return String(new Date().valueOf()) + } + + date[0] = months[date[0]]; + date = [date[2], date[0], date[1]]; + date = date.join("-"); + return String(new Date(date).valueOf()); + } + } From ff476e6ba9800fccda2f1657720b5ac62b722ddc Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 7 Jan 2025 15:55:02 +0100 Subject: [PATCH 2/3] + --- javascript/novel/src/en/wuxiaclick.js | 296 +++++++++++++------------- 1 file changed, 143 insertions(+), 153 deletions(-) diff --git a/javascript/novel/src/en/wuxiaclick.js b/javascript/novel/src/en/wuxiaclick.js index 4fa8a6b1..8d03ef4a 100644 --- a/javascript/novel/src/en/wuxiaclick.js +++ b/javascript/novel/src/en/wuxiaclick.js @@ -1,156 +1,146 @@ const mangayomiSources = [{ - "name": "WuxiaClick", - "lang": "en", - "baseUrl": "https://wuxia.click", - "apiUrl": "", - "iconUrl": - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.wuxiaclick.png", - "typeSource": "single", - "itemType": 2, - "version": "0.0.1", - "dateFormat": "", - "dateFormatLocale": "", - "pkgPath": "novel/src/en/wuxiaclick.js", - "appMinVerReq": "0.4.0", - "isNsfw": false, - "hasCloudflare": false - }]; - - class DefaultExtension extends MProvider { - getHeaders(url) { - throw new Error("getHeaders not implemented"); - } - - mangaListFromPage(res) { - const doc = new Document(res.body); - const mangaElements = doc.select("div.page-item-detail"); - const list = []; - for (const element of mangaElements) { - const name = element.selectFirst(".item-thumb > a").attr("title"); - const link = element.selectFirst(".item-thumb > a").getHref; - const imageUrl = element.selectFirst("img").getSrc; - list.push({ name, imageUrl, link }); - } - const hasNextPage = - doc.selectFirst("nav > div.nav-links > a").text?.includes("Posts") ?? false; - return { list: list, hasNextPage }; - } - - toStatus(status) { - if (status.includes("OnGoing")) return 0; - else if (status.includes("Completed")) return 1; - else if (status.includes("Hiatus")) return 2; - else if (status.includes("Dropped")) return 3; - else return 5; - } - - async getPopular(page) { - const res = await new Client().get( - `${this.source.baseUrl}/manga-genre/novel/page/${page}/?m_orderby=trending`, - ); - return this.mangaListFromPage(res); - } - - async getLatestUpdates(page) { - const res = await new Client().get( - `${this.source.baseUrl}/manga-genre/novel/page/${page}/?m_orderby=latest`, - ); - return this.mangaListFromPage(res); - } - - async search(query, page, filters) { - let url = `${this.source.baseUrl}/?s=${query}`; - const res = await new Client().get(url); - return this.mangaListFromPage(res); - } - - async getDetail(url) { - const client = new Client(); - const res = await client.get(url); - const doc = new Document(res.body); - const imageUrl = doc.selectFirst("div.summary_image > a > img")?.getSrc; - const description = doc.select("div.summary__content > p > span").map((el) => el.text).join(" "); - const author = doc.selectFirst("div.author-content > a")?.text.trim(); - const artist = doc.selectFirst("div.artist-content > a")?.text.trim(); - const status = this.toStatus(doc.selectFirst("div.post-status > div.post-content_item > div.summary-content")?.text.trim()); - const tags = doc.select("div.summary-content > div.tags-content > a").map((el) => el.text.trim()); - let genre = doc.select("div.summary-content > div.genres-content > a").map((el) => el.text.trim()); - if (tags.length != 0) { - genre.push(tags); - } + "name": "WuxiaClick", + "lang": "en", + "baseUrl": "https://wuxia.click", + "apiUrl": "", + "iconUrl": + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.wuxiaclick.png", + "typeSource": "single", + "itemType": 2, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "novel/src/en/wuxiaclick.js", + "appMinVerReq": "0.4.0", + "isNsfw": false, + "hasCloudflare": false +}]; - const chapters = []; - const chapterRes = await client.post(`${url}ajax/chapters/`, { - Priority: "u=0, i", - "Origin": this.source.baseUrl, - "Referer": url, - }); - const chapterDoc = new Document(chapterRes.body); - - const chapterElements = chapterDoc.select("li.free-chap"); - for (const el of chapterElements) { - let chapterName = el.selectFirst("a")?.text.trim(); - const chapterUrl = el.selectFirst("a").getHref; - let dateUpload; - try { - dateUpload = this.parseDate(el.selectFirst("span.chapter-release-date > i")?.text.trim()); - } catch (_) { - dateUpload = null; - } - chapters.push({ - name: chapterName, - url: chapterUrl, - dateUpload: dateUpload, - scanlator: null, - }); - } - - chapters.reverse(); - - return { - imageUrl, - description, - genre, - author, - artist, - status, - chapters, - }; - } - - async getHtmlContent(url) { - const client = await new Client(); - const res = await client.get(url); - const doc = new Document(res.body); - const title = - doc.selectFirst("#chapter-heading")?.text.trim() || - ""; - const content = doc.selectFirst(".entry-content")?.innerHtml; - return `

${title}



${content}`; - } - - getFilterList() { - return []; - } - - getSourcePreferences() { - throw new Error("getSourcePreferences not implemented"); - } - - parseDate(date) { - const months = { - "January": "01", "February": "02", "March": "03", "April": "04", "May": "05", "June": "06", - "July": "07", "August": "08", "September": "09", "October": "10", "November": "11", "December": "12" - }; - date = date.toLowerCase().replace(",", "").split(" "); - - if (!(date[0] in months)) { - return String(new Date().valueOf()) - } - - date[0] = months[date[0]]; - date = [date[2], date[0], date[1]]; - date = date.join("-"); - return String(new Date(date).valueOf()); - } +class DefaultExtension extends MProvider { + getHeaders(url) { + throw new Error("getHeaders not implemented"); } + + mangaListFromPage(res) { + const doc = new Document(res.body); + const mangaElements = doc.select("div.mantine-grid-root > div.mantine-grid-col > div"); + const list = []; + for (const element of mangaElements) { + const name = element.selectFirst("a > div > div > div.mantine-Text-root")?.text.trim(); + const link = this.source.baseUrl + element.selectFirst("a").getHref; + const imageUrl = element.selectFirst("img").getSrc; + list.push({ name, imageUrl, link }); + } + const pagination = doc.select("button.mantine-y4zem1 > svg > path").map((el) => el.attr("d")); + const hasNextPage = pagination.length > 1 ? pagination[1].startsWith("M8") : false; + return { list: list, hasNextPage }; + } + + toStatus(status) { + if (status.includes("Ongoing")) return 0; + else if (status.includes("Completed")) return 1; + else if (status.includes("Hiatus")) return 2; + else if (status.includes("Dropped")) return 3; + else return 5; + } + + async getPopular(page) { + const res = await new Client().get( + `${this.source.baseUrl}/advance_search?order=-weekly_views&page=${page}`, + ); + return this.mangaListFromPage(res); + } + + async getLatestUpdates(page) { + const res = await new Client().get( + `${this.source.baseUrl}/advance_search?order=-created_at&page=${page}`, + ); + return this.mangaListFromPage(res); + } + + async search(query, page, filters) { + let url = `${this.source.baseUrl}/advance_search?order=&page=${page}&search=${encodeURI(query)}`; + const res = await new Client().get(url); + return this.mangaListFromPage(res); + } + + async getDetail(url) { + const client = new Client(); + const res = await client.get(url); + const doc = new Document(res.body); + const imageUrl = doc.selectFirst("figure > div > img")?.getSrc; + const description = doc.select("div.mantine-Spoiler-root > div > div > div.mantine-Text-root")?.text.trim(); + const author = doc.selectFirst("div.mantine-lqk3v2 > div")?.text.trim(); + const status = this.toStatus(doc.selectFirst("div.mantine-1uxmzbt > div.mantine-1huvzos")?.text.trim()); + const genre = doc.select("div.mantine-bl3g33 > div > a > div > div > span").map((el) => el.text.trim()); + + const chapterElements = doc.select("div.mantine-1x5ubwi > div"); + for (const el of chapterElements) { + let chapterName = el.selectFirst("div.mantine-Group-root > div > a > div > h4")?.text.trim(); + if (!chapterName) { + continue; + } + const chapterUrl = this.source.baseUrl + el.selectFirst("div.mantine-Group-root > div > a").getHref; + let dateUpload; + try { + dateUpload = this.parseDate(el.selectFirst("div > a > div > div > div.mantine-Text-root")?.text.trim()); + } catch (_) { + dateUpload = null; + } + chapters.push({ + name: chapterName, + url: chapterUrl, + dateUpload: dateUpload, + scanlator: null, + }); + } + + chapters.reverse(); + + return { + imageUrl, + description, + genre, + author, + artist, + status, + chapters, + }; + } + + async getHtmlContent(url) { + const client = await new Client(); + const res = await client.get(url); + const doc = new Document(res.body); + const title = + doc.selectFirst("div.mantine-Center-root > h1.mantine-Title-root")?.text.trim() || + ""; + const content = doc.select("div.mantine-Container-root > div.mantine-Paper-root > div")[2]?.innerHtml; + return `

${title}



${content}`; + } + + getFilterList() { + return []; + } + + getSourcePreferences() { + throw new Error("getSourcePreferences not implemented"); + } + + parseDate(date) { + const months = { + "January": "01", "February": "02", "March": "03", "April": "04", "May": "05", "June": "06", + "July": "07", "August": "08", "September": "09", "October": "10", "November": "11", "December": "12" + }; + date = date.toLowerCase().replace(",", "").split(" "); + + if (!(date[0] in months)) { + return String(new Date().valueOf()) + } + + date[0] = months[date[0]]; + date = [date[2], date[0], date[1]]; + date = date.join("-"); + return String(new Date(date).valueOf()); + } +} From d16374c57a5a1fc68b4c8ca06b97ee47c7b7ba05 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 7 Jan 2025 23:38:20 +0100 Subject: [PATCH 3/3] adjusted novel sources --- javascript/novel/src/en/novelupdates.js | 92 ++++++++++--------- javascript/novel/src/en/wordrain69.js | 10 +- .../novel/src/en => wip}/wuxiaclick.js | 6 +- 3 files changed, 60 insertions(+), 48 deletions(-) rename {javascript/novel/src/en => wip}/wuxiaclick.js (97%) diff --git a/javascript/novel/src/en/novelupdates.js b/javascript/novel/src/en/novelupdates.js index e83591c6..cca98911 100644 --- a/javascript/novel/src/en/novelupdates.js +++ b/javascript/novel/src/en/novelupdates.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.novelupdates.png", "typeSource": "single", "itemType": 2, - "version": "0.0.2", + "version": "0.0.3", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "novel/src/en/novelupdates.js", @@ -188,8 +188,13 @@ class DefaultExtension extends MProvider { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", }); - const doc = new Document(res.body); - const domain = res.body; + return await this.cleanHtmlContent(res.body); + } + + async cleanHtmlContent(html) { + const client = await new Client(); + const doc = new Document(html); + const domain = html; if (domain.includes("anotivereads")) { const title = @@ -424,50 +429,49 @@ class DefaultExtension extends MProvider { return e?.toLowerCase().includes("wordpress") || e?.toLowerCase().includes("site kit by google") }); - let title = - doc.selectFirst(".entry-title")?.text.trim() || - doc.selectFirst(".entry-title-main")?.text.trim() || - doc.selectFirst(".chapter__title")?.text.trim() || - doc.selectFirst(".sp-title")?.text.trim() || - doc.selectFirst(".title-content")?.text.trim() || - doc.selectFirst(".wp-block-post-title")?.text.trim() || - doc.selectFirst(".title_story")?.text.trim() || - doc.selectFirst(".active")?.text.trim() || - doc.selectFirst("head title")?.text.trim() || - doc.selectFirst("h1.leading-none ~ h2")?.text.trim() || - ""; - const subtitle = - doc.selectFirst(".cat-series")?.text.trim() || - doc.selectFirst("h1.leading-none ~ span")?.text.trim() || - ""; - if (subtitle && subtitle != "") { - title = subtitle; - } - const content = - doc.selectFirst(".rdminimal")?.innerHtml || - doc.selectFirst(".entry-content")?.innerHtml || - doc.selectFirst(".chapter__content")?.innerHtml || - doc.selectFirst(".prevent-select")?.innerHtml || - doc.selectFirst(".text_story")?.innerHtml || - doc.selectFirst(".contenta")?.innerHtml || - doc.selectFirst(".single_post")?.innerHtml || - doc.selectFirst(".post-entry")?.innerHtml || - doc.selectFirst(".main-content")?.innerHtml || - doc.selectFirst(".post-content")?.innerHtml || - doc.selectFirst(".content")?.innerHtml || - doc.selectFirst(".page-body")?.innerHtml || - doc.selectFirst(".td-page-content")?.innerHtml || - doc.selectFirst(".reader-content")?.innerHtml || - doc.selectFirst("#content")?.innerHtml || - doc.selectFirst("#the-content")?.innerHtml || - doc.selectFirst("article.post")?.innerHtml; - - if (isWordpress || domain.includes("etherreads") || domain.includes("soafp")) { - return `

${title}



${content}`; + doc.selectFirst(".entry-title")?.text.trim() || + doc.selectFirst(".entry-title-main")?.text.trim() || + doc.selectFirst(".chapter__title")?.text.trim() || + doc.selectFirst(".sp-title")?.text.trim() || + doc.selectFirst(".title-content")?.text.trim() || + doc.selectFirst(".wp-block-post-title")?.text.trim() || + doc.selectFirst(".title_story")?.text.trim() || + doc.selectFirst(".active")?.text.trim() || + doc.selectFirst("head title")?.text.trim() || + doc.selectFirst("h1.leading-none ~ h2")?.text.trim() || + ""; + const subtitle = + doc.selectFirst(".cat-series")?.text.trim() || + doc.selectFirst("h1.leading-none ~ span")?.text.trim() || + ""; + if (subtitle && subtitle != "") { + title = subtitle; } + const content = + doc.selectFirst(".rdminimal")?.innerHtml || + doc.selectFirst(".entry-content")?.innerHtml || + doc.selectFirst(".chapter__content")?.innerHtml || + doc.selectFirst(".prevent-select")?.innerHtml || + doc.selectFirst(".text_story")?.innerHtml || + doc.selectFirst(".contenta")?.innerHtml || + doc.selectFirst(".single_post")?.innerHtml || + doc.selectFirst(".post-entry")?.innerHtml || + doc.selectFirst(".main-content")?.innerHtml || + doc.selectFirst(".post-content")?.innerHtml || + doc.selectFirst(".content")?.innerHtml || + doc.selectFirst(".page-body")?.innerHtml || + doc.selectFirst(".td-page-content")?.innerHtml || + doc.selectFirst(".reader-content")?.innerHtml || + doc.selectFirst("#content")?.innerHtml || + doc.selectFirst("#the-content")?.innerHtml || + doc.selectFirst("article.post")?.innerHtml; - return `

Domain not supported yet. Content might not load properly!

+ if (isWordpress || domain.includes("etherreads") || domain.includes("soafp")) { + return `

${title}



${content}`; + } + + return `

Domain not supported yet. Content might not load properly!


${title}



${content}`; } diff --git a/javascript/novel/src/en/wordrain69.js b/javascript/novel/src/en/wordrain69.js index 80f2a996..d707c788 100644 --- a/javascript/novel/src/en/wordrain69.js +++ b/javascript/novel/src/en/wordrain69.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.wordrain69.png", "typeSource": "single", "itemType": 2, - "version": "0.0.1", + "version": "0.0.2", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "novel/src/en/wordrain69.js", @@ -117,11 +117,15 @@ const mangayomiSources = [{ chapters, }; } - + async getHtmlContent(url) { const client = await new Client(); const res = await client.get(url); - const doc = new Document(res.body); + return await this.cleanHtmlContent(res.body); + } + + async cleanHtmlContent(html) { + const doc = new Document(html); const title = doc.selectFirst("#chapter-heading")?.text.trim() || ""; diff --git a/javascript/novel/src/en/wuxiaclick.js b/wip/wuxiaclick.js similarity index 97% rename from javascript/novel/src/en/wuxiaclick.js rename to wip/wuxiaclick.js index 8d03ef4a..dc463839 100644 --- a/javascript/novel/src/en/wuxiaclick.js +++ b/wip/wuxiaclick.js @@ -111,7 +111,11 @@ class DefaultExtension extends MProvider { async getHtmlContent(url) { const client = await new Client(); const res = await client.get(url); - const doc = new Document(res.body); + return await this.cleanHtmlContent(res.body); + } + + async cleanHtmlContent(html) { + const doc = new Document(html); const title = doc.selectFirst("div.mantine-Center-root > h1.mantine-Title-root")?.text.trim() || "";