mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 10:51:17 +00:00
added extension function
This commit is contained in:
@@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user