mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 10:51:17 +00:00
fix datalifeengine
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import 'package:mangayomi/bridge_lib.dart';
|
import 'package:mangayomi/bridge_lib.dart';
|
||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
class DataLifeEngine extends MProvider {
|
class DataLifeEngine extends MProvider {
|
||||||
DataLifeEngine({required this.source});
|
DataLifeEngine({required this.source});
|
||||||
@@ -11,11 +10,14 @@ class DataLifeEngine extends MProvider {
|
|||||||
@override
|
@override
|
||||||
bool get supportsLatest => false;
|
bool get supportsLatest => false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get baseUrl => getPreferenceValue(source.id, "overrideBaseUrl");
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<MPages> getPopular(int page) async {
|
Future<MPages> getPopular(int page) async {
|
||||||
final res = (await client
|
final res =
|
||||||
.get(Uri.parse("${source.baseUrl}${getPath(source)}page/$page")))
|
(await client.get(Uri.parse("$baseUrl${getPath(source)}page/$page")))
|
||||||
.body;
|
.body;
|
||||||
return animeFromElement(res);
|
return animeFromElement(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,10 +29,11 @@ class DataLifeEngine extends MProvider {
|
|||||||
@override
|
@override
|
||||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||||
final filters = filterList.filters;
|
final filters = filterList.filters;
|
||||||
final baseUrl = source.baseUrl;
|
|
||||||
String res = "";
|
String res = "";
|
||||||
if (query.isNotEmpty) {
|
if (query.isNotEmpty) {
|
||||||
if (query.length < 4) return MPages([], false);
|
if (query.length < 4)
|
||||||
|
throw Exception(
|
||||||
|
"La recherche est suspendue! La chaîne de recherche est vide ou contient moins de 4 caractères.");
|
||||||
final headers = {
|
final headers = {
|
||||||
"Host": Uri.parse(baseUrl).host,
|
"Host": Uri.parse(baseUrl).host,
|
||||||
"Origin": baseUrl,
|
"Origin": baseUrl,
|
||||||
@@ -71,7 +74,9 @@ class DataLifeEngine extends MProvider {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<MManga> getDetail(String url) async {
|
Future<MManga> getDetail(String url) async {
|
||||||
String res = (await client.get(Uri.parse(url))).body;
|
String res =
|
||||||
|
(await client.get(Uri.parse("$baseUrl${getUrlWithoutDomain(url)}")))
|
||||||
|
.body;
|
||||||
MManga anime = MManga();
|
MManga anime = MManga();
|
||||||
final description = xpath(res, '//span[@itemprop="description"]/text()');
|
final description = xpath(res, '//span[@itemprop="description"]/text()');
|
||||||
anime.description = description.isNotEmpty ? description.first : "";
|
anime.description = description.isNotEmpty ? description.first : "";
|
||||||
@@ -89,27 +94,40 @@ class DataLifeEngine extends MProvider {
|
|||||||
episodesList.add(ep);
|
episodesList.add(ep);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final eps = xpath(res,
|
final doc = parseHtml(res);
|
||||||
'//*[@class="hostsblock"]/div/a[contains(@href,"https")]/parent::div/@class');
|
final elements = doc
|
||||||
if (eps.isNotEmpty) {
|
.select(".hostsblock div:has(a)")
|
||||||
for (var i = 0; i < eps.length; i++) {
|
.where((MElement e) => e.outerHtml.contains("loadVideo('https://"))
|
||||||
final epUrls = xpath(res,
|
.toList();
|
||||||
'//*[@class="hostsblock"]/div[@class="${eps[i]}"]/a[contains(@href,"https")]/@href');
|
if (elements.isNotEmpty) {
|
||||||
|
for (var element in elements) {
|
||||||
|
element = element as MElement;
|
||||||
MChapter ep = MChapter();
|
MChapter ep = MChapter();
|
||||||
ep.name = xpath(res,
|
ep.name = element.className
|
||||||
'//*[@class="eplist"]/li[contains(@rel,"${eps[i]}")]/text()')
|
.replaceAll("ep", "Episode ")
|
||||||
.first;
|
.replaceAll("vs", " VOSTFR")
|
||||||
ep.url = epUrls.join(",").replaceAll("/vd.php?u=", "");
|
.replaceAll("vf", " VF");
|
||||||
ep.scanlator = eps[i].contains('vf') ? 'VF' : 'VOSTFR';
|
ep.url = element
|
||||||
|
.select("a")
|
||||||
|
.map((MElement e) => substringBefore(
|
||||||
|
substringAfter(e.attr('onclick'), "loadVideo('"), "')"))
|
||||||
|
.toList()
|
||||||
|
.join(",")
|
||||||
|
.replaceAll("/vd.php?u=", "");
|
||||||
|
ep.scanlator = element.className.contains('vf') ? 'VF' : 'VOSTFR';
|
||||||
episodesList.add(ep);
|
episodesList.add(ep);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
anime.status = MStatus.completed;
|
|
||||||
final epUrls = xpath(res,
|
|
||||||
'//*[contains(@class,"filmlinks")]/div/a[contains(@href,"https")]/@href');
|
|
||||||
MChapter ep = MChapter();
|
MChapter ep = MChapter();
|
||||||
ep.name = "Film";
|
ep.name = "Film";
|
||||||
ep.url = epUrls.join(",").replaceAll("/vd.php?u=", "");
|
ep.url = doc
|
||||||
|
.select("a")
|
||||||
|
.where((MElement e) => e.outerHtml.contains("loadVideo('https://"))
|
||||||
|
.map((MElement e) => substringBefore(
|
||||||
|
substringAfter(e.attr('onclick'), "loadVideo('"), "')"))
|
||||||
|
.toList()
|
||||||
|
.join(",")
|
||||||
|
.replaceAll("/vd.php?u=", "");
|
||||||
episodesList.add(ep);
|
episodesList.add(ep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,9 +144,8 @@ class DataLifeEngine extends MProvider {
|
|||||||
List<MVideo> a = [];
|
List<MVideo> a = [];
|
||||||
if (sUrl.contains("dood") || sUrl.contains("d000")) {
|
if (sUrl.contains("dood") || sUrl.contains("d000")) {
|
||||||
a = await doodExtractor(sUrl, "DoodStream");
|
a = await doodExtractor(sUrl, "DoodStream");
|
||||||
} else if (sUrl.contains("streamvid") ||
|
} else if (["streamhide", "guccihide", "streamvid", "dhtpre"]
|
||||||
sUrl.contains("guccihide") ||
|
.any((a) => sUrl.contains(a))) {
|
||||||
sUrl.contains("streamhide")) {
|
|
||||||
a = await streamHideExtractor(sUrl);
|
a = await streamHideExtractor(sUrl);
|
||||||
} else if (sUrl.contains("uqload")) {
|
} else if (sUrl.contains("uqload")) {
|
||||||
a = await uqloadExtractor(sUrl);
|
a = await uqloadExtractor(sUrl);
|
||||||
@@ -138,6 +155,12 @@ class DataLifeEngine extends MProvider {
|
|||||||
a = await sibnetExtractor(sUrl);
|
a = await sibnetExtractor(sUrl);
|
||||||
} else if (sUrl.contains("ok.ru")) {
|
} else if (sUrl.contains("ok.ru")) {
|
||||||
a = await okruExtractor(sUrl);
|
a = await okruExtractor(sUrl);
|
||||||
|
} else if (sUrl.contains("vidmoly")) {
|
||||||
|
a = await vidmolyExtractor(sUrl);
|
||||||
|
} else if (sUrl.contains("streamtape")) {
|
||||||
|
a = await streamTapeExtractor(sUrl, "");
|
||||||
|
} else if (sUrl.contains("voe.sx")) {
|
||||||
|
a = await voeExtractor(sUrl, "");
|
||||||
}
|
}
|
||||||
videos.addAll(a);
|
videos.addAll(a);
|
||||||
}
|
}
|
||||||
@@ -156,7 +179,7 @@ class DataLifeEngine extends MProvider {
|
|||||||
MManga anime = MManga();
|
MManga anime = MManga();
|
||||||
anime.name =
|
anime.name =
|
||||||
"$name ${season.isNotEmpty ? season.first.replaceAll("\n", " ") : ""}";
|
"$name ${season.isNotEmpty ? season.first.replaceAll("\n", " ") : ""}";
|
||||||
anime.imageUrl = "${source.baseUrl}$image";
|
anime.imageUrl = "$baseUrl$image";
|
||||||
anime.link = url;
|
anime.link = url;
|
||||||
animeList.add(anime);
|
animeList.add(anime);
|
||||||
}
|
}
|
||||||
@@ -246,11 +269,70 @@ class DataLifeEngine extends MProvider {
|
|||||||
return [video];
|
return [video];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<MVideo>> vidmolyExtractor(String url) async {
|
||||||
|
final headers = {
|
||||||
|
'Referer': 'https://vidmoly.to',
|
||||||
|
};
|
||||||
|
List<MVideo> videos = [];
|
||||||
|
final playListUrlResponse = (await client.get(Uri.parse(url))).body;
|
||||||
|
final playlistUrl =
|
||||||
|
RegExp(r'file:"(\S+?)"').firstMatch(playListUrlResponse)?.group(1) ??
|
||||||
|
"";
|
||||||
|
if (playlistUrl.isEmpty) return [];
|
||||||
|
final masterPlaylistRes =
|
||||||
|
await client.get(Uri.parse(playlistUrl), headers: headers);
|
||||||
|
|
||||||
|
if (masterPlaylistRes.statusCode == 200) {
|
||||||
|
for (var it
|
||||||
|
in substringAfter(masterPlaylistRes.body, "#EXT-X-STREAM-INF:")
|
||||||
|
.split("#EXT-X-STREAM-INF:")) {
|
||||||
|
final quality =
|
||||||
|
"${substringBefore(substringBefore(substringAfter(substringAfter(it, "RESOLUTION="), "x"), ","), "\n")}p";
|
||||||
|
|
||||||
|
String videoUrl = substringBefore(substringAfter(it, "\n"), "\n");
|
||||||
|
|
||||||
|
MVideo video = MVideo();
|
||||||
|
video
|
||||||
|
..url = videoUrl
|
||||||
|
..originalUrl = videoUrl
|
||||||
|
..quality = "Vidmoly $quality"
|
||||||
|
..headers = headers;
|
||||||
|
videos.add(video);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return videos;
|
||||||
|
}
|
||||||
|
|
||||||
String getPath() {
|
String getPath() {
|
||||||
if (source.name == "French Anime") return "/animes-vostfr/";
|
if (source.name == "French Anime") return "/animes-vostfr/";
|
||||||
return "/serie-en-streaming/";
|
return "/serie-en-streaming/";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<dynamic> getSourcePreferences() {
|
||||||
|
return [
|
||||||
|
if (source.name == "Wiflix")
|
||||||
|
EditTextPreference(
|
||||||
|
key: "overrideBaseUrl",
|
||||||
|
title: "Changer l'url de base",
|
||||||
|
summary: "",
|
||||||
|
value: "https://wiflix-hd.vip",
|
||||||
|
dialogTitle: "Changer l'url de base",
|
||||||
|
dialogMessage: "",
|
||||||
|
text: "https://wiflix-hd.vip"),
|
||||||
|
if (source.name == "French Anime")
|
||||||
|
EditTextPreference(
|
||||||
|
key: "overrideBaseUrl",
|
||||||
|
title: "Changer l'url de base",
|
||||||
|
summary: "",
|
||||||
|
value: "https://french-anime.com",
|
||||||
|
dialogTitle: "Changer l'url de base",
|
||||||
|
dialogMessage: "",
|
||||||
|
text: "https://french-anime.com"),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<dynamic> getFilterList() {
|
List<dynamic> getFilterList() {
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import '../../../../model/source.dart';
|
|||||||
import 'src/frenchanime/frenchanime.dart';
|
import 'src/frenchanime/frenchanime.dart';
|
||||||
import 'src/wiflix/wiflix.dart';
|
import 'src/wiflix/wiflix.dart';
|
||||||
|
|
||||||
const _datalifeengineVersion = "0.0.45";
|
const _datalifeengineVersion = "0.0.5";
|
||||||
const _datalifeengineSourceCodeUrl =
|
const _datalifeengineSourceCodeUrl =
|
||||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/multisrc/datalifeengine/datalifeengine.dart";
|
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/multisrc/datalifeengine/datalifeengine.dart";
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Source get wiflixSource => _wiflixSource;
|
|||||||
|
|
||||||
Source _wiflixSource = Source(
|
Source _wiflixSource = Source(
|
||||||
name: "Wiflix",
|
name: "Wiflix",
|
||||||
baseUrl: "https://wiflix.bot",
|
baseUrl: "https://wiflix-hd.vip",
|
||||||
lang: "fr",
|
lang: "fr",
|
||||||
typeSource: "datalifeengine",
|
typeSource: "datalifeengine",
|
||||||
isManga: false,
|
isManga: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user