From c914c828380b517575500bd7928c883469c598b6 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:50:02 +0100 Subject: [PATCH] New source : KissKH (EN) --- anime/source_generator.dart | 4 +- anime/src/en/kisskh/kisskh-v0.0.1.dart | 161 +++++++++++++++++++++++++ anime/src/en/kisskh/source.dart | 17 +++ icons/mangayomi-en-kisskh.png | Bin 0 -> 3012 bytes 4 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 anime/src/en/kisskh/kisskh-v0.0.1.dart create mode 100644 anime/src/en/kisskh/source.dart create mode 100644 icons/mangayomi-en-kisskh.png diff --git a/anime/source_generator.dart b/anime/source_generator.dart index 6bcf87ac..196f9f64 100644 --- a/anime/source_generator.dart +++ b/anime/source_generator.dart @@ -5,6 +5,7 @@ import '../model/source.dart'; import 'src/en/aniwatch/sources.dart'; import 'src/en/gogoanime/source.dart'; // import 'src/en/wcostream/source.dart'; +import 'src/en/kisskh/source.dart'; import 'src/fr/animesultra/source.dart'; import 'src/fr/franime/source.dart'; import 'src/fr/otakufr/source.dart'; @@ -18,7 +19,8 @@ void main() { otakufr, // wcostreamSource, animesultraSource, - ...aniwatchSourcesList + ...aniwatchSourcesList, + kisskhSource ]; final List> jsonList = _sourcesList.map((source) => source.toJson()).toList(); diff --git a/anime/src/en/kisskh/kisskh-v0.0.1.dart b/anime/src/en/kisskh/kisskh-v0.0.1.dart new file mode 100644 index 00000000..767e561a --- /dev/null +++ b/anime/src/en/kisskh/kisskh-v0.0.1.dart @@ -0,0 +1,161 @@ +import 'dart:convert'; +import 'package:bridge_lib/bridge_lib.dart'; + +getPopularAnime(MangaModel anime) async { + final data = { + "url": + "${anime.baseUrl}/api/DramaList/List?page=${anime.page}&type=0&sub=0&country=0&status=0&order=1&pageSize=40" + }; + final res = await MBridge.http('GET', json.encode(data)); + if (res.isEmpty) { + return anime; + } + final jsonRes = json.decode(res); + final datas = jsonRes["data"] as List; + anime.names = datas.map((e) => e["title"]).toList(); + anime.images = datas.map((e) => e["thumbnail"] ?? "").toList(); + anime.urls = datas + .map((e) => "${anime.baseUrl}/api/DramaList/Drama/${e["id"]}?isq=false") + .toList(); + final lastPage = jsonRes["totalCount"] as int; + final page = jsonRes["page"] as int; + + anime.hasNextPage = page < lastPage; + return anime; +} + +getLatestUpdatesAnime(MangaModel anime) async { + final data = { + "url": + "${anime.baseUrl}/api/DramaList/List?page=${anime.page}&type=0&sub=0&country=0&status=0&order=12&pageSize=40" + }; + final res = await MBridge.http('GET', json.encode(data)); + if (res.isEmpty) { + return anime; + } + final jsonRes = json.decode(res); + final datas = jsonRes["data"] as List; + anime.names = datas.map((e) => e["title"]).toList(); + anime.images = datas.map((e) => e["thumbnail"] ?? "").toList(); + anime.urls = datas + .map((e) => "${anime.baseUrl}/api/DramaList/Drama/${e["id"]}?isq=false") + .toList(); + final lastPage = jsonRes["totalCount"] as int; + final page = jsonRes["page"] as int; + + anime.hasNextPage = page < lastPage; + + return anime; +} + +getAnimeDetail(MangaModel anime) async { + final statusList = [ + { + "Ongoing": 0, + "Completed": 1, + } + ]; + + final data = {"url": anime.link}; + final res = await MBridge.http('GET', json.encode(data)); + if (res.isEmpty) { + return anime; + } + final jsonRes = json.decode(res); + final status = jsonRes["status"] ?? ""; + print(status); + anime.description = jsonRes["description"]; + anime.status = MBridge.parseStatus(status, statusList); + anime.imageUrl = jsonRes["thumbnail"]; + var episodes = jsonRes["episodes"]; + String type = jsonRes["type"]; + final episodesCount = jsonRes["episodesCount"] as int; + List episodesNames = []; + List episodesUrls = []; + bool containsAnime = type.contains("Anime") as bool; + bool containsTVSeries = type.contains("TVSeries") as bool; + bool containsHollywood = type.contains("Hollywood") as bool; + bool containsMovie = type.contains("Movie") as bool; + for (var a in episodes) { + String number = (a["number"] as double).toString().replaceAll(".0", ""); + final id = a["id"]; + if (containsAnime || containsTVSeries) { + episodesNames.add("Episode $number"); + } else if (containsHollywood && episodesCount == 1 || containsMovie) { + episodesNames.add("Movie"); + } else if (containsHollywood && episodesCount > 1) { + episodesNames.add("Episode $number"); + } + + episodesUrls.add( + "${anime.baseUrl}/api/DramaList/Episode/$id.png?err=false&ts=&time="); + } + anime.urls = episodesUrls; + anime.names = episodesNames; + anime.chaptersDateUploads = []; + return anime; +} + +getVideoList(MangaModel anime) async { + final datas = {"url": anime.link}; + + final res = await MBridge.http('GET', json.encode(datas)); + + if (res.isEmpty) { + return []; + } + final id = MBridge.substringAfter( + MBridge.substringBefore(anime.link, ".png"), "Episode/"); + final jsonRes = json.decode(res); + final subRes = await MBridge.http( + 'GET', json.encode({"url": "${anime.baseUrl}/api/Sub/$id"})); + var jsonSubRes = json.decode(subRes); + + List subtitles = []; + + for (var sub in jsonSubRes) { + try { + final subUrl = sub["src"]; + final label = sub["label"]; + TrackModel subtitle = TrackModel(); + subtitle + ..label = label + ..file = subUrl; + subtitles.add(subtitle); + } catch (_) {} + } + + final videoUrl = jsonRes["Video"]; + VideoModel video = VideoModel(); + video + ..url = videoUrl + ..originalUrl = videoUrl + ..quality = "kisskh" + ..subtitles = subtitles + ..headers = { + "referer": "https://kisskh.me/", + "origin": "https://kisskh.me" + }; + return [video]; +} + +searchAnime(MangaModel anime) async { + final data = { + "url": "${anime.baseUrl}/api/DramaList/Search?q=${anime.query}&type=0" + }; + final res = await MBridge.http('GET', json.encode(data)); + if (res.isEmpty) { + return anime; + } + var jsonRes = json.decode(res) as List; + + anime.names = jsonRes.map((e) => e["title"]).toList(); + + anime.images = jsonRes.map((e) => e["thumbnail"] ?? "").toList(); + + anime.urls = jsonRes + .map((e) => "${anime.baseUrl}/api/DramaList/Drama/${e["id"]}?isq=false") + .toList(); + + return anime; +} diff --git a/anime/src/en/kisskh/source.dart b/anime/src/en/kisskh/source.dart new file mode 100644 index 00000000..97c9e2cf --- /dev/null +++ b/anime/src/en/kisskh/source.dart @@ -0,0 +1,17 @@ +import '../../../../model/source.dart'; +import '../../../../utils/utils.dart'; + +Source get kisskhSource => _kisskhSource; +const kisskhVersion = "0.0.1"; +const kisskhSourceCodeUrl = + "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/kisskh/kisskh-v$kisskhVersion.dart"; +Source _kisskhSource = Source( + name: "KissKH", + baseUrl: "https://kisskh.co", + lang: "en", + typeSource: "single", + iconUrl: getIconUrl("kisskh", "en"), + sourceCodeUrl: kisskhSourceCodeUrl, + version: kisskhVersion, + appMinVerReq: "0.0.48", + isManga: false); diff --git a/icons/mangayomi-en-kisskh.png b/icons/mangayomi-en-kisskh.png new file mode 100644 index 0000000000000000000000000000000000000000..5c440d80beb67f246591a19b6f9998f557522039 GIT binary patch literal 3012 zcmV;#3p@0QP)-L?2!s%fBtUo=fdD~bj1UY|5UaGbG`y4`g~iJcD4&EX zP!Z8GXer9eq(bB+5(w`k2uU;#NJuL0u&>PS?7X`B`k`lMr*}5ld35*AE_14;cDDQW z>D&Kv?*E*7=5{w!r7BgaN>!>-m8w*wDpmQsiSYTjkuK6pAVtnc$@yLt8+Zv=Ip3w5 z2IvJ{-Tch#i%uGE+!fU2bVZmA1sh(U*4|=RS=Z*FRR=0NtR<$hHv>Y&U zj8V1$1fT-i{#Rz-H@>0kPRwqQMvnes0rb)U#T@J6d6gh2K@LY7A00by%Q7Ghn1dNX zDbVw^cmFzT(fIndJ25&yrjG%BxwKiX_YV=>TM00ZFecLa!*`!Jx1!WMT0-AKy=S>nrgex0|FW97Udd1 z1+-8gIk9MUl-3v+zUa}HB*cVa!2j2_tuOxPoUXB1+=83(U zH+V@Q-a3O)QQ-SR7t#X<7?K#^L1#-crO5O zVOe63ECc)@`OTr?vLH8sFBg1Srsw+a{ociZl70+#6MQ%34gLgcmt%m(;JXE!C*D8Q z6S0z)fD{3KNxVN4Rad_ZP*xF5($=N$*y;%JRNvMq6Vlu;w+8^zf_2*hytqD$VLJ6J zo)c$mlgV$NuO(&lc1JR8Qkv_&5(gljgx5X_vwnMkWV-jPww`&jl3X}7$?n4{tKJK9 zpiRl?nMBv%r;DS6bm{5LS@Q<;!o2?8C+bo2Q>$1qv|alxv_&YTT-M9!P?D1 z2WUdTrDxg0>7@<9EclmxDZ#iVE9?D{kYw5`7){zo)O>)hJan5K-`4T_8 zod+DHP1+DVwmOoxT~XlvCvC6n1y)lfOXtV<-dAI&qK_+{eXGU+KETZjVhCYxn|fl3 z^&bZSIMCL+#1(cQQrX+8F{Uw1Q=O!vTVR-i-G}<9>Zv!ve0N^AOWD(q)Pj!P_CSY1 zdw2edy$^Q;9H5SGws`E8b|z0S9J&s6sO(@k{4-Qxmk?J@i~1e}1*rp|e-@q_Js6MJ&$!(HOeo%7ATd z`Fd9gWs8cB0d|`MZ7ToX7&Ki((H|0UJJ|*d5x;^AEz}ar?W_`f4&rbbJ9{heM zr)eha6L7qhr{}eep}f&^`iW^Y)z+g2BrET0%j;V>C^;@-FR{ONPK*WT_T*(y$3-l{ zLCZ6+hdc%treOKM>hi!>6___O&i&U%QFbb%4-1qgiF&+KS0W{Nc!e`~3n95_L3j3a ziUAYrje#j7dGzr6(=sP ziWvO<0hiTp45WnQ@ZqRr}`4UTq1HcY*(SJCrwiE}xmmHnUpoZKi}p&o^?z zOZB|IH^61jHu2C0waj19$gOMYK}uHd3Ucu?&FqTW>8Z3NGA4YZ9+wPI;7#FD5{(I7 z{ZA+_@4sSJ0-4CyAx(+QNyQI!sJyVwHefIK0S%U1Y}b9P{U8k+!1oX8Z12=)iz_U9 zBf{P1#F*M_u%}z&wi&k4zi$gOzE*N#ec!FTqTce2dPI{B9^~WLpjMNokUZa52>5`v{Q50pIT;UfK}KOFOT>*v>>0ePE-R z?IOGBh4uNV>%#NmHkZdm*85xI3NP>0IeT0R!-9`HH1>3#Av@GyaO6tNEr%ud}eqi8ZrOht9vn9YM`<;Vz zT(gx8zQ(@35%knHyFj;edYo+?8t)#|`ODTYAysnQj2J&ZuM16)EIc_ubI8mDV2P-e zzEY2GzXwPOcRvwvl#~JPSQI53w7FmCnRKMTy0op}k(K#%qh(h`(G-caz}lx|f!Wfb zG5@3_Ee$3oL<|o12o6cXHzvoa2}riKYc%KZ1vJTpXC$-fqcRrEgLd0TE{bN`u3p%g*Y8uC z4gR^Xy>A{7fWQ>#EAKnzF@x+^fiTc0*Ea1bC0{ycQ$`G}RT5t|}n( zfroojo$S5)eBkp6Y#J*CKkq^F4X{aB- z4^QxYiUGJ(;2L@0dm95>Udrgs1g`R)cc=LexEsK`<@G}get8D)?9pUp7-pD(Uz`D? zn@^qc3;4N`bCt?e9>wmJD{$pce{!Wl~Pt5p92=9W2xU=9`