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; D4rt? _interpreter; DartExtensionService(this.source) { _interpreter = D4rt(); RegistrerBridge.registerBridge(_interpreter!); _interpreter!.execute( source: source.sourceCode!.replaceAll('Client(source)', 'Client()'), positionalArgs: [source.toMSource()], ); } @override void dispose() { _interpreter = null; } @override Map getHeaders() { try { return _interpreter!.invoke('headers', []) as Map; } catch (_) { try { return _interpreter!.invoke('getHeader', [source.baseUrl!]) as Map; } catch (_) { return {}; } } } @override String get sourceBaseUrl { try { final baseUrl = _interpreter!.invoke('baseUrl', []) as String?; return (baseUrl == null || baseUrl.isEmpty) ? source.baseUrl! : baseUrl; } catch (_) { return source.baseUrl!; } } @override bool get supportsLatest { try { return _interpreter!.invoke('supportsLatest', []) as bool? ?? true; } catch (_) { return true; } } @override Future getPopular(int page) async => await _interpreter!.invoke('getPopular', [page]) as MPages; @override Future getLatestUpdates(int page) async => await _interpreter!.invoke('getLatestUpdates', [page]) as MPages; @override Future search(String query, int page, List filters) async { return await _interpreter!.invoke('search', [ query, page, FilterList(filters), ]) as MPages; } @override Future getDetail(String url) async => await _interpreter!.invoke('getDetail', [url]) as MManga; @override Future> getPageList(String url) async { final result = await _interpreter!.invoke('getPageList', [url]) as List; return result.map((e) { if (e is String) return PageUrl(e.trim()); return PageUrl.fromJson((e as Map).toMapStringDynamic!); }).toList(); } @override Future> getVideoList(String url) async => (await _interpreter!.invoke('getVideoList', [url]) as List).cast