Merge pull request #269 from xMohnad/fix/teamx-install-error

Fix/teamx install error and displayed chapters
This commit is contained in:
Moustapha Kodjo Amadou
2025-06-04 19:04:24 +01:00
committed by GitHub

View File

@@ -1,31 +1,19 @@
const mangayomiSources = [ // prettier-ignore
{ const mangayomiSources = [{
"name": "TeamX", "name": "TeamX",
"lang": "ar", "lang": "ar",
"baseUrl": "https://olympustaff.com", "baseUrl": "https://olympustaff.com",
"apiUrl": "", "apiUrl": "",
"iconUrl": "iconUrl": "https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com",
"https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com",
"typeSource": "single", "typeSource": "single",
"itemType": 0, "itemType": 0,
"version": "1.0.1", "version": "0.0.3",
"isNsfw": false,
"pkgPath": "manga/src/ar/teamx.js" "pkgPath": "manga/src/ar/teamx.js"
} }];
];
class DefaultExtension extends MProvider { class DefaultExtension extends MProvider {
constructor() {
super();
this.client = new Client();
this.baseUrl = new SharedPreferences().get("overrideBaseUrl1");
}
// Helper Methods // Helper Methods
getHeaders(url) {
return { Referer: this.source.baseUrl };
}
toStatus(status) { toStatus(status) {
return ( return (
{ {
@@ -48,59 +36,30 @@ class DefaultExtension extends MProvider {
} }
parseChapterDate(date) { parseChapterDate(date) {
return new Date(date).toISOString().split("T")[0]; return new Date(date).getTime().toString();
} }
async request(slug) { getBaseUrl() {
const res = await this.client.get(`${this.baseUrl}${slug}`); const preference = new SharedPreferences();
var base_url = preference.get("domain_url");
if (base_url.length == 0) {
return this.source.baseUrl;
}
if (base_url.endsWith("/")) {
return base_url.slice(0, -1);
}
return base_url;
}
async request(slug, useBaseUrl = true) {
const url = useBaseUrl ? `${this.getBaseUrl()}${slug}` : slug;
if (!this.client) {
this.client = new Client();
}
const res = await this.client.get(url);
return new Document(res.body); 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 // Manga Listing
async getMangaList(slug) { async getMangaList(slug) {
const doc = await this.request(`/${slug}`); const doc = await this.request(`/${slug}`);
@@ -149,10 +108,34 @@ class DefaultExtension extends MProvider {
return { list, hasNextPage: false }; return { list, hasNextPage: false };
} }
// 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,
};
}
// Detail // Detail
async getDetail(url) { async getDetail(url) {
const res = await this.client.get(url); let doc = await this.request(url, false);
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;
@@ -176,7 +159,24 @@ class DefaultExtension extends MProvider {
.select("div.review-author-info a") .select("div.review-author-info a")
.map((e) => e.text.trim()); .map((e) => e.text.trim());
const chapters = await this.chapterListParse(doc); const allElements = [];
for (;;) {
const pageChapters = doc.select("div.eplister ul a");
if (!pageChapters || pageChapters.length === 0) break;
allElements.push(...pageChapters);
const nextPage = doc.select("a[rel=next]");
if (!nextPage || nextPage.length === 0) break;
const nextUrl = nextPage[0].attr("href");
if (!nextUrl) break;
doc = await this.request(nextUrl, false);
}
const chapters = allElements.map((element) =>
this.chapterFromElement(element),
);
return { return {
title, title,
@@ -191,8 +191,7 @@ class DefaultExtension extends MProvider {
// chapter pages // chapter pages
async getPageList(url) { async getPageList(url) {
const res = await this.client.get(url); const doc = await this.request(url, false);
const doc = new Document(res.body);
return doc.select("div.image_list img[src]").map((x) => ({ return doc.select("div.image_list img[src]").map((x) => ({
url: x.attr("src"), url: x.attr("src"),
@@ -336,33 +335,15 @@ class DefaultExtension extends MProvider {
getSourcePreferences() { getSourcePreferences() {
return [ return [
{ {
key: "overrideBaseUrl1", key: "domain_url",
editTextPreference: { editTextPreference: {
title: "Override BaseUrl", title: "Override BaseUrl",
summary: "https://olympustaff.com", summary: "",
value: "https://olympustaff.com", value: "https://olympustaff.com",
dialogTitle: "Override BaseUrl", dialogTitle: "URL",
dialogMessage: "", 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");
}
} }