diff --git a/anime/source_generator.dart b/anime/source_generator.dart index da5df896..fbe3c5ad 100644 --- a/anime/source_generator.dart +++ b/anime/source_generator.dart @@ -4,6 +4,7 @@ import 'dart:io'; import '../model/source.dart'; import 'src/en/gogoanime/source.dart'; import 'src/en/wcostream/source.dart'; +import 'src/fr/animesultra/source.dart'; import 'src/fr/franime/source.dart'; import 'src/fr/otakufr/source.dart'; import 'src/fr/universanime/source.dart'; @@ -14,7 +15,8 @@ void main() { franimeSource, universanimeSource, otakufr, - wcostreamSource + wcostreamSource, + animesultraSource ]; final List> jsonList = _sourcesList.map((source) => source.toJson()).toList(); diff --git a/anime/src/fr/animesultra/animesultra-v0.0.1.dart b/anime/src/fr/animesultra/animesultra-v0.0.1.dart new file mode 100644 index 00000000..9964f93f --- /dev/null +++ b/anime/src/fr/animesultra/animesultra-v0.0.1.dart @@ -0,0 +1,175 @@ +import 'dart:convert'; +import 'package:bridge_lib/bridge_lib.dart'; + +getPopularAnime(MangaModel anime) async { + final data = {"url": "${anime.baseUrl}/", "headers": null}; + final res = await MBridge.http(json.encode(data), 0); + if (res.isEmpty) { + return anime; + } + anime.urls = MBridge.xpath( + res, + '//*[contains(@class,"swiper-slide item-qtip")]/div[@class="item"]/a/@href', + '._') + .split('._'); + + anime.names = MBridge.xpath( + res, + '//*[contains(@class,"swiper-slide item-qtip")]/div[@class="item"]/a/img/@title', + '._') + .split('._'); + + anime.images = MBridge.xpath( + res, + '//*[contains(@class,"swiper-slide item-qtip")]/div[@class="item"]/a/img/@data-src', + '._') + .split('._'); + anime.hasNextPage = false; + return anime; +} + +getLatestUpdatesAnime(MangaModel anime) async { + final data = { + "url": "${anime.baseUrl}/", + "headers": null, + "sourceId": anime.sourceId + }; + final res = await MBridge.http(json.encode(data), 0); + if (res.isEmpty) { + return anime; + } + + anime.urls = MBridge.xpath( + res, + '//*[@class="block_area block_area_home"]/div[@class="tab-content"]/div[contains(@class,"block_area-content block_area-list")]/div[@class="film_list-wrap"]/div[@class="flw-item"]/div[@class="film-poster"]/a/@href', + '._') + .split('._'); + + anime.names = MBridge.xpath( + res, + '//*[@class="block_area block_area_home"]/div[@class="tab-content"]/div[contains(@class,"block_area-content block_area-list")]/div[@class="film_list-wrap"]/div[@class="flw-item"]/div[@class="film-poster"]/a/@title', + '._') + .split('._'); + + anime.images = MBridge.xpath( + res, + '//*[@class="block_area block_area_home"]/div[@class="tab-content"]/div[contains(@class,"block_area-content block_area-list")]/div[@class="film_list-wrap"]/div[@class="flw-item"]/div[@class="film-poster"]/img/@data-src', + '._') + .split('._'); + anime.hasNextPage = false; + return anime; +} + +searchAnime(MangaModel anime) async { + final url = + "${anime.baseUrl}/?story=${anime.query}&do=search&subaction=search"; + final data = {"url": url, "headers": null}; + final res = await MBridge.http(json.encode(data), 0); + if (res.isEmpty) { + return anime; + } + anime.urls = + MBridge.xpath(res, '//*[@class="film-poster"]/a/@href', '._').split('._'); + + anime.names = MBridge.xpath(res, '//*[@class="film-poster"]/a/@title', '._') + .split('._'); + anime.images = + MBridge.xpath(res, '//*[@class="film-poster"]/img/@data-src', '._') + .split('._'); + anime.hasNextPage = false; + return anime; +} + +getAnimeDetail(MangaModel anime) async { + final statusList = [ + { + "En cours": 0, + "Terminé": 1, + } + ]; + final url = anime.link; + final data = {"url": url, "headers": null}; + String res = await MBridge.http(json.encode(data), 0); + if (res.isEmpty) { + return anime; + } + + anime.description = + MBridge.xpath(res, '//*[@class="film-description m-hide"]/text()', ''); + + final status = MBridge.xpath( + res, + '//*[@class="item item-title" and contains(text(),"Status:")]/span[2]/text()', + ''); + + anime.status = MBridge.parseStatus(status, statusList); + + anime.genre = MBridge.xpath( + res, + '//*[@class="item item-list" and contains(text(),"Genres:")]/a/text()', + '._') + .split('._'); + anime.author = MBridge.xpath( + res, + '//*[@class="item item-title" and contains(text(),"Studio:")]/span[2]/text()', + ''); + final urlEp = anime.link.replaceAll('.html', '/episode-1.html'); + final resEpWebview = + await MBridge.getHtmlViaWebview(urlEp, '//*[@class="ss-list"]/a/@href'); + anime.urls = MBridge.listParse( + MBridge.xpath(resEpWebview, '//*[@class="ss-list"]/a/@href', '._') + .split("._"), + 5); + + anime.names = MBridge.listParse( + MBridge.xpath( + resEpWebview, + '//*[@class="ss-list"]/a/div[@class="ssli-detail"]/div/text()', + '._') + .split("._"), + 5); + anime.chaptersDateUploads = []; + return anime; +} + +getVideoList(MangaModel anime) async { + final resWebview = await MBridge.getHtmlViaWebview( + anime.link, '//*[@class="ps__-list"]/div/@data-server-id'); + + final serverIds = MBridge.xpath( + resWebview, '//*[@class="ps__-list"]/div/@data-server-id', ".-") + .split(".-"); + final serverNames = + MBridge.xpath(resWebview, '//*[@class="ps__-list"]/div/a/text()', ".-") + .split(".-"); + List serverUrls = []; + for (var id in MBridge.listParse(serverIds, 0)) { + final serversUrls = + MBridge.xpath(resWebview, '//*[@id="content_player_${id}"]/text()', ""); + serverUrls.add(serversUrls); + } + + List videos = []; + for (var i = 0; i < serverNames.length; i++) { + final name = MBridge.listParse(serverNames, 0)[i].toString(); + final url = MBridge.listParse(serverUrls, 0)[i].toString(); + + List a = []; + if (name.contains("Sendvid")) { + a = await MBridge.sendVidExtractor( + url.replaceAll("https:////", "https://"), + json.encode({"Referer": "${anime.baseUrl}/"}), + ""); + } else if (name.contains("Sibnet")) { + a = await MBridge.sibnetExtractor( + "https://video.sibnet.ru/shell.php?videoid=$url"); + } else if (name.contains("Mytv")) { + a = await MBridge.myTvExtractor("https://www.myvi.tv/embed/$url"); + } + for (var vi in a) { + videos.add(vi); + } + } + + return videos; +} diff --git a/anime/src/fr/animesultra/source.dart b/anime/src/fr/animesultra/source.dart new file mode 100644 index 00000000..c6359803 --- /dev/null +++ b/anime/src/fr/animesultra/source.dart @@ -0,0 +1,16 @@ +import '../../../../model/source.dart'; + +Source get animesultraSource => _animesultraSource; +const animesultraVersion = "0.0.1"; +const animesultraSourceCodeUrl = + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/animesultra/animesultra-v$animesultraVersion.dart"; +Source _animesultraSource = Source( + name: "AnimesUltra", + baseUrl: "https://ww.animesultra.net", + lang: "fr", + typeSource: "single", + iconUrl: '', + sourceCodeUrl: animesultraSourceCodeUrl, + version: animesultraVersion, + isManga: false, + isFullData: false); diff --git a/anime/src/fr/otakufr/otakufr-v0.0.1.dart b/anime/src/fr/otakufr/otakufr-v0.0.12.dart similarity index 81% rename from anime/src/fr/otakufr/otakufr-v0.0.1.dart rename to anime/src/fr/otakufr/otakufr-v0.0.12.dart index 92d21bac..3023cb5d 100644 --- a/anime/src/fr/otakufr/otakufr-v0.0.1.dart +++ b/anime/src/fr/otakufr/otakufr-v0.0.12.dart @@ -13,15 +13,15 @@ getPopularAnime(MangaModel anime) async { } anime.urls = MBridge.xpath( - res, '//*[@class="list"]/article/div/div/figure/a/@href', '._') - .split('._'); + res, '//*[@class="list"]/article/div/div/figure/a/@href', '._.._.._') + .split('._.._.._'); - anime.names = MBridge.xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@title', '._') - .split('._'); - anime.images = MBridge.xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@src', '._') - .split('._'); + anime.names = MBridge.xpath(res, + '//*[@class="list"]/article/div/div/figure/a/img/@title', '._.._.._') + .split('._.._.._'); + anime.images = MBridge.xpath(res, + '//*[@class="list"]/article/div/div/figure/a/img/@src', '._.._.._') + .split('._.._.._'); final nextPage = MBridge.xpath(res, '//a[@class="next page-link"]/@href', ''); if (nextPage.isEmpty) { anime.hasNextPage = false; @@ -43,10 +43,11 @@ getLatestUpdatesAnime(MangaModel anime) async { } anime.urls = - MBridge.xpath(res, '//*[@class="episode"]/div/a/@href', '._').split('._'); + MBridge.xpath(res, '//*[@class="episode"]/div/a/@href', '._.._.._') + .split('._.._.._'); List namess = - MBridge.xpath(res, '//*[@class="episode"]/div/a/text()', '._') - .split('._'); + MBridge.xpath(res, '//*[@class="episode"]/div/a/text()', '._.._.._') + .split('._.._.._'); List names = []; for (var name in MBridge.listParse(namess, 0)) { names.add(MBridge.regExp( @@ -67,9 +68,11 @@ getLatestUpdatesAnime(MangaModel anime) async { .replaceAll(' (Vostfr)', '')); } anime.names = names; - anime.images = - MBridge.xpath(res, '//*[@class="episode"]/div/figure/a/img/@src', '._') - .split('._'); + anime.images = MBridge.xpath( + res, + '//*[@class="episode"]/div/figure/a/img/@src', + '._.._.._.._.._.._.._.._.._') + .split('._.._.._.._.._.._.._.._.._'); final nextPage = MBridge.xpath(res, '//a[@class="next page-link"]/@href', ''); if (nextPage.isEmpty) { anime.hasNextPage = false; @@ -115,18 +118,18 @@ getAnimeDetail(MangaModel anime) async { anime.genre = MBridge.xpath( res, '//*[@class="list-unstyled"]/li[contains(text(),"Genre")]/ul/li/a/text()', - '._') - .split('._'); + '._.._.._') + .split('._.._.._'); - anime.urls = - MBridge.xpath(res, '//*[@class="list-episodes list-group"]/a/@href', '._') - .split("._"); - List dates = MBridge.xpath( - res, '//*[@class="list-episodes list-group"]/a/span/text()', '._') - .split("._"); + anime.urls = MBridge.xpath( + res, '//*[@class="list-episodes list-group"]/a/@href', '._.._.._') + .split("._.._.._"); + List dates = MBridge.xpath(res, + '//*[@class="list-episodes list-group"]/a/span/text()', '._.._.._') + .split("._.._.._"); List names = MBridge.xpath( - res, '//*[@class="list-episodes list-group"]/a/text()', '._') - .split("._"); + res, '//*[@class="list-episodes list-group"]/a/text()', '._.._.._') + .split("._.._.._"); List episodes = []; for (var i = 0; i < names.length; i++) { @@ -135,7 +138,6 @@ getAnimeDetail(MangaModel anime) async { episodes.add( "Episode ${MBridge.regExp(name.replaceAll(date, ""), r".* (\d*) [VvfF]{1,1}", '', 1, 1)}"); } - print(episodes); anime.names = episodes; anime.chaptersDateUploads = MBridge.listParse( MBridge.listParseDateTime(dates, "dd MMMM yyyy", "fr"), 0); @@ -155,15 +157,15 @@ searchAnime(MangaModel anime) async { } anime.urls = MBridge.xpath( - res, '//*[@class="list"]/article/div/div/figure/a/@href', '._') - .split('._'); + res, '//*[@class="list"]/article/div/div/figure/a/@href', '._.._.._') + .split('._.._.._'); - anime.names = MBridge.xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@title', '._') - .split('._'); - anime.images = MBridge.xpath( - res, '//*[@class="list"]/article/div/div/figure/a/img/@src', '._') - .split('._'); + anime.names = MBridge.xpath(res, + '//*[@class="list"]/article/div/div/figure/a/img/@title', '._.._.._') + .split('._.._.._'); + anime.images = MBridge.xpath(res, + '//*[@class="list"]/article/div/div/figure/a/img/@src', '._.._.._') + .split('._.._.._'); final nextPage = MBridge.xpath(res, '//a[@class="next page-link"]/@href', ''); if (nextPage.isEmpty) { anime.hasNextPage = false; @@ -209,9 +211,7 @@ getVideoList(MangaModel anime) async { } else if (serverUrl.contains("https://voe.sx")) { a = await MBridge.voeExtractor(serverUrl, null); } else if (serverUrl.contains("https://ok.ru")) { - a = await MBridge.okruExtractor( - serverUrl, - ); + a = await MBridge.okruExtractor(serverUrl); } for (var vi in a) { videos.add(vi); diff --git a/anime/src/fr/otakufr/source.dart b/anime/src/fr/otakufr/source.dart index 419189cb..d0117fc4 100644 --- a/anime/src/fr/otakufr/source.dart +++ b/anime/src/fr/otakufr/source.dart @@ -1,7 +1,7 @@ import '../../../../model/source.dart'; Source get otakufr => _otakufr; -const otakufrVersion = "0.0.1"; +const otakufrVersion = "0.0.12"; const otakufrCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/otakufr/otakufr-v$otakufrVersion.dart"; Source _otakufr = Source( diff --git a/anime/src/fr/universanime/universanime-v0.0.12.dart b/anime/src/fr/universanime/universanime-v0.0.13.dart similarity index 87% rename from anime/src/fr/universanime/universanime-v0.0.12.dart rename to anime/src/fr/universanime/universanime-v0.0.13.dart index a98a2eb5..9a281a38 100644 --- a/anime/src/fr/universanime/universanime-v0.0.12.dart +++ b/anime/src/fr/universanime/universanime-v0.0.13.dart @@ -23,6 +23,7 @@ getVideoList(MangaModel anime) async { print(url); List a = []; if (url.startsWith("https://filemoon.")) { + a = await MBridge.filemoonExtractor(url, ""); } else if (url.startsWith("https://doodstream.")) { a = await MBridge.doodExtractor(url); } else if (url.startsWith("https://streamtape.")) { @@ -36,7 +37,7 @@ getVideoList(MangaModel anime) async { return videos; } -getLatestUpdatesAnime(MangaModel anime) async { +Future getLatestUpdatesAnime(MangaModel anime) async { final data = { "url": "${anime.baseUrl}/page/${anime.page}/", "headers": null, @@ -93,30 +94,7 @@ getAnimeDetail(MangaModel anime) async { } getPopularAnime(MangaModel anime) async { - final data = { - "url": "${anime.baseUrl}/liste-des-animes-2/", - "headers": null, - "sourceId": anime.sourceId - }; - final res = await MBridge.http(json.encode(data), 0); - if (res.isEmpty) { - return anime; - } - anime.urls = MBridge.xpath( - res, - '//*[@class="lcp_catlist" and contains(@id,"lcp_instance_")]/li/a/@href', - '._') - .split('._'); - - anime.names = MBridge.xpath( - res, - '//*[@class="lcp_catlist" and contains(@id,"lcp_instance_")]/li/a/text()', - '._') - .split('._'); - - anime.images = []; - - return anime; + return await getLatestUpdatesAnime(anime); } searchAnime(MangaModel anime) async {