diff --git a/javascript/novel/src/en/novelupdates.js b/javascript/novel/src/en/novelupdates.js index 417a7f57..4ffa5999 100644 --- a/javascript/novel/src/en/novelupdates.js +++ b/javascript/novel/src/en/novelupdates.js @@ -34,6 +34,7 @@ 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.search_main_box_nu"); @@ -48,6 +49,7 @@ class DefaultExtension extends MProvider { doc.selectFirst("div.digg_pagination > a.next_page").text == " →"; return { list: list, hasNextPage }; } + toStatus(status) { if (status.includes("Ongoing")) return 0; else if (status.includes("Completed")) return 1; @@ -55,32 +57,6 @@ class DefaultExtension extends MProvider { else if (status.includes("Dropped")) return 3; else return 5; } - 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(/(st|nd|rd|th)/g, "") - .split(" "); - if (!(date[0] in months)) { - return String(new Date().valueOf()); - } - date[0] = months[date[0]]; - const formattedDate = `${date[2]}-${date[0]}-${date[1].padStart(2, "0")}`; // Format YYYY-MM-DD - return String(new Date(formattedDate).valueOf()); - } async getPopular(page) { const res = await new Client().get( @@ -97,11 +73,41 @@ class DefaultExtension extends MProvider { ); return this.mangaListFromPage(res); } + async search(query, page, filters) { - const res = await new Client().get( - `${this.source.baseUrl}/series-finder/?sf=1&sh=${query}&sort=sdate&order=desc&pg=${page}`, - this.headers - ); + let url = `${this.source.baseUrl}/series-finder/?sf=1&sh=${query}&pg=${page}`; + + if (!filters || filters.length == 0) { + const res = await new Client().get(url, this.headers); + return this.mangaListFromPage(res); + } + + if (filters[0].state.filter(f => f.state == true).length > 0) { + const values = filters[0].state.filter(f => f.state == true).map(f => f.value).join(","); + url += `&nt=${values}`; + } + + if (filters[1].state.filter(f => f.state == true).length > 0) { + const values = filters[1].state.filter(f => f.state == true).map(f => f.value).join(","); + url += `&org=${values}`; + } + + if (filters[2].state.filter(f => f.state == 1 || f.state == 2).length > 0) { + const including = filters[2].state.filter(f => f.state == 1).map(f => f.value).join(","); + const excluding = filters[2].state.filter(f => f.state == 2).map(f => f.value).join(","); + if (including.length > 0) url += `&gi=${including}`; + if (excluding.length > 0) url += `&ge=${excluding}`; + } + + if (filters[3].state.filter(f => f.state == true).length > 0) { + const values = filters[3].state.filter(f => f.state == true).map(f => f.value).join(","); + url += `&ss=${values}`; + } + + url += `&sort=${filters[4].values[filters[4].state].value}`; + url += `&order=${filters[5].values[filters[5].state].value}`; + + const res = await new Client().get(url, this.headers); return this.mangaListFromPage(res); } @@ -185,7 +191,205 @@ class DefaultExtension extends MProvider { "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); - if (res.body.includes("blogspot")) { + const domain = res.body; + + if (domain.includes("anotivereads")) { + const title = + doc.selectFirst("#comic-nav-name")?.text.trim() || + ""; + const content = doc.selectFirst("#spliced-comic")?.innerHtml; + return `
Failed to parse JSON content!
"; + } + + if (domain.includes("wuxiaworld")) { + const title = + doc.selectFirst("h4 > span")?.text.trim() || + ""; + const content = doc.selectFirst(".chapter-content")?.innerHtml; + return `Domain not supported yet
"; } + getFilterList() { + return [ + { + type_name: "GroupFilter", + name: "Novel Type", + state: [ + { + type_name: "CheckBox", + name: "Web Novel", + value: "2444", + }, + { + type_name: "CheckBox", + name: "Light Novel", + value: "2443", + }, + { + type_name: "CheckBox", + name: "Published Novel", + value: "26874", + }, + ], + }, + { + type_name: "GroupFilter", + name: "Original Language", + state: [ + { + type_name: "CheckBox", + name: "Chinese", + value: "495", + }, + { + type_name: "CheckBox", + name: "Filipino", + value: "9181", + }, + { + type_name: "CheckBox", + name: "Indonesian", + value: "9179", + }, + { + type_name: "CheckBox", + name: "Japanese", + value: "496", + }, + { + type_name: "CheckBox", + name: "Khmer", + value: "18657", + }, + { + type_name: "CheckBox", + name: "Korean", + value: "497", + }, + { + type_name: "CheckBox", + name: "Malaysian", + value: "9183", + }, + { + type_name: "CheckBox", + name: "Thai", + value: "9954", + }, + { + type_name: "CheckBox", + name: "Vietnamese", + value: "9177", + }, + ], + }, + { + type_name: "GroupFilter", + name: "Genre", + state: [ + { + type_name: "TriState", + name: "Action", + value: "8", + }, + { + type_name: "TriState", + name: "Adventure", + value: "13", + }, + { + type_name: "TriState", + name: "Comedy", + value: "17", + }, + { + type_name: "TriState", + name: "Drama", + value: "9", + }, + { + type_name: "TriState", + name: "Ecchi", + value: "292", + }, + { + type_name: "TriState", + name: "Fantasy", + value: "5", + }, + { + type_name: "TriState", + name: "Gender Bender", + value: "168", + }, + { + type_name: "TriState", + name: "Harem", + value: "3", + }, + { + type_name: "TriState", + name: "Horror", + value: "343", + }, + { + type_name: "TriState", + name: "Josei", + value: "324", + }, + { + type_name: "TriState", + name: "Martial Arts", + value: "14", + }, + { + type_name: "TriState", + name: "Mature", + value: "4", + }, + { + type_name: "TriState", + name: "Mecha", + value: "10", + }, + { + type_name: "TriState", + name: "Mystery", + value: "245", + }, + { + type_name: "TriState", + name: "Psychological", + value: "486", + }, + { + type_name: "TriState", + name: "Romance", + value: "15", + }, + { + type_name: "TriState", + name: "School", + value: "6", + }, + { + type_name: "TriState", + name: "Sci-Fi", + value: "11", + }, + { + type_name: "TriState", + name: "Seinen", + value: "18", + }, + { + type_name: "TriState", + name: "Shoujo", + value: "157", + }, + { + type_name: "TriState", + name: "Shoujo Ai", + value: "851", + }, + { + type_name: "TriState", + name: "Shounen", + value: "12", + }, + { + type_name: "TriState", + name: "Shounen Ai", + value: "1692", + }, + { + type_name: "TriState", + name: "Slice of Life", + value: "7", + }, + { + type_name: "TriState", + name: "Smut", + value: "281", + }, + { + type_name: "TriState", + name: "Sports", + value: "1357", + }, + { + type_name: "TriState", + name: "Supernatural", + value: "16", + }, + { + type_name: "TriState", + name: "Tragedy", + value: "132", + }, + { + type_name: "TriState", + name: "Wuxia", + value: "479", + }, + { + type_name: "TriState", + name: "Xianxia", + value: "480", + }, + { + type_name: "TriState", + name: "Xuanhuan", + value: "3954", + }, + { + type_name: "TriState", + name: "Yaoi", + value: "560", + }, + { + type_name: "TriState", + name: "Yuri", + value: "922", + }, + ], + }, + { + type_name: "GroupFilter", + name: "Status", + state: [ + { + type_name: "CheckBox", + name: "All", + value: "", + }, + { + type_name: "CheckBox", + name: "Completed", + value: "2", + }, + { + type_name: "CheckBox", + name: "Ongoing", + value: "3", + }, + { + type_name: "CheckBox", + name: "Hiatus", + value: "4", + }, + ], + }, + { + type_name: "SelectFilter", + type: "sort", + name: "Sort", + state: 0, + values: [ + { + type_name: "SelectOption", + name: "Last Updated", + value: "sdate", + }, + { + type_name: "SelectOption", + name: "Rating", + value: "srate", + }, + { + type_name: "SelectOption", + name: "Rank", + value: "srank", + }, + { + type_name: "SelectOption", + name: "Reviews", + value: "sreview", + }, + { + type_name: "SelectOption", + name: "Chapters", + value: "srel", + }, + { + type_name: "SelectOption", + name: "Title", + value: "abc", + }, + { + type_name: "SelectOption", + name: "Readers", + value: "sread", + }, + { + type_name: "SelectOption", + name: "Frequency", + value: "sfrel", + }, + ], + }, + { + type_name: "SelectFilter", + name: "Order", + state: 0, + values: [ + { + type_name: "SelectOption", + name: "Descending", + value: "desc", + }, + { + type_name: "SelectOption", + name: "Ascending", + value: "asc", + }, + ], + } + ]; + } + getSourcePreferences() { throw new Error("getSourcePreferences not implemented"); }