Refactor #28
79 changed files with 2266 additions and 581 deletions
|
|
@ -33,7 +33,7 @@ and you will see this :
|
|||
import 'package:mangayomi/models/source.dart';
|
||||
|
||||
//For testing purposes, set to true
|
||||
const useTestSourceCode = false;
|
||||
const useTestSourceCode = true;
|
||||
|
||||
final testSourceModelList = [
|
||||
Source(
|
||||
|
|
@ -51,60 +51,62 @@ final testSourceModelList = [
|
|||
|
||||
const testSourceCode = r'''
|
||||
import 'package:mangayomi/bridge_lib.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
class TestSource extends MProvider {
|
||||
TestSource();
|
||||
TestSource({required this.source});
|
||||
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
bool get supportsLatest => true;
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
// For anime episode video list
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
// For manga chapter pages
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) {
|
||||
Future<List<String>> getPageList(String url) {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
// TODO: implement
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
// TODO: implement
|
||||
}
|
||||
}
|
||||
|
||||
TestSource main() {
|
||||
return TestSource();
|
||||
TestSource main(MSource source) {
|
||||
return TestSource(source:source);
|
||||
}
|
||||
|
||||
''';
|
||||
|
|
@ -238,7 +240,7 @@ Return Response
|
|||
```bash
|
||||
- Simple request
|
||||
|
||||
final client = Client();
|
||||
final Client client = Client();
|
||||
|
||||
final res = await client.get(Uri.parse("http://example.com"));
|
||||
|
||||
|
|
@ -246,7 +248,7 @@ print(res.body);
|
|||
|
||||
- With headers
|
||||
|
||||
final client = Client();
|
||||
final Client client = Client();
|
||||
|
||||
final res = await client.get(Uri.parse("http://example.com"),headers:{"Referer": "http://example.com"});
|
||||
|
||||
|
|
@ -254,7 +256,7 @@ print(res.body);
|
|||
|
||||
- With body
|
||||
|
||||
final client = Client();
|
||||
final Client client = Client();
|
||||
|
||||
final res = await client.post(Uri.parse("http://example.com"),headers:{"Referer": "http://example.com"},'body':{'name':'test'});
|
||||
|
||||
|
|
|
|||
|
|
@ -2,29 +2,30 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class DataLifeEngine extends MProvider {
|
||||
DataLifeEngine();
|
||||
DataLifeEngine({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
bool get supportsLatest => false;
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}${getPath(source)}page/$page")))
|
||||
.body;
|
||||
return animeFromElement(res, source.baseUrl);
|
||||
return animeFromElement(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
return MPages([], false);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
final baseUrl = source.baseUrl;
|
||||
String res = "";
|
||||
|
|
@ -65,11 +66,11 @@ class DataLifeEngine extends MProvider {
|
|||
res = (await client.get(Uri.parse(url))).body;
|
||||
}
|
||||
|
||||
return animeFromElement(res, baseUrl);
|
||||
return animeFromElement(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
String res = (await client.get(Uri.parse(url))).body;
|
||||
MManga anime = MManga();
|
||||
final description = xpath(res, '//span[@itemprop="description"]/text()');
|
||||
|
|
@ -116,7 +117,7 @@ class DataLifeEngine extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
List<MVideo> videos = [];
|
||||
final sUrls = url.split(',');
|
||||
for (var sUrl in sUrls) {
|
||||
|
|
@ -143,7 +144,7 @@ class DataLifeEngine extends MProvider {
|
|||
return videos;
|
||||
}
|
||||
|
||||
MPages animeFromElement(String res, String baseUrl) {
|
||||
MPages animeFromElement(String res) {
|
||||
final htmls = parseHtml(res).select("div#dle-content > div.mov");
|
||||
List<MManga> animeList = [];
|
||||
for (var h in htmls) {
|
||||
|
|
@ -155,7 +156,7 @@ class DataLifeEngine extends MProvider {
|
|||
MManga anime = MManga();
|
||||
anime.name =
|
||||
"$name ${season.isNotEmpty ? season.first.replaceAll("\n", " ") : ""}";
|
||||
anime.imageUrl = "$baseUrl$image";
|
||||
anime.imageUrl = "${source.baseUrl}$image";
|
||||
anime.link = url;
|
||||
animeList.add(anime);
|
||||
}
|
||||
|
|
@ -245,13 +246,13 @@ class DataLifeEngine extends MProvider {
|
|||
return [video];
|
||||
}
|
||||
|
||||
String getPath(MSource source) {
|
||||
String getPath() {
|
||||
if (source.name == "French Anime") return "/animes-vostfr/";
|
||||
return "/serie-en-streaming/";
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("La recherche de texte ignore les filtres"),
|
||||
if (source.name == "French Anime")
|
||||
|
|
@ -326,6 +327,6 @@ class DataLifeEngine extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
DataLifeEngine main() {
|
||||
return DataLifeEngine();
|
||||
DataLifeEngine main(MSource source) {
|
||||
return DataLifeEngine(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import '../../../model/source.dart';
|
|||
import 'src/frenchanime/frenchanime.dart';
|
||||
import 'src/wiflix/wiflix.dart';
|
||||
|
||||
const _datalifeengineVersion = "0.0.25";
|
||||
const _datalifeengineVersion = "0.0.3";
|
||||
const _datalifeengineSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/datalifeengine/datalifeengine.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,23 +2,26 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class DopeFlix extends MProvider {
|
||||
DopeFlix();
|
||||
DopeFlix({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
String get baseUrl => getPreferenceValue(source.id, "preferred_domain");
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/${getPreferenceValue(source.id, "preferred_popular_page")}?page=$page")))
|
||||
"$baseUrl/${getPreferenceValue(source.id, "preferred_popular_page")}?page=$page")))
|
||||
.body;
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}/home")))
|
||||
.body;
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse("$baseUrl/home"))).body;
|
||||
List<MManga> animeList = [];
|
||||
final path =
|
||||
'//section[contains(text(),"${getPreferenceValue(source.id, "preferred_latest_page")}")]/div/div[@class="film_list-wrap"]/div[@class="flw-item"]/div[@class="film-poster"]';
|
||||
|
|
@ -37,10 +40,9 @@ class DopeFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "${preferenceBaseUrl(source.id)}";
|
||||
String url = "$baseUrl";
|
||||
|
||||
if (query.isNotEmpty) {
|
||||
url += "/search/${query.replaceAll(" ", "-")}?page=$page";
|
||||
|
|
@ -81,11 +83,9 @@ class DopeFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
MManga anime = MManga();
|
||||
final description = xpath(res, '//div[@class="description"]/text()');
|
||||
if (description.isNotEmpty) {
|
||||
|
|
@ -103,12 +103,11 @@ class DopeFlix extends MProvider {
|
|||
if (dataType == "1") {
|
||||
MChapter episode = MChapter();
|
||||
episode.name = "Movie";
|
||||
episode.url = "${preferenceBaseUrl(source.id)}/ajax/movie/episodes/$id";
|
||||
episode.url = "$baseUrl/ajax/movie/episodes/$id";
|
||||
episodesList.add(episode);
|
||||
} else {
|
||||
final resS = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/ajax/v2/tv/seasons/$id")))
|
||||
.body;
|
||||
final resS =
|
||||
(await client.get(Uri.parse("$baseUrl/ajax/v2/tv/seasons/$id"))).body;
|
||||
|
||||
final seasonIds =
|
||||
xpath(resS, '//a[@class="dropdown-item ss-item"]/@data-id');
|
||||
|
|
@ -118,8 +117,8 @@ class DopeFlix extends MProvider {
|
|||
final seasonId = seasonIds[i];
|
||||
final seasonName = seasonNames[i];
|
||||
|
||||
final html = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/ajax/v2/season/episodes/$seasonId")))
|
||||
final html = (await client
|
||||
.get(Uri.parse("$baseUrl/ajax/v2/season/episodes/$seasonId")))
|
||||
.body;
|
||||
|
||||
final epsHtmls = parseHtml(html).select("div.eps-item");
|
||||
|
|
@ -134,8 +133,7 @@ class DopeFlix extends MProvider {
|
|||
final epName = xpath(epHtml, '//h3[@class="film-name"]/text()').first;
|
||||
MChapter episode = MChapter();
|
||||
episode.name = "$seasonName $epNum $epName";
|
||||
episode.url =
|
||||
"${preferenceBaseUrl(source.id)}/ajax/v2/episode/servers/$episodeId";
|
||||
episode.url = "$baseUrl/ajax/v2/episode/servers/$episodeId";
|
||||
episodesList.add(episode);
|
||||
}
|
||||
}
|
||||
|
|
@ -145,11 +143,9 @@ class DopeFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}/$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl/$url"))).body;
|
||||
|
||||
final vidsHtmls = parseHtml(res).select("ul.fss-list a.btn-play");
|
||||
|
||||
|
|
@ -158,9 +154,8 @@ class DopeFlix extends MProvider {
|
|||
final vidHtml = vidH.outerHtml;
|
||||
final id = xpath(vidHtml, '//a/@data-id').first;
|
||||
final name = xpath(vidHtml, '//span/text()').first;
|
||||
final resSource = (await client.get(
|
||||
Uri.parse("${preferenceBaseUrl(source.id)}/ajax/sources/$id")))
|
||||
.body;
|
||||
final resSource =
|
||||
(await client.get(Uri.parse("$baseUrl/ajax/sources/$id"))).body;
|
||||
|
||||
final vidUrl =
|
||||
substringBefore(substringAfter(resSource, "\"link\":\""), "\"");
|
||||
|
|
@ -317,7 +312,7 @@ class DopeFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("TypeFilter", "Type", 0, [
|
||||
SelectFilterOption("All", "all"),
|
||||
|
|
@ -413,7 +408,7 @@ class DopeFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
if (source.name == "DopeBox")
|
||||
ListPreference(
|
||||
|
|
@ -530,10 +525,6 @@ class DopeFlix extends MProvider {
|
|||
return subs;
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "preferred_domain");
|
||||
}
|
||||
|
||||
String ll(String url) {
|
||||
if (url.contains("?")) {
|
||||
return "&";
|
||||
|
|
@ -542,6 +533,6 @@ class DopeFlix extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
DopeFlix main() {
|
||||
return DopeFlix();
|
||||
DopeFlix main(MSource source) {
|
||||
return DopeFlix(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import '../../../model/source.dart';
|
|||
import 'src/dopebox/dopebox.dart';
|
||||
import 'src/sflix/sflix.dart';
|
||||
|
||||
const _dopeflixVersion = "0.0.35";
|
||||
const _dopeflixVersion = "0.0.4";
|
||||
const _dopeflixSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/dopeflix/dopeflix.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import '../../../model/source.dart';
|
|||
import 'src/aniwatch/aniwatch.dart';
|
||||
import 'src/kaido/kaido.dart';
|
||||
|
||||
const _zorothemeVersion = "0.0.75";
|
||||
const _zorothemeVersion = "0.0.8";
|
||||
const _zorothemeSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/zorotheme/zorotheme.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class ZoroTheme extends MProvider {
|
||||
ZoroTheme();
|
||||
ZoroTheme({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/most-popular?page=$page")))
|
||||
.body;
|
||||
|
|
@ -16,7 +18,7 @@ class ZoroTheme extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/recently-updated?page=$page")))
|
||||
.body;
|
||||
|
|
@ -25,8 +27,7 @@ class ZoroTheme extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "${source.baseUrl}/";
|
||||
|
||||
|
|
@ -119,7 +120,7 @@ class ZoroTheme extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Currently Airing": 0, "Finished Airing": 1}
|
||||
];
|
||||
|
|
@ -170,7 +171,7 @@ class ZoroTheme extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final id = substringAfterLast(url, '?ep=');
|
||||
|
||||
final res = (await client.get(
|
||||
|
|
@ -384,7 +385,7 @@ class ZoroTheme extends MProvider {
|
|||
];
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("TypeFilter", "Type", 0, [
|
||||
SelectFilterOption("All", ""),
|
||||
|
|
@ -518,7 +519,7 @@ class ZoroTheme extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -606,6 +607,6 @@ class ZoroTheme extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
ZoroTheme main() {
|
||||
return ZoroTheme();
|
||||
ZoroTheme main(MSource source) {
|
||||
return ZoroTheme(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,10 @@ import 'multisrc/dopeflix/sources.dart';
|
|||
import 'multisrc/zorotheme/sources.dart';
|
||||
import 'src/all/animeworldindia/sources.dart';
|
||||
import 'src/all/nyaa/source.dart';
|
||||
import 'src/all/yomiroll/source.dart';
|
||||
import 'src/ar/okanime/source.dart';
|
||||
import 'src/de/aniflix/source.dart';
|
||||
import 'src/en/animepahe/source.dart';
|
||||
import 'src/en/aniwave/source.dart';
|
||||
import 'src/en/dramacool/source.dart';
|
||||
import 'src/en/gogoanime/source.dart';
|
||||
|
|
@ -50,7 +52,9 @@ void main() {
|
|||
nineanimetv,
|
||||
aniflix,
|
||||
...animeworldindiaSourcesList,
|
||||
nyaaSource
|
||||
nyaaSource,
|
||||
yomirollSource,
|
||||
animepaheSource
|
||||
];
|
||||
final List<Map<String, dynamic>> jsonList =
|
||||
_sourcesList.map((source) => source.toJson()).toList();
|
||||
|
|
|
|||
|
|
@ -2,31 +2,32 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class AnimeWorldIndia extends MProvider {
|
||||
AnimeWorldIndia();
|
||||
AnimeWorldIndia({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/advanced-search/page/$page/?s_lang=${source.lang}&s_orderby=viewed")))
|
||||
.body;
|
||||
|
||||
return parseAnimeList(res, source.baseUrl);
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/advanced-search/page/$page/?s_lang=${source.lang}&s_orderby=update")))
|
||||
.body;
|
||||
|
||||
return parseAnimeList(res, source.baseUrl);
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url =
|
||||
"${source.baseUrl}/advanced-search/page/$page/?s_keyword=$query&s_lang=${source.lang}";
|
||||
|
|
@ -64,11 +65,11 @@ class AnimeWorldIndia extends MProvider {
|
|||
}
|
||||
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
return parseAnimeList(res, source.baseUrl);
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
MManga anime = MManga();
|
||||
final document = parseHtml(res);
|
||||
|
|
@ -143,7 +144,7 @@ class AnimeWorldIndia extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}$url"))).body;
|
||||
var resJson = substringBefore(
|
||||
substringAfterLast(res, "\"players\":"), ",\"noplayer\":");
|
||||
|
|
@ -168,7 +169,7 @@ class AnimeWorldIndia extends MProvider {
|
|||
return sortVideos(videos, source.id);
|
||||
}
|
||||
|
||||
MPages parseAnimeList(String res, String baseUrl) {
|
||||
MPages parseAnimeList(String res) {
|
||||
List<MManga> animeList = [];
|
||||
final document = parseHtml(res);
|
||||
|
||||
|
|
@ -178,7 +179,7 @@ class AnimeWorldIndia extends MProvider {
|
|||
element.selectFirst("div.font-medium.line-clamp-2.mb-3").text;
|
||||
anime.link = element.selectFirst("a").getHref;
|
||||
anime.imageUrl =
|
||||
"$baseUrl${getUrlWithoutDomain(element.selectFirst("img").getSrc)}";
|
||||
"${source.baseUrl}${getUrlWithoutDomain(element.selectFirst("img").getSrc)}";
|
||||
animeList.add(anime);
|
||||
}
|
||||
final hasNextPage = xpath(res,
|
||||
|
|
@ -244,7 +245,7 @@ class AnimeWorldIndia extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("TypeFilter", "Type", 0, [
|
||||
SelectFilterOption("Any", "all"),
|
||||
|
|
@ -343,7 +344,7 @@ class AnimeWorldIndia extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -389,6 +390,6 @@ class AnimeWorldIndia extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
AnimeWorldIndia main() {
|
||||
return AnimeWorldIndia();
|
||||
AnimeWorldIndia main(MSource source) {
|
||||
return AnimeWorldIndia(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
const _animeworldindiaVersion = "0.0.15";
|
||||
const _animeworldindiaVersion = "0.0.2";
|
||||
const _animeworldindiaSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/all/animeworldindia/animeworldindia.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,29 +1,30 @@
|
|||
import 'package:mangayomi/bridge_lib.dart';
|
||||
|
||||
class Nyaa extends MProvider {
|
||||
Nyaa();
|
||||
Nyaa({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/?f=0&c=${getPreferenceValue(source.id, "preferred_categorie_page")}&q=&s=downloads&o=desc&p=$page")))
|
||||
.body;
|
||||
return parseAnimeList(res, source.baseUrl);
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/?f=0&c=${getPreferenceValue(source.id, "preferred_categorie_page")}&q=$page")))
|
||||
.body;
|
||||
return parseAnimeList(res, source.baseUrl);
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
url =
|
||||
|
|
@ -36,11 +37,11 @@ class Nyaa extends MProvider {
|
|||
}
|
||||
}
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
return parseAnimeList(res, source.baseUrl);
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
MManga anime = MManga();
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
final document = parseHtml(res);
|
||||
|
|
@ -59,7 +60,7 @@ class Nyaa extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SortFilter("SortFilter", "Sort by", SortState(0, true), [
|
||||
SelectFilterOption("None", ""),
|
||||
|
|
@ -73,7 +74,7 @@ class Nyaa extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_categorie_page",
|
||||
|
|
@ -85,7 +86,7 @@ class Nyaa extends MProvider {
|
|||
];
|
||||
}
|
||||
|
||||
MPages parseAnimeList(String res, String baseUrl) {
|
||||
MPages parseAnimeList(String res) {
|
||||
List<MManga> animeList = [];
|
||||
final document = parseHtml(res);
|
||||
|
||||
|
|
@ -94,7 +95,7 @@ class Nyaa extends MProvider {
|
|||
for (var value in values) {
|
||||
MManga anime = MManga();
|
||||
anime.imageUrl =
|
||||
"$baseUrl${getUrlWithoutDomain(value.selectFirst("td:nth-child(1) > a > img").getSrc)}";
|
||||
"${source.baseUrl}${getUrlWithoutDomain(value.selectFirst("td:nth-child(1) > a > img").getSrc)}";
|
||||
MElement firstElement = value
|
||||
.select("td > a")
|
||||
.where((MElement e) =>
|
||||
|
|
@ -102,7 +103,8 @@ class Nyaa extends MProvider {
|
|||
!e.outerHtml.contains("#comments"))
|
||||
.toList()
|
||||
.first;
|
||||
anime.link = "$baseUrl${getUrlWithoutDomain(firstElement.getHref)}";
|
||||
anime.link =
|
||||
"${source.baseUrl}${getUrlWithoutDomain(firstElement.getHref)}";
|
||||
anime.name = firstElement.attr("title");
|
||||
animeList.add(anime);
|
||||
}
|
||||
|
|
@ -121,6 +123,6 @@ class Nyaa extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
Nyaa main() {
|
||||
return Nyaa();
|
||||
Nyaa main(MSource source) {
|
||||
return Nyaa(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
const _nyaaVersion = "0.0.1";
|
||||
const _nyaaVersion = "0.0.15";
|
||||
const _nyaaSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/all/nyaa/nyaa.dart";
|
||||
|
||||
|
|
@ -16,5 +16,4 @@ Source _nyaaSource = Source(
|
|||
iconUrl: _iconUrl,
|
||||
version: _nyaaVersion,
|
||||
isManga: false,
|
||||
appMinVerReq: "0.1.65",
|
||||
sourceCodeUrl: _nyaaSourceCodeUrl);
|
||||
|
|
|
|||
BIN
anime/src/all/yomiroll/icon.png
Normal file
BIN
anime/src/all/yomiroll/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.7 KiB |
19
anime/src/all/yomiroll/source.dart
Normal file
19
anime/src/all/yomiroll/source.dart
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
const _yomirollVersion = "0.0.1";
|
||||
const _yomirollSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/all/yomiroll/yomiroll.dart";
|
||||
|
||||
String _iconUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/all/yomiroll/icon.png";
|
||||
|
||||
Source get yomirollSource => _yomirollSource;
|
||||
Source _yomirollSource = Source(
|
||||
name: 'Yomiroll',
|
||||
baseUrl: "https://crunchyroll.com",
|
||||
lang: "all",
|
||||
typeSource: "multiple",
|
||||
iconUrl: _iconUrl,
|
||||
version: _yomirollVersion,
|
||||
isManga: false,
|
||||
sourceCodeUrl: _yomirollSourceCodeUrl);
|
||||
1153
anime/src/all/yomiroll/yomiroll.dart
Normal file
1153
anime/src/all/yomiroll/yomiroll.dart
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class OkAnime extends MProvider {
|
||||
OkAnime();
|
||||
OkAnime({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(source.baseUrl))).body;
|
||||
List<MManga> animeList = [];
|
||||
String path =
|
||||
|
|
@ -27,7 +29,7 @@ class OkAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/espisode-list?page=$page")))
|
||||
.body;
|
||||
|
|
@ -50,8 +52,7 @@ class OkAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
String url = "${source.baseUrl}/search/?s=$query";
|
||||
if (page > 1) {
|
||||
url += "&page=$page";
|
||||
|
|
@ -78,7 +79,7 @@ class OkAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"يعرض الان": 0, "مكتمل": 1}
|
||||
];
|
||||
|
|
@ -114,7 +115,7 @@ class OkAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
final urls = xpath(res, '//*[@id="streamlinks"]/a/@data-src');
|
||||
final qualities = xpath(res, '//*[@id="streamlinks"]/a/span/text()');
|
||||
|
|
@ -143,7 +144,7 @@ class OkAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -217,6 +218,6 @@ class OkAnime extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
OkAnime main() {
|
||||
return OkAnime();
|
||||
OkAnime main(MSource source) {
|
||||
return OkAnime(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get okanimeSource => _okanimeSource;
|
||||
const _okanimeVersion = "0.0.45";
|
||||
const _okanimeVersion = "0.0.5";
|
||||
const _okanimeSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/ar/okanime/okanime.dart";
|
||||
Source _okanimeSource = Source(
|
||||
|
|
|
|||
|
|
@ -2,23 +2,25 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class AniFlix extends MProvider {
|
||||
AniFlix();
|
||||
AniFlix({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/api/show/new/${page - 1}"),
|
||||
headers: headers))
|
||||
.body;
|
||||
|
||||
return parseAnimeList(res, source.baseUrl, true);
|
||||
return parseAnimeList(res, true);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/api/show/airing/${page - 1}"),
|
||||
|
|
@ -50,17 +52,16 @@ class AniFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final res = await client.post(
|
||||
Uri.parse("${source.baseUrl}/api/show/search"),
|
||||
headers: {'Referer': source.baseUrl},
|
||||
body: {"search": query});
|
||||
return parseAnimeList(res.body, source.baseUrl, false);
|
||||
return parseAnimeList(res.body, false);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}$url"))).body;
|
||||
MManga anime = MManga();
|
||||
final jsonRes = json.decode(res);
|
||||
|
|
@ -117,7 +118,7 @@ class AniFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}$url"),
|
||||
headers: getHeader(source.baseUrl)))
|
||||
.body;
|
||||
|
|
@ -147,15 +148,17 @@ class AniFlix extends MProvider {
|
|||
return sortVideos(videos, source.id);
|
||||
}
|
||||
|
||||
MPages parseAnimeList(String res, String baseUrl, bool hasNextPage) {
|
||||
MPages parseAnimeList(String res, bool hasNextPage) {
|
||||
final datas = json.decode(res);
|
||||
List<MManga> animeList = [];
|
||||
|
||||
for (var data in datas) {
|
||||
MManga anime = MManga();
|
||||
anime.name = data["name"];
|
||||
anime.imageUrl = "$baseUrl/storage/" + (data["cover_portrait"] ?? "");
|
||||
anime.link = getUrlWithoutDomain("$baseUrl/api/show/${data['url']}");
|
||||
anime.imageUrl =
|
||||
"${source.baseUrl}/storage/" + (data["cover_portrait"] ?? "");
|
||||
anime.link =
|
||||
getUrlWithoutDomain("${source.baseUrl}/api/show/${data['url']}");
|
||||
anime.description = data["description"];
|
||||
if (data["airing"] == 0) {
|
||||
anime.status = MStatus.completed;
|
||||
|
|
@ -191,7 +194,7 @@ class AniFlix extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_hoster",
|
||||
|
|
@ -232,6 +235,6 @@ Map<String, String> getHeader(String url) {
|
|||
return {'Referer': url};
|
||||
}
|
||||
|
||||
AniFlix main() {
|
||||
return AniFlix();
|
||||
AniFlix main(MSource source) {
|
||||
return AniFlix(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get aniflix => _aniflix;
|
||||
const _aniflixVersion = "0.0.2";
|
||||
const _aniflixVersion = "0.0.25";
|
||||
const _aniflixCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/de/aniflix/aniflix.dart";
|
||||
Source _aniflix = Source(
|
||||
|
|
|
|||
223
anime/src/en/animepahe/animepahe.dart
Normal file
223
anime/src/en/animepahe/animepahe.dart
Normal file
|
|
@ -0,0 +1,223 @@
|
|||
import 'package:mangayomi/bridge_lib.dart';
|
||||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
|
||||
class AnimePahe extends MProvider {
|
||||
AnimePahe(this.source);
|
||||
|
||||
final MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
String get baseUrl => getPreferenceValue(source.id, "preferred_domain");
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
return await getLatestUpdates(page);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/api?m=airing&page=$page"))).body;
|
||||
final jsonResult = json.decode(res);
|
||||
final hasNextPage = jsonResult["current_page"] < jsonResult["last_page"];
|
||||
List<MManga> animeList = [];
|
||||
for (var item in jsonResult["data"]) {
|
||||
MManga anime = MManga();
|
||||
anime.name = item["anime_title"];
|
||||
anime.imageUrl = item["snapshot"];
|
||||
anime.link = "/anime/?anime_id=${item["id"]}&name=${item["anime_title"]}";
|
||||
anime.artist = item["fansub"];
|
||||
animeList.add(anime);
|
||||
}
|
||||
return MPages(animeList, hasNextPage);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/api?m=search&l=8&q=$query")))
|
||||
.body;
|
||||
final jsonResult = json.decode(res);
|
||||
List<MManga> animeList = [];
|
||||
for (var item in jsonResult["data"]) {
|
||||
MManga anime = MManga();
|
||||
anime.name = item["title"];
|
||||
anime.imageUrl = item["poster"];
|
||||
anime.link = "/anime/?anime_id=${item["id"]}&name=${item["title"]}";
|
||||
animeList.add(anime);
|
||||
}
|
||||
return MPages(animeList, false);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Currently Airing": 0, "Finished Airing": 1}
|
||||
];
|
||||
MManga anime = MManga();
|
||||
final id = substringBefore(substringAfterLast(url, "?anime_id="), "&name=");
|
||||
final name = substringAfterLast(url, "&name=");
|
||||
print(name);
|
||||
final session = await getSession(name, id);
|
||||
print(session);
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/anime/$session?anime_id=$id")))
|
||||
.body;
|
||||
final document = parseHtml(res);
|
||||
final status =
|
||||
(document.xpathFirst('//div/p[contains(text(),"Status:")]/text()') ??
|
||||
"")
|
||||
.replaceAll("Status:\n", "")
|
||||
.trim();
|
||||
anime.status = parseStatus(status, statusList);
|
||||
|
||||
anime.name = document.selectFirst("div.title-wrapper > h1 > span").text;
|
||||
anime.author =
|
||||
(document.xpathFirst('//div/p[contains(text(),"Studio:")]/text()') ??
|
||||
"")
|
||||
.replaceAll("Studio:\n", "")
|
||||
.trim();
|
||||
anime.imageUrl = document.selectFirst("div.anime-poster a").attr("href");
|
||||
anime.genre =
|
||||
xpath(res, '//*[contains(@class,"anime-genre")]/ul/li/text()');
|
||||
final synonyms =
|
||||
(document.xpathFirst('//div/p[contains(text(),"Synonyms:")]/text()') ??
|
||||
"")
|
||||
.replaceAll("Synonyms:\n", "")
|
||||
.trim();
|
||||
anime.description = document.selectFirst("div.anime-summary").text;
|
||||
if (synonyms.isNotEmpty) {
|
||||
anime.description += "\n\n$synonyms";
|
||||
}
|
||||
final epUrl = "$baseUrl/api?m=release&id=$session&sort=episode_desc&page=1";
|
||||
final resEp = (await client.get(Uri.parse(epUrl))).body;
|
||||
final episodes = await recursivePages(epUrl, resEp, session);
|
||||
|
||||
anime.chapters = episodes;
|
||||
return anime;
|
||||
}
|
||||
|
||||
Future<List<MChapter>> recursivePages(
|
||||
String url, String res, String session) async {
|
||||
final jsonResult = json.decode(res);
|
||||
final page = jsonResult["current_page"];
|
||||
final hasNextPage = page < jsonResult["last_page"];
|
||||
List<MManga> animeList = [];
|
||||
for (var item in jsonResult["data"]) {
|
||||
MChapter episode = MChapter();
|
||||
episode.name = "Episode ${item["episode"]}";
|
||||
episode.url = "/play/$session/${item["session"]}";
|
||||
episode.dateUpload =
|
||||
parseDates([item["created_at"]], "yyyy-MM-dd HH:mm:ss", "en")[0];
|
||||
animeList.add(episode);
|
||||
}
|
||||
if (hasNextPage) {
|
||||
final newUrl = "${substringBeforeLast(url, "&page=")}&page=${page + 1}";
|
||||
final newRes = (await client.get(Uri.parse(newUrl))).body;
|
||||
animeList.addAll(await recursivePages(newUrl, newRes, session));
|
||||
}
|
||||
return animeList;
|
||||
}
|
||||
|
||||
Future<String> getSession(String title, String animeId) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/api?m=search&q=$title"))).body;
|
||||
return substringBefore(
|
||||
substringAfter(
|
||||
substringAfter(res, "\"id\":$animeId"), "\"session\":\""),
|
||||
"\"");
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}$url")));
|
||||
|
||||
final document = parseHtml(res.body);
|
||||
final buttons = document.select("div#resolutionMenu > button");
|
||||
List<MVideo> videos = [];
|
||||
for (var i = 0; i < buttons.length; i++) {
|
||||
final btn = buttons[i];
|
||||
final kwikLink = btn.attr("data-src");
|
||||
final quality = btn.text;
|
||||
final ress = (await client.get(Uri.parse(kwikLink),
|
||||
headers: {"Referer": "https://animepahe.com"}));
|
||||
final script = substringAfterLast(
|
||||
xpath(ress.body, '//script[contains(text(),"eval(function")]/text()')
|
||||
.first,
|
||||
"eval(function(");
|
||||
final videoUrl = substringBefore(
|
||||
substringAfter(unpackJs("eval(function($script"), "const source=\\'"),
|
||||
"\\';");
|
||||
MVideo video = MVideo();
|
||||
video
|
||||
..url = videoUrl
|
||||
..originalUrl = videoUrl
|
||||
..quality = quality
|
||||
..headers = {"referer": "https://kwik.cx"};
|
||||
videos.add(video);
|
||||
}
|
||||
return sortVideos(videos);
|
||||
}
|
||||
|
||||
List<MVideo> sortVideos(List<MVideo> videos) {
|
||||
String quality = getPreferenceValue(source.id, "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;
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_domain",
|
||||
title: "Preferred domain",
|
||||
summary: "",
|
||||
valueIndex: 1,
|
||||
entries: [
|
||||
"animepahe.com",
|
||||
"animepahe.ru",
|
||||
"animepahe.org"
|
||||
],
|
||||
entryValues: [
|
||||
"https://animepahe.com",
|
||||
"https://animepahe.ru",
|
||||
"https://animepahe.org"
|
||||
]),
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
title: "Preferred Quality",
|
||||
summary: "",
|
||||
valueIndex: 0,
|
||||
entries: ["1080p", "720p", "360p"],
|
||||
entryValues: ["1080", "720", "360"]),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
AnimePahe main(MSource source) {
|
||||
return AnimePahe(source);
|
||||
}
|
||||
BIN
anime/src/en/animepahe/icon.png
Normal file
BIN
anime/src/en/animepahe/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
16
anime/src/en/animepahe/source.dart
Normal file
16
anime/src/en/animepahe/source.dart
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get animepaheSource => _animepaheSource;
|
||||
const _animepaheVersion = "0.0.1";
|
||||
const _animepaheSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/ar/animepahe/animepahe.dart";
|
||||
Source _animepaheSource = Source(
|
||||
name: "animepahe",
|
||||
baseUrl: "https://www.animepahe.ru",
|
||||
lang: "en",
|
||||
typeSource: "single",
|
||||
iconUrl:
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/ar/animepahe/icon.png",
|
||||
sourceCodeUrl: _animepaheSourceCodeUrl,
|
||||
version: _animepaheVersion,
|
||||
isManga: false);
|
||||
|
|
@ -2,31 +2,35 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class Aniwave extends MProvider {
|
||||
Aniwave();
|
||||
Aniwave({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/filter?sort=trending&page=$page")))
|
||||
String get baseUrl => getPreferenceValue(source.id, "preferred_domain1");
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("$baseUrl/filter?sort=trending&page=$page")))
|
||||
.body;
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/filter?sort=recently_updated&page=$page")))
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("$baseUrl/filter?sort=recently_updated&page=$page")))
|
||||
.body;
|
||||
return parseAnimeList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "${preferenceBaseUrl(source.id)}/filter?keyword=$query";
|
||||
String url = "$baseUrl/filter?keyword=$query";
|
||||
|
||||
for (var filter in filters) {
|
||||
if (filter.type == "OrderFilter") {
|
||||
|
|
@ -96,13 +100,11 @@ class Aniwave extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Releasing": 0, "Completed": 1}
|
||||
];
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
MManga anime = MManga();
|
||||
final status = xpath(res, '//div[contains(text(),"Status")]/span/text()');
|
||||
if (status.isNotEmpty) {
|
||||
|
|
@ -123,9 +125,9 @@ class Aniwave extends MProvider {
|
|||
final encrypt = vrfEncrypt(id);
|
||||
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
|
||||
|
||||
final resEp = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/ajax/episode/list/$id?$vrf")))
|
||||
.body;
|
||||
final resEp =
|
||||
(await client.get(Uri.parse("$baseUrl/ajax/episode/list/$id?$vrf")))
|
||||
.body;
|
||||
|
||||
final html = json.decode(resEp)["result"];
|
||||
List<MChapter>? episodesList = [];
|
||||
|
|
@ -168,13 +170,13 @@ class Aniwave extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final ids = substringBefore(url, "&");
|
||||
final encrypt = vrfEncrypt(ids);
|
||||
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/ajax/server/list/$ids?$vrf")))
|
||||
.body;
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/ajax/server/list/$ids?$vrf")))
|
||||
.body;
|
||||
final html = json.decode(res)["result"];
|
||||
|
||||
final vidsHtmls = parseHtml(html).select("div.servers > div");
|
||||
|
|
@ -189,9 +191,9 @@ class Aniwave extends MProvider {
|
|||
|
||||
final encrypt = vrfEncrypt(serverId);
|
||||
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/ajax/server/$serverId?$vrf")))
|
||||
.body;
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/ajax/server/$serverId?$vrf")))
|
||||
.body;
|
||||
final status = json.decode(res)["status"];
|
||||
if (status == 200) {
|
||||
List<MVideo> a = [];
|
||||
|
|
@ -412,7 +414,7 @@ class Aniwave extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("OrderFilter", "Sort order", 0, [
|
||||
SelectFilterOption("Most relevance", "most_relevance"),
|
||||
|
|
@ -545,7 +547,7 @@ class Aniwave extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_domain1",
|
||||
|
|
@ -632,10 +634,6 @@ class Aniwave extends MProvider {
|
|||
];
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "preferred_domain1");
|
||||
}
|
||||
|
||||
List<String> preferenceHosterSelection(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "hoster_selection");
|
||||
}
|
||||
|
|
@ -685,6 +683,6 @@ class Aniwave extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
Aniwave main() {
|
||||
return Aniwave();
|
||||
Aniwave main(MSource source) {
|
||||
return Aniwave(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get aniwave => _aniwave;
|
||||
const _aniwaveVersion = "0.0.55";
|
||||
const _aniwaveVersion = "0.0.6";
|
||||
const _aniwaveCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/aniwave/aniwave.dart";
|
||||
Source _aniwave = Source(
|
||||
|
|
|
|||
|
|
@ -2,35 +2,39 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class DramaCool extends MProvider {
|
||||
DramaCool();
|
||||
DramaCool({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/most-popular-drama?page=$page")))
|
||||
.body;
|
||||
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(MSource source, int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/recently-added?page=$page")))
|
||||
.body;
|
||||
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(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/search?keyword=$query&page=$page")))
|
||||
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"),
|
||||
|
|
@ -38,22 +42,18 @@ class DramaCool extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
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("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
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("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
final document = parseHtml(res);
|
||||
MManga anime = MManga();
|
||||
anime.description = document
|
||||
|
|
@ -100,12 +100,10 @@ class DramaCool extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
final document = parseHtml(res);
|
||||
String iframeUrl = document.selectFirst("iframe")?.getSrc ?? "";
|
||||
if (iframeUrl.isEmpty) return [];
|
||||
|
|
@ -131,7 +129,7 @@ class DramaCool extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
EditTextPreference(
|
||||
key: "overrideBaseUrl",
|
||||
|
|
@ -165,10 +163,6 @@ class DramaCool extends MProvider {
|
|||
];
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "overrideBaseUrl");
|
||||
}
|
||||
|
||||
MPages animeFromElement(List<MElement> elements, bool hasNextPage) {
|
||||
List<MManga> animeList = [];
|
||||
for (var element in elements) {
|
||||
|
|
@ -211,6 +205,6 @@ class DramaCool extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
DramaCool main() {
|
||||
return DramaCool();
|
||||
DramaCool main(MSource source) {
|
||||
return DramaCool(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get dramacoolSource => _dramacoolSource;
|
||||
const _dramacoolVersion = "0.0.15";
|
||||
const _dramacoolVersion = "0.0.2";
|
||||
const _dramacoolSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/dramacool/dramacool.dart";
|
||||
Source _dramacoolSource = Source(
|
||||
|
|
|
|||
|
|
@ -2,15 +2,20 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class GogoAnime extends MProvider {
|
||||
GogoAnime();
|
||||
GogoAnime({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/popular.html?page=$page")))
|
||||
.body;
|
||||
String get baseUrl =>
|
||||
getPreferenceValue(source.id, "override_baseurl_v${source.id}");
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/popular.html?page=$page"))).body;
|
||||
|
||||
List<MManga> animeList = [];
|
||||
final urls = xpath(res, '//*[@class="img"]/a/@href');
|
||||
|
|
@ -29,7 +34,7 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"https://ajax.gogo-load.com/ajax/page-recent-release-ongoing.html?page=$page&type=1")))
|
||||
.body;
|
||||
|
|
@ -58,8 +63,7 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String filterStr = "";
|
||||
String url = "";
|
||||
|
|
@ -131,15 +135,14 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
}
|
||||
if (genre.isNotEmpty) {
|
||||
url = "${preferenceBaseUrl(source.id)}/genre/$genre?page=$page";
|
||||
url = "$baseUrl/genre/$genre?page=$page";
|
||||
} else if (recent.isNotEmpty) {
|
||||
url =
|
||||
"https://ajax.gogo-load.com/ajax/page-recent-release.html?page=$page&type=$recent";
|
||||
} else if (season.isNotEmpty) {
|
||||
url = "${preferenceBaseUrl(source.id)}/$season?page=$page";
|
||||
url = "$baseUrl/$season?page=$page";
|
||||
} else {
|
||||
url =
|
||||
"${preferenceBaseUrl(source.id)}/filter.html?keyword=$query$filterStr&page=$page";
|
||||
url = "$baseUrl/filter.html?keyword=$query$filterStr&page=$page";
|
||||
}
|
||||
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
|
|
@ -161,14 +164,12 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1}
|
||||
];
|
||||
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
MManga anime = MManga();
|
||||
final status = xpath(
|
||||
res, '//*[@class="anime_info_body_bg"]/p[@class="type"][5]/text()')
|
||||
|
|
@ -212,10 +213,8 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
final serverUrls =
|
||||
xpath(res, '//*[@class="anime_muti_link"]/ul/li/a/@data-video');
|
||||
final serverNames =
|
||||
|
|
@ -248,7 +247,7 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("Advanced search"),
|
||||
GroupFilter("GenreFilter", "Genre", [
|
||||
|
|
@ -1030,7 +1029,7 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
EditTextPreference(
|
||||
key: "override_baseurl_v${source.id}",
|
||||
|
|
@ -1100,10 +1099,6 @@ class GogoAnime extends MProvider {
|
|||
];
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "override_baseurl_v$sourceId");
|
||||
}
|
||||
|
||||
List<String> preferenceHosterSelection(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "hoster_selection");
|
||||
}
|
||||
|
|
@ -1137,6 +1132,6 @@ class GogoAnime extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
GogoAnime main() {
|
||||
return GogoAnime();
|
||||
GogoAnime main(MSource source) {
|
||||
return GogoAnime(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get gogoanimeSource => _gogoanimeSource;
|
||||
const _gogoanimeVersion = "0.0.7";
|
||||
const _gogoanimeVersion = "0.0.75";
|
||||
const _gogoanimeSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/gogoanime/gogoanime.dart";
|
||||
Source _gogoanimeSource = Source(
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class KissKh extends MProvider {
|
||||
KissKh();
|
||||
KissKh({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
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;
|
||||
|
|
@ -30,7 +32,7 @@ class KissKh extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
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;
|
||||
|
|
@ -54,8 +56,7 @@ class KissKh extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, 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}/api/DramaList/Search?q=$query&type=0")))
|
||||
.body;
|
||||
|
|
@ -73,7 +74,7 @@ class KissKh extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1}
|
||||
];
|
||||
|
|
@ -114,7 +115,7 @@ class KissKh extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
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);
|
||||
|
|
@ -151,6 +152,6 @@ class KissKh extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
KissKh main() {
|
||||
return KissKh();
|
||||
KissKh main(MSource source) {
|
||||
return KissKh(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class NineAnimeTv extends MProvider {
|
||||
NineAnimeTv();
|
||||
NineAnimeTv({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/filter?sort=all&page=$page")))
|
||||
.body;
|
||||
|
|
@ -15,7 +17,7 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/filter?sort=recently_updated&page=$page")))
|
||||
.body;
|
||||
|
|
@ -23,8 +25,7 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "${source.baseUrl}/filter?keyword=$query";
|
||||
|
||||
|
|
@ -113,7 +114,7 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Currently Airing": 0, "Finished Airing": 1}
|
||||
];
|
||||
|
|
@ -161,7 +162,7 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/ajax/episode/servers?episodeId=$url")))
|
||||
.body;
|
||||
|
|
@ -346,7 +347,7 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
GroupFilter("GenreFilter", "Genre", [
|
||||
CheckBoxFilter("Action", "1"),
|
||||
|
|
@ -452,7 +453,7 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -540,6 +541,6 @@ class NineAnimeTv extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
NineAnimeTv main() {
|
||||
return NineAnimeTv();
|
||||
NineAnimeTv main(MSource source) {
|
||||
return NineAnimeTv(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get nineanimetv => _nineanimetv;
|
||||
const _nineanimetvVersion = "0.0.2";
|
||||
const _nineanimetvVersion = "0.0.25";
|
||||
const _nineanimetvCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/nineanimetv/nineanimetv.dart";
|
||||
Source _nineanimetv = Source(
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get uhdmoviesSource => _uhdmoviesSource;
|
||||
const _uhdmoviesVersion = "0.0.25";
|
||||
const _uhdmoviesVersion = "0.0.3";
|
||||
const _uhdmoviesSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/uhdmovies/uhdmovies.dart";
|
||||
Source _uhdmoviesSource = Source(
|
||||
|
|
|
|||
|
|
@ -2,41 +2,41 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class UHDMovies extends MProvider {
|
||||
UHDMovies();
|
||||
UHDMovies({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
bool get supportsLatest => false;
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${preferenceBaseUrl(source.id)}/page/$page")))
|
||||
.body;
|
||||
String get baseUrl => getPreferenceValue(source.id, "pref_domain");
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse("$baseUrl/page/$page"))).body;
|
||||
return animeFromElement(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
return MPages([], false);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/page/$page/?s=${query.replaceAll(" ", "+")}")))
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("$baseUrl/page/$page/?s=${query.replaceAll(" ", "+")}")))
|
||||
.body;
|
||||
return animeFromElement(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}${url}")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl${url}"))).body;
|
||||
MManga anime = MManga();
|
||||
final description = xpath(res, '//pre/span/text()');
|
||||
if (description.isNotEmpty) {
|
||||
|
|
@ -117,13 +117,13 @@ class UHDMovies extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = await getMediaUrl(url);
|
||||
return await extractVideos(res);
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
EditTextPreference(
|
||||
key: "pref_domain",
|
||||
|
|
@ -136,10 +136,6 @@ class UHDMovies extends MProvider {
|
|||
];
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "pref_domain");
|
||||
}
|
||||
|
||||
Future<List<MVideo>> extractVideos(String url) async {
|
||||
List<MVideo> videos = [];
|
||||
for (int type = 1; type < 3; type++) {
|
||||
|
|
@ -233,6 +229,6 @@ class UHDMovies extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
UHDMovies main() {
|
||||
return UHDMovies();
|
||||
UHDMovies main(MSource source) {
|
||||
return UHDMovies(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class AnimeSama extends MProvider {
|
||||
AnimeSama();
|
||||
AnimeSama({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final doc = (await client.get(Uri.parse("${source.baseUrl}/#$page"))).body;
|
||||
final regex = RegExp(r"""^\s*carteClassique\(\s*.*?\s*,\s*"(.*?)".*\)""",
|
||||
multiLine: true);
|
||||
|
|
@ -24,7 +26,7 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(source.baseUrl))).body;
|
||||
var document = parseHtml(res);
|
||||
final latest = document
|
||||
|
|
@ -44,8 +46,7 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/catalogue/listing_all.php")))
|
||||
|
|
@ -104,7 +105,7 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
var animeUrl =
|
||||
"${source.baseUrl}${substringBeforeLast(getUrlWithoutDomain(url), "/")}";
|
||||
var movie =
|
||||
|
|
@ -152,7 +153,7 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final players = json.decode(url);
|
||||
List<MVideo> videos = [];
|
||||
for (var player in players) {
|
||||
|
|
@ -178,7 +179,7 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
GroupFilter("TypeFilter", "Type", [
|
||||
CheckBoxFilter("Anime", "Anime"),
|
||||
|
|
@ -218,7 +219,7 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -403,6 +404,6 @@ class AnimeSama extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
AnimeSama main() {
|
||||
return AnimeSama();
|
||||
AnimeSama main(MSource source) {
|
||||
return AnimeSama(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get animesamaSource => _animesama;
|
||||
const animesamaVersion = "0.0.15";
|
||||
const animesamaVersion = "0.0.2";
|
||||
const animesamaCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/animesama/animesama.dart";
|
||||
Source _animesama = Source(
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class AnimesUltra extends MProvider {
|
||||
AnimesUltra();
|
||||
AnimesUltra({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(source.baseUrl))).body;
|
||||
|
||||
List<MManga> animeList = [];
|
||||
|
|
@ -30,7 +32,7 @@ class AnimesUltra extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(source.baseUrl))).body;
|
||||
|
||||
List<MManga> animeList = [];
|
||||
|
|
@ -53,8 +55,7 @@ class AnimesUltra extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, 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;
|
||||
|
||||
List<MManga> animeList = [];
|
||||
|
|
@ -74,7 +75,7 @@ class AnimesUltra extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"En cours": 0, "Terminé": 1}
|
||||
];
|
||||
|
|
@ -116,7 +117,7 @@ class AnimesUltra extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final resWebview = await getHtmlViaWebview(
|
||||
url, '//*[@class="ps__-list"]/div/@data-server-id');
|
||||
|
||||
|
|
@ -152,6 +153,6 @@ class AnimesUltra extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
AnimesUltra main() {
|
||||
return AnimesUltra();
|
||||
AnimesUltra main(MSource source) {
|
||||
return AnimesUltra(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get animesultraSource => _animesultraSource;
|
||||
const _animesultraVersion = "0.0.55";
|
||||
const _animesultraVersion = "0.0.6";
|
||||
const _animesultraSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/animesultra/animesultra.dart";
|
||||
Source _animesultraSource = Source(
|
||||
|
|
|
|||
|
|
@ -2,19 +2,21 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class FrAnime extends MProvider {
|
||||
FrAnime();
|
||||
FrAnime({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = await dataBase();
|
||||
|
||||
return animeResList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = await dataBase();
|
||||
|
||||
List list = json.decode(res);
|
||||
|
|
@ -22,15 +24,14 @@ class FrAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final res = await dataBase();
|
||||
|
||||
return animeSeachFetch(res, query);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
MManga anime = MManga();
|
||||
String language = "vo".toString();
|
||||
if (url.contains("lang=")) {
|
||||
|
|
@ -84,7 +85,7 @@ class FrAnime extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
String language = "vo";
|
||||
String videoBaseUrl = "https://api.franime.fr/api/anime";
|
||||
if (url.contains("lang=")) {
|
||||
|
|
@ -336,6 +337,6 @@ class FrAnime extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
FrAnime main() {
|
||||
return FrAnime();
|
||||
FrAnime main(MSource source) {
|
||||
return FrAnime(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get franimeSource => _franimeSource;
|
||||
const _franimeVersion = "0.0.6";
|
||||
const _franimeVersion = "0.0.65";
|
||||
const _franimeSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/franime/franime.dart";
|
||||
Source _franimeSource = Source(
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class OtakuFr extends MProvider {
|
||||
OtakuFr();
|
||||
OtakuFr({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}/en-cours/page/$page")))
|
||||
.body;
|
||||
|
|
@ -31,7 +33,7 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}/page/$page/"))).body;
|
||||
|
||||
|
|
@ -71,8 +73,7 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
if (query.isNotEmpty) {
|
||||
|
|
@ -117,7 +118,7 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"En cours": 0, "Terminé": 1}
|
||||
];
|
||||
|
|
@ -171,7 +172,7 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
|
||||
final servers = xpath(res, '//*[@id="nav-tabContent"]/div/iframe/@src');
|
||||
|
|
@ -220,7 +221,7 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("La recherche de texte ignore les filtres"),
|
||||
SelectFilter("GenreFilter", "Genre", 0, [
|
||||
|
|
@ -276,7 +277,7 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -436,6 +437,6 @@ class OtakuFr extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
OtakuFr main() {
|
||||
return OtakuFr();
|
||||
OtakuFr main(MSource source) {
|
||||
return OtakuFr(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get otakufr => _otakufr;
|
||||
const otakufrVersion = "0.0.7";
|
||||
const otakufrVersion = "0.0.75";
|
||||
const otakufrCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/otakufr/otakufr.dart";
|
||||
Source _otakufr = Source(
|
||||
|
|
|
|||
|
|
@ -2,20 +2,24 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class YoMovies extends MProvider {
|
||||
YoMovies();
|
||||
YoMovies({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
String get baseUrl => getPreferenceValue(source.id, "overrideBaseUrl");
|
||||
|
||||
@override
|
||||
bool get supportsLatest => false;
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
String pageNu = page == 1 ? "" : "page/$page/";
|
||||
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${preferenceBaseUrl(source.id)}/most-favorites/$pageNu")))
|
||||
.body;
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/most-favorites/$pageNu"))).body;
|
||||
final document = parseHtml(res);
|
||||
return animeFromElement(
|
||||
document.select("div.movies-list > div.ml-item"),
|
||||
|
|
@ -24,18 +28,17 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
return MPages([], false);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
String pageNu = page == 1 ? "" : "/page/$page";
|
||||
if (query.isNotEmpty) {
|
||||
url = "${preferenceBaseUrl(source.id)}$pageNu/?s=$query";
|
||||
url = "$baseUrl$pageNu/?s=$query";
|
||||
} else {
|
||||
for (var filter in filters) {
|
||||
if (filter.type.isNotEmpty) {
|
||||
|
|
@ -45,7 +48,7 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
}
|
||||
}
|
||||
url = "${preferenceBaseUrl(source.id)}$url$pageNu";
|
||||
url = "$baseUrl$url$pageNu";
|
||||
}
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
final document = parseHtml(res);
|
||||
|
|
@ -56,12 +59,10 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
final document = parseHtml(res);
|
||||
MManga anime = MManga();
|
||||
var infoElement = document.selectFirst("div.mvi-content");
|
||||
|
|
@ -96,11 +97,9 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$url")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$url"))).body;
|
||||
final document = parseHtml(res);
|
||||
final serverElements = document.select("div.movieplay > iframe");
|
||||
List<MVideo> videos = [];
|
||||
|
|
@ -116,7 +115,7 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
EditTextPreference(
|
||||
key: "overrideBaseUrl",
|
||||
|
|
@ -163,10 +162,6 @@ class YoMovies extends MProvider {
|
|||
return videos;
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "overrideBaseUrl");
|
||||
}
|
||||
|
||||
MPages animeFromElement(List<MElement> elements, bool hasNextPage) {
|
||||
List<MManga> animeList = [];
|
||||
for (var element in elements) {
|
||||
|
|
@ -209,7 +204,7 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter(
|
||||
"Note: Only one selection at a time works, and it ignores text search"),
|
||||
|
|
@ -340,6 +335,6 @@ class YoMovies extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
YoMovies main() {
|
||||
return YoMovies();
|
||||
YoMovies main(MSource source) {
|
||||
return YoMovies(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class NimeGami extends MProvider {
|
||||
NimeGami();
|
||||
NimeGami({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}/page/$page"))).body;
|
||||
List<MManga> animeList = [];
|
||||
|
|
@ -27,7 +29,7 @@ class NimeGami extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}/page/$page"))).body;
|
||||
List<MManga> animeList = [];
|
||||
|
|
@ -48,8 +50,7 @@ class NimeGami extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, 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}/page/$page/?s=$query&post_type=post")))
|
||||
.body;
|
||||
|
|
@ -70,7 +71,7 @@ class NimeGami extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
MManga anime = MManga();
|
||||
final description = xpath(res, '//*[@id="Sinopsis"]/p/text()');
|
||||
|
|
@ -106,7 +107,7 @@ class NimeGami extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final resJson = json.decode(url);
|
||||
final urls = resJson["urls"];
|
||||
List<MVideo> videos = [];
|
||||
|
|
@ -176,6 +177,6 @@ class NimeGami extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
NimeGami main() {
|
||||
return NimeGami();
|
||||
NimeGami main(MSource source) {
|
||||
return NimeGami(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get nimegami => _nimegami;
|
||||
const _nimegamiVersion = "0.0.45";
|
||||
const _nimegamiVersion = "0.0.5";
|
||||
const _nimegamiCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/nimegami/nimegami.dart";
|
||||
Source _nimegami = Source(
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class OploVerz extends MProvider {
|
||||
OploVerz();
|
||||
OploVerz({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/anime-list/page/$page/?order=popular")))
|
||||
.body;
|
||||
|
|
@ -15,7 +17,7 @@ class OploVerz extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/anime-list/page/$page/?order=latest")))
|
||||
.body;
|
||||
|
|
@ -23,8 +25,7 @@ class OploVerz extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, 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}/anime-list/page/$page/?title=$query")))
|
||||
.body;
|
||||
|
|
@ -32,7 +33,7 @@ class OploVerz extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"ongoing": 0, "completed": 1}
|
||||
];
|
||||
|
|
@ -67,7 +68,7 @@ class OploVerz extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
final dataPost = xpath(res,
|
||||
'//*[@id="server"]/ul/li/div[contains(@id,"player-option")]/@data-post')
|
||||
|
|
@ -147,6 +148,6 @@ class OploVerz extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
OploVerz main() {
|
||||
return OploVerz();
|
||||
OploVerz main(MSource source) {
|
||||
return OploVerz(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get oploverz => _oploverz;
|
||||
const _oploverzVersion = "0.0.35";
|
||||
const _oploverzVersion = "0.0.4";
|
||||
const _oploverzCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/oploverz/oploverz.dart";
|
||||
Source _oploverz = Source(
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class OtakuDesu extends MProvider {
|
||||
OtakuDesu();
|
||||
OtakuDesu({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/complete-anime/page/$page")))
|
||||
.body;
|
||||
|
|
@ -15,7 +17,7 @@ class OtakuDesu extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/ongoing-anime/page/$page")))
|
||||
.body;
|
||||
|
|
@ -23,8 +25,7 @@ class OtakuDesu extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, 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}/?s=$query&post_type=anime")))
|
||||
.body;
|
||||
|
|
@ -44,7 +45,7 @@ class OtakuDesu extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1}
|
||||
];
|
||||
|
|
@ -85,7 +86,7 @@ class OtakuDesu extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
List<MVideo> videos = [];
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
final script =
|
||||
|
|
@ -186,6 +187,6 @@ class OtakuDesu extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
OtakuDesu main() {
|
||||
return OtakuDesu();
|
||||
OtakuDesu main(MSource source) {
|
||||
return OtakuDesu(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get otakudesu => _otakudesu;
|
||||
const _otakudesuVersion = "0.0.4";
|
||||
const _otakudesuVersion = "0.0.45";
|
||||
const _otakudesuCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/otakudesu/otakudesu.dart";
|
||||
Source _otakudesu = Source(
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class AnimeSaturn extends MProvider {
|
||||
AnimeSaturn();
|
||||
AnimeSaturn({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/animeincorso?page=$page")))
|
||||
.body;
|
||||
|
|
@ -34,7 +36,7 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}/newest?page=$page")))
|
||||
.body;
|
||||
|
|
@ -59,8 +61,7 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
|
||||
|
|
@ -141,7 +142,7 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"In corso": 0, "Finito": 1}
|
||||
];
|
||||
|
|
@ -192,7 +193,7 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
|
||||
final urlVid = xpath(res, '//a[contains(@href,"/watch")]/@href').first;
|
||||
|
|
@ -245,7 +246,7 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("Ricerca per titolo ignora i filtri e viceversa"),
|
||||
GroupFilter("GenreFilter", "Generi", [
|
||||
|
|
@ -313,7 +314,7 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_quality",
|
||||
|
|
@ -353,6 +354,6 @@ class AnimeSaturn extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
AnimeSaturn main() {
|
||||
return AnimeSaturn();
|
||||
AnimeSaturn main(MSource source) {
|
||||
return AnimeSaturn(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get animesaturn => _animesaturn;
|
||||
const _animesaturnVersion = "0.0.25";
|
||||
const _animesaturnVersion = "0.0.3";
|
||||
const _animesaturnCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/it/animesaturn/animesaturn.dart";
|
||||
Source _animesaturn = Source(
|
||||
|
|
|
|||
|
|
@ -2,36 +2,37 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class Filma24 extends MProvider {
|
||||
Filma24();
|
||||
Filma24({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
String get baseUrl => getPreferenceValue(source.id, "pref_domain");
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
String pageNu = page == 1 ? "" : "/page/$page/";
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceBaseUrl(source.id)}$pageNu")))
|
||||
.body;
|
||||
final res = (await client.get(Uri.parse("$baseUrl$pageNu"))).body;
|
||||
return animeFromRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
String pageNu = page == 1 ? "" : "page/$page/";
|
||||
final res = (await client.get(
|
||||
Uri.parse("${preferenceBaseUrl(source.id)}/$pageNu?sort=trendy")))
|
||||
.body;
|
||||
final res =
|
||||
(await client.get(Uri.parse("$baseUrl/$pageNu?sort=trendy"))).body;
|
||||
return animeFromRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
String pageNu = page == 1 ? "" : "page/$page/";
|
||||
if (query.isNotEmpty) {
|
||||
url += "${preferenceBaseUrl(source.id)}/search/$query/";
|
||||
url += "$baseUrl/search/$query/";
|
||||
} else {
|
||||
for (var filter in filters) {
|
||||
if (filter.type == "ReleaseFilter") {
|
||||
|
|
@ -46,7 +47,7 @@ class Filma24 extends MProvider {
|
|||
}
|
||||
}
|
||||
}
|
||||
url = "${preferenceBaseUrl(source.id)}$url";
|
||||
url = "$baseUrl$url";
|
||||
}
|
||||
|
||||
url += pageNu;
|
||||
|
|
@ -56,7 +57,7 @@ class Filma24 extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
List<MChapter>? episodesList = [];
|
||||
if (!url.contains("seriale")) {
|
||||
MChapter episode = MChapter();
|
||||
|
|
@ -86,7 +87,7 @@ class Filma24 extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<MVideo>> getVideoList(MSource source, String url) async {
|
||||
Future<List<MVideo>> getVideoList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
List<MVideo> videos = [];
|
||||
final serverUrls = xpath(res, '//*[@class="player"]/div[1]/a/@href');
|
||||
|
|
@ -117,7 +118,7 @@ class Filma24 extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
EditTextPreference(
|
||||
key: "pref_domain",
|
||||
|
|
@ -130,12 +131,8 @@ class Filma24 extends MProvider {
|
|||
];
|
||||
}
|
||||
|
||||
String preferenceBaseUrl(int sourceId) {
|
||||
return getPreferenceValue(sourceId, "pref_domain");
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("ReleaseFilter", "Viti", 0, [
|
||||
SelectFilterOption("<Select>", ""),
|
||||
|
|
@ -289,6 +286,6 @@ class Filma24 extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
Filma24 main() {
|
||||
return Filma24();
|
||||
Filma24 main(MSource source) {
|
||||
return Filma24(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get filma24 => _filma24;
|
||||
const _filma24Version = "0.0.15";
|
||||
const _filma24Version = "0.0.2";
|
||||
const _filma24CodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/sq/filma24/filma24.dart";
|
||||
Source _filma24 = Source(
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class HeanCms extends MProvider {
|
||||
HeanCms();
|
||||
HeanCms({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
String res = "";
|
||||
if (!useNewQueryEndpoint(source.name)) {
|
||||
|
|
@ -28,11 +30,11 @@ class HeanCms extends MProvider {
|
|||
res =
|
||||
(await client.get(Uri.parse(newEndpointUrl), headers: headers)).body;
|
||||
}
|
||||
return mMangaRes(res, source);
|
||||
return mMangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
String res = "";
|
||||
if (!useNewQueryEndpoint(source.name)) {
|
||||
|
|
@ -52,12 +54,11 @@ class HeanCms extends MProvider {
|
|||
res =
|
||||
(await client.get(Uri.parse(newEndpointUrl), headers: headers)).body;
|
||||
}
|
||||
return mMangaRes(res, source);
|
||||
return mMangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
String res = "";
|
||||
if (!useNewQueryEndpoint(source.source)) {
|
||||
|
|
@ -71,11 +72,11 @@ class HeanCms extends MProvider {
|
|||
res =
|
||||
(await client.get(Uri.parse(newEndpointUrl), headers: headers)).body;
|
||||
}
|
||||
return mMangaRes(res, source);
|
||||
return mMangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
MManga manga = MManga();
|
||||
String currentSlug = substringAfterLast(url, "/");
|
||||
final headers = getHeader(source.baseUrl);
|
||||
|
|
@ -131,7 +132,7 @@ class HeanCms extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
|
||||
String res = "".toString();
|
||||
|
|
@ -171,7 +172,7 @@ class HeanCms extends MProvider {
|
|||
return pageUrls;
|
||||
}
|
||||
|
||||
MPages mMangaRes(String res, MSource source) {
|
||||
MPages mMangaRes(String res) {
|
||||
bool hasNextPage = true;
|
||||
List<MManga> mangaList = [];
|
||||
List<String> names = [];
|
||||
|
|
@ -240,6 +241,6 @@ Map<String, String> getHeader(String url) {
|
|||
return headers;
|
||||
}
|
||||
|
||||
HeanCms main() {
|
||||
return HeanCms();
|
||||
HeanCms main(MSource source) {
|
||||
return HeanCms(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import 'src/yugenmangas/yugenmangas.dart';
|
|||
import 'src/omegascans/omegascans.dart';
|
||||
import 'src/perfscan/perfscan.dart';
|
||||
|
||||
const heancmsVersion = "0.0.65";
|
||||
const heancmsVersion = "0.0.7";
|
||||
const heancmsSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/heancms/heancms.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class Madara extends MProvider {
|
||||
Madara();
|
||||
Madara({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/manga/page/$page/?m_orderby=views")))
|
||||
.body;
|
||||
|
|
@ -16,7 +18,7 @@ class Madara extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/manga/page/$page/?m_orderby=latest")))
|
||||
.body;
|
||||
|
|
@ -25,8 +27,7 @@ class Madara extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
|
||||
String url = "${source.baseUrl}/?s=$query&post_type=wp-manga";
|
||||
|
|
@ -77,7 +78,7 @@ class Madara extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{
|
||||
"OnGoing": 0,
|
||||
|
|
@ -248,7 +249,7 @@ class Madara extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
final document = parseHtml(res);
|
||||
final pageElement = document.selectFirst(
|
||||
|
|
@ -298,7 +299,7 @@ class Madara extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
TextFilter("AuthorFilter", "Author"),
|
||||
TextFilter("ArtistFilter", "Artist"),
|
||||
|
|
@ -334,6 +335,6 @@ class Madara extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
Madara main() {
|
||||
return Madara();
|
||||
Madara main(MSource source) {
|
||||
return Madara(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ import 'src/comicarab/comicarab.dart';
|
|||
import 'src/manga3asq/manga3asq.dart';
|
||||
import 'src/bakamh/bakamh.dart';
|
||||
|
||||
const madaraVersion = "0.0.8";
|
||||
const madaraVersion = "0.0.85";
|
||||
const madaraSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/madara.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,14 @@
|
|||
import 'package:mangayomi/bridge_lib.dart';
|
||||
class MangaBox extends MProvider {
|
||||
MangaBox();
|
||||
|
||||
final Client client = Client();
|
||||
class MangaBox extends MProvider {
|
||||
MangaBox({required this.source});
|
||||
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/${popularUrlPath(source.name, page)}")))
|
||||
.body;
|
||||
|
|
@ -13,7 +16,7 @@ class MangaBox extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/${latestUrlPath(source.name, page)}")))
|
||||
.body;
|
||||
|
|
@ -21,8 +24,7 @@ class MangaBox extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
|
||||
String url = "";
|
||||
|
|
@ -118,7 +120,7 @@ class MangaBox extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1}
|
||||
];
|
||||
|
|
@ -199,7 +201,7 @@ class MangaBox extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
List<String> pageUrls = [];
|
||||
final urls = xpath(res,
|
||||
|
|
@ -297,7 +299,7 @@ class MangaBox extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
if (source.name == "Mangairo") {
|
||||
return [];
|
||||
}
|
||||
|
|
@ -422,6 +424,6 @@ Map<String, String> getHeader(String url) {
|
|||
return headers;
|
||||
}
|
||||
|
||||
MangaBox main() {
|
||||
return MangaBox();
|
||||
MangaBox main(MSource source) {
|
||||
return MangaBox(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'src/mangairo/mangaeiro.dart';
|
|||
import 'src/mangakakalot/mangakakalot.dart';
|
||||
import 'src/manganato/manganato.dart';
|
||||
|
||||
const mangaboxVersion = "0.0.25";
|
||||
const mangaboxVersion = "0.0.3";
|
||||
const mangaboxSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/mangabox/mangabox.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class MangaReader extends MProvider {
|
||||
MangaReader();
|
||||
MangaReader({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}${getMangaUrlDirectory(source.name)}/?page=$page&order=popular")))
|
||||
.body;
|
||||
|
|
@ -15,7 +17,7 @@ class MangaReader extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}${getMangaUrlDirectory(source.name)}/?page=$page&order=update")))
|
||||
.body;
|
||||
|
|
@ -23,8 +25,7 @@ class MangaReader extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
|
||||
String url =
|
||||
|
|
@ -71,7 +72,7 @@ class MangaReader extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{
|
||||
"مستمرة": 0,
|
||||
|
|
@ -188,7 +189,7 @@ class MangaReader extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
url = getUrlWithoutDomain(url);
|
||||
final res = (await client.get(Uri.parse('${source.baseUrl}$url'))).body;
|
||||
|
||||
|
|
@ -251,7 +252,7 @@ class MangaReader extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SeparatorFilter(),
|
||||
TextFilter("AuthorFilter", "Author"),
|
||||
|
|
@ -316,6 +317,6 @@ class MangaReader extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
MangaReader main() {
|
||||
return MangaReader();
|
||||
MangaReader main(MSource source) {
|
||||
return MangaReader(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ import 'src/turktoon/turktoon.dart';
|
|||
import 'src/uzaymanga/uzaymanga.dart';
|
||||
import 'src/xcalibrscans/xcalibrscans.dart';
|
||||
|
||||
const mangareaderVersion = "0.0.8";
|
||||
const mangareaderVersion = "0.0.85";
|
||||
const mangareaderSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/mangareader/mangareader.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class MMRCMS extends MProvider {
|
||||
MMRCMS();
|
||||
MMRCMS({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse(
|
||||
"${source.baseUrl}/filterList?page=$page&sortBy=views&asc=false")))
|
||||
.body;
|
||||
|
|
@ -38,7 +40,7 @@ class MMRCMS extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}/latest-release?page=$page")))
|
||||
.body;
|
||||
|
|
@ -69,8 +71,7 @@ class MMRCMS extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
if (query.isNotEmpty) {
|
||||
|
|
@ -152,7 +153,7 @@ class MMRCMS extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{
|
||||
"complete": 1,
|
||||
|
|
@ -214,7 +215,7 @@ class MMRCMS extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
|
||||
List<String> pagesUrl = [];
|
||||
|
|
@ -231,7 +232,7 @@ class MMRCMS extends MProvider {
|
|||
return pagesUrl;
|
||||
}
|
||||
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("NOTE: Ignored if using text search!"),
|
||||
SeparatorFilter(),
|
||||
|
|
@ -317,6 +318,6 @@ class MMRCMS extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
MMRCMS main() {
|
||||
return MMRCMS();
|
||||
MMRCMS main(MSource source) {
|
||||
return MMRCMS(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import 'src/readcomicsonline/readcomicsonline.dart';
|
|||
import 'src/lelscanvf/lelscanvf.dart';
|
||||
import 'src/mangafr/mangafr.dart';
|
||||
|
||||
const mmrcmsVersion = "0.0.55";
|
||||
const mmrcmsVersion = "0.0.6";
|
||||
const mmrcmsSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/mmrcms/mmrcms.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class NepNep extends MProvider {
|
||||
NepNep();
|
||||
NepNep({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}/search/"))).body;
|
||||
final directory = directoryFromDocument(res);
|
||||
final resSort = sortMapList(json.decode(directory), "vm", 1);
|
||||
|
|
@ -16,7 +18,7 @@ class NepNep extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}/search/"))).body;
|
||||
final directory = directoryFromDocument(res);
|
||||
final resSort = sortMapList(json.decode(directory), "lt", 1);
|
||||
|
|
@ -25,8 +27,7 @@ class NepNep extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
List<dynamic> queryRes = [];
|
||||
final res = (await client.get(Uri.parse("${source.baseUrl}/search/"))).body;
|
||||
|
|
@ -137,7 +138,7 @@ class NepNep extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1, "Cancelled": 3, "Hiatus": 2}
|
||||
];
|
||||
|
|
@ -189,7 +190,7 @@ class NepNep extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
List<String> pages = [];
|
||||
final res =
|
||||
|
|
@ -306,7 +307,7 @@ class NepNep extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
TextFilter("YearFilter", "Years"),
|
||||
TextFilter("AuthorFilter", "Author"),
|
||||
|
|
@ -405,6 +406,6 @@ Map<String, String> getHeader(String url) {
|
|||
return headers;
|
||||
}
|
||||
|
||||
NepNep main() {
|
||||
return NepNep();
|
||||
NepNep main(MSource source) {
|
||||
return NepNep(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import '../../../model/source.dart';
|
|||
import 'src/mangasee/mangasee.dart';
|
||||
import 'src/mangalife/mangalife.dart';
|
||||
|
||||
const nepnepVersion = "0.0.55";
|
||||
const nepnepVersion = "0.0.6";
|
||||
const nepnepSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/nepnep/nepnep.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import 'multisrc/nepnep/sources.dart';
|
|||
import 'src/all/batoto/sources.dart';
|
||||
import 'src/all/comick/sources.dart';
|
||||
import 'src/all/mangadex/sources.dart';
|
||||
import 'src/all/nhentai/sources.dart';
|
||||
import 'src/en/mangahere/source.dart';
|
||||
|
||||
void main() {
|
||||
|
|
@ -24,7 +25,8 @@ void main() {
|
|||
mangahereSource,
|
||||
...nepnepSourcesList,
|
||||
...mangaboxSourcesList,
|
||||
...batotoSourcesList
|
||||
...batotoSourcesList,
|
||||
...nhentaiSourcesList
|
||||
];
|
||||
final List<Map<String, dynamic>> jsonList =
|
||||
sourcesList.map((source) => source.toJson()).toList();
|
||||
|
|
|
|||
|
|
@ -2,27 +2,28 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class Batoto extends MProvider {
|
||||
Batoto();
|
||||
Batoto({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = await client.get(Uri.parse(
|
||||
"${preferenceMirror(source.id)}/browse?${lang(source.lang)}&sort=views_a&page=$page"));
|
||||
return mangaElementM(res.body, source);
|
||||
return mangaElementM(res.body);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = await client.get(Uri.parse(
|
||||
"${preferenceMirror(source.id)}/browse?${lang(source.lang)}&sort=update&page=$page"));
|
||||
return mangaElementM(res.body, source);
|
||||
return mangaElementM(res.body);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
String min = "";
|
||||
|
|
@ -99,11 +100,11 @@ class Batoto extends MProvider {
|
|||
}
|
||||
|
||||
final res = await client.get(Uri.parse(url));
|
||||
return mangaElementM(res.body, source);
|
||||
return mangaElementM(res.body);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1, "Cancelled": 3, "Hiatus": 2}
|
||||
];
|
||||
|
|
@ -161,7 +162,7 @@ class Batoto extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res =
|
||||
(await client.get(Uri.parse("${preferenceMirror(source.id)}$url")))
|
||||
.body;
|
||||
|
|
@ -190,7 +191,7 @@ class Batoto extends MProvider {
|
|||
return pagesUrl;
|
||||
}
|
||||
|
||||
MPages mangaElementM(String res, MSource source) async {
|
||||
MPages mangaElementM(String res) async {
|
||||
final lang = source.lang.replaceAll("-", "_");
|
||||
|
||||
final mangaElements = parseHtml(res).select("div#series-list div.col");
|
||||
|
|
@ -230,7 +231,7 @@ class Batoto extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("LetterFilter", "Letter matching mode (Slow)", 0, [
|
||||
SelectFilterOption("Disabled", "disabled"),
|
||||
|
|
@ -1622,7 +1623,7 @@ class Batoto extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "mirror",
|
||||
|
|
@ -1667,6 +1668,6 @@ class Batoto extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
Batoto main() {
|
||||
return Batoto();
|
||||
Batoto main(MSource source) {
|
||||
return Batoto(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
const _batotoVersion = "0.0.6";
|
||||
const _batotoVersion = "0.0.65";
|
||||
const _batotoSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/src/all/batoto/batoto.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class ComickFun extends MProvider {
|
||||
ComickFun();
|
||||
ComickFun({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse(
|
||||
"${source.apiUrl}/v1.0/search?sort=follow&page=$page&tachiyomi=true"),
|
||||
|
|
@ -17,7 +19,7 @@ class ComickFun extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse(
|
||||
"${source.apiUrl}/v1.0/search?sort=uploaded&page=$page&tachiyomi=true"),
|
||||
|
|
@ -27,8 +29,7 @@ class ComickFun extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
if (query.isNotEmpty) {
|
||||
|
|
@ -112,7 +113,7 @@ class ComickFun extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"1": 0, "2": 1, "3": 3, "4": 2}
|
||||
];
|
||||
|
|
@ -187,7 +188,7 @@ class ComickFun extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.apiUrl}/chapter/$url?tachiyomi=true"),
|
||||
headers: getHeader(url)))
|
||||
|
|
@ -224,7 +225,7 @@ class ComickFun extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("The filter is ignored when using text search."),
|
||||
GroupFilter("GenreFilter", "Genre", [
|
||||
|
|
@ -652,6 +653,6 @@ Map<String, String> getHeader(String url) {
|
|||
return headers;
|
||||
}
|
||||
|
||||
ComickFun main() {
|
||||
return ComickFun();
|
||||
ComickFun main(MSource source) {
|
||||
return ComickFun(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
const _comickVersion = "0.0.6";
|
||||
const _comickVersion = "0.0.65";
|
||||
const _comickSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/src/all/comick/comick.dart";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,21 +2,23 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class MangaDex extends MProvider {
|
||||
MangaDex();
|
||||
MangaDex({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
page = (20 * (page - 1));
|
||||
final url =
|
||||
"https://api.mangadex.org/manga?limit=20&offset=$page&availableTranslatedLanguage[]=${source.lang}&includes[]=cover_art${preferenceContentRating(source.id)}${preferenceOriginalLanguages(source.id)}&order[followedCount]=desc";
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
return mangaRes(res, source);
|
||||
return mangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
page = (20 * (page - 1));
|
||||
final url =
|
||||
"https://api.mangadex.org/chapter?limit=20&offset=$page&translatedLanguage[]=${source.lang}&includeFutureUpdates=0&order[publishAt]=desc&includeFuturePublishAt=0&includeEmptyPages=0";
|
||||
|
|
@ -31,12 +33,11 @@ class MangaDex extends MProvider {
|
|||
final newUrl =
|
||||
"https://api.mangadex.org/manga?includes[]=cover_art&limit=${mangaIds.length}${preferenceContentRating(source.id)}${preferenceOriginalLanguages(source.id)}$mangaIdss";
|
||||
final res = (await client.get(Uri.parse(newUrl))).body;
|
||||
return mangaRes(res, source);
|
||||
return mangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
page = (20 * (page - 1));
|
||||
final filters = filterList.filters;
|
||||
String url = "";
|
||||
|
|
@ -140,11 +141,11 @@ class MangaDex extends MProvider {
|
|||
}
|
||||
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
return mangaRes(res, source);
|
||||
return mangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"ongoing": 0, "completed": 1, "hiatus": 2, "cancelled": 3}
|
||||
];
|
||||
|
|
@ -222,7 +223,7 @@ class MangaDex extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("https://api.mangadex.org/at-home/server/$url")))
|
||||
.body;
|
||||
|
|
@ -235,7 +236,7 @@ class MangaDex extends MProvider {
|
|||
return chapterDatas.map((e) => "$host/data/$hash/$e").toList();
|
||||
}
|
||||
|
||||
MPages mangaRes(String res, MSource source) {
|
||||
MPages mangaRes(String res) {
|
||||
final datasRes = getMapValue(res, "data", encode: true);
|
||||
|
||||
final resJson = json.decode(datasRes) as List;
|
||||
|
|
@ -362,7 +363,7 @@ class MangaDex extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
CheckBoxFilter(
|
||||
"Has available chapters", "", "HasAvailableChaptersFilter"),
|
||||
|
|
@ -505,7 +506,7 @@ class MangaDex extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences(MSource source) {
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "cover_quality",
|
||||
|
|
@ -589,6 +590,6 @@ class MangaDex extends MProvider {
|
|||
}
|
||||
}
|
||||
|
||||
MangaDex main() {
|
||||
return MangaDex();
|
||||
MangaDex main(MSource source) {
|
||||
return MangaDex(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import '../../../../model/source.dart';
|
|||
const _apiUrl = 'https://api.mangadex.org';
|
||||
const _baseUrl = 'https://mangadex.org';
|
||||
const _isNsfw = true;
|
||||
const _mangadexVersion = "0.0.65";
|
||||
const _mangadexVersion = "0.0.7";
|
||||
const _mangadexSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/src/all/mangadex/mangadex.dart";
|
||||
String _iconUrl =
|
||||
|
|
|
|||
BIN
manga/src/all/nhentai/icon.png
Normal file
BIN
manga/src/all/nhentai/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3 KiB |
245
manga/src/all/nhentai/nhentai.dart
Normal file
245
manga/src/all/nhentai/nhentai.dart
Normal file
|
|
@ -0,0 +1,245 @@
|
|||
import 'package:mangayomi/bridge_lib.dart';
|
||||
|
||||
class NHentai extends MProvider {
|
||||
NHentai(this.source);
|
||||
|
||||
final MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
bool get supportsLatest => true;
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final nhLang = source.lang == "all"
|
||||
? "/search/?q=\"\"&sort=popular&"
|
||||
: "/language/${getLanguage()}/popular?";
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}${nhLang}page=$page")))
|
||||
.body;
|
||||
return parseMangaList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final nhLang = source.lang == "all" ? "/?" : "/language/${getLanguage()}/?";
|
||||
final res =
|
||||
(await client.get(Uri.parse("${source.baseUrl}${nhLang}page=$page")))
|
||||
.body;
|
||||
return parseMangaList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
final fixedQuery = query.isEmpty ? "\"\"" : query.trim();
|
||||
final nhLang = source.lang == "all" ? "" : "+${getLanguage()} ";
|
||||
String url = "${source.baseUrl}/";
|
||||
final isFavoriteFilter =
|
||||
filters.where((e) => e.type == "FavoriteFilter").toList().first.state;
|
||||
final isOkayToSort = filters
|
||||
.where((e) => e.type == "UploadedFilter")
|
||||
.toList()
|
||||
.first
|
||||
.state
|
||||
.isEmpty;
|
||||
|
||||
String advQuery = "";
|
||||
for (var filter in filters) {
|
||||
if (filter.type == "TextFilter" || filter.type == "UploadedFilter") {
|
||||
if (filter.state.isNotEmpty) {
|
||||
final splitState = (filter.state as String)
|
||||
.split(",")
|
||||
.where((e) => e.isNotEmpty ? true : false)
|
||||
.toList();
|
||||
String name = filter.name;
|
||||
for (var state in splitState) {
|
||||
final exclude = (state as String).startsWith("-");
|
||||
final text = (state as String).replaceFirst("-", "");
|
||||
if (exclude) advQuery += "-";
|
||||
advQuery += "$name:${text.trim()} ";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isFavoriteFilter) {
|
||||
url += "favorites/?q=$fixedQuery $advQuery&page=$page";
|
||||
} else {
|
||||
url += "search/?q=$fixedQuery $nhLang$advQuery&page=$page";
|
||||
if (isOkayToSort) {
|
||||
final sort =
|
||||
filters.where((e) => e.type == "SortFilter").toList().first;
|
||||
url += sort.values[sort.state].value;
|
||||
}
|
||||
}
|
||||
final res = (await client.get(Uri.parse(url))).body;
|
||||
return parseMangaList(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final cleanTagRegExp = RegExp("\\(.*\\)");
|
||||
MManga manga = MManga();
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}${getUrlWithoutDomain(url)}")))
|
||||
.body;
|
||||
final document = parseHtml(res);
|
||||
final fullTitle =
|
||||
getTitle(document.selectFirst("#info > h1").text.replaceAll("\"", ""));
|
||||
final imageElement =
|
||||
document.selectFirst("#cover > a > img")?.attr("data-src") ?? "";
|
||||
manga.name = fullTitle;
|
||||
manga.imageUrl = imageElement;
|
||||
final artists =
|
||||
document.select("#tags > div:nth-child(3) > span > a .name");
|
||||
manga.artist = artists
|
||||
.map((MElement e) => e.text.replaceAll(cleanTagRegExp, ""))
|
||||
.toList()
|
||||
.join(", ");
|
||||
manga.author = manga.artist;
|
||||
manga.status = MStatus.completed;
|
||||
String description = "Full English and Japanese titles:\n";
|
||||
description += "$fullTitle\n";
|
||||
description += "${document.selectFirst("div#info h2").text}\n\n";
|
||||
description +=
|
||||
"Pages: ${document.selectFirst("#tags > div:nth-child(7) > span > a .name")?.text.replaceAll(cleanTagRegExp, "") ?? ""}\n";
|
||||
description +=
|
||||
"Favorited by: ${document.selectFirst("div#info i.fa-heart + span span").text.replaceAll("(", "").replaceAll(")", "")}\n";
|
||||
final categories =
|
||||
document.select("#tags > div:nth-child(6) > span > a .name");
|
||||
if (categories.isNotEmpty) {
|
||||
description +=
|
||||
"Categories: ${categories.map((MElement e) => e.text.replaceAll(cleanTagRegExp, "")).toList().join(", ")}\n\n";
|
||||
}
|
||||
manga.description = description;
|
||||
final tags = document.select("#tags > div:nth-child(2) > span > a .name");
|
||||
if (tags.isNotEmpty) {
|
||||
manga.genre = tags
|
||||
.map((MElement e) => e.text.replaceAll(cleanTagRegExp, ""))
|
||||
.toList();
|
||||
}
|
||||
final groups = document
|
||||
.select("#tags > div:nth-child(4) > span > a .name")
|
||||
.map((MElement e) => e.text.replaceAll(cleanTagRegExp, ""))
|
||||
.toList()
|
||||
.join(", ");
|
||||
final timeString =
|
||||
substringBefore(substringAfter(res, "datetime=\""), "\">")
|
||||
.replaceAll("T", " ");
|
||||
MChapter chapter = MChapter();
|
||||
chapter.name = "Chapter";
|
||||
chapter.scanlator = groups;
|
||||
chapter.dateUpload =
|
||||
parseDates([timeString], "yyyy-MM-dd HH:mm:ss.SSSSSSZ", "en")[0];
|
||||
chapter.url = getUrlWithoutDomain(url);
|
||||
manga.chapters = [chapter];
|
||||
return manga;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final res = (await client
|
||||
.get(Uri.parse("${source.baseUrl}${getUrlWithoutDomain(url)}")))
|
||||
.body;
|
||||
final document = parseHtml(res);
|
||||
final script = document
|
||||
.select("script")
|
||||
.where((MElement e) => e.outerHtml.contains("media_server"))
|
||||
.toList()
|
||||
.first;
|
||||
final mediaServer = RegExp(r"media_server\s*:\s*(\d+)")
|
||||
.firstMatch(script.outerHtml)
|
||||
?.group(1);
|
||||
List<String> pages = [];
|
||||
final pageDocs = document.select("div.thumbs a > img");
|
||||
for (var pageElement in pageDocs) {
|
||||
pages.add(pageElement.getDataSrc
|
||||
.replaceAll("t.nh", "i.nh")
|
||||
.replaceAll(RegExp("t\\d+.nh"), "i$mediaServer.nh")
|
||||
.replaceAll("t.", "."));
|
||||
}
|
||||
return pages;
|
||||
}
|
||||
|
||||
String getLanguage() {
|
||||
return {"en": "english", "ja": "japanese", "zh": "chinese"}[source.lang];
|
||||
}
|
||||
|
||||
MPages parseMangaList(String res) {
|
||||
List<MManga> mangaList = [];
|
||||
final document = parseHtml(res);
|
||||
final result = document
|
||||
.select("#content .container")
|
||||
.where((MElement e) => e.className == "container index-container")
|
||||
.toList();
|
||||
if (result.isNotEmpty) {
|
||||
for (var element in (result.first as MElement).select(".gallery")) {
|
||||
MManga manga = MManga();
|
||||
manga.name =
|
||||
getTitle(element.selectFirst("a > div").text.replaceAll("\"", ""));
|
||||
manga.link = getUrlWithoutDomain(element.selectFirst("a").getHref);
|
||||
final imageElement = element.selectFirst(".cover img");
|
||||
manga.imageUrl =
|
||||
imageElement?.attr("data-src") ?? imageElement?.attr("src");
|
||||
mangaList.add(manga);
|
||||
}
|
||||
}
|
||||
return MPages(mangaList,
|
||||
document.selectFirst("#content > section.pagination > a.next") != null);
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
HeaderFilter("Separate tags with commas (,)"),
|
||||
HeaderFilter("Prepend with dash (-) to exclude"),
|
||||
TextFilter("TextFilter", "Tags"),
|
||||
TextFilter("TextFilter", "Categories"),
|
||||
TextFilter("TextFilter", "Groups"),
|
||||
TextFilter("TextFilter", "Artists"),
|
||||
TextFilter("TextFilter", "Parodies"),
|
||||
TextFilter("TextFilter", "Characters"),
|
||||
HeaderFilter("Uploaded valid units are h, d, w, m, y."),
|
||||
HeaderFilter("example: (>20d)"),
|
||||
TextFilter("UploadedFilter", "Uploaded"),
|
||||
HeaderFilter("Filter by pages, for example: (>20)"),
|
||||
TextFilter("TextFilter", "Pages"),
|
||||
SeparatorFilter(),
|
||||
SelectFilter("SortFilter", "Sort By", 0, [
|
||||
SelectFilterOption("Popular: All Time", "&sort=popular"),
|
||||
SelectFilterOption("Popular: Week", "&sort=popular-week"),
|
||||
SelectFilterOption("Popular: Today", "&sort=popular-today"),
|
||||
SelectFilterOption("Recent", "&sort=date")
|
||||
]),
|
||||
HeaderFilter("Sort is ignored if favorites only"),
|
||||
CheckBoxFilter("Show favorites only", "true", "FavoriteFilter")
|
||||
];
|
||||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getSourcePreferences() {
|
||||
return [
|
||||
ListPreference(
|
||||
key: "preferred_display_title",
|
||||
title: "Display manga title as:",
|
||||
summary: "",
|
||||
valueIndex: 0,
|
||||
entries: ["Full Title", "Short Title"],
|
||||
entryValues: ["full", "short"]),
|
||||
];
|
||||
}
|
||||
|
||||
String getTitle(String title) {
|
||||
bool displayFullTitle =
|
||||
getPreferenceValue(source.id, "preferred_display_title") == "full";
|
||||
if (displayFullTitle) {
|
||||
return title.trim();
|
||||
}
|
||||
return title.replaceAll(RegExp(r"(\[[^]]*]|[({][^)}]*[)}])"), "").trim();
|
||||
}
|
||||
}
|
||||
|
||||
NHentai main(MSource source) {
|
||||
return NHentai(source);
|
||||
}
|
||||
26
manga/src/all/nhentai/sources.dart
Normal file
26
manga/src/all/nhentai/sources.dart
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
const _nhentaiVersion = "0.0.1";
|
||||
const _nhentaiSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/src/all/nhentai/nhentai.dart";
|
||||
|
||||
String _iconUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/src/all/nhentai/icon.png";
|
||||
const _baseUrl = 'https://nhentai.net';
|
||||
const _isNsfw = true;
|
||||
|
||||
List<String> _languages = ["all", "en", "zh", "ja"];
|
||||
|
||||
List<Source> get nhentaiSourcesList => _nhentaiSourcesList;
|
||||
List<Source> _nhentaiSourcesList = _languages
|
||||
.map((e) => Source(
|
||||
name: 'NHentai',
|
||||
baseUrl: _baseUrl,
|
||||
hasCloudflare: true,
|
||||
lang: e,
|
||||
typeSource: "NHentai",
|
||||
iconUrl: _iconUrl,
|
||||
isNsfw: _isNsfw,
|
||||
version: _nhentaiVersion,
|
||||
sourceCodeUrl: _nhentaiSourceCodeUrl))
|
||||
.toList();
|
||||
|
|
@ -2,12 +2,14 @@ import 'package:mangayomi/bridge_lib.dart';
|
|||
import 'dart:convert';
|
||||
|
||||
class MangaHere extends MProvider {
|
||||
MangaHere();
|
||||
MangaHere({required this.source});
|
||||
|
||||
final Client client = Client();
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(MSource source, int page) async {
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/directory/$page.htm"),
|
||||
headers: getHeader(source.baseUrl)))
|
||||
|
|
@ -33,7 +35,7 @@ class MangaHere extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(MSource source, int page) async {
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.baseUrl}/directory/$page.htm?latest"),
|
||||
headers: getHeader(source.baseUrl)))
|
||||
|
|
@ -59,8 +61,7 @@ class MangaHere extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(
|
||||
MSource source, String query, int page, FilterList filterList) async {
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final filters = filterList.filters;
|
||||
String url = "${source.baseUrl}/search";
|
||||
|
||||
|
|
@ -130,7 +131,7 @@ class MangaHere extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(MSource source, String url) async {
|
||||
Future<MManga> getDetail(String url) async {
|
||||
final statusList = [
|
||||
{"Ongoing": 0, "Completed": 1}
|
||||
];
|
||||
|
|
@ -168,7 +169,7 @@ class MangaHere extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(MSource source, String url) async {
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
final urll = "${source.baseUrl}$url";
|
||||
final res = (await client.get(Uri.parse(urll), headers: headers)).body;
|
||||
|
|
@ -259,7 +260,7 @@ class MangaHere extends MProvider {
|
|||
}
|
||||
|
||||
@override
|
||||
List<dynamic> getFilterList(MSource source) {
|
||||
List<dynamic> getFilterList() {
|
||||
return [
|
||||
SelectFilter("TypeList", "Type", 1, [
|
||||
SelectFilterOption("American Manga", "5"),
|
||||
|
|
@ -335,6 +336,6 @@ Map<String, String> getHeader(String url) {
|
|||
return headers;
|
||||
}
|
||||
|
||||
MangaHere main() {
|
||||
return MangaHere();
|
||||
MangaHere main(MSource source) {
|
||||
return MangaHere(source: source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import '../../../../model/source.dart';
|
||||
|
||||
Source get mangahereSource => _mangahereSource;
|
||||
const _mangahereVersion = "0.0.6";
|
||||
const _mangahereVersion = "0.0.65";
|
||||
const _mangahereSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/src/en/mangahere/mangahere.dart";
|
||||
Source _mangahereSource = Source(
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class Source {
|
|||
this.version = "",
|
||||
this.isManga = true,
|
||||
this.isFullData = false,
|
||||
this.appMinVerReq = "0.1.6",
|
||||
this.appMinVerReq = "0.1.7",
|
||||
this.additionalParams = ""});
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
|
|
|
|||
Loading…
Reference in a new issue