From c7a32fbe812150b4ea17e82f14fe3dc180ad11ac Mon Sep 17 00:00:00 2001 From: xMohnad Date: Wed, 4 Jun 2025 14:07:09 +0000 Subject: [PATCH 1/4] fix(teamx): remove constructor client --- javascript/manga/src/ar/teamx.js | 42 +++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/javascript/manga/src/ar/teamx.js b/javascript/manga/src/ar/teamx.js index 2d809c3c..d811b457 100644 --- a/javascript/manga/src/ar/teamx.js +++ b/javascript/manga/src/ar/teamx.js @@ -1,3 +1,4 @@ +// prettier-ignore const mangayomiSources = [ { "name": "TeamX", @@ -14,12 +15,6 @@ const mangayomiSources = [ ]; class DefaultExtension extends MProvider { - constructor() { - super(); - this.client = new Client(); - this.baseUrl = new SharedPreferences().get("overrideBaseUrl1"); - } - // Helper Methods getHeaders(url) { @@ -51,8 +46,24 @@ class DefaultExtension extends MProvider { return new Date(date).toISOString().split("T")[0]; } - async request(slug) { - const res = await this.client.get(`${this.baseUrl}${slug}`); + getBaseUrl() { + 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); } @@ -94,8 +105,7 @@ class DefaultExtension extends MProvider { if (nextPage.length === 0) break; const nextUrl = nextPage[0].attr("href"); - const nextResponse = await this.client.get(nextUrl); - doc = new Document(nextResponse.body); + doc = await this.request(nextUrl, false); } return allElements.map((element) => this.chapterFromElement(element)); @@ -151,8 +161,7 @@ class DefaultExtension extends MProvider { // Detail async getDetail(url) { - const res = await this.client.get(url); - const doc = new Document(res.body); + const doc = await this.request(url, false); const title = doc.selectFirst("div.author-info-title h1")?.text.trim(); const imageUrl = doc.selectFirst("img.shadow-sm")?.getSrc; @@ -191,8 +200,7 @@ class DefaultExtension extends MProvider { // chapter pages async getPageList(url) { - const res = await this.client.get(url); - const doc = new Document(res.body); + const doc = await this.request(url, false); return doc.select("div.image_list img[src]").map((x) => ({ url: x.attr("src"), @@ -336,12 +344,12 @@ class DefaultExtension extends MProvider { getSourcePreferences() { return [ { - key: "overrideBaseUrl1", + key: "domain_url", editTextPreference: { title: "Override BaseUrl", - summary: "https://olympustaff.com", + summary: "", value: "https://olympustaff.com", - dialogTitle: "Override BaseUrl", + dialogTitle: "URL", dialogMessage: "", }, }, From adb7bf6dac8b6f3f73d1da79315957b9b25e3486 Mon Sep 17 00:00:00 2001 From: xMohnad Date: Wed, 4 Jun 2025 14:26:39 +0000 Subject: [PATCH 2/4] chore(teamx): remove unimplemented methods --- javascript/manga/src/ar/teamx.js | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/javascript/manga/src/ar/teamx.js b/javascript/manga/src/ar/teamx.js index d811b457..1a1022db 100644 --- a/javascript/manga/src/ar/teamx.js +++ b/javascript/manga/src/ar/teamx.js @@ -16,11 +16,6 @@ const mangayomiSources = [ class DefaultExtension extends MProvider { // Helper Methods - - getHeaders(url) { - return { Referer: this.source.baseUrl }; - } - toStatus(status) { return ( { @@ -355,22 +350,4 @@ 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"); - } } From 073bc7c1095d47f452de7b6bc00cf07608091105 Mon Sep 17 00:00:00 2001 From: xMohnad Date: Wed, 4 Jun 2025 14:31:48 +0000 Subject: [PATCH 3/4] chore(teamx): update metadata and format source array --- javascript/manga/src/ar/teamx.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/javascript/manga/src/ar/teamx.js b/javascript/manga/src/ar/teamx.js index 1a1022db..ef36d282 100644 --- a/javascript/manga/src/ar/teamx.js +++ b/javascript/manga/src/ar/teamx.js @@ -1,18 +1,16 @@ // prettier-ignore -const mangayomiSources = [ - { +const mangayomiSources = [{ "name": "TeamX", "lang": "ar", "baseUrl": "https://olympustaff.com", "apiUrl": "", - "iconUrl": - "https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com", + "iconUrl": "https://www.google.com/s2/favicons?sz=256&domain=https://olympustaff.com", "typeSource": "single", "itemType": 0, - "version": "1.0.1", + "version": "0.0.3", + "isNsfw": false, "pkgPath": "manga/src/ar/teamx.js" - } -]; +}]; class DefaultExtension extends MProvider { // Helper Methods From 4920b3a2168c9237c263a30bb596626accb8809c Mon Sep 17 00:00:00 2001 From: xMohnad Date: Wed, 4 Jun 2025 20:27:28 +0300 Subject: [PATCH 4/4] fix(teamx): simplify chapter parsing and fix date format --- javascript/manga/src/ar/teamx.js | 92 ++++++++++++++++---------------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/javascript/manga/src/ar/teamx.js b/javascript/manga/src/ar/teamx.js index ef36d282..199657cd 100644 --- a/javascript/manga/src/ar/teamx.js +++ b/javascript/manga/src/ar/teamx.js @@ -36,7 +36,7 @@ class DefaultExtension extends MProvider { } parseChapterDate(date) { - return new Date(date).toISOString().split("T")[0]; + return new Date(date).getTime().toString(); } getBaseUrl() { @@ -60,50 +60,6 @@ class DefaultExtension extends MProvider { 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"); - doc = await this.request(nextUrl, false); - } - - return allElements.map((element) => this.chapterFromElement(element)); - } - // Manga Listing async getMangaList(slug) { const doc = await this.request(`/${slug}`); @@ -152,9 +108,34 @@ class DefaultExtension extends MProvider { 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 async getDetail(url) { - const doc = await this.request(url, false); + let doc = await this.request(url, false); const title = doc.selectFirst("div.author-info-title h1")?.text.trim(); const imageUrl = doc.selectFirst("img.shadow-sm")?.getSrc; @@ -178,7 +159,24 @@ class DefaultExtension extends MProvider { .select("div.review-author-info a") .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 { title,