From 8ae72d12e7fce42d3e8f8227903c6a376cbbd723 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Wed, 1 Nov 2023 17:13:24 +0100 Subject: [PATCH] Add New sources: BeastScan (AR), Lelmanga (FR) & remove unused code --- .../multisrc/zorotheme/zorotheme-v0.0.4.dart | 19 +--- anime/src/ar/okanime/okanime-v0.0.25.dart | 14 +-- anime/src/en/gogoanime/gogoanime-v0.0.35.dart | 15 +-- anime/src/en/kisskh/kisskh-v0.0.25.dart | 8 +- .../fr/animesultra/animesultra-v0.0.35.dart | 29 ++--- anime/src/fr/franime/franime-v0.0.35.dart | 5 - anime/src/fr/otakufr/otakufr-v0.0.35.dart | 47 +++----- icons/mangayomi-ar-beastscans.png | Bin 0 -> 8788 bytes icons/mangayomi-fr-lelmanga.png | Bin 0 -> 4060 bytes index.json | 2 +- manga/multisrc/heancms/heancms-v0.0.35.dart | 5 - manga/multisrc/madara/madara-v0.0.35.dart | 105 ++++++++---------- .../mangareader/mangareader-v0.0.45.dart | 76 ++++++------- manga/multisrc/mangareader/sources.dart | 18 +++ manga/multisrc/mmrcms/mmrcms-v0.0.35.dart | 59 +++++----- manga/multisrc/nepnep/nepnep-v0.0.25.dart | 20 ---- manga/multisrc/nepnep/sources.dart | 2 + manga/src/all/batoto/batoto-v0.0.35.dart | 5 - manga/src/all/comick/comick-v0.0.35.dart | 5 - manga/src/all/mangadex/mangadex-v0.0.35.dart | 49 +++----- manga/src/en/mangahere/mangahere-v0.0.35.dart | 48 ++++---- 21 files changed, 210 insertions(+), 321 deletions(-) create mode 100644 icons/mangayomi-ar-beastscans.png create mode 100644 icons/mangayomi-fr-lelmanga.png diff --git a/anime/multisrc/zorotheme/zorotheme-v0.0.4.dart b/anime/multisrc/zorotheme/zorotheme-v0.0.4.dart index b57a3245..12195cb1 100644 --- a/anime/multisrc/zorotheme/zorotheme-v0.0.4.dart +++ b/anime/multisrc/zorotheme/zorotheme-v0.0.4.dart @@ -22,9 +22,7 @@ class ZoroTheme extends MProvider { @override Future search(MSource source, String query, int page) async { - final data = { - "url": "${source.baseUrl}/search?keyword=$query&page=$page" - }; + final data = {"url": "${source.baseUrl}/search?keyword=$query&page=$page"}; final res = await http('GET', json.encode(data)); return animeElementM(res); @@ -44,7 +42,7 @@ class ZoroTheme extends MProvider { final status = xpath(res, '//*[@class="anisc-info"]/div[contains(text(),"Status:")]/span[2]/text()') .first; - + anime.status = parseStatus(status, statusList); anime.author = xpath(res, '//*[@class="anisc-info"]/div[contains(text(),"Studios:")]/span/text()') @@ -150,8 +148,7 @@ class ZoroTheme extends MProvider { }; final resE = await http('GET', json.encode(datasE)); - String epUrl = substringBefore( - substringAfter(resE, "\"link\":\""), "\""); + String epUrl = substringBefore(substringAfter(resE, "\"link\":\""), "\""); print(epUrl); List a = []; if (name.contains("Vidstreaming")) { @@ -167,11 +164,6 @@ class ZoroTheme extends MProvider { return videos; } - @override - Future> getPageList(MSource source, String url) async { - return []; - } - MPages animeElementM(String res) { List animeList = []; @@ -190,8 +182,8 @@ class ZoroTheme extends MProvider { anime.link = urls[i]; animeList.add(anime); } - final nextPage = xpath( - res, '//li[@class="page-item"]/a[@title="Next"]/@href', ""); + final nextPage = + xpath(res, '//li[@class="page-item"]/a[@title="Next"]/@href', ""); return MPages(animeList, !nextPage.isEmpty); } @@ -206,4 +198,3 @@ class ZoroTheme extends MProvider { ZoroTheme main() { return ZoroTheme(); } - diff --git a/anime/src/ar/okanime/okanime-v0.0.25.dart b/anime/src/ar/okanime/okanime-v0.0.25.dart index b91e3c6e..585eb5d0 100644 --- a/anime/src/ar/okanime/okanime-v0.0.25.dart +++ b/anime/src/ar/okanime/okanime-v0.0.25.dart @@ -94,11 +94,9 @@ class OkAnime extends MProvider { if (status.isNotEmpty) { anime.status = parseStatus(status.first, statusList); } - anime.description = - xpath(res, '//*[@class="review-content"]/text()').first; + anime.description = xpath(res, '//*[@class="review-content"]/text()').first; - anime.genre = - xpath(res, '//*[@class="review-author-info"]/a/text()'); + anime.genre = xpath(res, '//*[@class="review-author-info"]/a/text()'); final epUrls = xpath(res, '//*[contains(@class,"anime-card")]/div[@class="anime-title")]/h5/a/@href') .reversed @@ -125,8 +123,7 @@ class OkAnime extends MProvider { final res = await http('GET', json.encode({"url": url})); final urls = xpath(res, '//*[@id="streamlinks"]/a/@data-src'); - final qualities = - xpath(res, '//*[@id="streamlinks"]/a/span/text()'); + final qualities = xpath(res, '//*[@id="streamlinks"]/a/span/text()'); List videos = []; for (var i = 0; i < urls.length; i++) { @@ -172,11 +169,6 @@ class OkAnime extends MProvider { } return false; } - - @override - Future> getPageList(MSource source, String url) async { - return []; - } } OkAnime main() { diff --git a/anime/src/en/gogoanime/gogoanime-v0.0.35.dart b/anime/src/en/gogoanime/gogoanime-v0.0.35.dart index e91f98d6..a6731e88 100644 --- a/anime/src/en/gogoanime/gogoanime-v0.0.35.dart +++ b/anime/src/en/gogoanime/gogoanime-v0.0.35.dart @@ -34,8 +34,8 @@ class GogoAnime extends MProvider { final res = await http('GET', json.encode(data)); List animeList = []; - final urls = xpath( - res, '//*[@class="added_series_body popular"]/ul/li/a[1]/@href'); + final urls = + xpath(res, '//*[@class="added_series_body popular"]/ul/li/a[1]/@href'); final names = xpath( res, '//*[//*[@class="added_series_body popular"]/ul/li/a[1]/@title'); List images = []; @@ -111,8 +111,7 @@ class GogoAnime extends MProvider { final dataEp = {"url": urlEp}; final resEp = await http('GET', json.encode(dataEp)); - final epUrls = - xpath(resEp, '//*[@id="episode_related"]/li/a/@href'); + final epUrls = xpath(resEp, '//*[@id="episode_related"]/li/a/@href'); final names = xpath( resEp, '//*[@id="episode_related"]/li/a/div[@class="name"]/text()'); List episodes = []; @@ -139,8 +138,7 @@ class GogoAnime extends MProvider { final res = await http('GET', json.encode(datas)); final serverUrls = xpath(res, '//*[@class="anime_muti_link"]/ul/li/a/@data-video'); - final classNames = - xpath(res, '//*[@class="anime_muti_link"]/ul/li/@class'); + final classNames = xpath(res, '//*[@class="anime_muti_link"]/ul/li/@class'); List videos = []; for (var i = 0; i < classNames.length; i++) { final name = classNames[i]; @@ -160,11 +158,6 @@ class GogoAnime extends MProvider { return videos; } - - @override - Future> getPageList(MSource source, String url) async { - return []; - } } GogoAnime main() { diff --git a/anime/src/en/kisskh/kisskh-v0.0.25.dart b/anime/src/en/kisskh/kisskh-v0.0.25.dart index 0bda7ec4..06ee2351 100644 --- a/anime/src/en/kisskh/kisskh-v0.0.25.dart +++ b/anime/src/en/kisskh/kisskh-v0.0.25.dart @@ -126,8 +126,7 @@ class KissKh extends MProvider { final datas = {"url": url}; final res = await http('GET', json.encode(datas)); - final id = substringAfter( - substringBefore(url, ".png"), "Episode/"); + final id = substringAfter(substringBefore(url, ".png"), "Episode/"); final jsonRes = json.decode(res); final subRes = await http( @@ -160,11 +159,6 @@ class KissKh extends MProvider { }; return [video]; } - - @override - Future> getPageList(MSource source, String url) async { - return []; - } } KissKh main() { diff --git a/anime/src/fr/animesultra/animesultra-v0.0.35.dart b/anime/src/fr/animesultra/animesultra-v0.0.35.dart index db10337e..eff595f1 100644 --- a/anime/src/fr/animesultra/animesultra-v0.0.35.dart +++ b/anime/src/fr/animesultra/animesultra-v0.0.35.dart @@ -60,8 +60,7 @@ class AnimesUltra extends MProvider { List animeList = []; final urls = xpath(res, '//*[@class="film-poster"]/a/@href'); final names = xpath(res, '//*[@class="film-poster"]/a/@title'); - final images = - xpath(res, '//*[@class="film-poster"]/img/@data-src'); + final images = xpath(res, '//*[@class="film-poster"]/img/@data-src'); for (var i = 0; i < names.length; i++) { MManga anime = MManga(); @@ -86,8 +85,7 @@ class AnimesUltra extends MProvider { final res = await http('GET', json.encode(data)); MManga anime = MManga(); anime.description = - xpath(res, '//*[@class="film-description m-hide"]/text()') - .first; + xpath(res, '//*[@class="film-description m-hide"]/text()').first; final status = xpath(res, '//*[@class="item item-title" and contains(text(),"Status:")]/span[2]/text()') @@ -101,9 +99,8 @@ class AnimesUltra extends MProvider { final urlEp = url.replaceAll('.html', '/episode-1.html'); final resEpWebview = await getHtmlViaWebview(urlEp, '//*[@class="ss-list"]/a/@href'); - final epUrls = xpath(resEpWebview, '//*[@class="ss-list"]/a/@href') - .reversed - .toList(); + final epUrls = + xpath(resEpWebview, '//*[@class="ss-list"]/a/@href').reversed.toList(); final names = xpath(resEpWebview, '//*[@class="ss-list"]/a/div[@class="ssli-detail"]/div/text()') .reversed @@ -126,15 +123,14 @@ class AnimesUltra extends MProvider { final resWebview = await getHtmlViaWebview( url, '//*[@class="ps__-list"]/div/@data-server-id'); - final serverIds = xpath( - resWebview, '//*[@class="ps__-list"]/div/@data-server-id'); + final serverIds = + xpath(resWebview, '//*[@class="ps__-list"]/div/@data-server-id'); final serverNames = xpath(resWebview, '//*[@class="ps__-list"]/div/a/text()'); List serverUrls = []; for (var id in serverIds) { final serversUrls = - xpath(resWebview, '//*[@id="content_player_${id}"]/text()') - .first; + xpath(resWebview, '//*[@id="content_player_${id}"]/text()').first; serverUrls.add(serversUrls); } List videos = []; @@ -144,10 +140,8 @@ class AnimesUltra extends MProvider { List a = []; if (name.contains("Sendvid")) { - a = await sendVidExtractor( - url.replaceAll("https:////", "https://"), - json.encode({"Referer": "${source.baseUrl}/"}), - ""); + a = await sendVidExtractor(url.replaceAll("https:////", "https://"), + json.encode({"Referer": "${source.baseUrl}/"}), ""); } else if (name.contains("Sibnet")) { a = await sibnetExtractor( "https://video.sibnet.ru/shell.php?videoid=$url"); @@ -159,11 +153,6 @@ class AnimesUltra extends MProvider { return videos; } - - @override - Future> getPageList(MSource source, String url) async { - return []; - } } AnimesUltra main() { diff --git a/anime/src/fr/franime/franime-v0.0.35.dart b/anime/src/fr/franime/franime-v0.0.35.dart index c582b781..0174b04c 100644 --- a/anime/src/fr/franime/franime-v0.0.35.dart +++ b/anime/src/fr/franime/franime-v0.0.35.dart @@ -168,11 +168,6 @@ class FrAnime extends MProvider { return videos; } - @override - Future> getPageList(MSource source, String url) async { - return []; - } - MPages animeResList(String res) { final statusList = [ {"EN COURS": 0, "TERMINÉ": 1} diff --git a/anime/src/fr/otakufr/otakufr-v0.0.35.dart b/anime/src/fr/otakufr/otakufr-v0.0.35.dart index d4fb739a..bf5853e8 100644 --- a/anime/src/fr/otakufr/otakufr-v0.0.35.dart +++ b/anime/src/fr/otakufr/otakufr-v0.0.35.dart @@ -14,10 +14,10 @@ class OtakuFr extends MProvider { List animeList = []; final urls = xpath(res, '//*[@class="list"]/article/div/div/figure/a/@href'); - final names = xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@title'); - final images = xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@src'); + final names = + xpath(res, '//*[@class="list"]/article/div/div/figure/a/img/@title'); + final images = + xpath(res, '//*[@class="list"]/article/div/div/figure/a/img/@src'); for (var i = 0; i < names.length; i++) { MManga anime = MManga(); @@ -57,8 +57,7 @@ class OtakuFr extends MProvider { .replaceAll(' (Vf)', '') .replaceAll(' (Vostfr)', '')); } - final images = - xpath(res, '//*[@class="episode"]/div/figure/a/img/@src'); + final images = xpath(res, '//*[@class="episode"]/div/figure/a/img/@src'); for (var i = 0; i < names.length; i++) { MManga anime = MManga(); @@ -74,18 +73,17 @@ class OtakuFr extends MProvider { @override Future search(MSource source, String query, int page) async { final data = { - "url": - "${source.baseUrl}/toute-la-liste-affiches/page/$page/?q=$query" + "url": "${source.baseUrl}/toute-la-liste-affiches/page/$page/?q=$query" }; final res = await http('GET', json.encode(data)); List animeList = []; final urls = xpath(res, '//*[@class="list"]/article/div/div/figure/a/@href'); - final names = xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@title'); - final images = xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@src'); + final names = + xpath(res, '//*[@class="list"]/article/div/div/figure/a/img/@title'); + final images = + xpath(res, '//*[@class="list"]/article/div/div/figure/a/img/@src'); for (var i = 0; i < names.length; i++) { MManga anime = MManga(); @@ -117,10 +115,9 @@ class OtakuFr extends MProvider { res = await http('GET', json.encode(newData)); } - anime.description = - xpath(res, '//*[@class="episode fz-sm synop"]/p/text()') - .first - .replaceAll("Synopsis:", ""); + anime.description = xpath(res, '//*[@class="episode fz-sm synop"]/p/text()') + .first + .replaceAll("Synopsis:", ""); final status = xpath(res, '//*[@class="list-unstyled"]/li[contains(text(),"Statut")]/text()') .first @@ -129,12 +126,10 @@ class OtakuFr extends MProvider { anime.genre = xpath(res, '//*[@class="list-unstyled"]/li[contains(text(),"Genre")]/ul/li/a/text()'); - final epUrls = - xpath(res, '//*[@class="list-episodes list-group"]/a/@href'); - final dates = xpath( - res, '//*[@class="list-episodes list-group"]/a/span/text()'); - final names = - xpath(res, '//*[@class="list-episodes list-group"]/a/text()'); + final epUrls = xpath(res, '//*[@class="list-episodes list-group"]/a/@href'); + final dates = + xpath(res, '//*[@class="list-episodes list-group"]/a/span/text()'); + final names = xpath(res, '//*[@class="list-episodes list-group"]/a/text()'); List episodes = []; for (var i = 0; i < names.length; i++) { @@ -162,8 +157,7 @@ class OtakuFr extends MProvider { Future> getVideoList(MSource source, String url) async { final res = await http('GET', json.encode({"url": url})); - final servers = - xpath(res, '//*[@id="nav-tabContent"]/div/iframe/@src'); + final servers = xpath(res, '//*[@id="nav-tabContent"]/div/iframe/@src'); List videos = []; for (var url in servers) { final datasServer = { @@ -195,11 +189,6 @@ class OtakuFr extends MProvider { String fixUrl(String url) { return regExp(url, r"^(?:(?:https?:)?//|www\.)", 'https://', 0, 0); } - - @override - Future> getPageList(MSource source, String url) async { - return []; - } } OtakuFr main() { diff --git a/icons/mangayomi-ar-beastscans.png b/icons/mangayomi-ar-beastscans.png new file mode 100644 index 0000000000000000000000000000000000000000..f6afbad5ea1c04a2fe64a4f6e2af009f056a3e10 GIT binary patch literal 8788 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 KMNUMnLSTaX6W^Qw literal 0 HcmV?d00001 diff --git a/icons/mangayomi-fr-lelmanga.png b/icons/mangayomi-fr-lelmanga.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca979d5aa152a552f4238cd41770efff0f28cc3 GIT binary patch literal 4060 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 sources = ["YugenMangas", "Reaper Scans", "Perf Scan"]; return sources.contains(sourceName); } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } Map getHeader(String url) { diff --git a/manga/multisrc/madara/madara-v0.0.35.dart b/manga/multisrc/madara/madara-v0.0.35.dart index c08ad65e..c9fa5175 100644 --- a/manga/multisrc/madara/madara-v0.0.35.dart +++ b/manga/multisrc/madara/madara-v0.0.35.dart @@ -15,8 +15,7 @@ class Madara extends MProvider { final names = xpath(res, '//*[@id^="manga-item"]/a/@title'); var images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-src'); if (images.isEmpty) { - images = - xpath(res, '//*[@id^="manga-item"]/a/img/@data-lazy-src'); + images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-lazy-src'); if (images.isEmpty) { images = xpath(res, '//*[@id^="manga-item"]/a/img/@srcset'); if (images.isEmpty) { @@ -47,8 +46,7 @@ class Madara extends MProvider { final names = xpath(res, '//*[@id^="manga-item"]/a/@title'); var images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-src'); if (images.isEmpty) { - images = - xpath(res, '//*[@id^="manga-item"]/a/img/@data-lazy-src'); + images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-lazy-src'); if (images.isEmpty) { images = xpath(res, '//*[@id^="manga-item"]/a/img/@srcset'); if (images.isEmpty) { @@ -77,21 +75,19 @@ class Madara extends MProvider { final res = await http('GET', json.encode(data)); List mangaList = []; - final urls = - xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/@href'); - final names = - xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/@title'); - var images = xpath( - res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@data-src'); + final urls = xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/@href'); + final names = xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/@title'); + var images = + xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@data-src'); if (images.isEmpty) { images = xpath( res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@data-lazy-src'); if (images.isEmpty) { - images = xpath( - res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@srcset'); + images = + xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@srcset'); if (images.isEmpty) { - images = xpath( - res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@src'); + images = + xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@src'); } } } @@ -158,39 +154,45 @@ class Madara extends MProvider { final datas = {"url": url, "sourceId": source.id}; res = await http('GET', json.encode(datas)); - manga.author = querySelectorAll(res, - selector: "div.author-content > a", - typeElement: 0, - attributes: "", - typeRegExp: 0) - .first; - manga.description = querySelectorAll(res, - selector: - "div.description-summary div.summary__content, div.summary_content div.post-content_item > h5 + div, div.summary_content div.manga-excerpt, div.sinopsis div.contenedor, .description-summary > p", - typeElement: 0, - attributes: "", - typeRegExp: 0) - .first; - manga.imageUrl = querySelectorAll(res, - selector: "div.summary_image img", - typeElement: 2, - attributes: "", - typeRegExp: 2) - .first; + final author = querySelectorAll(res, + selector: "div.author-content > a", + typeElement: 0, + attributes: "", + typeRegExp: 0); + if (author.isNotEmpty) { + manga.author = author.first; + } + final description = querySelectorAll(res, + selector: + "div.description-summary div.summary__content, div.summary_content div.post-content_item > h5 + div, div.summary_content div.manga-excerpt, div.sinopsis div.contenedor, .description-summary > p", + typeElement: 0, + attributes: "", + typeRegExp: 0); + if (description.isNotEmpty) { + manga.description = description.first; + } + final imageUrl = querySelectorAll(res, + selector: "div.summary_image img", + typeElement: 2, + attributes: "", + typeRegExp: 2); + if (imageUrl.isNotEmpty) { + manga.imageUrl = imageUrl.first; + } final mangaId = querySelectorAll(res, selector: "div[id^=manga-chapters-holder]", typeElement: 3, attributes: "data-id", typeRegExp: 0) .first; - manga.status = parseStatus( - querySelectorAll(res, - selector: "div.summary-content", - typeElement: 0, - attributes: "", - typeRegExp: 0) - .last, - statusList); + final status = querySelectorAll(res, + selector: "div.summary-content", + typeElement: 0, + attributes: "", + typeRegExp: 0); + if (status.isNotEmpty) { + manga.status = parseStatus(status.last, statusList); + } manga.genre = querySelectorAll(res, selector: "div.genres-content a", @@ -208,13 +210,9 @@ class Madara extends MProvider { "${baseUrl}wp-admin/admin-ajax.php?action=manga_get_chapters&manga=$mangaId"; final datasP = {"url": urll, "headers": headers, "sourceId": source.id}; res = await http('POST', json.encode(datasP)); - if (res == "400") { + if (res == "error") { final urlP = "${url}ajax/chapters"; - final datasP = { - "url": urlP, - "headers": headers, - "sourceId": source.id - }; + final datasP = {"url": urlP, "headers": headers, "sourceId": source.id}; res = await http('POST', json.encode(datasP)); } @@ -231,8 +229,8 @@ class Madara extends MProvider { dateF = xpath(resWebview, "//*[@id='manga-chapters-holder']/div[2]/div/ul/li/span/i/text()"); } - var dateUploads = parseDates( - dateF, source.dateFormat, source.dateFormatLocale); + var dateUploads = + parseDates(dateF, source.dateFormat, source.dateFormatLocale); if (dateF.length < chaptersNames.length) { final length = chaptersNames.length - dateF.length; String date = "${DateTime.now().millisecondsSinceEpoch}"; @@ -240,8 +238,8 @@ class Madara extends MProvider { date += "--..${DateTime.now().millisecondsSinceEpoch}"; } - final dateFF = parseDates( - dateF, source.dateFormat, source.dateFormatLocale); + final dateFF = + parseDates(dateF, source.dateFormat, source.dateFormatLocale); List chapterDate = date.split('--..'); for (var date in dateFF) { @@ -314,11 +312,6 @@ class Madara extends MProvider { } return pageUrls; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } Madara main() { diff --git a/manga/multisrc/mangareader/mangareader-v0.0.45.dart b/manga/multisrc/mangareader/mangareader-v0.0.45.dart index 6fcedd25..8450733c 100644 --- a/manga/multisrc/mangareader/mangareader-v0.0.45.dart +++ b/manga/multisrc/mangareader/mangareader-v0.0.45.dart @@ -92,33 +92,41 @@ class MangaReader extends MProvider { final datas = {"url": url, "sourceId": source.id}; final res = await http('GET', json.encode(datas)); - manga.author = xpath( - res, - '//*[@class="imptdt" and contains(text(), "Author") or @class="infotable" and contains(text(), "Author") or @class="infotable" and contains(text(), "Auteur") or @class="fmed" and contains(text(), "Auteur") or @class="infotable" and contains(text(), "Autor")]/text()', - '') - .first - .replaceAll("Autor", "") - .replaceAll("Author", "") - .replaceAll("Auteur", "") - .replaceAll("[Add, ]", ""); + final author = xpath( + res, + '//*[@class="imptdt" and contains(text(), "Author") or @class="infotable" and contains(text(), "Author") or @class="infotable" and contains(text(), "Auteur") or @class="fmed" and contains(text(), "Auteur") or @class="infotable" and contains(text(), "Autor")]/text()', + ''); - manga.description = querySelectorAll(res, - selector: ".desc, .entry-content[itemprop=description]", - typeElement: 0, - attributes: "", - typeRegExp: 0) - .first; + if (author.isNotEmpty) { + manga.author = author.first + .replaceAll("Autor", "") + .replaceAll("Author", "") + .replaceAll("Auteur", "") + .replaceAll("[Add, ]", ""); + } + + final description = querySelectorAll(res, + selector: ".desc, .entry-content[itemprop=description]", + typeElement: 0, + attributes: "", + typeRegExp: 0); + if (description.isNotEmpty) { + manga.description = description.first; + } final status = xpath( - res, - '//*[@class="imptdt" and contains(text(), "Status") or @class="imptdt" and contains(text(), "Estado") or @class="infotable" and contains(text(), "Status") or @class="infotable" and contains(text(), "Statut") or @class="imptdt" and contains(text(), "Statut")]/text()', - '') - .first - .replaceAll("Status", "") - .replaceAll("Estado", "") - .replaceAll("Statut", ""); + res, + '//*[@class="imptdt" and contains(text(), "Status") or @class="imptdt" and contains(text(), "Estado") or @class="infotable" and contains(text(), "Status") or @class="infotable" and contains(text(), "Statut") or @class="imptdt" and contains(text(), "Statut")]/text()', + ''); - manga.status = parseStatus(status, statusList); + if (status.isNotEmpty) { + manga.status = parseStatus( + status.first + .replaceAll("Status", "") + .replaceAll("Estado", "") + .replaceAll("Statut", ""), + statusList); + } manga.genre = xpath(res, '//*[@class="gnr" or @class="mgen" or @class="seriestugenre" ]/a/text()'); @@ -130,8 +138,8 @@ class MangaReader extends MProvider { 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(text()="{{date}}")]/text()'); - var dateUploads = parseDates( - chapterDates, source.dateFormat, source.dateFormatLocale); + var dateUploads = + parseDates(chapterDates, source.dateFormat, source.dateFormatLocale); List? chaptersList = []; for (var i = 0; i < chaptersNames.length; i++) { @@ -157,8 +165,7 @@ class MangaReader extends MProvider { pages = xpath(res, '//*[@id="readerarea"]/img/@src'); } if (pages.isEmpty || pages.length == 1) { - final images = - regExp(res, "\"images\"\\s*:\\s*(\\[.*?])", "", 1, 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); @@ -172,12 +179,10 @@ class MangaReader extends MProvider { MPages mangaRes(String res) { List mangaList = []; - final urls = - xpath(res, '//*[ @class="imgu" or @class="bsx"]/a/@href'); - final names = - xpath(res, '//*[ @class="imgu" or @class="bsx"]/a/@title'); - final images = xpath( - res, '//*[ @class="imgu" or @class="bsx"]/a/div[1]/img/@src'); + final urls = xpath(res, '//*[ @class="imgu" or @class="bsx"]/a/@href'); + final names = xpath(res, '//*[ @class="imgu" or @class="bsx"]/a/@title'); + final images = + xpath(res, '//*[ @class="imgu" or @class="bsx"]/a/div[1]/img/@src'); for (var i = 0; i < names.length; i++) { MManga manga = MManga(); @@ -196,11 +201,6 @@ class MangaReader extends MProvider { } return "/manga"; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } MangaReader main() { diff --git a/manga/multisrc/mangareader/sources.dart b/manga/multisrc/mangareader/sources.dart index 7a76b1d6..d0d0ab48 100644 --- a/manga/multisrc/mangareader/sources.dart +++ b/manga/multisrc/mangareader/sources.dart @@ -9,6 +9,24 @@ const defaultDateFormatLocale = "en_US"; List get mangareaderSourcesList => _mangareaderSourcesList; List _mangareaderSourcesList = [ + Source( + name: "Beast Scans", + baseUrl: "https://beast-scans.com", + lang: "ar", + iconUrl: getIconUrl("asurascans", "en"), + dateFormat: "MMMM dd, yyyy", + dateFormatLocale: "ar", + version: mangareaderVersion, + sourceCodeUrl: mangareaderSourceCodeUrl), + Source( + name: "Lelmanga", + baseUrl: "https://www.lelmanga.com", + lang: "fr", + iconUrl: getIconUrl("lelmanga", "fr"), + dateFormat: "MMMM d, yyyy", + dateFormatLocale: "en", + version: mangareaderVersion, + sourceCodeUrl: mangareaderSourceCodeUrl), Source( name: "Asura Scans", baseUrl: "https://asuratoon.com/", diff --git a/manga/multisrc/mmrcms/mmrcms-v0.0.35.dart b/manga/multisrc/mmrcms/mmrcms-v0.0.35.dart index 4fb1882b..77899ec6 100644 --- a/manga/multisrc/mmrcms/mmrcms-v0.0.35.dart +++ b/manga/multisrc/mmrcms/mmrcms-v0.0.35.dart @@ -1,8 +1,8 @@ import 'package:mangayomi/bridge_lib.dart'; import 'dart:convert'; -class MMCRCms extends MProvider { - MMCRCms(); +class MMRCMS extends MProvider { + MMRCMS(); @override Future getPopular(MSource source, int page) async { @@ -131,35 +131,33 @@ class MMCRCms extends MProvider { final datas = {"url": url, "sourceId": source.id}; final res = await http('GET', json.encode(datas)); - manga.author = xpath(res, - '//*[@class="dl-horizontal"]/dt[contains(text(), "Auteur(s)") or contains(text(), "Author(s)") or contains(text(), "Autor(es)") or contains(text(), "Yazar(lar) or contains(text(), "Mangaka(lar)")]//following-sibling::dd[1]/text()') - .first; + final author = xpath(res, + '//*[@class="dl-horizontal"]/dt[contains(text(), "Auteur(s)") or contains(text(), "Author(s)") or contains(text(), "Autor(es)") or contains(text(), "Yazar(lar) or contains(text(), "Mangaka(lar)")]//following-sibling::dd[1]/text()'); + if (author.isNotEmpty) { + manga.author = author.first; + } final status = xpath(res, - '//*[@class="dl-horizontal"]/dt[contains(text(), "Statut") or contains(text(), "Status") or contains(text(), "Estado") or contains(text(), "Durum")]/following-sibling::dd[1]/text()') - .first; - manga.status = parseStatus(status, statusList); - manga.description = - xpath(res, '//*[@class="well" or @class="manga well"]/p/text()') - .first; + '//*[@class="dl-horizontal"]/dt[contains(text(), "Statut") or contains(text(), "Status") or contains(text(), "Estado") or contains(text(), "Durum")]/following-sibling::dd[1]/text()'); + if (status.isNotEmpty) { + manga.status = parseStatus(status.first, statusList); + } + + final description = + xpath(res, '//*[@class="well" or @class="manga well"]/p/text()'); + if (description.isNotEmpty) { + manga.description = description.first; + } + manga.genre = xpath(res, '//*[@class="dl-horizontal"]/dt[contains(text(), "Categories") or contains(text(), "Categorias") or contains(text(), "Categorías") or contains(text(), "Catégories") or contains(text(), "Kategoriler" or contains(text(), "Kategorie") or contains(text(), "Kategori") or contains(text(), "Tagi"))]/following-sibling::dd[1]/text()'); - final baseUrl = "${source.baseUrl}/"; - final headers = { - "Referer": baseUrl, - "Content-Type": "application/x-www-form-urlencoded", - "X-Requested-With": "XMLHttpRequest" - }; - - var chapUrls = - xpath(res, '//*[@class="chapter-title-rtl"]/a/@href'); - var chaptersNames = - xpath(res, '//*[@class="chapter-title-rtl"]/a/text()'); + var chapUrls = xpath(res, '//*[@class="chapter-title-rtl"]/a/@href'); + var chaptersNames = xpath(res, '//*[@class="chapter-title-rtl"]/a/text()'); var chaptersDates = xpath(res, '//*[@class="date-chapter-title-rtl"]/text()'); - var dateUploads = parseDates( - chaptersDates, source.dateFormat, source.dateFormatLocale); + var dateUploads = + parseDates(chaptersDates, source.dateFormat, source.dateFormatLocale); List? chaptersList = []; for (var i = 0; i < chaptersNames.length; i++) { @@ -179,8 +177,8 @@ class MMCRCms extends MProvider { final res = await http('GET', json.encode(datas)); List pagesUrl = []; - final pages = xpath( - res, '//*[@id="all"]/img[@class="img-responsive"]/@data-src'); + final pages = + xpath(res, '//*[@id="all"]/img[@class="img-responsive"]/@data-src'); for (var page in pages) { if (page.startsWith('//')) { pagesUrl.add(page.replaceAll('//', 'https://')); @@ -191,13 +189,8 @@ class MMCRCms extends MProvider { return pagesUrl; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } -MMCRCms main() { - return MMCRCms(); +MMRCMS main() { + return MMRCMS(); } diff --git a/manga/multisrc/nepnep/nepnep-v0.0.25.dart b/manga/multisrc/nepnep/nepnep-v0.0.25.dart index 61f50ade..f7493bcc 100644 --- a/manga/multisrc/nepnep/nepnep-v0.0.25.dart +++ b/manga/multisrc/nepnep/nepnep-v0.0.25.dart @@ -70,22 +70,7 @@ class NepNep extends MProvider { final vmChapters = substringBefore(substringAfter(script, "vm.Chapters = "), ";"); final chapters = json.decode(vmChapters) as List; - var chapUrls = chapters - .map((ch) => - '/read-online/${substringAfter(url, "/manga/")}${chapterURLEncode(ch['Chapter'])}') - .toList(); - var chaptersNames = chapters.map((ch) { - String name = ch['ChapterName'] ?? ""; - String indexChapter = ch['Chapter']; - if (name.isEmpty) { - name = '${ch['Type']} ${chapterImage(indexChapter, true)}'; - } - return name; - }).toList(); - var chaptersDates = chapters.map((ch) => ch['Date']).toList(); - var dateUploads = - parseDates(chaptersDates, source.dateFormat, source.dateFormatLocale); List chaptersList = []; for (var ch in chapters) { @@ -219,11 +204,6 @@ class NepNep extends MProvider { return '-chapter-$n$suffix$index.html'; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } Map getHeader(String url) { diff --git a/manga/multisrc/nepnep/sources.dart b/manga/multisrc/nepnep/sources.dart index af9b4246..548c4726 100644 --- a/manga/multisrc/nepnep/sources.dart +++ b/manga/multisrc/nepnep/sources.dart @@ -15,6 +15,7 @@ List _nepnepSourcesList = [ lang: "en", typeSource: "nepnep", iconUrl: getIconUrl("mangasee", "en"), + isFullData: true, dateFormat: defaultDateFormat, dateFormatLocale: defaultDateFormatLocale, version: nepnepVersion, @@ -26,6 +27,7 @@ List _nepnepSourcesList = [ lang: "en", typeSource: "nepnep", iconUrl: getIconUrl("mangalife", "en"), + isFullData: true, dateFormat: defaultDateFormat, dateFormatLocale: defaultDateFormatLocale, version: nepnepVersion, diff --git a/manga/src/all/batoto/batoto-v0.0.35.dart b/manga/src/all/batoto/batoto-v0.0.35.dart index 961a1955..9f192913 100644 --- a/manga/src/all/batoto/batoto-v0.0.35.dart +++ b/manga/src/all/batoto/batoto-v0.0.35.dart @@ -189,11 +189,6 @@ class Batoto extends MProvider { } return "langs=$lang"; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } Map getMirrorPref() { diff --git a/manga/src/all/comick/comick-v0.0.35.dart b/manga/src/all/comick/comick-v0.0.35.dart index f1f273d8..de315509 100644 --- a/manga/src/all/comick/comick-v0.0.35.dart +++ b/manga/src/all/comick/comick-v0.0.35.dart @@ -166,11 +166,6 @@ class ComickFun extends MProvider { return result; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } Map getHeader(String url) { diff --git a/manga/src/all/mangadex/mangadex-v0.0.35.dart b/manga/src/all/mangadex/mangadex-v0.0.35.dart index e4fb8d97..68f2cb5d 100644 --- a/manga/src/all/mangadex/mangadex-v0.0.35.dart +++ b/manga/src/all/mangadex/mangadex-v0.0.35.dart @@ -57,15 +57,10 @@ class MangaDex extends MProvider { res, r'$..data.relationships[*].attributes.name', ', '); String expressionDescriptionA = r'$..data.attributes.description.en'; - String expressionDescription = regExp( - r'$..data.attributes.description[a]', - r'\[a\]', - ".${source.lang}", - 0, - 1); + String expressionDescription = regExp(r'$..data.attributes.description[a]', + r'\[a\]', ".${source.lang}", 0, 1); - String description = - jsonPathToString(res, expressionDescription, ''); + String description = jsonPathToString(res, expressionDescription, ''); if (description.isEmpty) { description = jsonPathToString(res, expressionDescriptionA, ''); } @@ -81,29 +76,27 @@ class MangaDex extends MProvider { if (contentRating != "safe") { genres.add(contentRating); } - String publicationDemographic = jsonPathToString( - res, r'$..data.attributes.publicationDemographic', ''); + String publicationDemographic = + jsonPathToString(res, r'$..data.attributes.publicationDemographic', ''); if (publicationDemographic == "null") { } else { genres.add(publicationDemographic); } manga.genre = genres; - String statusRes = - jsonPathToString(res, r'$..data.attributes.status', ''); + String statusRes = jsonPathToString(res, r'$..data.attributes.status', ''); manga.status = parseStatus(statusRes, statusList); final mangaId = url.split('/').last; final paginatedChapterList = await paginatedChapterListRequest(mangaId, 0, source.lang); final chapterList = - jsonPathToString(paginatedChapterList, r'$.data[*]', '_.') - .split('_.'); - int limit = int.parse( - jsonPathToString(paginatedChapterList, r'$.limit', '')); - int offset = int.parse( - jsonPathToString(paginatedChapterList, r'$.offset', '')); - int total = int.parse( - jsonPathToString(paginatedChapterList, r'$.total', '')); + jsonPathToString(paginatedChapterList, r'$.data[*]', '_.').split('_.'); + int limit = + int.parse(jsonPathToString(paginatedChapterList, r'$.limit', '')); + int offset = + int.parse(jsonPathToString(paginatedChapterList, r'$.offset', '')); + int total = + int.parse(jsonPathToString(paginatedChapterList, r'$.total', '')); List chapterListA = []; final list = @@ -115,8 +108,7 @@ class MangaDex extends MProvider { offset += limit; var newRequest = await paginatedChapterListRequest(mangaId, offset, source.lang); - int total = - int.parse(jsonPathToString(newRequest, r'$.total', '')); + int total = int.parse(jsonPathToString(newRequest, r'$.total', '')); final chapterList = jsonPathToString(paginatedChapterList, r'$.data[*]', '_.') .split('_.'); @@ -159,8 +151,7 @@ class MangaDex extends MProvider { List getChapters(int length, String paginatedChapterListA) { List chaptersList = []; String paginatedChapterList = paginatedChapterListA.toString(); - final dataList = - jsonPathToList(paginatedChapterList, r'$.data[*]', 0); + final dataList = jsonPathToList(paginatedChapterList, r'$.data[*]', 0); for (var res in dataList) { String scan = "".toString(); final groups = jsonPathToList(res, @@ -215,9 +206,8 @@ class MangaDex extends MProvider { chapterr.name = chapName; chapterr.url = id; chapterr.scanlator = scan; - chapterr.dateUpload = parseDates( - [date], "yyyy-MM-dd'T'HH:mm:ss+SSS", "en_US") - .first; + chapterr.dateUpload = + parseDates([date], "yyyy-MM-dd'T'HH:mm:ss+SSS", "en_US").first; chaptersList.add(chapterr); } } @@ -268,11 +258,6 @@ class MangaDex extends MProvider { } return coverFileName; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } MangaDex main() { diff --git a/manga/src/en/mangahere/mangahere-v0.0.35.dart b/manga/src/en/mangahere/mangahere-v0.0.35.dart index 5416fe00..ffcb8c17 100644 --- a/manga/src/en/mangahere/mangahere-v0.0.35.dart +++ b/manga/src/en/mangahere/mangahere-v0.0.35.dart @@ -13,12 +13,12 @@ class MangaHere extends MProvider { final res = await http('POST', json.encode(data)); List mangaList = []; - final names = xpath( - res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@title'); + final names = + xpath(res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@title'); final images = xpath(res, '//*[ contains(@class, "manga-list-1-list")]/li/a/img[@class="manga-list-1-cover"]/@src'); - final urls = xpath( - res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@href'); + final urls = + xpath(res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@href'); for (var i = 0; i < names.length; i++) { MManga manga = MManga(); @@ -40,12 +40,12 @@ class MangaHere extends MProvider { final res = await http('POST', json.encode(data)); List mangaList = []; - final names = xpath( - res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@title'); + final names = + xpath(res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@title'); final images = xpath(res, '//*[ contains(@class, "manga-list-1-list")]/li/a/img[@class="manga-list-1-cover"]/@src'); - final urls = xpath( - res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@href'); + final urls = + xpath(res, '//*[ contains(@class, "manga-list-1-list")]/li/a/@href'); for (var i = 0; i < names.length; i++) { MManga manga = MManga(); @@ -67,12 +67,12 @@ class MangaHere extends MProvider { final res = await http('POST', json.encode(data)); List mangaList = []; - final names = xpath( - res, '//*[contains(@class, "manga-list-4-list")]/li/a/@title'); + final names = + xpath(res, '//*[contains(@class, "manga-list-4-list")]/li/a/@title'); final images = xpath(res, '//*[contains(@class, "manga-list-4-list")]/li/a/img[@class="manga-list-4-cover"]/@src'); - final urls = xpath( - res, '//*[contains(@class, "manga-list-4-list")]/li/a/@href'); + final urls = + xpath(res, '//*[contains(@class, "manga-list-4-list")]/li/a/@href'); for (var i = 0; i < names.length; i++) { MManga manga = MManga(); @@ -95,25 +95,21 @@ class MangaHere extends MProvider { final res = await http('GET', json.encode(data)); MManga manga = MManga(); manga.author = - xpath(res, '//*[@class="detail-info-right-say"]/a/text()') - .first; - manga.description = - xpath(res, '//*[@class="fullcontent"]/text()').first; + xpath(res, '//*[@class="detail-info-right-say"]/a/text()').first; + manga.description = xpath(res, '//*[@class="fullcontent"]/text()').first; final status = - xpath(res, '//*[@class="detail-info-right-title-tip"]/text()') - .first; + xpath(res, '//*[@class="detail-info-right-title-tip"]/text()').first; manga.status = parseStatus(status, statusList); manga.genre = xpath(res, '//*[@class="detail-info-right-tag-list"]/a/text()'); - var chapUrls = - xpath(res, '//*[@class="detail-main-list"]/li/a/@href'); + var chapUrls = xpath(res, '//*[@class="detail-main-list"]/li/a/@href'); var chaptersNames = xpath(res, '//*[@class="detail-main-list"]/li/a/div/p[@class="title3"]/text()'); final chapterDates = xpath(res, '//*[@class="detail-main-list"]/li/a/div/p[@class="title2"]/text()'); - var dateUploads = parseDates( - chapterDates, source.dateFormat, source.dateFormatLocale); + var dateUploads = + parseDates(chapterDates, source.dateFormat, source.dateFormatLocale); List? chaptersList = []; for (var i = 0; i < chaptersNames.length; i++) { @@ -190,8 +186,7 @@ class MangaHere extends MProvider { } } } - String deobfuscatedScript = - evalJs(responseText.replaceAll("eval", "")); + String deobfuscatedScript = evalJs(responseText.replaceAll("eval", "")); int baseLinkStartPos = deobfuscatedScript.indexOf("pix=") + 5; int baseLinkEndPos = @@ -210,11 +205,6 @@ class MangaHere extends MProvider { return pageUrls; } - - @override - Future> getVideoList(MSource source, String url) async { - return []; - } } Map getHeader(String url) {