This commit is contained in:
kodjomoustapha
2024-02-26 11:23:48 +01:00
parent 15ee9f3cab
commit d55b319dd0
2 changed files with 83 additions and 34 deletions

View File

@@ -8,27 +8,29 @@ class OtakuDesu extends MProvider {
final Client client = Client(source); final Client client = Client(source);
@override
String get baseUrl => getPreferenceValue(source.id, "overrideBaseUrl");
@override @override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
final res = (await client final res =
.get(Uri.parse("${source.baseUrl}/complete-anime/page/$page"))) (await client.get(Uri.parse("$baseUrl/complete-anime/page/$page")))
.body; .body;
return parseAnimeList(res); return parseAnimeList(res);
} }
@override @override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
final res = (await client final res =
.get(Uri.parse("${source.baseUrl}/ongoing-anime/page/$page"))) (await client.get(Uri.parse("$baseUrl/ongoing-anime/page/$page"))).body;
.body;
return parseAnimeList(res); return parseAnimeList(res);
} }
@override @override
Future<MPages> search(String query, int page, FilterList filterList) async { Future<MPages> search(String query, int page, FilterList filterList) async {
final res = (await client final res =
.get(Uri.parse("${source.baseUrl}/?s=$query&post_type=anime"))) (await client.get(Uri.parse("$baseUrl/?s=$query&post_type=anime")))
.body; .body;
List<MManga> animeList = []; List<MManga> animeList = [];
final images = xpath(res, '//ul[@class="chivsrc"]/li/img/@src'); final images = xpath(res, '//ul[@class="chivsrc"]/li/img/@src');
final names = xpath(res, '//ul[@class="chivsrc"]/li/h2/a/text()'); final names = xpath(res, '//ul[@class="chivsrc"]/li/h2/a/text()');
@@ -96,8 +98,8 @@ class OtakuDesu extends MProvider {
final action = substringBefore(substringAfter(script, "action:\""), '"'); final action = substringBefore(substringAfter(script, "action:\""), '"');
final resNonceAction = (await client.post( final resNonceAction = (await client.post(
Uri.parse("${source.baseUrl}/wp-admin/admin-ajax.php"), Uri.parse("$baseUrl/wp-admin/admin-ajax.php"),
headers: null, headers: {"_": "_"},
body: {"action": nonceAction})) body: {"action": nonceAction}))
.body; .body;
final nonce = substringBefore(substringAfter(resNonceAction, ":\""), '"'); final nonce = substringBefore(substringAfter(resNonceAction, ":\""), '"');
@@ -110,21 +112,20 @@ class OtakuDesu extends MProvider {
final id = decodedData["id"]; final id = decodedData["id"];
final i = decodedData["i"]; final i = decodedData["i"];
final res = (await client.post( final res = (await client
Uri.parse("${source.baseUrl}/wp-admin/admin-ajax.php"), .post(Uri.parse("$baseUrl/wp-admin/admin-ajax.php"), headers: {
headers: null, "_": "_"
body: { }, body: {
"i": i, "i": i,
"id": id, "id": id,
"q": q, "q": q,
"nonce": nonce, "nonce": nonce,
"action": action "action": action
})) }))
.body; .body;
final html = utf8.decode( final html = utf8.decode(
base64Url.decode(substringBefore(substringAfter(res, ":\""), '"'))); base64Url.decode(substringBefore(substringAfter(res, ":\""), '"')));
String url = xpath(html, '//iframe/@src').first; String url = xpath(html, '//iframe/@src').first;
if (url.contains("yourupload")) { if (url.contains("yourupload")) {
final id = substringBefore(substringAfter(url, "id="), "&"); final id = substringBefore(substringAfter(url, "id="), "&");
url = "https://yourupload.com/embed/$id"; url = "https://yourupload.com/embed/$id";
@@ -132,19 +133,21 @@ class OtakuDesu extends MProvider {
} else if (url.contains("filelions")) { } else if (url.contains("filelions")) {
a = await streamWishExtractor(url, "FileLions"); a = await streamWishExtractor(url, "FileLions");
} else if (url.contains("desustream")) { } else if (url.contains("desustream")) {
final res = (await client.get(Uri.parse(url))).body; final response = (await Client().get(Uri.parse(url)));
final res = response.body;
final script = final script =
xpath(res, '//script[contains(text(), "sources")]/text()').first; xpath(res, '//script[contains(text(), "sources")]/text()').first;
final videoUrl = substringBefore( final videoUrl = substringBefore(
substringAfter(substringAfter(script, "sources:[{"), "file':'"), substringAfter(substringAfter(script, "sources:[{"), "file':'"),
"'"); "'");
MVideo video = MVideo(); if (videoUrl.endsWith(".mp4")) {
video MVideo video = MVideo();
..url = videoUrl video
..originalUrl = videoUrl ..url = videoUrl
..quality = "DesuStream - $q" ..originalUrl = videoUrl
..subtitles = []; ..quality = "DesuStream - $q";
videos.add(video); videos.add(video);
}
} else if (url.contains("mp4upload")) { } else if (url.contains("mp4upload")) {
final res = (await client.get(Uri.parse(url))).body; final res = (await client.get(Uri.parse(url))).body;
final script = final script =
@@ -155,13 +158,39 @@ class OtakuDesu extends MProvider {
video video
..url = videoUrl ..url = videoUrl
..originalUrl = videoUrl ..originalUrl = videoUrl
..quality = "Mp4upload - $q" ..quality = "Mp4upload - $q";
..subtitles = [];
videos.add(video); videos.add(video);
} }
videos.addAll(a); videos.addAll(a);
} }
return sortVideos(videos);
}
List<MVideo> sortVideos(List<MVideo> videos) {
String quality = getPreferenceValue(source.id, "preferred_quality");
videos.sort((MVideo a, MVideo b) {
int qualityMatchA = 0;
if (a.quality.contains(quality)) {
qualityMatchA = 1;
}
int qualityMatchB = 0;
if (b.quality.contains(quality)) {
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; return videos;
} }
@@ -185,6 +214,26 @@ class OtakuDesu extends MProvider {
res, '//div[@class="pagenavix"]/a[@class="next page-numbers"]/@href'); res, '//div[@class="pagenavix"]/a[@class="next page-numbers"]/@href');
return MPages(animeList, pages.isNotEmpty); return MPages(animeList, pages.isNotEmpty);
} }
List<dynamic> getSourcePreferences() {
return [
EditTextPreference(
key: "overrideBaseUrl",
title: "Override BaseUrl",
summary: "",
value: "https://otakudesu.cloud",
dialogTitle: "Override BaseUrl",
dialogMessage: "",
text: "https://otakudesu.cloud"),
ListPreference(
key: "preferred_quality",
title: "Preferred quality",
summary: "",
valueIndex: 1,
entries: ["1080p", "720p", "480p", "360p"],
entryValues: ["1080", "720", "480", "360"])
];
}
} }
OtakuDesu main(MSource source) { OtakuDesu main(MSource source) {

View File

@@ -1,12 +1,12 @@
import '../../../../model/source.dart'; import '../../../../model/source.dart';
Source get otakudesu => _otakudesu; Source get otakudesu => _otakudesu;
const _otakudesuVersion = "0.0.45"; const _otakudesuVersion = "0.0.5";
const _otakudesuCodeUrl = const _otakudesuCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/otakudesu/otakudesu.dart"; "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/otakudesu/otakudesu.dart";
Source _otakudesu = Source( Source _otakudesu = Source(
name: "OtakuDesu", name: "OtakuDesu",
baseUrl: "https://otakudesu.cam", baseUrl: "https://otakudesu.cloud",
lang: "id", lang: "id",
typeSource: "single", typeSource: "single",
iconUrl: iconUrl: