mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-15 11:21:11 +00:00
Reorganize folders
This commit is contained in:
246
dart/manga/multisrc/heancms/heancms.dart
Normal file
246
dart/manga/multisrc/heancms/heancms.dart
Normal file
@@ -0,0 +1,246 @@
|
||||
import 'package:mangayomi/bridge_lib.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
class HeanCms extends MProvider {
|
||||
HeanCms({required this.source});
|
||||
|
||||
MSource source;
|
||||
|
||||
final Client client = Client(source);
|
||||
|
||||
@override
|
||||
Future<MPages> getPopular(int page) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
String res = "";
|
||||
if (!useNewQueryEndpoint(source.name)) {
|
||||
final url = "${source.apiUrl}/series/querysearch";
|
||||
|
||||
final body = {
|
||||
"page": page,
|
||||
"order": "desc",
|
||||
"order_by": "total_views",
|
||||
"series_status": "Ongoing",
|
||||
"series_type": "Comic"
|
||||
};
|
||||
res = (await client.post(Uri.parse(url), headers: headers, body: body))
|
||||
.body;
|
||||
} else {
|
||||
final newEndpointUrl =
|
||||
"${source.apiUrl}/query/?page=$page&query_string=&series_status=All&order=desc&orderBy=total_views&perPage=12&tags_ids=[]&series_type=Comic";
|
||||
res =
|
||||
(await client.get(Uri.parse(newEndpointUrl), headers: headers)).body;
|
||||
}
|
||||
return mMangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> getLatestUpdates(int page) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
String res = "";
|
||||
if (!useNewQueryEndpoint(source.name)) {
|
||||
final url = "${source.apiUrl}/series/querysearch";
|
||||
final body = {
|
||||
"page": page,
|
||||
"order": "desc",
|
||||
"order_by": "latest",
|
||||
"series_status": "Ongoing",
|
||||
"series_type": "Comic"
|
||||
};
|
||||
res = (await client.post(Uri.parse(url), headers: headers, body: body))
|
||||
.body;
|
||||
} else {
|
||||
final newEndpointUrl =
|
||||
"${source.apiUrl}/query/?page=$page&query_string=&series_status=All&order=desc&orderBy=latest&perPage=12&tags_ids=[]&series_type=Comic";
|
||||
res =
|
||||
(await client.get(Uri.parse(newEndpointUrl), headers: headers)).body;
|
||||
}
|
||||
return mMangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MPages> search(String query, int page, FilterList filterList) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
String res = "";
|
||||
if (!useNewQueryEndpoint(source.source)) {
|
||||
final url = "${source.apiUrl}/series/search";
|
||||
final body = {"term": query};
|
||||
res = (await client.post(Uri.parse(url), headers: headers, body: body))
|
||||
.body;
|
||||
} else {
|
||||
final newEndpointUrl =
|
||||
"${source.apiUrl}/query/?page=$page&query_string=$query&series_status=All&order=desc&orderBy=total_views&perPage=12&tags_ids=[]&series_type=Comic";
|
||||
res =
|
||||
(await client.get(Uri.parse(newEndpointUrl), headers: headers)).body;
|
||||
}
|
||||
return mMangaRes(res);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<MManga> getDetail(String url) async {
|
||||
MManga manga = MManga();
|
||||
String currentSlug = substringAfterLast(url, "/");
|
||||
final headers = getHeader(source.baseUrl);
|
||||
final res = (await client.get(
|
||||
Uri.parse("${source.apiUrl}/series/$currentSlug"),
|
||||
headers: headers))
|
||||
.body;
|
||||
manga.author = getMapValue(res, "author");
|
||||
manga.description = getMapValue(res, "description");
|
||||
manga.genre = jsonPathToString(res, r"$.tags[*].name", "._").split("._");
|
||||
List<String> chapterTitles = [];
|
||||
List<String> chapterUrls = [];
|
||||
List<String> chapterDates = [];
|
||||
|
||||
if (!useNewQueryEndpoint(source.name)) {
|
||||
for (var chapter in json.decode(res)["chapters"]) {
|
||||
final chapterName = chapter["chapter_name"];
|
||||
final chapterSlug = chapter["chapter_slug"];
|
||||
final chapterId = chapter["id"];
|
||||
final createdAt = chapter["created_at"];
|
||||
chapterUrls.add("/series/$currentSlug/$chapterSlug#$chapterId");
|
||||
chapterTitles.add(chapterName);
|
||||
chapterDates.add(createdAt);
|
||||
}
|
||||
} else {
|
||||
final seasons = json.decode(res)["seasons"].first;
|
||||
for (var chapter in seasons["chapters"]) {
|
||||
final chapterName = chapter["chapter_name"];
|
||||
final chapterSlug = chapter["chapter_slug"];
|
||||
final chapterId = chapter["id"];
|
||||
final createdAt = chapter["created_at"];
|
||||
chapterUrls.add("/series/$currentSlug/$chapterSlug#$chapterId");
|
||||
chapterTitles.add(chapterName);
|
||||
chapterDates.add(createdAt);
|
||||
}
|
||||
}
|
||||
final dateUploads =
|
||||
parseDates(chapterDates, source.dateFormat, source.dateFormatLocale);
|
||||
List<MChapter>? chaptersList = [];
|
||||
for (var i = 0; i < chapterTitles.length; i++) {
|
||||
MChapter chapter = MChapter();
|
||||
chapter.name = chapterTitles[i];
|
||||
chapter.url = chapterUrls[i];
|
||||
chapter.dateUpload = dateUploads[i];
|
||||
chaptersList.add(chapter);
|
||||
}
|
||||
if (!useNewQueryEndpoint(source.name)) {
|
||||
chaptersList = chaptersList.reversed.toList();
|
||||
}
|
||||
|
||||
manga.chapters = chaptersList;
|
||||
return manga;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<String>> getPageList(String url) async {
|
||||
final headers = getHeader(source.baseUrl);
|
||||
|
||||
String res = "".toString();
|
||||
if (!useslugStrategy(source.name)) {
|
||||
String chapterId = substringAfter(url, '#');
|
||||
res = (await client.get(
|
||||
Uri.parse("${source.apiUrl}/series/chapter/$chapterId"),
|
||||
headers: headers))
|
||||
.body;
|
||||
} else {
|
||||
res = (await client.get(Uri.parse("${source.baseUrl}$url"),
|
||||
headers: headers))
|
||||
.body;
|
||||
|
||||
List<String> pageUrls = [];
|
||||
var imagesRes = parseHtml(res)
|
||||
.selectFirst("div.min-h-screen > div.container > p.items-center")
|
||||
.innerHtml;
|
||||
|
||||
pageUrls = xpath(imagesRes, '//img/@src');
|
||||
|
||||
pageUrls.addAll(xpath(imagesRes, '//img/@data-src'));
|
||||
|
||||
return pageUrls.where((e) => e.isNotEmpty).toList();
|
||||
}
|
||||
|
||||
final pages = jsonPathToList(res, r"$.content.images[*]", 0);
|
||||
List<String> pageUrls = [];
|
||||
for (var u in pages) {
|
||||
final url = u.replaceAll('"', "");
|
||||
if (url.startsWith("http")) {
|
||||
pageUrls.add(url);
|
||||
} else {
|
||||
pageUrls.add("${source.apiUrl}/$url");
|
||||
}
|
||||
}
|
||||
return pageUrls;
|
||||
}
|
||||
|
||||
MPages mMangaRes(String res) {
|
||||
bool hasNextPage = true;
|
||||
List<MManga> mangaList = [];
|
||||
List<String> names = [];
|
||||
List<String> urls = [];
|
||||
List<String> images = [];
|
||||
if (res.startsWith("{")) {
|
||||
for (var a in json.decode(res)["data"]) {
|
||||
String thumbnail = a["thumbnail"];
|
||||
if (thumbnail.startsWith("https://")) {
|
||||
images.add(thumbnail);
|
||||
} else {
|
||||
images.add("${source.apiUrl}/cover/$thumbnail");
|
||||
}
|
||||
names.add(a["title"]);
|
||||
final seriesSlug = a["series_slug"];
|
||||
urls.add("/series/$seriesSlug");
|
||||
}
|
||||
} else {
|
||||
for (var a in json.decode(res)) {
|
||||
String thumbnail = a["thumbnail"];
|
||||
if (thumbnail.startsWith("https://")) {
|
||||
images.add(thumbnail);
|
||||
} else {
|
||||
images.add("${source.apiUrl}/cover/$thumbnail");
|
||||
}
|
||||
names.add(a["title"]);
|
||||
final seriesSlug = a["series_slug"];
|
||||
urls.add("/series/$seriesSlug");
|
||||
}
|
||||
hasNextPage = false;
|
||||
}
|
||||
|
||||
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, hasNextPage);
|
||||
}
|
||||
|
||||
bool useNewQueryEndpoint(String sourceName) {
|
||||
List<String> sources = [
|
||||
"YugenMangas",
|
||||
"Perf Scan",
|
||||
"Reaper Scans",
|
||||
"OmegaScans"
|
||||
];
|
||||
return sources.contains(sourceName);
|
||||
}
|
||||
|
||||
bool useslugStrategy(String sourceName) {
|
||||
List<String> sources = [
|
||||
"YugenMangas",
|
||||
"Reaper Scans",
|
||||
"Perf Scan",
|
||||
"OmegaScans"
|
||||
];
|
||||
return sources.contains(sourceName);
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, String> getHeader(String url) {
|
||||
final headers = {'Origin': url, 'Referer': '$url/'};
|
||||
return headers;
|
||||
}
|
||||
|
||||
HeanCms main(MSource source) {
|
||||
return HeanCms(source: source);
|
||||
}
|
||||
22
dart/manga/multisrc/heancms/sources.dart
Normal file
22
dart/manga/multisrc/heancms/sources.dart
Normal file
@@ -0,0 +1,22 @@
|
||||
import '../../../../model/source.dart';
|
||||
import 'src/yugenmangas/yugenmangas.dart';
|
||||
import 'src/omegascans/omegascans.dart';
|
||||
import 'src/perfscan/perfscan.dart';
|
||||
|
||||
const heancmsVersion = "0.0.75";
|
||||
const heancmsSourceCodeUrl =
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/heancms/heancms.dart";
|
||||
|
||||
List<Source> get heancmsSourcesList => _heancmsSourcesList;
|
||||
List<Source> _heancmsSourcesList = [
|
||||
//YugenMangas (ES)
|
||||
yugenmangasSource,
|
||||
//OmegaScans (EN)
|
||||
omegascansSource,
|
||||
//Perf Scan (FR)
|
||||
perfscanSource,
|
||||
]
|
||||
.map((e) => e
|
||||
..sourceCodeUrl = heancmsSourceCodeUrl
|
||||
..version = heancmsVersion)
|
||||
.toList();
|
||||
BIN
dart/manga/multisrc/heancms/src/omegascans/icon.png
Normal file
BIN
dart/manga/multisrc/heancms/src/omegascans/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.5 KiB |
16
dart/manga/multisrc/heancms/src/omegascans/omegascans.dart
Normal file
16
dart/manga/multisrc/heancms/src/omegascans/omegascans.dart
Normal file
@@ -0,0 +1,16 @@
|
||||
import '../../../../../../model/source.dart';
|
||||
|
||||
Source get omegascansSource => _omegascansSource;
|
||||
|
||||
Source _omegascansSource = Source(
|
||||
name: "OmegaScans",
|
||||
baseUrl: "https://omegascans.org",
|
||||
apiUrl: "https://api.omegascans.org",
|
||||
lang: "en",
|
||||
isNsfw: true,
|
||||
typeSource: "heancms",
|
||||
iconUrl:
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/heancms/src/omegascans/icon.png",
|
||||
dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
|
||||
dateFormatLocale: "en",
|
||||
);
|
||||
BIN
dart/manga/multisrc/heancms/src/perfscan/icon.png
Normal file
BIN
dart/manga/multisrc/heancms/src/perfscan/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.0 KiB |
15
dart/manga/multisrc/heancms/src/perfscan/perfscan.dart
Normal file
15
dart/manga/multisrc/heancms/src/perfscan/perfscan.dart
Normal file
@@ -0,0 +1,15 @@
|
||||
import '../../../../../../model/source.dart';
|
||||
|
||||
Source get perfscanSource => _perfscanSource;
|
||||
|
||||
Source _perfscanSource = Source(
|
||||
name: "Perf Scan",
|
||||
baseUrl: "https://perf-scan.fr",
|
||||
apiUrl: "https://api.perf-scan.fr",
|
||||
lang: "fr",
|
||||
typeSource: "heancms",
|
||||
iconUrl:
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/heancms/src/perfscan/icon.png",
|
||||
dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
|
||||
dateFormatLocale: "en",
|
||||
);
|
||||
BIN
dart/manga/multisrc/heancms/src/yugenmangas/icon.png
Normal file
BIN
dart/manga/multisrc/heancms/src/yugenmangas/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
16
dart/manga/multisrc/heancms/src/yugenmangas/yugenmangas.dart
Normal file
16
dart/manga/multisrc/heancms/src/yugenmangas/yugenmangas.dart
Normal file
@@ -0,0 +1,16 @@
|
||||
import '../../../../../../model/source.dart';
|
||||
|
||||
Source get yugenmangasSource => _yugenmangasSource;
|
||||
|
||||
Source _yugenmangasSource = Source(
|
||||
name: "YugenMangas",
|
||||
baseUrl: "https://yugenmangas.lat",
|
||||
apiUrl: "https://api.yugenmangas.net",
|
||||
lang: "es",
|
||||
isNsfw: true,
|
||||
typeSource: "heancms",
|
||||
iconUrl:
|
||||
"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/$branchName/dart/manga/multisrc/heancms/src/yugenmangas/icon.png",
|
||||
dateFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
|
||||
dateFormatLocale: "en",
|
||||
);
|
||||
Reference in New Issue
Block a user