From 2304eba897ced4a9b6c17ee2a9ccdcd6c8941cb8 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 21 Jun 2024 18:13:20 +0100 Subject: [PATCH] updates --- dart/manga/multisrc/madara/madara.dart | 15 +- dart/manga/multisrc/madara/sources.dart | 2 +- dart/manga/multisrc/mangabox/mangabox.dart | 2 +- dart/manga/multisrc/mangabox/sources.dart | 2 +- .../multisrc/mangareader/mangareader.dart | 206 +++++++++--------- dart/manga/multisrc/mangareader/sources.dart | 2 +- 6 files changed, 126 insertions(+), 103 deletions(-) diff --git a/dart/manga/multisrc/madara/madara.dart b/dart/manga/multisrc/madara/madara.dart index 9cee5b78..60bab314 100644 --- a/dart/manga/multisrc/madara/madara.dart +++ b/dart/manga/multisrc/madara/madara.dart @@ -233,14 +233,25 @@ class Madara extends MProvider { final pageElement = document.selectFirst( "div.page-break, li.blocks-gallery-item, .reading-content, .text-left img"); - List imgs = pageElement.select("img").map((e) => e.getSrc).toList(); + List imgs = pageElement + .select("img") + .map((MElement e) => + e.attr("src") ?? + e.attr("data-src") ?? + e.attr("data-lazy-src") ?? + e.attr("srcset")) + .toList(); List pageUrls = []; if (imgs.length == 1) { final pagesNumber = document.selectFirst("#single-pager").select("option").length; - final imgUrl = pageElement.selectFirst("img").getSrc; + MElement imgElement = pageElement.selectFirst("img"); + final imgUrl = imgElement.attr("src") ?? + imgElement.attr("data-src") ?? + imgElement.attr("data-lazy-src") ?? + imgElement.attr("srcset"); for (var i = 0; i < pagesNumber; i++) { final val = i + 1; if (i.toString().length == 1) { diff --git a/dart/manga/multisrc/madara/sources.dart b/dart/manga/multisrc/madara/sources.dart index 5776ff59..1e1c6ce4 100644 --- a/dart/manga/multisrc/madara/sources.dart +++ b/dart/manga/multisrc/madara/sources.dart @@ -371,7 +371,7 @@ import 'src/truyenvn/truyenvn.dart'; -const madaraVersion = "0.0.95"; +const madaraVersion = "0.1.0"; const madaraSourceCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/madara/madara.dart"; diff --git a/dart/manga/multisrc/mangabox/mangabox.dart b/dart/manga/multisrc/mangabox/mangabox.dart index 0dffc648..d4194633 100644 --- a/dart/manga/multisrc/mangabox/mangabox.dart +++ b/dart/manga/multisrc/mangabox/mangabox.dart @@ -173,7 +173,7 @@ class MangaBox extends MProvider { dateStr = dates.last.text; } else { dateStr = element.selectFirst("ul > li > p")?.text ?? - DateTime.now().toString(); + DateTime.now().millisecondsSinceEpoch.toString(); } chapter.url = a.getHref; chapter.dateUpload = diff --git a/dart/manga/multisrc/mangabox/sources.dart b/dart/manga/multisrc/mangabox/sources.dart index 6a3169c6..541c52c5 100644 --- a/dart/manga/multisrc/mangabox/sources.dart +++ b/dart/manga/multisrc/mangabox/sources.dart @@ -4,7 +4,7 @@ import 'src/mangairo/mangaeiro.dart'; import 'src/mangakakalot/mangakakalot.dart'; import 'src/manganato/manganato.dart'; -const mangaboxVersion = "0.0.45"; +const mangaboxVersion = "0.0.5"; const mangaboxSourceCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangabox/mangabox.dart"; diff --git a/dart/manga/multisrc/mangareader/mangareader.dart b/dart/manga/multisrc/mangareader/mangareader.dart index 3671bc45..10e66171 100644 --- a/dart/manga/multisrc/mangareader/mangareader.dart +++ b/dart/manga/multisrc/mangareader/mangareader.dart @@ -109,12 +109,6 @@ class MangaReader extends MProvider { "En emision": 0, "مستمر": 0, "ยังไม่จบ": 0, - "curso": 0, - "en marcha": 0, - "publicandose": 0, - "publicando": 0, - "devam etmekte": 0, - "連載中": 0, "Đã hoàn thành": 1, "مكتملة": 1, "Завершено": 1, @@ -135,85 +129,69 @@ class MangaReader extends MProvider { "One-Shot": 1, "Bitti": 1, "จบแล้ว": 1, - "tamat": 1, - "completado": 1, - "concluído": 1, - "完結": 1, - "concluido": 1, - "bitmiş": 1, "hiatus": 2, "พักชั่วคราว": 2, - "on hold": 2, - "pausado": 2, - "en espera": 2, - "en pause": 2, - "en attente": 2, - "canceled": 3, - "cancelled": 3, - "cancelado": 3, - "cancellato": 3, - "cancelados": 3, - "dropped": 3, - "discontinued": 3, - "abandonné": 3 } ]; url = getUrlWithoutDomain(url); MManga manga = MManga(); final res = (await client.get(Uri.parse("$baseUrl$url"))).body; - final document = parseHtml(res); - final seriesDetails = document.selectFirst( - "div.bigcontent, div.animefull, div.main-info, div.postbody"); - manga.author = seriesDetails - .selectFirst(".infotable tr:contains(Author) td:last-child, .tsinfo .imptdt:contains(Author) i, .fmed b:contains(Author)+span, span:contains(Author), " + - ".infotable tr:contains(Auteur) td:last-child, .tsinfo .imptdt:contains(Auteur) i, .fmed b:contains(Auteur)+span, span:contains(Auteur), " + - ".infotable tr:contains(autor) td:last-child, .tsinfo .imptdt:contains(autor) i, .fmed b:contains(autor)+span, span:contains(autor), " + - ".infotable tr:contains(المؤلف) td:last-child, .tsinfo .imptdt:contains(المؤلف) i, .fmed b:contains(المؤلف)+span, span:contains(المؤلف), " + - ".infotable tr:contains(Mangaka) td:last-child, .tsinfo .imptdt:contains(Mangaka) i, .fmed b:contains(Mangaka)+span, span:contains(Mangaka), " + - ".infotable tr:contains(seniman) td:last-child, .tsinfo .imptdt:contains(seniman) i, .fmed b:contains(seniman)+span, span:contains(seniman), " + - ".infotable tr:contains(Pengarang) td:last-child, .tsinfo .imptdt:contains(Pengarang) i, .fmed b:contains(Pengarang)+span, span:contains(Pengarang), " + - ".infotable tr:contains(Yazar) td:last-child, .tsinfo .imptdt:contains(Yazar) i, .fmed b:contains(Yazar)+span, span:contains(Yazar), " + - ".infotable tr:contains(ผู้วาด) td:last-child, .tsinfo .imptdt:contains(ผู้วาด) i, .fmed b:contains(ผู้วาด)+span, span:contains(ผู้วาด), ") - .text; + List author = xpath( + res, + "//table[contains(@class, 'infotable')]//tr[contains(text(), 'Author')]/td[last()]/text() | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt') and contains(text(), 'Author')]//i/text() | //div[contains(@class, 'fmed')]//b[contains(text(), 'Author')]/following-sibling::span[1]/text() | //span[contains(text(), 'Author')]/text() | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt')]//span[contains(text(), 'ผู้วาด')]/following-sibling::i/text()", + ''); + if (author.isEmpty) { + author = xpath( + res, + "//table[contains(@class, 'infotable')]//tr[contains(text(), '${authorLocalStr(source.lang)}')]/td[last()]/text() | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt') and contains(text(), '${authorLocalStr(source.lang)}')]//i/text() | //div[contains(@class, 'fmed')]//b[contains(text(), '${authorLocalStr(source.lang)}')]/following-sibling::span[1]/text() | //span[contains(text(), '${authorLocalStr(source.lang)}')]/text() | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt')]//span[contains(text(), 'ผู้แต่ง')]/following-sibling::i/text()", + ''); + } + if (author.isNotEmpty) { + manga.author = author.first; + } - manga.description = seriesDetails - .selectFirst(".desc, .entry-content[itemprop=description]") + final description = parseHtml(res) + .selectFirst( + ".desc, .entry-content[itemprop=description], .tsinfo > .wd-full > .entry-content[itemprop=description]") ?.text; - final status = seriesDetails - .selectFirst(".infotable tr:contains(status) td:last-child, .tsinfo .imptdt:contains(status) i, .fmed b:contains(status)+span span:contains(status), " + - ".infotable tr:contains(Statut) td:last-child, .tsinfo .imptdt:contains(Statut) i, .fmed b:contains(Statut)+span span:contains(Statut), " + - ".infotable tr:contains(Durum) td:last-child, .tsinfo .imptdt:contains(Durum) i, .fmed b:contains(Durum)+span span:contains(Durum), " + - ".infotable tr:contains(連載状況) td:last-child, .tsinfo .imptdt:contains(連載状況) i, .fmed b:contains(連載状況)+span span:contains(連載状況), " + - ".infotable tr:contains(Estado) td:last-child, .tsinfo .imptdt:contains(Estado) i, .fmed b:contains(Estado)+span span:contains(Estado), " + - ".infotable tr:contains(الحالة) td:last-child, .tsinfo .imptdt:contains(الحالة) i, .fmed b:contains(الحالة)+span span:contains(الحالة), " + - ".infotable tr:contains(حالة العمل) td:last-child, .tsinfo .imptdt:contains(حالة العمل) i, .fmed b:contains(حالة العمل)+span span:contains(حالة العمل), " + - ".infotable tr:contains(สถานะ) td:last-child, .tsinfo .imptdt:contains(สถานะ) i, .fmed b:contains(สถานะ)+span span:contains(สถานะ), " + - ".infotable tr:contains(stato) td:last-child, .tsinfo .imptdt:contains(stato) i, .fmed b:contains(stato)+span span:contains(stato), " + - ".infotable tr:contains(Statüsü) td:last-child, .tsinfo .imptdt:contains(Statüsü) i, .fmed b:contains(Statüsü)+span span:contains(Statüsü), " + - ".infotable tr:contains(สถานะ) td:last-child, .tsinfo .imptdt:contains(สถานะ) i, .fmed b:contains(สถานะ)+span span:contains(สถานะ)") - ?.text ?? - ""; - manga.status = parseStatus(status, statusList); - manga.genre = seriesDetails - .select("div.gnr a, .mgen a, .seriestugenre a, " + - "span:contains(genre) , span:contains(التصنيف)") - .map((e) => e.text) - .toList(); - final elements = document.select( - "div.bxcl li, div.cl li, #chapterlist li, ul li:has(div.chbox):has(div.eph-num)"); + + if (description != null) { + manga.description = description; + } + + List status = xpath( + res, + "//table[contains(@class, 'infotable')]//tr[contains(text(), 'Status')]/td[last()]/text() | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt') and contains(text(), 'Status')]//i/text() | //div[contains(@class, 'fmed')]//b[contains(text(), 'Status')]/following-sibling::span[1]/text() | //span[contains(text(), 'Status')]/text() | | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt')]//span[contains(text(), 'สถานะ')]/following-sibling::i/text()", + ''); + if (status.isEmpty) { + status = xpath( + res, + "//table[contains(@class, 'infotable')]//tr[contains(text(), '${statusLocalStr(source.lang)}')]/td[last()]/text() | //div[contains(@class, 'tsinfo')]//div[contains(@class, 'imptdt') and contains(text(), '${statusLocalStr(source.lang)}')]//i/text() | //div[contains(@class, 'fmed')]//b[contains(text(), '${statusLocalStr(source.lang)}')]/following-sibling::span[1]/text() | //span[contains(text(), '${statusLocalStr(source.lang)}')]/text()", + ''); + } + + if (status.isNotEmpty) { + manga.status = parseStatus(status.first, statusList); + } + + manga.genre = xpath(res, + '//*[@class="gnr" or @class="mgen" or @class="seriestugenre" ]/a/text()'); + var chapUrls = xpath(res, + '//*[@class="bxcl" or @class="cl" or @class="chbox" or @class="eph-num" or @id="chapterlist"]/div/a[not(contains(@href,"{{number}}"))]/@href'); + var chaptersNames = xpath(res, + '//*[@class="bxcl" or @class="cl" or @class="chbox" or @class="eph-num" or @id="chapterlist"]/div/a/span[@class="chapternum" and not(contains(text(),"{{number}}")) or @class="lch" and not(text()="Chapter {{number}}")]/text()'); + var chapterDates = xpath(res, + '//*[@class="bxcl" or @class="cl" or @class="chbox" or @class="eph-num" or @id="chapterlist"]/div/a/span[@class="chapterdate" and not(contains(text(),"{{date}}"))]/text()'); + var dateUploads = + parseDates(chapterDates, source.dateFormat, source.dateFormatLocale); + List? chaptersList = []; - for (var element in elements) { - final urlElements = element.selectFirst("a"); - final name = - element.selectFirst(".lch a, .chapternum")?.text ?? urlElements.text; - var chapter = MChapter(); - chapter.name = name; - chapter.url = urlElements.attr("href"); - chapter.dateUpload = parseDates([ - element.selectFirst(".chapterdate")?.text ?? - DateTime.now().millisecondsSinceEpoch.toString() - ], source.dateFormat, source.dateFormatLocale)[0]; + for (var i = 0; i < chaptersNames.length; i++) { + MChapter chapter = MChapter(); + chapter.name = chaptersNames[i]; + chapter.url = chapUrls[i]; + chapter.dateUpload = dateUploads[i]; chaptersList.add(chapter); } manga.chapters = chaptersList; @@ -224,24 +202,32 @@ class MangaReader extends MProvider { Future> getPageList(String url) async { url = getUrlWithoutDomain(url); final res = (await client.get(Uri.parse('$baseUrl$url'))).body; - List pagesUrl = []; - final htmlElements = parseHtml(res).select("div#readerarea img"); - for (var htmlElement in htmlElements) { - String img = htmlElement.getSrc; - if (img.contains("data:image")) { - img = htmlElement.getDataSrc; - } - pagesUrl.add(img); + List pages = []; + List pagesUrl = []; + bool invalidImgs = false; + pages = xpath(res, '//*[@id="readerarea"]/p/img/@src'); + if (pages.isEmpty || pages.length == 1) { + pages = xpath(res, '//*[@id="readerarea"]/img/@src'); } - if (pagesUrl.isEmpty || pagesUrl.length == 1) { - RegExp exp = RegExp("\"images\"\\s*:\\s*(\\[.*?])"); - var match = exp.allMatches(res).toList()[0] as RegExpMatch; - final images = match.group(1); - final pages = json.decode(images!) as List; + if (pages.length > 1) { + for (var page in pages) { + if (page.contains("data:image")) { + invalidImgs = true; + } + } + if (invalidImgs) { + pages = xpath(res, '//*[@id="readerarea"]/img/@data-src'); + } + } + if (pages.isEmpty || pages.length == 1) { + final images = regExp(res, "\"images\"\\s*:\\s*(\\[.*?])", "", 1, 1); + final pages = json.decode(images) as List; for (var page in pages) { pagesUrl.add(page); } + } else { + return pages; } return pagesUrl; @@ -249,18 +235,28 @@ class MangaReader extends MProvider { MPages mangaRes(String res) { List mangaList = []; - final document = parseHtml(res); - final elements = - document.select(".utao .uta .imgu, .listupd .bs .bsx, .listo .bs .bsx"); - for (var element in elements) { - String img = element.getSrc; + final urls = xpath( + res, '//*[ @class="imgu" or @class="bsx" or @class="card"]/a/@href'); + final names = xpath( + res, '//*[ @class="imgu" or @class="bsx" or @class="card"]/a/@title'); + List images = []; + images = xpath(res, + '//*[ @class="imgu" or @class="bsx"]/a/div[1]/img/@src | //div[@class="card"]/div[@class="card__img"]/@data-background-img'); + bool invalidImgs = false; + for (var img in images) { if (img.contains("data:image")) { - img = element.getDataSrc; + invalidImgs = true; } - var manga = MManga(); - manga.name = element.selectFirst("a").attr("title"); - manga.imageUrl = img; - manga.link = element.selectFirst("a").attr("href"); + } + if (invalidImgs) { + images = xpath(res, + '//*[ @class="imgu" or @class="bsx"]/a/div[1]/img/@data-src | //div[@class="card"]/a/div[@class="card__img--hover"]/@data-background-img'); + } + for (var i = 0; i < names.length; i++) { + MManga manga = MManga(); + manga.name = names[i]; + manga.imageUrl = images[i]; + manga.link = urls[i]; mangaList.add(manga); } @@ -316,6 +312,22 @@ class MangaReader extends MProvider { ]; } + String authorLocalStr(String lang) { + if (lang == "fr") { + return "Auteur"; + } + return "Author"; + } + + String statusLocalStr(String lang) { + if (lang == "fr") { + return "Statut"; + } else if (lang == "es") { + return "Estado"; + } + return "Status"; + } + String ll(String url) { if (url.contains("?")) { return "&"; diff --git a/dart/manga/multisrc/mangareader/sources.dart b/dart/manga/multisrc/mangareader/sources.dart index adb8d7a9..2aa4dacd 100644 --- a/dart/manga/multisrc/mangareader/sources.dart +++ b/dart/manga/multisrc/mangareader/sources.dart @@ -128,7 +128,7 @@ import 'src/shijiescans/shijiescans.dart'; import 'src/summertoon/summertoon.dart'; import 'src/zenithscans/zenithscans.dart'; -const mangareaderVersion = "0.1.25"; +const mangareaderVersion = "0.1.3"; const mangareaderSourceCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/mangareader.dart";