From 54c601d51f901c97c2030a42258b4053418c3d93 Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou <107993382+kodjodevf@users.noreply.github.com> Date: Sun, 2 Feb 2025 21:06:58 +0100 Subject: [PATCH] Remove --- dart/anime/anime_source_list.dart | 4 - dart/anime/src/en/dramacool/dramacool.dart | 210 --------------------- dart/anime/src/en/dramacool/icon.png | Bin 6955 -> 0 bytes dart/anime/src/en/dramacool/source.dart | 16 -- dart/anime/src/en/kisskh/icon.png | Bin 3012 -> 0 bytes dart/anime/src/en/kisskh/kisskh.dart | 184 ------------------ dart/anime/src/en/kisskh/source.dart | 16 -- 7 files changed, 430 deletions(-) delete mode 100644 dart/anime/src/en/dramacool/dramacool.dart delete mode 100644 dart/anime/src/en/dramacool/icon.png delete mode 100644 dart/anime/src/en/dramacool/source.dart delete mode 100644 dart/anime/src/en/kisskh/icon.png delete mode 100644 dart/anime/src/en/kisskh/kisskh.dart delete mode 100644 dart/anime/src/en/kisskh/source.dart diff --git a/dart/anime/anime_source_list.dart b/dart/anime/anime_source_list.dart index 588bf52d..c20ef88f 100644 --- a/dart/anime/anime_source_list.dart +++ b/dart/anime/anime_source_list.dart @@ -7,14 +7,12 @@ import 'src/all/nyaa/source.dart'; import 'src/ar/okanime/source.dart'; import 'src/de/animetoast/source.dart'; import 'src/en/animepahe/source.dart'; -import 'src/en/dramacool/source.dart'; import 'src/en/gogoanime/source.dart'; import 'src/en/nineanimetv/source.dart'; import 'src/es/animeonlineninja/source.dart'; import 'src/fr/animesama/source.dart'; import 'src/fr/anizone/source.dart'; import 'src/hi/yomovies/source.dart'; -import 'src/en/kisskh/source.dart'; import 'src/en/uhdmovies/source.dart'; import 'src/fr/animesultra/source.dart'; import 'src/fr/franime/source.dart'; @@ -33,7 +31,6 @@ List dartAnimesourceList = [ otakufr, animesultraSource, ...zorothemeSourcesList, - kisskhSource, okanimeSource, otakudesu, nimegami, @@ -43,7 +40,6 @@ List dartAnimesourceList = [ uhdmoviesSource, ...datalifeengineSourcesList, filma24, - dramacoolSource, yomoviesSource, animesamaSource, nineanimetv, diff --git a/dart/anime/src/en/dramacool/dramacool.dart b/dart/anime/src/en/dramacool/dramacool.dart deleted file mode 100644 index 2bf01042..00000000 --- a/dart/anime/src/en/dramacool/dramacool.dart +++ /dev/null @@ -1,210 +0,0 @@ -import 'package:mangayomi/bridge_lib.dart'; -import 'dart:convert'; - -class DramaCool extends MProvider { - DramaCool({required this.source}); - - MSource source; - - 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("$baseUrl/most-popular-drama?page=$page"))) - .body; - final document = parseHtml(res); - return animeFromElement(document.select("ul.list-episode-item li a"), - document.selectFirst("li.next a")?.attr("href") != null); - } - - @override - Future getLatestUpdates(int page) async { - final res = - (await client.get(Uri.parse("$baseUrl/recently-added?page=$page"))) - .body; - final document = parseHtml(res); - return animeFromElement(document.select("ul.switch-block a"), - document.selectFirst("li.next a")?.attr("href") != null); - } - - @override - Future search(String query, int page, FilterList filterList) async { - final res = (await client - .get(Uri.parse("$baseUrl/search?keyword=$query&page=$page"))) - .body; - final document = parseHtml(res); - return animeFromElement(document.select("ul.list-episode-item li a"), - document.selectFirst("li.next a")?.attr("href") != null); - } - - @override - Future getDetail(String url) async { - final statusList = [ - {"Ongoing": 0, "Completed": 1} - ]; - url = getUrlWithoutDomain(url); - if (url.contains("-episode-") && url.endsWith(".html")) { - final res = (await client.get(Uri.parse("$baseUrl$url"))).body; - url = parseHtml(res).selectFirst("div.category a").attr("href"); - } - url = getUrlWithoutDomain(url); - - final res = (await client.get(Uri.parse("$baseUrl$url"))).body; - final document = parseHtml(res); - MManga anime = MManga(); - anime.description = document - .selectFirst("div.info") - .select("p") - .map((MElement e) { - if (!e.outerHtml.contains(" episodesList = []; - final episodeListElements = document.select("ul.all-episode li a"); - - for (var element in episodeListElements) { - var epNum = - substringAfterLast(element.selectFirst("h3").text, "Episode "); - var type = element.selectFirst("span.type")?.text ?? "RAW"; - var date = element.selectFirst("span.time")?.text ?? ""; - MChapter ep = MChapter(); - ep.name = "$type: Episode $epNum".trim(); - ep.url = element.getHref; - if (date.isNotEmpty) - ep.dateUpload = parseDates([element.selectFirst("span.time")?.text], - "yyyy-MM-dd HH:mm:ss", "en") - .first; - episodesList.add(ep); - } - - anime.chapters = episodesList; - return anime; - } - - @override - Future> getVideoList(String url) async { - url = getUrlWithoutDomain(url); - - final res = (await client.get(Uri.parse("$baseUrl$url"))).body; - final document = parseHtml(res); - String iframeUrl = document.selectFirst("iframe")?.getSrc ?? ""; - if (iframeUrl.isEmpty) return []; - if (iframeUrl.startsWith("//")) { - iframeUrl = "https:$iframeUrl"; - } - var iframeDoc = parseHtml((await client.get(Uri.parse(iframeUrl))).body); - final serverElements = iframeDoc.select("ul.list-server-items li"); - List videos = []; - for (var serverElement in serverElements) { - var url = serverElement.attr("data-video"); - List a = []; - if (url.contains("dood")) { - a = await doodExtractor(url, "DoodStream"); - } else if (url.contains("dwish")) { - a = await streamWishExtractor(url, "StreamWish"); - } else if (url.contains("streamtape")) { - a = await streamTapeExtractor(url, "StreamTape"); - } - videos.addAll(a); - } - return sortVideos(videos, source.id); - } - - @override - List getSourcePreferences() { - return [ - EditTextPreference( - key: "overrideBaseUrl", - title: "Override BaseUrl", - summary: "", - value: "https://dramacool.pa", - dialogTitle: "Override BaseUrl", - dialogMessage: "", - text: "https://dramacool.pa"), - ListPreference( - key: "preferred_quality", - title: "Preferred quality", - summary: "", - valueIndex: 0, - entries: [ - "1080p", - "720p", - "480p", - "360p", - "Doodstream", - "StreamTape" - ], - entryValues: [ - "1080", - "720", - "480", - "360", - "Doodstream", - "StreamTape" - ]) - ]; - } - - MPages animeFromElement(List elements, bool hasNextPage) { - List animeList = []; - for (var element in elements) { - MManga anime = MManga(); - anime.name = element.selectFirst("h3")?.text ?? "Serie"; - anime.imageUrl = (element.selectFirst("img")?.attr("data-original") ?? "") - .replaceAll(" ", "%20") ?? - ""; - anime.link = element.getHref; - animeList.add(anime); - } - return MPages(animeList, hasNextPage); - } - - List sortVideos(List videos, int sourceId) { - String quality = getPreferenceValue(sourceId, "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; - } -} - -DramaCool main(MSource source) { - return DramaCool(source: source); -} diff --git a/dart/anime/src/en/dramacool/icon.png b/dart/anime/src/en/dramacool/icon.png deleted file mode 100644 index ceb49c5d358c16b17efc8937f283f624a41efb53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6955 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 _dramacoolSource; -const _dramacoolVersion = "0.0.25"; -const _dramacoolSourceCodeUrl = - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/dramacool/dramacool.dart"; -Source _dramacoolSource = Source( - name: "DramaCool", - baseUrl: "https://dramacool.pa", - lang: "en", - typeSource: "single", - iconUrl: - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/dramacool/icon.png", - sourceCodeUrl: _dramacoolSourceCodeUrl, - version: _dramacoolVersion, - itemType: ItemType.anime); diff --git a/dart/anime/src/en/kisskh/icon.png b/dart/anime/src/en/kisskh/icon.png deleted file mode 100644 index 5c440d80beb67f246591a19b6f9998f557522039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 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 getPopular(int page) async { - final res = (await client.get(Uri.parse( - "${source.baseUrl}/api/DramaList/List?page=$page&type=0&sub=0&country=0&status=0&order=1&pageSize=40"))) - .body; - final jsonRes = json.decode(res); - final datas = jsonRes["data"]; - List animeList = []; - - for (var data in datas) { - var anime = MManga(); - anime.name = data["title"]; - anime.imageUrl = data["thumbnail"] ?? ""; - anime.link = - "${source.baseUrl}/api/DramaList/Drama/${data["id"]}?isq=false"; - animeList.add(anime); - } - - int lastPage = jsonRes["totalCount"]; - int pages = jsonRes["page"]; - return MPages(animeList, pages < lastPage); - } - - @override - Future getLatestUpdates(int page) async { - final res = (await client.get(Uri.parse( - "${source.baseUrl}/api/DramaList/List?page=$page&type=0&sub=0&country=0&status=0&order=12&pageSize=40"))) - .body; - final jsonRes = json.decode(res); - final datas = jsonRes["data"]; - - List animeList = []; - - for (var data in datas) { - var anime = MManga(); - anime.name = data["title"]; - anime.imageUrl = data["thumbnail"] ?? ""; - anime.link = - "${source.baseUrl}/api/DramaList/Drama/${data["id"]}?isq=false"; - animeList.add(anime); - } - - int lastPage = jsonRes["totalCount"]; - int pages = jsonRes["page"]; - return MPages(animeList, pages < lastPage); - } - - @override - Future search(String query, int page, FilterList filterList) async { - final res = (await client.get(Uri.parse( - "${source.baseUrl}/api/DramaList/Search?q=$query&type=0"))) - .body; - final jsonRes = json.decode(res); - List animeList = []; - for (var data in jsonRes) { - var anime = MManga(); - anime.name = data["title"]; - anime.imageUrl = data["thumbnail"] ?? ""; - anime.link = - "${source.baseUrl}/api/DramaList/Drama/${data["id"]}?isq=false"; - animeList.add(anime); - } - return MPages(animeList, false); - } - - @override - Future getDetail(String url) async { - final statusList = [ - {"Ongoing": 0, "Completed": 1} - ]; - final res = (await client.get(Uri.parse(url))).body; - var anime = MManga(); - final jsonRes = json.decode(res); - final status = jsonRes["status"] ?? ""; - anime.description = jsonRes["description"]; - anime.status = parseStatus(status, statusList); - anime.imageUrl = jsonRes["thumbnail"]; - var episodes = jsonRes["episodes"]; - String type = jsonRes["type"]; - final episodesCount = jsonRes["episodesCount"] as int; - final containsAnime = type.contains("Anime"); - final containsTVSeries = type.contains("TVSeries"); - final containsHollywood = type.contains("Hollywood"); - final containsMovie = type.contains("Movie"); - List? episodesList = []; - - for (var a in episodes) { - MChapter episode = MChapter(); - String number = (a["number"] as double).toString().replaceAll(".0", ""); - final id = a["id"]; - if (containsAnime || containsTVSeries) { - episode.name = "Episode $number"; - } else if (containsHollywood && episodesCount == 1 || containsMovie) { - episode.name = "Movie"; - } else if (containsHollywood && episodesCount > 1) { - episode.name = "Episode $number"; - } - episode.url = - "${source.baseUrl}/api/DramaList/Episode/$id.png?err=false&ts=&time="; - episodesList.add(episode); - } - - anime.chapters = episodesList; - return anime; - } - - @override - Future> getVideoList(String url) async { - final res = (await client.get(Uri.parse(url))).body; - final id = substringAfter(substringBefore(url, ".png"), "Episode/"); - final jsonRes = json.decode(res); - - final subRes = - (await client.get(Uri.parse("${source.baseUrl}/api/Sub/$id"))).body; - var jsonSubRes = json.decode(subRes); - List subtitles = []; - - for (var sub in jsonSubRes) { - final subUrl = sub["src"] as String; - final label = sub["label"]; - if (subUrl.endsWith("txt")) { - var subtitle = await getSubtitle(subUrl, label); - subtitles.add(subtitle); - } else { - var subtitle = MTrack(); - subtitle - ..label = label - ..file = subUrl; - subtitles.add(subtitle); - } - } - final videoUrl = jsonRes["Video"]; - var video = MVideo(); - video - ..url = videoUrl - ..originalUrl = videoUrl - ..quality = "kisskh" - ..subtitles = subtitles - ..headers = { - "referer": "https://kisskh.me/", - "origin": "https://kisskh.me" - }; - return [video]; - } - - Future getSubtitle(String subUrl, String subLang) async { - final response = await client.get(Uri.parse(subUrl), headers: { - "referer": "https://kisskh.me/", - "origin": "https://kisskh.me" - }); - final subtitleData = response.body; - String decrypted = "\n"; - for (String line in subtitleData.split('\n')) { - decrypted += "${decrypt(line.trim())}\n"; - } - var subtitle = MTrack(); - subtitle - ..label = subLang - ..file = decrypted; - return subtitle; - } - - String decrypt(String data) { - final key = utf8.decode( - [56, 48, 53, 54, 52, 56, 51, 54, 52, 54, 51, 50, 56, 55, 54, 51]); - final iv = utf8.decode( - [54, 56, 53, 50, 54, 49, 50, 51, 55, 48, 49, 56, 53, 50, 55, 51]); - return cryptoHandler(data, iv, key, false); - } -} - -KissKh main(MSource source) { - return KissKh(source: source); -} diff --git a/dart/anime/src/en/kisskh/source.dart b/dart/anime/src/en/kisskh/source.dart deleted file mode 100644 index c4405238..00000000 --- a/dart/anime/src/en/kisskh/source.dart +++ /dev/null @@ -1,16 +0,0 @@ -import '../../../../../model/source.dart'; - -Source get kisskhSource => _kisskhSource; -const _kisskhVersion = "0.0.6"; -const _kisskhSourceCodeUrl = - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/kisskh/kisskh.dart"; -Source _kisskhSource = Source( - name: "KissKH", - baseUrl: "https://kisskh.co", - lang: "en", - typeSource: "single", - iconUrl: - "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/en/kisskh/icon.png", - sourceCodeUrl: _kisskhSourceCodeUrl, - version: _kisskhVersion, - itemType: ItemType.anime);