mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-17 12:20:28 +00:00
Aniwave: fix encryption
This commit is contained in:
@@ -33,7 +33,7 @@ class Aniwave extends MProvider {
|
|||||||
String url = "$baseUrl/filter?keyword=$query";
|
String url = "$baseUrl/filter?keyword=$query";
|
||||||
|
|
||||||
for (var filter in filters) {
|
for (var filter in filters) {
|
||||||
if (filter.type == "OrderFilter") {
|
if (filter.type == "orderFilter") {
|
||||||
final order = filter.values[filter.state].value;
|
final order = filter.values[filter.state].value;
|
||||||
url += "${ll(url)}sort=$order";
|
url += "${ll(url)}sort=$order";
|
||||||
} else if (filter.type == "GenreFilter") {
|
} else if (filter.type == "GenreFilter") {
|
||||||
@@ -104,8 +104,9 @@ class Aniwave extends MProvider {
|
|||||||
final statusList = [
|
final statusList = [
|
||||||
{"Releasing": 0, "Completed": 1}
|
{"Releasing": 0, "Completed": 1}
|
||||||
];
|
];
|
||||||
final response =
|
var anime = MManga();
|
||||||
await Client(source, json.encode({"followRedirects": false}))
|
final response = await Client(source,
|
||||||
|
json.encode({"followRedirects": false, "useDartHttpClient": true}))
|
||||||
.get(Uri.parse("$baseUrl$url"));
|
.get(Uri.parse("$baseUrl$url"));
|
||||||
String res = response.body;
|
String res = response.body;
|
||||||
if (getMapValue(json.encode(response.headers), "location")
|
if (getMapValue(json.encode(response.headers), "location")
|
||||||
@@ -120,12 +121,12 @@ class Aniwave extends MProvider {
|
|||||||
if (animeUrls.isNotEmpty) {
|
if (animeUrls.isNotEmpty) {
|
||||||
res = (await client.get(Uri.parse("$baseUrl${animeUrls[0].getHref}")))
|
res = (await client.get(Uri.parse("$baseUrl${animeUrls[0].getHref}")))
|
||||||
.body;
|
.body;
|
||||||
|
anime.link = animeUrls[0].getHref;
|
||||||
} else {
|
} else {
|
||||||
throw "Anime url not found";
|
throw "Anime url not found";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var anime = MManga();
|
|
||||||
final status = xpath(res, '//div[contains(text(),"Status")]/span/text()');
|
final status = xpath(res, '//div[contains(text(),"Status")]/span/text()');
|
||||||
if (status.isNotEmpty) {
|
if (status.isNotEmpty) {
|
||||||
anime.status = parseStatus(status.first, statusList);
|
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()');
|
anime.genre = xpath(res, '//div[contains(text(),"Genre")]/span/a/text()');
|
||||||
final id = parseHtml(res).selectFirst("div[data-id]").attr("data-id");
|
final id = parseHtml(res).selectFirst("div[data-id]").attr("data-id");
|
||||||
final encrypt = vrfEncrypt(id);
|
final encrypt = vrfEncrypt(id);
|
||||||
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
|
final vrf = "vrf=$encrypt";
|
||||||
|
|
||||||
final resEp =
|
final resEp =
|
||||||
(await client.get(Uri.parse("$baseUrl/ajax/episode/list/$id?$vrf")))
|
(await client.get(Uri.parse("$baseUrl/ajax/episode/list/$id?$vrf")))
|
||||||
@@ -193,7 +194,7 @@ class Aniwave extends MProvider {
|
|||||||
Future<List<MVideo>> getVideoList(String url) async {
|
Future<List<MVideo>> getVideoList(String url) async {
|
||||||
final ids = substringBefore(url, "&");
|
final ids = substringBefore(url, "&");
|
||||||
final encrypt = vrfEncrypt(ids);
|
final encrypt = vrfEncrypt(ids);
|
||||||
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
|
final vrf = "vrf=$encrypt";
|
||||||
final res = (await client
|
final res = (await client
|
||||||
.get(Uri.parse("$baseUrl/ajax/server/list/$ids?$vrf"), headers: {
|
.get(Uri.parse("$baseUrl/ajax/server/list/$ids?$vrf"), headers: {
|
||||||
"Referer": baseUrl + url,
|
"Referer": baseUrl + url,
|
||||||
@@ -214,7 +215,7 @@ class Aniwave extends MProvider {
|
|||||||
final serverId = serversIds[i];
|
final serverId = serversIds[i];
|
||||||
final serverName = serversNames[i].toLowerCase();
|
final serverName = serversNames[i].toLowerCase();
|
||||||
final encrypt = vrfEncrypt(serverId);
|
final encrypt = vrfEncrypt(serverId);
|
||||||
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
|
final vrf = "vrf=$encrypt";
|
||||||
final res =
|
final res =
|
||||||
(await client.get(Uri.parse("$baseUrl/ajax/server/$serverId?$vrf")))
|
(await client.get(Uri.parse("$baseUrl/ajax/server/$serverId?$vrf")))
|
||||||
.body;
|
.body;
|
||||||
@@ -226,11 +227,11 @@ class Aniwave extends MProvider {
|
|||||||
final typeSelection = preferenceTypeSelection(source.id);
|
final typeSelection = preferenceTypeSelection(source.id);
|
||||||
if (typeSelection.contains(type.toLowerCase())) {
|
if (typeSelection.contains(type.toLowerCase())) {
|
||||||
if (serverName.contains("vidstream") || url.contains("megaf")) {
|
if (serverName.contains("vidstream") || url.contains("megaf")) {
|
||||||
final hosterName =
|
// final hosterName =
|
||||||
serverName.contains("vidstream") ? "Vidstream" : "MegaF";
|
// serverName.contains("vidstream") ? "Vidstream" : "MegaF";
|
||||||
if (hosterSelection.contains(hosterName.toLowerCase())) {
|
// if (hosterSelection.contains(hosterName.toLowerCase())) {
|
||||||
a = await vidsrcExtractor(url, hosterName, type);
|
// a = await vidsrcExtractor(url, hosterName, type);
|
||||||
}
|
// }
|
||||||
} else if (serverName.contains("mp4u") &&
|
} else if (serverName.contains("mp4u") &&
|
||||||
hosterSelection.contains("mp4u")) {
|
hosterSelection.contains("mp4u")) {
|
||||||
a = await mp4UploadExtractor(url, null, "", type);
|
a = await mp4UploadExtractor(url, null, "", type);
|
||||||
@@ -267,7 +268,7 @@ class Aniwave extends MProvider {
|
|||||||
return MPages(animeList, true);
|
return MPages(animeList, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<int> rc4Encrypt(String key, List<int> message) {
|
List<int> rc4Engine(String key, List<int> message) {
|
||||||
List<int> _key = utf8.encode(key);
|
List<int> _key = utf8.encode(key);
|
||||||
int _i = 0, _j = 0;
|
int _i = 0, _j = 0;
|
||||||
List<int> _box = List.generate(256, (i) => i);
|
List<int> _box = List.generate(256, (i) => i);
|
||||||
@@ -296,27 +297,6 @@ class Aniwave extends MProvider {
|
|||||||
return out;
|
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<int> vrfShift(List<int> 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<List<MVideo>> vidsrcExtractor(
|
Future<List<MVideo>> vidsrcExtractor(
|
||||||
String url, String name, String type) async {
|
String url, String name, String type) async {
|
||||||
List<MVideo> videoList = [];
|
List<MVideo> videoList = [];
|
||||||
@@ -325,8 +305,9 @@ class Aniwave extends MProvider {
|
|||||||
final res = await client.get(Uri.parse(apiUrl));
|
final res = await client.get(Uri.parse(apiUrl));
|
||||||
|
|
||||||
if (res.body.startsWith("{")) {
|
if (res.body.startsWith("{")) {
|
||||||
final result = json.decode(
|
final decode = base64Url.decode(json.decode(res.body)['result']);
|
||||||
vrfDecrypt(json.decode(res.body)['result'], key: "9jXDYBZUcTcTZveM"));
|
final rc4 = rc4Engine("9jXDYBZUcTcTZveM", decode);
|
||||||
|
final result = json.decode(Uri.decodeComponent(utf8.decode(rc4)));
|
||||||
if (result != 404) {
|
if (result != 404) {
|
||||||
String masterUrl =
|
String masterUrl =
|
||||||
((result['sources'] as List<Map<String, dynamic>>).first)['file'];
|
((result['sources'] as List<Map<String, dynamic>>).first)['file'];
|
||||||
@@ -395,14 +376,14 @@ class Aniwave extends MProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String encodeID(String vidId, String key) {
|
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();
|
return base64.encode(rc4).replaceAll("+", "-").replaceAll("/", "_").trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<dynamic> getFilterList() {
|
List<dynamic> getFilterList() {
|
||||||
return [
|
return [
|
||||||
SelectFilter("OrderFilter", "Sort order", 0, [
|
SelectFilter("orderFilter", "Sort order", 0, [
|
||||||
SelectFilterOption("Most relevance", "most_relevance"),
|
SelectFilterOption("Most relevance", "most_relevance"),
|
||||||
SelectFilterOption("Recently updated", "recently_updated"),
|
SelectFilterOption("Recently updated", "recently_updated"),
|
||||||
SelectFilterOption("Recently added", "recently_added"),
|
SelectFilterOption("Recently added", "recently_added"),
|
||||||
@@ -640,6 +621,62 @@ class Aniwave extends MProvider {
|
|||||||
}
|
}
|
||||||
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<String> 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<int> vrfShift(List<int> 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) {
|
Aniwave main(MSource source) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import '../../../../../model/source.dart';
|
import '../../../../../model/source.dart';
|
||||||
|
|
||||||
Source get aniwave => _aniwave;
|
Source get aniwave => _aniwave;
|
||||||
const _aniwaveVersion = "0.0.9";
|
const _aniwaveVersion = "0.1.0";
|
||||||
const _aniwaveCodeUrl =
|
const _aniwaveCodeUrl =
|
||||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/aniwave/aniwave.dart";
|
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/aniwave/aniwave.dart";
|
||||||
Source _aniwave = Source(
|
Source _aniwave = Source(
|
||||||
|
|||||||
Reference in New Issue
Block a user