diff --git a/dart/anime/src/en/aniwave/aniwave.dart b/dart/anime/src/en/aniwave/aniwave.dart index e2045109..420b3f56 100644 --- a/dart/anime/src/en/aniwave/aniwave.dart +++ b/dart/anime/src/en/aniwave/aniwave.dart @@ -33,7 +33,7 @@ class Aniwave extends MProvider { String url = "$baseUrl/filter?keyword=$query"; for (var filter in filters) { - if (filter.type == "OrderFilter") { + if (filter.type == "orderFilter") { final order = filter.values[filter.state].value; url += "${ll(url)}sort=$order"; } else if (filter.type == "GenreFilter") { @@ -104,9 +104,10 @@ class Aniwave extends MProvider { final statusList = [ {"Releasing": 0, "Completed": 1} ]; - final response = - await Client(source, json.encode({"followRedirects": false})) - .get(Uri.parse("$baseUrl$url")); + 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=")) { @@ -120,12 +121,12 @@ class Aniwave extends MProvider { 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"; } } - var anime = MManga(); final status = xpath(res, '//div[contains(text(),"Status")]/span/text()'); if (status.isNotEmpty) { anime.status = parseStatus(status.first, statusList); @@ -143,7 +144,7 @@ class Aniwave extends MProvider { 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=${Uri.encodeComponent(encrypt)}"; + final vrf = "vrf=$encrypt"; final resEp = (await client.get(Uri.parse("$baseUrl/ajax/episode/list/$id?$vrf"))) @@ -193,7 +194,7 @@ class Aniwave extends MProvider { Future> getVideoList(String url) async { final ids = substringBefore(url, "&"); final encrypt = vrfEncrypt(ids); - final vrf = "vrf=${Uri.encodeComponent(encrypt)}"; + final vrf = "vrf=$encrypt"; final res = (await client .get(Uri.parse("$baseUrl/ajax/server/list/$ids?$vrf"), headers: { "Referer": baseUrl + url, @@ -214,7 +215,7 @@ class Aniwave extends MProvider { final serverId = serversIds[i]; final serverName = serversNames[i].toLowerCase(); final encrypt = vrfEncrypt(serverId); - final vrf = "vrf=${Uri.encodeComponent(encrypt)}"; + final vrf = "vrf=$encrypt"; final res = (await client.get(Uri.parse("$baseUrl/ajax/server/$serverId?$vrf"))) .body; @@ -226,11 +227,11 @@ class Aniwave extends MProvider { 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); - } + // 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); @@ -267,7 +268,7 @@ class Aniwave extends MProvider { return MPages(animeList, true); } - List rc4Encrypt(String key, List message) { + List rc4Engine(String key, List message) { List _key = utf8.encode(key); int _i = 0, _j = 0; List _box = List.generate(256, (i) => i); @@ -296,27 +297,6 @@ class Aniwave extends MProvider { return out; } - String vrfEncrypt(String input) { - final rc4 = rc4Encrypt("T78s2WjTc7hSIZZR", input.codeUnits); - final vrf = base64Url.encode(rc4); - return utf8.decode(vrf.codeUnits); - } - - String vrfDecrypt(String input, {String key = "ctpAbOz5u7S6OMkx"}) { - final decode = base64Url.decode(input); - final rc4 = rc4Encrypt(key, decode); - return Uri.decodeComponent(utf8.decode(rc4)); - } - - 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; - } - Future> vidsrcExtractor( String url, String name, String type) async { List videoList = []; @@ -325,8 +305,9 @@ class Aniwave extends MProvider { final res = await client.get(Uri.parse(apiUrl)); if (res.body.startsWith("{")) { - final result = json.decode( - vrfDecrypt(json.decode(res.body)['result'], key: "9jXDYBZUcTcTZveM")); + 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']; @@ -395,14 +376,14 @@ class Aniwave extends MProvider { } String encodeID(String vidId, String key) { - final rc4 = rc4Encrypt(key, vidId.codeUnits); + final rc4 = rc4Engine(key, vidId.codeUnits); return base64.encode(rc4).replaceAll("+", "-").replaceAll("/", "_").trim(); } @override List getFilterList() { return [ - SelectFilter("OrderFilter", "Sort order", 0, [ + SelectFilter("orderFilter", "Sort order", 0, [ SelectFilterOption("Most relevance", "most_relevance"), SelectFilterOption("Recently updated", "recently_updated"), SelectFilterOption("Recently added", "recently_added"), @@ -640,6 +621,62 @@ class Aniwave extends MProvider { } 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) { diff --git a/dart/anime/src/en/aniwave/source.dart b/dart/anime/src/en/aniwave/source.dart index 334dc201..66f38487 100644 --- a/dart/anime/src/en/aniwave/source.dart +++ b/dart/anime/src/en/aniwave/source.dart @@ -1,7 +1,7 @@ import '../../../../../model/source.dart'; Source get aniwave => _aniwave; -const _aniwaveVersion = "0.0.9"; +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(