diff --git a/anime/src/id/otakudesu/otakudesu.dart b/anime/src/id/otakudesu/otakudesu.dart index 89f6574c..c9269896 100644 --- a/anime/src/id/otakudesu/otakudesu.dart +++ b/anime/src/id/otakudesu/otakudesu.dart @@ -8,27 +8,29 @@ class OtakuDesu extends MProvider { final Client client = Client(source); + @override + String get baseUrl => getPreferenceValue(source.id, "overrideBaseUrl"); + @override Future getPopular(int page) async { - final res = (await client - .get(Uri.parse("${source.baseUrl}/complete-anime/page/$page"))) - .body; + final res = + (await client.get(Uri.parse("$baseUrl/complete-anime/page/$page"))) + .body; return parseAnimeList(res); } @override Future getLatestUpdates(int page) async { - final res = (await client - .get(Uri.parse("${source.baseUrl}/ongoing-anime/page/$page"))) - .body; + final res = + (await client.get(Uri.parse("$baseUrl/ongoing-anime/page/$page"))).body; return parseAnimeList(res); } @override Future search(String query, int page, FilterList filterList) async { - final res = (await client - .get(Uri.parse("${source.baseUrl}/?s=$query&post_type=anime"))) - .body; + final res = + (await client.get(Uri.parse("$baseUrl/?s=$query&post_type=anime"))) + .body; List animeList = []; final images = xpath(res, '//ul[@class="chivsrc"]/li/img/@src'); 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 resNonceAction = (await client.post( - Uri.parse("${source.baseUrl}/wp-admin/admin-ajax.php"), - headers: null, + Uri.parse("$baseUrl/wp-admin/admin-ajax.php"), + headers: {"_": "_"}, body: {"action": nonceAction})) .body; final nonce = substringBefore(substringAfter(resNonceAction, ":\""), '"'); @@ -110,21 +112,20 @@ class OtakuDesu extends MProvider { final id = decodedData["id"]; final i = decodedData["i"]; - final res = (await client.post( - Uri.parse("${source.baseUrl}/wp-admin/admin-ajax.php"), - headers: null, - body: { - "i": i, - "id": id, - "q": q, - "nonce": nonce, - "action": action - })) + final res = (await client + .post(Uri.parse("$baseUrl/wp-admin/admin-ajax.php"), headers: { + "_": "_" + }, body: { + "i": i, + "id": id, + "q": q, + "nonce": nonce, + "action": action + })) .body; final html = utf8.decode( base64Url.decode(substringBefore(substringAfter(res, ":\""), '"'))); String url = xpath(html, '//iframe/@src').first; - if (url.contains("yourupload")) { final id = substringBefore(substringAfter(url, "id="), "&"); url = "https://yourupload.com/embed/$id"; @@ -132,19 +133,21 @@ class OtakuDesu extends MProvider { } else if (url.contains("filelions")) { a = await streamWishExtractor(url, "FileLions"); } 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 = xpath(res, '//script[contains(text(), "sources")]/text()').first; final videoUrl = substringBefore( substringAfter(substringAfter(script, "sources:[{"), "file':'"), "'"); - MVideo video = MVideo(); - video - ..url = videoUrl - ..originalUrl = videoUrl - ..quality = "DesuStream - $q" - ..subtitles = []; - videos.add(video); + if (videoUrl.endsWith(".mp4")) { + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = "DesuStream - $q"; + videos.add(video); + } } else if (url.contains("mp4upload")) { final res = (await client.get(Uri.parse(url))).body; final script = @@ -155,13 +158,39 @@ class OtakuDesu extends MProvider { video ..url = videoUrl ..originalUrl = videoUrl - ..quality = "Mp4upload - $q" - ..subtitles = []; + ..quality = "Mp4upload - $q"; videos.add(video); } videos.addAll(a); } + return sortVideos(videos); + } + + List sortVideos(List 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; } @@ -185,6 +214,26 @@ class OtakuDesu extends MProvider { res, '//div[@class="pagenavix"]/a[@class="next page-numbers"]/@href'); return MPages(animeList, pages.isNotEmpty); } + + List 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) { diff --git a/anime/src/id/otakudesu/source.dart b/anime/src/id/otakudesu/source.dart index 1ac9e214..635eb29c 100644 --- a/anime/src/id/otakudesu/source.dart +++ b/anime/src/id/otakudesu/source.dart @@ -1,12 +1,12 @@ import '../../../../model/source.dart'; Source get otakudesu => _otakudesu; -const _otakudesuVersion = "0.0.45"; +const _otakudesuVersion = "0.0.5"; const _otakudesuCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/otakudesu/otakudesu.dart"; Source _otakudesu = Source( name: "OtakuDesu", - baseUrl: "https://otakudesu.cam", + baseUrl: "https://otakudesu.cloud", lang: "id", typeSource: "single", iconUrl: