From 6fa0e8a89f46249202c167439b1e4580e1ab182b Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Tue, 12 Mar 2024 17:24:41 +0100 Subject: [PATCH] Added JavaScript extension runtime, gridview count --- lib/eval/{ => dart}/bridge/document.dart | 29 +- lib/eval/{ => dart}/bridge/element.dart | 2 +- lib/eval/{ => dart}/bridge/filter.dart | 186 +++- lib/eval/{ => dart}/bridge/http.dart | 4 +- lib/eval/{ => dart}/bridge/m_chapter.dart | 2 +- lib/eval/{ => dart}/bridge/m_manga.dart | 8 +- lib/eval/{ => dart}/bridge/m_pages.dart | 6 +- lib/eval/{ => dart}/bridge/m_provider.dart | 36 +- lib/eval/{ => dart}/bridge/m_source.dart | 2 +- lib/eval/{ => dart}/bridge/m_status.dart | 0 lib/eval/{ => dart}/bridge/m_track.dart | 5 + lib/eval/{ => dart}/bridge/m_video.dart | 7 +- .../{ => dart}/bridge/source_preference.dart | 2 +- lib/eval/{ => dart}/compiler/compiler.dart | 2 +- lib/eval/{ => dart}/model/document.dart | 6 +- lib/eval/{ => dart}/model/element.dart | 0 lib/eval/dart/model/filter.dart | 237 +++++ lib/eval/{ => dart}/model/m_bridge.dart | 2 +- lib/eval/dart/model/m_chapter.dart | 17 + lib/eval/dart/model/m_manga.dart | 50 ++ lib/eval/dart/model/m_pages.dart | 15 + lib/eval/{ => dart}/model/m_provider.dart | 6 +- lib/eval/{ => dart}/model/m_source.dart | 0 lib/eval/{ => dart}/model/m_video.dart | 0 .../{ => dart}/model/source_preference.dart | 0 .../{ => dart}/model/source_preference.g.dart | 0 lib/eval/{ => dart}/plugin.dart | 26 +- lib/eval/{ => dart}/runtime/runtime.dart | 2 +- lib/eval/javascript/dom_selector.dart | 312 +++++++ lib/eval/javascript/extractors.dart | 172 ++++ lib/eval/javascript/http.dart | 134 +++ lib/eval/javascript/preferences.dart | 45 + lib/eval/javascript/service.dart | 141 +++ lib/eval/javascript/utils.dart | 86 ++ lib/eval/model/filter.dart | 93 -- lib/eval/model/m_chapter.dart | 10 - lib/eval/model/m_manga.dart | 33 - lib/eval/model/m_pages.dart | 7 - lib/l10n/app_ar.arb | 4 +- lib/l10n/app_de.arb | 4 +- lib/l10n/app_en.arb | 4 +- lib/l10n/app_es.arb | 4 +- lib/l10n/app_es_419.arb | 4 +- lib/l10n/app_fr.arb | 4 +- lib/l10n/app_id.arb | 4 +- lib/l10n/app_it.arb | 4 +- lib/l10n/app_pt.arb | 4 +- lib/l10n/app_pt_BR.arb | 4 +- lib/l10n/app_ru.arb | 4 +- lib/l10n/app_tr.arb | 4 +- lib/l10n/app_zh.arb | 4 +- lib/models/settings.dart | 14 +- lib/models/settings.g.dart | 830 +++++++++++------- lib/models/source.dart | 9 +- lib/models/source.g.dart | 141 ++- lib/models/video.dart | 21 + .../anime/providers/state_provider.g.dart | 2 +- .../browse/extension/extension_detail.dart | 21 +- .../extension_preferences_providers.dart | 36 +- .../providers/fetch_manga_sources.dart | 4 +- .../widgets/source_preference_widget.dart | 2 +- .../global_search/global_search_screen.dart | 4 +- lib/modules/library/library_screen.dart | 67 +- .../providers/library_state_provider.dart | 29 + .../providers/library_state_provider.g.dart | 145 +++ .../widgets/library_gridview_widget.dart | 578 ++++++------ .../library/widgets/measure_widget_sync.dart | 25 + .../manga/detail/manga_detail_view.dart | 2 +- .../update_manga_detail_providers.dart | 4 +- lib/modules/manga/home/manga_home_screen.dart | 87 +- .../manga/home/widget/filter_widget.dart | 2 +- lib/modules/manga/reader/reader_view.dart | 5 +- .../backup_and_restore.dart | 2 +- .../backup_and_restore/providers/backup.dart | 2 +- .../backup_and_restore/providers/restore.dart | 4 +- .../providers/app_font_family.g.dart | 2 +- lib/modules/widgets/cover_view_widget.dart | 5 +- lib/modules/widgets/gridview_widget.dart | 29 +- .../widgets/manga_image_card_widget.dart | 2 +- lib/providers/storage_provider.dart | 2 +- .../anime_extractors/gogocdn_extractor.dart | 2 +- lib/services/get_chapter_pages.dart | 29 +- lib/services/get_chapter_pages.g.dart | 2 +- lib/services/get_detail.dart | 33 +- lib/services/get_detail.g.dart | 2 +- lib/services/get_filter_list.dart | 40 +- lib/services/get_latest_updates.dart | 36 +- lib/services/get_latest_updates.g.dart | 2 +- lib/services/get_popular.dart | 34 +- lib/services/get_popular.g.dart | 2 +- lib/services/get_source_baseurl.dart | 31 +- lib/services/get_source_baseurl.g.dart | 2 +- lib/services/get_source_preference.dart | 36 +- lib/services/get_video_list.dart | 12 +- lib/services/get_video_list.g.dart | 2 +- lib/services/http/interceptor.dart | 4 +- lib/services/search.dart | 39 +- lib/services/search.g.dart | 2 +- lib/services/search_.dart | 40 +- lib/services/supports_latest.dart | 30 +- lib/services/supports_latest.g.dart | 2 +- lib/services/trackers/anilist.dart | 2 +- lib/services/trackers/kitsu.dart | 2 +- lib/utils/extensions/dom_extensions.dart | 8 + linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 13 +- pubspec.yaml | 7 +- .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 111 files changed, 3189 insertions(+), 1049 deletions(-) rename lib/eval/{ => dart}/bridge/document.dart (92%) rename lib/eval/{ => dart}/bridge/element.dart (99%) rename lib/eval/{ => dart}/bridge/filter.dart (89%) rename lib/eval/{ => dart}/bridge/http.dart (99%) rename lib/eval/{ => dart}/bridge/m_chapter.dart (98%) rename lib/eval/{ => dart}/bridge/m_manga.dart (95%) rename lib/eval/{ => dart}/bridge/m_pages.dart (93%) rename lib/eval/{ => dart}/bridge/m_provider.dart (97%) rename lib/eval/{ => dart}/bridge/m_source.dart (98%) rename lib/eval/{ => dart}/bridge/m_status.dart (100%) rename lib/eval/{ => dart}/bridge/m_track.dart (96%) rename lib/eval/{ => dart}/bridge/m_video.dart (96%) rename lib/eval/{ => dart}/bridge/source_preference.dart (99%) rename lib/eval/{ => dart}/compiler/compiler.dart (87%) rename lib/eval/{ => dart}/model/document.dart (92%) rename lib/eval/{ => dart}/model/element.dart (100%) create mode 100644 lib/eval/dart/model/filter.dart rename lib/eval/{ => dart}/model/m_bridge.dart (99%) create mode 100644 lib/eval/dart/model/m_chapter.dart create mode 100644 lib/eval/dart/model/m_manga.dart create mode 100644 lib/eval/dart/model/m_pages.dart rename lib/eval/{ => dart}/model/m_provider.dart (75%) rename lib/eval/{ => dart}/model/m_source.dart (100%) rename lib/eval/{ => dart}/model/m_video.dart (100%) rename lib/eval/{ => dart}/model/source_preference.dart (100%) rename lib/eval/{ => dart}/model/source_preference.g.dart (100%) rename lib/eval/{ => dart}/plugin.dart (87%) rename lib/eval/{ => dart}/runtime/runtime.dart (83%) create mode 100644 lib/eval/javascript/dom_selector.dart create mode 100644 lib/eval/javascript/extractors.dart create mode 100644 lib/eval/javascript/http.dart create mode 100644 lib/eval/javascript/preferences.dart create mode 100644 lib/eval/javascript/service.dart create mode 100644 lib/eval/javascript/utils.dart delete mode 100644 lib/eval/model/filter.dart delete mode 100644 lib/eval/model/m_chapter.dart delete mode 100644 lib/eval/model/m_manga.dart delete mode 100644 lib/eval/model/m_pages.dart create mode 100644 lib/modules/library/widgets/measure_widget_sync.dart diff --git a/lib/eval/bridge/document.dart b/lib/eval/dart/bridge/document.dart similarity index 92% rename from lib/eval/bridge/document.dart rename to lib/eval/dart/bridge/document.dart index 961cb2f..376f77d 100644 --- a/lib/eval/bridge/document.dart +++ b/lib/eval/dart/bridge/document.dart @@ -3,9 +3,9 @@ import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:html/dom.dart'; -import 'package:mangayomi/eval/bridge/element.dart'; -import 'package:mangayomi/eval/model/document.dart'; -import 'package:mangayomi/eval/model/element.dart'; +import 'package:mangayomi/eval/dart/bridge/element.dart'; +import 'package:mangayomi/eval/dart/model/document.dart'; +import 'package:mangayomi/eval/dart/model/element.dart'; class $MDocument implements MDocument, $Instance { $MDocument.wrap(this.$value) : _superclass = $Object($value); @@ -131,6 +131,17 @@ class $MDocument implements MDocument, $Instance { false) ]), ), + 'attr': BridgeMethodDef( + BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), + params: [ + BridgeParameter( + 'attr', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string), + nullable: true), + false) + ]), + ), }, wrap: true); @@ -182,6 +193,8 @@ class $MDocument implements MDocument, $Instance { return __xpath; case 'xpathFirst': return __xpathFirst; + case 'attr': + return __attr; default: return _superclass.$getProperty(runtime, identifier); } @@ -257,6 +270,13 @@ class $MDocument implements MDocument, $Instance { return res == null ? const $null() : $String(res); } + static const $Function __attr = $Function(_attr); + static $Value? _attr( + final Runtime runtime, final $Value? target, final List<$Value?> args) { + final res = (target!.$value as MDocument).attr(args[0]?.$value ?? ""); + return res == null ? const $null() : $String(res); + } + @override List? select(String selector) => $value.select(selector); @@ -277,6 +297,9 @@ class $MDocument implements MDocument, $Instance { List? getElementsByTagName(String localNames) => $value.getElementsByTagName(localNames); + @override + String? attr(String attr) => $value.attr(attr); + @override MElement? getElementById(String id) => $value.getElementById(id); diff --git a/lib/eval/bridge/element.dart b/lib/eval/dart/bridge/element.dart similarity index 99% rename from lib/eval/bridge/element.dart rename to lib/eval/dart/bridge/element.dart index c772659..9c2d43d 100644 --- a/lib/eval/bridge/element.dart +++ b/lib/eval/dart/bridge/element.dart @@ -2,7 +2,7 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:html/dom.dart'; -import 'package:mangayomi/eval/model/element.dart'; +import 'package:mangayomi/eval/dart/model/element.dart'; class $MElement implements MElement, $Instance { $MElement.wrap(this.$value) : _superclass = $Object($value); diff --git a/lib/eval/bridge/filter.dart b/lib/eval/dart/bridge/filter.dart similarity index 89% rename from lib/eval/bridge/filter.dart rename to lib/eval/dart/bridge/filter.dart index d2c79ab..28b6792 100644 --- a/lib/eval/bridge/filter.dart +++ b/lib/eval/dart/bridge/filter.dart @@ -1,7 +1,7 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/model/filter.dart'; +import 'package:mangayomi/eval/dart/model/filter.dart'; class $FilterList implements FilterList, $Instance { $FilterList.wrap(this.$value) : _superclass = $Object($value); @@ -71,6 +71,11 @@ class $FilterList implements FilterList, $Instance { @override set filters(List filters) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $SelectFilter implements SelectFilter, $Instance { @@ -113,26 +118,26 @@ class $SelectFilter implements SelectFilter, $Instance { static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return $SelectFilter.wrap(SelectFilter( - args[0]!.$value, - args[1]!.$value, - args[2]!.$value, - (args[3]!.$value as List).map((e) { - if (e is $Value) { - final value = e.$reified; - if (value is Map) { - Map map = {}; - map = value.map((key, value) => MapEntry(key.toString(), value)); - if (map['type'] == 'SelectOption') { - final filter = map['filter'] as Map; - return SelectFilterOption.fromJson( - filter.map((key, value) => MapEntry(key.toString(), value))); + args[0]!.$value, + args[1]!.$value, + args[2]!.$value, + (args[3]!.$value as List).map((e) { + if (e is $Value) { + final value = e.$reified; + if (value is Map) { + Map map = {}; + map = value.map((key, value) => MapEntry(key.toString(), value)); + if (map['type'] == 'SelectOption') { + final filter = map['filter'] as Map; + return SelectFilterOption.fromJson(filter + .map((key, value) => MapEntry(key.toString(), value))); + } } + return value; } - return value; - } - return e; - }).toList(), - )); + return e; + }).toList(), + null)); } @override @@ -188,6 +193,12 @@ class $SelectFilter implements SelectFilter, $Instance { @override int get state => $value.state; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override List get values => $value.values; @@ -202,6 +213,11 @@ class $SelectFilter implements SelectFilter, $Instance { @override set values(List values) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $SelectFilterOption implements SelectFilterOption, $Instance { @@ -230,7 +246,7 @@ class $SelectFilterOption implements SelectFilterOption, $Instance { static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return $SelectFilterOption - .wrap(SelectFilterOption(args[0]!.$value, args[1]!.$value)); + .wrap(SelectFilterOption(args[0]!.$value, args[1]!.$value, null)); } @override @@ -276,11 +292,22 @@ class $SelectFilterOption implements SelectFilterOption, $Instance { @override String get name => $value.name; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set name(String name) {} @override set value(String value) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $SeparatorFilter implements SeparatorFilter, $Instance { @@ -304,7 +331,8 @@ class $SeparatorFilter implements SeparatorFilter, $Instance { wrap: true); static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { - return $SeparatorFilter.wrap(SeparatorFilter(type: args[0]?.$value ?? '')); + return $SeparatorFilter + .wrap(SeparatorFilter(null, type: args[0]?.$value ?? '')); } @override @@ -342,8 +370,19 @@ class $SeparatorFilter implements SeparatorFilter, $Instance { @override String? get type => $value.type ?? ''; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set type(String? type) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $HeaderFilter implements HeaderFilter, $Instance { @@ -372,7 +411,7 @@ class $HeaderFilter implements HeaderFilter, $Instance { static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return $HeaderFilter - .wrap(HeaderFilter(args[0]!.$value, type: args[1]?.$value ?? '')); + .wrap(HeaderFilter(args[0]!.$value, null, type: args[1]?.$value ?? '')); } @override @@ -423,6 +462,17 @@ class $HeaderFilter implements HeaderFilter, $Instance { @override String? get type => $value.type ?? ''; + + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $TextFilter implements TextFilter, $Instance { @@ -450,7 +500,7 @@ class $TextFilter implements TextFilter, $Instance { wrap: true); static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { - return $TextFilter.wrap(TextFilter(args[0]!.$value, args[1]!.$value)); + return $TextFilter.wrap(TextFilter(args[0]!.$value, args[1]!.$value, null)); } @override @@ -502,6 +552,12 @@ class $TextFilter implements TextFilter, $Instance { @override String get state => $value.state; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set type(String? type) {} @@ -510,6 +566,11 @@ class $TextFilter implements TextFilter, $Instance { @override set state(String state) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $SortFilter implements SortFilter, $Instance { @@ -550,13 +611,14 @@ class $SortFilter implements SortFilter, $Instance { static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return $SortFilter.wrap(SortFilter( - args[0]!.$value, - args[1]!.$value, - args[2]!.$value, - (args[3]!.$value as List) - .map((e) => SelectFilterOption(e.$reified.name, e.$reified.value)) - .toList(), - )); + args[0]!.$value, + args[1]!.$value, + args[2]!.$value, + (args[3]!.$value as List) + .map((e) => + SelectFilterOption(e.$reified.name, e.$reified.value, null)) + .toList(), + null)); } @override @@ -615,6 +677,12 @@ class $SortFilter implements SortFilter, $Instance { @override List get values => $value.values; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set type(String? type) {} @@ -626,6 +694,11 @@ class $SortFilter implements SortFilter, $Instance { @override set values(List values) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $SortState implements SortState, $Instance { @@ -655,7 +728,7 @@ class $SortState implements SortState, $Instance { wrap: true); static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { - return $SortState.wrap(SortState(args[0]!.$value, args[1]!.$value)); + return $SortState.wrap(SortState(args[0]!.$value, args[1]!.$value, null)); } @override @@ -701,11 +774,22 @@ class $SortState implements SortState, $Instance { @override bool get ascending => $value.ascending; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set ascending(bool ascending) {} @override set index(int index) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $TriStateFilter implements TriStateFilter, $Instance { @@ -744,7 +828,7 @@ class $TriStateFilter implements TriStateFilter, $Instance { static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return $TriStateFilter.wrap(TriStateFilter( - args[2]?.$value ?? '', args[0]!.$value, args[1]!.$value, + args[2]?.$value ?? '', args[0]!.$value, args[1]!.$value, null, state: args[3]?.$value ?? 0)); } @@ -808,6 +892,12 @@ class $TriStateFilter implements TriStateFilter, $Instance { @override String get value => $value.value; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set state(int state) {} @@ -816,6 +906,11 @@ class $TriStateFilter implements TriStateFilter, $Instance { @override set value(String value) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $GroupFilter implements GroupFilter, $Instance { @@ -874,7 +969,8 @@ class $GroupFilter implements GroupFilter, $Instance { return value; } return e; - }).toList())); + }).toList(), + null)); } @override @@ -927,6 +1023,12 @@ class $GroupFilter implements GroupFilter, $Instance { @override List get state => $value.state; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set type(String? type) {} @@ -935,6 +1037,11 @@ class $GroupFilter implements GroupFilter, $Instance { @override set state(List state) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } class $CheckBoxFilter implements CheckBoxFilter, $Instance { @@ -973,7 +1080,7 @@ class $CheckBoxFilter implements CheckBoxFilter, $Instance { static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) { return $CheckBoxFilter.wrap(CheckBoxFilter( - args[2]?.$value ?? '', args[0]!.$value, args[1]!.$value, + args[2]?.$value ?? '', args[0]!.$value, args[1]!.$value, null, state: args[3]?.$value ?? false)); } @@ -1037,6 +1144,12 @@ class $CheckBoxFilter implements CheckBoxFilter, $Instance { @override String get value => $value.value; + @override + String? get typeName => $value.typeName; + + @override + set typeName(String? typeName) {} + @override set type(String? type) {} @@ -1045,4 +1158,9 @@ class $CheckBoxFilter implements CheckBoxFilter, $Instance { @override set value(String value) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } diff --git a/lib/eval/bridge/http.dart b/lib/eval/dart/bridge/http.dart similarity index 99% rename from lib/eval/bridge/http.dart rename to lib/eval/dart/bridge/http.dart index 30dd58c..7cc5f02 100644 --- a/lib/eval/bridge/http.dart +++ b/lib/eval/dart/bridge/http.dart @@ -4,8 +4,8 @@ import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:flutter/foundation.dart'; import 'package:http_interceptor/http_interceptor.dart'; -import 'package:mangayomi/eval/bridge/m_source.dart'; -import 'package:mangayomi/eval/model/m_bridge.dart'; +import 'package:mangayomi/eval/dart/bridge/m_source.dart'; +import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/services/http/interceptor.dart'; /// dart_eval wrapper for [InterceptedClient] diff --git a/lib/eval/bridge/m_chapter.dart b/lib/eval/dart/bridge/m_chapter.dart similarity index 98% rename from lib/eval/bridge/m_chapter.dart rename to lib/eval/dart/bridge/m_chapter.dart index 728309d..d65574a 100644 --- a/lib/eval/bridge/m_chapter.dart +++ b/lib/eval/dart/bridge/m_chapter.dart @@ -1,7 +1,7 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/model/m_chapter.dart'; +import 'package:mangayomi/eval/dart/model/m_chapter.dart'; class $MChapter implements MChapter, $Instance { $MChapter.wrap(this.$value) : _superclass = $Object($value); diff --git a/lib/eval/bridge/m_manga.dart b/lib/eval/dart/bridge/m_manga.dart similarity index 95% rename from lib/eval/bridge/m_manga.dart rename to lib/eval/dart/bridge/m_manga.dart index 8e3282e..c15fb54 100644 --- a/lib/eval/bridge/m_manga.dart +++ b/lib/eval/dart/bridge/m_manga.dart @@ -1,10 +1,10 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/bridge/m_chapter.dart'; -import 'package:mangayomi/eval/bridge/m_status.dart'; -import 'package:mangayomi/eval/model/m_chapter.dart'; -import 'package:mangayomi/eval/model/m_manga.dart'; +import 'package:mangayomi/eval/dart/bridge/m_chapter.dart'; +import 'package:mangayomi/eval/dart/bridge/m_status.dart'; +import 'package:mangayomi/eval/dart/model/m_chapter.dart'; +import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/models/manga.dart'; class $MManga implements MManga, $Instance { diff --git a/lib/eval/bridge/m_pages.dart b/lib/eval/dart/bridge/m_pages.dart similarity index 93% rename from lib/eval/bridge/m_pages.dart rename to lib/eval/dart/bridge/m_pages.dart index f5b503a..f4743f0 100644 --- a/lib/eval/bridge/m_pages.dart +++ b/lib/eval/dart/bridge/m_pages.dart @@ -1,9 +1,9 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/bridge/m_manga.dart'; -import 'package:mangayomi/eval/model/m_manga.dart'; -import 'package:mangayomi/eval/model/m_pages.dart'; +import 'package:mangayomi/eval/dart/bridge/m_manga.dart'; +import 'package:mangayomi/eval/dart/model/m_manga.dart'; +import 'package:mangayomi/eval/dart/model/m_pages.dart'; class $MPages implements MPages, $Instance { $MPages.wrap(this.$value) : _superclass = $Object($value); diff --git a/lib/eval/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart similarity index 97% rename from lib/eval/bridge/m_provider.dart rename to lib/eval/dart/bridge/m_provider.dart index 354c0b6..67de45a 100644 --- a/lib/eval/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -2,18 +2,18 @@ import 'dart:convert'; import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/bridge/document.dart'; -import 'package:mangayomi/eval/bridge/filter.dart'; -import 'package:mangayomi/eval/bridge/m_manga.dart'; -import 'package:mangayomi/eval/bridge/m_pages.dart'; -import 'package:mangayomi/eval/bridge/m_status.dart'; -import 'package:mangayomi/eval/bridge/m_track.dart'; -import 'package:mangayomi/eval/bridge/m_video.dart'; -import 'package:mangayomi/eval/model/filter.dart'; -import 'package:mangayomi/eval/model/m_bridge.dart'; -import 'package:mangayomi/eval/model/m_pages.dart'; -import 'package:mangayomi/eval/model/m_manga.dart'; -import 'package:mangayomi/eval/model/m_provider.dart'; +import 'package:mangayomi/eval/dart/bridge/document.dart'; +import 'package:mangayomi/eval/dart/bridge/filter.dart'; +import 'package:mangayomi/eval/dart/bridge/m_manga.dart'; +import 'package:mangayomi/eval/dart/bridge/m_pages.dart'; +import 'package:mangayomi/eval/dart/bridge/m_status.dart'; +import 'package:mangayomi/eval/dart/bridge/m_track.dart'; +import 'package:mangayomi/eval/dart/bridge/m_video.dart'; +import 'package:mangayomi/eval/dart/model/filter.dart'; +import 'package:mangayomi/eval/dart/model/m_bridge.dart'; +import 'package:mangayomi/eval/dart/model/m_pages.dart'; +import 'package:mangayomi/eval/dart/model/m_manga.dart'; +import 'package:mangayomi/eval/dart/model/m_provider.dart'; import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart'; import 'package:mangayomi/services/boa_js.dart'; @@ -1025,8 +1025,8 @@ class $MProvider extends MProvider with $Bridge { _toValueList(List filters) { return (filters).map((e) { if (e is SelectFilter) { - return $SelectFilter.wrap( - SelectFilter(e.type, e.name, e.state, _toValueList(e.values))); + return $SelectFilter.wrap(SelectFilter( + e.type, e.name, e.state, _toValueList(e.values), e.typeName)); } else if (e is TextFilter) { return $TextFilter.wrap(e); } else if (e is HeaderFilter) { @@ -1038,8 +1038,8 @@ class $MProvider extends MProvider with $Bridge { } else if (e is SeparatorFilter) { return $SeparatorFilter.wrap(e); } else if (e is SortFilter) { - return $SortFilter - .wrap(SortFilter(e.type, e.name, e.state, _toValueList(e.values))); + return $SortFilter.wrap(SortFilter( + e.type, e.name, e.state, _toValueList(e.values), e.typeName)); } else if (e is SortState) { return $SortState.wrap(e); } else if (e is CheckBoxFilter) { @@ -1047,8 +1047,8 @@ class $MProvider extends MProvider with $Bridge { } else if (e is SelectFilterOption) { return $SelectFilterOption.wrap(e); } else if (e is GroupFilter) { - return $GroupFilter - .wrap(GroupFilter(e.type, e.name, _toValueList(e.state))); + return $GroupFilter.wrap( + GroupFilter(e.type, e.name, _toValueList(e.state), e.typeName)); } return e; }).toList(); diff --git a/lib/eval/bridge/m_source.dart b/lib/eval/dart/bridge/m_source.dart similarity index 98% rename from lib/eval/bridge/m_source.dart rename to lib/eval/dart/bridge/m_source.dart index 2583d18..376a1e6 100644 --- a/lib/eval/bridge/m_source.dart +++ b/lib/eval/dart/bridge/m_source.dart @@ -1,7 +1,7 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/model/m_source.dart'; +import 'package:mangayomi/eval/dart/model/m_source.dart'; class $MSource implements MSource, $Instance { $MSource.wrap(this.$value) : _superclass = $Object($value); diff --git a/lib/eval/bridge/m_status.dart b/lib/eval/dart/bridge/m_status.dart similarity index 100% rename from lib/eval/bridge/m_status.dart rename to lib/eval/dart/bridge/m_status.dart diff --git a/lib/eval/bridge/m_track.dart b/lib/eval/dart/bridge/m_track.dart similarity index 96% rename from lib/eval/bridge/m_track.dart rename to lib/eval/dart/bridge/m_track.dart index 047b999..4235672 100644 --- a/lib/eval/bridge/m_track.dart +++ b/lib/eval/dart/bridge/m_track.dart @@ -76,4 +76,9 @@ class $MTrack implements Track, $Instance { @override set label(String? label) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } diff --git a/lib/eval/bridge/m_video.dart b/lib/eval/dart/bridge/m_video.dart similarity index 96% rename from lib/eval/bridge/m_video.dart rename to lib/eval/dart/bridge/m_video.dart index e3a69a1..c333ab0 100644 --- a/lib/eval/bridge/m_video.dart +++ b/lib/eval/dart/bridge/m_video.dart @@ -1,7 +1,7 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; -import 'package:mangayomi/eval/bridge/m_track.dart'; +import 'package:mangayomi/eval/dart/bridge/m_track.dart'; import 'package:mangayomi/models/video.dart'; class $MVideo implements Video, $Instance { @@ -139,4 +139,9 @@ class $MVideo implements Video, $Instance { @override set audios(List? audios) {} + + @override + Map toJson() { + throw UnimplementedError(); + } } diff --git a/lib/eval/bridge/source_preference.dart b/lib/eval/dart/bridge/source_preference.dart similarity index 99% rename from lib/eval/bridge/source_preference.dart rename to lib/eval/dart/bridge/source_preference.dart index 13c34db..9d1c6e7 100644 --- a/lib/eval/bridge/source_preference.dart +++ b/lib/eval/dart/bridge/source_preference.dart @@ -2,7 +2,7 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/stdlib/core.dart'; import 'package:isar/isar.dart'; -import 'package:mangayomi/eval/model/source_preference.dart'; +import 'package:mangayomi/eval/dart/model/source_preference.dart'; class $CheckBoxPreference implements SourcePreference, $Instance { $CheckBoxPreference.wrap(this.$value) : _superclass = $Object($value); diff --git a/lib/eval/compiler/compiler.dart b/lib/eval/dart/compiler/compiler.dart similarity index 87% rename from lib/eval/compiler/compiler.dart rename to lib/eval/dart/compiler/compiler.dart index 10a209e..6514062 100644 --- a/lib/eval/compiler/compiler.dart +++ b/lib/eval/dart/compiler/compiler.dart @@ -1,6 +1,6 @@ import 'dart:typed_data'; import 'package:dart_eval/dart_eval.dart'; -import 'package:mangayomi/eval/plugin.dart'; +import 'package:mangayomi/eval/dart/plugin.dart'; Uint8List compilerEval(String code) { late Compiler compiler = Compiler(); diff --git a/lib/eval/model/document.dart b/lib/eval/dart/model/document.dart similarity index 92% rename from lib/eval/model/document.dart rename to lib/eval/dart/model/document.dart index f2d3205..9fa9e46 100644 --- a/lib/eval/model/document.dart +++ b/lib/eval/dart/model/document.dart @@ -1,5 +1,5 @@ import 'package:html/dom.dart'; -import 'package:mangayomi/eval/model/element.dart'; +import 'package:mangayomi/eval/dart/model/element.dart'; import 'package:mangayomi/utils/extensions/dom_extensions.dart'; class MDocument { @@ -55,4 +55,8 @@ class MDocument { MElement? selectFirst(String selector) { return MElement(_document?.selectFirst(selector)); } + + String? attr(String attr) { + return _document?.attr(attr); + } } diff --git a/lib/eval/model/element.dart b/lib/eval/dart/model/element.dart similarity index 100% rename from lib/eval/model/element.dart rename to lib/eval/dart/model/element.dart diff --git a/lib/eval/dart/model/filter.dart b/lib/eval/dart/model/filter.dart new file mode 100644 index 0000000..aeae548 --- /dev/null +++ b/lib/eval/dart/model/filter.dart @@ -0,0 +1,237 @@ +import 'package:mangayomi/eval/javascript/http.dart'; + +class FilterList { + List filters; + FilterList(this.filters); + factory FilterList.fromJson(Map json) { + return FilterList(fromJsonFilterValuestoList(json['filters'])); + } + Map toJson() => {'filters': filterValuesListToJson(filters)}; +} + +class SelectFilter { + String? type; + String name; + int state; + List values; + String? typeName; + + SelectFilter(this.type, this.name, this.state, this.values, this.typeName); + factory SelectFilter.fromJson(Map json) { + return SelectFilter(json['type'], json['name'], json['state'] ?? 0, + fromJsonFilterValuestoList(json['values']), json['type_name']); + } + Map toJson() => { + 'type': type, + 'name': name, + 'values': filterValuesListToJson(values), + 'type_name': typeName + }; +} + +class SelectFilterOption { + String name; + String value; + String? typeName; + + SelectFilterOption(this.name, this.value, this.typeName); + factory SelectFilterOption.fromJson(Map json) { + return SelectFilterOption(json['name'], json['value'], json['type_name']); + } + Map toJson() => + {'value': value, 'name': name, 'type_name': typeName}; +} + +class SeparatorFilter { + String? type; + String? typeName; + SeparatorFilter(this.typeName, {this.type = ''}); + factory SeparatorFilter.fromJson(Map json) { + return SeparatorFilter(type: json['type'], json['type_name']); + } + Map toJson() => {'type': type, 'type_name': typeName}; +} + +class HeaderFilter { + String? type; + String name; + String? typeName; + HeaderFilter(this.name, this.typeName, {this.type = ''}); + factory HeaderFilter.fromJson(Map json) { + return HeaderFilter(json['name'], json['type_name'], type: json['value']); + } + Map toJson() => + {'type': type, 'name': name, 'type_name': typeName}; +} + +class TextFilter { + String? type; + String name; + String state; + String? typeName; + + TextFilter(this.type, this.name, this.typeName, {this.state = ""}); + factory TextFilter.fromJson(Map json) { + return TextFilter(json['type'], json['name'], json['type_name'], + state: json['state'] ?? ""); + } + Map toJson() => + {'type': type, 'name': name, 'state': state, 'type_name': typeName}; +} + +class SortFilter { + String? type; + String name; + SortState state; + List values; + String? typeName; + + SortFilter(this.type, this.name, this.state, this.values, this.typeName); + factory SortFilter.fromJson(Map json) { + return SortFilter( + json['type'], + json['name'], + json['state'] == null + ? SortState(0, false, "") + : SortState.fromJson(json['state']), + fromJsonFilterValuestoList(json['values']), + json['type_name']); + } + Map toJson() => { + 'type': type, + 'name': name, + 'state': state, + 'values': filterValuesListToJson(values), + 'type_name': typeName + }; +} + +class SortState { + int index; + bool ascending; + String? typeName; + + SortState(this.index, this.ascending, this.typeName); + factory SortState.fromJson(Map json) { + return SortState(json['index'], json['ascending'], json['type_name']); + } + Map toJson() => + {'index': index, 'ascending': ascending, 'type_name': typeName}; +} + +class TriStateFilter { + String? type; + String name; + String value; + int state; + String? typeName; + + factory TriStateFilter.fromJson(Map json) { + return TriStateFilter( + json['type'], json['name'], json['value'], json['type_name'], + state: json['state'] ?? 0); + } + TriStateFilter(this.type, this.name, this.value, this.typeName, + {this.state = 0}); + Map toJson() => { + 'type': type, + 'name': name, + 'value': value, + 'state': state, + 'type_name': typeName + }; +} + +class GroupFilter { + String? type; + String name; + List state; + String? typeName; + + GroupFilter(this.type, this.name, this.state, this.typeName); + factory GroupFilter.fromJson(Map json) { + return GroupFilter(json['type'], json['name'], + fromJsonFilterValuestoList(json['state']), json['type_name']); + } + Map toJson() => { + 'type': type, + 'name': name, + 'state': filterValuesListToJson(state), + 'type_name': typeName + }; +} + +class CheckBoxFilter { + String? type; + String name; + String value; + bool state; + String? typeName; + + CheckBoxFilter(this.type, this.name, this.value, this.typeName, + {this.state = false}); + factory CheckBoxFilter.fromJson(Map json) { + return CheckBoxFilter( + json['type'], json['name'], json['value'], json['type_name'], + state: json['state'] ?? false); + } + Map toJson() => { + 'type': type, + 'name': name, + 'value': value, + 'state': state, + 'type_name': typeName + }; +} + +List fromJsonFilterValuestoList(List list) { + return list.map((e) { + final map = (e as Map).toMapStringDynamic!; + if (map['type_name'] == 'TriState') { + return TriStateFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'CheckBox') { + return CheckBoxFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'SelectOption') { + return SelectFilterOption.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'SelectFilter') { + return SelectFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'SeparatorFilter') { + return SeparatorFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'HeaderFilter') { + return HeaderFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'TextFilter') { + return TextFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'SortFilter') { + return SortFilter.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'SortState') { + return SortState.fromJson(map.toMapStringDynamic!); + } else if (map['type_name'] == 'GroupFilter') { + return GroupFilter.fromJson(map.toMapStringDynamic!); + } + }).toList(); +} + +List?> filterValuesListToJson(List values) { + return values.map((e) { + if (e is SelectFilter) { + return e.toJson(); + } else if (e is SelectFilterOption) { + return e.toJson(); + } else if (e is SeparatorFilter) { + return e.toJson(); + } else if (e is HeaderFilter) { + return e.toJson(); + } else if (e is TextFilter) { + return e.toJson(); + } else if (e is SortFilter) { + return e.toJson(); + } else if (e is SortState) { + return e.toJson(); + } else if (e is TriStateFilter) { + return e.toJson(); + } else if (e is GroupFilter) { + return e.toJson(); + } + return (e.toJson() as Map?); + }).toList(); +} diff --git a/lib/eval/model/m_bridge.dart b/lib/eval/dart/model/m_bridge.dart similarity index 99% rename from lib/eval/model/m_bridge.dart rename to lib/eval/dart/model/m_bridge.dart index f63f4eb..bf6127a 100644 --- a/lib/eval/model/m_bridge.dart +++ b/lib/eval/dart/model/m_bridge.dart @@ -8,7 +8,7 @@ import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/intl.dart'; 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/dart/model/document.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/services/anime_extractors/dood_extractor.dart'; import 'package:mangayomi/services/anime_extractors/filemoon.dart'; diff --git a/lib/eval/dart/model/m_chapter.dart b/lib/eval/dart/model/m_chapter.dart new file mode 100644 index 0000000..7a2b575 --- /dev/null +++ b/lib/eval/dart/model/m_chapter.dart @@ -0,0 +1,17 @@ +class MChapter { + String? name; + + String? url; + + String? dateUpload; + + String? scanlator; + MChapter({this.name, this.url, this.dateUpload, this.scanlator}); + factory MChapter.fromJson(Map json) { + return MChapter( + name: json['name'], + url: json['url'], + dateUpload: json['dateUpload'], + scanlator: json['scanlator']); + } +} diff --git a/lib/eval/dart/model/m_manga.dart b/lib/eval/dart/model/m_manga.dart new file mode 100644 index 0000000..e4523cc --- /dev/null +++ b/lib/eval/dart/model/m_manga.dart @@ -0,0 +1,50 @@ +import 'package:mangayomi/eval/dart/model/m_chapter.dart'; +import 'package:mangayomi/models/manga.dart'; + +class MManga { + String? name; + + String? link; + + String? imageUrl; + + String? description; + + String? author; + + String? artist; + + Status? status; + + List? genre; + + List? chapters; + + MManga( + {this.author, + this.artist, + this.genre, + this.imageUrl, + this.link, + this.name, + this.status = Status.unknown, + this.description, + this.chapters}); + + factory MManga.fromJson(Map json) { + return MManga( + name: json['name'], + link: json['link'], + imageUrl: json['imageUrl'], + description: json['description'], + author: json['author'], + artist: json['artist'], + status: json['status'], + genre: json['genre'] ?? [], + chapters: json['chapters'] != null + ? (json['chapters'] as List) + .map((e) => MChapter.fromJson(e)) + .toList() + : []); + } +} diff --git a/lib/eval/dart/model/m_pages.dart b/lib/eval/dart/model/m_pages.dart new file mode 100644 index 0000000..d6d2dd8 --- /dev/null +++ b/lib/eval/dart/model/m_pages.dart @@ -0,0 +1,15 @@ +import 'package:mangayomi/eval/dart/model/m_manga.dart'; + +class MPages { + List list; + bool hasNextPage; + MPages({required this.list, this.hasNextPage = false}); + + factory MPages.fromJson(Map json) { + return MPages( + list: json['list'] != null + ? (json['list'] as List).map((e) => MManga.fromJson(e)).toList() + : [], + hasNextPage: json['hasNextPage']); + } +} diff --git a/lib/eval/model/m_provider.dart b/lib/eval/dart/model/m_provider.dart similarity index 75% rename from lib/eval/model/m_provider.dart rename to lib/eval/dart/model/m_provider.dart index d85ee21..60b0efe 100644 --- a/lib/eval/model/m_provider.dart +++ b/lib/eval/dart/model/m_provider.dart @@ -1,6 +1,6 @@ -import 'package:mangayomi/eval/model/filter.dart'; -import 'package:mangayomi/eval/model/m_pages.dart'; -import 'package:mangayomi/eval/model/m_manga.dart'; +import 'package:mangayomi/eval/dart/model/filter.dart'; +import 'package:mangayomi/eval/dart/model/m_pages.dart'; +import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/models/video.dart'; abstract class MProvider { diff --git a/lib/eval/model/m_source.dart b/lib/eval/dart/model/m_source.dart similarity index 100% rename from lib/eval/model/m_source.dart rename to lib/eval/dart/model/m_source.dart diff --git a/lib/eval/model/m_video.dart b/lib/eval/dart/model/m_video.dart similarity index 100% rename from lib/eval/model/m_video.dart rename to lib/eval/dart/model/m_video.dart diff --git a/lib/eval/model/source_preference.dart b/lib/eval/dart/model/source_preference.dart similarity index 100% rename from lib/eval/model/source_preference.dart rename to lib/eval/dart/model/source_preference.dart diff --git a/lib/eval/model/source_preference.g.dart b/lib/eval/dart/model/source_preference.g.dart similarity index 100% rename from lib/eval/model/source_preference.g.dart rename to lib/eval/dart/model/source_preference.g.dart diff --git a/lib/eval/plugin.dart b/lib/eval/dart/plugin.dart similarity index 87% rename from lib/eval/plugin.dart rename to lib/eval/dart/plugin.dart index d979b20..ed0863b 100644 --- a/lib/eval/plugin.dart +++ b/lib/eval/dart/plugin.dart @@ -1,18 +1,18 @@ import 'package:dart_eval/dart_eval.dart'; import 'package:dart_eval/dart_eval_bridge.dart'; -import 'package:mangayomi/eval/bridge/document.dart'; -import 'package:mangayomi/eval/bridge/element.dart'; -import 'package:mangayomi/eval/bridge/http.dart'; -import 'package:mangayomi/eval/bridge/m_chapter.dart'; -import 'package:mangayomi/eval/bridge/filter.dart'; -import 'package:mangayomi/eval/bridge/m_pages.dart'; -import 'package:mangayomi/eval/bridge/m_status.dart'; -import 'package:mangayomi/eval/bridge/m_provider.dart'; -import 'package:mangayomi/eval/bridge/m_manga.dart'; -import 'package:mangayomi/eval/bridge/m_source.dart'; -import 'package:mangayomi/eval/bridge/m_track.dart'; -import 'package:mangayomi/eval/bridge/m_video.dart'; -import 'package:mangayomi/eval/bridge/source_preference.dart'; +import 'package:mangayomi/eval/dart/bridge/document.dart'; +import 'package:mangayomi/eval/dart/bridge/element.dart'; +import 'package:mangayomi/eval/dart/bridge/http.dart'; +import 'package:mangayomi/eval/dart/bridge/m_chapter.dart'; +import 'package:mangayomi/eval/dart/bridge/filter.dart'; +import 'package:mangayomi/eval/dart/bridge/m_pages.dart'; +import 'package:mangayomi/eval/dart/bridge/m_status.dart'; +import 'package:mangayomi/eval/dart/bridge/m_provider.dart'; +import 'package:mangayomi/eval/dart/bridge/m_manga.dart'; +import 'package:mangayomi/eval/dart/bridge/m_source.dart'; +import 'package:mangayomi/eval/dart/bridge/m_track.dart'; +import 'package:mangayomi/eval/dart/bridge/m_video.dart'; +import 'package:mangayomi/eval/dart/bridge/source_preference.dart'; class MEvalPlugin extends EvalPlugin { @override diff --git a/lib/eval/runtime/runtime.dart b/lib/eval/dart/runtime/runtime.dart similarity index 83% rename from lib/eval/runtime/runtime.dart rename to lib/eval/dart/runtime/runtime.dart index 717e3a8..e8b4c6e 100644 --- a/lib/eval/runtime/runtime.dart +++ b/lib/eval/dart/runtime/runtime.dart @@ -1,6 +1,6 @@ import 'dart:typed_data'; import 'package:dart_eval/dart_eval.dart'; -import 'package:mangayomi/eval/plugin.dart'; +import 'package:mangayomi/eval/dart/plugin.dart'; Runtime runtimeEval(Uint8List bytecode) { final runtime = Runtime(bytecode.buffer.asByteData()); diff --git a/lib/eval/javascript/dom_selector.dart b/lib/eval/javascript/dom_selector.dart new file mode 100644 index 0000000..37d8921 --- /dev/null +++ b/lib/eval/javascript/dom_selector.dart @@ -0,0 +1,312 @@ +import 'dart:convert'; +import 'package:flutter_qjs/flutter_qjs.dart'; +import 'package:html/dom.dart'; +import 'package:html/parser.dart'; +import 'package:mangayomi/utils/extensions/dom_extensions.dart'; + +class JsDomSelector { + late JavascriptRuntime runtime; + JsDomSelector(this.runtime); + + init() { + runtime.onMessage('getDocElement', (dynamic args) async { + final input = args[0]; + final type = args[1]; + final doc = parse(input); + final res = switch (type) { + 'body' => doc.body, + 'documentElement' => doc.documentElement, + 'head' => doc.head, + _ => doc.parent + }; + return res?.outerHtml ?? ""; + }); + runtime.onMessage('getDocumentString', (dynamic args) async { + final input = args[0]; + final type = args[1]; + final doc = parse(input); + final res = switch (type) { 'text' => doc.text, _ => doc.outerHtml }; + return res ?? ""; + }); + runtime.onMessage('getElementString', (dynamic args) async { + final input = args[0]; + final selector = args[1]; + final type = args[2]; + final element = parse(input).selectFirst(selector); + final res = switch (type) { + 'text' => element?.text, + 'innerHtml' => element?.innerHtml, + 'outerHtml' => element?.outerHtml, + 'previousElementSibling' => element?.previousElementSibling?.outerHtml, + 'nextElementSibling' => element?.nextElementSibling?.outerHtml, + 'className' => element?.className, + 'localName' => element?.localName, + 'namespaceUri' => element?.namespaceUri, + 'getSrc' => element?.getSrc, + 'getImg' => element?.getImg, + 'getHref' => element?.getHref, + _ => element?.getDataSrc + }; + return res ?? ""; + }); + runtime.onMessage('selectFirst', (dynamic args) async { + final input = args[0]; + final selector = args[1]; + final element = parse(input).selectFirst(selector); + return element?.outerHtml ?? ""; + }); + runtime.onMessage('attr', (dynamic args) async { + final input = args[0]; + final selector = args[1]; + final attr = args[2]; + return parse(input).selectFirst(selector)?.attr(attr) ?? ""; + }); + runtime.onMessage('docAttr', (dynamic args) async { + final input = args[0]; + final attr = args[1]; + return parse(input).attr(attr) ?? ""; + }); + runtime.onMessage('xpathFirst', (dynamic args) async { + final input = args[0]; + final selector = args[1]; + final xpath = args[2]; + return parse(input).selectFirst(selector)?.xpathFirst(xpath) ?? ""; + }); + + runtime.onMessage('xpath', (dynamic args) async { + final input = args[0]; + final selector = args[1]; + final xpath = args[2]; + return jsonEncode(parse(input).selectFirst(selector)?.xpath(xpath)); + }); + runtime.onMessage('docGetElementsListBy', (dynamic args) async { + final input = args[0]; + final type = args[1]; + final name = args[2]; + final doc = parse(input); + final elements = switch (type) { + 'children' => doc.children, + 'getElementsByTagName' => doc.getElementsByTagName(name), + _ => doc.getElementsByClassName(name) + }; + return jsonEncode(elements.map((e) => e.outerHtml).toList()); + }); + runtime.onMessage('elemGetElementsListBy', (dynamic args) async { + final input = args[0]; + final type = args[1]; + final name = args[2]; + final selector = args[3]; + final doc = parse(input).selectFirst(selector); + final elements = switch (type) { + 'children' => doc?.children, + 'getElementsByTagName' => doc?.getElementsByTagName(name), + _ => doc?.getElementsByClassName(name) + }; + return jsonEncode(elements?.map((e) => e.outerHtml).toList()); + }); + runtime.onMessage('getElementById', (dynamic args) async { + final input = args[0]; + final id = args[1]; + return parse(input).getElementById(id)?.outerHtml ?? ""; + }); + runtime.onMessage('select', (dynamic args) async { + final input = args[0]; + final selector = args[1]; + final listElement = parse(input).select(selector); + final elements = jsonEncode(listElement?.map((e) { + return e.outerHtml; + }).toList()); + return elements; + }); + + runtime.evaluate(''' +class Document { + constructor(html) { + this.html = html; + } + async getDocElement(type) { + return JSON.parse(await sendMessage( + "getDocElement", + JSON.stringify([this.html, type])) + ); + } + get body() { + return this.getDocElement('body'); + } + get documentElement() { + return this.getDocElement('documentElement'); + } + get head() { + return this.getDocElement('head'); + } + get parent() { + return this.getDocElement('parent'); + } + async getDocumentString(type) { + return JSON.parse(await sendMessage( + "getDocumentString", + JSON.stringify([this.html, type])) + ); + } + get text() { + return this.getDocumentString('text'); + } + get outerHtml() { + return this.getDocumentString('outerHtml'); + } + async selectFirst(selector) { + const res = await sendMessage( + "selectFirst", + JSON.stringify([this.html, selector]) + ); + return new Element(res, selector); + } + async select(selector) { + let htmlList = []; + JSON.parse( + await sendMessage("select", JSON.stringify([this.html, selector])) + ).forEach((e) => { + htmlList.push(e); + }); + return htmlList; + } + async xpathFirst(xpath) { + return await sendMessage( + "xpathFirst", + JSON.stringify([this.html, xpath]) + ); + } + async xpath(xpath) { + return JSON.parse(await sendMessage( + "xpath", + JSON.stringify([this.html, xpath])) + ); + } + async docGetElementsListBy(type, name) { + name = name || ''; + return JSON.parse(await sendMessage( + "docGetElementsListBy", + JSON.stringify([this.html, type, name])) + ); + } + get children() { + return this.docGetElementsListBy('children'); + } + async getElementsByTagName(name) { + return this.docGetElementsListBy('getElementsByTagName', name); + } + async getElementsByClassName(name) { + return this.docGetElementsListBy('getElementsByClassName', name); + } + async getElementById(id) { + return await sendMessage( + "getElementById", + JSON.stringify([(await this.parse()).outerHtml, id]) + ); + } + async attr(attr) { + return await sendMessage( + "docAttr", + JSON.stringify([this.res.html, this.res.selector, attr]) + ); + } +} + +class Element { + constructor(html, selector) { + this.html = html; + this.selector = selector; + } + async getElementString(type) { + return await sendMessage( + "getElementString", + JSON.stringify([this.html, this.selector, type]) + ); + } + get text() { + return this.getElementString("text"); + } + get outerHtml() { + return this.getElementString("outerHtml"); + } + get innerHtml() { + return this.getElementString("innerHtml"); + } + get className() { + return this.getElementString("className"); + } + get localName() { + return this.getElementString("localName"); + } + get namespaceUri() { + return this.getElementString("namespaceUri"); + } + get getSrc() { + return this.getElementString("getSrc"); + } + get getImg() { + return this.getElementString("getImg"); + } + get getHref() { + return this.getElementString("getHref"); + } + get getDataSrc() { + return this.getElementString("getDataSrc"); + } + get previousElementSibling() { + return this.getElementString("previousElementSibling"); + } + get nextElementSibling() { + return this.getElementString("nextElementSibling"); + } + async elemGetElementsListBy(type, name) { + name = name || ''; + return JSON.parse(await sendMessage( + "elemGetElementsListBy", + JSON.stringify([this.html, type, name])) + ); + } + get children() { + return this.elemGetElementsListBy('children'); + } + async getElementsByTagName(name) { + return this.elemGetElementsListBy('getElementsByTagName', name); + } + async getElementsByClassName(name) { + return this.elemGetElementsListBy('getElementsByClassName', name); + } + async xpath(xpath) { + return JSON.parse(await sendMessage( + "xpath", + JSON.stringify([this.html, xpath])) + ); + } + async attr(attr) { + return await sendMessage( + "attr", + JSON.stringify([this.html, this.selector, attr]) + ); + } + async xpathFirst(xpath) { + return await sendMessage( + "xpathFirst", + JSON.stringify([this.html, xpath]) + ); + } +} +'''); + } +} + +extension ElementExtexsion on Element? { + Map toJson() => { + 'text': this?.text, + 'className': this?.className, + 'localName': this?.localName, + 'namespaceUri': this?.namespaceUri, + 'getSrc': this?.getSrc, + 'getImg': this?.getImg, + 'getHref': this?.getHref, + 'getDataSrc': this?.getDataSrc, + }; +} diff --git a/lib/eval/javascript/extractors.dart b/lib/eval/javascript/extractors.dart new file mode 100644 index 0000000..d4cfc1e --- /dev/null +++ b/lib/eval/javascript/extractors.dart @@ -0,0 +1,172 @@ +import 'dart:convert'; +import 'package:flutter_qjs/flutter_qjs.dart'; +import 'package:mangayomi/eval/dart/model/m_bridge.dart'; +import 'package:mangayomi/models/video.dart'; + +class JsVideosExtractors { + late JavascriptRuntime runtime; + JsVideosExtractors(this.runtime); + + init() { + runtime.onMessage('sibnetExtractor', (dynamic args) async { + return (await MBridge.sibnetExtractor(args[0], args[1] ?? "")) + .encodeToJson(); + }); + runtime.onMessage('myTvExtractor', (dynamic args) async { + return (await MBridge.myTvExtractor(args[0])).encodeToJson(); + }); + runtime.onMessage('okruExtractor', (dynamic args) async { + return (await MBridge.okruExtractor(args[0])).encodeToJson(); + }); + runtime.onMessage('voeExtractor', (dynamic args) async { + return (await MBridge.voeExtractor(args[0], args[1])).encodeToJson(); + }); + runtime.onMessage('vidBomExtractor', (dynamic args) async { + return (await MBridge.vidBomExtractor(args[0])).encodeToJson(); + }); + runtime.onMessage('streamlareExtractor', (dynamic args) async { + return (await MBridge.streamlareExtractor(args[0], args[1], args[2])) + .encodeToJson(); + }); + runtime.onMessage('sendVidExtractor', (dynamic args) async { + return (await MBridge.sendVidExtractor(args[0], args[1], args[2] ?? "")) + .encodeToJson(); + }); + runtime.onMessage('yourUploadExtractor', (dynamic args) async { + return (await MBridge.yourUploadExtractor( + args[0], args[1], args[2], args[3] ?? "")) + .encodeToJson(); + }); + runtime.onMessage('gogoCdnExtractor', (dynamic args) async { + return (await MBridge.gogoCdnExtractor(args[0])).encodeToJson(); + }); + runtime.onMessage('doodExtractor', (dynamic args) async { + return (await MBridge.doodExtractor(args[0], args[1])).encodeToJson(); + }); + runtime.onMessage('streamTapeExtractor', (dynamic args) async { + return (await MBridge.streamTapeExtractor(args[0], args[1])) + .encodeToJson(); + }); + runtime.onMessage('mp4UploadExtractor', (dynamic args) async { + return (await MBridge.mp4UploadExtractor( + args[0], args[1], args[2], args[3] ?? "")) + .encodeToJson(); + }); + runtime.onMessage('streamWishExtractor', (dynamic args) async { + return (await MBridge.streamWishExtractor(args[0], args[1] ?? "")) + .encodeToJson(); + }); + runtime.onMessage('filemoonExtractor', (dynamic args) async { + return (await MBridge.filemoonExtractor( + args[0], args[1] ?? "", args[2] ?? "")) + .encodeToJson(); + }); + + runtime.evaluate(''' +async function sibnetExtractor(url, prefix) { + const result = await sendMessage( + "sibnetExtractor", + JSON.stringify([url, prefix]) + ); + return JSON.parse(result); +} +async function myTvExtractor(url) { + const result = await sendMessage( + "myTvExtractor", + JSON.stringify([url]) + ); + return JSON.parse(result); +} +async function okruExtractor(url) { + const result = await sendMessage( + "okruExtractor", + JSON.stringify([url]) + ); + return JSON.parse(result); +} +async function voeExtractor(url, quality) { + const result = await sendMessage( + "voeExtractor", + JSON.stringify([url, quality]) + ); + return JSON.parse(result); +} +async function vidBomExtractor(url) { + const result = await sendMessage( + "vidBomExtractor", + JSON.stringify([url]) + ); + return JSON.parse(result); +} +async function streamlareExtractor(url, prefix, suffix) { + const result = await sendMessage( + "streamlareExtractor", + JSON.stringify([url, prefix, suffix]) + ); + return JSON.parse(result); +} +async function sendVidExtractor(url, headers, prefix) { + const result = await sendMessage( + "sendVidExtractor", + JSON.stringify([url, JSON.stringify(headers), prefix]) + ); + return JSON.parse(result); +} +async function yourUploadExtractor(url, headers, name, prefix) { + const result = await sendMessage( + "yourUploadExtractor", + JSON.stringify([url, JSON.stringify(headers), name, prefix]) + ); + return JSON.parse(result); +} +async function gogoCdnExtractor(url) { + const result = await sendMessage( + "gogoCdnExtractor", + JSON.stringify([url]) + ); + return JSON.parse(result); +} +async function doodExtractor(url, quality) { + const result = await sendMessage( + "doodExtractor", + JSON.stringify([url, quality]) + ); + return JSON.parse(result); +} +async function streamTapeExtractor(url, quality) { + const result = await sendMessage( + "streamTapeExtractor", + JSON.stringify([url, quality]) + ); + return JSON.parse(result); +} +async function mp4UploadExtractor(url, headers, prefix, suffix) { + const result = await sendMessage( + "mp4UploadExtractor", + JSON.stringify([url, JSON.stringify(headers), prefix, suffix]) + ); + return JSON.parse(result); +} +async function streamWishExtractor(url, prefix) { + const result = await sendMessage( + "streamWishExtractor", + JSON.stringify([url, prefix]) + ); + return JSON.parse(result); +} +async function filemoonExtractor(url, prefix, suffix) { + const result = await sendMessage( + "filemoonExtractor", + JSON.stringify([url, prefix, suffix]) + ); + return JSON.parse(result); +} +'''); + } +} + +extension ResponseExtexsion on List