refactor: refactor extension services

This commit is contained in:
Yegor Shovkun 2024-12-14 13:55:40 +02:00
parent adbd1529f7
commit f0cf52813a
74 changed files with 337 additions and 351 deletions

View file

@ -3,8 +3,8 @@ import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:html/dom.dart'; import 'package:html/dom.dart';
import 'package:mangayomi/eval/dart/bridge/element.dart'; import 'package:mangayomi/eval/dart/bridge/element.dart';
import 'package:mangayomi/eval/dart/model/document.dart'; import 'package:mangayomi/eval/model/document.dart';
import 'package:mangayomi/eval/dart/model/element.dart'; import 'package:mangayomi/eval/model/element.dart';
class $MDocument implements MDocument, $Instance { class $MDocument implements MDocument, $Instance {
$MDocument.wrap(this.$value) : _superclass = $Object($value); $MDocument.wrap(this.$value) : _superclass = $Object($value);

View file

@ -1,7 +1,7 @@
import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:html/dom.dart'; import 'package:html/dom.dart';
import 'package:mangayomi/eval/dart/model/element.dart'; import 'package:mangayomi/eval/model/element.dart';
class $MElement implements MElement, $Instance { class $MElement implements MElement, $Instance {
$MElement.wrap(this.$value) : _superclass = $Object($value); $MElement.wrap(this.$value) : _superclass = $Object($value);
@ -192,48 +192,56 @@ class $MElement implements MElement, $Instance {
} }
static const $Function __attr = $Function(_attr); static const $Function __attr = $Function(_attr);
static $Value? _attr(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _attr(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).attr(args[0]?.$value ?? ""); final res = (target!.$value as MElement).attr(args[0]?.$value ?? "");
return res == null ? const $null() : $String(res); return res == null ? const $null() : $String(res);
} }
static const $Function __select = $Function(_select); static const $Function __select = $Function(_select);
static $Value? _select(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _select(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).select(args[0]?.$value); final res = (target!.$value as MElement).select(args[0]?.$value);
return res == null ? const $null() : $List.wrap(res.map((e) => $MElement.wrap(e)).toList()); return res == null ? const $null() : $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
} }
static const $Function __selectFirst = $Function(_selectFirst); static const $Function __selectFirst = $Function(_selectFirst);
static $Value? _selectFirst(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _selectFirst(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).selectFirst(args[0]?.$value); final res = (target!.$value as MElement).selectFirst(args[0]?.$value);
return res == null ? const $null() : $MElement.wrap(res); return res == null ? const $null() : $MElement.wrap(res);
} }
static const $Function __getElementsByClassName = $Function(_getElementsByClassName); static const $Function __getElementsByClassName = $Function(_getElementsByClassName);
static $Value? _getElementsByClassName(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _getElementsByClassName(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).getElementsByClassName(args[0]?.$value); final res = (target!.$value as MElement).getElementsByClassName(args[0]?.$value);
return res == null ? const $null() : $List.wrap(res.map((e) => $MElement.wrap(e)).toList()); return res == null ? const $null() : $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
} }
static const $Function __getElementsByTagName = $Function(_getElementsByTagName); static const $Function __getElementsByTagName = $Function(_getElementsByTagName);
static $Value? _getElementsByTagName(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _getElementsByTagName(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).getElementsByTagName(args[0]?.$value); final res = (target!.$value as MElement).getElementsByTagName(args[0]?.$value);
return res == null ? const $null() : $List.wrap(res.map((e) => $MElement.wrap(e)).toList()); return res == null ? const $null() : $List.wrap(res.map((e) => $MElement.wrap(e)).toList());
} }
static const $Function __xpath = $Function(_xpath); static const $Function __xpath = $Function(_xpath);
static $Value? _xpath(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _xpath(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).xpath(args[0]?.$value); final res = (target!.$value as MElement).xpath(args[0]?.$value);
return res == null ? const $null() : $List.wrap(res.map((e) => $String(e)).toList()); return res == null ? const $null() : $List.wrap(res.map((e) => $String(e)).toList());
} }
static const $Function __xpathFirst = $Function(_xpathFirst); static const $Function __xpathFirst = $Function(_xpathFirst);
static $Value? _xpathFirst(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _xpathFirst(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).xpathFirst(args[0]?.$value); final res = (target!.$value as MElement).xpathFirst(args[0]?.$value);
return res == null ? const $null() : $String(res); return res == null ? const $null() : $String(res);
} }
static const $Function __hasAttr = $Function(_hasAttr); static const $Function __hasAttr = $Function(_hasAttr);
static $Value? _hasAttr(final Runtime runtime, final $Value? target, final List<$Value?> args) { static $Value? _hasAttr(final Runtime runtime, final $Value? target, final List<$Value?> args) {
final res = (target!.$value as MElement).attr(args[0]?.$value ?? ""); final res = (target!.$value as MElement).attr(args[0]?.$value ?? "");
return res == null ? const $null() : $String(res); return res == null ? const $null() : $String(res);

View file

@ -1,6 +1,6 @@
import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/model/filter.dart';
class $FilterList implements FilterList, $Instance { class $FilterList implements FilterList, $Instance {
$FilterList.wrap(this.$value) : _superclass = $Object($value); $FilterList.wrap(this.$value) : _superclass = $Object($value);

View file

@ -4,7 +4,7 @@ import 'package:dart_eval/stdlib/core.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:http_interceptor/http_interceptor.dart'; import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/dart/bridge/m_source.dart'; import 'package:mangayomi/eval/dart/bridge/m_source.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/services/http/m_client.dart'; import 'package:mangayomi/services/http/m_client.dart';
/// dart_eval wrapper for [InterceptedClient] /// dart_eval wrapper for [InterceptedClient]

View file

@ -1,6 +1,6 @@
import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/model/m_chapter.dart'; import 'package:mangayomi/eval/model/m_chapter.dart';
class $MChapter implements MChapter, $Instance { class $MChapter implements MChapter, $Instance {
$MChapter.wrap(this.$value) : _superclass = $Object($value); $MChapter.wrap(this.$value) : _superclass = $Object($value);

View file

@ -2,8 +2,8 @@ import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_chapter.dart'; import 'package:mangayomi/eval/dart/bridge/m_chapter.dart';
import 'package:mangayomi/eval/dart/bridge/m_status.dart'; import 'package:mangayomi/eval/dart/bridge/m_status.dart';
import 'package:mangayomi/eval/dart/model/m_chapter.dart'; import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/utils/extensions/string_extensions.dart';

View file

@ -1,8 +1,8 @@
import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_manga.dart'; import 'package:mangayomi/eval/dart/bridge/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
class $MPages implements MPages, $Instance { class $MPages implements MPages, $Instance {
$MPages.wrap(this.$value) : _superclass = $Object($value); $MPages.wrap(this.$value) : _superclass = $Object($value);

View file

@ -9,11 +9,11 @@ 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_status.dart';
import 'package:mangayomi/eval/dart/bridge/m_track.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/m_video.dart';
import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/dart/model/m_provider.dart'; import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart'; import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';

View file

@ -1,6 +1,6 @@
import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/model/m_source.dart'; import 'package:mangayomi/eval/model/m_source.dart';
class $MSource implements MSource, $Instance { class $MSource implements MSource, $Instance {
$MSource.wrap(this.$value) : _superclass = $Object($value); $MSource.wrap(this.$value) : _superclass = $Object($value);

View file

@ -1,7 +1,7 @@
import 'package:dart_eval/dart_eval_bridge.dart'; import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
class $CheckBoxPreference implements SourcePreference, $Instance { class $CheckBoxPreference implements SourcePreference, $Instance {
$CheckBoxPreference.wrap(this.$value) : _superclass = $Object($value); $CheckBoxPreference.wrap(this.$value) : _superclass = $Object($value);

View file

@ -2,35 +2,40 @@ import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart'; import 'package:dart_eval/stdlib/core.dart';
import 'package:mangayomi/eval/dart/bridge/m_source.dart'; import 'package:mangayomi/eval/dart/bridge/m_source.dart';
import 'package:mangayomi/eval/dart/compiler/compiler.dart'; import 'package:mangayomi/eval/dart/compiler/compiler.dart';
import 'package:mangayomi/eval/dart/model/m_provider.dart';
import 'package:mangayomi/eval/dart/runtime/runtime.dart'; import 'package:mangayomi/eval/dart/runtime/runtime.dart';
import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_provider.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/page.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';
class DartExtensionService { import '../interface.dart';
late Source? source;
class DartExtensionService implements ExtensionService {
@override
late Source source;
DartExtensionService(this.source); DartExtensionService(this.source);
MProvider _executeLib() { MProvider _executeLib() {
final bytecode = compilerEval(source!.sourceCode!); final bytecode = compilerEval(source.sourceCode!);
final runtime = runtimeEval(bytecode); final runtime = runtimeEval(bytecode);
return runtime.executeLib('package:mangayomi/main.dart', 'main', [$MSource.wrap(source!.toMSource())]) as MProvider; return runtime.executeLib('package:mangayomi/main.dart', 'main', [$MSource.wrap(source.toMSource())]) as MProvider;
} }
@override
Map<String, String> getHeaders() { Map<String, String> getHeaders() {
Map<String, String> headers = {}; Map<String, String> headers = {};
try { try {
final bytecode = compilerEval(source!.sourceCode!); final bytecode = compilerEval(source.sourceCode!);
final runtime = runtimeEval(bytecode); final runtime = runtimeEval(bytecode);
runtime.args = [$String(source!.baseUrl!)]; runtime.args = [$String(source.baseUrl!)];
var res = runtime.executeLib( var res = runtime.executeLib(
'package:mangayomi/main.dart', 'package:mangayomi/main.dart',
'getHeader', 'getHeader',
@ -52,16 +57,19 @@ class DartExtensionService {
return headers; return headers;
} }
@override
String get sourceBaseUrl { String get sourceBaseUrl {
String? baseUrl; String? baseUrl;
try { try {
baseUrl = _executeLib().baseUrl; baseUrl = _executeLib().baseUrl;
} catch (e) { } catch (_) {
baseUrl = source!.baseUrl; //
} }
return baseUrl!;
return baseUrl == null || baseUrl.isEmpty ? source.baseUrl! : baseUrl;
} }
@override
bool get supportsLatest { bool get supportsLatest {
bool? supportsLatest; bool? supportsLatest;
try { try {
@ -72,36 +80,44 @@ class DartExtensionService {
return supportsLatest; return supportsLatest;
} }
@override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
return await _executeLib().getPopular(page); return await _executeLib().getPopular(page);
} }
@override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
return await _executeLib().getLatestUpdates(page); return await _executeLib().getLatestUpdates(page);
} }
Future<MPages> search(String query, int page, List<dynamic> filterList) async { @override
return await _executeLib().search(query, page, FilterList(filterList)); Future<MPages> search(String query, int page, List<dynamic> filters) async {
return await _executeLib().search(query, page, FilterList(filters));
} }
@override
Future<MManga> getDetail(String url) async { Future<MManga> getDetail(String url) async {
return await _executeLib().getDetail(url); return await _executeLib().getDetail(url);
} }
@override
Future<List<PageUrl>> getPageList(String url) async { Future<List<PageUrl>> getPageList(String url) async {
return (await _executeLib().getPageList(url)) return (await _executeLib().getPageList(url))
.map((e) => e is String ? PageUrl(e.toString().trim()) : PageUrl.fromJson((e as Map).toMapStringDynamic!)) .map((e) => e is String ? PageUrl(e.toString().trim()) : PageUrl.fromJson((e as Map).toMapStringDynamic!))
.toList(); .toList();
} }
@override
Future<List<Video>> getVideoList(String url) async { Future<List<Video>> getVideoList(String url) async {
return await _executeLib().getVideoList(url); return await _executeLib().getVideoList(url);
} }
List<dynamic> getFilterList() { @override
return _executeLib().getFilterList().map((e) => e is $Value ? e.$reified : e).toList(); FilterList getFilterList() {
return FilterList(_executeLib().getFilterList().map((e) => e is $Value ? e.$reified : e).toList());
} }
@override
List<SourcePreference> getSourcePreferences() { List<SourcePreference> getSourcePreferences() {
try { try {
return _executeLib() return _executeLib()

35
lib/eval/interface.dart Normal file
View file

@ -0,0 +1,35 @@
import 'package:mangayomi/models/page.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/video.dart';
import 'model/filter.dart';
import 'model/m_manga.dart';
import 'model/m_pages.dart';
import 'model/source_preference.dart';
abstract interface class ExtensionService {
late Source source;
ExtensionService(this.source);
String get sourceBaseUrl;
bool get supportsLatest;
Map<String, String> getHeaders();
Future<MPages> getPopular(int page);
Future<MPages> getLatestUpdates(int page);
Future<MPages> search(String query, int page, List<dynamic> filters);
Future<MManga> getDetail(String url);
Future<List<PageUrl>> getPageList(String url);
Future<List<Video>> getVideoList(String url);
FilterList getFilterList();
List<SourcePreference> getSourcePreferences();
}

View file

@ -1,6 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';

View file

@ -1,21 +1,26 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:mangayomi/eval/javascript/dom_selector.dart'; import 'package:mangayomi/eval/javascript/dom_selector.dart';
import 'package:mangayomi/eval/javascript/extractors.dart'; import 'package:mangayomi/eval/javascript/extractors.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/eval/javascript/preferences.dart'; import 'package:mangayomi/eval/javascript/preferences.dart';
import 'package:mangayomi/eval/javascript/utils.dart'; import 'package:mangayomi/eval/javascript/utils.dart';
import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/page.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';
class JsExtensionService { import '../interface.dart';
class JsExtensionService implements ExtensionService {
late JavascriptRuntime runtime; late JavascriptRuntime runtime;
late Source? source; @override
late Source source;
JsExtensionService(this.source); JsExtensionService(this.source);
void _init() { void _init() {
@ -29,7 +34,7 @@ class JsExtensionService {
runtime.evaluate(''' runtime.evaluate('''
class MProvider { class MProvider {
get source() { get source() {
return JSON.parse('${jsonEncode(source!.toMSource().toJson())}'); return JSON.parse('${jsonEncode(source.toMSource().toJson())}');
} }
get supportsLatest() { get supportsLatest() {
throw new Error("supportsLatest not implemented"); throw new Error("supportsLatest not implemented");
@ -66,83 +71,57 @@ async function jsonStringify(fn) {
return JSON.stringify(await fn()); return JSON.stringify(await fn());
} }
'''); ''');
runtime.evaluate('''${source!.sourceCode} runtime.evaluate('''${source.sourceCode}
var extention = new DefaultExtension(); var extention = new DefaultExtension();
'''); ''');
} }
Map<String, String> getHeaders(String url) { @override
_init(); Map<String, String> getHeaders() {
try { return _extensionCall<Map>('getHeaders(`${source.baseUrl ?? ''}`)', {}).toMapStringString!;
final res = runtime.evaluate('JSON.stringify(extention.getHeaders(`$url`))').stringResult;
return (jsonDecode(res) as Map).toMapStringString!;
} catch (_) {
return {};
}
} }
@override
bool get supportsLatest { bool get supportsLatest {
_init(); return _extensionCall<bool>('supportsLatest', true);
try {
return jsonDecode(runtime.evaluate('JSON.stringify(extention.supportsLatest)').stringResult) as bool;
} catch (e) {
return true;
}
} }
@override
String get sourceBaseUrl {
return source.baseUrl!;
}
@override
Future<MPages> getPopular(int page) async { Future<MPages> getPopular(int page) async {
_init(); return MPages.fromJson(await _extensionCallAsync('getPopular($page)', {}));
final res =
(await runtime.handlePromise(await runtime.evaluateAsync('jsonStringify(() => extention.getPopular($page))')))
.stringResult;
return MPages.fromJson(jsonDecode(res));
} }
@override
Future<MPages> getLatestUpdates(int page) async { Future<MPages> getLatestUpdates(int page) async {
_init(); return MPages.fromJson(await _extensionCallAsync('getLatestUpdates($page)', {}));
final res = (await runtime
.handlePromise(await runtime.evaluateAsync('jsonStringify(() => extention.getLatestUpdates($page))')))
.stringResult;
return MPages.fromJson(jsonDecode(res));
} }
Future<MPages> search(String query, int page, String filters) async { @override
_init(); Future<MPages> search(String query, int page, List<dynamic> filters) async {
final res = (await runtime.handlePromise( return MPages.fromJson(
await runtime.evaluateAsync('jsonStringify(() => extention.search("$query",$page,$filters))'))) await _extensionCallAsync('search("$query",$page,${jsonEncode(filterValuesListToJson(filters))})', {}));
.stringResult;
return MPages.fromJson(jsonDecode(res));
} }
@override
Future<MManga> getDetail(String url) async { Future<MManga> getDetail(String url) async {
_init(); return MManga.fromJson(await _extensionCallAsync('getDetail(`$url`)', {}));
final res =
(await runtime.handlePromise(await runtime.evaluateAsync('jsonStringify(() => extention.getDetail(`$url`))')))
.stringResult;
return MManga.fromJson(jsonDecode(res));
} }
@override
Future<List<PageUrl>> getPageList(String url) async { Future<List<PageUrl>> getPageList(String url) async {
_init(); return (await _extensionCallAsync<List>('getPageList(`$url`)', []))
final res = .map((e) => e is String ? PageUrl(e.trim()) : PageUrl.fromJson((e as Map).toMapStringDynamic!))
(await runtime.handlePromise(await runtime.evaluateAsync('jsonStringify(() => extention.getPageList(`$url`))')))
.stringResult;
return (jsonDecode(res) as List)
.map((e) => e is String ? PageUrl(e.toString().trim()) : PageUrl.fromJson((e as Map).toMapStringDynamic!))
.toList(); .toList();
} }
@override
Future<List<Video>> getVideoList(String url) async { Future<List<Video>> getVideoList(String url) async {
_init(); return (await _extensionCallAsync<List>('getVideoList(`$url`)', []))
final res = (await runtime
.handlePromise(await runtime.evaluateAsync('jsonStringify(() => extention.getVideoList(`$url`))')))
.stringResult;
return (jsonDecode(res) as List)
.where((element) => element['url'] != null && element['originalUrl'] != null) .where((element) => element['url'] != null && element['originalUrl'] != null)
.map((e) => Video.fromJson(e)) .map((e) => Video.fromJson(e))
.toList() .toList()
@ -150,23 +129,48 @@ var extention = new DefaultExtension();
.toList(); .toList();
} }
dynamic getFilterList() { @override
FilterList getFilterList() {
return FilterList(fromJsonFilterValuesToList(_extensionCall('getFilterList()', [])));
}
@override
List<SourcePreference> getSourcePreferences() {
return _extensionCall('getSourcePreferences()', [])
.map((e) => SourcePreference.fromJson(e)..sourceId = source.id)
.toList();
}
T _extensionCall<T>(String call, T def) {
_init(); _init();
try { try {
final res = runtime.evaluate('JSON.stringify(extention.getFilterList())').stringResult; final res = runtime.evaluate('JSON.stringify(extention.`$call`)');
return FilterList(fromJsonFilterValuestoList(jsonDecode(res)));
return jsonDecode(res.stringResult) as T;
} catch (_) { } catch (_) {
return []; if (def != null) {
return def;
}
rethrow;
} }
} }
List<SourcePreference> getSourcePreferences() { Future<T> _extensionCallAsync<T>(String call, T def) async {
_init(); _init();
try { try {
final res = runtime.evaluate('JSON.stringify(extention.getSourcePreferences())').stringResult; final promised = await runtime.handlePromise(await runtime.evaluateAsync('jsonStringify(() => extention.$call)'));
return (jsonDecode(res) as List).map((e) => SourcePreference.fromJson(e)..sourceId = source!.id).toList();
return jsonDecode(promised.stringResult) as T;
} catch (_) { } catch (_) {
return []; if (def != null) {
return def;
}
rethrow;
} }
} }
} }

View file

@ -1,6 +1,6 @@
import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:js_packer/js_packer.dart'; import 'package:js_packer/js_packer.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart'; import 'package:mangayomi/utils/cryptoaes/js_unpacker.dart';
import 'package:mangayomi/utils/log/log.dart'; import 'package:mangayomi/utils/log/log.dart';

12
lib/eval/lib.dart Normal file
View file

@ -0,0 +1,12 @@
import 'package:mangayomi/eval/interface.dart';
import 'package:mangayomi/models/source.dart';
import 'dart/service.dart';
import 'javascript/service.dart';
ExtensionService getExtensionService(Source source) {
return switch (source.sourceCodeLanguage) {
SourceCodeLanguage.dart => DartExtensionService(source),
SourceCodeLanguage.javascript => JsExtensionService(source),
};
}

View file

@ -1,5 +1,5 @@
import 'package:html/dom.dart'; import 'package:html/dom.dart';
import 'package:mangayomi/eval/dart/model/element.dart'; import 'package:mangayomi/eval/model/element.dart';
import 'package:mangayomi/utils/extensions/dom_extensions.dart'; import 'package:mangayomi/utils/extensions/dom_extensions.dart';
class MDocument { class MDocument {

View file

@ -4,7 +4,7 @@ class FilterList {
List<dynamic> filters; List<dynamic> filters;
FilterList(this.filters); FilterList(this.filters);
factory FilterList.fromJson(Map<String, dynamic> json) { factory FilterList.fromJson(Map<String, dynamic> json) {
return FilterList(fromJsonFilterValuestoList(json['filters'])); return FilterList(fromJsonFilterValuesToList(json['filters']));
} }
Map<String, dynamic> toJson() => {'filters': filterValuesListToJson(filters)}; Map<String, dynamic> toJson() => {'filters': filterValuesListToJson(filters)};
} }
@ -19,7 +19,7 @@ class SelectFilter {
SelectFilter(this.type, this.name, this.state, this.values, this.typeName); SelectFilter(this.type, this.name, this.state, this.values, this.typeName);
factory SelectFilter.fromJson(Map<String, dynamic> json) { factory SelectFilter.fromJson(Map<String, dynamic> json) {
return SelectFilter( return SelectFilter(
json['type'], json['name'], json['state'] ?? 0, fromJsonFilterValuestoList(json['values']), json['type_name']); json['type'], json['name'], json['state'] ?? 0, fromJsonFilterValuesToList(json['values']), json['type_name']);
} }
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
'type': type, 'type': type,
@ -89,7 +89,7 @@ class SortFilter {
json['type'], json['type'],
json['name'], json['name'],
json['state'] == null ? SortState(0, false, "") : SortState.fromJson(json['state']), json['state'] == null ? SortState(0, false, "") : SortState.fromJson(json['state']),
fromJsonFilterValuestoList(json['values']), fromJsonFilterValuesToList(json['values']),
json['type_name']); json['type_name']);
} }
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
@ -136,7 +136,7 @@ class GroupFilter {
GroupFilter(this.type, this.name, this.state, this.typeName); GroupFilter(this.type, this.name, this.state, this.typeName);
factory GroupFilter.fromJson(Map<String, dynamic> json) { factory GroupFilter.fromJson(Map<String, dynamic> json) {
return GroupFilter(json['type'], json['name'], fromJsonFilterValuestoList(json['state']), json['type_name']); return GroupFilter(json['type'], json['name'], fromJsonFilterValuesToList(json['state']), json['type_name']);
} }
Map<String, dynamic> toJson() => Map<String, dynamic> toJson() =>
{'type': type, 'name': name, 'state': filterValuesListToJson(state), 'type_name': "GroupFilter"}; {'type': type, 'name': name, 'state': filterValuesListToJson(state), 'type_name': "GroupFilter"};
@ -157,31 +157,27 @@ class CheckBoxFilter {
{'type': type, 'name': name, 'value': value, 'state': state, 'type_name': "CheckBox"}; {'type': type, 'name': name, 'value': value, 'state': state, 'type_name': "CheckBox"};
} }
List<dynamic> fromJsonFilterValuestoList(List list) { List<dynamic> fromJsonFilterValuesToList(List list) {
return list.map((e) { return list
final map = (e as Map).toMapStringDynamic!; .map((e) {
if (map['type_name'] == 'TriState') { final map = (e as Map).toMapStringDynamic!;
return TriStateFilter.fromJson(map.toMapStringDynamic!);
} else if (map['type_name'] == 'CheckBox') { return switch (map['type_name']) {
return CheckBoxFilter.fromJson(map.toMapStringDynamic!); 'TriState' => TriStateFilter.fromJson(map.toMapStringDynamic!),
} else if (map['type_name'] == 'SelectOption') { 'CheckBox' => CheckBoxFilter.fromJson(map.toMapStringDynamic!),
return SelectFilterOption.fromJson(map.toMapStringDynamic!); 'SelectOption' => SelectFilterOption.fromJson(map.toMapStringDynamic!),
} else if (map['type_name'] == 'SelectFilter') { 'SelectFilter' => SelectFilter.fromJson(map.toMapStringDynamic!),
return SelectFilter.fromJson(map.toMapStringDynamic!); 'SeparatorFilter' => SeparatorFilter.fromJson(map.toMapStringDynamic!),
} else if (map['type_name'] == 'SeparatorFilter') { 'HeaderFilter' => HeaderFilter.fromJson(map.toMapStringDynamic!),
return SeparatorFilter.fromJson(map.toMapStringDynamic!); 'TextFilter' => TextFilter.fromJson(map.toMapStringDynamic!),
} else if (map['type_name'] == 'HeaderFilter') { 'SortFilter' => SortFilter.fromJson(map.toMapStringDynamic!),
return HeaderFilter.fromJson(map.toMapStringDynamic!); 'SortState' => SortState.fromJson(map.toMapStringDynamic!),
} else if (map['type_name'] == 'TextFilter') { 'GroupFilter' => GroupFilter.fromJson(map.toMapStringDynamic!),
return TextFilter.fromJson(map.toMapStringDynamic!); _ => null,
} else if (map['type_name'] == 'SortFilter') { };
return SortFilter.fromJson(map.toMapStringDynamic!); })
} else if (map['type_name'] == 'SortState') { .where((filter) => filter != null)
return SortState.fromJson(map.toMapStringDynamic!); .toList();
} else if (map['type_name'] == 'GroupFilter') {
return GroupFilter.fromJson(map.toMapStringDynamic!);
}
}).toList();
} }
List<Map<String, dynamic>?> filterValuesListToJson(List<dynamic> values) { List<Map<String, dynamic>?> filterValuesListToJson(List<dynamic> values) {

View file

@ -9,7 +9,7 @@ import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:js_packer/js_packer.dart'; import 'package:js_packer/js_packer.dart';
import 'package:json_path/json_path.dart'; import 'package:json_path/json_path.dart';
import 'package:mangayomi/eval/dart/model/document.dart'; import 'package:mangayomi/eval/model/document.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/router/router.dart'; import 'package:mangayomi/router/router.dart';

View file

@ -1,4 +1,4 @@
import 'package:mangayomi/eval/dart/model/m_chapter.dart'; import 'package:mangayomi/eval/model/m_chapter.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/utils/extensions/string_extensions.dart';

View file

@ -1,4 +1,4 @@
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
class MPages { class MPages {
List<MManga> list; List<MManga> list;

View file

@ -1,6 +1,6 @@
import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';
abstract class MProvider { abstract class MProvider {

View file

@ -1,5 +1,5 @@
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_source.dart'; import 'package:mangayomi/eval/model/m_source.dart';
part 'source.g.dart'; part 'source.g.dart';
@collection @collection

View file

@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_code_editor/flutter_code_editor.dart'; import 'package:flutter_code_editor/flutter_code_editor.dart';
import 'package:flutter_highlight/themes/atom-one-dark.dart'; import 'package:flutter_highlight/themes/atom-one-dark.dart';
import 'package:highlight/highlight.dart';
import 'package:json_view/json_view.dart'; import 'package:json_view/json_view.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:highlight/languages/dart.dart'; import 'package:highlight/languages/dart.dart';
import 'package:highlight/languages/javascript.dart'; import 'package:highlight/languages/javascript.dart';
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/manga/home/widget/filter_widget.dart'; import 'package:mangayomi/modules/manga/home/widget/filter_widget.dart';
@ -27,16 +27,20 @@ class CodeEditor extends ConsumerStatefulWidget {
ConsumerState<CodeEditor> createState() => _CodeEditorState(); ConsumerState<CodeEditor> createState() => _CodeEditorState();
} }
Mode getSourceMode(Source? source) {
return switch (source?.sourceCodeLanguage) {
SourceCodeLanguage.dart => dart,
SourceCodeLanguage.javascript => javascript,
_ => dart,
};
}
class _CodeEditorState extends ConsumerState<CodeEditor> { class _CodeEditorState extends ConsumerState<CodeEditor> {
dynamic result; dynamic result;
late final source = widget.sourceId == null ? null : isar.sources.getSync(widget.sourceId!); late final source = widget.sourceId == null ? null : isar.sources.getSync(widget.sourceId!);
late final controller = CodeController( late final controller = CodeController(
text: source?.sourceCode ?? "", text: source?.sourceCode ?? "",
language: source == null language: getSourceMode(source),
? dart
: source!.sourceCodeLanguage == SourceCodeLanguage.dart
? dart
: javascript,
namedSectionParser: const BracketsStartEndNamedSectionParser()); namedSectionParser: const BracketsStartEndNamedSectionParser());
List<(String, int)> _getServices(BuildContext context) => [ List<(String, int)> _getServices(BuildContext context) => [
@ -224,6 +228,8 @@ class _CodeEditorState extends ConsumerState<CodeEditor> {
_errorText = ""; _errorText = "";
}); });
if (source != null) { if (source != null) {
final service = getExtensionService(source!);
try { try {
if (_serviceIndex == 0) { if (_serviceIndex == 0) {
final getManga = final getManga =
@ -243,26 +249,15 @@ class _CodeEditorState extends ConsumerState<CodeEditor> {
await ref.watch(getDetailProvider(source: source!, url: _url).future); await ref.watch(getDetailProvider(source: source!, url: _url).future);
result = getManga.toJson(); result = getManga.toJson();
} else if (_serviceIndex == 4) { } else if (_serviceIndex == 4) {
if (source!.sourceCodeLanguage == SourceCodeLanguage.dart) { result = {
result = (await DartExtensionService(source).getPageList(_url)) "pages": (await service.getPageList(_url))
.map((e) => e.toJson()) .map((e) => e.toJson())
.toList(); .toList(),
} else { };
result = (await JsExtensionService(source).getPageList(_url))
.map((e) => e.toJson())
.toList();
}
result = {"pages": result};
} else { } else {
if (source!.sourceCodeLanguage == SourceCodeLanguage.dart) { result = (await service.getVideoList(_url))
result = (await DartExtensionService(source).getVideoList(_url)) .map((e) => e.toJson())
.map((e) => e.toJson()) .toList();
.toList();
} else {
result = (await JsExtensionService(source).getVideoList(_url))
.map((e) => e.toJson())
.toList();
}
} }
if (mounted) { if (mounted) {
setState(() { setState(() {

View file

@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart'; import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';

View file

@ -1,5 +1,5 @@
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/services/get_source_preference.dart'; import 'package:mangayomi/services/get_source_preference.dart';

View file

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart';

View file

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart'; import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart';

View file

@ -2,8 +2,8 @@ import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/modules/manga/home/manga_home_screen.dart'; import 'package:mangayomi/modules/manga/home/manga_home_screen.dart';

View file

@ -8,7 +8,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';

View file

@ -7,7 +7,7 @@ import 'package:flutter/rendering.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/download.dart';

View file

@ -1,5 +1,5 @@
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/update.dart';

View file

@ -2,8 +2,8 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart';

View file

@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mangayomi/eval/dart/model/filter.dart'; import 'package:mangayomi/eval/model/filter.dart';
import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
class FilterWidget extends StatelessWidget { class FilterWidget extends StatelessWidget {

View file

@ -8,7 +8,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';

View file

@ -2,7 +2,7 @@ import 'dart:io';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart';
import 'package:mangayomi/modules/more/backup_and_restore/providers/auto_backup.dart'; import 'package:mangayomi/modules/more/backup_and_restore/providers/auto_backup.dart';
import 'package:mangayomi/modules/more/backup_and_restore/providers/backup.dart'; import 'package:mangayomi/modules/more/backup_and_restore/providers/backup.dart';

View file

@ -4,7 +4,7 @@ import 'package:archive/archive_io.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';

View file

@ -3,8 +3,8 @@ import 'package:archive/archive_io.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';

View file

@ -4,7 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:grouped_list/sliver_grouped_list.dart'; import 'package:grouped_list/sliver_grouped_list.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/update.dart';

View file

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/manga.dart';
import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/settings.dart';

View file

@ -1,7 +1,7 @@
// ignore_for_file: depend_on_referenced_packages // ignore_for_file: depend_on_referenced_packages
import 'dart:io'; import 'dart:io';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/category.dart'; import 'package:mangayomi/models/category.dart';
import 'package:mangayomi/models/changed_items.dart'; import 'package:mangayomi/models/changed_items.dart';

View file

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:html/dom.dart'; import 'package:html/dom.dart';
import 'package:http_interceptor/http_interceptor.dart'; import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';
import 'package:html/parser.dart' as parser; import 'package:html/parser.dart' as parser;
import 'package:mangayomi/services/http/m_client.dart'; import 'package:mangayomi/services/http/m_client.dart';

View file

@ -1,8 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
@ -26,7 +25,7 @@ Future<void> fetchSourcesList(
if (id == source.id) { if (id == source.id) {
final sourc = isar.sources.getSync(id)!; final sourc = isar.sources.getSync(id)!;
final req = await http.get(Uri.parse(source.sourceCodeUrl!)); final req = await http.get(Uri.parse(source.sourceCodeUrl!));
final headers = getSourceHeaders(source..sourceCode = req.body); final headers = getExtensionService(source..sourceCode = req.body).getHeaders();
isar.writeTxnSync(() { isar.writeTxnSync(() {
isar.sources.putSync(sourc isar.sources.putSync(sourc
..headers = jsonEncode(headers) ..headers = jsonEncode(headers)
@ -60,10 +59,10 @@ Future<void> fetchSourcesList(
final sourc = isar.sources.getSync(source.id!)!; final sourc = isar.sources.getSync(source.id!)!;
if (sourc.isAdded!) { if (sourc.isAdded!) {
if (compareVersions(sourc.version!, source.version!) < 0) { if (compareVersions(sourc.version!, source.version!) < 0) {
// log("update aivalable auto update"); // log("update available auto update");
if (ref.watch(autoUpdateExtensionsStateProvider)) { if (ref.watch(autoUpdateExtensionsStateProvider)) {
final req = await http.get(Uri.parse(source.sourceCodeUrl!)); final req = await http.get(Uri.parse(source.sourceCodeUrl!));
final headers = getSourceHeaders(source..sourceCode = req.body); final headers = getExtensionService(source..sourceCode = req.body).getHeaders();
isar.writeTxnSync(() { isar.writeTxnSync(() {
isar.sources.putSync(sourc isar.sources.putSync(sourc
..headers = jsonEncode(headers) ..headers = jsonEncode(headers)
@ -179,13 +178,3 @@ int compareVersions(String version1, String version2) {
return 0; return 0;
} }
Map<String, String> getSourceHeaders(Source source) {
Map<String, String> headers = {};
if (source.sourceCodeLanguage == SourceCodeLanguage.javascript) {
headers = JsExtensionService(source).getHeaders(source.baseUrl ?? "");
} else {
headers = DartExtensionService(source).getHeaders();
}
return headers;
}

View file

@ -1,14 +1,12 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/models/page.dart';
import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart'; import 'package:mangayomi/modules/manga/archive_reader/providers/archive_reader_providers.dart';
import 'package:mangayomi/modules/manga/reader/reader_view.dart'; import 'package:mangayomi/modules/manga/reader/reader_view.dart';
import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart';
@ -63,11 +61,7 @@ Future<GetChapterPagesModel> getChapterPages(
pageUrls.add(PageUrl(isarPageUrls.first.urls![i], headers: headers)); pageUrls.add(PageUrl(isarPageUrls.first.urls![i], headers: headers));
} }
} else { } else {
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { pageUrls = await getExtensionService(source).getPageList(chapter.url!);
pageUrls = await DartExtensionService(source).getPageList(chapter.url!);
} else {
pageUrls = await JsExtensionService(source).getPageList(chapter.url!);
}
} }
} }

View file

@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getChapterPagesHash() => r'c806798536b6d4ca5b2a51417f12c648100cfc44'; String _$getChapterPagesHash() => r'8a2606a6640046cb006b24516bf88512f3204aca';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,6 +1,5 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart'; import 'package:mangayomi/eval/model/m_manga.dart';
import 'package:mangayomi/eval/dart/model/m_manga.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -12,11 +11,5 @@ Future<MManga> getDetail(
required String url, required String url,
required Source source, required Source source,
}) async { }) async {
MManga? mangadetail; return getExtensionService(source).getDetail(url);
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) {
mangadetail = await DartExtensionService(source).getDetail(url);
} else {
mangadetail = await JsExtensionService(source).getDetail(url);
}
return mangadetail;
} }

View file

@ -6,7 +6,7 @@ part of 'get_detail.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getDetailHash() => r'c9e268bb19e786b3bb160023f74336b80da65b6c'; String _$getDetailHash() => r'84cc79aa0fd35a2d8efa95f75b85978f521c5daa';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,19 +1,10 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
List<dynamic> getFilterList({required Source source}) { List<dynamic> getFilterList({required Source source}) {
List<dynamic> filterList = [];
try { try {
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { return getExtensionService(source).getFilterList().filters;
filterList = DartExtensionService(source).getFilterList();
} else {
filterList = (JsExtensionService(source).getFilterList()).filters;
}
} catch (_) { } catch (_) {
return []; return [];
} }
return filterList;
} }

View file

@ -1,6 +1,5 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -12,11 +11,5 @@ Future<MPages?> getLatestUpdates(
required Source source, required Source source,
required int page, required int page,
}) async { }) async {
MPages? latestUpdatesManga; return getExtensionService(source).getLatestUpdates(page);
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) {
latestUpdatesManga = await DartExtensionService(source).getLatestUpdates(page);
} else {
latestUpdatesManga = await JsExtensionService(source).getLatestUpdates(page);
}
return latestUpdatesManga;
} }

View file

@ -6,7 +6,7 @@ part of 'get_latest_updates.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getLatestUpdatesHash() => r'ed983c23ad7d8a1af4332230537daede29b9275e'; String _$getLatestUpdatesHash() => r'93e1ba376d14006110e9a6c06d191ffd12b1fdfb';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,6 +1,5 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -12,12 +11,5 @@ Future<MPages?> getPopular(
required Source source, required Source source,
required int page, required int page,
}) async { }) async {
MPages? popularManga; return getExtensionService(source).getPopular(page);
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) {
popularManga = await DartExtensionService(source).getPopular(page);
} else {
popularManga = await JsExtensionService(source).getPopular(page);
}
return popularManga;
} }

View file

@ -6,7 +6,7 @@ part of 'get_popular.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getPopularHash() => r'2db0191dd013043970cfac2153e22054b0927ad1'; String _$getPopularHash() => r'02291ff9c3eba594b2344b853c34b2cea7be491b';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,18 +1,11 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'get_source_baseurl.g.dart'; part 'get_source_baseurl.g.dart';
@riverpod @riverpod
String sourceBaseUrl(Ref ref, {required Source source}) { String sourceBaseUrl(Ref ref, {required Source source}) {
String? baseUrl; return getExtensionService(source).sourceBaseUrl;
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) {
baseUrl = DartExtensionService(source).sourceBaseUrl;
} else {}
if (baseUrl == null || baseUrl.isEmpty) {
baseUrl = source.baseUrl;
}
return baseUrl!;
} }

View file

@ -6,7 +6,7 @@ part of 'get_source_baseurl.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$sourceBaseUrlHash() => r'853fdcc3b12f567c7570a8569c7832234d2bf7bf'; String _$sourceBaseUrlHash() => r'2eaf2f441085cec9e2f035763ef2ec64aa00f838';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,16 +1,7 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
List<SourcePreference> getSourcePreference({required Source source}) { List<SourcePreference> getSourcePreference({required Source source}) {
List<SourcePreference> sourcePreference = []; return getExtensionService(source).getSourcePreferences();
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) {
sourcePreference = DartExtensionService(source).getSourcePreferences();
} else {
sourcePreference = JsExtensionService(source).getSourcePreferences();
}
return sourcePreference;
} }

View file

@ -1,9 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/chapter.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/models/video.dart'; import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/services/torrent_server.dart'; import 'package:mangayomi/services/torrent_server.dart';
@ -34,11 +32,9 @@ Future<(List<Video>, bool, List<String>)> getVideoList(Ref ref, {required Chapte
final (videos, infohash) = await MTorrentServer().getTorrentPlaylist(episode.url, episode.archivePath); final (videos, infohash) = await MTorrentServer().getTorrentPlaylist(episode.url, episode.archivePath);
return (videos, false, [infohash ?? ""]); return (videos, false, [infohash ?? ""]);
} }
if (source?.sourceCodeLanguage == SourceCodeLanguage.dart) {
list = await DartExtensionService(source).getVideoList(episode.url!); list = await getExtensionService(source!).getVideoList(episode.url!);
} else {
list = await JsExtensionService(source).getVideoList(episode.url!);
}
for (var v in list) { for (var v in list) {
final (videos, infohash) = await MTorrentServer().getTorrentPlaylist(v.url, episode.archivePath); final (videos, infohash) = await MTorrentServer().getTorrentPlaylist(v.url, episode.archivePath);
for (var video in videos) { for (var video in videos) {
@ -51,17 +47,14 @@ Future<(List<Video>, bool, List<String>)> getVideoList(Ref ref, {required Chapte
return (torrentList, false, infoHashes); return (torrentList, false, infoHashes);
} }
List<Video> list = []; List<Video> list = await getExtensionService(source!).getVideoList(episode.url!);
if (source?.sourceCodeLanguage == SourceCodeLanguage.dart) {
list = await DartExtensionService(source).getVideoList(episode.url!);
} else {
list = await JsExtensionService(source).getVideoList(episode.url!);
}
List<Video> videos = []; List<Video> videos = [];
for (var video in list) { for (var video in list) {
if (!videos.any((element) => element.quality == video.quality)) { if (!videos.any((element) => element.quality == video.quality)) {
videos.add(video); videos.add(video);
} }
} }
return (videos, false, infoHashes); return (videos, false, infoHashes);
} }

View file

@ -6,7 +6,7 @@ part of 'get_video_list.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$getVideoListHash() => r'4cea633e8a21ede6dce9903baef0c978f4826def'; String _$getVideoListHash() => r'bae6a3cbc064163148577d0646b87a3f16d44da7';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,8 +1,8 @@
import 'package:http_interceptor/http_interceptor.dart'; import 'package:http_interceptor/http_interceptor.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:mangayomi/eval/dart/model/m_source.dart'; import 'package:mangayomi/eval/model/m_source.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as flutter_inappwebview; import 'package:flutter_inappwebview/flutter_inappwebview.dart' as flutter_inappwebview;
import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/settings.dart';

View file

@ -1,21 +1,17 @@
import 'dart:convert'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/eval/dart/model/filter.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'search.g.dart'; part 'search.g.dart';
@riverpod @riverpod
Future<MPages?> search(Ref ref, Future<MPages?> search(
{required Source source, required String query, required int page, required List<dynamic> filterList}) async { Ref ref, {
MPages? manga; required Source source,
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { required String query,
manga = await DartExtensionService(source).search(query, page, filterList); required int page,
} else { required List<dynamic> filterList,
manga = await JsExtensionService(source).search(query, page, jsonEncode(filterValuesListToJson(filterList))); }) async {
} return getExtensionService(source).search(query, page, filterList);
return manga;
} }

View file

@ -6,7 +6,7 @@ part of 'search.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$searchHash() => r'c0e7eb3604d2a065762e444cff1dfc5b44ae7da4'; String _$searchHash() => r'8ef361b28d7a569b9f5babd69eb83efd9d9814d7';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,17 +1,12 @@
import 'dart:convert'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/model/m_pages.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/eval/dart/model/filter.dart';
import 'package:mangayomi/eval/dart/model/m_pages.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
Future<MPages?> search( Future<MPages?> search({
{required Source source, required String query, required int page, required List<dynamic> filterList}) async { required Source source,
MPages? manga; required String query,
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { required int page,
manga = await DartExtensionService(source).search(query, page, filterList); required List<dynamic> filterList,
} else { }) async {
manga = await JsExtensionService(source).search(query, page, jsonEncode(filterValuesListToJson(filterList))); return getExtensionService(source).search(query, page, filterList);
}
return manga;
} }

View file

@ -1,5 +1,4 @@
import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/source.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
@ -7,11 +6,5 @@ part 'supports_latest.g.dart';
@riverpod @riverpod
bool supportsLatest(Ref ref, {required Source source}) { bool supportsLatest(Ref ref, {required Source source}) {
bool? supportsLatest; return getExtensionService(source).supportsLatest;
if (source.sourceCodeLanguage == SourceCodeLanguage.dart) {
supportsLatest = DartExtensionService(source).supportsLatest;
} else {
supportsLatest = JsExtensionService(source).supportsLatest;
}
return supportsLatest;
} }

View file

@ -6,7 +6,7 @@ part of 'supports_latest.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$supportsLatestHash() => r'7c4e12c2d8ff213789b50a7aceddd4694badc2e1'; String _$supportsLatestHash() => r'71f77f99b86f2f597ec728add2483a5623f4984a';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {

View file

@ -1,7 +1,7 @@
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/eval/dart/model/source_preference.dart'; import 'package:mangayomi/eval/model/source_preference.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/changed_items.dart'; import 'package:mangayomi/models/changed_items.dart';
import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/update.dart';

View file

@ -1,6 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/main.dart'; import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track.dart';
import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/models/track_preference.dart';

View file

@ -1,7 +1,7 @@
import 'dart:developer'; import 'dart:developer';
import 'package:http_interceptor/http_interceptor.dart'; import 'package:http_interceptor/http_interceptor.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/eval/model/m_bridge.dart';
import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track.dart';
import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/models/track_preference.dart';
import 'dart:convert'; import 'dart:convert';

View file

@ -1,23 +1,30 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:mangayomi/eval/javascript/http.dart'; import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:mangayomi/eval/lib.dart';
import 'package:mangayomi/services/http/m_client.dart'; import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/utils/utils.dart'; import 'package:mangayomi/utils/utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
part 'headers.g.dart'; part 'headers.g.dart';
@riverpod @riverpod
Map<String, String> headers(Ref ref, {required String source, required String lang}) { Map<String, String> headers(Ref ref, {required String source, required String lang}) {
final mSource = getSource(lang, source); final mSource = getSource(lang, source);
if (mSource == null) return {};
Map<String, String> headers = {}; Map<String, String> headers = {};
if (mSource.headers?.isNotEmpty ?? false) {
headers = (jsonDecode(mSource.headers!) as Map).toMapStringString!; if (mSource != null) {
final fromSource = mSource.headers;
if (fromSource != null && fromSource.isNotEmpty) {
headers.addAll((jsonDecode(fromSource) as Map).toMapStringString!);
}
headers.addAll(getExtensionService(mSource).getHeaders());
headers.addAll(MClient.getCookiesPref(mSource.baseUrl!));
} }
headers.addAll(getSourceHeaders(mSource));
final cookies = MClient.getCookiesPref(mSource.baseUrl!);
headers.addAll(cookies);
return headers; return headers;
} }

View file

@ -6,7 +6,7 @@ part of 'headers.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$headersHash() => r'05b066bcfad24a9238d4f7cefdabc7aec01d2e26'; String _$headersHash() => r'47499544c2d972da6a0c20f41fe3fc46d1d7c1a0';
/// Copied from Dart SDK /// Copied from Dart SDK
class _SystemHash { class _SystemHash {