home screen loadmore fix , fix anime extractor

This commit is contained in:
kodjomoustapha 2023-07-31 22:00:41 +01:00
parent 3c2e5becf3
commit 47734532b3
12 changed files with 135 additions and 215 deletions

View file

@ -113,22 +113,14 @@ class $VideoModel implements VideoModel, $Instance {
String? get originalUrl => $value.originalUrl;
@override
set url(String? url) {
// implement apiUrl
}
set url(String? url) {}
@override
set quality(String? quality) {
// implement baseUrl
}
set quality(String? quality) {}
@override
set headers(Map? headers) {
// implement dateFormat
}
set headers(Map? headers) {}
@override
set originalUrl(String? originalUrl) {
// implement dateFormatLocale
}
set originalUrl(String? originalUrl) {}
}

View file

@ -1545,6 +1545,7 @@ class $MBridge extends MBridge with $Bridge {
static $String $xpath(Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.xpath(args[0]!.$value, args[1]!.$value, args[2]!.$value));
static $List $listParse(Runtime runtime, $Value? target, List<$Value?> args) {
return $List.wrap(MBridge.listParse(
args[0]!.$value,
@ -1577,13 +1578,7 @@ class $MBridge extends MBridge with $Bridge {
final value = MBridge.toVideos(
args[0]!.$value, args[1]!.$value, args[2]!.$value, args[3]!.$value);
return $List.wrap(value
.map((e) => $VideoModel.wrap(VideoModel()
..headers = e.headers
..originalUrl = e.originalUrl
..quality = e.quality
..url = e.url))
.toList());
return $List.wrap(value.map((e) => _toVideoModel(e)).toList());
}
static $String $jsonPathToString(
@ -1640,15 +1635,26 @@ class $MBridge extends MBridge with $Bridge {
$String(MBridge.stringParse(
args[0]!.$value,
));
static $String $evalJs(Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.evalJs(
args[0]!.$value,
));
static $Instance $stringParseValue(
Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.stringParseValue(
args[0]!.$value.toString(),
));
static $String $stringParseValue(
Runtime runtime, $Value? target, List<$Value?> args) {
final value = args[0]!.$value;
String fVal = "";
if (value is List) {
fVal = value.toString();
} else {
fVal = value.toString();
}
return $String(MBridge.stringParseValue(
fVal,
));
}
static $String $regExp(Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.regExp(
args[0]!.$value,
@ -1657,22 +1663,27 @@ class $MBridge extends MBridge with $Bridge {
args[3]!.$value,
args[4]!.$value,
));
static $int $intParse(Runtime runtime, $Value? target, List<$Value?> args) =>
$int(MBridge.intParse(
args[0]!.$value,
));
static $bool $listContain(
Runtime runtime, $Value? target, List<$Value?> args) =>
$bool(MBridge.listContain(
args[0]!.$value as List<$Value>, args[1]!.$value));
static $String $querySelector(
Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.querySelector(
args[0]!.$value, args[1]!.$value, args[2]!.$value, args[3]!.$value));
static $String $parseChapterDate(
Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.parseChapterDate(
args[0]!.$value, args[1]!.$value, args[2]!.$value));
static $String $querySelectorAll(
Runtime runtime, $Value? target, List<$Value?> args) =>
$String(MBridge.querySelectorAll(
@ -1701,36 +1712,43 @@ class $MBridge extends MBridge with $Bridge {
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.doodExtractor(args[0]!.$value).then(
(value) => $List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $streamTapeExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.streamTapeExtractor(args[0]!.$value).then(
(value) => $List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $mp4UploadExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.mp4UploadExtractor(args[0]!.$value, args[1]!.$value,
args[2]!.$value, args[3]!.$value)
.then((value) =>
$List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $sendVidExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.sendVidExtractor(
args[0]!.$value, args[1]!.$value, args[2]!.$value)
.then((value) =>
$List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $yourUploadExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.yourUploadExtractor(args[0]!.$value, args[1]!.$value,
args[2]!.$value, args[3]!.$value)
.then((value) =>
$List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $sibnetExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.sibnetExtractor(args[0]!.$value).then(
(value) => $List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $myTvExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.myTvExtractor(args[0]!.$value).then(
(value) => $List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $okruExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.okruExtractor(args[0]!.$value).then(
@ -1740,16 +1758,19 @@ class $MBridge extends MBridge with $Bridge {
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.voeExtractor(args[0]!.$value, args[1]!.$value).then(
(value) => $List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $vidBomExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.vidBomExtractor(args[0]!.$value).then(
(value) => $List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $Future $streamlareExtractor(
Runtime runtime, $Value? target, List<$Value?> args) =>
$Future.wrap(MBridge.streamlareExtractor(
args[0]!.$value, args[1]!.$value, args[2]!.$value)
.then((value) =>
$List.wrap(value.map((e) => _toVideoModel(e)).toList())));
static $bool $isEmptyOrIsNotEmpty(
Runtime runtime, $Value? target, List<$Value?> args) {
return $bool(MBridge.isEmptyOrIsNotEmpty(

View file

@ -35,7 +35,7 @@ class TypeMangaSelector {
class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
bool _isLoading = false;
final ScrollController _scrollController = ScrollController();
int _fullDataLength = 20;
int _fullDataLength = 50;
int _page = 1;
int _selectedIndex = 0;
List<TypeMangaSelector> _types(BuildContext context) {
@ -47,6 +47,41 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
];
}
Future<List<MangaModel?>> _loadMore() async {
List<MangaModel?> mangaResList = [];
if (_isLoading) {
if (widget.source.isFullData!) {
await Future.delayed(const Duration(milliseconds: 500));
_fullDataLength = _fullDataLength + 50;
} else {
if (_selectedIndex == 0 && !_isSearch && _query.isEmpty) {
mangaResList = await ref.watch(getPopularMangaProvider(
source: widget.source,
page: _page + 1,
).future);
} else if (_selectedIndex == 1 && !_isSearch && _query.isEmpty) {
mangaResList = await ref.watch(getLatestUpdatesMangaProvider(
source: widget.source,
page: _page + 1,
).future);
} else if (_selectedIndex == 2 && _isSearch && _query.isNotEmpty) {
mangaResList = await ref.watch(searchMangaProvider(
source: widget.source,
query: _query,
page: _page + 1,
).future);
}
}
if (mounted) {
setState(() {
_page = _page + 1;
});
}
}
return mangaResList;
}
final _textEditingController = TextEditingController();
String _query = "";
bool _isSearch = false;
@ -74,18 +109,16 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
_isSearch
? SeachFormTextField(
onFieldSubmitted: (submit) {
if (submit.isNotEmpty) {
setState(() {
setState(() {
if (submit.isNotEmpty) {
_selectedIndex = 2;
_query = submit;
});
} else {
setState(() {
} else {
_selectedIndex = 0;
});
}
_page = 1;
}
_page = 1;
});
},
onChanged: (value) {},
onSuffixPressed: () {
@ -98,8 +131,8 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
_query = "";
_selectedIndex = 0;
_page = 1;
_textEditingController.clear();
});
_textEditingController.clear();
},
controller: _textEditingController,
)
@ -184,94 +217,19 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5))),
onPressed: () {
if (!_isSearch) {
if (!_isLoading) {
if (mounted) {
setState(() {
_isLoading = true;
});
}
if (widget.source.isFullData!) {
Future.delayed(const Duration(seconds: 1))
.then((value) {
_fullDataLength = _fullDataLength + 20;
if (mounted) {
setState(() {
_isLoading = false;
});
}
});
} else {
if (mounted) {
setState(() {
_page = _page + 1;
});
}
if (_selectedIndex == 0 &&
!_isSearch &&
_query.isEmpty) {
ref
.watch(getPopularMangaProvider(
source: widget.source,
page: _page,
).future)
.then(
(value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
},
);
} else if (_selectedIndex == 1 &&
!_isSearch &&
_query.isEmpty) {
ref
.watch(
getLatestUpdatesMangaProvider(
source: widget.source,
page: _page,
).future)
.then(
(value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
},
);
} else if (_selectedIndex == 2 &&
_isSearch &&
_query.isNotEmpty) {
ref
.watch(searchMangaProvider(
source: widget.source,
query: _query,
page: _page,
).future)
.then(
(value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
},
);
}
}
}
if (mounted) {
setState(() {
_isLoading = true;
});
}
_length = widget.source.isFullData!
? _fullDataLength
: data.length;
_loadMore().then((value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
});
},
child: const Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -290,93 +248,27 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
if (data.isEmpty) {
return Center(child: Text(l10n.no_result));
}
if (!_isSearch) {
_scrollController.addListener(() {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
if (!_isLoading) {
if (mounted) {
setState(() {
_isLoading = true;
});
}
if (widget.source.isFullData!) {
Future.delayed(const Duration(seconds: 1)).then((value) {
_fullDataLength = _fullDataLength + 10;
if (mounted) {
setState(() {
_isLoading = false;
});
}
});
} else {
if (mounted) {
setState(() {
_page = _page + 1;
});
}
if (_selectedIndex == 0 && !_isSearch && _query.isEmpty) {
ref
.watch(getPopularMangaProvider(
source: widget.source,
page: _page,
).future)
.then(
(value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
},
);
} else if (_selectedIndex == 1 &&
!_isSearch &&
_query.isEmpty) {
ref
.watch(getLatestUpdatesMangaProvider(
source: widget.source,
page: _page,
).future)
.then(
(value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
},
);
} else if (_selectedIndex == 2 &&
_isSearch &&
_query.isNotEmpty) {
ref
.watch(searchMangaProvider(
source: widget.source,
query: _query,
page: _page,
).future)
.then(
(value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
},
);
}
}
}
_scrollController.addListener(() {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
if (mounted) {
setState(() {
_isLoading = true;
});
}
});
}
_loadMore().then((value) {
if (mounted) {
setState(() {
data.addAll(value);
_isLoading = false;
});
}
});
}
});
_length = widget.source.isFullData! ? _fullDataLength : data.length;
_length = (data.length < _length ? data.length : _length);
return Padding(
padding: const EdgeInsets.only(top: 10),
child: Column(
@ -384,9 +276,9 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
Flexible(
child: GridViewWidget(
controller: _scrollController,
itemCount: data.length < _length ? data.length : _length,
itemCount: _length + 1,
itemBuilder: (context, index) {
if (index == _length - 1 && _isLoading) {
if (index == _length) {
return buildProgressIndicator();
}
return MangaHomeImageCard(

View file

@ -1,6 +1,7 @@
import 'dart:math';
import 'package:http/http.dart' as http;
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/utils/extensions.dart';
class DoodExtractor {
Future<List<Video>> videosFromUrl(
@ -17,7 +18,7 @@ class DoodExtractor {
final doodHost = RegExp('https://(.*?)/').firstMatch(newUrl)!.group(1)!;
final content = response.body;
if (!content.contains("'/pass_md5/")) return [];
final md5 = content.split("'/pass_md5/").last.split("',").first;
final md5 = content.substringAfter("'/pass_md5/").substringBefore("',");
final token = md5.substring(md5.lastIndexOf('/') + 1);
final randomString = getRandomString();
final expiry = DateTime.now().millisecondsSinceEpoch;
@ -32,7 +33,7 @@ class DoodExtractor {
return [
Video(newUrl, newQuality, videoUrl, headers: doodHeaders(doodHost))
];
} catch (e) {
} catch (_) {
return [];
}
}

View file

@ -22,7 +22,7 @@ class StreamTapeExtractor {
.toList();
if (scri.isEmpty) {
return [];
} else {}
}
script = scri.first.split("$targetLine.innerHTML = '").last;
final videoUrl =
"https:${script.substringBefore("'")}${script.substringAfter("+ ('xcd").substringBefore("'")}";

View file

@ -22,7 +22,7 @@ class VoeExtractor {
script.first!.substringAfter("video_height': ").substringBefore(",");
final qualityStr = quality ?? "VoeCDN(${resolution}p)";
return [Video(url, qualityStr, videoUrl)];
return [Video(videoUrl, qualityStr, videoUrl)];
} catch (_) {
return [];
}

View file

@ -4,6 +4,7 @@ import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge_class/manga_model.dart';
import 'package:mangayomi/eval/bridge_class/model.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/utils/constant.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'get_latest_updates_manga.g.dart';
@ -40,7 +41,7 @@ Future<List<MangaModel?>> getLatestUpdatesManga(
MangaModel newMangaa = MangaModel(
name: value.names![i],
link: value.urls![i],
imageUrl: value.images![i],
imageUrl: value.images!.isEmpty ? emptyImg : value.images![i],
baseUrl: value.baseUrl,
apiUrl: value.apiUrl,
lang: value.lang,

View file

@ -4,6 +4,7 @@ import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge_class/manga_model.dart';
import 'package:mangayomi/eval/bridge_class/model.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/utils/constant.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'get_popular_manga.g.dart';
@ -40,7 +41,7 @@ Future<List<MangaModel?>> getPopularManga(
MangaModel newMangaa = MangaModel(
name: value.names![i],
link: value.urls![i],
imageUrl: value.images![i],
imageUrl: value.images!.isEmpty ? emptyImg : value.images![i],
baseUrl: value.baseUrl,
apiUrl: value.apiUrl,
lang: value.lang,

View file

@ -3,6 +3,7 @@ import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/eval/bridge_class/manga_model.dart';
import 'package:mangayomi/eval/bridge_class/model.dart';
import 'package:mangayomi/eval/runtime/runtime.dart';
import 'package:mangayomi/utils/constant.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'search_manga.g.dart';
@ -41,7 +42,7 @@ Future<List<MangaModel?>> searchManga(
MangaModel newMangaa = MangaModel(
name: value.names![i],
link: value.urls![i],
imageUrl: value.images![i],
imageUrl: value.images!.isEmpty ? emptyImg : value.images![i],
baseUrl: value.baseUrl,
apiUrl: value.apiUrl,
lang: value.lang,

View file

@ -61,3 +61,6 @@ TrackStatus toStatus(TrackStatus status, bool isManga, int syncId) {
_ => ("assets/tracker_anilist.webp", "Anilist"),
};
}
const emptyImg =
"https://upload.wikimedia.org/wikipedia/commons/1/12/White_background.png";

View file

@ -797,6 +797,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.1"
loadmore:
dependency: "direct main"
description:
name: loadmore
sha256: "4a9d60cf1182f9a91449502b4ab2bad53aaf292124382c7e29e36a61468b027f"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
logging:
dependency: transitive
description:

View file

@ -53,7 +53,7 @@ dependencies:
flutter_meedu_videoplayer: ^4.2.20
media_kit_libs_android_video: ^1.0.6
media_kit_libs_ios_video: ^1.0.4
# dio: ^5.3.0
loadmore: ^2.1.0
cupertino_icons: ^1.0.2