Merge branch 'fongmi' into release

pull/617/head
FongMi 2 months ago
commit 171a41bf1c
  1. 4
      app/build.gradle
  2. 2
      app/src/main/java/com/fongmi/android/tv/api/loader/JsLoader.java
  3. 1
      app/src/main/java/com/fongmi/android/tv/server/process/Proxy.java
  4. 13
      quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java
  5. 59
      quickjs/src/main/java/com/fongmi/quickjs/utils/Async.java
  6. 6
      quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java

@ -16,8 +16,8 @@ android {
minSdk 24
//noinspection ExpiredTargetSdkVersion
targetSdk 28
versionCode 512
versionName "5.1.2"
versionCode 513
versionName "5.1.3"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"]

@ -2,6 +2,7 @@ package com.fongmi.android.tv.api.loader;
import com.fongmi.android.tv.App;
import com.fongmi.quickjs.crawler.Loader;
import com.fongmi.quickjs.utils.Module;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderNull;
@ -21,6 +22,7 @@ public class JsLoader {
public void clear() {
spiders.values().forEach(Spider::destroy);
Module.get().clear();
spiders.clear();
}

@ -31,6 +31,7 @@ public class Proxy implements Process {
if (rs.length > 3 && rs[3] != null) for (Map.Entry<String, String> entry : ((Map<String, String>) rs[3]).entrySet()) response.addHeader(entry.getKey(), entry.getValue());
return response;
} catch (Throwable e) {
e.printStackTrace();
return Nano.error(e.getMessage());
}
}

@ -115,8 +115,7 @@ public class Spider extends com.github.catvod.crawler.Spider {
@Override
public Object[] proxy(Map<String, String> params) throws Exception {
if ("catvod".equals(params.get("from"))) return proxy2(params);
else return submit(() -> proxy1(params)).get();
return "catvod".equals(params.get("from")) ? proxy2(params) : proxy1(params);
}
@Override
@ -205,8 +204,10 @@ public class Spider extends com.github.catvod.crawler.Spider {
}
private Object[] proxy1(Map<String, String> params) throws Exception {
JSObject obj = JSUtil.toObject(ctx, params);
JSONArray array = new JSONArray(((JSArray) jsObject.getJSFunction("proxy").call(obj)).stringify());
JSObject obj = submit(() -> JSUtil.toObject(ctx, params)).get();
JSArray proxy = (JSArray) call("proxy", obj);
String json = submit(proxy::stringify).get();
JSONArray array = new JSONArray(json);
Map<String, String> headers = array.length() > 3 ? Json.toMap(array.optString(3)) : null;
boolean base64 = array.length() > 4 && array.optInt(4) == 1;
Object[] result = new Object[4];
@ -222,8 +223,8 @@ public class Spider extends com.github.catvod.crawler.Spider {
String header = params.get("header");
JSArray array = submit(() -> JSUtil.toArray(ctx, Arrays.asList(url.split("/")))).get();
Object object = submit(() -> ctx.parse(header)).get();
String json = (String) call("proxy", array, object);
Res res = Res.objectFrom(json);
String proxy = (String) call("proxy", array, object);
Res res = Res.objectFrom(proxy);
Object[] result = new Object[3];
result[0] = res.getCode();
result[1] = res.getContentType();

@ -8,9 +8,9 @@ import java.util.concurrent.CompletableFuture;
public class Async {
private final CompletableFuture<Object> future;
private CompletableFuture<Object> future;
public static CompletableFuture<Object> run(JSObject object, String name, Object[] args) {
public static CompletableFuture<Object> run(JSObject object, String name, Object... args) {
return new Async().call(object, name, args);
}
@ -18,13 +18,10 @@ public class Async {
this.future = new CompletableFuture<>();
}
private CompletableFuture<Object> call(JSObject object, String name, Object[] args) {
JSFunction function = object.getJSFunction(name);
if (function == null) return empty();
Object result = function.call(args);
if (result instanceof JSObject) then(result);
else future.complete(result);
function.release();
private CompletableFuture<Object> call(JSObject object, String name, Object... args) {
JSFunction func = object.getJSFunction(name);
if (func == null) return empty();
call(func, args);
return future;
}
@ -33,18 +30,44 @@ public class Async {
return future;
}
private void then(Object result) {
JSObject promise = (JSObject) result;
private void call(JSFunction func, Object... args) {
try {
Object result = func.call(args);
if (result instanceof JSObject) then((JSObject) result);
else future.complete(result);
} catch (Throwable e) {
future.completeExceptionally(e);
} finally {
func.release();
}
}
private void then(JSObject promise) {
JSFunction then = promise.getJSFunction("then");
if (then != null) then.call(callback);
if (then != null) then.release();
if (then == null) {
future.complete(promise);
} else {
consume(then, onSuccess);
consume(promise.getJSFunction("catch"), onError);
}
}
private final JSCallFunction callback = new JSCallFunction() {
@Override
public Object call(Object... args) {
future.complete(args[0]);
return null;
private void consume(JSFunction func, JSCallFunction callback) {
if (func == null) return;
try {
func.call(callback);
} finally {
func.release();
}
}
private final JSCallFunction onSuccess = args -> {
future.complete(args != null && args.length > 0 ? args[0] : null);
return null;
};
private final JSCallFunction onError = args -> {
future.complete(null);
return null;
};
}

@ -20,7 +20,7 @@ public class Module {
}
public Module() {
this.cache = new LruCache<>(MAX_SIZE);
cache = new LruCache<>(MAX_SIZE);
}
public String fetch(String name) {
@ -31,4 +31,8 @@ public class Module {
else if (name.startsWith("lib/")) cache.put(name, content = Asset.read("js/" + name));
return content;
}
public void clear() {
cache.evictAll();
}
}

Loading…
Cancel
Save