diff --git a/lib/main.dart b/lib/main.dart index 88e276a..9bbc04d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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()); diff --git a/lib/services/get_manga_chapter_url.dart b/lib/services/get_manga_chapter_url.dart index 86ab0eb..f71c2b6 100644 --- a/lib/services/get_manga_chapter_url.dart +++ b/lib/services/get_manga_chapter_url.dart @@ -37,19 +37,17 @@ Future 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 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 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 getMangaChapterUrl( .replaceAll("eval", ""); String deobfuscatedScript = flutterJs.evaluate(script).toString(); - // log(deobfuscatedScript); List urlss = deobfuscatedScript .substring( deobfuscatedScript.indexOf("newImgs=['") + "newImgs=['".length, diff --git a/lib/services/get_manga_detail.dart b/lib/services/get_manga_detail.dart index 6207950..9bd1619 100644 --- a/lib/services/get_manga_detail.dart +++ b/lib/services/get_manga_detail.dart @@ -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 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*/ /***********/ diff --git a/lib/services/get_popular_manga.dart b/lib/services/get_popular_manga.dart index 0c50789..baabb5d 100644 --- a/lib/services/get_popular_manga.dart +++ b/lib/services/get_popular_manga.dart @@ -139,9 +139,39 @@ Future 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 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 matches = exp.allMatches(e.outerHtml); + String? firstMatch = matches.first.group(1); + image.add(firstMatch); + } + } + /***********/ /*mangahere*/ /***********/ diff --git a/lib/source/source_list.dart b/lib/source/source_list.dart index 65535c8..b9387d3 100644 --- a/lib/source/source_list.dart +++ b/lib/source/source_list.dart @@ -421,10 +421,10 @@ List 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: ''), ]; diff --git a/lib/utils/reg_exp_matcher.dart b/lib/utils/reg_exp_matcher.dart new file mode 100644 index 0000000..1bb4d4a --- /dev/null +++ b/lib/utils/reg_exp_matcher.dart @@ -0,0 +1,13 @@ +String regHrefMatcher(String input) { + RegExp exp = RegExp(r'href="([^"]+)"'); + Iterable matches = exp.allMatches(input); + String? firstMatch = matches.first.group(1); + return firstMatch!; +} + +String regSrcMatcher(String input) { + RegExp exp = RegExp(r'src="([^"]+)"'); + Iterable matches = exp.allMatches(input); + String? firstMatch = matches.first.group(1); + return firstMatch!; +} \ No newline at end of file diff --git a/lib/views/browse/browse_screen.dart b/lib/views/browse/browse_screen.dart index bbc9c9c..4f4f499 100644 --- a/lib/views/browse/browse_screen.dart +++ b/lib/views/browse/browse_screen.dart @@ -89,6 +89,7 @@ class _BrowseScreenState extends State onPressed: () { if (_tabBarController.index == 0) { } else if (_tabBarController.index == 1) { + _textEditingController.clear(); context.push('/extensionLang'); } else {} }, diff --git a/lib/views/manga/reader/providers/reader_controller_provider.dart b/lib/views/manga/reader/providers/reader_controller_provider.dart index a5adbb6..9146034 100644 --- a/lib/views/manga/reader/providers/reader_controller_provider.dart +++ b/lib/views/manga/reader/providers/reader_controller_provider.dart @@ -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 page = ref.watch(hiveBoxMangaInfo).get( "${getSourceName()}/${getMangaName()}/${getChapterTitle()}-pageurl", - ) as List; + ); return page.length; } return incognitoPageLength.length;