Merge branch 'main' into manga/webtoons

This commit is contained in:
xMohnad
2025-06-15 22:01:37 +03:00
committed by GitHub
54 changed files with 496 additions and 519 deletions

View File

@@ -10,20 +10,22 @@ class Madara extends MProvider {
@override @override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
final res = final res = (await client.get(
(await client.get( Uri.parse(
Uri.parse("${source.baseUrl}/manga/page/$page/?m_orderby=views"), "${source.baseUrl}/${getMangaSubString()}/page/$page/?m_orderby=views",
)).body; ),
)).body;
final document = parseHtml(res); final document = parseHtml(res);
return mangaFromElements(document.select("div.page-item-detail")); return mangaFromElements(document.select("div.page-item-detail"));
} }
@override @override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
final res = final res = (await client.get(
(await client.get( Uri.parse(
Uri.parse("${source.baseUrl}/manga/page/$page/?m_orderby=latest"), "${source.baseUrl}/${getMangaSubString()}/page/$page/?m_orderby=latest",
)).body; ),
)).body;
final document = parseHtml(res); final document = parseHtml(res);
return mangaFromElements(document.select("div.page-item-detail")); return mangaFromElements(document.select("div.page-item-detail"));
} }
@@ -48,11 +50,12 @@ class Madara extends MProvider {
url += "${ll(url)}release=${Uri.encodeComponent(filter.state)}"; url += "${ll(url)}release=${Uri.encodeComponent(filter.state)}";
} }
} else if (filter.type == "StatusFilter") { } else if (filter.type == "StatusFilter") {
final status = (filter.state as List).where((e) => e.state).toList(); List<String> status = filter.state
.where((item) => item.state)
.map((item) => item.value.toString())
.toList();
if (status.isNotEmpty) { if (status.isNotEmpty) {
for (var st in status) { url += "${ll(url)}status[]=${status.join('&status[]=')}";
url += "${ll(url)}status[]=${st.value},";
}
} }
} else if (filter.type == "OrderByFilter") { } else if (filter.type == "OrderByFilter") {
if (filter.state != 0) { if (filter.state != 0) {
@@ -103,8 +106,8 @@ class Madara extends MProvider {
); );
chapter.dateUpload = dates[0]; chapter.dateUpload = dates[0];
} else { } else {
chapter.dateUpload = chapter.dateUpload = DateTime.now().millisecondsSinceEpoch
DateTime.now().millisecondsSinceEpoch.toString(); .toString();
} }
} }
chapters.add(chapter); chapters.add(chapter);
@@ -178,7 +181,7 @@ class Madara extends MProvider {
manga.imageUrl = manga.imageUrl =
imageElement?.attr("data-src") ?? imageElement?.attr("data-src") ??
imageElement?.attr("data-lazy-src") ?? imageElement?.attr("data-lazy-src") ??
imageElement?.attr("srcset") ?? imageElement?.attr("srcset")?.split(" ")?.first ??
imageElement?.getSrc; imageElement?.getSrc;
final id = final id =
@@ -205,11 +208,10 @@ class Madara extends MProvider {
body: {"action": "manga_get_chapters", "manga": mangaId}, body: {"action": "manga_get_chapters", "manga": mangaId},
); );
if (oldXhrChaptersRequest.statusCode == 400) { if (oldXhrChaptersRequest.statusCode == 400) {
res = res = (await client.post(
(await client.post( Uri.parse("${url}ajax/chapters"),
Uri.parse("${url}ajax/chapters"), headers: headers,
headers: headers, )).body;
)).body;
} else { } else {
res = oldXhrChaptersRequest.body; res = oldXhrChaptersRequest.body;
} }
@@ -217,11 +219,10 @@ class Madara extends MProvider {
MDocument chapDoc = parseHtml(res); MDocument chapDoc = parseHtml(res);
manga.chapters = getChapters(chapDoc); manga.chapters = getChapters(chapDoc);
if (manga.chapters.isEmpty) { if (manga.chapters.isEmpty) {
res = res = (await client.post(
(await client.post( Uri.parse("${url}ajax/chapters"),
Uri.parse("${url}ajax/chapters"), headers: headers,
headers: headers, )).body;
)).body;
chapDoc = parseHtml(res); chapDoc = parseHtml(res);
manga.chapters = getChapters(chapDoc); manga.chapters = getChapters(chapDoc);
} }
@@ -254,8 +255,10 @@ class Madara extends MProvider {
List<String> pageUrls = []; List<String> pageUrls = [];
if (imgs.length == 1) { if (imgs.length == 1) {
final pagesNumber = final pagesNumber = document
document.selectFirst("#single-pager").select("option").length; .selectFirst("#single-pager")
.select("option")
.length;
final imgUrl = imgs.first; final imgUrl = imgs.first;
for (var i = 0; i < pagesNumber; i++) { for (var i = 0; i < pagesNumber; i++) {
final val = i + 1; final val = i + 1;
@@ -328,6 +331,11 @@ class Madara extends MProvider {
} }
return "?"; return "?";
} }
String getMangaSubString() {
const worksSources = {"Olaoe", "Mangax Core"};
return worksSources.contains(source.name) ? "works" : "manga";
}
} }
Madara main(MSource source) { Madara main(MSource source) {

View File

@@ -93,17 +93,16 @@ import 'src/wickedwitchscan/wickedwitchscan.dart';
import 'src/winterscan/winterscan.dart'; import 'src/winterscan/winterscan.dart';
import 'src/wonderlandscan/wonderlandscan.dart'; import 'src/wonderlandscan/wonderlandscan.dart';
import 'src/yuriverso/yuriverso.dart'; import 'src/yuriverso/yuriverso.dart';
import 'src/falconmanga/falconmanga.dart';
import 'src/manga3asq/manga3asq.dart'; import 'src/manga3asq/manga3asq.dart';
import 'src/detectiveconanar/detectiveconanar.dart';
import 'src/mangaxcore/mangaxcore.dart';
import 'src/grabberzone/grabberzone.dart'; import 'src/grabberzone/grabberzone.dart';
import 'src/gatemanga/gatemanga.dart';
import 'src/gmangasite/gmangasite.dart';
import 'src/mangalink/mangalink.dart'; import 'src/mangalink/mangalink.dart';
import 'src/mangalek/mangalek.dart';
import 'src/mangalionz/mangalionz.dart'; import 'src/mangalionz/mangalionz.dart';
import 'src/mangarose/mangarose.dart'; import 'src/mangarose/mangarose.dart';
import 'src/mangaspark/mangaspark.dart'; import 'src/mangaspark/mangaspark.dart';
import 'src/mangastarz/mangastarz.dart'; import 'src/mangastarz/mangastarz.dart';
import 'src/mangatime/mangatime.dart';
import 'src/olaoe/olaoe.dart'; import 'src/olaoe/olaoe.dart';
import 'src/rocksmanga/rocksmanga.dart'; import 'src/rocksmanga/rocksmanga.dart';
import 'src/dragontea/dragontea.dart'; import 'src/dragontea/dragontea.dart';
@@ -185,7 +184,7 @@ import 'src/ruyamanga/ruyamanga.dart';
import 'src/turkcemangaoku/turkcemangaoku.dart'; import 'src/turkcemangaoku/turkcemangaoku.dart';
import 'src/webtoonhatti/webtoonhatti.dart'; import 'src/webtoonhatti/webtoonhatti.dart';
const madaraVersion = "0.1.15"; const madaraVersion = "0.1.2";
const madaraSourceCodeUrl = const madaraSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/madara/madara.dart"; "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/madara/madara.dart";
@@ -380,18 +379,16 @@ List<Source> _madaraSourcesList =
wonderlandscanSource, wonderlandscanSource,
//Yuri Verso (PT-BR) //Yuri Verso (PT-BR)
yuriversoSource, yuriversoSource,
//فالكون مانجا (AR)
falconmangaSource,
//مانجا العاشق (AR) //مانجا العاشق (AR)
manga3asqSource, manga3asqSource,
//Mangax Core (AR)
mangaxcoreSource,
//Grabber Zone (ALL) //Grabber Zone (ALL)
grabberzoneSource, grabberzoneSource,
//Gatemanga (AR)
gatemangaSource,
//GMANGA (unoriginal) (AR)
gmangasiteSource,
//مانجا لينك (AR) //مانجا لينك (AR)
mangalinkSource, mangalinkSource,
//مانجا ليك (AR)
mangalekSource,
//MangaLionz (AR) //MangaLionz (AR)
mangalionzSource, mangalionzSource,
//Manga Rose (AR) //Manga Rose (AR)
@@ -400,12 +397,12 @@ List<Source> _madaraSourcesList =
mangasparkSource, mangasparkSource,
//Manga Starz (AR) //Manga Starz (AR)
mangastarzSource, mangastarzSource,
//Manga Time (AR)
mangatimeSource,
//Olaoe (AR) //Olaoe (AR)
olaoeSource, olaoeSource,
//Rocks Manga (AR) //Rocks Manga (AR)
rocksmangaSource, rocksmangaSource,
//شبكة كونان العربية (AR)
detectiveconanarSource,
//DragonTea (EN) //DragonTea (EN)
dragonteaSource, dragonteaSource,
//Global Bloging (EN) //Global Bloging (EN)
@@ -572,10 +569,9 @@ List<Source> _madaraSourcesList =
webtoonhattiSource, webtoonhattiSource,
] ]
.map( .map(
(e) => (e) => e
e ..itemType = ItemType.manga
..itemType = ItemType.manga ..sourceCodeUrl = madaraSourceCodeUrl
..sourceCodeUrl = madaraSourceCodeUrl ..version = madaraVersion,
..version = madaraVersion,
) )
.toList(); .toList();

View File

@@ -0,0 +1,12 @@
import '../../../../../../model/source.dart';
Source get detectiveconanarSource => _detectiveconanarSource;
Source _detectiveconanarSource = Source(
name: "شبكة كونان العربية",
baseUrl: "https://manga.detectiveconanar.com",
lang: "ar",
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/madara/src/detectiveconanar/icon.png",
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,13 +0,0 @@
import '../../../../../../model/source.dart';
Source get falconmangaSource => _falconmangaSource;
Source _falconmangaSource = Source(
name: "فالكون مانجا",
baseUrl: "https://falconmanga.com",
lang: "ar",
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/madara/src/falconmanga/icon.png",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get gatemangaSource => _gatemangaSource;
Source _gatemangaSource = Source(
name: "Gatemanga",
baseUrl: "https://gatemanga.com",
lang: "ar",
isNsfw: false,
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/manga/multisrc/madara/src/gatemanga/icon.png",
dateFormat: "d MMMM، yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get gmangasiteSource => _gmangasiteSource;
Source _gmangasiteSource = Source(
name: "GMANGA (unoriginal)",
baseUrl: "https://gmanga.site",
lang: "ar",
isNsfw: false,
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/manga/multisrc/madara/src/gmangasite/icon.png",
dateFormat: "MMMM dd، yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,14 @@
import '../../../../../../model/source.dart';
Source get mangalekSource => _mangalekSource;
Source _mangalekSource = Source(
name: "مانجا ليك",
baseUrl: "https://lekmanga.net",
lang: "ar",
isNsfw: false,
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/manga/multisrc/madara/src/mangalek/icon.png",
dateFormat: "MMMM dd, yyyy",
dateFormatLocale: "ar",
);

View File

@@ -3,7 +3,7 @@ import '../../../../../../model/source.dart';
Source get mangalinkSource => _mangalinkSource; Source get mangalinkSource => _mangalinkSource;
Source _mangalinkSource = Source( Source _mangalinkSource = Source(
name: "مانجا لينك", name: "مانجا لينك",
baseUrl: "https://manga-link.com", baseUrl: "https://link-manga.com",
lang: "ar", lang: "ar",
isNsfw: false, isNsfw: false,
typeSource: "madara", typeSource: "madara",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get mangatimeSource => _mangatimeSource;
Source _mangatimeSource = Source(
name: "Manga Time",
baseUrl: "https://mangatime.us",
lang: "ar",
isNsfw: false,
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/manga/multisrc/madara/src/mangatime/icon.png",
dateFormat: "dd MMMM، yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,12 @@
import '../../../../../../model/source.dart';
Source get mangaxcoreSource => _mangaxcoreSource;
Source _mangaxcoreSource = Source(
name: "Mangax Core",
baseUrl: "https://mangaxcore.xyz",
lang: "ar",
typeSource: "madara",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/madara/src/mangaxcore/icon.png",
);

View File

@@ -3,7 +3,7 @@ import '../../../../../../model/source.dart';
Source get rocksmangaSource => _rocksmangaSource; Source get rocksmangaSource => _rocksmangaSource;
Source _rocksmangaSource = Source( Source _rocksmangaSource = Source(
name: "Rocks Manga", name: "Rocks Manga",
baseUrl: "https://rocks-manga.com", baseUrl: "https://rocksmanga.com",
lang: "ar", lang: "ar",
isNsfw: false, isNsfw: false,
typeSource: "madara", typeSource: "madara",

View File

@@ -1,5 +1,4 @@
import '../../../../model/source.dart'; import '../../../../model/source.dart';
import 'src/beastscans/beastscans.dart';
import 'src/lelmanga/lelmanga.dart'; import 'src/lelmanga/lelmanga.dart';
import 'src/komiklab/komiklab.dart'; import 'src/komiklab/komiklab.dart';
import 'src/azurescans/azurescans.dart'; import 'src/azurescans/azurescans.dart';
@@ -12,7 +11,6 @@ import 'src/katakomik/katakomik.dart';
import 'src/komikstation/komikstation.dart'; import 'src/komikstation/komikstation.dart';
import 'src/komikmama/komikmama.dart'; import 'src/komikmama/komikmama.dart';
import 'src/komikucom/komikucom.dart'; import 'src/komikucom/komikucom.dart';
import 'src/magusmanga/magusmanga.dart';
import 'src/mangaindome/mangaindome.dart'; import 'src/mangaindome/mangaindome.dart';
import 'src/mangacim/mangacim.dart'; import 'src/mangacim/mangacim.dart';
import 'src/mangatale/mangatale.dart'; import 'src/mangatale/mangatale.dart';
@@ -37,14 +35,9 @@ import 'src/thunderscans/thunderscans.dart';
import 'src/areamanga/areamanga.dart'; import 'src/areamanga/areamanga.dart';
import 'src/areascans/areascans.dart'; import 'src/areascans/areascans.dart';
import 'src/aresnov/aresnov.dart'; import 'src/aresnov/aresnov.dart';
import 'src/crowscans/crowscans.dart';
import 'src/iimanga/iimanga.dart';
import 'src/mangaflame/mangaflame.dart'; import 'src/mangaflame/mangaflame.dart';
import 'src/manganoon/manganoon.dart'; import 'src/manganoon/manganoon.dart';
import 'src/mangapro/mangapro.dart';
import 'src/mangaswat/mangaswat.dart'; import 'src/mangaswat/mangaswat.dart';
import 'src/mangatak/mangatak.dart';
import 'src/potatomanga/potatomanga.dart';
import 'src/stellarsaber/stellarsaber.dart'; import 'src/stellarsaber/stellarsaber.dart';
import 'src/rizzcomic/rizzcomic.dart'; import 'src/rizzcomic/rizzcomic.dart';
import 'src/berserkerscan/berserkerscan.dart'; import 'src/berserkerscan/berserkerscan.dart';
@@ -100,8 +93,6 @@ const mangareaderSourceCodeUrl =
List<Source> get mangareaderSourcesList => _mangareaderSourcesList; List<Source> get mangareaderSourcesList => _mangareaderSourcesList;
List<Source> _mangareaderSourcesList = List<Source> _mangareaderSourcesList =
[ [
//Beast Scans (AR)
beastscansSource,
//Lelmanga (FR) //Lelmanga (FR)
lelmangaSource, lelmangaSource,
//KomikLab Scans (EN) //KomikLab Scans (EN)
@@ -126,8 +117,6 @@ List<Source> _mangareaderSourcesList =
komikmamaSource, komikmamaSource,
//Komiku.com (ID) //Komiku.com (ID)
komikucomSource, komikucomSource,
//Magus Manga (AR)
magusmangaSource,
//Manga Indo.me (ID) //Manga Indo.me (ID)
mangaindomeSource, mangaindomeSource,
//Mangacim (TR) //Mangacim (TR)
@@ -176,24 +165,12 @@ List<Source> _mangareaderSourcesList =
areascansSource, areascansSource,
//SCARManga (AR) //SCARManga (AR)
aresnovSource, aresnovSource,
//Umi Manga (AR)
beastscansSource,
//Crow Scans (AR)
crowscansSource,
//ARESManga (AR)
iimangaSource,
//Manga Flame (AR) //Manga Flame (AR)
mangaflameSource, mangaflameSource,
//مانجا نون (AR) //مانجا نون (AR)
manganoonSource, manganoonSource,
//Manga Pro (AR)
mangaproSource,
//MangaSwat (AR) //MangaSwat (AR)
mangaswatSource, mangaswatSource,
//MangaTak (AR)
mangatakSource,
//PotatoManga (AR)
potatomangaSource,
//StellarSaber (AR) //StellarSaber (AR)
stellarsaberSource, stellarsaberSource,
//Rizz Comic (EN) //Rizz Comic (EN)
@@ -290,10 +267,9 @@ List<Source> _mangareaderSourcesList =
zenithscansSource, zenithscansSource,
] ]
.map( .map(
(e) => (e) => e
e ..itemType = ItemType.manga
..itemType = ItemType.manga ..sourceCodeUrl = mangareaderSourceCodeUrl
..sourceCodeUrl = mangareaderSourceCodeUrl ..version = mangareaderVersion,
..version = mangareaderVersion,
) )
.toList(); .toList();

View File

@@ -3,7 +3,7 @@ import '../../../../../../model/source.dart';
Source get areamangaSource => _areamangaSource; Source get areamangaSource => _areamangaSource;
Source _areamangaSource = Source( Source _areamangaSource = Source(
name: "أريا مانجا", name: "أريا مانجا",
baseUrl: "https://www.areascans.net", baseUrl: "https://ar.kenmanga.com",
lang: "ar", lang: "ar",
isNsfw: false, isNsfw: false,
typeSource: "mangareader", typeSource: "mangareader",

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get beastscansSource => _beastscansSource;
Source _beastscansSource = Source(
name: "Beast Scans",
baseUrl: "https://beast-scans.com",
lang: "ar",
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/beastscans/icon.png",
dateFormat: "MMMM dd, yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get crowscansSource => _crowscansSource;
Source _crowscansSource = Source(
name: "Crow Scans",
baseUrl: "https://crowscans.com",
lang: "ar",
isNsfw: false,
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/crowscans/icon.png",
dateFormat: "MMMM dd, yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get iimangaSource => _iimangaSource;
Source _iimangaSource = Source(
name: "ARESManga",
baseUrl: "https://fl-ares.com",
lang: "ar",
isNsfw: false,
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/iimanga/icon.png",
dateFormat: "MMMMM dd, yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get magusmangaSource => _magusmangaSource;
Source _magusmangaSource = Source(
name: "Magus Manga",
baseUrl: "https://magusmanga.com",
lang: "ar",
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/magusmanga/icon.png",
dateFormat: "MMMMM d, yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get mangaproSource => _mangaproSource;
Source _mangaproSource = Source(
name: "Manga Pro",
baseUrl: "https://mangapro.club",
lang: "ar",
isNsfw: false,
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/mangapro/icon.png",
dateFormat: "MMMM dd, yyyy",
dateFormatLocale: "ar",
);

View File

@@ -3,7 +3,7 @@ import '../../../../../../model/source.dart';
Source get mangaswatSource => _mangaswatSource; Source get mangaswatSource => _mangaswatSource;
Source _mangaswatSource = Source( Source _mangaswatSource = Source(
name: "MangaSwat", name: "MangaSwat",
baseUrl: "https://normoyun.com", baseUrl: "https://swatscans.com",
lang: "ar", lang: "ar",
isNsfw: false, isNsfw: false,
typeSource: "mangareader", typeSource: "mangareader",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get mangatakSource => _mangatakSource;
Source _mangatakSource = Source(
name: "MangaTak",
baseUrl: "https://mangatak.com",
lang: "ar",
isNsfw: false,
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/mangatak/icon.png",
dateFormat: "MMMM DD, yyyy",
dateFormatLocale: "ar",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -1,14 +0,0 @@
import '../../../../../../model/source.dart';
Source get potatomangaSource => _potatomangaSource;
Source _potatomangaSource = Source(
name: "PotatoManga",
baseUrl: "https://ar.potatomanga.xyz",
lang: "ar",
isNsfw: false,
typeSource: "mangareader",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangareader/src/potatomanga/icon.png",
dateFormat: "MMMM dd, yyyy",
dateFormatLocale: "ar",
);

View File

@@ -5,38 +5,30 @@ class MMRCMS extends MProvider {
MMRCMS({required this.source}); MMRCMS({required this.source});
MSource source; MSource source;
static final Set<String> latestTitles = <String>{};
final Client client = Client(); final Client client = Client();
MManga mangaFromElement(MElement element) {
final anchor = element.selectFirst(".media-heading a, .manga-heading a");
final link = anchor?.getHref;
return MManga()
..name = anchor?.text
..imageUrl = guessCover(link, url: element.selectFirst("img")?.getSrc)
..link = link;
}
@override @override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
final res = final res = (await client.get(
(await client.get( Uri.parse(
Uri.parse( "${source.baseUrl}/filterList?page=$page&sortBy=views&asc=false",
"${source.baseUrl}/filterList?page=$page&sortBy=views&asc=false", ),
), )).body;
)).body; final document = parseHtml(res);
final mangaList = <MManga>[];
List<MManga> mangaList = []; for (final el in document.select("div.chapter-container, div.media")) {
final urls = xpath(res, '//*[ @class="chart-title"]/@href'); final manga = mangaFromElement(el);
final names = xpath(res, '//*[ @class="chart-title"]/text()');
List<String> images = [];
for (var url in urls) {
String slug = substringAfterLast(url, '/');
if (source.name == "Manga-FR") {
images.add("${source.baseUrl}/uploads/manga/${slug}.jpg");
} else {
images.add(
"${source.baseUrl}/uploads/manga/${slug}/cover/cover_250x350.jpg",
);
}
}
for (var i = 0; i < names.length; i++) {
MManga manga = MManga();
manga.name = names[i];
manga.imageUrl = images[i];
manga.link = urls[i];
mangaList.add(manga); mangaList.add(manga);
} }
@@ -45,34 +37,24 @@ class MMRCMS extends MProvider {
@override @override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
final res = if (page == 1) latestTitles.clear();
(await client.get(
Uri.parse("${source.baseUrl}/latest-release?page=$page"),
)).body;
List<MManga> mangaList = []; final res = (await client.get(
final urls = xpath(res, '//*[@class="manga-item"]/h3/a/@href'); Uri.parse("${source.baseUrl}/latest-release?page=$page"),
final names = xpath(res, '//*[@class="manga-item"]/h3/a/text()'); )).body;
List<String> images = [];
for (var url in urls) { final document = parseHtml(res);
String slug = substringAfterLast(url, '/'); final mangaList = <MManga>[];
if (source.name == "Manga-FR") {
images.add("${source.baseUrl}/uploads/manga/${slug}.jpg"); for (var el in document.select("div.mangalist div.manga-item")) {
} else { final manga = mangaFromElement(el);
images.add( final link = manga.link;
"${source.baseUrl}/uploads/manga/${slug}/cover/cover_250x350.jpg",
); if (link != null && latestTitles.add(link)) {
mangaList.add(manga);
} }
} }
for (var i = 0; i < names.length; i++) {
MManga manga = MManga();
manga.name = names[i];
manga.imageUrl = images[i];
manga.link = urls[i];
mangaList.add(manga);
}
return MPages(mangaList, true); return MPages(mangaList, true);
} }
@@ -120,35 +102,21 @@ class MMRCMS extends MProvider {
String data = da["data"]; String data = da["data"];
if (source.name == 'Scan VF') { if (source.name == 'Scan VF') {
urls.add('${source.baseUrl}/$data'); urls.add('${source.baseUrl}/$data');
} else if (source.name == 'Manga-FR') {
urls.add('${source.baseUrl}/lecture-en-ligne/$data');
} else { } else {
urls.add('${source.baseUrl}/manga/$data'); urls.add('${source.baseUrl}/manga/$data');
} }
names.add(value); names.add(value);
if (source.name == "Manga-FR") { images.add(
images.add("${source.baseUrl}/uploads/manga/$data.jpg"); "${source.baseUrl}/uploads/manga/$data/cover/cover_250x350.jpg",
} else { );
images.add(
"${source.baseUrl}/uploads/manga/$data/cover/cover_250x350.jpg",
);
}
} }
} else { } else {
urls = xpath(res, '//div/div/div/a/@href'); urls = xpath(res, '//div/div/div/a/@href');
names = xpath(res, '//div/div/div/a/text()'); names = xpath(res, '//div/div/div/a/text()');
for (var url in urls) { for (var mangaUrl in urls) {
String slug = substringAfterLast(url, '/'); images.add(guessCover(mangaUrl));
if (source.name == "Manga-FR") {
images.add("${source.baseUrl}/uploads/manga/${slug}.jpg");
} else {
images.add(
"${source.baseUrl}/uploads/manga/${slug}/cover/cover_250x350.jpg",
);
}
} }
} }
for (var i = 0; i < names.length; i++) { for (var i = 0; i < names.length; i++) {
MManga manga = MManga(); MManga manga = MManga();
manga.name = names[i]; manga.name = names[i];
@@ -162,93 +130,87 @@ class MMRCMS extends MProvider {
@override @override
Future<MManga> getDetail(String url) async { Future<MManga> getDetail(String url) async {
final statusList = [
{
"complete": 1,
"complet": 1,
"completo": 1,
"zakończone": 1,
"concluído": 1,
"مكتملة": 1,
"ongoing": 0,
"en cours": 0,
"em lançamento": 0,
"prace w toku": 0,
"ativo": 0,
"مستمرة": 0,
"em andamento": 0,
},
];
MManga manga = MManga();
final res = (await client.get(Uri.parse(url))).body; final res = (await client.get(Uri.parse(url))).body;
final document = parseHtml(res);
final manga = MManga();
final author = xpath( // Title
res, final mangaTitle = document
'//*[@class="dl-horizontal"]/dt[contains(text(), "Auteur(s)") or contains(text(), "Author(s)") or contains(text(), "Autor(es)") or contains(text(), "Yazar(lar) or contains(text(), "Mangaka(lar)")]//following-sibling::dd[1]/text()', .selectFirst(".panel-heading, .listmanga-header, .widget-title")
); ?.text;
if (author.isNotEmpty) { manga.name = mangaTitle;
manga.author = author.first;
}
final status = xpath(
res,
'//*[@class="dl-horizontal"]/dt[contains(text(), "Statut") or contains(text(), "Status") or contains(text(), "Estado") or contains(text(), "Durum")]/following-sibling::dd[1]/text()',
);
if (status.isNotEmpty) {
manga.status = parseStatus(status.first, statusList);
}
final description = xpath( // Cover
res, manga.imageUrl = guessCover(
'//*[@class="well" or @class="manga well"]/p/text()', url,
); url: document.selectFirst(".row img.img-responsive")?.getSrc,
if (description.isNotEmpty) {
manga.description = description.first;
}
manga.genre = xpath(
res,
'//*[@class="dl-horizontal"]/dt[contains(text(), "Categories") or contains(text(), "Categorias") or contains(text(), "Categorías") or contains(text(), "Catégories") or contains(text(), "Kategoriler" or contains(text(), "Kategorie") or contains(text(), "Kategori") or contains(text(), "Tagi"))]/following-sibling::dd[1]/text()',
); );
var chapUrls = xpath(res, '//*[@class="chapter-title-rtl"]/a/@href'); // Description
var chaptersNames = xpath(res, '//*[@class="chapter-title-rtl"]/a/text()'); manga.description = extractDescription(document);
var chaptersDates = xpath(
res,
'//*[@class="date-chapter-title-rtl"]/text()',
);
var dateUploads = parseDates( document.select('.panel-body h3, .row .dl-horizontal dt').forEach((
chaptersDates, element,
source.dateFormat, ) {
source.dateFormatLocale, final label = _getOwnText(
); element,
).toLowerCase().replaceFirst(RegExp(r' :$'), '');
final valueElement = element.selectFirst('div.text');
if (valueElement.text == null)
final valueElement = element.nextElementSibling;
_assignMangaInfo(manga, label, valueElement);
});
// Chapters
List<MChapter>? chaptersList = []; List<MChapter>? chaptersList = [];
for (var i = 0; i < chaptersNames.length; i++) { for (var ch in document.select("ul.chapters > li:not(.btn)")) {
MChapter chapter = MChapter(); chaptersList.add(chapterFromElement(ch, mangaTitle));
chapter.name = chaptersNames[i];
chapter.url = chapUrls[i];
chapter.dateUpload = dateUploads[i];
chaptersList.add(chapter);
} }
manga.chapters = chaptersList; manga.chapters = chaptersList;
return manga; return manga;
} }
MChapter chapterFromElement(MElement element, String mangaTitle) {
final chapter = MChapter();
final titleWrapper = element.selectFirst(".chapter-title-rtl");
final anchor = titleWrapper?.selectFirst("a");
if (anchor != null) {
chapter.url = anchor.getHref ?? '';
chapter.name = cleanChapterName(titleWrapper.text, mangaTitle);
final dateElement = element.selectFirst(".date-chapter-title-rtl");
if (dateElement != null && dateElement.text.isNotEmpty) {
chapter.dateUpload = parseDates(
[dateElement.text],
source.dateFormat,
source.dateFormatLocale,
)[0];
} else {
chapter.dateUpload = DateTime.now().millisecondsSinceEpoch.toString();
}
}
return chapter;
}
@override @override
Future<List<String>> getPageList(String url) async { Future<List<String>> getPageList(String url) async {
final res = (await client.get(Uri.parse(url))).body; final response = await client.get(Uri.parse(url));
final document = parseHtml(response.body);
List<String> pagesUrl = []; List<String> pagesUrl = [];
final pages = xpath( for (var img in document.select('#all img.img-responsive[data-src]')) {
res, String? src = img.attr('data-src');
'//*[@id="all"]/img[@class="img-responsive"]/@data-src', if (src.startsWith('//')) {
); pagesUrl.add('https:${src}');
for (var page in pages) {
if (page.startsWith('//')) {
pagesUrl.add(page.replaceAll('//', 'https://'));
} else { } else {
pagesUrl.add(page); pagesUrl.add(src);
} }
} }
@@ -339,6 +301,152 @@ class MMRCMS extends MProvider {
} }
return "?"; return "?";
} }
String guessCover(String mangaUrl, {String? url}) {
if (url == null || url?.endsWith("no-image.png")) {
String slug = substringAfterLast(mangaUrl, '/');
return "${source.baseUrl}/uploads/manga/${slug}/cover/cover_250x350.jpg";
} else if (url?.startsWith(source.baseUrl)) {
return url;
} else {
return Uri.parse(source.baseUrl).resolve(url).toString();
}
}
String extractDescription(MDocument document) {
final container = document.selectFirst(".row .well");
if (container == null) return "";
String text = container.text;
container.select("h5").forEach((element) {
text = text.replaceAll(element.text, "");
});
return text.replaceAll(RegExp(r'\n{3,}'), '\n\n').trim();
}
String _getOwnText(MElement element) {
final text = element.text;
final childrenText = element.children.map((e) => e.text).join();
return text.replaceFirst(childrenText, '').trim();
}
void _assignMangaInfo(MManga manga, String label, MElement valueElement) {
if (_detailAuthor.contains(label)) {
manga.author = valueElement.text;
} else if (_detailArtist.contains(label)) {
manga.artist = valueElement.text;
} else if (_detailGenre.contains(label)) {
manga.genre = valueElement?.select("a").map((e) => e.text).toList;
} else if (_detailStatus.contains(label)) {
manga.status = parseStatus(valueElement.text, statusList);
}
}
String cleanChapterName(String name, String mangaTitle) {
const chapterString = "Chapter";
const chapterNamePrefix = "";
try {
final initialName = name.replaceFirst(
'$chapterNamePrefix$mangaTitle',
chapterString,
);
final parts = initialName.split(':');
if (parts.isEmpty) return name;
final firstPart = parts[0].trim();
if (parts.length == 1) return firstPart;
final secondPart = parts.sublist(1).join(':').trim();
return firstPart == secondPart ? firstPart : "$firstPart: $secondPart";
} catch (e) {
return name;
}
}
const _detailAuthor = {
'author(s)',
'autor(es)',
'auteur(s)',
'著作',
'yazar(lar)',
'mangaka(lar)',
'pengarang/penulis',
'pengarang',
'penulis',
'autor',
'المؤلف',
'перевод',
'autor/autorzy',
};
const _detailArtist = {
'artist(s)',
'artiste(s)',
'sanatçi(lar)',
'artista(s)',
'artist(s)/ilustrator',
'الرسام',
'seniman',
'rysownik/rysownicy',
'artista',
};
const _detailGenre = {
'categories',
'categorías',
'catégories',
'ジャンル',
'kategoriler',
'categorias',
'kategorie',
'التصنيفات',
'жанр',
'kategori',
'tagi',
'género',
};
const _detailStatus = {
'status',
'statut',
'estado',
'状態',
'durum',
'الحالة',
'статус',
};
const statusList = [
{
// Ongoing Statuses (0)
'ongoing': 0,
'مستمرة': 0,
'en cours': 0,
'em lançamento': 0,
'prace w toku': 0,
'ativo': 0,
'em andamento': 0,
'activo': 0,
// Complete Statuses (1)
'complete': 1,
'مكتملة': 1,
'complet': 1,
'completo': 1,
'zakończone': 1,
'concluído': 1,
'finalizado': 1,
// Dropped Statuses (3)
'dropped': 3,
},
];
} }
MMRCMS main(MSource source) { MMRCMS main(MSource source) {

View File

@@ -1,12 +1,7 @@
import '../../../../model/source.dart'; import '../../../../model/source.dart';
import 'src/scanvf/scanvf.dart'; import 'src/scanvf/scanvf.dart';
import 'src/komikid/komikid.dart';
import 'src/mangaid/mangaid.dart';
import 'src/jpmangas/jpmangas.dart';
import 'src/onma/onma.dart'; import 'src/onma/onma.dart';
import 'src/readcomicsonline/readcomicsonline.dart'; import 'src/readcomicsonline/readcomicsonline.dart';
import 'src/lelscanvf/lelscanvf.dart';
import 'src/mangafr/mangafr.dart';
const mmrcmsVersion = "0.0.7"; const mmrcmsVersion = "0.0.7";
const mmrcmsSourceCodeUrl = const mmrcmsSourceCodeUrl =
@@ -17,20 +12,10 @@ List<Source> _mmrcmsSourcesList =
[ [
//Scan VF (FR) //Scan VF (FR)
scanvfSource, scanvfSource,
//Komikid (ID)
komikidSource,
//MangaID (ID)
mangaidSource,
//Jpmangas (FR)
jpmangasSource,
//مانجا اون لاين (AR) //مانجا اون لاين (AR)
onmaSource, onmaSource,
//Read Comics Online (EN) //Read Comics Online (EN)
readcomicsonlineSource, readcomicsonlineSource,
//Lelscan-VF (FR)
lelscanvfSource,
//Manga-FR (FR)
mangafrSource,
] ]
.map( .map(
(e) => (e) =>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -1,15 +0,0 @@
import '../../../../../../model/source.dart';
Source get jpmangasSource => _jpmangasSource;
Source _jpmangasSource = Source(
name: "Jpmangas",
baseUrl: "https://jpmangas.cc",
lang: "fr",
typeSource: "mmrcms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mmrcms/src/jpmangas/icon.png",
dateFormat: "d MMM. yyyy",
dateFormatLocale: "en_us",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -1,15 +0,0 @@
import '../../../../../../model/source.dart';
Source get komikidSource => _komikidSource;
Source _komikidSource = Source(
name: "Komikid",
baseUrl: "https://www.komikid.com",
lang: "id",
typeSource: "mmrcms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mmrcms/src/komikid/icon.png",
dateFormat: "d MMM. yyyy",
dateFormatLocale: "en_us",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -1,15 +0,0 @@
import '../../../../../../model/source.dart';
Source get lelscanvfSource => _lelscanvfSource;
Source _lelscanvfSource = Source(
name: "Lelscan-VF",
baseUrl: "https://www.lelscanvf.cc/",
lang: "fr",
typeSource: "mmrcms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mmrcms/src/lelscanvf/icon.png",
dateFormat: "d MMM. yyyy",
dateFormatLocale: "en_us",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -1,15 +0,0 @@
import '../../../../../../model/source.dart';
Source get mangafrSource => _mangafrSource;
Source _mangafrSource = Source(
name: "Manga-FR",
baseUrl: "https://manga-fr.me",
lang: "fr",
typeSource: "mmrcms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mmrcms/src/mangafr/icon.png",
dateFormat: "d MMM. yyyy",
dateFormatLocale: "en_us",
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

View File

@@ -1,15 +0,0 @@
import '../../../../../../model/source.dart';
Source get mangaidSource => _mangaidSource;
Source _mangaidSource = Source(
name: "MangaID",
baseUrl: "https://mangaid.click",
lang: "id",
typeSource: "mmrcms",
iconUrl:
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mmrcms/src/mangaid/icon.png",
dateFormat: "d MMM. yyyy",
dateFormatLocale: "en_us",
);

View File

@@ -10,11 +10,10 @@ class MangaHere extends MProvider {
@override @override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
final res = final res = (await client.get(
(await client.get( Uri.parse("${source.baseUrl}/directory/$page.htm"),
Uri.parse("${source.baseUrl}/directory/$page.htm"), headers: getHeader(source.baseUrl),
headers: getHeader(source.baseUrl), )).body;
)).body;
List<MManga> mangaList = []; List<MManga> mangaList = [];
final names = xpath( final names = xpath(
@@ -43,11 +42,10 @@ class MangaHere extends MProvider {
@override @override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
final res = final res = (await client.get(
(await client.get( Uri.parse("${source.baseUrl}/directory/$page.htm?latest"),
Uri.parse("${source.baseUrl}/directory/$page.htm?latest"), headers: getHeader(source.baseUrl),
headers: getHeader(source.baseUrl), )).body;
)).body;
List<MManga> mangaList = []; List<MManga> mangaList = [];
final names = xpath( final names = xpath(
@@ -91,14 +89,12 @@ class MangaHere extends MProvider {
final rt = filter.values[filter.state].value; final rt = filter.values[filter.state].value;
url += "${ll(url)}rating=$rt"; url += "${ll(url)}rating=$rt";
} else if (filter.type == "GenreList") { } else if (filter.type == "GenreList") {
final included = final included = (filter.state as List)
(filter.state as List) .where((e) => e.state == 1 ? true : false)
.where((e) => e.state == 1 ? true : false) .toList();
.toList(); final excluded = (filter.state as List)
final excluded = .where((e) => e.state == 2 ? true : false)
(filter.state as List) .toList();
.where((e) => e.state == 2 ? true : false)
.toList();
if (included.isNotEmpty) { if (included.isNotEmpty) {
url += "${ll(url)}genres="; url += "${ll(url)}genres=";
for (var val in included) { for (var val in included) {
@@ -123,11 +119,10 @@ class MangaHere extends MProvider {
} }
} }
url += "${ll(url)}title=$query&page=$page"; url += "${ll(url)}title=$query&page=$page";
final res = final res = (await client.get(
(await client.get( Uri.parse(url),
Uri.parse(url), headers: getHeader(source.baseUrl),
headers: getHeader(source.baseUrl), )).body;
)).body;
List<MManga> mangaList = []; List<MManga> mangaList = [];
final names = xpath( final names = xpath(
@@ -159,17 +154,20 @@ class MangaHere extends MProvider {
final statusList = [ final statusList = [
{"Ongoing": 0, "Completed": 1}, {"Ongoing": 0, "Completed": 1},
]; ];
final res = final res = (await client.get(
(await client.get( Uri.parse("${source.baseUrl}/$url"),
Uri.parse("${source.baseUrl}/$url"), headers: getHeader(source.baseUrl),
headers: getHeader(source.baseUrl), )).body;
)).body;
MManga manga = MManga(); MManga manga = MManga();
manga.author = manga.author = xpath(
xpath(res, '//*[@class="detail-info-right-say"]/a/text()').first; res,
'//*[@class="detail-info-right-say"]/a/text()',
).first;
manga.description = xpath(res, '//*[@class="fullcontent"]/text()').first; manga.description = xpath(res, '//*[@class="fullcontent"]/text()').first;
final status = final status = xpath(
xpath(res, '//*[@class="detail-info-right-title-tip"]/text()').first; res,
'//*[@class="detail-info-right-title-tip"]/text()',
).first;
manga.status = parseStatus(status, statusList); manga.status = parseStatus(status, statusList);
manga.genre = xpath( manga.genre = xpath(
res, res,
@@ -251,26 +249,23 @@ class MangaHere extends MProvider {
String pageLink = String pageLink =
"$pageBase/chapterfun.ashx?cid=$chapterId&page=$i&key=$secretKey"; "$pageBase/chapterfun.ashx?cid=$chapterId&page=$i&key=$secretKey";
String responseText = "".toString(); String responseText = "".toString();
for (int tr = 1; tr <= 3; tr++) { final headers = {
if (responseText.isEmpty) { "Referer": urll,
final headers = { "Accept": "*/*",
"Referer": urll, "Accept-Language": "en-US,en;q=0.9",
"Accept": "*/*", "Connection": "keep-alive",
"Accept-Language": "en-US,en;q=0.9", "Host": "www.mangahere.cc",
"Connection": "keep-alive", "X-Requested-With": "XMLHttpRequest",
"Host": "www.mangahere.cc", };
"X-Requested-With": "XMLHttpRequest",
};
final ress = final ress = (await client.get(
(await client.get(Uri.parse(pageLink), headers: headers)).body; Uri.parse(pageLink),
headers: headers,
)).body;
responseText = ress.isNotEmpty ? ress : "";
responseText = ress; if (responseText.isEmpty) {
secretKey = "";
if (responseText.isEmpty) {
secretKey = "";
}
}
} }
String deobfuscatedScript = unpackJs( String deobfuscatedScript = unpackJs(
responseText.replaceAll("eval", ""), responseText.replaceAll("eval", ""),

View File

@@ -1,7 +1,7 @@
import '../../../../../model/source.dart'; import '../../../../../model/source.dart';
Source get mangahereSource => _mangahereSource; Source get mangahereSource => _mangahereSource;
const _mangahereVersion = "0.0.75"; const _mangahereVersion = "0.0.8";
const _mangahereSourceCodeUrl = const _mangahereSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/src/en/mangahere/mangahere.dart"; "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/src/en/mangahere/mangahere.dart";
Source _mangahereSource = Source( Source _mangahereSource = Source(

View File

@@ -512,7 +512,7 @@ class MangaPark extends MProvider {
summary: "", summary: "",
valueIndex: 0, valueIndex: 0,
entries: ["False", "True"], entries: ["False", "True"],
entryValues: [0, 2], entryValues: ["0", "2"],
), ),
ListPreference( ListPreference(
key: "ImgServer", key: "ImgServer",

View File

@@ -1,14 +1,14 @@
import '../../../../../model/source.dart'; import '../../../../../model/source.dart';
Source get mangaparkSource => _mangaparkSource; Source get mangaparkSource => _mangaparkSource;
const _mangaparkVersion = "1.0.0"; const _mangaparkVersion = "1.0.1";
const _mangaparkSourceCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/src/en/mangapark/mangapark.dart"; const _mangaparkSourceCodeUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/src/en/mangapark/mangapark.dart";
const _mangaparkIconUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/src/en/mangapark/icon.png"; const _mangaparkIconUrl = "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/src/en/mangapark/icon.png";
Source _mangaparkSource = Source( Source _mangaparkSource = Source(
name: "MangaPark", name: "MangaPark",
baseUrl: "http://www.mangapark.io", baseUrl: "https://mangapark.io",
apiUrl: "http://www.mangapark.io/apo/", apiUrl: "https://mangapark.io/apo/",
lang: "en", lang: "en",
typeSource: "single", typeSource: "single",
iconUrl: _mangaparkIconUrl, iconUrl: _mangaparkIconUrl,
sourceCodeUrl: _mangaparkSourceCodeUrl, sourceCodeUrl: _mangaparkSourceCodeUrl,

File diff suppressed because one or more lines are too long

View File

@@ -6,7 +6,7 @@ const mangayomiSources = [{
"iconUrl": "https://mangafire.to/assets/sites/mangafire/favicon.png?v3", "iconUrl": "https://mangafire.to/assets/sites/mangafire/favicon.png?v3",
"typeSource": "single", "typeSource": "single",
"itemType": 0, "itemType": 0,
"version": "0.1.24", "version": "0.1.25",
"dateFormat": "", "dateFormat": "",
"dateFormatLocale": "", "dateFormatLocale": "",
"pkgPath": "manga/src/all/mangafire.js" "pkgPath": "manga/src/all/mangafire.js"
@@ -109,6 +109,7 @@ class DefaultExtension extends MProvider {
} }
async getDetail(url) { async getDetail(url) {
url = url.replace(this.source.baseUrl,"")
const viewType = this.getPreference("mangafire_pref_content_view") const viewType = this.getPreference("mangafire_pref_content_view")
const id = url.split(".").pop(); const id = url.split(".").pop();
const detail = {}; const detail = {};
@@ -170,7 +171,11 @@ class DefaultExtension extends MProvider {
// For manga chapter pages // For manga chapter pages
async getPageList(url) { async getPageList(url) {
const res = await new Client().get(url); var res = await new Client().get(url);
if(res.statusCode !=200){
url = url.replace("/volume/","/chapter/")
res = await new Client().get(url);
}
const data = JSON.parse(res.body); const data = JSON.parse(res.body);
const pages = []; const pages = [];
var hdr = { "Referer": this.source.baseUrl } var hdr = { "Referer": this.source.baseUrl }

View File

@@ -0,0 +1,94 @@
// prettier-ignore
const mangayomiSources = [{
"name": "Oduto - Boruto",
"lang": "ar",
"baseUrl": "https://nb19u.blogspot.com",
"apiUrl": "",
"iconUrl": "https://blogger.googleusercontent.com/img/a/AVvXsEgKFmNQCUC7ARtXurDIwfOimVn3wogUvH7VaUOfjdutG44-cT4ajgh0KYkqSbRIoQ0b8YG3H6Edx-y1O3GW5SL88jymLZsO6cmS0QRtsp1y4gc24vmF4OGqyIY3PYSjxUYR1iJ5J-sP-00A7NwhNa19SPc0R_62KcuG6dbu2Rg-2YiMV1uUgaB0DGB6IBY_=s1600",
"typeSource": "single",
"itemType": 0,
"version": "0.0.1",
"isNsfw": false,
"pkgPath": "manga/src/ar/oduto.js",
"notes": "This Source Just For Boruto"
}];
class DefaultExtension extends MProvider {
async request(slug) {
this.client ??= new Client();
const res = await this.client.get(slug);
return new Document(res.body);
}
getPopular(_) {
return {
list: [
{
name: "BORUTO: Two Blue Vortex",
imageUrl:
"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggWB9vWPMqjEvIoDsJSO29OmW-srULDQD3cS9HJ8cDk0vq2jLwDerUX-i61CqmZf62eBVmWZwU5CgXi0p2lxhKrh2_nZum3p-k3q9QJ2uozove0QAbOKtbd1QPjytjrJc9UsL65X4BbFdgcicLDYubD9LgY1Kco8wyhDGm4YEOim8u1TL42gOFe16NaaEP/s3464/4D55C3C5-9168-4103-B45C-99B52B58B6A5.jpeg",
link: "https://nb19u.blogspot.com/search/label/%D9%85%D8%A7%D9%86%D8%AC%D8%A7%20%D8%A8%D9%88%D8%B1%D9%88%D8%AA%D9%88?&max-results=4&m=1",
},
],
hasNextPage: false,
};
}
getLatestUpdates(_) {
return this.getPopular();
}
// Chapters
chapterFromElement(element) {
const anchor = element.selectFirst("div.iPostInfoWrap > h3 > a");
const timeElement = element.selectFirst("div.iPostInfoWrap time");
if (!anchor || !timeElement) return {};
const name = anchor.text?.trim();
const url = anchor.getHref;
const rawDate = timeElement.attr("datetime")?.trim();
const dateUpload = rawDate ? new Date(rawDate).getTime().toString() : null;
return { name, dateUpload, url };
}
// Detail
async getDetail(url) {
let doc = await this.request(url);
const allElements = [];
for (;;) {
const pageChapters = doc.select("#Blog1 article.blog-post.index-post");
if (!pageChapters || pageChapters.length === 0) break;
allElements.push(...pageChapters);
const nextUrl = doc
.selectFirst("#Blog1 > div.iPostsNavigation > button[data-load]")
.attr("data-load");
if (!nextUrl || nextUrl.length === 0) break;
doc = await this.request(nextUrl);
}
const chapters = allElements.map((element) =>
this.chapterFromElement(element),
);
return {
title: "BORUTO: Two Blue Vortex",
imageUrl:
"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggWB9vWPMqjEvIoDsJSO29OmW-srULDQD3cS9HJ8cDk0vq2jLwDerUX-i61CqmZf62eBVmWZwU5CgXi0p2lxhKrh2_nZum3p-k3q9QJ2uozove0QAbOKtbd1QPjytjrJc9UsL65X4BbFdgcicLDYubD9LgY1Kco8wyhDGm4YEOim8u1TL42gOFe16NaaEP/s3464/4D55C3C5-9168-4103-B45C-99B52B58B6A5.jpeg",
author: "Masashi Kishimoto",
description: "Artist: Mikio Ikemoto",
status: 0,
genre: ["شونين", "دراما", "خيال", "أكشن", "نينجا"],
chapters,
};
}
// chapter pages
async getPageList(url) {
const doc = await this.request(url);
return doc.select("div.#post-body img[src]").map((x) => ({
url: x.attr("src"),
}));
}
}