From 5ee227b6ded557356fbe4c3db3bfca84e5d8d586 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Tue, 19 Nov 2024 18:11:27 +0100 Subject: [PATCH] fix Asura Scans --- dart/manga/multisrc/mangareader/sources.dart | 3 - .../src/asurascans/asurascans.dart | 14 -- .../icon/en.asurascans.png | Bin javascript/manga/src/en/asurascans.js | 131 ++++++++++++++++++ source_generator.dart | 4 +- 5 files changed, 134 insertions(+), 18 deletions(-) delete mode 100644 dart/manga/multisrc/mangareader/src/asurascans/asurascans.dart rename dart/manga/multisrc/mangareader/src/asurascans/icon.png => javascript/icon/en.asurascans.png (100%) create mode 100644 javascript/manga/src/en/asurascans.js diff --git a/dart/manga/multisrc/mangareader/sources.dart b/dart/manga/multisrc/mangareader/sources.dart index 368596a..bd65a20 100644 --- a/dart/manga/multisrc/mangareader/sources.dart +++ b/dart/manga/multisrc/mangareader/sources.dart @@ -1,7 +1,6 @@ import '../../../../model/source.dart'; import 'src/beastscans/beastscans.dart'; import 'src/lelmanga/lelmanga.dart'; -import 'src/asurascans/asurascans.dart'; import 'src/komiklab/komiklab.dart'; import 'src/azurescans/azurescans.dart'; import 'src/cosmicscans/cosmicscans.dart'; @@ -104,8 +103,6 @@ List _mangareaderSourcesList = [ beastscansSource, //Lelmanga (FR) lelmangaSource, -//Asura Scans (EN) - asurascansSource, //KomikLab Scans (EN) komiklabSource, //Azure Scans (EN) diff --git a/dart/manga/multisrc/mangareader/src/asurascans/asurascans.dart b/dart/manga/multisrc/mangareader/src/asurascans/asurascans.dart deleted file mode 100644 index 4660c9f..0000000 --- a/dart/manga/multisrc/mangareader/src/asurascans/asurascans.dart +++ /dev/null @@ -1,14 +0,0 @@ -import '../../../../../../model/source.dart'; - -Source get asurascansSource => _asurascansSource; - -Source _asurascansSource = Source( - name: "Asura Scans", - baseUrl: "https://asuratoon.com/", - lang: "en", - typeSource: "mangareader", - iconUrl: - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/asurascans/icon.png", - dateFormat: "MMM d, yyyy", - dateFormatLocale: "en_us", -); diff --git a/dart/manga/multisrc/mangareader/src/asurascans/icon.png b/javascript/icon/en.asurascans.png similarity index 100% rename from dart/manga/multisrc/mangareader/src/asurascans/icon.png rename to javascript/icon/en.asurascans.png diff --git a/javascript/manga/src/en/asurascans.js b/javascript/manga/src/en/asurascans.js new file mode 100644 index 0000000..7977bf5 --- /dev/null +++ b/javascript/manga/src/en/asurascans.js @@ -0,0 +1,131 @@ +const mangayomiSources = [{ + "id": 524070078, + "name": "Asura Scans", + "lang": "en", + "baseUrl": "https://asuracomic.net", + "apiUrl": "", + "iconUrl": "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.asurascans.png", + "typeSource": "single", + "isManga": true, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "manga/src/en/asurascans.js" +}]; + +class DefaultExtension extends MProvider { + getHeaders(url) { + return { + Referer: this.source.baseUrl + }; + } + mangaListFromPage(res) { + const doc = new Document(res.body); + const mangaElements = doc.select("div.grid > a[href]"); + const list = []; + for (const element of mangaElements) { + const name = element.selectFirst("span.block").text; + const imageUrl = element.selectFirst("img").getSrc; + const link = element.getHref; + list.push({ name, imageUrl, link }); + } + const hasNextPage = doc.selectFirst("a.flex.bg-themecolor:contains(Next)").text != ""; + return { "list": list, hasNextPage }; + } + toStatus(status) { + if (status == "Ongoing") + return 0; + else if (status == "Completed") + return 1; + else if (status == "Hiatus") + return 2; + else if (status == "Dropped") + return 3; + else + return 5; + } + parseDate(date) { + const months = { + "january": "01", "february": "02", "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(" "); + if (!(date[0] in months)) { + return String(new Date().valueOf()); + } + date[0] = months[date[0]]; + const formattedDate = `${date[2]}-${date[0]}-${date[1].padStart(2, "0")}`; // Format YYYY-MM-DD + return String(new Date(formattedDate).valueOf()); + } + + async getPopular(page) { + const res = await new Client().get(`${this.source.baseUrl}/series?name=&status=-1&types=-1&order=rating&page=${page}`); + return this.mangaListFromPage(res); + } + + async getLatestUpdates(page) { + const res = await new Client().get(`${this.source.baseUrl}/series?genres=&status=-1&types=-1&order=update&page=${page}`); + return this.mangaListFromPage(res); + } + async search(query, page, filters) { + const res = await new Client().get(`${this.source.baseUrl}/series?name=${query}&page=${page}`); + return this.mangaListFromPage(res); + } + + async getDetail(url) { + const res = await new Client().get(this.source.baseUrl + "/" + url); + const doc = new Document(res.body); + const imageUrl = doc.selectFirst("img[alt=poster]")?.getSrc; + const description = doc.selectFirst("span.font-medium.text-sm")?.text.trim(); + const author = doc.selectFirst("h3:contains('Author')").nextElementSibling.text.trim(); + const artist = doc.selectFirst("h3:contains('Artist')").nextElementSibling.text.trim(); + const status = this.toStatus(doc.selectFirst("h3:contains('Status')").nextElementSibling.text.trim()); + const genre = doc.select("div[class^=space] > div.flex > button.text-white") + .map((el) => el.text.trim()); + const chapters = []; + const chapterElements = doc.select("div.scrollbar-thumb-themecolor > div.group"); + for (const element of chapterElements) { + const url = element.selectFirst("a").getHref; + const chNumber = element.selectFirst("h3 > a").text.trim(); + const chTitle = element.select("h3 > a > span").map((span) => span.text.trim()).join(" ").trim(); + const name = chTitle == "" ? chNumber : `${chNumber} - ${chTitle}`; + + let dateUpload; + try { + const dateText = element.selectFirst("h3 + h3").text.trim(); + const cleanDateText = dateText.replace(/(\d+)(st|nd|rd|th)/, "$1"); + dateUpload = this.parseDate(cleanDateText); + } catch (_) { + dateUpload = null + } + chapters.push({ name, url, dateUpload }); + } + return { + imageUrl, + description, + genre, + author, + artist, + status, + chapters + }; + } + + + async getPageList(url) { + const res = await new Client().get(this.source.baseUrl + "/series/" + url); + const scriptData = new Document(res.body).select("script:contains(self.__next_f.push)").map((e) => e.text.substringAfter("\"").substringBeforeLast("\"")).join(""); + console.log(scriptData); + const match = scriptData.match(/\\"pages\\":(\[.*?])/); + if (!match) { + throw new Error("Failed to find chapter pages"); + } + const pagesData = match[1]; + + const pageList = JSON.parse(pagesData.replace(/\\(.)/g, "$1")) + .sort((a, b) => a.order - b.order); + return pageList; + } + +} diff --git a/source_generator.dart b/source_generator.dart index da061a0..550c71e 100644 --- a/source_generator.dart +++ b/source_generator.dart @@ -57,6 +57,7 @@ List _searchJsSources(Directory dir) { for (var sourceJson in jsonDecode(match.group(1)!) as List) { final langs = sourceJson["langs"] as List?; final source = Source.fromJson(sourceJson) + ..id = int.tryParse("${sourceJson["id"]}") ..sourceCodeLanguage = 1 ..appMinVerReq = defaultSource.appMinVerReq ..sourceCodeUrl = @@ -65,7 +66,8 @@ List _searchJsSources(Directory dir) { for (var lang in langs!) { sourceList.add(Source.fromJson(source.toJson()) ..lang = lang - ..id = 'mangayomi-js-"$lang"."${source.name}"'.hashCode); + ..id = source.id ?? + 'mangayomi-js-"$lang"."${source.name}"'.hashCode); } } else { sourceList.add(source);