Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New extension api #255

Open
wants to merge 12 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12,527 changes: 12,527 additions & 0 deletions assets/js/worker.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions lib/controllers/detail_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ class DetailPageController extends GetxController {

getRemoteDeatil() async {
try {
detail = await runtime.value!.detail(url);
detail = await runtime.value!.detail(url, currentContext);
await DatabaseService.putMiruDetail(
package,
url,
Expand Down Expand Up @@ -367,8 +367,8 @@ class DetailPageController extends GetxController {
);
late ExtensionBangumiWatch watchData;
try {
watchData = await runtime.value!.watch(urls[index].url)
as ExtensionBangumiWatch;
watchData = await runtime.value!
.watch(urls[index].url, currentContext) as ExtensionBangumiWatch;
} catch (e) {
showPlatformSnackbar(
context: currentContext,
Expand Down
5 changes: 3 additions & 2 deletions lib/controllers/search_controller.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:get/get.dart';
import 'package:miru_app/models/extension.dart';
import 'package:miru_app/router/router.dart';
import 'package:miru_app/utils/extension.dart';
import 'package:miru_app/data/services/extension_service.dart';
import 'package:miru_app/utils/miru_storage.dart';
Expand Down Expand Up @@ -54,9 +55,9 @@ class SearchPageController extends GetxController {
Future<List<ExtensionListItem>> resultFuture;

if (search.value.isEmpty) {
resultFuture = element.runitme.latest(1);
resultFuture = element.runitme.latest(1, currentContext);
} else {
resultFuture = element.runitme.search(search.value, 1);
resultFuture = element.runitme.search(search.value, 1, currentContext);
}

futures.add(
Expand Down
3 changes: 3 additions & 0 deletions lib/controllers/watch/comic_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:miru_app/data/providers/anilist_provider.dart';
import 'package:miru_app/models/index.dart';
import 'package:miru_app/controllers/watch/reader_controller.dart';
import 'package:miru_app/data/services/database_service.dart';
import 'package:miru_app/views/widgets/cache_network_image.dart';
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
import 'package:extended_image/extended_image.dart';
import 'package:miru_app/utils/miru_storage.dart';
Expand Down Expand Up @@ -197,5 +198,7 @@ class ComicController extends ReaderController<ExtensionMangaWatch> {
);
}
super.onClose();
//remove the cache that saved
CacheNetWorkImagePic.clearCache();
}
}
4 changes: 3 additions & 1 deletion lib/controllers/watch/reader_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:miru_app/models/history.dart';
import 'package:miru_app/controllers/home_controller.dart';
import 'package:miru_app/data/services/database_service.dart';
import 'package:miru_app/data/services/extension_service.dart';
import 'package:miru_app/router/router.dart';

class ReaderController<T> extends GetxController {
final String title;
Expand Down Expand Up @@ -46,7 +47,8 @@ class ReaderController<T> extends GetxController {
try {
error.value = '';
watchData.value = null;
watchData.value = await runtime.watch(cuurentPlayUrl) as T;
watchData.value =
await runtime.watch(cuurentPlayUrl, currentContext) as T;
} catch (e) {
error.value = e.toString();
}
Expand Down
3 changes: 2 additions & 1 deletion lib/controllers/watch/video_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,8 @@ class VideoPlayerController extends GetxController {
watchData = null;
subtitles.clear();
final playUrl = playList[index.value].url;
watchData = await runtime.watch(playUrl) as ExtensionBangumiWatch;
watchData =
await runtime.watch(playUrl, currentContext) as ExtensionBangumiWatch;
}

// 获取 torrent 媒体文件
Expand Down
63 changes: 36 additions & 27 deletions lib/data/services/extension_service.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart' as material;
import 'package:flutter/services.dart';
import 'package:flutter_js/extensions/fetch.dart';
import 'package:get/get.dart';
Expand Down Expand Up @@ -28,16 +29,9 @@ class ExtensionService {
late JsBridge jsBridge;
static Map<dynamic, dynamic> evalMap = {};
String className = '';
bool isinit = false;
initRuntime(Extension ext) async {
extension = ext;
className = extension.package.replaceAll('.', '');
// example: if the package name is com.example.extension the class name will be comexampleextension
// but if the package name is 9anime.to the class name will be animetoRenamed

if (!className.isAlphabetOnly) {
className = "${className.replaceAll(RegExp(r'[^a-zA-z]'), '')}Renamed";
}
// 读取文件
final file =
File('${ExtensionUtils.extensionsDir}/${extension.package}.js');
Expand All @@ -55,7 +49,20 @@ class ExtensionService {
}
runtime.enableFetch();
runtime.enableHandlePromises();
className = extension.package.replaceAll('.', '');
// example: if the package name is com.example.extension the class name will be comexampleextension
// but if the package name is 9anime.to the class name will be animetoRenamed

if (!className.isAlphabetOnly) {
className = "${className.replaceAll(RegExp(r'[^a-zA-z]'), '')}Renamed";
}
initService();
// 初始化运行扩展
await initRunExtension(content);
return this;
}

void initService() {
jsLog(dynamic args) {
logger.info(args[0]);
ExtensionUtils.addLog(
Expand Down Expand Up @@ -254,6 +261,7 @@ class ExtensionService {
'querySelectorAll', (dynamic args) => jsQuerySelectorAll(args));
// css 选择器
runtime.onMessage('querySelector', (arg) => jsQuerySelector(arg));

if (Platform.isLinux) {
handleDartBridge(String channelName, Function fn) {
jsBridge.setHandler(channelName, (message) async {
Expand All @@ -275,15 +283,13 @@ class ExtensionService {
handleDartBridge('registerSetting$className', jsRegisterSetting);
handleDartBridge('getSetting$className', jsGetMessage);
}
// 初始化运行扩展
await _initRunExtension(content);
return this;
}

_initRunExtension(String extScript) async {
initRunExtension(String extScript) async {
final cryptoJs = await rootBundle.loadString('assets/js/CryptoJS.min.js');
final jsencrypt = await rootBundle.loadString('assets/js/jsencrypt.min.js');
final md5 = await rootBundle.loadString('assets/js/md5.min.js');

runtime.evaluate(Platform.isLinux
? '''
$cryptoJs
Expand Down Expand Up @@ -631,7 +637,6 @@ async function stringify(callback) {
sendMessage("cleanSettings", JSON.stringify([extension.settingKeys]));
});
''');
isinit = true;
}

// 清理 cookie
Expand All @@ -641,7 +646,7 @@ async function stringify(callback) {

/// 添加 cookie
/// key=value; key=value
setCookie(String cookies) async {
Future<void> setCookie(String cookies) async {
await MiruRequest.setCookie(cookies, extension.webSite);
}

Expand All @@ -663,15 +668,16 @@ async function stringify(callback) {
}
}

Future<Map<String, String>> get _defaultHeaders async {
Future<Map<String, String>> get defaultHeaders async {
return {
"Referer": _cuurentRequestUrl,
"User-Agent": MiruStorage.getUASetting(),
"Cookie": await listCookie(),
};
}

Future<List<ExtensionListItem>> latest(int page) async {
Future<List<ExtensionListItem>> latest(
int page, material.BuildContext context) async {
return runExtension(() async {
final jsResult = await runtime.handlePromise(
await runtime.evaluateAsync(Platform.isLinux
Expand All @@ -684,15 +690,16 @@ async function stringify(callback) {
return ExtensionListItem.fromJson(e);
}).toList();
for (var element in result) {
element.headers ??= await _defaultHeaders;
element.headers ??= await defaultHeaders;
}
return result;
});
}

Future<List<ExtensionListItem>> search(
String kw,
int page, {
int page,
material.BuildContext context, {
Map<String, List<String>>? filter,
}) async {
return runExtension(() async {
Expand All @@ -706,7 +713,7 @@ async function stringify(callback) {
return ExtensionListItem.fromJson(e);
}).toList();
for (var element in result) {
element.headers ??= await _defaultHeaders;
element.headers ??= await defaultHeaders;
}
return result;
});
Expand Down Expand Up @@ -739,7 +746,8 @@ async function stringify(callback) {
});
}

Future<ExtensionDetail> detail(String url) async {
Future<ExtensionDetail> detail(
String url, material.BuildContext context) async {
return runExtension(() async {
final jsResult = await runtime.handlePromise(
await runtime.evaluateAsync(Platform.isLinux
Expand All @@ -748,12 +756,12 @@ async function stringify(callback) {
);
final result =
ExtensionDetail.fromJson(jsonDecode(jsResult.stringResult));
result.headers ??= await _defaultHeaders;
result.headers ??= await defaultHeaders;
return result;
});
}

Future<Object?> watch(String url) async {
Future<Object?> watch(String url, material.BuildContext context) async {
return runExtension(() async {
final jsResult = await runtime.handlePromise(
await runtime.evaluateAsync(Platform.isLinux
Expand All @@ -765,11 +773,11 @@ async function stringify(callback) {
switch (extension.type) {
case ExtensionType.bangumi:
final result = ExtensionBangumiWatch.fromJson(data);
result.headers ??= await _defaultHeaders;
result.headers ??= await defaultHeaders;
return result;
case ExtensionType.manga:
final result = ExtensionMangaWatch.fromJson(data);
result.headers ??= await _defaultHeaders;
result.headers ??= await defaultHeaders;
return result;
default:
return ExtensionFikushonWatch.fromJson(data);
Expand All @@ -779,10 +787,11 @@ async function stringify(callback) {

Future<String> checkUpdate(url) async {
return runExtension(() async {
final jsResult = await runtime.handlePromise(
await runtime.evaluateAsync(
'stringify(()=>${className}Instance.checkUpdate("$url"))'),
);
final jsResult = await runtime.handlePromise(await runtime.evaluateAsync(
Platform.isLinux
? '${className}Instance.checkUpdate("$url")'
: 'stringify(()=>${className}Instance.checkUpdate("$url"))',
));
return jsResult.stringResult;
});
}
Expand Down
Loading
Loading