mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-01-11 22:40:36 +00:00
Fix
This commit is contained in:
parent
d830967037
commit
d5cfd1f25f
12 changed files with 68 additions and 55 deletions
|
|
@ -1,5 +1,5 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.8.0'
|
||||
ext.kotlin_version = '1.9.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -122,7 +122,6 @@ class MangaReaderView extends ConsumerWidget {
|
|||
onWillPop: () async {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
|
||||
overlays: SystemUiOverlay.values);
|
||||
;
|
||||
Navigator.pop(context);
|
||||
return false;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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/',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue