From bd66eb533f7b1a479ef03a575404949a315e6dd6 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Thu, 9 Nov 2023 18:31:51 +0100 Subject: [PATCH] #3 New Anime Extensions (Indonesia) --- anime/source_generator.dart | 8 +- anime/src/id/nimegami/nimegami-v0.0.1.dart | 179 ++++++++++++++++++ anime/src/id/nimegami/source.dart | 17 ++ anime/src/id/oploverz/oploverz-v0.0.1.dart | 157 ++++++++++++++++ anime/src/id/oploverz/source.dart | 17 ++ anime/src/id/otakudesu/otakudesu-v0.0.1.dart | 184 +++++++++++++++++++ anime/src/id/otakudesu/source.dart | 17 ++ icons/mangayomi-id-nimegami.png | Bin 0 -> 3651 bytes icons/mangayomi-id.oploverz.png | Bin 0 -> 14655 bytes icons/mangayomi-id.otakudesu.png | Bin 0 -> 6422 bytes 10 files changed, 578 insertions(+), 1 deletion(-) create mode 100644 anime/src/id/nimegami/nimegami-v0.0.1.dart create mode 100644 anime/src/id/nimegami/source.dart create mode 100644 anime/src/id/oploverz/oploverz-v0.0.1.dart create mode 100644 anime/src/id/oploverz/source.dart create mode 100644 anime/src/id/otakudesu/otakudesu-v0.0.1.dart create mode 100644 anime/src/id/otakudesu/source.dart create mode 100644 icons/mangayomi-id-nimegami.png create mode 100644 icons/mangayomi-id.oploverz.png create mode 100644 icons/mangayomi-id.otakudesu.png diff --git a/anime/source_generator.dart b/anime/source_generator.dart index 8e4388f1..8d3537e5 100644 --- a/anime/source_generator.dart +++ b/anime/source_generator.dart @@ -9,6 +9,9 @@ import 'src/en/kisskh/source.dart'; import 'src/fr/animesultra/source.dart'; import 'src/fr/franime/source.dart'; import 'src/fr/otakufr/source.dart'; +import 'src/id/nimegami/source.dart'; +import 'src/id/oploverz/source.dart'; +import 'src/id/otakudesu/source.dart'; void main() { List _sourcesList = [ @@ -18,7 +21,10 @@ void main() { animesultraSource, ...zorothemeSourcesList, kisskhSource, - okanimeSource + okanimeSource, + otakudesu, + nimegami, + oploverz ]; final List> jsonList = _sourcesList.map((source) => source.toJson()).toList(); diff --git a/anime/src/id/nimegami/nimegami-v0.0.1.dart b/anime/src/id/nimegami/nimegami-v0.0.1.dart new file mode 100644 index 00000000..bf778444 --- /dev/null +++ b/anime/src/id/nimegami/nimegami-v0.0.1.dart @@ -0,0 +1,179 @@ +import 'package:mangayomi/bridge_lib.dart'; +import 'dart:convert'; + +class NimeGami extends MProvider { + NimeGami(); + + @override + Future getPopular(MSource source, int page) async { + final data = {"url": "${source.baseUrl}/page/$page"}; + final res = await http('GET', json.encode(data)); + List animeList = []; + final urls = xpath(res, '//div[@class="wrapper-2-a"]/article/a/@href'); + final names = xpath(res, '//div[@class="wrapper-2-a"]/article/a/@title'); + final images = + xpath(res, '//div[@class="wrapper-2-a"]/article/a/div/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); + } + + @override + Future getLatestUpdates(MSource source, int page) async { + final data = {"url": "${source.baseUrl}/page/$page"}; + final res = await http('GET', json.encode(data)); + List animeList = []; + final urls = xpath(res, '//div[@class="post-article"]/article/div/a/@href'); + final names = + xpath(res, '//div[@class="post-article"]/article/div/a/@title'); + final images = + xpath(res, '//div[@class="post-article"]/article/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); + } + + @override + Future search(MSource source, String query, int page) async { + final data = { + "url": "${source.baseUrl}/page/$page/?s=$query&post_type=post" + }; + final res = await http('GET', json.encode(data)); + List animeList = []; + final urls = xpath(res, '//div[@class="archive-a"]/article/div/a/@href'); + final names = xpath(res, '//div[@class="archive-a"]/article/h2/a/@title'); + final images = + xpath(res, '//div[@class="archive-a"]/article/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); + } + + @override + Future getDetail(MSource source, String url) async { + final data = {"url": url}; + final res = await http('GET', json.encode(data)); + MManga anime = MManga(); + final description = xpath(res, '//*[@id="Sinopsis"]/p/text()'); + if (description.isNotEmpty) { + anime.description = description.first; + } + + final author = xpath(res, '//tbody/tr[5]/td[2]/text()'); + if (author.isNotEmpty) { + anime.author = author.first; + } + anime.genre = xpath(res, '//tr/td[@class="info_a"]/a/text()'); + final epUrls = xpath(res, '//div[@class="list_eps_stream"]/li/@data') + .reversed + .toList(); + final epNums = + xpath(res, '//div[@class="list_eps_stream"]/li/@id').reversed.toList(); + final names = xpath(res, '//div[@class="list_eps_stream"]/li/text()') + .reversed + .toList(); + List? episodesList = []; + for (var i = 0; i < epUrls.length; i++) { + MChapter episode = MChapter(); + episode.name = names[i]; + episode.url = json.encode({ + "episodeIndex": int.parse(substringAfterLast(epNums[i], '_')), + 'urls': json.decode(base64(epUrls[i], 0)) + }); + episodesList.add(episode); + } + anime.chapters = episodesList; + return anime; + } + + @override + Future> getVideoList(MSource source, String url) async { + final resJson = json.decode(url); + final urls = resJson["urls"]; + List videos = []; + List a = []; + for (var data in urls) { + final quality = data["format"]; + for (var url in data["url"]) { + a = await extractVideos(quality, url); + videos.addAll(a); + } + } + return videos; + } + + Future> extractVideos(String quality, String url) async { + List videos = []; + List a = []; + if (url.contains("video.nimegami.id")) { + final realUrl = + base64(substringBefore(substringAfter(url, "url="), "&"), 0); + final a = await extractHXFileVideos(realUrl, quality); + videos.addAll(a); + } else if (url.contains("berkasdrive") || url.contains("drive.nimegami")) { + final res = await http('GET', json.encode({"url": url})); + final source = xpath(res, '//source/@src'); + if (source.isNotEmpty) { + videos.add(toVideo(source.first, "Berkasdrive - $quality")); + } + } else if (url.contains("hxfile.co")) { + final a = await extractHXFileVideos(url, quality); + videos.addAll(a); + } + + return videos; + } + + Future> extractHXFileVideos(String url, String quality) async { + if (!url.contains("embed-")) { + url = url.replaceAll(".co/", ".co/embed-") + ".html"; + } + final res = await http('GET', json.encode({"url": url})); + final script = xpath(res, + '//script[contains(text(), "eval") and contains(text(), "p,a,c,k,e,d")]/text()'); + if (script.isNotEmpty) { + final videoUrl = substringBefore( + substringAfter(substringAfter(evalJs(script.first), "sources:[", ""), + "file\":\"", ""), + '"'); + if (videoUrl.isNotEmpty) { + return [toVideo(videoUrl, "HXFile - $quality")]; + } + } + + return []; + } + + MVideo toVideo(String videoUrl, String quality) { + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = quality + ..subtitles = []; + + return video; + } +} + +NimeGami main() { + return NimeGami(); +} diff --git a/anime/src/id/nimegami/source.dart b/anime/src/id/nimegami/source.dart new file mode 100644 index 00000000..24e0d64e --- /dev/null +++ b/anime/src/id/nimegami/source.dart @@ -0,0 +1,17 @@ +import '../../../../model/source.dart'; +import '../../../../utils/utils.dart'; + +Source get nimegami => _nimegami; +const nimegamiVersion = "0.0.1"; +const nimegamiCodeUrl = + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/nimegami/nimegami-v$nimegamiVersion.dart"; +Source _nimegami = Source( + name: "NimeGami", + baseUrl: "https://nimegami.id", + lang: "id", + typeSource: "single", + iconUrl: getIconUrl("nimegami", "id"), + sourceCodeUrl: nimegamiCodeUrl, + version: nimegamiVersion, + appMinVerReq: "0.0.7", + isManga: false); diff --git a/anime/src/id/oploverz/oploverz-v0.0.1.dart b/anime/src/id/oploverz/oploverz-v0.0.1.dart new file mode 100644 index 00000000..4884749b --- /dev/null +++ b/anime/src/id/oploverz/oploverz-v0.0.1.dart @@ -0,0 +1,157 @@ +import 'package:mangayomi/bridge_lib.dart'; +import 'dart:convert'; + +class OploVerz extends MProvider { + OploVerz(); + + @override + Future getPopular(MSource source, int page) async { + final data = { + "url": "${source.baseUrl}/anime-list/page/$page/?order=popular" + }; + final res = await http('GET', json.encode(data)); + return parseAnimeList(res); + } + + @override + Future getLatestUpdates(MSource source, int page) async { + final data = { + "url": "${source.baseUrl}/anime-list/page/$page/?order=latest" + }; + final res = await http('GET', json.encode(data)); + return parseAnimeList(res); + } + + @override + Future search(MSource source, String query, int page) async { + final data = { + "url": "${source.baseUrl}/anime-list/page/$page/?title=$query" + }; + final res = await http('GET', json.encode(data)); + return parseAnimeList(res); + } + + @override + Future getDetail(MSource source, String url) async { + final statusList = [ + {"ongoing": 0, "completed": 1} + ]; + final data = {"url": url}; + final res = await http('GET', json.encode(data)); + MManga anime = MManga(); + final status = xpath(res, '//*[@class="alternati"]/span[2]/text()'); + print(status); + if (status.isNotEmpty) { + anime.status = parseStatus(status.first, statusList); + } + anime.description = xpath(res, '//*[@class="desc"]/div/text()').first; + + anime.genre = xpath(res, '//*[@class="genre-info"]/a/text()'); + final epUrls = + xpath(res, '//div[@class="epsleft")]/span[@class="lchx"]/a/@href'); + final names = + xpath(res, '//div[@class="epsleft")]/span[@class="lchx"]/a/text()'); + final dates = + xpath(res, '//div[@class="epsleft")]/span[@class="date"]/text()'); + final dateUploads = parseDates(dates, "dd/MM/yyyy", "id"); + List? episodesList = []; + for (var i = 0; i < epUrls.length; i++) { + MChapter episode = MChapter(); + episode.name = names[i]; + episode.dateUpload = dateUploads[i]; + episode.url = epUrls[i]; + episodesList.add(episode); + } + + anime.chapters = episodesList; + return anime; + } + + @override + Future> getVideoList(MSource source, String url) async { + final res = await http('GET', json.encode({"url": url})); + final dataPost = xpath(res, + '//*[@id="server"]/ul/li/div[contains(@id,"player-option")]/@data-post') + .first; + final dataNume = xpath(res, + '//*[@id="server"]/ul/li/div[contains(@id,"player-option")]/@data-nume') + .first; + final dataType = xpath(res, + '//*[@id="server"]/ul/li/div[contains(@id,"player-option")]/@data-type') + .first; + final body = { + "action": "player_ajax", + "post": dataPost, + "nume": dataNume, + "type": dataType + }; + + final ress = await http( + 'POST', + json.encode({ + "useFormBuilder": true, + "body": body, + "url": "${source.baseUrl}/wp-admin/admin-ajax.php" + })); + final playerLink = + xpath(ress, '//iframe[@class="playeriframe"]/@src').first; + print(playerLink); + final resPlayer = await http('GET', json.encode({"url": playerLink})); + var resJson = substringBefore(substringAfter(resPlayer, "= "), "<"); + var streams = json.decode(resJson)["streams"] as List; + List videos = []; + for (var stream in streams) { + print(stream["play_url"]); + final videoUrl = stream["play_url"]; + final quality = getQuality(stream["format_id"]); + + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = quality + ..subtitles = []; + videos.add(video); + } + + return videos; + } + + String getQuality(int formatId) { + if (formatId == 18) { + return "Google - 360p"; + } else if (formatId == 22) { + return "Google - 720p"; + } + return "Unknown Resolution"; + } + + MPages parseAnimeList(String res) { + List animeList = []; + final urls = xpath(res, '//div[@class="relat"]/article/div/div/a/@href'); + final names = xpath(res, '//div[@class="relat"]/article/div/div/a/@title'); + final images = + xpath(res, '//div[@class="relat"]/article/div/div/a/div/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); + } + final pages = xpath(res, '//div[@class="pagination"]/a/@href'); + final pageNumberCurrent = xpath(res, + '//div[@class="pagination"]/span[@class="page-numbers current"]/text()'); + + bool hasNextPage = true; + if (pageNumberCurrent.isNotEmpty && pages.isNotEmpty) { + hasNextPage = !(pages.length == int.parse(pageNumberCurrent.first)); + } + return MPages(animeList, hasNextPage); + } +} + +OploVerz main() { + return OploVerz(); +} diff --git a/anime/src/id/oploverz/source.dart b/anime/src/id/oploverz/source.dart new file mode 100644 index 00000000..8a43fbd3 --- /dev/null +++ b/anime/src/id/oploverz/source.dart @@ -0,0 +1,17 @@ +import '../../../../model/source.dart'; +import '../../../../utils/utils.dart'; + +Source get oploverz => _oploverz; +const oploverzVersion = "0.0.1"; +const oploverzCodeUrl = + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/oploverz/oploverz-v$oploverzVersion.dart"; +Source _oploverz = Source( + name: "Oploverz", + baseUrl: "https://oploverz.red", + lang: "id", + typeSource: "single", + iconUrl: getIconUrl("oploverz", "id"), + sourceCodeUrl: oploverzCodeUrl, + version: oploverzVersion, + appMinVerReq: "0.0.7", + isManga: false); diff --git a/anime/src/id/otakudesu/otakudesu-v0.0.1.dart b/anime/src/id/otakudesu/otakudesu-v0.0.1.dart new file mode 100644 index 00000000..fdbed306 --- /dev/null +++ b/anime/src/id/otakudesu/otakudesu-v0.0.1.dart @@ -0,0 +1,184 @@ +import 'package:mangayomi/bridge_lib.dart'; +import 'dart:convert'; + +class OtakuDesu extends MProvider { + OtakuDesu(); + + @override + Future getPopular(MSource source, int page) async { + final data = {"url": "${source.baseUrl}/complete-anime/page/$page"}; + final res = await http('GET', json.encode(data)); + return parseAnimeList(res); + } + + @override + Future getLatestUpdates(MSource source, int page) async { + final data = {"url": "${source.baseUrl}/ongoing-anime/page/$page"}; + final res = await http('GET', json.encode(data)); + return parseAnimeList(res); + } + + @override + Future search(MSource source, String query, int page) async { + final data = {"url": "${source.baseUrl}/?s=$query&post_type=anime"}; + final res = await http('GET', json.encode(data)); + List animeList = []; + final images = xpath(res, '//ul[@class="chivsrc"]/li/img/@src'); + final names = xpath(res, '//ul[@class="chivsrc"]/li/h2/a/text()'); + final urls = xpath(res, '//ul[@class="chivsrc"]/li/h2/a/@href'); + + 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, false); + } + + @override + Future getDetail(MSource source, String url) async { + final statusList = [ + {"Ongoing": 0, "Completed": 1} + ]; + final data = {"url": url}; + final res = await http('GET', json.encode(data)); + MManga anime = MManga(); + final status = xpath( + res, '//*[@class="infozingle"]/p[contains(text(), "Status")]/text()'); + if (status.isNotEmpty) { + anime.status = parseStatus(status.first.split(':').last, statusList); + } + final description = xpath(res, '//*[@class="sinopc"]/text()'); + if (description.isNotEmpty) { + anime.description = description.first; + } + + final genre = xpath( + res, '//*[@class="infozingle"]/p[contains(text(), "Genre")]/text()'); + if (genre.isNotEmpty) { + anime.genre = genre.first.split(':').last.split(','); + } + + final epUrls = xpath(res, '//div[@class="episodelist"]/ul/li/span/a/@href'); + final names = xpath(res, '//div[@class="episodelist"]/ul/li/span/a/text()'); + + final dates = xpath( + res, '//div[@class="episodelist"]/ul/li/span[@class="zeebr"]/text()'); + final dateUploads = parseDates(dates, "d MMMM,yyyy", "id"); + List? episodesList = []; + for (var i = 1; i < epUrls.length; i++) { + MChapter episode = MChapter(); + episode.name = names[i]; + episode.dateUpload = dateUploads[i]; + episode.url = epUrls[i]; + episodesList.add(episode); + } + anime.chapters = episodesList; + return anime; + } + + @override + Future> getVideoList(MSource source, String url) async { + List videos = []; + final res = await http('GET', json.encode({"url": url})); + final script = + xpath(res, '//script[contains(text(), "{action:")]/text()').first; + final nonceAction = + substringBefore(substringAfter(script, "{action:\""), '"'); + final action = substringBefore(substringAfter(script, "action:\""), '"'); + + final resNonceAction = await http( + 'POST', + json.encode({ + "useFormBuilder": true, + "body": {"action": nonceAction}, + "url": "${source.baseUrl}/wp-admin/admin-ajax.php" + })); + final nonce = substringBefore(substringAfter(resNonceAction, ":\""), '"'); + final mirrorstream = + xpath(res, '//*[@class="mirrorstream"]/ul/li/a/@data-content'); + for (var stream in mirrorstream) { + List a = []; + final decodedData = json.decode(base64(stream, 0)); + final q = decodedData["q"]; + final id = decodedData["id"]; + final i = decodedData["i"]; + final body = {"i": i, "id": id, "q": q, "nonce": nonce, "action": action}; + + final res = await http( + 'POST', + json.encode({ + "useFormBuilder": true, + "body": body, + "url": "${source.baseUrl}/wp-admin/admin-ajax.php" + })); + final html = base64(substringBefore(substringAfter(res, ":\""), '"'), 0); + final url = xpath(html, '//iframe/@src').first; + + if (url.contains("yourupload")) { + final id = substringBefore(substringAfter(url, "id="), "&"); + url = "https://yourupload.com/embed/$id"; + a = await yourUploadExtractor(url, null, "YourUpload - $q", null); + } else if (url.contains("filelions")) { + a = await streamWishExtractor(url, "FileLions"); + } else if (url.contains("desustream")) { + final res = await http('GET', json.encode({"url": url})); + 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); + } else if (url.contains("mp4upload")) { + final res = await http('GET', json.encode({"url": url})); + final script = + xpath(res, '//script[contains(text(), "player.src")]/text()').first; + final videoUrl = + substringBefore(substringAfter(script, "src: \""), '"'); + MVideo video = MVideo(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = "Mp4upload - $q" + ..subtitles = []; + videos.add(video); + } + videos.addAll(a); + } + + return videos; + } + + MPages parseAnimeList(String res) { + List animeList = []; + final urls = + xpath(res, '//div[@class="detpost"]/div[@class="thumb"]/a/@href'); + final names = xpath(res, + '//div[@class="detpost"]/div[@class="thumb"]/a/div[@class="thumbz"]/h2/text()'); + final images = xpath(res, + '//div[@class="detpost"]/div[@class="thumb"]/a/div[@class="thumbz"]/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); + } + final pages = xpath( + res, '//div[@class="pagenavix"]/a[@class="next page-numbers"]/@href'); + return MPages(animeList, pages.isNotEmpty); + } +} + +OtakuDesu main() { + return OtakuDesu(); +} diff --git a/anime/src/id/otakudesu/source.dart b/anime/src/id/otakudesu/source.dart new file mode 100644 index 00000000..eb05a87a --- /dev/null +++ b/anime/src/id/otakudesu/source.dart @@ -0,0 +1,17 @@ +import '../../../../model/source.dart'; +import '../../../../utils/utils.dart'; + +Source get otakudesu => _otakudesu; +const otakudesuVersion = "0.0.1"; +const otakudesuCodeUrl = + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/otakudesu/otakudesu-v$otakudesuVersion.dart"; +Source _otakudesu = Source( + name: "OtakuDesu", + baseUrl: "https://otakudesu.cam", + lang: "id", + typeSource: "single", + iconUrl: getIconUrl("otakudesu", "id"), + sourceCodeUrl: otakudesuCodeUrl, + version: otakudesuVersion, + appMinVerReq: "0.0.7", + isManga: false); diff --git a/icons/mangayomi-id-nimegami.png b/icons/mangayomi-id-nimegami.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8709257ed39e2a906a5cd15a3bfb440b56d7b2 GIT binary patch literal 3651 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 V`~n^ME5QH&002ovPDHLkV1h7f4F~`L literal 0 HcmV?d00001 diff --git a/icons/mangayomi-id.oploverz.png b/icons/mangayomi-id.oploverz.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bd63f65ef9d5808a47b6083c335d385a41258a GIT binary patch literal 14655 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 BX&e9m literal 0 HcmV?d00001 diff --git a/icons/mangayomi-id.otakudesu.png b/icons/mangayomi-id.otakudesu.png new file mode 100644 index 0000000000000000000000000000000000000000..abca3f890f29a57c0e1595bd12961629664e4231 GIT binary patch literal 6422 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 literal 0 HcmV?d00001