This commit is contained in:
kodjomoustapha
2024-11-26 18:07:12 +01:00
parent f4a5647852
commit 298e53effe
6 changed files with 52 additions and 76 deletions

View File

@@ -1,3 +1,4 @@
import 'dart:convert';
import 'package:mangayomi/bridge_lib.dart'; import 'package:mangayomi/bridge_lib.dart';
class DataLifeEngine extends MProvider { class DataLifeEngine extends MProvider {
@@ -5,7 +6,8 @@ class DataLifeEngine extends MProvider {
MSource source; MSource source;
final Client client = Client(source); final Client client =
Client(source, json.encode({"useDartHttpClient": true}));
@override @override
bool get supportsLatest => false; bool get supportsLatest => false;

View File

@@ -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.55"; const _datalifeengineVersion = "0.0.6";
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";

View File

@@ -168,6 +168,8 @@ class AnimeOnlineNinja extends MProvider {
} }
Future<List<MVideo>> uqloadExtractor(String url, String lang) async { Future<List<MVideo>> uqloadExtractor(String url, String lang) async {
final Client client =
Client(source, json.encode({"useDartHttpClient": true}));
final res = (await client.get(Uri.parse(url))).body; final res = (await client.get(Uri.parse(url))).body;
final js = xpath(res, '//script[contains(text(), "sources:")]/text()'); final js = xpath(res, '//script[contains(text(), "sources:")]/text()');
if (js.isEmpty) { if (js.isEmpty) {

View File

@@ -1,7 +1,7 @@
import '../../../../../model/source.dart'; import '../../../../../model/source.dart';
Source get animeonlineninjaSource => _animeonlineninjaSource; Source get animeonlineninjaSource => _animeonlineninjaSource;
const _animeonlineninjaVersion = "0.0.2"; const _animeonlineninjaVersion = "0.0.3";
const _animeonlineninjaSourceCodeUrl = const _animeonlineninjaSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/es/animeonlineninja/animeonlineninja.dart"; "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/es/animeonlineninja/animeonlineninja.dart";
Source _animeonlineninjaSource = Source( Source _animeonlineninjaSource = Source(

View File

@@ -8,11 +8,13 @@ class OtakuFr extends MProvider {
final Client client = Client(source); final Client client = Client(source);
@override
String get baseUrl => getPreferenceValue(source.id, "overrideBaseUrl");
@override @override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
final res = final res =
(await client.get(Uri.parse("${source.baseUrl}/en-cours/page/$page"))) (await client.get(Uri.parse("$baseUrl/en-cours/page/$page"))).body;
.body;
List<MManga> animeList = []; List<MManga> animeList = [];
final urls = final urls =
xpath(res, '//*[@class="list"]/article/div/div/figure/a/@href'); xpath(res, '//*[@class="list"]/article/div/div/figure/a/@href');
@@ -34,8 +36,7 @@ class OtakuFr extends MProvider {
@override @override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
final res = final res = (await client.get(Uri.parse("$baseUrl/page/$page/"))).body;
(await client.get(Uri.parse("${source.baseUrl}/page/$page/"))).body;
List<MManga> animeList = []; List<MManga> animeList = [];
final urls = xpath(res, '//*[@class="episode"]/div/a/@href'); final urls = xpath(res, '//*[@class="episode"]/div/a/@href');
@@ -77,19 +78,17 @@ class OtakuFr extends MProvider {
final filters = filterList.filters; final filters = filterList.filters;
String url = ""; String url = "";
if (query.isNotEmpty) { if (query.isNotEmpty) {
url = "${source.baseUrl}/toute-la-liste-affiches/page/$page/?q=$query"; url = "$baseUrl/toute-la-liste-affiches/page/$page/?q=$query";
} else { } else {
for (var filter in filters) { for (var filter in filters) {
if (filter.type == "GenreFilter") { if (filter.type == "GenreFilter") {
if (filter.state != 0) { if (filter.state != 0) {
url = url = "$baseUrl/${filter.values[filter.state].value}page/$page";
"${source.baseUrl}/${filter.values[filter.state].value}page/$page";
} }
} else if (filter.type == "SubPageFilter") { } else if (filter.type == "SubPageFilter") {
if (url.isEmpty) { if (url.isEmpty) {
if (filter.state != 0) { if (filter.state != 0) {
url = url = "$baseUrl/${filter.values[filter.state].value}page/$page";
"${source.baseUrl}/${filter.values[filter.state].value}page/$page";
} }
} }
} }
@@ -122,7 +121,9 @@ class OtakuFr extends MProvider {
final statusList = [ final statusList = [
{"En cours": 0, "Terminé": 1} {"En cours": 0, "Terminé": 1}
]; ];
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 originalUrl = xpath(res, final originalUrl = xpath(res,
'//*[@class="breadcrumb"]/li[@class="breadcrumb-item"][2]/a/@href'); '//*[@class="breadcrumb"]/li[@class="breadcrumb-item"][2]/a/@href');
@@ -173,7 +174,9 @@ class OtakuFr extends MProvider {
@override @override
Future<List<MVideo>> getVideoList(String url) async { Future<List<MVideo>> getVideoList(String url) async {
final res = (await client.get(Uri.parse(url))).body; final res =
(await client.get(Uri.parse("$baseUrl${getUrlWithoutDomain(url)}")))
.body;
final servers = parseHtml(res).select("div.tab-content iframe[src]"); final servers = parseHtml(res).select("div.tab-content iframe[src]");
List<MVideo> videos = []; List<MVideo> videos = [];
@@ -189,15 +192,12 @@ class OtakuFr extends MProvider {
if (serverUrl.contains("https://streamwish") && if (serverUrl.contains("https://streamwish") &&
hosterSelection.contains("Streamwish")) { hosterSelection.contains("Streamwish")) {
a = await streamWishExtractor(serverUrl, "StreamWish"); a = await streamWishExtractor(serverUrl, "StreamWish");
} else if (serverUrl.contains("sibnet") &&
hosterSelection.contains("Sibnet")) {
a = await sibnetExtractor(serverUrl);
} else if (serverUrl.contains("https://doo") && } else if (serverUrl.contains("https://doo") &&
hosterSelection.contains("Doodstream")) { hosterSelection.contains("Doodstream")) {
a = await doodExtractor(serverUrl); a = await doodExtractor(serverUrl);
} else if (serverUrl.contains("https://voe.sx") && } else if (containsVidBom(serverUrl) &&
hosterSelection.contains("Voe")) { hosterSelection.contains("VidBom")) {
// a = await voeExtractor(serverUrl, null); a = await vidBomExtractor(serverUrl);
} else if (serverUrl.contains("https://ok.ru") && } else if (serverUrl.contains("https://ok.ru") &&
hosterSelection.contains("Okru")) { hosterSelection.contains("Okru")) {
a = await okruExtractor(serverUrl); a = await okruExtractor(serverUrl);
@@ -207,6 +207,9 @@ class OtakuFr extends MProvider {
} else if (serverUrl.contains("sendvid") && } else if (serverUrl.contains("sendvid") &&
hosterSelection.contains("Sendvid")) { hosterSelection.contains("Sendvid")) {
a = await sendVidExtractorr(serverUrl, ""); a = await sendVidExtractorr(serverUrl, "");
} else if (serverUrl.contains("voe.sx") &&
hosterSelection.contains("Voe")) {
a = await voeExtractor(serverUrl, "");
} }
videos.addAll(a); videos.addAll(a);
} }
@@ -218,6 +221,17 @@ class OtakuFr extends MProvider {
return regExp(url, r"^(?:(?:https?:)?//|www\.)", 'https://', 0, 0); return regExp(url, r"^(?:(?:https?:)?//|www\.)", 'https://', 0, 0);
} }
bool containsVidBom(String url) {
url = url;
final list = ["vidbam", "vadbam", "vidbom", "vidbm"];
for (var n in list) {
if (url.contains(n)) {
return true;
}
}
return false;
}
@override @override
List<dynamic> getFilterList() { List<dynamic> getFilterList() {
return [ return [
@@ -277,6 +291,14 @@ class OtakuFr extends MProvider {
@override @override
List<dynamic> getSourcePreferences() { List<dynamic> getSourcePreferences() {
return [ return [
EditTextPreference(
key: "overrideBaseUrl",
title: "Changer l'url de base",
summary: "",
value: "https://otakufr.cc",
dialogTitle: "Changer l'url de base",
dialogMessage: "",
text: "https://otakufr.cc"),
ListPreference( ListPreference(
key: "preferred_quality", key: "preferred_quality",
title: "Qualité préférée", title: "Qualité préférée",
@@ -285,14 +307,14 @@ class OtakuFr extends MProvider {
entries: ["1080p", "720p", "480p", "360p"], entries: ["1080p", "720p", "480p", "360p"],
entryValues: ["1080", "720", "480", "360"]), entryValues: ["1080", "720", "480", "360"]),
MultiSelectListPreference( MultiSelectListPreference(
key: "hoster_selection", key: "hoster_selection_",
title: "Enable/Disable Hosts", title: "Enable/Disable Hosts",
summary: "", summary: "",
entries: [ entries: [
"Streamwish", "Streamwish",
"Doodstream", "Doodstream",
"Sendvid", "Sendvid",
"Vidbm", "VidBom",
"Okru", "Okru",
"Voe", "Voe",
"Sibnet", "Sibnet",
@@ -302,7 +324,7 @@ class OtakuFr extends MProvider {
"Streamwish", "Streamwish",
"Doodstream", "Doodstream",
"Sendvid", "Sendvid",
"Vidbm", "VidBom",
"Okru", "Okru",
"Voe", "Voe",
"Sibnet", "Sibnet",
@@ -349,7 +371,7 @@ class OtakuFr extends MProvider {
} }
List<String> preferenceHosterSelection(int sourceId) { List<String> preferenceHosterSelection(int sourceId) {
return getPreferenceValue(sourceId, "hoster_selection"); return getPreferenceValue(sourceId, "hoster_selection_");
} }
Future<List<MVideo>> sendVidExtractorr(String url, String prefix) async { Future<List<MVideo>> sendVidExtractorr(String url, String prefix) async {
@@ -436,56 +458,6 @@ class OtakuFr extends MProvider {
} }
return videos; return videos;
} }
Future<List<MVideo>> vidbmExtractor(String url) async {
final res = (await client.get(Uri.parse(url))).body;
final js = xpath(res,
'//script[contains(text(), "m3u8") or contains(text(), "mp4")]/text()');
if (js.isEmpty) {
return [];
}
final masterUrl = substringBefore(substringAfter(js.first, "source"), "\"");
final quality = substringBefore(
substringAfter(
substringBefore(
substringAfter(substringAfter(js.first, "source"), "file"),
"]"),
"label:\""),
"\"");
List<MVideo> videos = [];
if (masterUrl.contains("m3u8")) {
final masterPlaylistRes = (await client.get(Uri.parse(masterUrl))).body;
for (var it in substringAfter(masterPlaylistRes, "#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");
if (!videoUrl.startsWith("http")) {
videoUrl =
"${masterUrl.split("/").sublist(0, masterUrl.split("/").length - 1).join("/")}/$videoUrl";
}
MVideo video = MVideo();
video
..url = videoUrl
..originalUrl = videoUrl
..quality = "Vidbm - $quality";
videos.add(video);
}
return videos;
} else {
MVideo video = MVideo();
video
..url = masterUrl
..originalUrl = masterUrl
..quality = "Vidbm - $quality";
videos.add(video);
}
return videos;
}
} }
OtakuFr main(MSource source) { OtakuFr main(MSource source) {

View File

@@ -1,12 +1,12 @@
import '../../../../../model/source.dart'; import '../../../../../model/source.dart';
Source get otakufr => _otakufr; Source get otakufr => _otakufr;
const otakufrVersion = "0.0.9"; const otakufrVersion = "0.0.95";
const otakufrCodeUrl = const otakufrCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/fr/otakufr/otakufr.dart"; "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/fr/otakufr/otakufr.dart";
Source _otakufr = Source( Source _otakufr = Source(
name: "OtakuFr", name: "OtakuFr",
baseUrl: "https://otakufr.co", baseUrl: "https://otakufr.cc",
lang: "fr", lang: "fr",
typeSource: "single", typeSource: "single",
iconUrl: iconUrl: