Merge pull request #8 from kodjodevf/Refactor

Refactor
This commit is contained in:
Moustapha Kodjo Amadou
2023-12-20 18:47:30 +01:00
committed by GitHub
280 changed files with 711 additions and 892 deletions

View File

@@ -219,10 +219,12 @@ All control filters can have a default state set. It's usually recommended if th
## Example sources that can help you understand how to create your source
- [Example](https://github.com/kodjodevf/mangayomi-extensions/tree/main/anime/src/en/kisskh)
- [Example](https://github.com/kodjodevf/mangayomi-extensions/blob/main/anime/src/en/kisskh/kisskh.dart)
of Json API usage.
- [Example](https://github.com/kodjodevf/mangayomi-extensions/tree/main/manga/src/en/mangahere)
- [Example](https://github.com/kodjodevf/mangayomi-extensions/blob/main/manga/src/en/mangahere/mangahere.dart)
of pure HTML parsing using xpath selector.
- [Example](https://github.com/kodjodevf/mangayomi-extensions/blob/main/manga/multisrc/madara/madara.dart)
of pure HTML parsing using HTML DOM selector.
## Some functions already available and usable
@@ -286,27 +288,43 @@ final String htmlString = '''
print(xpathRes.first); // https://github.com/kodjodevf
```
`String` querySelector(`String html`, {`required String selector`}, {`required int typeElement`},{`required String attributes`})
```bash
if typeElement == 0 // return querySelector text
if typeElement == 1 // return querySelector innerHtml
if typeElement == 2 // return querySelector outerHtml
if typeElement == 3 // return querySelector attributes
```
### HTML DOM selector
`List<String>` querySelectorAll(`String html`, {`required String selector`}, {`required int typeElement`},{`required String attributes`}, {`required int typeRegExp`})
Example:
```bash
if typeRegExp == 0 you can use :
if typeElement == 0 // return list querySelector text
if typeElement == 1 // return list querySelector innerHtml
if typeElement == 2 // return list querySelector outerHtml
if typeElement == 3 // return list querySelector attributes
else
if typeRegExp == 1 // return list of element of href that match
if typeRegExp == 2 // return list of element of src that match
if typeRegExp == 3 // return list of element of datasrc that match
if typeRegExp == 4 // return list of element of img that match
```
final String htmlString = '''
<html lang="en">
<body>
<div><a href='https://github.com/kodjodevf'>author</a></div>
<div class="head">div head</div>
<div class="container">
<table>
<tbody>
<tr>
<td id="td1" class="first1">1</td>
<td id="td2" class="first1">2</td>
<td id="td3" class="first2">3</td>
<td id="td4" class="first2 form">4</td>
<td id="td5" class="second1">one</td>
<td id="td6" class="second1">two</td>
<td id="td7" class="second2">three</td>
<td id="td8" class="second2">four</td>
</tr>
</tbody>
</table>
</div>
<div class="end">end</div>
</body>
</html>
''';
MDocument document = parseHtml(htmlString);
print(document.selectFirst("a").attr("href")); // https://github.com/kodjodevf
print(document.selectFirst("td").text); // 1
```
See [`MDocument` model](https://github.com/kodjodevf/mangayomi/blob/main/lib/eval/model/document.dart) and [`MElement` model](https://github.com/kodjodevf/mangayomi/blob/main/lib/eval/model/element.dart) to see available methods.
### String utils

View File

@@ -145,13 +145,10 @@ class DataLifeEngine extends MProvider {
}
MPages animeFromElement(String res, String baseUrl) {
final htmls = querySelectorAll(res,
selector: "div#dle-content > div.mov",
typeElement: 1,
attributes: "",
typeRegExp: 0);
final htmls = parseHtml(res).select("div#dle-content > div.mov");
List<MManga> animeList = [];
for (var html in htmls) {
for (var h in htmls) {
final html = h.innerHtml;
final url = xpath(html, '//a/@href').first;
final name = xpath(html, '//a/text()').first;
final image = xpath(html, '//div[contains(@class,"mov")]/img/@src').first;

View File

@@ -1,10 +1,10 @@
import '../../../model/source.dart';
import 'src/frenchanime/frenchanime-v0.0.1.dart';
import 'src/frenchanime/frenchanime.dart';
import 'src/wiflix/wiflix.dart';
const _datalifeengineVersion = "0.0.1";
const _datalifeengineVersion = "0.0.15";
const _datalifeengineSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/datalifeengine/datalifeengine-v$_datalifeengineVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/datalifeengine/datalifeengine.dart";
List<Source> get datalifeengineSourcesList => _datalifeengineSourcesList;
List<Source> _datalifeengineSourcesList = [

View File

@@ -9,5 +9,5 @@ Source _frenchanimeSource = Source(
typeSource: "datalifeengine",
isManga: false,
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/datalifeengine/src/frenchanime/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/datalifeengine/src/frenchanime/icon.png",
);

View File

@@ -9,5 +9,5 @@ Source _wiflixSource = Source(
typeSource: "datalifeengine",
isManga: false,
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/datalifeengine/src/wiflix/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/datalifeengine/src/wiflix/icon.png",
);

View File

@@ -121,14 +121,11 @@ class DopeFlix extends MProvider {
"${preferenceBaseUrl(source.id)}/ajax/v2/season/episodes/$seasonId"
};
final html = await http('GET', json.encode(dataE));
final epsHtml = querySelectorAll(html,
selector: "div.eps-item",
typeElement: 2,
attributes: "",
typeRegExp: 0);
print(
"${preferenceBaseUrl(source.id)}/ajax/v2/season/episodes/$seasonId");
for (var epHtml in epsHtml) {
final epsHtmls = parseHtml(html).select("div.eps-item");
for (var epH in epsHtmls) {
final epHtml = epH.outerHtml;
final episodeId =
xpath(epHtml, '//div[contains(@class,"eps-item")]/@data-id')
.first;
@@ -152,13 +149,11 @@ class DopeFlix extends MProvider {
url = Uri.parse(url).path;
final res = await http(
'GET', json.encode({"url": "${preferenceBaseUrl(source.id)}/$url"}));
final vidsHtml = querySelectorAll(res,
selector: "ul.fss-list a.btn-play",
typeElement: 2,
attributes: "",
typeRegExp: 0);
final vidsHtmls = parseHtml(res).select("ul.fss-list a.btn-play");
List<MVideo> videos = [];
for (var vidHtml in vidsHtml) {
for (var vidH in vidsHtmls) {
final vidHtml = vidH.outerHtml;
final id = xpath(vidHtml, '//a/@data-id').first;
final name = xpath(vidHtml, '//span/text()').first;
final resSource = await http(

View File

@@ -2,9 +2,9 @@ import '../../../model/source.dart';
import 'src/dopebox/dopebox.dart';
import 'src/sflix/sflix.dart';
const _dopeflixVersion = "0.0.25";
const _dopeflixVersion = "0.0.3";
const _dopeflixSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/dopeflix/dopeflix-v$_dopeflixVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/dopeflix/dopeflix.dart";
List<Source> get dopeflixSourcesList => _dopeflixSourcesList;
List<Source> _dopeflixSourcesList = [

View File

@@ -9,5 +9,5 @@ Source _dopeboxSource = Source(
typeSource: "dopeflix",
isManga: false,
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/dopeflix/src/dopebox/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/dopeflix/src/dopebox/icon.png",
);

View File

@@ -9,5 +9,5 @@ Source _sflixSource = Source(
typeSource: "dopeflix",
isManga: false,
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/dopeflix/src/sflix/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/dopeflix/src/sflix/icon.png",
);

View File

@@ -2,9 +2,9 @@ import '../../../model/source.dart';
import 'src/aniwatch/aniwatch.dart';
import 'src/kaido/kaido.dart';
const _zorothemeVersion = "0.0.6";
const _zorothemeVersion = "0.0.65";
const _zorothemeSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/zorotheme/zorotheme-v$_zorothemeVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/zorotheme/zorotheme.dart";
List<Source> get zorothemeSourcesList => _zorothemeSourcesList;
List<Source> _zorothemeSourcesList = [

View File

@@ -9,5 +9,5 @@ Source _aniwatchSource = Source(
lang: "en",
typeSource: "zorotheme",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/zorotheme/src/aniwatch/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/zorotheme/src/aniwatch/icon.png",
);

View File

@@ -9,5 +9,5 @@ Source _kaidoSource = Source(
isManga: false,
typeSource: "zorotheme",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/multisrc/zorotheme/src/kaido/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/multisrc/zorotheme/src/kaido/icon.png",
);

View File

@@ -155,36 +155,17 @@ class ZoroTheme extends MProvider {
final resEp = await http('GET', json.encode(dataEp));
final html = json.decode(resEp)["html"];
final epElements = parseHtml(html).select("a.ep-item");
final epUrls = querySelectorAll(html,
selector: "a.ep-item",
typeElement: 3,
attributes: "href",
typeRegExp: 0);
final numbers = querySelectorAll(html,
selector: "a.ep-item",
typeElement: 3,
attributes: "data-number",
typeRegExp: 0);
final titles = querySelectorAll(html,
selector: "a.ep-item",
typeElement: 3,
attributes: "title",
typeRegExp: 0);
List<String> episodes = [];
for (var i = 0; i < titles.length; i++) {
final number = numbers[i];
final title = titles[i];
episodes.add("Episode $number: $title");
}
List<MChapter>? episodesList = [];
for (var i = 0; i < episodes.length; i++) {
for (var epElement in epElements) {
final number = epElement.attr("data-number");
final title = epElement.attr("title");
MChapter episode = MChapter();
episode.name = episodes[i];
episode.url = epUrls[i];
episode.name = "Episode $number: $title";
episode.url = epElement.getHref;
episodesList.add(episode);
}
@@ -204,31 +185,15 @@ class ZoroTheme extends MProvider {
final res = await http('GET', json.encode(datas));
final html = json.decode(res)["html"];
final names = querySelectorAll(html,
selector: "div.server-item",
typeElement: 0,
attributes: "",
typeRegExp: 0);
final ids = querySelectorAll(html,
selector: "div.server-item",
typeElement: 3,
attributes: "data-id",
typeRegExp: 0);
final subDubs = querySelectorAll(html,
selector: "div.server-item",
typeElement: 3,
attributes: "data-type",
typeRegExp: 0);
final serverElements = parseHtml(html).select("div.server-item");
List<MVideo> videos = [];
final hosterSelection = preferenceHosterSelection(source.id);
final typeSelection = preferenceTypeSelection(source.id);
for (var i = 0; i < names.length; i++) {
final name = names[i];
final id = ids[i];
final subDub = subDubs[i];
for (var serverElement in serverElements) {
final name = serverElement.text;
final id = serverElement.attr("data-id");
final subDub = serverElement.attr("data-type");
final datasE = {
"url":
"${source.baseUrl}/ajax${ajaxRoute('${source.baseUrl}')}/episode/sources?id=$id",
@@ -237,7 +202,6 @@ class ZoroTheme extends MProvider {
final resE = await http('GET', json.encode(datasE));
String epUrl = substringBefore(substringAfter(resE, "\"link\":\""), "\"");
List<MVideo> a = [];
if (hosterSelection.contains(name) && typeSelection.contains(subDub)) {

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get okanimeSource => _okanimeSource;
const _okanimeVersion = "0.0.35";
const _okanimeVersion = "0.0.4";
const _okanimeSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/ar/okanime/okanime-v$_okanimeVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/ar/okanime/okanime.dart";
Source _okanimeSource = Source(
name: "Okanime",
baseUrl: "https://www.okanime.xyz",
lang: "ar",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/ar/okanime/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/ar/okanime/icon.png",
sourceCodeUrl: _okanimeSourceCodeUrl,
version: _okanimeVersion,
isManga: false);

View File

@@ -119,26 +119,21 @@ class Aniwave extends MProvider {
}
anime.genre = xpath(res, '//div[contains(text(),"Genre")]/span/a/text()');
final id = querySelectorAll(res,
selector: "div[data-id]",
typeElement: 3,
attributes: "data-id",
typeRegExp: 0)
.first;
final id = parseHtml(res).selectFirst("div[data-id]").attr("data-id");
final encrypt = vrfEncrypt(id);
final vrf = "vrf=${Uri.encodeComponent(encrypt)}";
final dataEp = {
"url": "${preferenceBaseUrl(source.id)}/ajax/episode/list/$id?$vrf"
};
final resEp = await http('GET', json.encode(dataEp));
final html = json.decode(resEp)["result"];
List<MChapter>? episodesList = [];
final epsHtml = querySelectorAll(html,
selector: "div.episodes ul > li",
typeElement: 2,
attributes: "",
typeRegExp: 0);
for (var epHtml in epsHtml) {
final epsHtmls = parseHtml(html).select("div.episodes ul > li");
for (var epH in epsHtmls) {
final epHtml = epH.outerHtml;
final title = xpath(epHtml, '//li/@title').isNotEmpty
? xpath(epHtml, '//li/@title').first
: "";
@@ -183,13 +178,12 @@ class Aniwave extends MProvider {
"url": "${preferenceBaseUrl(source.id)}/ajax/server/list/$ids?$vrf"
}));
final html = json.decode(res)["result"];
final vidsHtml = querySelectorAll(html,
selector: "div.servers > div",
typeElement: 2,
attributes: "",
typeRegExp: 0);
final vidsHtmls = parseHtml(html).select("div.servers > div");
List<MVideo> videos = [];
for (var vidHtml in vidsHtml) {
for (var vidH in vidsHtmls) {
final vidHtml = vidH.outerHtml;
final type = xpath(vidHtml, '//div/@data-type').first;
final serversIds = xpath(vidHtml, '//li/@data-link-id');
for (int i = 0; i < serversIds.length; i++) {

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get aniwave => _aniwave;
const _aniwaveVersion = "0.0.25";
const _aniwaveVersion = "0.0.3";
const _aniwaveCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/aniwave/aniwave-v$_aniwaveVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/aniwave/aniwave.dart";
Source _aniwave = Source(
name: "Aniwave",
baseUrl: "https://aniwave.to",
lang: "en",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/aniwave/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/aniwave/icon.png",
sourceCodeUrl: _aniwaveCodeUrl,
version: _aniwaveVersion,
isManga: false);

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get gogoanimeSource => _gogoanimeSource;
const _gogoanimeVersion = "0.0.55";
const _gogoanimeVersion = "0.0.6";
const _gogoanimeSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/gogoanime/gogoanime-v$_gogoanimeVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/gogoanime/gogoanime.dart";
Source _gogoanimeSource = Source(
name: "Gogoanime",
baseUrl: "https://gogoanime3.net",
lang: "en",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/gogoanime/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/gogoanime/icon.png",
sourceCodeUrl: _gogoanimeSourceCodeUrl,
version: _gogoanimeVersion,
isManga: false);

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get kisskhSource => _kisskhSource;
const _kisskhVersion = "0.0.4";
const _kisskhVersion = "0.0.45";
const _kisskhSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/kisskh/kisskh-v$_kisskhVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/kisskh/kisskh.dart";
Source _kisskhSource = Source(
name: "KissKH",
baseUrl: "https://kisskh.co",
lang: "en",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/kisskh/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/kisskh/icon.png",
sourceCodeUrl: _kisskhSourceCodeUrl,
version: _kisskhVersion,
isManga: false);

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get uhdmoviesSource => _uhdmoviesSource;
const _uhdmoviesVersion = "0.0.15";
const _uhdmoviesVersion = "0.0.2";
const _uhdmoviesSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/uhdmovies/uhdmovies-v$_uhdmoviesVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/uhdmovies/uhdmovies.dart";
Source _uhdmoviesSource = Source(
name: "UHD Movies",
baseUrl: "https://uhdmovies.zip",
lang: "en",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/en/uhdmovies/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/en/uhdmovies/icon.png",
sourceCodeUrl: _uhdmoviesSourceCodeUrl,
version: _uhdmoviesVersion,
isManga: false);

View File

@@ -197,12 +197,9 @@ class UHDMovies extends MProvider {
"url": nextUrl,
"headers": {"referer": url, "Cookie": "$cookieName=$cookieValue"}
}));
final lastRes = querySelectorAll(response,
selector: "meta[http-equiv]",
typeElement: 3,
attributes: "content",
typeRegExp: 0)
.first;
final lastRes =
parseHtml(response).selectFirst("meta[http-equiv]").attr("content");
return substringAfter(lastRes, "url=");
}

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get animesultraSource => _animesultraSource;
const _animesultraVersion = "0.0.45";
const _animesultraVersion = "0.0.5";
const _animesultraSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/animesultra/animesultra-v$_animesultraVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/animesultra/animesultra.dart";
Source _animesultraSource = Source(
name: "AnimesUltra",
baseUrl: "https://ww.animesultra.net",
lang: "fr",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/animesultra/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/animesultra/icon.png",
sourceCodeUrl: _animesultraSourceCodeUrl,
version: _animesultraVersion,
isManga: false,

View File

@@ -1,9 +1,9 @@
import '../../../../model/source.dart';
Source get franimeSource => _franimeSource;
const _franimeVersion = "0.0.5";
const _franimeVersion = "0.0.55";
const _franimeSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/franime/franime-v$_franimeVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/franime/franime.dart";
Source _franimeSource = Source(
name: "FrAnime",
baseUrl: "https://franime.fr",
@@ -11,7 +11,7 @@ Source _franimeSource = Source(
lang: "fr",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/franime/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/franime/icon.png",
sourceCodeUrl: _franimeSourceCodeUrl,
version: _franimeVersion,
isManga: false,

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get otakufr => _otakufr;
const otakufrVersion = "0.0.55";
const otakufrVersion = "0.0.6";
const otakufrCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/otakufr/otakufr-v$otakufrVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/otakufr/otakufr.dart";
Source _otakufr = Source(
name: "OtakuFr",
baseUrl: "https://otakufr.co",
lang: "fr",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/fr/otakufr/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/fr/otakufr/icon.png",
sourceCodeUrl: otakufrCodeUrl,
version: otakufrVersion,
isManga: false,

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get nimegami => _nimegami;
const _nimegamiVersion = "0.0.3";
const _nimegamiVersion = "0.0.35";
const _nimegamiCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/nimegami/nimegami-v$_nimegamiVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/nimegami/nimegami.dart";
Source _nimegami = Source(
name: "NimeGami",
baseUrl: "https://nimegami.id",
lang: "id",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/nimegami/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/nimegami/icon.png",
sourceCodeUrl: _nimegamiCodeUrl,
version: _nimegamiVersion,
isManga: false);

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get oploverz => _oploverz;
const _oploverzVersion = "0.0.25";
const _oploverzVersion = "0.0.3";
const _oploverzCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/oploverz/oploverz-v$_oploverzVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/oploverz/oploverz.dart";
Source _oploverz = Source(
name: "Oploverz",
baseUrl: "https://oploverz.red",
lang: "id",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/oploverz/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/oploverz/icon.png",
sourceCodeUrl: _oploverzCodeUrl,
version: _oploverzVersion,
isManga: false);

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get otakudesu => _otakudesu;
const _otakudesuVersion = "0.0.3";
const _otakudesuVersion = "0.0.35";
const _otakudesuCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/otakudesu/otakudesu-v$_otakudesuVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/otakudesu/otakudesu.dart";
Source _otakudesu = Source(
name: "OtakuDesu",
baseUrl: "https://otakudesu.cam",
lang: "id",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/id/otakudesu/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/id/otakudesu/icon.png",
sourceCodeUrl: _otakudesuCodeUrl,
version: _otakudesuVersion,
isManga: false);

View File

@@ -197,12 +197,7 @@ class AnimeSaturn extends MProvider {
if (resVid.contains("jwplayer(")) {
masterUrl = substringBefore(substringAfter(resVid, "file: \""), "\"");
} else {
masterUrl = querySelectorAll(resVid,
selector: "source",
typeElement: 3,
attributes: "src",
typeRegExp: 0)
.first;
masterUrl = parseHtml(resVid).selectFirst("source").attr("src");
}
List<MVideo> videos = [];

View File

@@ -1,16 +1,16 @@
import '../../../../model/source.dart';
Source get animesaturn => _animesaturn;
const _animesaturnVersion = "0.0.15";
const _animesaturnVersion = "0.0.2";
const _animesaturnCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/it/animesaturn/animesaturn-v$_animesaturnVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/it/animesaturn/animesaturn.dart";
Source _animesaturn = Source(
name: "AnimeSaturn",
baseUrl: "https://www.animesaturn.tv",
lang: "it",
typeSource: "single",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/anime/src/it/animesaturn/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/anime/src/it/animesaturn/icon.png",
sourceCodeUrl: _animesaturnCodeUrl,
version: _animesaturnVersion,
isManga: false);

File diff suppressed because one or more lines are too long

View File

@@ -148,14 +148,13 @@ class HeanCms extends MProvider {
res = await http('GET', json.encode(data));
List<String> pageUrls = [];
var imagesRes = querySelectorAll(res,
selector: "div.min-h-screen > div.container > p.items-center",
typeElement: 1,
attributes: "",
typeRegExp: 0);
pageUrls = xpath(imagesRes.first, '//img/@src');
var imagesRes = parseHtml(res)
.selectFirst("div.min-h-screen > div.container > p.items-center")
.innerHtml;
pageUrls.addAll(xpath(imagesRes.first, '//img/@data-src'));
pageUrls = xpath(imagesRes, '//img/@src');
pageUrls.addAll(xpath(imagesRes, '//img/@data-src'));
return pageUrls.where((e) => e.isNotEmpty).toList();
}

View File

@@ -3,9 +3,9 @@ import 'src/yugenmangas/yugenmangas.dart';
import 'src/omegascans/omegascans.dart';
import 'src/perfscan/perfscan.dart';
const heancmsVersion = "0.0.45";
const heancmsVersion = "0.0.5";
const heancmsSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/heancms/heancms-v$heancmsVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/heancms/heancms.dart";
List<Source> get heancmsSourcesList => _heancmsSourcesList;
List<Source> _heancmsSourcesList = [

View File

@@ -10,7 +10,7 @@ Source _omegascansSource = Source(
isNsfw: true,
typeSource: "heancms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/heancms/src/omegascans/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/heancms/src/omegascans/icon.png",
dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
dateFormatLocale: "en",
);

View File

@@ -9,7 +9,7 @@ Source _perfscanSource = Source(
lang: "fr",
typeSource: "heancms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/heancms/src/perfscan/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/heancms/src/perfscan/icon.png",
dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
dateFormatLocale: "en",
);

View File

@@ -10,7 +10,7 @@ Source _yugenmangasSource = Source(
isNsfw: true,
typeSource: "heancms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/heancms/src/yugenmangas/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/heancms/src/yugenmangas/icon.png",
dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
dateFormatLocale: "en",
);

View File

@@ -1,402 +0,0 @@
import 'package:mangayomi/bridge_lib.dart';
import 'dart:convert';
class Madara extends MProvider {
Madara();
@override
Future<MPages> getPopular(MSource source, int page) async {
final url = "${source.baseUrl}/manga/page/$page/?m_orderby=views";
final data = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(data));
List<MManga> mangaList = [];
final urls = xpath(res, '//*[@class^="post-title"]/h3/a/@href');
final names = xpath(res, '//*[@id^="manga-item"]/a/@title');
var images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-src');
if (images.isEmpty) {
images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-lazy-src');
if (images.isEmpty) {
images = xpath(res, '//*[@id^="manga-item"]/a/img/@srcset');
if (images.isEmpty) {
images = xpath(res, '//*[@id^="manga-item"]/a/img/@src');
}
}
}
for (var i = 0; i < names.length; i++) {
MManga manga = MManga();
manga.name = names[i];
manga.imageUrl = substringBefore(images[i], " ");
manga.link = urls[i];
mangaList.add(manga);
}
return MPages(mangaList, true);
}
@override
Future<MPages> getLatestUpdates(MSource source, int page) async {
final url = "${source.baseUrl}/manga/page/$page/?m_orderby=latest";
final data = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(data));
List<MManga> mangaList = [];
final urls = xpath(res, '//*[@class^="post-title"]/h3/a/@href');
final names = xpath(res, '//*[@id^="manga-item"]/a/@title');
var images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-src');
if (images.isEmpty) {
images = xpath(res, '//*[@id^="manga-item"]/a/img/@data-lazy-src');
if (images.isEmpty) {
images = xpath(res, '//*[@id^="manga-item"]/a/img/@srcset');
if (images.isEmpty) {
images = xpath(res, '//*[@id^="manga-item"]/a/img/@src');
}
}
}
for (var i = 0; i < names.length; i++) {
MManga manga = MManga();
manga.name = names[i];
manga.imageUrl = substringBefore(images[i], " ");
manga.link = urls[i];
mangaList.add(manga);
}
return MPages(mangaList, true);
}
@override
Future<MPages> search(
MSource source, String query, int page, FilterList filterList) async {
final filters = filterList.filters;
String url = "${source.baseUrl}/?s=$query&post_type=wp-manga";
for (var filter in filters) {
if (filter.type == "AuthorFilter") {
if (filter.state.isNotEmpty) {
url += "${ll(url)}author=${Uri.encodeComponent(filter.state)}";
}
} else if (filter.type == "ArtistFilter") {
if (filter.state.isNotEmpty) {
url += "${ll(url)}artist=${Uri.encodeComponent(filter.state)}";
}
} else if (filter.type == "YearFilter") {
if (filter.state.isNotEmpty) {
url += "${ll(url)}release=${Uri.encodeComponent(filter.state)}";
}
} else if (filter.type == "StatusFilter") {
final status = (filter.state as List).where((e) => e.state).toList();
if (status.isNotEmpty) {
for (var st in status) {
url += "${ll(url)}status[]=${st.value},";
}
}
} else if (filter.type == "OrderByFilter") {
if (filter.state != 0) {
final order = filter.values[filter.state].value;
url += "${ll(url)}m_orderby=$order";
}
} else if (filter.type == "AdultContentFilter") {
final ctn = filter.values[filter.state].value;
if (ctn.isNotEmpty) {
url += "${ll(url)}adult=$ctn";
}
} else if (filter.type == "GenreListFilter") {
final genres = (filter.state as List).where((e) => e.state).toList();
if (genres.isNotEmpty) {
for (var genre in genres) {
url += "${ll(url)}genre[]=${genre.value},";
}
}
}
}
final data = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(data));
List<MManga> mangaList = [];
final urls = xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/@href');
final names = xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/@title');
var images =
xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@data-src');
if (images.isEmpty) {
images = xpath(
res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@data-lazy-src');
if (images.isEmpty) {
images =
xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@srcset');
if (images.isEmpty) {
images =
xpath(res, '//*[@class^="tab-thumb c-image-hover"]/a/img/@src');
}
}
}
for (var i = 0; i < names.length; i++) {
MManga manga = MManga();
manga.name = names[i];
manga.imageUrl = substringBefore(images[i], " ");
manga.link = urls[i];
mangaList.add(manga);
}
return MPages(mangaList, true);
}
@override
Future<MManga> getDetail(MSource source, String url) async {
final statusList = [
{
"OnGoing": 0,
"Продолжается": 0,
"Updating": 0,
"Em Lançamento": 0,
"Em lançamento": 0,
"Em andamento": 0,
"Em Andamento": 0,
"En cours": 0,
"Ativo": 0,
"Lançando": 0,
"Đang Tiến Hành": 0,
"Devam Ediyor": 0,
"Devam ediyor": 0,
"In Corso": 0,
"In Arrivo": 0,
"مستمرة": 0,
"مستمر": 0,
"En Curso": 0,
"En curso": 0,
"Emision": 0,
"En marcha": 0,
"Publicandose": 0,
"En emision": 0,
"连载中": 0,
"Completed": 1,
"Completo": 1,
"Completado": 1,
"Concluído": 1,
"Concluido": 1,
"Finalizado": 1,
"Terminé": 1,
"Hoàn Thành": 1,
"مكتملة": 1,
"مكتمل": 1,
"已完结": 1,
"On Hold": 2,
"Pausado": 2,
"En espera": 2,
"Canceled": 3,
"Cancelado": 3,
}
];
MManga manga = MManga();
String res = "";
final datas = {"url": url, "sourceId": source.id};
res = await http('GET', json.encode(datas));
final author = querySelectorAll(res,
selector: "div.author-content > a",
typeElement: 0,
attributes: "",
typeRegExp: 0);
if (author.isNotEmpty) {
manga.author = author.first;
}
final description = querySelectorAll(res,
selector:
"div.description-summary div.summary__content, div.summary_content div.post-content_item > h5 + div, div.summary_content div.manga-excerpt, div.sinopsis div.contenedor, .description-summary > p",
typeElement: 0,
attributes: "",
typeRegExp: 0);
if (description.isNotEmpty) {
manga.description = description.first;
}
final imageUrl = querySelectorAll(res,
selector: "div.summary_image img",
typeElement: 2,
attributes: "",
typeRegExp: 2);
if (imageUrl.isNotEmpty) {
manga.imageUrl = imageUrl.first;
}
String mangaId = "";
final id = querySelectorAll(res,
selector: "div[id^=manga-chapters-holder]",
typeElement: 3,
attributes: "data-id",
typeRegExp: 0);
if (id.isNotEmpty) {
mangaId = id.first;
}
final status = querySelectorAll(res,
selector: "div.summary-content",
typeElement: 0,
attributes: "",
typeRegExp: 0);
if (status.isNotEmpty) {
manga.status = parseStatus(status.last, statusList);
}
manga.genre = querySelectorAll(res,
selector: "div.genres-content a",
typeElement: 0,
attributes: "",
typeRegExp: 0);
final baseUrl = "${source.baseUrl}/";
final headers = {
"Referer": baseUrl,
"Content-Type": "application/x-www-form-urlencoded",
"X-Requested-With": "XMLHttpRequest"
};
final urll =
"${baseUrl}wp-admin/admin-ajax.php?action=manga_get_chapters&manga=$mangaId";
final datasP = {"url": urll, "headers": headers, "sourceId": source.id};
res = await http('POST', json.encode(datasP));
print("datasP");
if (res == "error" || mangaId.isEmpty) {
final urlP = "${url}ajax/chapters";
final datasP = {"url": urlP, "headers": headers, "sourceId": source.id};
res = await http('POST', json.encode(datasP));
}
var chapUrls = xpath(res, '//li[@class^="wp-manga-chapter"]/a/@href');
var chaptersNames = xpath(res, '//li[@class^="wp-manga-chapter"]/a/text()');
var dateF = xpath(res, '//li[@class^="wp-manga-chapter"]/span/i/text()');
if (dateF.isEmpty) {
final resWebview = await getHtmlViaWebview(
url, "//*[@id='manga-chapters-holder']/div[2]/div/ul/li/a/@href");
chapUrls = xpath(resWebview,
"//*[@id='manga-chapters-holder']/div[2]/div/ul/li/a/@href");
chaptersNames = xpath(resWebview,
"//*[@id='manga-chapters-holder']/div[2]/div/ul/li/a/text()");
dateF = xpath(resWebview,
"//*[@id='manga-chapters-holder']/div[2]/div/ul/li/span/i/text()");
}
List<String> dateUploads = [];
if (source.dateFormat.isNotEmpty) {
dateUploads =
parseDates(dateF, source.dateFormat, source.dateFormatLocale);
if (dateF.length < chaptersNames.length) {
final length = chaptersNames.length - dateF.length;
String date = "${DateTime.now().millisecondsSinceEpoch}";
for (var i = 0; i < length - 1; i++) {
date += "--..${DateTime.now().millisecondsSinceEpoch}";
}
final dateFF =
parseDates(dateF, source.dateFormat, source.dateFormatLocale);
List<String> chapterDate = date.split('--..');
for (var date in dateFF) {
chapterDate.add(date);
}
dateUploads = chapterDate;
}
}
List<MChapter>? chaptersList = [];
for (var i = 0; i < chaptersNames.length; i++) {
MChapter chapter = MChapter();
chapter.name = chaptersNames[i];
chapter.url = chapUrls[i];
if (source.dateFormat.isNotEmpty) chapter.dateUpload = dateUploads[i];
chaptersList.add(chapter);
}
manga.chapters = chaptersList;
return manga;
}
@override
Future<List<String>> getPageList(MSource source, String url) async {
final datas = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(datas));
final pagesSelectorRes = querySelectorAll(res,
selector:
"div.page-break, li.blocks-gallery-item, .reading-content, .text-left img",
typeElement: 1,
attributes: "",
typeRegExp: 0)
.first;
final imgs = querySelectorAll(pagesSelectorRes,
selector: "img", typeElement: 2, attributes: "", typeRegExp: 2);
List<String> pageUrls = [];
if (imgs.length == 1) {
final pages = querySelectorAll(res,
selector: "#single-pager",
typeElement: 2,
attributes: "",
typeRegExp: 0)
.first;
final pagesNumber = querySelectorAll(pages,
selector: "option", typeElement: 2, attributes: "", typeRegExp: 0);
for (var i = 0; i < pagesNumber.length; i++) {
final val = i + 1;
if (i.toString().length == 1) {
pageUrls.add(querySelectorAll(pagesSelectorRes,
selector: "img",
typeElement: 2,
attributes: "",
typeRegExp: 2)
.first
.replaceAll("01", '0$val'));
} else {
pageUrls.add(querySelectorAll(pagesSelectorRes,
selector: "img",
typeElement: 2,
attributes: "",
typeRegExp: 2)
.first
.replaceAll("01", val.toString()));
}
}
} else {
return imgs;
}
return pageUrls;
}
@override
List<dynamic> getFilterList(MSource source) {
return [
TextFilter("AuthorFilter", "Author"),
TextFilter("ArtistFilter", "Artist"),
TextFilter("YearFilter", "Year of Released"),
GroupFilter("StatusFilter", "Status", [
CheckBoxFilter("Completed", "end"),
CheckBoxFilter("Ongoing", "on-going"),
CheckBoxFilter("Canceled", "canceled"),
CheckBoxFilter("On Hold", "on-hold"),
]),
SelectFilter("OrderByFilter", "Order By", 0, [
SelectFilterOption("Relevance", ""),
SelectFilterOption("Latest", "latest"),
SelectFilterOption("A-Z", "alphabet"),
SelectFilterOption("Rating", "rating"),
SelectFilterOption("Trending", "trending"),
SelectFilterOption("Most Views", "views"),
SelectFilterOption("New", "new-manga"),
]),
SelectFilter("AdultContentFilter", "Adult Content", 0, [
SelectFilterOption("All", ""),
SelectFilterOption("None", "0"),
SelectFilterOption("Only", "1"),
])
];
}
String ll(String url) {
if (url.contains("?")) {
return "&";
}
return "?";
}
}
Madara main() {
return Madara();
}

View File

@@ -0,0 +1,303 @@
import 'package:mangayomi/bridge_lib.dart';
import 'dart:convert';
class Madara extends MProvider {
Madara();
@override
Future<MPages> getPopular(MSource source, int page) async {
final url = "${source.baseUrl}/manga/page/$page/?m_orderby=views";
final data = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(data));
final document = parseHtml(res);
return mangaFromElements(document.select("div.page-item-detail"));
}
@override
Future<MPages> getLatestUpdates(MSource source, int page) async {
final url = "${source.baseUrl}/manga/page/$page/?m_orderby=latest";
final data = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(data));
final document = parseHtml(res);
return mangaFromElements(document.select("div.page-item-detail"));
}
@override
Future<MPages> search(
MSource source, String query, int page, FilterList filterList) async {
final filters = filterList.filters;
String url = "${source.baseUrl}/?s=$query&post_type=wp-manga";
for (var filter in filters) {
if (filter.type == "AuthorFilter") {
if (filter.state.isNotEmpty) {
url += "${ll(url)}author=${Uri.encodeComponent(filter.state)}";
}
} else if (filter.type == "ArtistFilter") {
if (filter.state.isNotEmpty) {
url += "${ll(url)}artist=${Uri.encodeComponent(filter.state)}";
}
} else if (filter.type == "YearFilter") {
if (filter.state.isNotEmpty) {
url += "${ll(url)}release=${Uri.encodeComponent(filter.state)}";
}
} else if (filter.type == "StatusFilter") {
final status = (filter.state as List).where((e) => e.state).toList();
if (status.isNotEmpty) {
for (var st in status) {
url += "${ll(url)}status[]=${st.value},";
}
}
} else if (filter.type == "OrderByFilter") {
if (filter.state != 0) {
final order = filter.values[filter.state].value;
url += "${ll(url)}m_orderby=$order";
}
} else if (filter.type == "AdultContentFilter") {
final ctn = filter.values[filter.state].value;
if (ctn.isNotEmpty) {
url += "${ll(url)}adult=$ctn";
}
} else if (filter.type == "GenreListFilter") {
final genres = (filter.state as List).where((e) => e.state).toList();
if (genres.isNotEmpty) {
for (var genre in genres) {
url += "${ll(url)}genre[]=${genre.value},";
}
}
}
}
final data = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(data));
final document = parseHtml(res);
return mangaFromElements(document.select("div.c-tabs-item__content"));
}
@override
Future<MManga> getDetail(MSource source, String url) async {
final statusList = [
{
"OnGoing": 0,
"Продолжается": 0,
"Updating": 0,
"Em Lançamento": 0,
"Em lançamento": 0,
"Em andamento": 0,
"Em Andamento": 0,
"En cours": 0,
"Ativo": 0,
"Lançando": 0,
"Đang Tiến Hành": 0,
"Devam Ediyor": 0,
"Devam ediyor": 0,
"In Corso": 0,
"In Arrivo": 0,
"مستمرة": 0,
"مستمر": 0,
"En Curso": 0,
"En curso": 0,
"Emision": 0,
"En marcha": 0,
"Publicandose": 0,
"En emision": 0,
"连载中": 0,
"Completed": 1,
"Completo": 1,
"Completado": 1,
"Concluído": 1,
"Concluido": 1,
"Finalizado": 1,
"Terminé": 1,
"Hoàn Thành": 1,
"مكتملة": 1,
"مكتمل": 1,
"已完结": 1,
"On Hold": 2,
"Pausado": 2,
"En espera": 2,
"Canceled": 3,
"Cancelado": 3,
}
];
MManga manga = MManga();
String res = "";
final datas = {"url": url, "sourceId": source.id};
res = await http('GET', json.encode(datas));
final document = parseHtml(res);
manga.author = document.selectFirst("div.author-content > a")?.text ?? "";
manga.description = document
.selectFirst(
"div.description-summary div.summary__content, div.summary_content div.post-content_item > h5 + div, div.summary_content div.manga-excerpt, div.sinopsis div.contenedor, .description-summary > p")
?.text ??
"";
final imageElement = document.selectFirst("div.summary_image img");
final image = imageElement?.attr("data-src") ??
imageElement?.attr("data-lazy-src") ??
imageElement?.attr("srcset") ??
imageElement?.getSrc;
if (image != null) {
manga.imageUrl = image;
}
final id = document
.selectFirst("div[id^=manga-chapters-holder]")
?.attr("data-id") ??
"";
String mangaId = "";
if (id.isNotEmpty) {
mangaId = id;
}
final status = document.selectFirst("div.summary-content")?.text ?? "";
manga.status = parseStatus(status, statusList);
manga.genre =
document.select("div.genres-content a")?.map((e) => e.text).toList() ??
[];
final baseUrl = "${source.baseUrl}/";
final headers = {
"Referer": baseUrl,
"Content-Type": "application/x-www-form-urlencoded",
"X-Requested-With": "XMLHttpRequest"
};
final urll =
"${baseUrl}wp-admin/admin-ajax.php?action=manga_get_chapters&manga=$mangaId";
final datasP = {"url": urll, "headers": headers, "sourceId": source.id};
res = await http('POST', json.encode(datasP));
if (res == "error" || mangaId.isEmpty) {
final urlP = "${url}ajax/chapters";
final datasP = {"url": urlP, "headers": headers, "sourceId": source.id};
res = await http('POST', json.encode(datasP));
}
List<MChapter> chaptersList =
parseHtml(res).select('li.wp-manga-chapter').map((MElement e) {
String date = "";
List<MElement>? dateEList = e
.select('img')
?.where((MElement e) => !(e.className.contains("thumb")))
.toList();
if (dateEList != null && dateEList.isNotEmpty) {
final dateE = (dateEList.first as MElement).attr("alt");
if (dateE != null) {
date = parseDates([dateE], source.dateFormat, source.dateFormatLocale)
.first;
}
}
if (date.isEmpty) {
final dateE = e.selectFirst('span a')?.attr("title");
if (dateE != null) {
date = parseDates([dateE], source.dateFormat, source.dateFormatLocale)
.first;
}
}
if (date.isEmpty) {
final dateE = e.selectFirst('span.chapter-release-date')?.text;
if (dateE != null) {
date = parseDates([dateE], source.dateFormat, source.dateFormatLocale)
.first;
}
}
MChapter chapter = MChapter();
chapter.name = e.selectFirst('a').text;
chapter.url = e.selectFirst('a').getHref;
if (source.dateFormat.isNotEmpty) chapter.dateUpload = date;
return chapter;
}).toList();
manga.chapters = chaptersList;
return manga;
}
@override
Future<List<String>> getPageList(MSource source, String url) async {
final datas = {"url": url, "sourceId": source.id};
final res = await http('GET', json.encode(datas));
final document = parseHtml(res);
final pageElement = document.selectFirst(
"div.page-break, li.blocks-gallery-item, .reading-content, .text-left img");
List<String> imgs = pageElement.select("img").map((e) => e.getSrc).toList();
List<String> pageUrls = [];
if (imgs.length == 1) {
final pagesNumber =
document.selectFirst("#single-pager").select("option");
for (var i = 0; i < pagesNumber.length; i++) {
final val = i + 1;
if (i.toString().length == 1) {
pageUrls.add(imgs.first.replaceAll("01", '0$val'));
} else {
pageUrls.add(imgs.first.replaceAll("01", val.toString()));
}
}
} else {
return imgs;
}
return pageUrls;
}
MPages mangaFromElements(List<MElement> elements) {
List<MManga> mangaList = [];
for (var i = 0; i < elements.length; i++) {
final postTitle = elements[i].selectFirst("div.post-title a");
final imageElement = elements[i].selectFirst("img");
final image = imageElement?.attr("data-src") ??
imageElement?.attr("data-lazy-src") ??
imageElement?.attr("srcset") ??
imageElement?.getSrc ??
"";
MManga manga = MManga();
manga.name = postTitle.text;
manga.imageUrl = substringBefore(image, " ");
manga.link = postTitle.getHref;
mangaList.add(manga);
}
return MPages(mangaList, true);
}
@override
List<dynamic> getFilterList(MSource source) {
return [
TextFilter("AuthorFilter", "Author"),
TextFilter("ArtistFilter", "Artist"),
TextFilter("YearFilter", "Year of Released"),
GroupFilter("StatusFilter", "Status", [
CheckBoxFilter("Completed", "end"),
CheckBoxFilter("Ongoing", "on-going"),
CheckBoxFilter("Canceled", "canceled"),
CheckBoxFilter("On Hold", "on-hold"),
]),
SelectFilter("OrderByFilter", "Order By", 0, [
SelectFilterOption("Relevance", ""),
SelectFilterOption("Latest", "latest"),
SelectFilterOption("A-Z", "alphabet"),
SelectFilterOption("Rating", "rating"),
SelectFilterOption("Trending", "trending"),
SelectFilterOption("Most Views", "views"),
SelectFilterOption("New", "new-manga"),
]),
SelectFilter("AdultContentFilter", "Adult Content", 0, [
SelectFilterOption("All", ""),
SelectFilterOption("None", "0"),
SelectFilterOption("Only", "1"),
])
];
}
String ll(String url) {
if (url.contains("?")) {
return "&";
}
return "?";
}
}
Madara main() {
return Madara();
}

View File

@@ -164,9 +164,9 @@ import 'src/comicarab/comicarab.dart';
import 'src/manga3asq/manga3asq.dart';
import 'src/bakamh/bakamh.dart';
const madaraVersion = "0.0.5";
const madaraVersion = "0.0.55";
const madaraSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/madara-v$madaraVersion.dart";
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/madara.dart";
List<Source> get madaraSourcesList => _madaraSourcesList;
List<Source> _madaraSourcesList = [

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/adultwebtoon/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/adultwebtoon/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/akumanotenshi/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/akumanotenshi/icon.png",
dateFormat:"dd/MM/yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "tr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/anikiga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/anikiga/icon.png",
dateFormat:"d MMMMM yyyy",
dateFormatLocale:"tr",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "es",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/apollcomics/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/apollcomics/icon.png",
dateFormat:"dd MMMM, yyyy",
dateFormatLocale:"es",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "es",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/apolltoons/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/apolltoons/icon.png",
dateFormat:"dd MMMMM, yyyy",
dateFormatLocale:"es",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "tr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/araznovel/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/araznovel/icon.png",
dateFormat:"d MMMM yyyy",
dateFormatLocale:"en",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/arthurscan/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/arthurscan/icon.png",
dateFormat:"MMMMM dd, yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "fr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/astralmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/astralmanga/icon.png",
dateFormat:"dd/mm/yyyy",
dateFormatLocale:"fr",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/asurascansus/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/asurascansus/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "zh",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/bakamh/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/bakamh/icon.png",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/bananamanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/bananamanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "es",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/barmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/barmanga/icon.png",
dateFormat:"MM/dd/yyyy",
dateFormatLocale:"es",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "ru",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/bestmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/bestmanga/icon.png",
dateFormat:"dd.MM.yyyy",
dateFormatLocale:"ru",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "id",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/birdtoon/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/birdtoon/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/cerisescans/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/cerisescans/icon.png",
dateFormat:"dd 'de' MMMMM 'de' yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/chibimanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/chibimanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "tr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/clovermanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/clovermanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"tr",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "es",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/cocorip/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/cocorip/icon.png",
dateFormat:"dd/MM/yyyy",
dateFormatLocale:"es",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/coffeemanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/coffeemanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "ar",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/comicarab/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/comicarab/icon.png",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "all",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/comicznetv2/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/comicznetv2/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/decadencescans/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/decadencescans/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/dessertscan/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/dessertscan/icon.png",
dateFormat:"dd/MM/yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "th",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/doodmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/doodmanga/icon.png",
dateFormat:"dd MMMMM yyyy",
dateFormatLocale:"th",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/elitemanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/elitemanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "es",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/emperorscan/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/emperorscan/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"es",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "tr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/evascans/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/evascans/icon.png",
dateFormat:"MMM d, yyy",
dateFormatLocale:"tr",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/factmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/factmanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "ar",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/falconmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/falconmanga/icon.png",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-br",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/finalscans/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/finalscans/icon.png",
dateFormat:"MMMM d, yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/firstkissdashmanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/firstkissdashmanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/firstmanhwa/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/firstmanhwa/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/flextapescans/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/flextapescans/icon.png",
dateFormat:"MM/dd/yyy",
dateFormatLocale:"en",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/freemanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/freemanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/freemangatop/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/freemangatop/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "fr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/frscan/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/frscan/icon.png",
dateFormat:"MMMM d, yyyy",
dateFormatLocale:"fr",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/ghostscan/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/ghostscan/icon.png",
dateFormat:"dd 'de' MMMMM 'de' yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/girlslovemanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/girlslovemanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "tr",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/glorymanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/glorymanga/icon.png",
dateFormat:"dd/MM/yyy",
dateFormatLocale:"tr",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/gooffansub/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/gooffansub/icon.png",
dateFormat:"dd/MM/yyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/harimanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/harimanga/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentai3z/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentai3z/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "vi",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaicube/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaicube/icon.png",
dateFormat:"dd/MM/yyyy",
dateFormatLocale:"vi",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaimanga/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaimanga/icon.png",
dateFormat:"MMM d, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaiteca/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaiteca/icon.png",
dateFormat:"MMMMM dd, yyyy",
dateFormatLocale:"pt-br",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaiwebtoon/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaiwebtoon/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaixcomic/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaixcomic/icon.png",
dateFormat:"MMM d, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaixyuri/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaixyuri/icon.png",
dateFormat:"MMM d, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -9,5 +9,5 @@ Source _hentaizoneSource = Source(
isNsfw: true,
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hentaizone/icon.png",
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hentaizone/icon.png",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hipercool/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hipercool/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hiperdex/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hiperdex/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
isNsfw:true,
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/hm2d/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/hm2d/icon.png",
dateFormat:"MMM d, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "en",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/immortalupdates/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/immortalupdates/icon.png",
dateFormat:"MMMM dd, yyyy",
dateFormatLocale:"en_us",
);

View File

@@ -8,7 +8,7 @@ import '../../../../../model/source.dart';
lang: "pt-BR",
typeSource: "madara",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/manga/multisrc/madara/src/imperioscans/icon.png",
iconUrl:"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/manga/multisrc/madara/src/imperioscans/icon.png",
dateFormat:"dd/MM/yyyy",
dateFormatLocale:"pt-br",
);

Some files were not shown because too many files have changed in this diff Show More