added extension function

This commit is contained in:
Schnitzel5
2024-12-20 00:23:42 +01:00
parent f69f9a3669
commit bf628beca8

View File

@@ -1,31 +1,35 @@
const mangayomiSources = [{ const mangayomiSources = [
"name": "Novel Updates", {
"lang": "en", name: "Novel Updates",
"baseUrl": "https://www.novelupdates.com", lang: "en",
"apiUrl": "", baseUrl: "https://www.novelupdates.com",
"iconUrl": "https://raw.githubusercontent.com/Schnitzel5/mangayomi-extensions/main/javascript/icon/en.novelupdates.png", apiUrl: "",
"typeSource": "single", iconUrl:
"itemType": 2, "https://raw.githubusercontent.com/Schnitzel5/mangayomi-extensions/main/javascript/icon/en.novelupdates.png",
"version": "0.0.1", typeSource: "single",
"dateFormat": "", itemType: 2,
"dateFormatLocale": "", version: "0.0.1",
"pkgPath": "novel/src/en/novelupdates.js", dateFormat: "",
"appMinVerReq": "0.3.75", dateFormatLocale: "",
"isNsfw": false, pkgPath: "novel/src/en/novelupdates.js",
"hasCloudflare": true appMinVerReq: "0.3.75",
}]; isNsfw: false,
hasCloudflare: true,
},
];
class DefaultExtension extends MProvider { class DefaultExtension extends MProvider {
headers = { headers = {
"Referer": this.source.baseUrl, Referer: this.source.baseUrl,
"Origin": this.source.baseUrl, Origin: this.source.baseUrl,
"Connection": "keep-alive", Connection: "keep-alive",
"Accept": "*/*", Accept: "*/*",
"Accept-Language": "*", "Accept-Language": "*",
"Sec-Fetch-Mode": "cors", "Sec-Fetch-Mode": "cors",
"Accept-Encoding": "gzip, deflate", "Accept-Encoding": "gzip, deflate",
"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", "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",
};
getHeaders(url) { getHeaders(url) {
throw new Error("getHeaders not implemented"); throw new Error("getHeaders not implemented");
@@ -40,28 +44,36 @@ class DefaultExtension extends MProvider {
const link = element.selectFirst(".search_title > a").getHref; const link = element.selectFirst(".search_title > a").getHref;
list.push({ name, imageUrl, link }); list.push({ name, imageUrl, link });
} }
const hasNextPage = doc.selectFirst("div.digg_pagination > a.next_page").text == " →"; const hasNextPage =
return { "list": list, hasNextPage }; doc.selectFirst("div.digg_pagination > a.next_page").text == " →";
return { list: list, hasNextPage };
} }
toStatus(status) { toStatus(status) {
if (status.includes("Ongoing")) if (status.includes("Ongoing")) return 0;
return 0; else if (status.includes("Completed")) return 1;
else if (status.includes("Completed")) else if (status.includes("Hiatus")) return 2;
return 1; else if (status.includes("Dropped")) return 3;
else if (status.includes("Hiatus")) else return 5;
return 2;
else if (status.includes("Dropped"))
return 3;
else
return 5;
} }
parseDate(date) { parseDate(date) {
const months = { const months = {
"january": "01", "february": "02", "march": "03", "april": "04", january: "01",
"may": "05", "june": "06", "july": "07", "august": "08", february: "02",
"september": "09", "october": "10", "november": "11", "december": "12" 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(" "); date = date
.toLowerCase()
.replace(/(st|nd|rd|th)/g, "")
.split(" ");
if (!(date[0] in months)) { if (!(date[0] in months)) {
return String(new Date().valueOf()); return String(new Date().valueOf());
} }
@@ -71,16 +83,25 @@ class DefaultExtension extends MProvider {
} }
async getPopular(page) { async getPopular(page) {
const res = await new Client().get(`${this.source.baseUrl}/series-ranking/?rank=popmonth&pg=${page}`, this.headers); const res = await new Client().get(
`${this.source.baseUrl}/series-ranking/?rank=popmonth&pg=${page}`,
this.headers
);
return this.mangaListFromPage(res); return this.mangaListFromPage(res);
} }
async getLatestUpdates(page) { async getLatestUpdates(page) {
const res = await new Client().get(`${this.source.baseUrl}/series-finder/?sf=1&sh=&sort=sdate&order=desc&pg=${page}`, this.headers); const res = await new Client().get(
`${this.source.baseUrl}/series-finder/?sf=1&sh=&sort=sdate&order=desc&pg=${page}`,
this.headers
);
return this.mangaListFromPage(res); return this.mangaListFromPage(res);
} }
async search(query, page, filters) { 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); const res = await new Client().get(
`${this.source.baseUrl}/series-finder/?sf=1&sh=${query}&sort=sdate&order=desc&pg=${page}`,
this.headers
);
return this.mangaListFromPage(res); return this.mangaListFromPage(res);
} }
@@ -90,34 +111,40 @@ class DefaultExtension extends MProvider {
const doc = new Document(res.body); const doc = new Document(res.body);
const imageUrl = doc.selectFirst(".wpb_wrapper img")?.getSrc; const imageUrl = doc.selectFirst(".wpb_wrapper img")?.getSrc;
const type = doc.selectFirst("#showtype")?.text.trim(); const type = doc.selectFirst("#showtype")?.text.trim();
const description = doc.selectFirst("#editdescription")?.text.trim() + `\n\nType: ${type}`; const description =
const author = doc.select("#authtag").map((el) => el.text.trim()).join(", "); doc.selectFirst("#editdescription")?.text.trim() + `\n\nType: ${type}`;
const artist = doc.select("#artiststag").map((el) => el.text.trim()).join(", "); const author = doc
.select("#authtag")
.map((el) => el.text.trim())
.join(", ");
const artist = doc
.select("#artiststag")
.map((el) => el.text.trim())
.join(", ");
const status = this.toStatus(doc.selectFirst("#editstatus").text.trim()); const status = this.toStatus(doc.selectFirst("#editstatus").text.trim());
const genre = doc.select("#seriesgenre > a") const genre = doc.select("#seriesgenre > a").map((el) => el.text.trim());
.map((el) => el.text.trim());
const novelId = doc.selectFirst("input#mypostid")?.attr("value"); const novelId = doc.selectFirst("input#mypostid")?.attr("value");
const link = `https://www.novelupdates.com/wp-admin/admin-ajax.php`; const link = `https://www.novelupdates.com/wp-admin/admin-ajax.php`;
const headers = { const headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
...this.headers ...this.headers,
}; };
const chapters = []; const chapters = [];
const chapterRes = await client.post(link, headers, { const chapterRes = await client.post(link, headers, {
"action": "nd_getchapters", action: "nd_getchapters",
"mygrr": "0", mygrr: "0",
"mypostid": novelId mypostid: novelId,
}); });
const chapterDoc = new Document(chapterRes.body); const chapterDoc = new Document(chapterRes.body);
const nameReplacements = { const nameReplacements = {
'v': 'Volume ', v: "Volume ",
'c': ' Chapter ', c: " Chapter ",
'part': 'Part ', part: "Part ",
'ss': 'SS', ss: "SS",
}; };
const chapterElements = chapterDoc.select("li.sp_li_chp"); const chapterElements = chapterDoc.select("li.sp_li_chp");
@@ -126,14 +153,14 @@ class DefaultExtension extends MProvider {
for (const name in nameReplacements) { for (const name in nameReplacements) {
chapterName = chapterName.replace(name, nameReplacements[name]); chapterName = chapterName.replace(name, nameReplacements[name]);
} }
chapterName = chapterName.replace(/\b\w/g, l => l.toUpperCase()).trim(); chapterName = chapterName.replace(/\b\w/g, (l) => l.toUpperCase()).trim();
const chapterUrl = `https:${el.select("a")[1].getHref}`; const chapterUrl = `https:${el.select("a")[1].getHref}`;
const dateUpload = String(Date.now()); const dateUpload = String(Date.now());
chapters.push({ chapters.push({
name: chapterName, name: chapterName,
url: chapterUrl, url: chapterUrl,
dateUpload: dateUpload, dateUpload: dateUpload,
scanlator: null scanlator: null,
}); });
} }
@@ -146,27 +173,33 @@ class DefaultExtension extends MProvider {
author, author,
artist, artist,
status, status,
chapters chapters,
}; };
} }
async getPageList(url) { async getHtmlContent(url) {
const res = await new Client().get(this.source.baseUrl + "/series/" + url, this.headers); const client = await new Client();
const scriptData = new Document(res.body).select("script:contains(self.__next_f.push)").map((e) => e.text.substringAfter("\"").substringBeforeLast("\"")).join(""); const res = await client.get(url, {
console.log(scriptData); Priority: "u=0, i",
const match = scriptData.match(/\\"pages\\":(\[.*?])/); "User-Agent":
if (!match) { "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
throw new Error("Failed to find chapter pages"); });
const doc = new Document(res.body);
if (res.body.includes("blogspot")) {
const title =
doc.selectFirst("h3.post-title")?.text.trim() ||
doc.selectFirst("h3.entry-title")?.text.trim() ||
"";
const content =
doc.selectFirst("div.post-body")?.innerHtml ||
doc.selectFirst("div.entry-content")?.innerHtml ||
doc.selectFirst("div.content-post")?.innerHtml;
return `<h2>${title}</h2><hr><br>${content}`;
} }
const pagesData = match[1]; return "<p>Domain not supported yet</p>";
const pageList = JSON.parse(pagesData.replace(/\\(.)/g, "$1"))
.sort((a, b) => a.order - b.order);
return pageList;
} }
getSourcePreferences() { getSourcePreferences() {
throw new Error("getSourcePreferences not implemented"); throw new Error("getSourcePreferences not implemented");
} }
} }