From b4c09bbee02eac4b76507893818cacecc6154d04 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Mon, 6 Jan 2025 13:04:04 +0100 Subject: [PATCH 1/2] feat: add evaluateJavascriptViaWebview --- lib/eval/dart/bridge/m_provider.dart | 37 ++++++++++++++++++++++ lib/eval/javascript/utils.dart | 13 ++++++++ lib/eval/model/m_bridge.dart | 47 ++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index 8788bb7..8713b86 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -841,6 +841,32 @@ class $MProvider extends MProvider with $Bridge { ], namedParams: []), isStatic: true), + 'evaluateJavascriptViaWebview': BridgeMethodDef( + BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.future, [ + BridgeTypeRef( + CoreTypes.string, + ) + ])), + params: [ + BridgeParameter( + 'url', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + false), + BridgeParameter( + 'headers', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.map, [ + BridgeTypeRef(CoreTypes.string), + BridgeTypeRef(CoreTypes.string) + ])), + false), + BridgeParameter( + 'scripts', + BridgeTypeAnnotation(BridgeTypeRef( + CoreTypes.list, [BridgeTypeRef(CoreTypes.string)])), + false), + ]), + ), }, bridge: true); @@ -1009,6 +1035,17 @@ class $MProvider extends MProvider with $Bridge { })) .toList()); }))), + "evaluateJavascriptViaWebview" => $Function((_, __, List<$Value?> args) => + $Future.wrap(MBridge.evaluateJavascriptViaWebview( + args[0]!.$value, + (args[1]!.$value as Map).map((key, value) => MapEntry( + key.$reified.toString(), value.$reified.toString())), + (args[2]!.$value as List) + .map((e) => e.$reified.toString()) + .toList()) + .then((value) { + return $String(value); + }))), "toVideo" => $Function((_, __, List<$Value?> args) { final value = MBridge.toVideo( args[0]!.$value, diff --git a/lib/eval/javascript/utils.dart b/lib/eval/javascript/utils.dart index 4357e96..457f52b 100644 --- a/lib/eval/javascript/utils.dart +++ b/lib/eval/javascript/utils.dart @@ -1,5 +1,6 @@ import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:js_packer/js_packer.dart'; +import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart'; import 'package:mangayomi/utils/log/log.dart'; @@ -31,6 +32,12 @@ class JsUtils { runtime.onMessage('unpackJs', (dynamic args) { return JSPacker(args[0]).unpack() ?? ""; }); + runtime.onMessage('evaluateJavascriptViaWebview', (dynamic args) async { + return await MBridge.evaluateJavascriptViaWebview( + args[0]!, + (args[1]! as Map).toMapStringString!, + (args[2]! as List).map((e) => e.toString()).toList()); + }); runtime.evaluate(''' console.log = function (message) { @@ -129,6 +136,12 @@ function parseDates(value, dateFormat, dateFormatLocale) { JSON.stringify([value, dateFormat, dateFormatLocale]) ); } +async function evaluateJavascriptViaWebview(url, headers, scripts) { + return await sendMessage( + "evaluateJavascriptViaWebview", + JSON.stringify([url, headers, scripts]) + ); +} '''); } } diff --git a/lib/eval/model/m_bridge.dart b/lib/eval/model/m_bridge.dart index f228539..a66914b 100644 --- a/lib/eval/model/m_bridge.dart +++ b/lib/eval/model/m_bridge.dart @@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:go_router/go_router.dart'; import 'package:html/dom.dart' hide Text; import 'package:intl/date_symbol_data_local.dart'; @@ -11,6 +12,7 @@ import 'package:js_packer/js_packer.dart'; import 'package:json_path/json_path.dart'; import 'package:mangayomi/eval/model/document.dart'; import 'package:mangayomi/eval/javascript/http.dart'; +import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/router/router.dart'; import 'package:mangayomi/services/anime_extractors/dood_extractor.dart'; @@ -625,6 +627,51 @@ class MBridge { return text; } } + + static Future evaluateJavascriptViaWebview( + String url, Map headers, List scripts, + {int time = 30}) async { + int t = 0; + bool timeOut = false; + bool isOk = false; + String response = ""; + HeadlessInAppWebView? headlessWebView; + headlessWebView = HeadlessInAppWebView( + webViewEnvironment: webViewEnvironment, + onWebViewCreated: (controller) { + controller.addJavaScriptHandler( + handlerName: 'setResponse', + callback: (args) { + response = args[0] as String; + isOk = true; + }, + ); + }, + initialUrlRequest: URLRequest(url: WebUri(url), headers: headers), + onLoadStop: (controller, url) async { + for (var script in scripts) { + await controller.platform.evaluateJavascript(source: script); + } + }, + ); + + headlessWebView.run(); + + await Future.doWhile(() async { + timeOut = time == t; + if (timeOut || isOk) { + return false; + } + await Future.delayed(const Duration(seconds: 1)); + t++; + return true; + }); + try { + headlessWebView.dispose(); + } catch (_) {} + + return response; + } } final List _dateFormats = [ From 9083dd1af06cbe2fc42c5fb13d8c60ab27dc58ad Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:55:11 +0100 Subject: [PATCH 2/2] fix: update novel sources URL --- lib/services/fetch_novel_sources.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart index b6079f7..13b33a8 100644 --- a/lib/services/fetch_novel_sources.dart +++ b/lib/services/fetch_novel_sources.dart @@ -10,7 +10,7 @@ Future fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { await fetchSourcesList( sourcesIndexUrl: - "https://raw.githubusercontent.com/Schnitzel5/mangayomi-extensions/refs/heads/main/novel_index.json", + "https://kodjodevf.github.io/mangayomi-extensions/novel_index.json", refresh: reFresh, id: id, ref: ref,