Merge pull request #204 from uwu-wuw/main

fix
This commit is contained in:
Moustapha Kodjo Amadou
2025-04-01 09:47:38 +02:00
committed by GitHub
7 changed files with 94 additions and 178 deletions

View File

@@ -1,5 +1,6 @@
import 'package:mangayomi/bridge_lib.dart';
class MangaBox extends MProvider {
MangaBox({required this.source});
@@ -12,6 +13,7 @@ class MangaBox extends MProvider {
final res =
(await client.get(
Uri.parse("${source.baseUrl}/${popularUrlPath(source.name, page)}"),
headers: getHeader(source.baseUrl),
)).body;
return mangaRes(res);
}
@@ -21,6 +23,7 @@ class MangaBox extends MProvider {
final res =
(await client.get(
Uri.parse("${source.baseUrl}/${latestUrlPath(source.name, page)}"),
headers: getHeader(source.baseUrl),
)).body;
return mangaRes(res);
}
@@ -30,66 +33,30 @@ class MangaBox extends MProvider {
final filters = filterList.filters;
String url = "";
if (query.isNotEmpty &&
(source.name != "Manganato" && source.name != "Mangabat")) {
if (query.isNotEmpty) {
url = "${source.baseUrl}/${simpleQueryPath(source.name, page, query)}";
} else {
url = source.baseUrl;
if (source.name == "Manganato" || source.name == "Mangabat") {
url +=
"/advanced_search?page=$page&keyw=${normalizeSearchQuery(query)}";
String genreInclude = "";
String genreExclude = "";
for (var filter in filters) {
if (filter.type == "KeywordFilter") {
final key = filter.values[filter.state].value;
url += "${ll(url)}keyt=$key";
} else if (filter.type == "SortFilter") {
final sort = filter.values[filter.state].value;
url += "${ll(url)}orby=$sort";
} else if (filter.type == "StatusFilter") {
final status = filter.values[filter.state].value;
url += "${ll(url)}sts=$status";
} else if (filter.type == "GenreListFilter") {
final included =
(filter.state as List)
.where((e) => e.state == 1 ? true : false)
.toList();
final excluded =
(filter.state as List)
.where((e) => e.state == 2 ? true : false)
.toList();
if (included.isNotEmpty) {
for (var val in included) {
genreInclude += "_${val.value}";
}
}
if (excluded.isNotEmpty) {
for (var val in excluded) {
genreExclude += "_${val.value}";
}
}
}
}
url += "${ll(url)}g_i=$genreInclude";
url += "${ll(url)}g_e=$genreExclude";
} else {
for (var filter in filters) {
if (filter.type == "SortFilter") {
final sort = filter.values[filter.state].value;
url += "${ll(url)}type=$sort";
} else if (filter.type == "StatusFilter") {
final status = filter.values[filter.state].value;
url += "${ll(url)}state=$status";
} else if (filter.type == "GenreListFilter") {
final genre = filter.values[filter.state].value;
url += "${ll(url)}category=$genre";
}
String genre = "all";
String sort = "latest";
String status = "all";
for (var filter in filters) {
if (filter.type == "GenreListFilter") {
genre = filter.values[filter.state].value;
} else if (filter.type == "SortFilter") {
sort = filter.values[filter.state].value;
} else if (filter.type == "StatusFilter") {
status = filter.values[filter.state].value;
}
}
url = "${source.baseUrl}/genre/$genre?type=$sort&state=$status&page=$page";
}
final res = (await client.get(Uri.parse(url))).body;
final res = (await client.get(Uri.parse(url), headers: getHeader(source.baseUrl),)).body;
List<MManga> mangaList = [];
List<String> urls = [];
@@ -143,7 +110,10 @@ class MangaBox extends MProvider {
{"Ongoing": 0, "Completed": 1},
];
MManga manga = MManga();
final res = (await client.get(Uri.parse(url))).body;
final res = (await client.get(
Uri.parse(url),
headers: getHeader(source.baseUrl),
)).body;
final document = parseHtml(res);
manga.author =
document.xpathFirst(
@@ -159,7 +129,7 @@ class MangaBox extends MProvider {
final description =
document.xpathFirst(
'//*[@id="panel-story-info-description" ]/text() | //*[@id="story_discription" ]/text() | //div[@id="noidungm"]/text()',
'//*[@id="contentBox" ]/text() | //*[@id="story_discription" ]/text() | //div[@id="noidungm"]/text()',
) ??
"";
@@ -219,7 +189,7 @@ class MangaBox extends MProvider {
@override
Future<List<String>> getPageList(String url) async {
final res = (await client.get(Uri.parse(url))).body;
final res = (await client.get(Uri.parse(url), headers: getHeader(source.baseUrl),)).body;
List<String> pageUrls = [];
final urls = xpath(
res,
@@ -270,39 +240,27 @@ class MangaBox extends MProvider {
}
String popularUrlPath(String sourceName, int page) {
if (sourceName == "Manganato") {
return "genre-all/$page?type=topview";
} else if (sourceName == "Mangabat") {
return "manga-list-all/$page?type=topview";
} else if (sourceName == "Mangairo") {
if (sourceName != "Mangairo") {
return "manga-list/hot-manga?page=$page";
} else {
return "manga-list/type-topview/ctg-all/state-all/page-$page";
}
return "manga_list?type=topview&category=all&state=all&page=$page";
}
String latestUrlPath(String sourceName, int page) {
if (sourceName == "Manganato") {
return "genre-all/$page";
} else if (sourceName == "Mangabat") {
return "manga-list-all/$page";
} else if (sourceName == "Mangairo") {
if (sourceName != "Mangairo") {
return "manga-list/latest-manga?page=$page";
} else {
return "manga-list/type-latest/ctg-all/state-all/page-$page";
}
return "manga_list?type=latest&category=all&state=all&page=$page";
}
String simpleQueryPath(String sourceName, int page, String query) {
if (sourceName == "Mangakakalot") {
return "search/story/${normalizeSearchQuery(query)}?page=$page";
} else if (sourceName == "Mangairo") {
if (sourceName == "Mangairo") {
return "list/search/${normalizeSearchQuery(query)}?page=$page";
} else if (sourceName == "Mangabat") {
return "search/manga/${normalizeSearchQuery(query)}?page=$page";
} else if (sourceName == "Manganato") {
} else {
return "search/story/${normalizeSearchQuery(query)}?page=$page";
}
return "search/${normalizeSearchQuery(query)}?page=$page";
}
String normalizeSearchQuery(String query) {
@@ -331,12 +289,7 @@ class MangaBox extends MProvider {
return [];
}
return [
SelectFilter("KeywordFilter", "Keyword search:", 0, [
SelectFilterOption("Everything", ""),
SelectFilterOption("Title", "title"),
SelectFilterOption("Alt title", "alternative"),
SelectFilterOption("Author", "author"),
]),
HeaderFilter("NOTE: The filter is ignored when using text search."),
SelectFilter("SortFilter", "Order by:", 0, [
SelectFilterOption("Latest", "latest"),
SelectFilterOption("Newest", "newest"),
@@ -348,93 +301,53 @@ class MangaBox extends MProvider {
SelectFilterOption("Ongoing", "ongoing"),
SelectFilterOption("Dropped", "drop"),
]),
if (source.name == "Manganato" || source.name == "Mangabat")
GroupFilter("GenreListFilter", "Category:", [
TriStateFilter("Action", "2"),
TriStateFilter("Adult", "3"),
TriStateFilter("Adventure", "4"),
TriStateFilter("Comedy", "6"),
TriStateFilter("Cooking", "7"),
TriStateFilter("Doujinshi", "9"),
TriStateFilter("Drama", "10"),
TriStateFilter("Ecchi", "11"),
TriStateFilter("Fantasy", "12"),
TriStateFilter("Gender bender", "13"),
TriStateFilter("Harem", "14"),
TriStateFilter("Historical", "15"),
TriStateFilter("Horror", "16"),
TriStateFilter("Isekai", "45"),
TriStateFilter("Josei", "17"),
TriStateFilter("Manhua", "44"),
TriStateFilter("Manhwa", "43"),
TriStateFilter("Martial arts", "19"),
TriStateFilter("Mature", "20"),
TriStateFilter("Mecha", "21"),
TriStateFilter("Medical", "22"),
TriStateFilter("Mystery", "24"),
TriStateFilter("One shot", "25"),
TriStateFilter("Psychological", "26"),
TriStateFilter("Romance", "27"),
TriStateFilter("School life", "28"),
TriStateFilter("Sci fi", "29"),
TriStateFilter("Seinen", "30"),
TriStateFilter("Shoujo", "31"),
TriStateFilter("Shoujo ai", "32"),
TriStateFilter("Shounen", "33"),
TriStateFilter("Shounen ai", "34"),
TriStateFilter("Slice of life", "35"),
TriStateFilter("Smut", "36"),
TriStateFilter("Sports", "37"),
TriStateFilter("Supernatural", "38"),
TriStateFilter("Tragedy", "39"),
TriStateFilter("Webtoons", "40"),
TriStateFilter("Yaoi", "41"),
TriStateFilter("Yuri", "42"),
]),
if (source.name != "Manganato" && source.name != "Mangabat")
SelectFilter("GenreListFilter", "Category:", 0, [
SelectFilterOption("ALL", "all"),
SelectFilterOption("Action", "2"),
SelectFilterOption("Adult", "3"),
SelectFilterOption("Adventure", "4"),
SelectFilterOption("Comedy", "6"),
SelectFilterOption("Cooking", "7"),
SelectFilterOption("Doujinshi", "9"),
SelectFilterOption("Drama", "10"),
SelectFilterOption("Ecchi", "11"),
SelectFilterOption("Fantasy", "12"),
SelectFilterOption("Gender bender", "13"),
SelectFilterOption("Harem", "14"),
SelectFilterOption("Historical", "15"),
SelectFilterOption("Horror", "16"),
SelectFilterOption("Isekai", "45"),
SelectFilterOption("Josei", "17"),
SelectFilterOption("Manhua", "44"),
SelectFilterOption("Manhwa", "43"),
SelectFilterOption("Martial arts", "19"),
SelectFilterOption("Mature", "20"),
SelectFilterOption("Mecha", "21"),
SelectFilterOption("Medical", "22"),
SelectFilterOption("Mystery", "24"),
SelectFilterOption("One shot", "25"),
SelectFilterOption("Psychological", "26"),
SelectFilterOption("Romance", "27"),
SelectFilterOption("School life", "28"),
SelectFilterOption("Sci fi", "29"),
SelectFilterOption("Seinen", "30"),
SelectFilterOption("Shoujo", "31"),
SelectFilterOption("Shoujo ai", "32"),
SelectFilterOption("Shounen", "33"),
SelectFilterOption("Shounen ai", "34"),
SelectFilterOption("Slice of life", "35"),
SelectFilterOption("Smut", "36"),
SelectFilterOption("Sports", "37"),
SelectFilterOption("Supernatural", "38"),
SelectFilterOption("Tragedy", "39"),
SelectFilterOption("Webtoons", "40"),
SelectFilterOption("Yaoi", "41"),
SelectFilterOption("Yuri", "42"),
]),
SelectFilter("GenreListFilter", "Category:", 0, [
SelectFilterOption("ALL", "all"),
SelectFilterOption("Action", "action"),
SelectFilterOption("Adult", "adult"),
SelectFilterOption("Adventure", "adventure"),
SelectFilterOption("Comedy", "comedy"),
SelectFilterOption("Cooking", "cooking"),
SelectFilterOption("Doujinshi", "doujinshi"),
SelectFilterOption("Drama", "drama"),
SelectFilterOption("Ecchi", "ecchi"),
SelectFilterOption("Fantasy", "fantasy"),
SelectFilterOption("Gender Bender", "gender-bender"),
SelectFilterOption("Harem", "harem"),
SelectFilterOption("Historical", "historical"),
SelectFilterOption("Horror", "horror"),
SelectFilterOption("Isekai", "isekai"),
SelectFilterOption("Josei", "josei"),
SelectFilterOption("Manhua", "manhua"),
SelectFilterOption("Manhwa", "manhwa"),
SelectFilterOption("Martial arts", "martial-arts"),
SelectFilterOption("Mature", "mature"),
SelectFilterOption("Mecha", "mecha"),
SelectFilterOption("Medical", "medical"),
SelectFilterOption("Mystery", "mystery"),
SelectFilterOption("One shot", "one-shot"),
SelectFilterOption("Psychological", "psychological"),
SelectFilterOption("Reincarnation", "reincarnation"),
SelectFilterOption("Romance", "romance"),
SelectFilterOption("School life", "school-life"),
SelectFilterOption("Sci fi", "sci-fi"),
SelectFilterOption("Seinen", "seinen"),
SelectFilterOption("Shoujo", "shoujo"),
SelectFilterOption("Shoujo ai", "shoujo-ai"),
SelectFilterOption("Shounen", "shounen"),
SelectFilterOption("Shounen ai", "shounen-ai"),
SelectFilterOption("Slice of life", "slice-of-life"),
SelectFilterOption("Smut", "smut"),
SelectFilterOption("Sports", "sports"),
SelectFilterOption("Supernatural", "supernatural"),
SelectFilterOption("Survival", "survival"),
SelectFilterOption("System", "system"),
SelectFilterOption("Thriller", "thriller"),
SelectFilterOption("Tragedy", "tragedy"),
SelectFilterOption("Webtoons", "webtoons"),
SelectFilterOption("Yaoi", "yaoi"),
SelectFilterOption("Yuri", "yuri"),
]),
];
}
@@ -447,7 +360,10 @@ class MangaBox extends MProvider {
}
Map<String, String> getHeader(String url) {
final headers = {'referer': '$url/'};
final Map<String, String> headers = {
"Referer": "$url/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
};
return headers;
}

View File

@@ -4,7 +4,7 @@ import 'src/mangairo/mangaeiro.dart';
import 'src/mangakakalot/mangakakalot.dart';
import 'src/manganato/manganato.dart';
const mangaboxVersion = "0.0.6";
const mangaboxVersion = "0.0.65";
const mangaboxSourceCodeUrl =
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/mangabox/mangabox.dart";

View File

@@ -4,7 +4,7 @@ Source get mangabatSource => _mangabatSource;
Source _mangabatSource = Source(
name: "Mangabat",
baseUrl: "https://m.mangabat.com",
baseUrl: "https://www.mangabats.com",
lang: "en",
typeSource: "mangabox",
iconUrl:

View File

@@ -4,7 +4,7 @@ Source get mangakakalotSource => _mangakakalotSource;
Source _mangakakalotSource = Source(
name: "Mangakakalot",
baseUrl: "https://mangakakalot.com",
baseUrl: "https://www.mangakakalot.gg",
lang: "en",
typeSource: "mangabox",
iconUrl:

View File

@@ -4,7 +4,7 @@ Source get manganatoSource => _manganatoSource;
Source _manganatoSource = Source(
name: "Manganato",
baseUrl: "https://manganato.com",
baseUrl: "https://www.natomanga.com",
lang: "en",
typeSource: "mangabox",
iconUrl:

File diff suppressed because one or more lines are too long

View File

@@ -7,7 +7,7 @@ const mangayomiSources = [{
"typeSource": "single",
"isManga": true,
"isNsfw": false,
"version": "0.0.3",
"version": "0.0.35",
"dateFormat": "",
"dateFormatLocale": "",
"pkgPath": "manga/src/all/webtoons.js"
@@ -137,7 +137,7 @@ class DefaultExtension extends MProvider {
const res = await new Client().get(url);
const doc = new Document(res.body);
const info = doc.selectFirst("div.cont_box");
const cover = info.selectFirst("div.detail_body")?.attr("style")?.substringAfter("url(")?.substringBeforeLast(")") ?? info.selectFirst("span.thmb img").attr('src');
const cover = info.selectFirst("div.detail_body")?.attr("style")?.match(/url\(['"]?(.*?)['"]?\)/)?.[1] ?? info.selectFirst("span.thmb img")?.attr("src");
const title = info.selectFirst("h1.subj, h3.subj").text.trim();
const genre = Array.from(info.select("p.genre")).map(el => el.text) != '' ? Array.from(info.select("p.genre")).map(el => el.text) : [info.selectFirst("div.info h2").text];
const author = info.selectFirst("div.author_area").text.replace(/\s+/g, ' ').replace(/author info/g, '').trim() ?? info.selectFirst("a.author").text;