This commit is contained in:
kodjomoustapha 2024-01-05 09:09:24 +01:00
parent d830967037
commit d5cfd1f25f
12 changed files with 68 additions and 55 deletions

View file

@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.8.0'
ext.kotlin_version = '1.9.0'
repositories {
google()
mavenCentral()

View file

@ -111,10 +111,8 @@ class $MDocument implements MDocument, $Instance {
),
'xpath': BridgeMethodDef(
BridgeFunctionDef(
returns: BridgeTypeAnnotation(
BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)]),
nullable: true),
returns: BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])),
params: [
BridgeParameter(
'xpath',
@ -249,9 +247,7 @@ class $MDocument implements MDocument, $Instance {
static $Value? _xpath(
final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MDocument).xpath(args[0]?.$value);
return res == null
? const $null()
: $List.wrap(res.map((e) => $String(e)).toList());
return $List.wrap(res.map((e) => $String(e)).toList());
}
static const $Function __xpathFirst = $Function(_xpathFirst);
@ -268,7 +264,7 @@ class $MDocument implements MDocument, $Instance {
MElement? selectFirst(String selector) => $value.selectFirst(selector);
@override
List<String>? xpath(String xpath) => $value.xpath(xpath);
List<String> xpath(String xpath) => $value.xpath(xpath);
@override
String? xpathFirst(String xpath) => $value.xpathFirst(xpath);

View file

@ -27,15 +27,11 @@ class MDocument {
}
String? xpathFirst(String xpath) {
return _document?.outerHtml == null
? null
: _document?.xpathFirst(xpath, _document.outerHtml);
return _document?.xpathFirst(xpath);
}
List<String>? xpath(String xpath) {
return _document?.outerHtml == null
? null
: _document?.xpath(xpath, _document.outerHtml);
List<String> xpath(String xpath) {
return _document?.xpath(xpath) ?? [];
}
List<MElement>? getElementsByClassName(String classNames) {

View file

@ -1,4 +1,5 @@
import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart';
@ -79,5 +80,22 @@ Future<dynamic> updateMangaDetail(UpdateMangaDetailRef ref,
chap.manga.saveSync();
}
}
final oldChapers =
isar.mangas.getSync(mangaId)!.chapters.toList().reversed.toList();
if (oldChapers.length == chaps.length) {
for (var oldChap in oldChapers) {
final newChap = chaps.firstWhere(
(e) => e.name == oldChap.name,
orElse: () => MChapter(),
);
if (newChap.url != null &&
newChap.url!.isNotEmpty &&
newChap.url != oldChap.url) {
oldChap.url = newChap.url;
isar.chapters.putSync(oldChap);
oldChap.manga.saveSync();
}
}
}
});
}

View file

@ -50,6 +50,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
final ScrollController _scrollController = ScrollController();
int _fullDataLength = 50;
int _page = 1;
bool _hasNextPage = true;
late int _selectedIndex = widget.isLatest
? 1
: widget.isSearch
@ -97,6 +98,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
if (mounted) {
setState(() {
_page = _page + 1;
_hasNextPage = mangaResList!.hasNextPage;
});
}
}
@ -325,7 +327,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
return const ProgressCenter();
}
Widget buildProgressIndicator() {
return !(data!.list.isNotEmpty && (data.hasNextPage))
return !(data!.list.isNotEmpty && (_hasNextPage))
? Container()
: _isLoading
? const Center(
@ -346,19 +348,21 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
borderRadius:
BorderRadius.circular(5))),
onPressed: () {
if (mounted) {
setState(() {
_isLoading = true;
});
}
_loadMore().then((value) {
if (mounted && value != null) {
if (!_getManga!.isLoading) {
if (mounted) {
setState(() {
_mangaList.addAll(value.list);
_isLoading = false;
_isLoading = true;
});
}
});
_loadMore().then((value) {
if (mounted && value != null) {
setState(() {
_mangaList.addAll(value.list);
_isLoading = false;
});
}
});
}
},
child: Column(
mainAxisAlignment:
@ -383,8 +387,9 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
if (_mangaList.isNotEmpty &&
(data.hasNextPage) &&
!_isLoading) {
(_hasNextPage) &&
!_isLoading &&
!_getManga!.isLoading) {
if (mounted) {
setState(() {
_isLoading = true;

View file

@ -499,5 +499,5 @@ List<String>? _getFilterScanlator(Manga manga) {
final scanlators = isar.settings.getSync(227)!.filterScanlatorList ?? [];
final filter =
scanlators.where((element) => element.mangaId == manga.id).toList();
return filter.isEmpty ? null : filter.first.scanlators;
return filter.firstOrNull?.scanlators;
}

View file

@ -122,7 +122,6 @@ class MangaReaderView extends ConsumerWidget {
onWillPop: () async {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
overlays: SystemUiOverlay.values);
;
Navigator.pop(context);
return false;
},

View file

@ -9,10 +9,11 @@ class DoodExtractor {
String? quality,
bool redirect = true,
}) async {
final http.Client client = http.Client();
final newQuality = quality ?? ('Doodstream ${redirect ? ' mirror' : ''}');
try {
final response = await http.Client().get(Uri.parse(url));
final response = await client.get(Uri.parse(url));
final newUrl = redirect ? response.request!.url.toString() : url;
final doodHost = RegExp('https://(.*?)/').firstMatch(newUrl)!.group(1)!;
@ -22,17 +23,18 @@ class DoodExtractor {
final token = md5.substring(md5.lastIndexOf('/') + 1);
final randomString = getRandomString();
final expiry = DateTime.now().millisecondsSinceEpoch;
final videoUrlStart = await http.Client().get(
final videoUrlStart = await client.get(
Uri.parse('https://$doodHost/pass_md5/$md5'),
headers: {'referer': newUrl},
);
if (videoUrlStart.statusCode != 200) return [];
final videoUrl =
'${videoUrlStart.body}$randomString?token=$token&expiry=$expiry';
return [
Video(newUrl, newQuality, videoUrl, headers: doodHeaders(doodHost))
Video(newUrl, newQuality, videoUrl, headers: {
'User-Agent': 'Mangayomi',
'Referer': 'https://$doodHost/',
})
];
} catch (_) {
return [];
@ -47,11 +49,4 @@ class DoodExtractor {
(index) => allowedChars.runes
.elementAt(Random().nextInt(allowedChars.length))).join();
}
Map<String, String> doodHeaders(String host) {
return {
'User-Agent': 'Aniyomi',
'Referer': 'https://$host/',
};
}
}

View file

@ -373,7 +373,7 @@ class Kitsu extends _$Kitsu {
track.mediaId = int.parse(data[0]["id"]);
track.libraryId = int.parse(data[0]["id"]);
track.syncId = syncId;
track.trackingUrl = _mangaUrl(int.parse(data[0]["id"]));
track.trackingUrl = _animeUrl(int.parse(data[0]["id"]));
track.status =
_getKitsuTrsackStatusAnime(data[0]["attributes"]["status"]);
track.title =
@ -409,7 +409,7 @@ class Kitsu extends _$Kitsu {
track.mediaId = int.parse(data[0]["id"]);
track.libraryId = int.parse(data[0]["id"]);
track.syncId = syncId;
track.trackingUrl = _mangaUrl(int.parse(data[0]["id"]));
track.trackingUrl = _animeUrl(int.parse(data[0]["id"]));
track.status =
_getKitsuTrsackStatusAnime(data[0]["attributes"]["status"]);
track.score =

View file

@ -83,14 +83,18 @@ extension DocumentExtension on Document? {
}
}
String? xpathFirst(String xpath, String outerHtml) {
var htmlXPath = HtmlXPath.html(outerHtml);
String? xpathFirst(String xpath) {
final dom = this?.documentElement;
if (dom == null) return null;
var htmlXPath = HtmlXPath.node(dom);
var query = htmlXPath.query(xpath);
return query.attr;
}
List<String> xpath(String xpath, String outerHtml) {
var htmlXPath = HtmlXPath.html(outerHtml);
List<String> xpath(String xpath) {
final dom = this?.documentElement;
if (dom == null) return [];
var htmlXPath = HtmlXPath.node(dom);
var query = htmlXPath.query(xpath);
if (query.nodes.length > 1) {
return query.attrs.map((e) => e!.trim().trimLeft().trimRight()).toList();

View file

@ -61,8 +61,8 @@ packages:
dependency: "direct main"
description:
path: "."
ref: c66de6ad76ddaf74399cbdeeed42d04126e88e4b
resolved-ref: c66de6ad76ddaf74399cbdeeed42d04126e88e4b
ref: "2cc16eeb475788ec0443b64badc325c00d7dab90"
resolved-ref: "2cc16eeb475788ec0443b64badc325c00d7dab90"
url: "https://github.com/kodjodevf/background_downloader.git"
source: git
version: "7.12.3"
@ -286,10 +286,10 @@ packages:
dependency: "direct main"
description:
name: dart_eval
sha256: c3ef388d9846ed032fa0cf0a69acae40d4c15ad7ad570ac3a37fa060de93c8ec
sha256: "8896832008bb5379caad1c55109ef357566365ec1abb4f49819c79021cc0e0e1"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.3"
dart_style:
dependency: transitive
description:

View file

@ -32,7 +32,7 @@ dependencies:
background_downloader:
git:
url: https://github.com/kodjodevf/background_downloader.git
ref: c66de6ad76ddaf74399cbdeeed42d04126e88e4b
ref: 2cc16eeb475788ec0443b64badc325c00d7dab90
permission_handler: ^11.1.0
flutter_inappwebview: ^5.7.2+3
draggable_menu: ^4.4.1
@ -45,7 +45,7 @@ dependencies:
file_picker: ^6.1.1
path_provider: ^2.1.1
scrollable_positioned_list: ^0.3.5
dart_eval: ^0.7.2
dart_eval: ^0.7.3
json_path: ^0.6.2
bot_toast: ^4.1.3
flutter_web_auth_2: ^3.0.4