mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 10:51:17 +00:00
AnimesUltra: change baseUrl & fix server
This commit is contained in:
@@ -8,9 +8,12 @@ class AnimesUltra extends MProvider {
|
|||||||
|
|
||||||
final Client client = Client(source);
|
final Client client = Client(source);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get baseUrl => source.baseUrl;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<MPages> getPopular(int page) async {
|
Future<MPages> getPopular(int page) async {
|
||||||
final res = (await client.get(Uri.parse(source.baseUrl))).body;
|
final res = (await client.get(Uri.parse(baseUrl))).body;
|
||||||
|
|
||||||
List<MManga> animeList = [];
|
List<MManga> animeList = [];
|
||||||
final urls = xpath(res,
|
final urls = xpath(res,
|
||||||
@@ -33,7 +36,7 @@ class AnimesUltra extends MProvider {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<MPages> getLatestUpdates(int page) async {
|
Future<MPages> getLatestUpdates(int page) async {
|
||||||
final res = (await client.get(Uri.parse(source.baseUrl))).body;
|
final res = (await client.get(Uri.parse(baseUrl))).body;
|
||||||
|
|
||||||
List<MManga> animeList = [];
|
List<MManga> animeList = [];
|
||||||
final urls = xpath(res,
|
final urls = xpath(res,
|
||||||
@@ -56,7 +59,7 @@ class AnimesUltra 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 res = (await client.get(Uri.parse(source.baseUrl))).body;
|
final res = (await client.get(Uri.parse(baseUrl))).body;
|
||||||
|
|
||||||
List<MManga> animeList = [];
|
List<MManga> animeList = [];
|
||||||
final urls = xpath(res, '//*[@class="film-poster"]/a/@href');
|
final urls = xpath(res, '//*[@class="film-poster"]/a/@href');
|
||||||
@@ -81,7 +84,8 @@ class AnimesUltra extends MProvider {
|
|||||||
];
|
];
|
||||||
|
|
||||||
final res = (await client.get(Uri.parse(url))).body;
|
final res = (await client.get(Uri.parse(url))).body;
|
||||||
MManga anime = MManga();
|
var anime = MManga();
|
||||||
|
final doc = parseHtml(res);
|
||||||
anime.description =
|
anime.description =
|
||||||
xpath(res, '//*[@class="film-description m-hide"]/text()').first;
|
xpath(res, '//*[@class="film-description m-hide"]/text()').first;
|
||||||
|
|
||||||
@@ -91,66 +95,115 @@ class AnimesUltra extends MProvider {
|
|||||||
anime.status = parseStatus(status, statusList);
|
anime.status = parseStatus(status, statusList);
|
||||||
anime.genre = xpath(res,
|
anime.genre = xpath(res,
|
||||||
'//*[@class="item item-list" and contains(text(),"Genres:")]/a/text()');
|
'//*[@class="item item-list" and contains(text(),"Genres:")]/a/text()');
|
||||||
anime.author = xpath(res,
|
anime.author = doc.xpathFirst(
|
||||||
'//*[@class="item item-title" and contains(text(),"Studio:")]/span[2]/text()')
|
'//*[@class="item item-title" and contains(text(),"Studio:")]/span[2]/text()');
|
||||||
.first;
|
final episodesLength = int.parse(substringBefore(
|
||||||
final urlEp = url.replaceAll('.html', '/episode-1.html');
|
doc.xpathFirst('//*[@class="film-stats"]/span[7]/text()'), "/")
|
||||||
final resEpWebview =
|
.replaceAll("Ep", ""));
|
||||||
await getHtmlViaWebview(urlEp, '//*[@class="ss-list"]/a/@href');
|
|
||||||
final epUrls =
|
|
||||||
xpath(resEpWebview, '//*[@class="ss-list"]/a/@href').reversed.toList();
|
|
||||||
final names = xpath(resEpWebview,
|
|
||||||
'//*[@class="ss-list"]/a/div[@class="ssli-detail"]/div/text()')
|
|
||||||
.reversed
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
List<MChapter>? episodesList = [];
|
List<MChapter>? episodesList = [];
|
||||||
for (var i = 0; i < names.length; i++) {
|
|
||||||
MChapter episode = MChapter();
|
for (var i = 0; i < episodesLength; i++) {
|
||||||
episode.name = names[i];
|
var episode = MChapter();
|
||||||
episode.url = epUrls[i];
|
episode.name = "Episode ${i + 1}";
|
||||||
|
episode.url = url.replaceAll('.html', '/episode-${i + 1}.html');
|
||||||
episodesList.add(episode);
|
episodesList.add(episode);
|
||||||
}
|
}
|
||||||
|
anime.chapters = episodesList.reversed.toList();
|
||||||
anime.chapters = episodesList;
|
|
||||||
return anime;
|
return anime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<MVideo>> getVideoList(String url) async {
|
Future<List<MVideo>> getVideoList(String url) async {
|
||||||
final resWebview = await getHtmlViaWebview(
|
final resHtml = (await client.get(Uri.parse(url))).body;
|
||||||
url, '//*[@class="ps__-list"]/div/@data-server-id');
|
final id = url.split('/')[4].split('-')[0];
|
||||||
|
final resServer = (await client
|
||||||
|
.get(Uri.parse("$baseUrl/engine/ajax/full-story.php?newsId=$id")))
|
||||||
|
.body;
|
||||||
|
|
||||||
final serverIds =
|
final serverIds =
|
||||||
xpath(resWebview, '//*[@class="ps__-list"]/div/@data-server-id');
|
xpath(resHtml, '//*[@class="ps__-list"]/div/@data-server-id');
|
||||||
final serverNames =
|
final serverNames = xpath(resHtml, '//*[@class="ps__-list"]/div/a/text()');
|
||||||
xpath(resWebview, '//*[@class="ps__-list"]/div/a/text()');
|
|
||||||
List<String> serverUrls = [];
|
List<String> serverUrls = [];
|
||||||
for (var id in serverIds) {
|
for (var id in serverIds) {
|
||||||
final serversUrls =
|
final serversUrls = xpath(jsonDecode(resServer)["html"],
|
||||||
xpath(resWebview, '//*[@id="content_player_${id}"]/text()').first;
|
'//*[@id="content_player_${id}"]/text()')
|
||||||
|
.first;
|
||||||
serverUrls.add(serversUrls);
|
serverUrls.add(serversUrls);
|
||||||
}
|
}
|
||||||
List<MVideo> videos = [];
|
List<MVideo> videos = [];
|
||||||
for (var i = 0; i < serverNames.length; i++) {
|
for (var i = 0; i < serverNames.length; i++) {
|
||||||
final name = serverNames[i];
|
final name = serverNames[i];
|
||||||
final url = serverUrls[i];
|
final url = serverUrls[i];
|
||||||
|
|
||||||
List<MVideo> a = [];
|
List<MVideo> a = [];
|
||||||
if (name.contains("Sendvid")) {
|
if (name.contains("Sendvid")) {
|
||||||
a = await sendVidExtractor(url.replaceAll("https:////", "https://"),
|
a = await sendVidExtractorr(
|
||||||
json.encode({"Referer": "${source.baseUrl}/"}), "");
|
url.replaceAll("https:////", "https://"), "");
|
||||||
} else if (name.contains("Sibnet")) {
|
} else if (name.contains("Sibnet")) {
|
||||||
a = await sibnetExtractor(
|
a = await sibnetExtractor(
|
||||||
"https://video.sibnet.ru/shell.php?videoid=$url");
|
"https://video.sibnet.ru/shell.php?videoid=$url");
|
||||||
} else if (name.contains("Mytv")) {
|
} else if (name.contains("Mytv")) {
|
||||||
a = await myTvExtractor("https://www.myvi.tv/embed/$url");
|
a = await myTvExtractor("https://www.myvi.tv/embed/$url");
|
||||||
|
} else if (name.contains("Fmoon")) {
|
||||||
|
a = await filemoonExtractor(url, "", "");
|
||||||
}
|
}
|
||||||
videos.addAll(a);
|
videos.addAll(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
return videos;
|
return videos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<MVideo>> sendVidExtractorr(String url, String prefix) async {
|
||||||
|
final res = (await client.get(Uri.parse(url))).body;
|
||||||
|
final document = parseHtml(res);
|
||||||
|
final masterUrl = document.selectFirst("source#video_source")?.attr("src");
|
||||||
|
if (masterUrl == null) return [];
|
||||||
|
final masterHeaders = {
|
||||||
|
"Accept": "*/*",
|
||||||
|
"Host": Uri.parse(masterUrl).host,
|
||||||
|
"Origin": "https://${Uri.parse(url).host}",
|
||||||
|
"Referer": "https://${Uri.parse(url).host}/",
|
||||||
|
};
|
||||||
|
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";
|
||||||
|
}
|
||||||
|
final videoHeaders = {
|
||||||
|
"Accept": "*/*",
|
||||||
|
"Host": Uri.parse(videoUrl).host,
|
||||||
|
"Origin": "https://${Uri.parse(url).host}",
|
||||||
|
"Referer": "https://${Uri.parse(url).host}/",
|
||||||
|
};
|
||||||
|
var video = MVideo();
|
||||||
|
video
|
||||||
|
..url = videoUrl
|
||||||
|
..originalUrl = videoUrl
|
||||||
|
..quality = prefix + "Sendvid:$quality"
|
||||||
|
..headers = videoHeaders;
|
||||||
|
videos.add(video);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var video = MVideo();
|
||||||
|
video
|
||||||
|
..url = masterUrl
|
||||||
|
..originalUrl = masterUrl
|
||||||
|
..quality = prefix + "Sendvid:default"
|
||||||
|
..headers = masterHeaders;
|
||||||
|
videos.add(video);
|
||||||
|
}
|
||||||
|
|
||||||
|
return videos;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AnimesUltra main(MSource source) {
|
AnimesUltra main(MSource source) {
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import '../../../../../model/source.dart';
|
import '../../../../../model/source.dart';
|
||||||
|
|
||||||
Source get animesultraSource => _animesultraSource;
|
Source get animesultraSource => _animesultraSource;
|
||||||
const _animesultraVersion = "0.0.65";
|
const _animesultraVersion = "0.0.7";
|
||||||
const _animesultraSourceCodeUrl =
|
const _animesultraSourceCodeUrl =
|
||||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/fr/animesultra/animesultra.dart";
|
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/anime/src/fr/animesultra/animesultra.dart";
|
||||||
Source _animesultraSource = Source(
|
Source _animesultraSource = Source(
|
||||||
name: "AnimesUltra",
|
name: "AnimesUltra",
|
||||||
baseUrl: "https://ww.animesultra.net",
|
baseUrl: "https://w2.animesultra.net",
|
||||||
lang: "fr",
|
lang: "fr",
|
||||||
typeSource: "single",
|
typeSource: "single",
|
||||||
iconUrl:
|
iconUrl:
|
||||||
|
|||||||
Reference in New Issue
Block a user