From f419f7484d0bd72c1764720e8d0c40faa4c6fd76 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Wed, 4 Sep 2024 13:14:25 +0100 Subject: [PATCH] remove Aniwave --- dart/anime/anime_source_list.dart | 2 - dart/anime/src/en/aniwave/aniwave.dart | 684 ------------------------- dart/anime/src/en/aniwave/icon.png | Bin 3775 -> 0 bytes dart/anime/src/en/aniwave/source.dart | 16 - 4 files changed, 702 deletions(-) delete mode 100644 dart/anime/src/en/aniwave/aniwave.dart delete mode 100644 dart/anime/src/en/aniwave/icon.png delete mode 100644 dart/anime/src/en/aniwave/source.dart diff --git a/dart/anime/anime_source_list.dart b/dart/anime/anime_source_list.dart index 75d831b8..e582dc61 100644 --- a/dart/anime/anime_source_list.dart +++ b/dart/anime/anime_source_list.dart @@ -7,7 +7,6 @@ import 'src/all/nyaa/source.dart'; import 'src/ar/okanime/source.dart'; import 'src/de/animetoast/source.dart'; import 'src/en/animepahe/source.dart'; -import 'src/en/aniwave/source.dart'; import 'src/en/dramacool/source.dart'; import 'src/en/gogoanime/source.dart'; import 'src/en/nineanimetv/source.dart'; @@ -37,7 +36,6 @@ List dartAnimesourceList = [ otakudesu, nimegami, oploverz, - aniwave, ...dopeflixSourcesList, animesaturn, uhdmoviesSource, diff --git a/dart/anime/src/en/aniwave/aniwave.dart b/dart/anime/src/en/aniwave/aniwave.dart deleted file mode 100644 index 420b3f56..00000000 --- a/dart/anime/src/en/aniwave/aniwave.dart +++ /dev/null @@ -1,684 +0,0 @@ -import 'package:mangayomi/bridge_lib.dart'; -import 'dart:convert'; - -class Aniwave extends MProvider { - Aniwave({required this.source}); - - MSource source; - - final Client client = Client(source); - - @override - String get baseUrl => getPreferenceValue(source.id, "preferred_domain2"); - - @override - Future getPopular(int page) async { - final res = (await client - .get(Uri.parse("$baseUrl/filter?sort=trending&page=$page"))) - .body; - return parseAnimeList(res); - } - - @override - Future getLatestUpdates(int page) async { - final res = (await client - .get(Uri.parse("$baseUrl/filter?sort=recently_updated&page=$page"))) - .body; - return parseAnimeList(res); - } - - @override - Future search(String query, int page, FilterList filterList) async { - final filters = filterList.filters; - String url = "$baseUrl/filter?keyword=$query"; - - for (var filter in filters) { - if (filter.type == "orderFilter") { - final order = filter.values[filter.state].value; - url += "${ll(url)}sort=$order"; - } else if (filter.type == "GenreFilter") { - final genre = (filter.state as List).where((e) => e.state).toList(); - if (genre.isNotEmpty) { - for (var st in genre) { - url += "${ll(url)}genre[]=${st.value}"; - } - } - } else if (filter.type == "CountryFilter") { - final country = (filter.state as List).where((e) => e.state).toList(); - if (country.isNotEmpty) { - for (var st in country) { - url += "${ll(url)}country[]=${st.value}"; - } - } - } else if (filter.type == "SeasonFilter") { - final season = (filter.state as List).where((e) => e.state).toList(); - if (season.isNotEmpty) { - for (var st in season) { - url += "${ll(url)}season[]=${st.value}"; - } - } - } else if (filter.type == "YearFilter") { - final year = (filter.state as List).where((e) => e.state).toList(); - if (year.isNotEmpty) { - for (var st in year) { - url += "${ll(url)}year[]=${st.value}"; - } - } - } else if (filter.type == "TypeFilter") { - final type = (filter.state as List).where((e) => e.state).toList(); - if (type.isNotEmpty) { - for (var st in type) { - url += "${ll(url)}type[]=${st.value}"; - } - } - } else if (filter.type == "StatusFilter") { - final status = (filter.state as List).where((e) => e.state).toList(); - if (status.isNotEmpty) { - for (var st in status) { - url += "${ll(url)}status[]=${st.value}"; - } - } - } else if (filter.type == "LanguageFilter") { - final language = (filter.state as List).where((e) => e.state).toList(); - if (language.isNotEmpty) { - for (var st in language) { - url += "${ll(url)}language[]=${st.value}"; - } - } - } else if (filter.type == "RatingFilter") { - final rating = (filter.state as List).where((e) => e.state).toList(); - if (rating.isNotEmpty) { - for (var st in rating) { - url += "${ll(url)}rating[]=${st.value}"; - } - } - } - } - - final res = (await client.get(Uri.parse("$url&page=$page"))).body; - return parseAnimeList(res); - } - - @override - Future getDetail(String url) async { - final statusList = [ - {"Releasing": 0, "Completed": 1} - ]; - var anime = MManga(); - final response = await Client(source, - json.encode({"followRedirects": false, "useDartHttpClient": true})) - .get(Uri.parse("$baseUrl$url")); - String res = response.body; - if (getMapValue(json.encode(response.headers), "location") - .contains("/filter?keyword=")) { - res = (await Client().get(Uri.parse("$baseUrl$url"))).body; - final animeUrls = parseHtml(res) - .selectFirst("div.ani.items > div.item") - .select("a[href]") - .where((MElement element) => (element.getHref as String) - .startsWith("${substringBefore(url, ".")}.")) - .toList(); - if (animeUrls.isNotEmpty) { - res = (await client.get(Uri.parse("$baseUrl${animeUrls[0].getHref}"))) - .body; - anime.link = animeUrls[0].getHref; - } else { - throw "Anime url not found"; - } - } - - final status = xpath(res, '//div[contains(text(),"Status")]/span/text()'); - if (status.isNotEmpty) { - anime.status = parseStatus(status.first, statusList); - } - final description = xpath(res, - '//*[contains(@class,"synopsis")]/div[@class="shorting"]/div[@class="content"]/text()'); - if (description.isNotEmpty) { - anime.description = description.first; - } - final author = xpath(res, '//div[contains(text(),"Studio")]/span/text()'); - if (author.isNotEmpty) { - anime.author = author.first; - } - - anime.genre = xpath(res, '//div[contains(text(),"Genre")]/span/a/text()'); - final id = parseHtml(res).selectFirst("div[data-id]").attr("data-id"); - final encrypt = vrfEncrypt(id); - final vrf = "vrf=$encrypt"; - - final resEp = - (await client.get(Uri.parse("$baseUrl/ajax/episode/list/$id?$vrf"))) - .body; - - final html = json.decode(resEp)["result"]; - List? episodesList = []; - - final epsHtmls = parseHtml(html).select("div.episodes ul > li"); - - for (var epH in epsHtmls) { - final epHtml = epH.outerHtml; - final title = xpath(epHtml, '//li/@title').isNotEmpty - ? xpath(epHtml, '//li/@title').first - : ""; - final ids = xpath(epHtml, '//a/@data-ids').first; - final sub = xpath(epHtml, '//a/@data-sub').first; - final dub = xpath(epHtml, '//a/@data-dub').first; - final softsub = title.toLowerCase().contains("softsub") ? "1" : ""; - final fillerEp = title.toLowerCase().contains("filler") ? "1" : ""; - final epNum = xpath(epHtml, '//a/@data-num').first; - String scanlator = ""; - if (sub == "1") { - scanlator += "Sub"; - } - if (softsub == "1") { - scanlator += ", Softsub"; - } - if (dub == "1") { - scanlator += ", Dub"; - } - if (fillerEp == "1") { - scanlator += ", • Filler Episode"; - } - MChapter episode = MChapter(); - episode.name = "Episode $epNum"; - episode.scanlator = scanlator; - episode.url = "$ids&epurl=$url/ep-$epNum"; - episodesList.add(episode); - } - - anime.chapters = episodesList.reversed.toList(); - return anime; - } - - @override - Future> getVideoList(String url) async { - final ids = substringBefore(url, "&"); - final encrypt = vrfEncrypt(ids); - final vrf = "vrf=$encrypt"; - final res = (await client - .get(Uri.parse("$baseUrl/ajax/server/list/$ids?$vrf"), headers: { - "Referer": baseUrl + url, - "X-Requested-With": "XMLHttpRequest" - })) - .body; - final html = json.decode(res)["result"]; - - final vidsHtmls = parseHtml(html).select("div.servers > div"); - - List videos = []; - for (var vidH in vidsHtmls) { - final vidHtml = vidH.outerHtml; - final type = xpath(vidHtml, '//div/@data-type').first; - final serversIds = xpath(vidHtml, '//li/@data-link-id'); - final serversNames = xpath(vidHtml, '//li/text()'); - for (int i = 0; i < serversIds.length; i++) { - final serverId = serversIds[i]; - final serverName = serversNames[i].toLowerCase(); - final encrypt = vrfEncrypt(serverId); - final vrf = "vrf=$encrypt"; - final res = - (await client.get(Uri.parse("$baseUrl/ajax/server/$serverId?$vrf"))) - .body; - final status = json.decode(res)["status"]; - if (status == 200) { - List a = []; - final url = vrfDecrypt(json.decode(res)["result"]["url"]); - final hosterSelection = preferenceHosterSelection(source.id); - final typeSelection = preferenceTypeSelection(source.id); - if (typeSelection.contains(type.toLowerCase())) { - if (serverName.contains("vidstream") || url.contains("megaf")) { - // final hosterName = - // serverName.contains("vidstream") ? "Vidstream" : "MegaF"; - // if (hosterSelection.contains(hosterName.toLowerCase())) { - // a = await vidsrcExtractor(url, hosterName, type); - // } - } else if (serverName.contains("mp4u") && - hosterSelection.contains("mp4u")) { - a = await mp4UploadExtractor(url, null, "", type); - } else if (serverName.contains("streamtape") && - hosterSelection.contains("streamtape")) { - a = await streamTapeExtractor(url, "StreamTape - $type"); - } else if (serverName.contains("moonf") && - hosterSelection.contains("moonf")) { - a = await filemoonExtractor(url, "MoonF", type); - } - videos.addAll(a); - } - } - } - } - - return sortVideos(videos, source.id); - } - - MPages parseAnimeList(String res) { - List animeList = []; - final urls = xpath(res, '//div[@class="item "]/div/div/div/a/@href'); - final names = xpath(res, '//div[@class="item "]/div/div/div/a/text()'); - final images = xpath(res, '//div[@class="item "]/div/div/a/img/@src'); - - for (var i = 0; i < names.length; i++) { - MManga anime = MManga(); - anime.name = names[i]; - anime.imageUrl = images[i]; - anime.link = urls[i]; - animeList.add(anime); - } - - return MPages(animeList, true); - } - - List rc4Engine(String key, List message) { - List _key = utf8.encode(key); - int _i = 0, _j = 0; - List _box = List.generate(256, (i) => i); - - int x = 0; - for (int i = 0; i < 256; i++) { - x = (x + _box[i] + _key[i % _key.length]) % 256; - var tmp = _box[i]; - _box[i] = _box[x]; - _box[x] = tmp; - } - - List out = []; - for (var char in message) { - _i = (_i + 1) % 256; - _j = (_j + _box[_i]) % 256; - - var tmp = _box[_i]; - _box[_i] = _box[_j]; - _box[_j] = tmp; - - final c = char ^ (_box[(_box[_i] + _box[_j]) % 256]); - out.add(c); - } - - return out; - } - - Future> vidsrcExtractor( - String url, String name, String type) async { - List videoList = []; - final host = Uri.parse(url).host; - final apiUrl = getApiUrl(url); - final res = await client.get(Uri.parse(apiUrl)); - - if (res.body.startsWith("{")) { - final decode = base64Url.decode(json.decode(res.body)['result']); - final rc4 = rc4Engine("9jXDYBZUcTcTZveM", decode); - final result = json.decode(Uri.decodeComponent(utf8.decode(rc4))); - if (result != 404) { - String masterUrl = - ((result['sources'] as List>).first)['file']; - final tracks = (result['tracks'] as List) - .where((e) => e['kind'] == 'captions' ? true : false) - .toList(); - List subtitles = []; - - for (var sub in tracks) { - try { - MTrack subtitle = MTrack(); - subtitle - ..label = sub["label"] - ..file = sub["file"]; - subtitles.add(subtitle); - } catch (_) {} - } - - 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"; - } - - MVideo video = MVideo(); - video - ..url = videoUrl - ..originalUrl = videoUrl - ..quality = "$name - $type - $quality" - ..headers = {"Referer": "https://$host/"} - ..subtitles = subtitles; - videoList.add(video); - } - } - } - - return videoList; - } - - String getApiUrl(String url) { - final host = Uri.parse(url).host; - final paramsToString = Uri.parse(url) - .queryParameters - .entries - .map((e) => "${e.key}=${e.value}") - .join("&"); - var vidId = substringBefore(substringAfterLast(url, "/"), "?"); - - final apiSlug = encodeID(vidId, "8Qy3mlM2kod80XIK"); - final h = encodeID(vidId, "BgKVSrzpH2Enosgm"); - String apiUrlString = ""; - apiUrlString += "https://$host/mediainfo/$apiSlug"; - if (paramsToString.isNotEmpty) { - apiUrlString += "?$paramsToString&h=$h"; - } - - return apiUrlString; - } - - String encodeID(String vidId, String key) { - final rc4 = rc4Engine(key, vidId.codeUnits); - return base64.encode(rc4).replaceAll("+", "-").replaceAll("/", "_").trim(); - } - - @override - List getFilterList() { - return [ - SelectFilter("orderFilter", "Sort order", 0, [ - SelectFilterOption("Most relevance", "most_relevance"), - SelectFilterOption("Recently updated", "recently_updated"), - SelectFilterOption("Recently added", "recently_added"), - SelectFilterOption("Release date", "release_date"), - SelectFilterOption("Trending", "trending"), - SelectFilterOption("Name A-Z", "title_az"), - SelectFilterOption("Scores", "scores"), - SelectFilterOption("MAL scores", "mal_scores"), - SelectFilterOption("Most watched", "most_watched"), - SelectFilterOption("Most favourited", "most_favourited"), - SelectFilterOption("Number of episodes", "number_of_episodes"), - ]), - SeparatorFilter(), - GroupFilter("GenreFilter", "Genre", [ - CheckBoxFilter("Action", "1"), - CheckBoxFilter("Adventure", "2"), - CheckBoxFilter("Avant Garde", "2262888"), - CheckBoxFilter("Boys Love", "2262603"), - CheckBoxFilter("Comedy", "4"), - CheckBoxFilter("Demons", "4424081"), - CheckBoxFilter("Drama", "7"), - CheckBoxFilter("Ecchi", "8"), - CheckBoxFilter("Fantasy", "9"), - CheckBoxFilter("Girls Love", "2263743"), - CheckBoxFilter("Gourmet", "2263289"), - CheckBoxFilter("Harem", "11"), - CheckBoxFilter("Horror", "14"), - CheckBoxFilter("Isekai", "3457284"), - CheckBoxFilter("Iyashikei", "4398552"), - CheckBoxFilter("Josei", "15"), - CheckBoxFilter("Kids", "16"), - CheckBoxFilter("Magic", "4424082"), - CheckBoxFilter("Mahou Shoujo", "3457321"), - CheckBoxFilter("Martial Arts", "18"), - CheckBoxFilter("Mecha", "19"), - CheckBoxFilter("Military", "20"), - CheckBoxFilter("Music", "21"), - CheckBoxFilter("Mystery", "22"), - CheckBoxFilter("Parody", "23"), - CheckBoxFilter("Psychological", "25"), - CheckBoxFilter("Reverse Harem", "4398403"), - CheckBoxFilter("Romance", "26"), - CheckBoxFilter("School", "28"), - CheckBoxFilter("Sci-Fi", "29"), - CheckBoxFilter("Seinen", "30"), - CheckBoxFilter("Shoujo", "31"), - CheckBoxFilter("Shounen", "33"), - CheckBoxFilter("Slice of Life", "35"), - CheckBoxFilter("Space", "36"), - CheckBoxFilter("Sports", "37"), - CheckBoxFilter("Super Power", "38"), - CheckBoxFilter("Supernatural", "39"), - CheckBoxFilter("Suspense", "2262590"), - CheckBoxFilter("Thriller", "40"), - CheckBoxFilter("Vampire", "41") - ]), - GroupFilter("CountryFilter", "Country", [ - CheckBoxFilter("China", "120823"), - CheckBoxFilter("Japan", "120822") - ]), - GroupFilter("SeasonFilter", "Season", [ - CheckBoxFilter("Fall", "fall"), - CheckBoxFilter("Summer", "summer"), - CheckBoxFilter("Spring", "spring"), - CheckBoxFilter("Winter", "winter"), - CheckBoxFilter("Unknown", "unknown") - ]), - GroupFilter("YearFilter", "Year", [ - CheckBoxFilter("2024", "2024"), - CheckBoxFilter("2023", "2023"), - CheckBoxFilter("2022", "2022"), - CheckBoxFilter("2021", "2021"), - CheckBoxFilter("2020", "2020"), - CheckBoxFilter("2019", "2019"), - CheckBoxFilter("2018", "2018"), - CheckBoxFilter("2017", "2017"), - CheckBoxFilter("2016", "2016"), - CheckBoxFilter("2015", "2015"), - CheckBoxFilter("2014", "2014"), - CheckBoxFilter("2013", "2013"), - CheckBoxFilter("2012", "2012"), - CheckBoxFilter("2011", "2011"), - CheckBoxFilter("2010", "2010"), - CheckBoxFilter("2009", "2009"), - CheckBoxFilter("2008", "2008"), - CheckBoxFilter("2007", "2007"), - CheckBoxFilter("2006", "2006"), - CheckBoxFilter("2005", "2005"), - CheckBoxFilter("2004", "2004"), - CheckBoxFilter("2003", "2003"), - CheckBoxFilter("2000s", "2000s"), - CheckBoxFilter("1990s", "1990s"), - CheckBoxFilter("1980s", "1980s"), - CheckBoxFilter("1970s", "1970s"), - CheckBoxFilter("1960s", "1960s"), - CheckBoxFilter("1950s", "1950s"), - CheckBoxFilter("1940s", "1940s"), - CheckBoxFilter("1930s", "1930s"), - CheckBoxFilter("1920s", "1920s"), - CheckBoxFilter("1910s", "1910s") - ]), - GroupFilter("TypeFilter", "Type", [ - CheckBoxFilter("Movie", "movie"), - CheckBoxFilter("TV", "tv"), - CheckBoxFilter("OVA", "ova"), - CheckBoxFilter("ONA", "ona"), - CheckBoxFilter("Special", "special"), - CheckBoxFilter("Music", "music") - ]), - GroupFilter("StatusFilter", "Status", [ - CheckBoxFilter("Not Yet Aired", "info"), - CheckBoxFilter("Releasing", "releasing"), - CheckBoxFilter("Completed", "completed") - ]), - GroupFilter("LanguageFilter", "Language", [ - CheckBoxFilter("Sub and Dub", "subdub"), - CheckBoxFilter("Sub", "sub"), - CheckBoxFilter("Dub", "dub") - ]), - GroupFilter("RatingFilter", "Rating", [ - CheckBoxFilter("G - All Ages", "g"), - CheckBoxFilter("PG - Children", "pg"), - CheckBoxFilter("PG 13 - Teens 13 and Older", "pg_13"), - CheckBoxFilter("R - 17+, Violence & Profanity", "r"), - CheckBoxFilter("R+ - Profanity & Mild Nudity", "r+"), - CheckBoxFilter("Rx - Hentai", "rx") - ]), - ]; - } - - @override - List getSourcePreferences() { - return [ - ListPreference( - key: "preferred_domain2", - title: "Preferred domain", - summary: "", - valueIndex: 0, - entries: ["aniwave.to", "aniwavetv.to (unofficial)"], - entryValues: ["https://aniwave.to", "https://aniwavetv.to"]), - ListPreference( - key: "preferred_quality", - title: "Preferred Quality", - summary: "", - valueIndex: 0, - entries: ["1080p", "720p", "480p", "360p"], - entryValues: ["1080", "720", "480", "360"]), - ListPreference( - key: "preferred_language", - title: "Preferred Type", - summary: "", - valueIndex: 0, - entries: ["Sub", "Softsub", "Dub"], - entryValues: ["Sub", "Softsub", "Dub"]), - ListPreference( - key: "preferred_server1", - title: "Preferred server", - summary: "", - valueIndex: 0, - entries: [ - "Vidstream", - "Megaf", - "MoonF", - "StreamTape", - "MP4u" - ], - entryValues: [ - "vidstream", - "megaf", - "moonf", - "streamtape", - "mp4upload" - ]), - MultiSelectListPreference( - key: "hoster_selection1", - title: "Enable/Disable Hosts", - summary: "", - entries: ["Vidstream", "Megaf", "MoonF", "StreamTape", "MP4u"], - entryValues: ["vidstream", "megaf", "moonf", "streamtape", "mp4u"], - values: ["vidstream", "megaf", "moonf", "streamtape", "mp4u"]), - MultiSelectListPreference( - key: "type_selection", - title: "Enable/Disable Type", - summary: "", - entries: ["Sub", "Softsub", "Dub"], - entryValues: ["sub", "softsub", "dub"], - values: ["sub", "softsub", "dub"]), - ]; - } - - List preferenceHosterSelection(int sourceId) { - return getPreferenceValue(sourceId, "hoster_selection1"); - } - - List preferenceTypeSelection(int sourceId) { - return getPreferenceValue(sourceId, "type_selection"); - } - - List sortVideos(List videos, int sourceId) { - String quality = getPreferenceValue(sourceId, "preferred_quality"); - String server = getPreferenceValue(sourceId, "preferred_server1"); - String lang = getPreferenceValue(sourceId, "preferred_language"); - videos.sort((MVideo a, MVideo b) { - int qualityMatchA = 0; - - if (a.quality.contains(quality) && - a.quality.toLowerCase().contains(lang.toLowerCase()) && - a.quality.toLowerCase().contains(server.toLowerCase())) { - qualityMatchA = 1; - } - int qualityMatchB = 0; - if (b.quality.contains(quality) && - b.quality.toLowerCase().contains(lang.toLowerCase()) && - b.quality.toLowerCase().contains(server.toLowerCase())) { - 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; - } - - String ll(String url) { - if (url.contains("?")) { - return "&"; - } - return "?"; - } - - String vrfEncrypt(String input) { - String vrf = input; - vrf = exchange(vrf, ['AP6GeR8H0lwUz1', 'UAz8Gwl10P6ReH']); - vrf = rc4Encrypt('ItFKjuWokn4ZpB', vrf); - vrf = rc4Encrypt('fOyt97QWFB3', vrf); - vrf = exchange(vrf, ['1majSlPQd2M5', 'da1l2jSmP5QM']); - vrf = exchange(vrf, ['CPYvHj09Au3', '0jHA9CPYu3v']); - vrf = vrf.split('').reversed.join(''); - vrf = rc4Encrypt('736y1uTJpBLUX', vrf); - vrf = base64Url.encode(utf8.encode(vrf)); - return Uri.encodeComponent(vrf); - } - - String vrfDecrypt(String input) { - String vrf = input; - vrf = utf8.decode(base64Url.decode(vrf)); - vrf = rc4Decrypt('736y1uTJpBLUX', vrf); - vrf = vrf.split('').reversed.join(''); - vrf = exchange(vrf, ['0jHA9CPYu3v', 'CPYvHj09Au3']); - vrf = exchange(vrf, ['da1l2jSmP5QM', '1majSlPQd2M5']); - vrf = rc4Decrypt('fOyt97QWFB3', vrf); - vrf = rc4Decrypt('ItFKjuWokn4ZpB', vrf); - vrf = exchange(vrf, ['UAz8Gwl10P6ReH', 'AP6GeR8H0lwUz1']); - return Uri.decodeComponent(vrf); - } - - String rc4Encrypt(String key, String input) { - final rc4 = rc4Engine(key, input.codeUnits); - final vrf = base64Url.encode(rc4); - return utf8.decode(vrf.codeUnits); - } - - String rc4Decrypt(String key, String input) { - final decode = base64Url.decode(input); - final rc4 = rc4Engine(key, decode); - return utf8.decode(rc4); - } - - String exchange(String input, List keys) { - final key1 = keys[0]; - final key2 = keys[1]; - return input.split('').map((char) { - final index = key1.indexOf(char); - return index != -1 ? key2[index] : char; - }).join(''); - } - - List vrfShift(List vrf) { - var shifts = [-2, -4, -5, 6, 2, -3, 3, 6]; - for (var i = 0; i < vrf.length; i++) { - var shift = shifts[i % 8]; - vrf[i] = (vrf[i] + shift) & 0xFF; - } - return vrf; - } -} - -Aniwave main(MSource source) { - return Aniwave(source: source); -} diff --git a/dart/anime/src/en/aniwave/icon.png b/dart/anime/src/en/aniwave/icon.png deleted file mode 100644 index 516f974eca5f6968a871100fcabcc5acbb664188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3775 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 diff --git a/dart/anime/src/en/aniwave/source.dart b/dart/anime/src/en/aniwave/source.dart deleted file mode 100644 index 66f38487..00000000 --- a/dart/anime/src/en/aniwave/source.dart +++ /dev/null @@ -1,16 +0,0 @@ -import '../../../../../model/source.dart'; - -Source get aniwave => _aniwave; -const _aniwaveVersion = "0.1.0"; -const _aniwaveCodeUrl = - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/aniwave/aniwave.dart"; -Source _aniwave = Source( - name: "Aniwave", - baseUrl: "https://aniwave.to", - lang: "en", - typeSource: "single", - iconUrl: - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/aniwave/icon.png", - sourceCodeUrl: _aniwaveCodeUrl, - version: _aniwaveVersion, - isManga: false);