This commit is contained in:
kodjodevf 2023-04-11 17:38:40 +01:00
parent 8511944d20
commit d6dec733a7
8 changed files with 210 additions and 23 deletions

View file

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:flex_color_scheme/flex_color_scheme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -14,7 +16,20 @@ import 'views/more/settings/appearance/providers/flex_scheme_color_state_provide
import 'views/more/settings/appearance/providers/theme_mode_state_provider.dart';
void main() async {
await Hive.initFlutter();
if (Platform.isAndroid || Platform.isIOS) {
await Hive.initFlutter();
} else {
final path = Directory("Mangayomi");
final path1 = Directory("${path.path}/DataBase");
if (!(await path.exists())) {
path.create();
}
if (!(await path1.exists())) {
path1.create();
}
await Hive.initFlutter(path1.path);
}
Hive.registerAdapter(ModelMangaAdapter());
Hive.registerAdapter(MangaHistoryModelAdapter());
Hive.registerAdapter(SourceModelAdapter());

View file

@ -37,19 +37,17 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
defaultValue: []);
final incognitoMode = ref.watch(incognitoModeStateProvider);
Directory? pathh;
if (Platform.isWindows) {
pathh = await getApplicationDocumentsDirectory();
} else if (Platform.isAndroid) {
if (Platform.isAndroid || Platform.isIOS) {
pathh = await getExternalStorageDirectory();
} else {
pathh = await getApplicationDocumentsDirectory();
}
path = Directory(
"${pathh!.path}/${modelManga.source}/${modelManga.name}/${modelManga.chapterTitle![index]}/");
if (!incognitoMode) {
if (hiveUrl.isNotEmpty) {
urll = hiveUrl;
}
if (hiveUrl.isNotEmpty) {
urll = hiveUrl;
}
/*********/
@ -65,9 +63,7 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
};
var request = http.Request('GET',
Uri.parse('https://api.comick.fun/chapter/$mangaId?tachiyomi=true'));
request.headers.addAll(headers);
http.StreamedResponse response = await request.send();
if (response.statusCode == 200) {
@ -160,9 +156,47 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
urll.add(
'https://cdn.mangakawaii.pics/uploads/manga/$mangaSlug/chapters_fr/$chapterSlug/$tt');
}
ref.watch(hiveBoxMangaInfo).put(
"${modelManga.source}/${modelManga.name}/${modelManga.chapterTitle![index]}-pageurl",
urll);
if (!incognitoMode) {
ref.watch(hiveBoxMangaInfo).put(
"${modelManga.source}/${modelManga.name}/${modelManga.chapterTitle![index]}-pageurl",
urll);
}
}
/***********/
/*mmrcms*/
/***********/
else if (getWpMangTypeSource(source) == TypeSource.mmrcms) {
final dom =
await httpResToDom(url: modelManga.chapterUrl![index], headers: {});
if (dom.querySelectorAll('#all > .img-responsive').isNotEmpty) {
urll = dom.querySelectorAll('#all > .img-responsive').map((e) {
log(e.outerHtml);
final RegExp regexx = RegExp(r'data-src="([^"]+)"');
if (modelManga.source!.toLowerCase() == 'jpmangas' ||
modelManga.source!.toLowerCase() == 'fr scan') {
return regexx
.allMatches(e.outerHtml)
.first
.group(1)!
.replaceAll('//', 'https://')
.replaceAll(RegExp(r"\s+\b|\b\s"), "");
}
return regexx
.allMatches(e.outerHtml)
.first
.group(1)!
.replaceAll(RegExp(r"\s+\b|\b\s"), "");
}).toList();
// log(message)
if (!incognitoMode) {
ref.watch(hiveBoxMangaInfo).put(
"${modelManga.source}/${modelManga.name}/${modelManga.chapterTitle![index]}-pageurl",
urll);
}
}
}
/***********/
@ -217,7 +251,6 @@ Future<GetMangaChapterUrlModel> getMangaChapterUrl(
.replaceAll("eval", "");
String deobfuscatedScript = flutterJs.evaluate(script).toString();
// log(deobfuscatedScript);
List<String> urlss = deobfuscatedScript
.substring(
deobfuscatedScript.indexOf("newImgs=['") + "newImgs=['".length,

View file

@ -6,6 +6,7 @@ import 'package:mangayomi/models/comick/manga_detail_comick.dart';
import 'package:mangayomi/services/get_popular_manga.dart';
import 'package:mangayomi/services/http_res_to_dom_html.dart';
import 'package:mangayomi/source/source_model.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'get_manga_detail.g.dart';
@ -405,6 +406,98 @@ Future<GetMangaDetailModel> getMangaDetail(GetMangaDetailRef ref,
}
}
/***********/
/*mmrcms*/
/***********/
else if (getWpMangTypeSource(source) == TypeSource.mmrcms) {
final dom = await httpResToDom(url: url, headers: {});
description = dom
.querySelectorAll('.row .well p')
.map((e) => e.text.trim())
.toList()
.first;
status = dom
.querySelectorAll('.row .dl-horizontal dt')
.where((e) =>
e.innerHtml.toString().toLowerCase().contains("status") ||
e.innerHtml.toString().toLowerCase().contains("statut") ||
e.innerHtml.toString().toLowerCase().contains("estado") ||
e.innerHtml.toString().toLowerCase().contains("durum"))
.map((e) => e.nextElementSibling!.text.trim())
.toList()
.first;
if (dom.querySelectorAll(".row .dl-horizontal dt").isNotEmpty) {
author = dom
.querySelectorAll('.row .dl-horizontal dt')
.where((e) =>
e.innerHtml.toString().toLowerCase().contains("auteur(s)") ||
e.innerHtml.toString().toLowerCase().contains("author(s)") ||
e.innerHtml.toString().toLowerCase().contains("autor(es)") ||
e.innerHtml.toString().toLowerCase().contains("yazar(lar)") ||
e.innerHtml.toString().toLowerCase().contains("mangaka(lar)") ||
e.innerHtml
.toString()
.toLowerCase()
.contains("pengarang/penulis") ||
e.innerHtml.toString().toLowerCase().contains("autor") ||
e.innerHtml.toString().toLowerCase().contains("penulis"))
.map((e) => e.nextElementSibling!.text
.trim()
.replaceAll(RegExp(r"\s+\b|\b\s"), ""))
.toList()
.first;
final genr = dom
.querySelectorAll('.row .dl-horizontal dt')
.where((e) =>
e.innerHtml.toString().toLowerCase().contains("categories") ||
e.innerHtml.toString().toLowerCase().contains("categorías") ||
e.innerHtml.toString().toLowerCase().contains("catégories") ||
e.innerHtml.toString().toLowerCase().contains("kategoriler") ||
e.innerHtml.toString().toLowerCase().contains("categorias") ||
e.innerHtml.toString().toLowerCase().contains("kategorie") ||
e.innerHtml.toString().toLowerCase().contains("kategori") ||
e.innerHtml.toString().toLowerCase().contains("tagi"))
.map((e) => e.nextElementSibling!.text.trim())
.toList();
if (genr.isNotEmpty) {
genre = genr.first.replaceAll(RegExp(r"\s+\b|\b\s"), "").split(',');
}
}
final rrr = dom.querySelectorAll(".row [class^=img-responsive]");
final data = rrr.map((e) => e.outerHtml).toList();
if (source.toLowerCase() == 'jpmangas' ||
source.toLowerCase() == 'fr scan') {
imageUrl = regSrcMatcher(data.first).replaceAll('//', 'https://');
} else {
imageUrl = regSrcMatcher(data.first);
}
final ttt = dom
.querySelectorAll("ul[class^=chapters] > li:not(.btn), table.table tr");
if (ttt.isNotEmpty) {
final data = ttt
.map((e) => e.querySelector("[class^=chapter-title-rtl]")!)
.toList();
var name = data;
for (var iaa in name) {
chapterTitle.add(iaa.getElementsByTagName("a").first.text);
chapterUrl
.add(regHrefMatcher(iaa.getElementsByTagName("a").first.outerHtml));
}
final date = ttt
.map((e) => e
.getElementsByClassName("date-chapter-title-rtl")
.map((e) => e.text.trim())
.first)
.toList();
for (var da in date) {
chapterDate.add(da);
}
}
}
/***********/
/*mangahere*/
/***********/

View file

@ -139,9 +139,39 @@ Future<GetMangaModel> getPopularManga(GetPopularMangaRef ref,
.querySelectorAll('a > div > div.hot-manga__item-name')
.map((e) => e.innerHtml)
.toList();
for (var ia in name) {
image.add("");
}
}
}
/***********/
/*mmrcms*/
/***********/
else if (getWpMangTypeSource(source) == TypeSource.mmrcms) {
final dom = await httpResToDom(
url:
'${getWpMangaUrl(source)}/filterList?page=$page&sortBy=views&asc=false',
headers: {});
final urlElement = dom.getElementsByClassName('chart-title');
for (var e in urlElement) {
RegExp exp = RegExp(r'href="([^"]+)"');
Iterable<Match> matches = exp.allMatches(e.outerHtml);
String? firstMatch = matches.first.group(1);
url.add(firstMatch);
name.add(e.text);
}
final imgElement = dom.getElementsByTagName('img');
for (var e in imgElement) {
RegExp exp = RegExp(r'src="([^"]+)"');
Iterable<Match> matches = exp.allMatches(e.outerHtml);
String? firstMatch = matches.first.group(1);
image.add(firstMatch);
}
}
/***********/
/*mangahere*/
/***********/

