mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 02:41:39 +00:00
369 lines
11 KiB
JavaScript
369 lines
11 KiB
JavaScript
const mangayomiSources = [
|
|
{
|
|
name: "TeamX",
|
|
lang: "ar",
|
|
baseUrl: "https://olympustaff.com",
|
|
apiUrl: "",
|
|
iconUrl:
|
|
"https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com",
|
|
typeSource: "single",
|
|
itemType: 0,
|
|
version: "1.0.1",
|
|
pkgPath: "manga/src/ar/teamx.js",
|
|
},
|
|
];
|
|
|
|
class DefaultExtension extends MProvider {
|
|
constructor() {
|
|
super();
|
|
this.client = new Client();
|
|
this.baseUrl = new SharedPreferences().get("overrideBaseUrl1");
|
|
}
|
|
|
|
// Helper Methods
|
|
|
|
getHeaders(url) {
|
|
return { Referer: this.source.baseUrl };
|
|
}
|
|
|
|
toStatus(status) {
|
|
return (
|
|
{
|
|
مستمرة: 0,
|
|
مكتملة: 1,
|
|
مكتمل: 1,
|
|
متوقف: 2,
|
|
متروك: 3,
|
|
"قادم قريبًا": 4,
|
|
}[status] ?? 5 // 5 => unknown
|
|
);
|
|
}
|
|
|
|
hasNextPage(doc) {
|
|
return (
|
|
doc
|
|
.selectFirst(".pagination li.page-item a[rel='next']")
|
|
?.attr("href") !== ""
|
|
);
|
|
}
|
|
|
|
parseChapterDate(date) {
|
|
return new Date(date).toISOString().split("T")[0];
|
|
}
|
|
|
|
async request(slug) {
|
|
const res = await this.client.get(`${this.baseUrl}${slug}`);
|
|
return new Document(res.body);
|
|
}
|
|
|
|
// Chapters
|
|
chapterFromElement(element) {
|
|
const chpNum = element.selectFirst("div.epl-num")?.text.trim();
|
|
const chpTitle = element.selectFirst("div.epl-title")?.text.trim();
|
|
|
|
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,
|
|
};
|
|
}
|
|
|
|
async chapterListParse(response) {
|
|
const allElements = [];
|
|
let doc = response;
|
|
|
|
while (true) {
|
|
const pageChapters = doc.select("div.eplister ul a");
|
|
if (pageChapters.length === 0) break;
|
|
|
|
allElements.push(...pageChapters);
|
|
const nextPage = doc.select("a[rel=next]");
|
|
if (nextPage.length === 0) break;
|
|
|
|
const nextUrl = nextPage[0].attr("href");
|
|
const nextResponse = await this.client.get(nextUrl);
|
|
doc = new Document(nextResponse.body);
|
|
}
|
|
|
|
return allElements.map((element) => this.chapterFromElement(element));
|
|
}
|
|
|
|
// Manga Listing
|
|
async getMangaList(slug) {
|
|
const doc = await this.request(`/${slug}`);
|
|
const list = doc.select(".listupd .bsx").map((element) => ({
|
|
name: element.selectFirst("a")?.attr("title")?.trim(),
|
|
imageUrl: element.selectFirst("img")?.getSrc,
|
|
link: element.getHref,
|
|
}));
|
|
|
|
return { list, hasNextPage: this.hasNextPage(doc) };
|
|
}
|
|
|
|
async getPopular(page) {
|
|
return this.getMangaList(`series?page=${page}`);
|
|
}
|
|
|
|
async getLatestUpdates(page) {
|
|
const doc = await this.request(`/?page=${page}`);
|
|
const list = doc.select(".post-body .box").map((element) => ({
|
|
name: element.selectFirst(".info a h3")?.text,
|
|
imageUrl: element.selectFirst(".imgu img")?.getSrc,
|
|
link: element.selectFirst(".imgu a")?.getHref,
|
|
}));
|
|
|
|
return { list, hasNextPage: this.hasNextPage(doc) };
|
|
}
|
|
|
|
// Search
|
|
async search(query, page, filters) {
|
|
if (!query) {
|
|
const [type, status, genre] = filters.map(
|
|
(filter, i) => filter.values[filters[i].state]?.value,
|
|
);
|
|
return this.getMangaList(
|
|
`series?page=${page}&genre=${genre}&type=${type}&status=${status}`,
|
|
);
|
|
}
|
|
|
|
const doc = await this.request(`/ajax/search?keyword=${query}`);
|
|
const list = doc.select("li.list-group-item").map((element) => ({
|
|
name: element.selectFirst("div.ms-2 a")?.text,
|
|
imageUrl: element.selectFirst("a img")?.getSrc,
|
|
link: element.selectFirst("div.ms-2 a")?.getHref,
|
|
}));
|
|
|
|
return { list, hasNextPage: false };
|
|
}
|
|
|
|
// Detail
|
|
async getDetail(url) {
|
|
const res = await this.client.get(url);
|
|
const doc = new Document(res.body);
|
|
|
|
const title = doc.selectFirst("div.author-info-title h1")?.text.trim();
|
|
const imageUrl = doc.selectFirst("img.shadow-sm")?.getSrc;
|
|
const description = doc.selectFirst(".review-content > p")?.text.trim();
|
|
|
|
const author = doc
|
|
.selectFirst(
|
|
".full-list-info > small:first-child:contains(الرسام) + small",
|
|
)
|
|
?.text?.trim();
|
|
|
|
const status = this.toStatus(
|
|
doc
|
|
.selectFirst(
|
|
".full-list-info > small:first-child:contains(الحالة) + small",
|
|
)
|
|
?.text?.trim(),
|
|
);
|
|
|
|
const genre = doc
|
|
.select("div.review-author-info a")
|
|
.map((e) => e.text.trim());
|
|
|
|
const chapters = await this.chapterListParse(doc);
|
|
|
|
return {
|
|
title,
|
|
imageUrl,
|
|
description,
|
|
author: author && author !== "غير معروف" ? author : null,
|
|
status,
|
|
genre,
|
|
chapters,
|
|
};
|
|
}
|
|
|
|
// chapter pages
|
|
async getPageList(url) {
|
|
const res = await this.client.get(url);
|
|
const doc = new Document(res.body);
|
|
|
|
return doc.select("div.image_list img[src]").map((x) => ({
|
|
url: x.attr("src"),
|
|
}));
|
|
}
|
|
|
|
// Filter
|
|
getFilterList() {
|
|
return [
|
|
{
|
|
type_name: "SelectFilter",
|
|
name: "النوع",
|
|
values: [
|
|
["اختر النوع", ""],
|
|
["مانها صيني", "مانها صيني"],
|
|
["مانجا ياباني", "مانجا ياباني"],
|
|
["ويب تون انجليزية", "ويب تون انجليزية"],
|
|
["مانهوا كورية", "مانهوا كورية"],
|
|
["ويب تون يابانية", "ويب تون يابانية"],
|
|
["عربي", "عربي"],
|
|
].map((x) => ({
|
|
type_name: "SelectOption",
|
|
name: x[0],
|
|
value: x[1],
|
|
})),
|
|
},
|
|
{
|
|
type_name: "SelectFilter",
|
|
name: "الحالة",
|
|
values: [
|
|
["اختر الحالة", ""],
|
|
["مستمرة", "مستمرة"],
|
|
["متوقف", "متوقف"],
|
|
["مكتمل", "مكتمل"],
|
|
["قادم قريبًا", "قادم قريبًا"],
|
|
["متروك", "متروك"],
|
|
].map((x) => ({
|
|
type_name: "SelectOption",
|
|
name: x[0],
|
|
value: x[1],
|
|
})),
|
|
},
|
|
{
|
|
type_name: "SelectFilter",
|
|
name: "التصنيف",
|
|
values: [
|
|
["اختر التصنيف", ""],
|
|
["أكشن", "أكشن"],
|
|
["إثارة", "إثارة"],
|
|
["إيسيكاي", "إيسيكاي"],
|
|
["بطل غير إعتيادي", "بطل غير إعتيادي"],
|
|
["خيال", "خيال"],
|
|
["دموي", "دموي"],
|
|
["نظام", "نظام"],
|
|
["صقل", "صقل"],
|
|
["قوة خارقة", "قوة خارقة"],
|
|
["فنون قتال", "فنون قتال"],
|
|
["غموض", "غموض"],
|
|
["وحوش", "وحوش"],
|
|
["شونين", "شونين"],
|
|
["حريم", "حريم"],
|
|
["خيال علمي", "خيال علمي"],
|
|
["مغامرات", "مغامرات"],
|
|
["دراما", "دراما"],
|
|
["خارق للطبيعة", "خارق للطبيعة"],
|
|
["سحر", "سحر"],
|
|
["كوميدي", "كوميدي"],
|
|
["ويب تون", "ويب تون"],
|
|
["زمكاني", "زمكاني"],
|
|
["رومانسي", "رومانسي"],
|
|
["شياطين", "شياطين"],
|
|
["فانتازيا", "فانتازيا"],
|
|
["عنف", "عنف"],
|
|
["ملائكة", "ملائكة"],
|
|
["بعد الكارثة", "بعد الكارثة"],
|
|
["إعادة إحياء", "إعادة إحياء"],
|
|
["اعمار", "اعمار"],
|
|
["ثأر", "ثأر"],
|
|
["زنزانات", "زنزانات"],
|
|
["تاريخي", "تاريخي"],
|
|
["حرب", "حرب"],
|
|
["خارق", "خارق"],
|
|
["سنين", "سنين"],
|
|
["عسكري", "عسكري"],
|
|
["بوليسي", "بوليسي"],
|
|
["حياة مدرسية", "حياة مدرسية"],
|
|
["واقع افتراضي", "واقع افتراضي"],
|
|
["داخل لعبة", "داخل لعبة"],
|
|
["داخل رواية", "داخل رواية"],
|
|
["الحياة اليومية", "الحياة اليومية"],
|
|
["رعب", "رعب"],
|
|
["طبخ", "طبخ"],
|
|
["مدرسي", "مدرسي"],
|
|
["زومبي", "زومبي"],
|
|
["شوجو", "شوجو"],
|
|
["معالج", "معالج"],
|
|
["شريحة من الحياة", "شريحة من الحياة"],
|
|
["نفسي", "نفسي"],
|
|
["تاريخ", "تاريخ"],
|
|
["أكاديمية", "أكاديمية"],
|
|
["أرواح", "أرواح"],
|
|
["تراجيدي", "تراجيدي"],
|
|
["ابراج", "ابراج"],
|
|
["رياضي", "رياضي"],
|
|
["مصاص دماء", "مصاص دماء"],
|
|
["طبي", "طبي"],
|
|
["مأساة", "مأساة"],
|
|
["إيتشي", "إيتشي"],
|
|
["انتقام", "انتقام"],
|
|
["جوسي", "جوسي"],
|
|
["موريم", "موريم"],
|
|
["لعبة فيديو", "لعبة فيديو"],
|
|
["مغني", "مغني"],
|
|
["تشويق", "تشويق"],
|
|
["نجاة", "نجاة"],
|
|
["الجانب المظلم من الحياة", "الجانب المظلم من الحياة"],
|
|
["سينين", "سينين"],
|
|
["تنمر", "تنمر"],
|
|
["حيوانات أليفة", "حيوانات أليفة"],
|
|
["شرطة", "شرطة"],
|
|
["الخيال العلمي", "الخيال العلمي"],
|
|
["حشرات", "حشرات"],
|
|
["عوالم", "عوالم"],
|
|
["ممالك", "ممالك"],
|
|
["مؤامرات", "مؤامرات"],
|
|
["تخطيط", "تخطيط"],
|
|
["سفر عبر الأبعاد", "سفر عبر الأبعاد"],
|
|
["جواسيس", "جواسيس"],
|
|
["بطل مخطط", "بطل مخطط"],
|
|
["ممثل", "ممثل"],
|
|
].map((x) => ({
|
|
type_name: "SelectOption",
|
|
name: x[0],
|
|
value: x[1],
|
|
})),
|
|
},
|
|
];
|
|
}
|
|
|
|
// Preferences
|
|
getSourcePreferences() {
|
|
return [
|
|
{
|
|
key: "overrideBaseUrl1",
|
|
editTextPreference: {
|
|
title: "Override BaseUrl",
|
|
summary: "https://olympustaff.com",
|
|
value: "https://olympustaff.com",
|
|
dialogTitle: "Override BaseUrl",
|
|
dialogMessage: "",
|
|
},
|
|
},
|
|
];
|
|
}
|
|
|
|
// 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");
|
|
}
|
|
}
|