diff --git a/lib/eval/dart/bridge/document.dart b/lib/eval/dart/bridge/document.dart index 5c10f945..fe113e76 100644 --- a/lib/eval/dart/bridge/document.dart +++ b/lib/eval/dart/bridge/document.dart @@ -53,6 +53,9 @@ class MDocumentBridge { ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(documentBridgedClass); + interpreter.registerBridgedClass( + documentBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/element.dart b/lib/eval/dart/bridge/element.dart index 2c633b8e..c7b29ace 100644 --- a/lib/eval/dart/bridge/element.dart +++ b/lib/eval/dart/bridge/element.dart @@ -61,6 +61,9 @@ class MElementBridge { ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(elementBridgedClass); + interpreter.registerBridgedClass( + elementBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/filter.dart b/lib/eval/dart/bridge/filter.dart index 8122b28f..bfcd8113 100644 --- a/lib/eval/dart/bridge/filter.dart +++ b/lib/eval/dart/bridge/filter.dart @@ -358,16 +358,41 @@ class FilterBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(filterBridgedClass); - interpreter.registerBridgedClass(selectFilterBridgedClass); - interpreter.registerBridgedClass(selectFilterOptionBridgedClass); - interpreter.registerBridgedClass(separatorFilterBridgedClass); - interpreter.registerBridgedClass(headerFilterBridgedClass); - interpreter.registerBridgedClass(textFilterBridgedClass); - interpreter.registerBridgedClass(sortFilterBridgedClass); - interpreter.registerBridgedClass(sortStateBridgedClass); - interpreter.registerBridgedClass(triStateFilterBridgedClass); - interpreter.registerBridgedClass(groupFilterBridgedClass); - interpreter.registerBridgedClass(checkBoxFilterBridgedClass); + interpreter.registerBridgedClass( + filterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + selectFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + selectFilterOptionBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + separatorFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + textFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + sortFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + triStateFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + groupFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + checkBoxFilterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/http.dart b/lib/eval/dart/bridge/http.dart index e9432a50..a6803811 100644 --- a/lib/eval/dart/bridge/http.dart +++ b/lib/eval/dart/bridge/http.dart @@ -33,7 +33,7 @@ class HttpBridge { (target as Client).post( positionalArgs[0] as Uri, headers: namedArgs.get('headers')?.cast(), - body: namedArgs.get('body'), + body: namedArgs.get('body'), encoding: namedArgs.get('encoding'), ), 'put': @@ -41,7 +41,7 @@ class HttpBridge { (target as Client).put( positionalArgs[0] as Uri, headers: namedArgs.get('headers')?.cast(), - body: namedArgs.get('body'), + body: namedArgs.get('body'), encoding: namedArgs.get('encoding'), ), 'delete': @@ -49,7 +49,7 @@ class HttpBridge { (target as Client).delete( positionalArgs[0] as Uri, headers: namedArgs.get('headers')?.cast(), - body: namedArgs.get('body'), + body: namedArgs.get('body'), encoding: namedArgs.get('encoding'), ), 'head': @@ -63,7 +63,7 @@ class HttpBridge { (target as Client).patch( positionalArgs[0] as Uri, headers: namedArgs.get('headers')?.cast(), - body: namedArgs.get('body'), + body: namedArgs.get('body'), encoding: namedArgs.get('encoding'), ), 'read': @@ -165,10 +165,25 @@ class HttpBridge { ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(baseRequestBridgedClass); - interpreter.registerBridgedClass(clientBridgedClass); - interpreter.registerBridgedClass(responseBridgedClass); - interpreter.registerBridgedClass(streamedResponseBridgedClass); - interpreter.registerBridgedClass(byteStreamBridgedClass); + interpreter.registerBridgedClass( + baseRequestBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + clientBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + responseBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + streamedResponseBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + byteStreamBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_chapter.dart b/lib/eval/dart/bridge/m_chapter.dart index 22c26246..28f0d4fc 100644 --- a/lib/eval/dart/bridge/m_chapter.dart +++ b/lib/eval/dart/bridge/m_chapter.dart @@ -37,6 +37,9 @@ class MChapterBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mChapterBridgedClass); + interpreter.registerBridgedClass( + mChapterBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_manga.dart b/lib/eval/dart/bridge/m_manga.dart index 62f53e7f..bb7836de 100644 --- a/lib/eval/dart/bridge/m_manga.dart +++ b/lib/eval/dart/bridge/m_manga.dart @@ -13,10 +13,10 @@ class MMangaBridge { author: namedArgs.get('author'), description: namedArgs.get('description'), genre: namedArgs.get('genre')?.cast(), - status: namedArgs.get('status'), + status: namedArgs.get('status') ?? Status.unknown, imageUrl: namedArgs.get('imageUrl'), link: namedArgs.get('link'), - chapters: namedArgs.get('chapters')?.cast(), + chapters: namedArgs.get('chapters')?.cast() ?? [], name: namedArgs.get('name'), ); }, @@ -62,6 +62,9 @@ class MMangaBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mMangaBridgedClass); + interpreter.registerBridgedClass( + mMangaBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_pages.dart b/lib/eval/dart/bridge/m_pages.dart index 8c27a69e..620315ed 100644 --- a/lib/eval/dart/bridge/m_pages.dart +++ b/lib/eval/dart/bridge/m_pages.dart @@ -28,6 +28,9 @@ class MPagesBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mPageBridgedClass); + interpreter.registerBridgedClass( + mPageBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index 09f649df..4d54d6ab 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -63,7 +63,10 @@ class MProviderBridged { ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mProviderBridged); + interpreter.registerBridgedClass( + mProviderBridged, + 'package:mangayomi/bridge_lib.dart', + ); interpreter.registertopLevelFunction( 'getPreferenceValue', (visitor, positionalArgs, namedArgs, _) => getPreferenceValue( diff --git a/lib/eval/dart/bridge/m_source.dart b/lib/eval/dart/bridge/m_source.dart index 26936d79..c0de5521 100644 --- a/lib/eval/dart/bridge/m_source.dart +++ b/lib/eval/dart/bridge/m_source.dart @@ -39,6 +39,9 @@ class MSourceBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mSourceBridgedClass); + interpreter.registerBridgedClass( + mSourceBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_status.dart b/lib/eval/dart/bridge/m_status.dart index d58d4f02..455d9ba3 100644 --- a/lib/eval/dart/bridge/m_status.dart +++ b/lib/eval/dart/bridge/m_status.dart @@ -7,6 +7,9 @@ class MStatusBridge { values: Status.values, ); void registerBridgedEnum(D4rt interpreter) { - interpreter.registerBridgedEnum(statusDefinition); + interpreter.registerBridgedEnum( + statusDefinition, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_track.dart b/lib/eval/dart/bridge/m_track.dart index 454a0319..6ebbf2d7 100644 --- a/lib/eval/dart/bridge/m_track.dart +++ b/lib/eval/dart/bridge/m_track.dart @@ -26,6 +26,9 @@ class MTrackBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mTrackBridgedClass); + interpreter.registerBridgedClass( + mTrackBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/m_video.dart b/lib/eval/dart/bridge/m_video.dart index 9efd059e..7546dd83 100644 --- a/lib/eval/dart/bridge/m_video.dart +++ b/lib/eval/dart/bridge/m_video.dart @@ -46,6 +46,9 @@ class MVideoBridge { }, ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(mVideoBridgedClass); + interpreter.registerBridgedClass( + mVideoBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/bridge/source_preference.dart b/lib/eval/dart/bridge/source_preference.dart index 8d94c1f5..be3d0ee6 100644 --- a/lib/eval/dart/bridge/source_preference.dart +++ b/lib/eval/dart/bridge/source_preference.dart @@ -176,10 +176,25 @@ class SourcePreferenceBridge { ); void registerBridgedClasses(D4rt interpreter) { - interpreter.registerBridgedClass(checkBoxPreferenceBridgedClass); - interpreter.registerBridgedClass(switchPreferenceCompatBridgedClass); - interpreter.registerBridgedClass(listPreferenceBridgedClass); - interpreter.registerBridgedClass(multiSelectListPreferenceBridgedClass); - interpreter.registerBridgedClass(editTextPreferenceBridgedClass); + interpreter.registerBridgedClass( + checkBoxPreferenceBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + switchPreferenceCompatBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + listPreferenceBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + multiSelectListPreferenceBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); + interpreter.registerBridgedClass( + editTextPreferenceBridgedClass, + 'package:mangayomi/bridge_lib.dart', + ); } } diff --git a/lib/eval/dart/service.dart b/lib/eval/dart/service.dart index a8530d5b..f3cbd397 100644 --- a/lib/eval/dart/service.dart +++ b/lib/eval/dart/service.dart @@ -21,7 +21,7 @@ class DartExtensionService implements ExtensionService { final interpreter = D4rt(); RegistrerBridge.registerBridge(interpreter); - interpreter.execute(source.sourceCode!, mainArgs: source.toMSource()); + interpreter.execute(source: source.sourceCode!, args: source.toMSource()); return interpreter; } @@ -186,522 +186,3 @@ class DartExtensionService implements ExtensionService { } } } - -final aaaaaa = r''' - -import 'package:mangayomi/bridge_lib.dart'; -import 'dart:convert'; - -class AniZone extends MProvider { - AniZone({required this.source}); - - final MSource source; - final Client client = Client(source); - - // Constants for the xpath - static const String urlXpath = - '//*[contains(@class,"flw-item item-qtip")]/div[@class="film-poster"]/a/@href'; - static const String nameXpath = - '//*[contains(@class,"flw-item item-qtip")]/div[@class="film-detail"]/h3/text()'; - static const String imageXpath = - '//*[contains(@class,"flw-item item-qtip")]/div[@class="film-poster"]/img/@data-src'; - - // Methods for fetching the manga list (popular, latest & search) - Future _getMangaList(String url) async { - final doc = (await client.get(Uri.parse(url))).body; - List animeList = []; - - final urls = xpath(doc, urlXpath); - final names = xpath(doc, nameXpath); - final images = xpath(doc, imageXpath); - - if (urls.isEmpty || names.isEmpty || images.isEmpty) { - return MPages([], false); - } - - for (var i = 0; i < names.length; i++) { - print(names[i]); - MManga anime = MManga(); - anime.name = names[i]; - anime.imageUrl = images[i]; - anime.link = urls[i]; - animeList.add(anime); - } - - return MPages(animeList, urls.isNotEmpty); - } - - @override - Future getPopular(int page) async { - return _getMangaList("${source.baseUrl}/most-popular/?page=$page"); - } - - @override - Future getLatestUpdates(int page) async { - return _getMangaList("${source.baseUrl}/recently-added/?page=$page"); - } - - @override - Future search(String query, int page, FilterList filterList) async { - String baseUrl = "${source.baseUrl}/filter?keyword=$query"; - - final filterHandlers = { - "TypeFilter": "type", - "LanguageFilter": "lang", - "SaisonFilter": "season", - "StatusFilter": "status", - "GenreFilter": "genre", - }; - - final activeFilterParams = {}; - - for (var filter in filterList.filters) { - final paramKey = filterHandlers[filter.type]; - if (paramKey != null && filter.state is List) { - final selectedValues = - (filter.state as List) - .where((item) { - return item.state == true && item.value != null; - }) - .map((item) => item.value as String) - .toList(); - - if (selectedValues.isNotEmpty) { - activeFilterParams[paramKey] = selectedValues.join("%2C"); - } - } - } - - if (activeFilterParams.isNotEmpty) { - final queryString = activeFilterParams.entries - .map((entry) => '${Uri.encodeComponent(entry.key)}=${entry.value}') - .join('&'); - baseUrl += '&$queryString'; - } - - return _getMangaList("$baseUrl&page=$page"); - } - - Future getDetail(String url) async { - MManga anime = MManga(); - try { - final doc = (await client.get(Uri.parse(url))).body; - final description = xpath(doc, '//p[contains(@class,"short")]/text()'); - anime.description = description.isNotEmpty ? description.first : ""; - - final statusList = xpath( - doc, - '//div[contains(@class,"col2")]//div[contains(@class,"item")]//div[contains(@class,"item-content")]/text()', - ); - if (statusList.isNotEmpty) { - if (statusList[0] == "Terminer") { - anime.status = MStatus.completed; - } else if (statusList[0] == "En cours") { - anime.status = MStatus.ongoing; - } else { - anime.status = MStatus.unknown; - } - } else { - anime.status = MStatus.unknown; - } - - anime.genre = xpath( - doc, - '//div[contains(@class,"item")]//div[contains(@class,"item-content")]//a[contains(@href,"genre")]/text()', - ); - - final regex = RegExp(r'(\d+)$'); - final match = regex.firstMatch(url); - - if (match == null) { - throw Exception('Numéro de l\'épisode non trouvé dans l\'URL.'); - } - - final res = - (await client.get( - Uri.parse("${source.baseUrl}/ajax/episode/list/${match.group(1)}"), - )).body; - - List episodesList = []; - - final episodeElements = parseHtml( - json.decode(res)["html"], - ).select(".ep-item"); - - // Associer chaque titre à son URL et récupérer les vidéos - for (var element in episodeElements) { - MChapter episode = MChapter(); - episode.name = element.attr("title"); - - String id = substringAfterLast(element.attr("href"), "="); - episode.url = "${source.baseUrl}/ajax/episode/servers?episodeId=$id"; - episodesList.add(episode); - } - - anime.chapters = episodesList.reversed.toList(); - - return anime; - } catch (e) { - throw Exception('Erreur lors de la récupération des détails: $e'); - } - } - - @override - Future> getVideoList(String url) async { - final videoRes = - (await client.get( - Uri.parse(url), - headers: {"Referer": "${source.baseUrl}/"}, - )).body; - - final lang = xpath( - videoRes.replaceAll(r'\', ''), - '//div[contains(@class,"item server-item")]/@data-type', - ); - final links = xpath( - videoRes.replaceAll(r'\', ''), - '//div[contains(@class,"item server-item")]/@data-id', - ); - final playersNames = xpath( - videoRes.replaceAll(r'\', ''), - '//div[contains(@class,"item server-item")]/text()', - ); - List> players = []; - for (int j = 0; j < links.length; j++) { - // schema of players https://v1.animesz.xyz/ajax/episode/servers?episodeId=(id_episode) - // schema or url https://v1.animesz.xyz/ajax/episode/sources?id=(player_id)&epid=(id_episode) - if (playersNames.isNotEmpty && playersNames[j] == "sibnet") { - final playerUrl = - "https://video.sibnet.ru/shell.php?videoid=${links[j]}"; - players.add({"lang": lang[j], "player": playerUrl}); - } else if (playersNames.isNotEmpty && playersNames[j] == "sendvid") { - final playerUrl = "https://sendvid.com/embed/${links[j]}"; - players.add({"lang": lang[j], "player": playerUrl}); - } else if (playersNames.isNotEmpty && playersNames[j] == "VidCDN") { - final playerUrl = - "https://r.vidcdn.xyz/v1/api/get_sources/${links[j].replaceFirst(RegExp(r'vidcdn$'), '')}"; - players.add({"lang": lang[j], "player": playerUrl}); - } else if (playersNames.isNotEmpty && playersNames[j] == "Voe") { - final playerUrl = "https://voe.sx/e/${links[j]}"; - players.add({"lang": lang[j], "player": playerUrl}); - } else if (playersNames.isNotEmpty && playersNames[j] == "Fmoon") { - final playerUrl = - "https://filemoon.sx/e/${links[j]}&data-realid=${links[j]}&epid=${substringAfter(url, "episodeId=")}"; - players.add({"lang": lang[j], "player": playerUrl}); - } - } - - List videos = []; - for (var player in players) { - String lang = (player["lang"] as String).toUpperCase(); - String playerUrl = player["player"]; - List a = []; - if (playerUrl.contains("sendvid")) { - a = await sendVidExtractorr(playerUrl, "$lang "); - } else if (playerUrl.contains("sibnet.ru")) { - a = await sibnetExtractor(playerUrl, lang); - } else if (playerUrl.contains("voe.sx")) { - a = await voeExtractor(playerUrl, "$lang "); - } else if (playerUrl.contains("vidcdn")) { - a = await vidcdnExtractor(playerUrl, lang); - } else if (playerUrl.contains("filemoon")) { - a = await filemoonExtractor(playerUrl, "$lang Filemoon - ", ""); - } else if (playerUrl.contains("vidhide")) { - a = await streamHideExtractor(playerUrl, lang); - } - videos.addAll(a); - } - - return sortVideos(videos, source.id); - } - - Future> streamHideExtractor(String url, String prefix) async { - final res = (await client.get(Uri.parse(url))).body; - final masterUrl = substringBefore( - substringAfter( - substringAfter(substringAfter(unpackJs(res), "sources:"), "file:\""), - "src:\"", - ), - '"', - ); - final masterPlaylistRes = (await client.get(Uri.parse(masterUrl))).body; - List videos = []; - for (var it in substringAfter( - masterPlaylistRes, - "#EXT-X-STREAM-INF:", - ).split("#EXT-X-STREAM-INF:")) { - final quality = - "${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p"; - - String videoUrl = substringBefore(substringAfter(it, "\n"), "\n"); - - if (!videoUrl.startsWith("http")) { - videoUrl = - "${masterUrl.split("/").sublist(0, masterUrl.split("/").length - 1).join("/")}/$videoUrl"; - } - - MVideo video = MVideo(); - video - ..url = videoUrl - ..originalUrl = videoUrl - ..quality = "$prefix StreamHideVid - $quality"; - videos.add(video); - } - return videos; - } - - @override - List getFilterList() { - return [ - GroupFilter("TypeFilter", "Type", [ - CheckBoxFilter("Film", "1"), - CheckBoxFilter("Anime", "2"), - CheckBoxFilter("OVA", "3"), - CheckBoxFilter("ONA", "4"), - CheckBoxFilter("Special", "5"), - CheckBoxFilter("Music", "6"), - ]), - GroupFilter("LanguageFilter", "Langue", [ - CheckBoxFilter("VF", "3"), - CheckBoxFilter("VOSTFR", "4"), - CheckBoxFilter("Multicc", "2"), - CheckBoxFilter("EN", "1"), - ]), - GroupFilter("SaisonFilter", "Saison", [ - CheckBoxFilter("Printemps", "1"), - CheckBoxFilter("Été", "2"), - CheckBoxFilter("Automne", "3"), - CheckBoxFilter("Hiver", "4"), - ]), - GroupFilter("StatusFilter", "Statut", [ - CheckBoxFilter("Terminés", "1"), - CheckBoxFilter("En cours", "2"), - CheckBoxFilter("Pas encore diffusés", "3"), - ]), - GroupFilter("GenreFilter", "Genre", [ - CheckBoxFilter("Action", "1"), - CheckBoxFilter("Aventure", "2"), - CheckBoxFilter("Voitures", "3"), - CheckBoxFilter("Comédie", "4"), - CheckBoxFilter("Démence", "5"), - CheckBoxFilter("Démons", "6"), - CheckBoxFilter("Drame", "8"), - CheckBoxFilter("Ecchi", "9"), - CheckBoxFilter("Fantastique", "10"), - CheckBoxFilter("Jeu", "11"), - CheckBoxFilter("Harem", "35"), - CheckBoxFilter("Historique", "13"), - CheckBoxFilter("Horreur", "14"), - CheckBoxFilter("Isekai", "44"), - CheckBoxFilter("Josei", "43"), - CheckBoxFilter("Enfants", "25"), - CheckBoxFilter("Magie", "16"), - CheckBoxFilter("Arts martiaux", "17"), - CheckBoxFilter("Mecha", "18"), - CheckBoxFilter("Militaire", "38"), - CheckBoxFilter("Musique", "19"), - CheckBoxFilter("Mystère", "7"), - CheckBoxFilter("Parodie", "20"), - CheckBoxFilter("Police", "39"), - CheckBoxFilter("Psychologique", "40"), - CheckBoxFilter("Romance", "22"), - CheckBoxFilter("Samouraï", "21"), - CheckBoxFilter("École", "23"), - CheckBoxFilter("Science-Fiction", "24"), - CheckBoxFilter("Seinen", "42"), - CheckBoxFilter("Shoujo Ai", "26"), - CheckBoxFilter("Shoujo", "25"), - CheckBoxFilter("Shounen Ai", "28"), - CheckBoxFilter("Tranche de vie", "36"), - CheckBoxFilter("Shounen", "27"), - CheckBoxFilter("Espace", "29"), - CheckBoxFilter("Sports", "30"), - CheckBoxFilter("Super Pouvoir", "31"), - CheckBoxFilter("Surnaturel", "37"), - CheckBoxFilter("Vampire", "32"), - CheckBoxFilter("Yaoi", "33"), - CheckBoxFilter("Yuri", "34"), - ]), - ]; - } - - @override - List getSourcePreferences() { - return [ - ListPreference( - key: "preferred_quality", - title: "Qualité préférée", - summary: "", - valueIndex: 0, - entries: ["1080p", "720p", "480p", "360p"], - entryValues: ["1080", "720", "480", "360"], - ), - ListPreference( - key: "voices_preference", - title: "Préférence des voix", - summary: "", - valueIndex: 0, - entries: ["Préférer VOSTFR", "Préférer VF"], - entryValues: ["vostfr", "vf"], - ), - ]; - } - - List sortVideos(List videos, int sourceId) { - String quality = getPreferenceValue(sourceId, "preferred_quality"); - String voice = getPreferenceValue(sourceId, "voices_preference"); - - videos.sort((MVideo a, MVideo b) { - int qualityMatchA = 0; - if (a.quality.contains(quality) && - a.quality.toLowerCase().contains(voice)) { - qualityMatchA = 1; - } - int qualityMatchB = 0; - if (b.quality.contains(quality) && - b.quality.toLowerCase().contains(voice)) { - qualityMatchB = 1; - } - if (qualityMatchA != qualityMatchB) { - return qualityMatchB - qualityMatchA; - } - - final regex = RegExp(r'(\d+)p'); - final matchA = regex.firstMatch(a.quality); - final matchB = regex.firstMatch(b.quality); - final int qualityNumA = int.tryParse(matchA?.group(1) ?? '0') ?? 0; - final int qualityNumB = int.tryParse(matchB?.group(1) ?? '0') ?? 0; - return qualityNumB - qualityNumA; - }); - return videos; - } - - Future> sendVidExtractorr(String url, String prefix) async { - final res = (await client.get(Uri.parse(url))).body; - final document = parseHtml(res); - final masterUrl = document.selectFirst("source#video_source")?.attr("src"); - print(masterUrl); - if (masterUrl == null) return []; - final masterHeaders = { - "Accept": "*/*", - "Host": Uri.parse(masterUrl).host, - "Origin": "https://${Uri.parse(url).host}", - "Referer": "https://${Uri.parse(url).host}/", - }; - List videos = []; - if (masterUrl.contains(".m3u8")) { - final masterPlaylistRes = (await client.get(Uri.parse(masterUrl))).body; - - for (var it in substringAfter( - masterPlaylistRes, - "#EXT-X-STREAM-INF:", - ).split("#EXT-X-STREAM-INF:")) { - final quality = - "${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p"; - - String videoUrl = substringBefore(substringAfter(it, "\n"), "\n"); - - if (!videoUrl.startsWith("http")) { - videoUrl = - "${masterUrl.split("/").sublist(0, masterUrl.split("/").length - 1).join("/")}/$videoUrl"; - } - final videoHeaders = { - "Accept": "*/*", - "Host": Uri.parse(videoUrl).host, - "Origin": "https://${Uri.parse(url).host}", - "Referer": "https://${Uri.parse(url).host}/", - }; - var video = MVideo(); - video - ..url = videoUrl - ..originalUrl = videoUrl - ..quality = prefix + "Sendvid:$quality" - ..headers = videoHeaders; - videos.add(video); - } - } else { - var video = MVideo(); - video - ..url = masterUrl - ..originalUrl = masterUrl - ..quality = prefix + "Sendvid:default" - ..headers = masterHeaders; - videos.add(video); - } - - return videos; - } - - Future> vidcdnExtractor(String url, String prefix) async { - final res = await client.get(Uri.parse(url)); - if (res.statusCode != 200) { - print("Erreur lors de la récupération de la page : ${res.statusCode}"); - return []; - } - final jsonResponse = jsonDecode(res.body); - - String masterUrl = jsonResponse['sources'][0]['file'] ?? ''; - final quality = jsonResponse['quality'] ?? ''; - - List videos = []; - - final masterPlaylistRes = await client.get(Uri.parse(masterUrl)); - if (masterPlaylistRes.statusCode != 200) { - print( - "Error lors de la récupération de la playlist M3U8 : ${masterPlaylistRes.statusCode}", - ); - return []; - } - - final masterPlaylistBody = masterPlaylistRes.body; - - final playlistLines = masterPlaylistBody.split("\n"); - - for (int i = 0; i < playlistLines.length; i++) { - final line = playlistLines[i]; - if (line.startsWith("#EXT-X-STREAM-INF")) { - final resolutionLine = line.split("RESOLUTION=").last; - final resolution = resolutionLine.split(",").first; - final width = int.parse(resolution.split("x").first); - final height = int.parse(resolution.split("x").last); - - String videoQuality; - if (height >= 1080) { - videoQuality = "1080p"; - } else if (height >= 720) { - videoQuality = "720p"; - } else if (height >= 480) { - videoQuality = "480p"; - } else if (height >= 360) { - videoQuality = "360p"; - } else { - videoQuality = "${height}p"; - } - - String videoUrl = playlistLines[i + 1].trim(); - - if (!videoUrl.startsWith("http")) { - videoUrl = - "${masterUrl.substring(0, masterUrl.lastIndexOf('/'))}/$videoUrl"; - } - - var video = MVideo(); - video - ..url = masterUrl - ..originalUrl = masterUrl - ..quality = "$prefix VidCDN:$videoQuality"; - videos.add(video); - } - } - return videos; - } -} - -AniZone main(MSource source) { - return AniZone(source: source); -} - - - - -'''; diff --git a/lib/eval/model/document.dart b/lib/eval/model/document.dart index 1b245b83..94d6aa3e 100644 --- a/lib/eval/model/document.dart +++ b/lib/eval/model/document.dart @@ -17,7 +17,7 @@ class MDocument { String? get outerHtml => _document?.outerHtml; - String? get text => _document?.text; + String? get text => _document?.text?.trim(); List? get children => _document?.children.map((e) => MElement(e)).toList(); @@ -57,7 +57,7 @@ class MDocument { } String? attr(String attr) { - return _document?.attr(attr); + return _document?.attr(attr)?.trim(); } bool hasAttr(String attr) { diff --git a/lib/eval/model/element.dart b/lib/eval/model/element.dart index 35ce093a..12fec102 100644 --- a/lib/eval/model/element.dart +++ b/lib/eval/model/element.dart @@ -10,7 +10,7 @@ class MElement { String? get innerHtml => _element?.innerHtml; - String? get text => _element?.text; + String? get text => _element?.text.trim(); String? get className => _element?.className; diff --git a/lib/eval/model/m_bridge.dart b/lib/eval/model/m_bridge.dart index 2daf286e..4af2f4d3 100644 --- a/lib/eval/model/m_bridge.dart +++ b/lib/eval/model/m_bridge.dart @@ -158,24 +158,25 @@ class MBridge { ) { List val = []; for (var element in value) { - val.add(element); + element = element.toString().trim(); + if (element.isNotEmpty) { + val.add(element); + } } bool error = false; List valD = []; for (var date in val) { - if (date.toString().isNotEmpty) { - String dateStr = ""; - if (error) { - dateStr = DateTime.now().millisecondsSinceEpoch.toString(); - } else { - dateStr = parseChapterDate(date, dateFormat, dateFormatLocale, (val) { - dateFormat = val.$1; - dateFormatLocale = val.$2; - error = val.$3; - }); - } - valD.add(dateStr); + String dateStr = ""; + if (error) { + dateStr = DateTime.now().millisecondsSinceEpoch.toString(); + } else { + dateStr = parseChapterDate(date, dateFormat, dateFormatLocale, (val) { + dateFormat = val.$1; + dateFormatLocale = val.$2; + error = val.$3; + }); } + valD.add(dateStr); } return valD; } diff --git a/lib/eval/model/m_manga.dart b/lib/eval/model/m_manga.dart index bf90c42e..ca8d31c5 100644 --- a/lib/eval/model/m_manga.dart +++ b/lib/eval/model/m_manga.dart @@ -62,15 +62,17 @@ class MManga { : [], ); } - Map toJson() => { - 'name': name, - 'link': link, - 'imageUrl': imageUrl, - 'description': description, - 'author': author, - 'artist': artist, - 'status': status.toString().substringAfter("."), - 'genre': genre, - 'chapters': chapters!.map((e) => e.toJson()).toList(), - }; + Map toJson() { + return { + 'name': name, + 'link': link, + 'imageUrl': imageUrl, + 'description': description, + 'author': author, + 'artist': artist, + 'status': status.toString().substringAfter("."), + 'genre': genre, + 'chapters': chapters!.map((e) => e.toJson()).toList(), + }; + } } diff --git a/lib/modules/manga/home/manga_home_screen.dart b/lib/modules/manga/home/manga_home_screen.dart index a1efc822..e1d2af68 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -122,9 +122,9 @@ class _MangaHomeScreenState extends ConsumerState { int _length = 0; bool _isFiltering = false; late final supportsLatest = ref.watch(supportsLatestProvider(source: source)); + late final filterList = getFilterList(source: source); @override Widget build(BuildContext context) { - final filterList = getFilterList(source: source); if (_selectedIndex == 2 && (_isSearch && _query.isNotEmpty) || _isFiltering) { _getManga = ref.watch( diff --git a/pubspec.lock b/pubspec.lock index 7a3ab30a..0afc0d73 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -354,10 +354,10 @@ packages: dependency: "direct main" description: name: d4rt - sha256: ceaeb41ec6d1a208b553deb19cf6a1dc7a588d41dae9652953920d0636c2e9c0 + sha256: "3bb743e9e7567e240d0c8326a99fd7e26989e2a16516acef50f2bc55ade39451" url: "https://pub.dev" source: hosted - version: "0.0.2" + version: "0.0.5" dart_style: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index aa8e13c0..0f957471 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,7 +86,7 @@ dependencies: marquee: ^2.2.3 epubx: path: ./epubx - d4rt: ^0.0.2 + d4rt: ^0.0.5 dependency_overrides: ffi: ^2.1.3