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 ceb49c5d..00000000 Binary files a/dart/anime/src/en/dramacool/icon.png and /dev/null differ diff --git a/dart/anime/src/en/dramacool/source.dart b/dart/anime/src/en/dramacool/source.dart deleted file mode 100644 index 7c0cb4cd..00000000 --- a/dart/anime/src/en/dramacool/source.dart +++ /dev/null @@ -1,16 +0,0 @@ -import '../../../../../model/source.dart'; - -Source get dramacoolSource => _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 5c440d80..00000000 Binary files a/dart/anime/src/en/kisskh/icon.png and /dev/null differ diff --git a/dart/anime/src/en/kisskh/kisskh.dart b/dart/anime/src/en/kisskh/kisskh.dart deleted file mode 100644 index 00127ff0..00000000 --- a/dart/anime/src/en/kisskh/kisskh.dart +++ /dev/null @@ -1,184 +0,0 @@ -import 'package:mangayomi/bridge_lib.dart'; -import 'dart:convert'; - -class KissKh extends MProvider { - KissKh({required this.source}); - - MSource source; - - final Client client = Client(source); - - @override - Future 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);