import 'package:d4rt/d4rt.dart'; import 'package:mangayomi/eval/dart/bridge/registrer.dart'; import 'package:mangayomi/eval/model/filter.dart'; import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_pages.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/video.dart'; import '../interface.dart'; class DartExtensionService implements ExtensionService { @override late Source source; DartExtensionService(this.source); D4rt _executeLib() { final interpreter = D4rt(); RegistrerBridge.registerBridge(interpreter); interpreter.execute( source: source.sourceCode!.replaceAll('Client(source)', 'Client()'), args: source.toMSource(), ); return interpreter; } @override Map getHeaders() { Map headers = {}; try { headers = _executeLib().invoke('headers', []) as Map; } catch (_) { try { headers = _executeLib().invoke('getHeader', [source.baseUrl!]) as Map; } catch (_) {} } return headers; } @override String get sourceBaseUrl { String? baseUrl; try { final interpreter = _executeLib(); baseUrl = interpreter.invoke('baseUrl', []) as String?; } catch (_) {} return baseUrl == null || baseUrl.isEmpty ? source.baseUrl! : baseUrl; } @override bool get supportsLatest { bool? supportsLatest; try { final interpreter = _executeLib(); supportsLatest = interpreter.invoke('supportsLatest', []) as bool?; } catch (e) { supportsLatest = true; } return supportsLatest ?? true; } @override Future getPopular(int page) async { final interpreter = _executeLib(); final result = await interpreter.invoke('getPopular', [page]); return result as MPages; } @override Future getLatestUpdates(int page) async { final interpreter = _executeLib(); final result = await interpreter.invoke('getLatestUpdates', [page]); return result as MPages; } @override Future search(String query, int page, List filters) async { final interpreter = _executeLib(); final result = await interpreter.invoke('search', [ query, page, FilterList(filters), ]); return result as MPages; } @override Future getDetail(String url) async { final interpreter = _executeLib(); final result = await interpreter.invoke('getDetail', [url]); return result as MManga; } @override Future> getPageList(String url) async { final interpreter = _executeLib(); final result = await interpreter.invoke('getPageList', [url]); return (result as List) .map( (e) => e is String ? PageUrl(e.toString().trim()) : PageUrl.fromJson((e as Map).toMapStringDynamic!), ) .toList(); } @override Future> getVideoList(String url) async { final interpreter = _executeLib(); final result = await interpreter.invoke('getVideoList', [url]); return (result as List).cast