View file

@ -421,10 +421,10 @@ List<SourceModel> sourcesList = [
lang: "fr",
typeSource: TypeSource.mmrcms,
logoUrl: ''),
SourceModel(
sourceName: "FR Scan",
url: "https://frscan.ws",
lang: "fr",
typeSource: TypeSource.mmrcms,
logoUrl: ''),
// SourceModel(
// sourceName: "FR Scan",
// url: "https://frscan.ws",
// lang: "fr",
// typeSource: TypeSource.mmrcms,
// logoUrl: ''),
];

View file

@ -0,0 +1,13 @@
String regHrefMatcher(String input) {
RegExp exp = RegExp(r'href="([^"]+)"');
Iterable<Match> matches = exp.allMatches(input);
String? firstMatch = matches.first.group(1);
return firstMatch!;
}
String regSrcMatcher(String input) {
RegExp exp = RegExp(r'src="([^"]+)"');
Iterable<Match> matches = exp.allMatches(input);
String? firstMatch = matches.first.group(1);
return firstMatch!;
}

View file

@ -89,6 +89,7 @@ class _BrowseScreenState extends State<BrowseScreen>
onPressed: () {
if (_tabBarController.index == 0) {
} else if (_tabBarController.index == 1) {
_textEditingController.clear();
context.push('/extensionLang');
} else {}
},

View file

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:mangayomi/models/manga_history.dart';
import 'package:mangayomi/models/manga_reader.dart';
import 'package:mangayomi/models/model_manga.dart';
@ -142,9 +144,9 @@ class ReaderController extends _$ReaderController {
int getPageLength(List incognitoPageLength) {
final incognitoMode = ref.watch(incognitoModeStateProvider);
if (!incognitoMode) {
final page = ref.watch(hiveBoxMangaInfo).get(
List<dynamic> page = ref.watch(hiveBoxMangaInfo).get(
"${getSourceName()}/${getMangaName()}/${getChapterTitle()}-pageurl",
) as List;
);
return page.length;
}
return incognitoPageLength.length;