Fix extension getHeaders method

This commit is contained in:
kodjomoustapha 2024-04-15 12:13:31 +01:00
parent 5932181138
commit d0ee7d3260
7 changed files with 94 additions and 17 deletions

View file

@ -14,6 +14,7 @@ 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/eval/javascript/http.dart';
import 'package:mangayomi/models/video.dart';
import 'package:mangayomi/modules/browse/extension/providers/extension_preferences_providers.dart';
import 'package:mangayomi/utils/log/log.dart';
@ -90,6 +91,15 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getHeaders': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.map, [
BridgeTypeRef(CoreTypes.string),
BridgeTypeRef(CoreTypes.string)
])),
params: [
BridgeParameter('url',
BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false),
])),
'getFilterList': BridgeMethodDef(BridgeFunctionDef(
returns: BridgeTypeAnnotation(BridgeTypeRef(
CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])),
@ -1034,6 +1044,16 @@ class $MProvider extends MProvider with $Bridge<MProvider> {
return list.map((e) => (e is $Value ? e.$reified : e) as Video).toList();
}
@override
Map<String, String> getHeaders(String url) {
final res = $_invoke('getHeaders', [$String(url)]);
Map<String, String> headers = {};
if (res is $Map) {
headers = res.$reified.toMapStringString!;
}
return headers;
}
$MVideo _toMVideo(Video e) =>
$MVideo.wrap(Video(e.url, e.quality, e.originalUrl)
..headers = e.headers

View file

@ -10,6 +10,8 @@ abstract class MProvider {
String? get baseUrl;
Map<String, String> getHeaders(String url);
Future<MPages> getLatestUpdates(int page);
Future<MPages> getPopular(int page);

View file

@ -30,6 +30,9 @@ class MProvider {
get source() {
return JSON.parse('${jsonEncode(source!.toMSource().toJson())}');
}
getHeaders(url) {
throw new Error("getHeaders not implemented");
}
async getPopular(page) {
throw new Error("getPopular not implemented");
}
@ -64,6 +67,19 @@ var extention = new DefaultExtension();
''');
}
Map<String, String> getHeaders(String url) {
_init();
try {
final res = runtime
.evaluate('JSON.stringify(extention.getHeaders(`$url`))')
.stringResult;
return (jsonDecode(res) as Map).toMapStringString!;
} catch (_) {
return {};
}
}
Future<MPages> getPopular(int page) async {
_init();
final res = (await runtime.handlePromise(await runtime

View file

@ -236,6 +236,11 @@ class TestSource extends MProvider {
@override
bool get supportsLatest => true;
@override
Map<String, String> getHeaders(String url) {
// TODO: implement
}
@override
Future<MPages> getPopular(int page) async {
@ -295,13 +300,15 @@ const mangayomiSources = [{
"isManga": ${source.isManga},
"isNsfw": ${source.isNsfw},
"version": "${source.version}",
"apiUrl": "",
"dateFormat": "",
"dateFormatLocale": "",
"pkgName": ""
"pkgPath": ""
}];
class DefaultExtension extends MProvider {
getHeaders(url) {
throw new Error("getHeaders not implemented");
}
async getPopular(page) {
throw new Error("getPopular not implemented");
}

View file

@ -2,8 +2,12 @@ import 'dart:convert';
import 'package:dart_eval/stdlib/core.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:mangayomi/eval/dart/bridge/m_source.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/javascript/http.dart';
import 'package:mangayomi/eval/javascript/service.dart';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/source.dart';
import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart';
@ -48,10 +52,10 @@ Future<void> fetchSourcesList(
if (id == source.id) {
final sourc = isar.sources.getSync(id)!;
final req = await http.get(Uri.parse(source.sourceCodeUrl!));
final headers = await getHeaders(req.body, source.baseUrl!);
final headers = getSourceHeaders(source..sourceCode = req.body);
isar.writeTxnSync(() {
isar.sources.putSync(sourc
..headers = headers ?? ""
..headers = jsonEncode(headers)
..isAdded = true
..sourceCode = req.body
..sourceCodeUrl = source.sourceCodeUrl
@ -85,10 +89,11 @@ Future<void> fetchSourcesList(
if (ref.watch(autoUpdateExtensionsStateProvider)) {
final req =
await http.get(Uri.parse(source.sourceCodeUrl!));
final headers = await getHeaders(req.body, source.baseUrl!);
final headers =
getSourceHeaders(source..sourceCode = req.body);
isar.writeTxnSync(() {
isar.sources.putSync(sourc
..headers = headers ?? ""
..headers = jsonEncode(headers)
..isAdded = true
..sourceCode = req.body
..sourceCodeUrl = source.sourceCodeUrl
@ -197,22 +202,41 @@ int compareVersions(String version1, String version2) {
return 0;
}
Future<String?> getHeaders(String codeSource, String baseUrl) async {
Map<String, String> getHeaders(Source source) {
Map<String, String> headers = {};
try {
final bytecode = compilerEval(codeSource);
final bytecode = compilerEval(source.sourceCode!);
final runtime = runtimeEval(bytecode);
runtime.args = [$String(baseUrl)];
var res = await runtime.executeLib(
runtime.args = [$String(source.baseUrl!)];
var res = runtime.executeLib(
'package:mangayomi/main.dart',
'getHeader',
);
Map<String, String> headers = {};
if (res is $Map) {
headers = res.$reified
.map((key, value) => MapEntry(key.toString(), value.toString()));
headers = (res.$reified).toMapStringString!;
}
return jsonEncode(headers);
return headers;
} catch (_) {
return null;
try {
final bytecode = compilerEval(source.sourceCode!);
final runtime = runtimeEval(bytecode);
var res = runtime.executeLib('package:mangayomi/main.dart', 'main',
[$MSource.wrap(source.toMSource())]);
headers = (res as MProvider).getHeaders(source.baseUrl!);
} catch (_) {
return {};
}
}
return {};
}
Map<String, String> getSourceHeaders(Source source) {
Map<String, String> headers = {};
if (source.sourceCodeLanguage == SourceCodeLanguage.javascript) {
headers = JsExtensionService(source).getHeaders(source.baseUrl ?? "");
} else {
headers = getHeaders(source);
}
return headers;
}

View file

@ -29,6 +29,11 @@ class TestSource extends MProvider {
@override
bool get supportsLatest => true;
@override
Map<String, String> getHeaders(String url) {
// TODO: implement
}
@override
Future<MPages> getPopular(int page) async {

View file

@ -1,4 +1,6 @@
import 'dart:convert';
import 'package:mangayomi/eval/javascript/http.dart';
import 'package:mangayomi/services/fetch_manga_sources.dart';
import 'package:mangayomi/services/http/m_client.dart';
import 'package:mangayomi/sources/utils/utils.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@ -11,8 +13,9 @@ Map<String, String> headers(HeadersRef ref,
if (mSource == null) return {};
Map<String, String> headers = {};
if (mSource.headers?.isNotEmpty ?? false) {
headers = (jsonDecode(mSource.headers!) as Map)
.map((key, value) => MapEntry(key.toString(), value.toString()));
headers = (jsonDecode(mSource.headers!) as Map).toMapStringString!;
} else {
headers = getSourceHeaders(mSource);
}
final cookies = MClient.getCookiesPref(mSource.baseUrl!);