mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 02:41:39 +00:00
Remove
This commit is contained in:
@@ -7,14 +7,12 @@ import 'src/all/nyaa/source.dart';
|
|||||||
import 'src/ar/okanime/source.dart';
|
import 'src/ar/okanime/source.dart';
|
||||||
import 'src/de/animetoast/source.dart';
|
import 'src/de/animetoast/source.dart';
|
||||||
import 'src/en/animepahe/source.dart';
|
import 'src/en/animepahe/source.dart';
|
||||||
import 'src/en/dramacool/source.dart';
|
|
||||||
import 'src/en/gogoanime/source.dart';
|
import 'src/en/gogoanime/source.dart';
|
||||||
import 'src/en/nineanimetv/source.dart';
|
import 'src/en/nineanimetv/source.dart';
|
||||||
import 'src/es/animeonlineninja/source.dart';
|
import 'src/es/animeonlineninja/source.dart';
|
||||||
import 'src/fr/animesama/source.dart';
|
import 'src/fr/animesama/source.dart';
|
||||||
import 'src/fr/anizone/source.dart';
|
import 'src/fr/anizone/source.dart';
|
||||||
import 'src/hi/yomovies/source.dart';
|
import 'src/hi/yomovies/source.dart';
|
||||||
import 'src/en/kisskh/source.dart';
|
|
||||||
import 'src/en/uhdmovies/source.dart';
|
import 'src/en/uhdmovies/source.dart';
|
||||||
import 'src/fr/animesultra/source.dart';
|
import 'src/fr/animesultra/source.dart';
|
||||||
import 'src/fr/franime/source.dart';
|
import 'src/fr/franime/source.dart';
|
||||||
@@ -33,7 +31,6 @@ List<Source> dartAnimesourceList = [
|
|||||||
otakufr,
|
otakufr,
|
||||||
animesultraSource,
|
animesultraSource,
|
||||||
...zorothemeSourcesList,
|
...zorothemeSourcesList,
|
||||||
kisskhSource,
|
|
||||||
okanimeSource,
|
okanimeSource,
|
||||||
otakudesu,
|
otakudesu,
|
||||||
nimegami,
|
nimegami,
|
||||||
@@ -43,7 +40,6 @@ List<Source> dartAnimesourceList = [
|
|||||||
uhdmoviesSource,
|
uhdmoviesSource,
|
||||||
...datalifeengineSourcesList,
|
...datalifeengineSourcesList,
|
||||||
filma24,
|
filma24,
|
||||||
dramacoolSource,
|
|
||||||
yomoviesSource,
|
yomoviesSource,
|
||||||
animesamaSource,
|
animesamaSource,
|
||||||
nineanimetv,
|
nineanimetv,
|
||||||
|
|||||||
@@ -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<MPages> 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<MPages> 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<MPages> 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<MManga> 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("<span")) {
|
|
||||||
return e.text;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
})
|
|
||||||
.toList()
|
|
||||||
.join("\n");
|
|
||||||
final author =
|
|
||||||
xpath(res, '//p[contains(text(),"Original Network:")]/a/text()');
|
|
||||||
if (author.isNotEmpty) {
|
|
||||||
anime.author = author.first;
|
|
||||||
}
|
|
||||||
anime.genre = xpath(res, '//p[contains(text(),"Genre:")]/a/text()');
|
|
||||||
final status = xpath(res, '//p[contains(text(),"Status")]/a/text()');
|
|
||||||
if (status.isNotEmpty) {
|
|
||||||
anime.status = parseStatus(status.first, statusList);
|
|
||||||
}
|
|
||||||
List<MChapter> 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<List<MVideo>> 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<MVideo> videos = [];
|
|
||||||
for (var serverElement in serverElements) {
|
|
||||||
var url = serverElement.attr("data-video");
|
|
||||||
List<MVideo> 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<dynamic> 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<MElement> elements, bool hasNextPage) {
|
|
||||||
List<MManga> 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<MVideo> sortVideos(List<MVideo> 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);
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -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);
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.9 KiB |
@@ -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<MPages> 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<MManga> 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<MPages> 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<MManga> 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<MPages> 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<MManga> 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<MManga> 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<MChapter>? 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<List<MVideo>> 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<MTrack> 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<MTrack> 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);
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
Reference in New Issue
Block a user