mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 10:51:17 +00:00
manga(teamx): refactor and clean up code
This commit is contained in:
@@ -4,8 +4,9 @@ const mangayomiSources = [
|
|||||||
lang: "ar",
|
lang: "ar",
|
||||||
baseUrl: "https://olympustaff.com",
|
baseUrl: "https://olympustaff.com",
|
||||||
apiUrl: "",
|
apiUrl: "",
|
||||||
iconUrl:
|
get iconUrl() {
|
||||||
"https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com&size=256",
|
return `https://www.google.com/s2/favicons?sz=256&domain=${this.baseUrl}`;
|
||||||
|
},
|
||||||
typeSource: "single",
|
typeSource: "single",
|
||||||
itemType: 0,
|
itemType: 0,
|
||||||
version: "1.0.0",
|
version: "1.0.0",
|
||||||
@@ -20,10 +21,10 @@ class DefaultExtension extends MProvider {
|
|||||||
this.baseUrl = new SharedPreferences().get("overrideBaseUrl1");
|
this.baseUrl = new SharedPreferences().get("overrideBaseUrl1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper Methods
|
||||||
|
|
||||||
getHeaders(url) {
|
getHeaders(url) {
|
||||||
return {
|
return { Referer: this.source.baseUrl };
|
||||||
Referer: this.source.baseUrl,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toStatus(status) {
|
toStatus(status) {
|
||||||
@@ -38,16 +39,17 @@ class DefaultExtension extends MProvider {
|
|||||||
}[status] ?? 5 // 5 => unknown
|
}[status] ?? 5 // 5 => unknown
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
hasNextPage(doc) {
|
hasNextPage(doc) {
|
||||||
return (
|
return (
|
||||||
doc.selectFirst(".pagination li.page-item a[rel='next'] ").attr("href") !=
|
doc
|
||||||
""
|
.selectFirst(".pagination li.page-item a[rel='next']")
|
||||||
|
?.attr("href") !== ""
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
parseChapterDate(date) {
|
parseChapterDate(date) {
|
||||||
// Format YYYY-MM-DD
|
return new Date(date).toISOString().split("T")[0];
|
||||||
return String(new Date(date).toISOString().split("T")[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async request(slug) {
|
async request(slug) {
|
||||||
@@ -55,130 +57,114 @@ class DefaultExtension extends MProvider {
|
|||||||
return new Document(res.body);
|
return new Document(res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Chapters
|
||||||
chapterFromElement(element) {
|
chapterFromElement(element) {
|
||||||
const chapter = {
|
const chpNum = element.selectFirst("div.epl-num")?.text.trim();
|
||||||
name: "",
|
const chpTitle = element.selectFirst("div.epl-title")?.text.trim();
|
||||||
dateUpload: 0,
|
|
||||||
url: "",
|
let name;
|
||||||
|
if (chpTitle?.includes(chpNum?.replace(/[^0-9]/g, ""))) {
|
||||||
|
name = chpTitle;
|
||||||
|
} else if (!chpNum) {
|
||||||
|
name = chpTitle;
|
||||||
|
} else if (!chpTitle) {
|
||||||
|
name = chpNum;
|
||||||
|
} else {
|
||||||
|
name = `${chpNum} - ${chpTitle}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
dateUpload: this.parseChapterDate(
|
||||||
|
element.selectFirst("div.epl-date")?.text.trim(),
|
||||||
|
),
|
||||||
|
url: element.getHref,
|
||||||
};
|
};
|
||||||
|
|
||||||
const chpNum = element.selectFirst("div.epl-num").text.trim();
|
|
||||||
const chpTitle = element.selectFirst("div.epl-title").text.trim();
|
|
||||||
|
|
||||||
chapter.name = chpTitle.includes(chpNum.replace(/[^0-9]/g, ""))
|
|
||||||
? chpTitle
|
|
||||||
: !chpNum
|
|
||||||
? chpTitle
|
|
||||||
: !chpTitle
|
|
||||||
? chpNum
|
|
||||||
: `${chpNum} - ${chpTitle}`;
|
|
||||||
|
|
||||||
chapter.dateUpload = this.parseChapterDate(
|
|
||||||
element.selectFirst("div.epl-date").text.trim(),
|
|
||||||
);
|
|
||||||
chapter.url = element.getHref;
|
|
||||||
|
|
||||||
return chapter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async chapterListParse(response) {
|
async chapterListParse(response) {
|
||||||
const allElements = [];
|
const allElements = [];
|
||||||
let doc = response;
|
let doc = response;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
const pageChapters = doc.select("div.eplister ul a");
|
const pageChapters = doc.select("div.eplister ul a");
|
||||||
if (pageChapters.length === 0) {
|
if (pageChapters.length === 0) break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
allElements.push(...pageChapters);
|
allElements.push(...pageChapters);
|
||||||
const nextPage = doc.select("a[rel=next]");
|
const nextPage = doc.select("a[rel=next]");
|
||||||
if (!nextPage.length > 0) {
|
if (nextPage.length === 0) break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const nextUrl = nextPage.at(0).attr("href");
|
const nextUrl = nextPage[0].attr("href");
|
||||||
const nextResponse = await new Client().get(nextUrl);
|
const nextResponse = await this.client.get(nextUrl);
|
||||||
doc = new Document(nextResponse.body);
|
doc = new Document(nextResponse.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
return allElements.map((element) => this.chapterFromElement(element));
|
return allElements.map((element) => this.chapterFromElement(element));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Manga Listing
|
||||||
async getMangaList(slug) {
|
async getMangaList(slug) {
|
||||||
const doc = await this.request(`/${slug}`);
|
const doc = await this.request(`/${slug}`);
|
||||||
const mangaElements = doc.select(".listupd .bsx");
|
const list = doc.select(".listupd .bsx").map((element) => ({
|
||||||
|
name: element.selectFirst("a")?.attr("title")?.trim(),
|
||||||
|
imageUrl: element.selectFirst("img")?.getSrc,
|
||||||
|
link: element.getHref,
|
||||||
|
}));
|
||||||
|
|
||||||
const list = [];
|
return { list, hasNextPage: this.hasNextPage(doc) };
|
||||||
for (const element of mangaElements) {
|
|
||||||
const name = element.selectFirst("a").attr("title")?.trim();
|
|
||||||
const imageUrl = element.selectFirst("img").getSrc;
|
|
||||||
const link = element.getHref;
|
|
||||||
list.push({ name, imageUrl, link });
|
|
||||||
}
|
|
||||||
const hasNextPage = this.hasNextPage(doc);
|
|
||||||
return { list: list, hasNextPage };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPopular(page) {
|
async getPopular(page) {
|
||||||
return await this.getMangaList(`series?page=${page}`);
|
return this.getMangaList(`series?page=${page}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getLatestUpdates(page) {
|
async getLatestUpdates(page) {
|
||||||
const doc = await this.request(`/?page=${page}`);
|
const doc = await this.request(`/?page=${page}`);
|
||||||
const mangaElements = doc.select(".post-body .box");
|
const list = doc.select(".post-body .box").map((element) => ({
|
||||||
const list = [];
|
name: element.selectFirst(".info a h3")?.text,
|
||||||
for (const element of mangaElements) {
|
imageUrl: element.selectFirst(".imgu img")?.getSrc,
|
||||||
const name = element.selectFirst(".info a h3").text;
|
link: element.selectFirst(".imgu a")?.getHref,
|
||||||
const imageUrl = element.selectFirst(".imgu img").getSrc;
|
}));
|
||||||
const link = element.selectFirst(".imgu a").getHref;
|
|
||||||
list.push({ name, imageUrl, link });
|
return { list, hasNextPage: this.hasNextPage(doc) };
|
||||||
}
|
|
||||||
const hasNextPage = this.hasNextPage(doc);
|
|
||||||
return { list: list, hasNextPage };
|
|
||||||
}
|
|
||||||
|
|
||||||
get supportsLatest() {
|
|
||||||
throw new Error("supportsLatest not implemented");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Search
|
||||||
async search(query, page, filters) {
|
async search(query, page, filters) {
|
||||||
if (!query) {
|
if (!query) {
|
||||||
const type = filters[0].values[filters[0].state].value;
|
const [type, status, genre] = filters.map(
|
||||||
const status = filters[1].values[filters[1].state].value;
|
(filter, i) => filter.values[filters[i].state]?.value,
|
||||||
const genre = filters[2].values[filters[2].state].value;
|
);
|
||||||
return await this.getMangaList(
|
return this.getMangaList(
|
||||||
`series?page=${page}&genre=${genre}&type=${type}&status=${status}`,
|
`series?page=${page}&genre=${genre}&type=${type}&status=${status}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const doc = await this.request(`/ajax/search?keyword="${query}`).select(
|
const doc = await this.request(`/ajax/search?keyword="${query}`);
|
||||||
"li.list-group-item",
|
const list = doc.select("li.list-group-item").map((element) => ({
|
||||||
);
|
name: element.selectFirst("div.ms-2 a")?.text,
|
||||||
|
imageUrl: element.selectFirst("a img")?.getSrc,
|
||||||
const list = [];
|
link: element.selectFirst("div.ms-2 a")?.getHref,
|
||||||
for (const element of doc) {
|
}));
|
||||||
const name = element.selectFirst("div.ms-2 a").text;
|
|
||||||
const imageUrl = element.selectFirst("a img").getSrc;
|
|
||||||
const link = element.selectFirst("div.ms-2 a").getHref;
|
|
||||||
list.push({ name, imageUrl, link });
|
|
||||||
}
|
|
||||||
|
|
||||||
return { list, hasNextPage: false };
|
return { list, hasNextPage: false };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detail
|
||||||
async getDetail(url) {
|
async getDetail(url) {
|
||||||
const baseUrl = new SharedPreferences().get("overrideBaseUrl1");
|
|
||||||
const res = await this.client.get(url);
|
const res = await this.client.get(url);
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
|
|
||||||
const title = doc.selectFirst("div.author-info-title h1")?.text.trim();
|
const title = doc.selectFirst("div.author-info-title h1")?.text.trim();
|
||||||
const imageUrl = doc.selectFirst("img.shadow-sm")?.getSrc;
|
const imageUrl = doc.selectFirst("img.shadow-sm")?.getSrc;
|
||||||
const description = doc.selectFirst(".review-content > p")?.text.trim();
|
const description = doc.selectFirst(".review-content > p")?.text.trim();
|
||||||
const authorText = doc
|
|
||||||
|
const author = doc
|
||||||
.selectFirst(
|
.selectFirst(
|
||||||
".full-list-info > small:first-child:contains(الرسام) + small",
|
".full-list-info > small:first-child:contains(الرسام) + small",
|
||||||
)
|
)
|
||||||
?.text?.trim();
|
?.text?.trim();
|
||||||
const author = authorText !== "غير معروف" ? authorText : null;
|
|
||||||
const status = this.toStatus(
|
const status = this.toStatus(
|
||||||
doc
|
doc
|
||||||
.selectFirst(
|
.selectFirst(
|
||||||
@@ -186,6 +172,7 @@ class DefaultExtension extends MProvider {
|
|||||||
)
|
)
|
||||||
?.text?.trim(),
|
?.text?.trim(),
|
||||||
);
|
);
|
||||||
|
|
||||||
const genre = doc
|
const genre = doc
|
||||||
.select("div.review-author-info a")
|
.select("div.review-author-info a")
|
||||||
.map((e) => e.text.trim());
|
.map((e) => e.text.trim());
|
||||||
@@ -196,27 +183,14 @@ class DefaultExtension extends MProvider {
|
|||||||
title,
|
title,
|
||||||
imageUrl,
|
imageUrl,
|
||||||
description,
|
description,
|
||||||
author,
|
author: author && author !== "غير معروف" ? author : null,
|
||||||
status,
|
status,
|
||||||
genre,
|
genre,
|
||||||
chapters,
|
chapters,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// For novel html content
|
// chapter pages
|
||||||
async getHtmlContent(url) {
|
|
||||||
throw new Error("getHtmlContent not implemented");
|
|
||||||
}
|
|
||||||
// Clean html up for reader
|
|
||||||
async cleanHtmlContent(html) {
|
|
||||||
throw new Error("cleanHtmlContent not implemented");
|
|
||||||
}
|
|
||||||
// For anime episode video list
|
|
||||||
async getVideoList(url) {
|
|
||||||
throw new Error("getVideoList not implemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
// For manga chapter pages
|
|
||||||
async getPageList(url) {
|
async getPageList(url) {
|
||||||
const res = await this.client.get(url);
|
const res = await this.client.get(url);
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
@@ -226,6 +200,7 @@ class DefaultExtension extends MProvider {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filter
|
||||||
getFilterList() {
|
getFilterList() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@@ -358,6 +333,7 @@ class DefaultExtension extends MProvider {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Preferences
|
||||||
getSourcePreferences() {
|
getSourcePreferences() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@@ -372,4 +348,22 @@ class DefaultExtension extends MProvider {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unimplemented Methods
|
||||||
|
get supportsLatest() {
|
||||||
|
throw new Error("Method not implemented: supportsLatest");
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHtmlContent(url) {
|
||||||
|
throw new Error("Method not implemented: getHtmlContent");
|
||||||
|
}
|
||||||
|
|
||||||
|
async cleanHtmlContent(html) {
|
||||||
|
throw new Error("Method not implemented: cleanHtmlContent");
|
||||||
|
}
|
||||||
|
|
||||||
|
// For anime episode video list
|
||||||
|
async getVideoList(url) {
|
||||||
|
throw new Error("Method not implemented: getVideoList");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user