From 7f34660a72d5bee9aa4f1e7a0df67bd898fdbd2e Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 25 Jun 2024 23:40:13 +0800 Subject: [PATCH] Adjust py js proxy --- .../com/fongmi/android/tv/server/Nano.java | 5 ++- .../java/com/github/catvod/utils/Json.java | 6 +++ .../main/java/com/fongmi/chaquo/Spider.java | 45 ++++++++----------- .../com/fongmi/quickjs/crawler/Spider.java | 9 ++-- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index 44b3e8b4a..94a077102 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -84,7 +84,10 @@ public class Nano extends NanoHTTPD { Map params = session.getParms(); params.putAll(session.getHeaders()); Object[] rs = VodConfig.get().proxyLocal(params); - return rs[0] instanceof Response ? (Response) rs[0] : newChunkedResponse(Response.Status.lookup((Integer) rs[0]), (String) rs[1], (InputStream) rs[2]); + if (rs[0] instanceof Response) return (Response) rs[0]; + Response response = newChunkedResponse(Response.Status.lookup((Integer) rs[0]), (String) rs[1], (InputStream) rs[2]); + if (rs.length > 3 && rs[3] != null) for (Map.Entry entry : ((Map) rs[3]).entrySet()) response.addHeader(entry.getKey(), entry.getValue()); + return response; } catch (Exception e) { return error(e.getMessage()); } diff --git a/catvod/src/main/java/com/github/catvod/utils/Json.java b/catvod/src/main/java/com/github/catvod/utils/Json.java index 3eb81f35d..20c93cbeb 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Json.java +++ b/catvod/src/main/java/com/github/catvod/utils/Json.java @@ -1,5 +1,7 @@ package com.github.catvod.utils; +import android.text.TextUtils; + import androidx.collection.ArrayMap; import com.google.gson.JsonElement; @@ -69,6 +71,10 @@ public class Json { } } + public static Map toMap(String json) { + return TextUtils.isEmpty(json) ? null : toMap(parse(json)); + } + public static Map toMap(JsonElement element) { Map map = new HashMap<>(); JsonObject object = safeObject(element); diff --git a/chaquo/src/main/java/com/fongmi/chaquo/Spider.java b/chaquo/src/main/java/com/fongmi/chaquo/Spider.java index 25d366613..bfb2e3a7b 100644 --- a/chaquo/src/main/java/com/fongmi/chaquo/Spider.java +++ b/chaquo/src/main/java/com/fongmi/chaquo/Spider.java @@ -2,24 +2,16 @@ package com.fongmi.chaquo; import android.content.Context; -import androidx.collection.ArrayMap; - import com.chaquo.python.PyObject; import com.github.catvod.Proxy; -import com.github.catvod.net.OkHttp; -import com.github.catvod.utils.Json; -import com.google.common.net.HttpHeaders; +import com.github.catvod.utils.Util; import com.google.gson.Gson; -import com.google.gson.JsonObject; import java.io.ByteArrayInputStream; import java.util.HashMap; import java.util.List; import java.util.Map; -import fi.iki.elonen.NanoHTTPD; -import okhttp3.Headers; - public class Spider extends com.github.catvod.crawler.Spider { private final PyObject app; @@ -88,25 +80,26 @@ public class Spider extends com.github.catvod.crawler.Spider { } @Override - public Object[] proxyLocal(Map params) throws Exception { + public Object[] proxyLocal(Map params) { List list = app.callAttr("localProxy", obj, gson.toJson(params)).asList(); - JsonObject action = Json.parse(list.get(2).toString()).getAsJsonObject(); - Map headers = Json.toMap(action.get("header")); - String url = action.get("url").getAsString(); - String content = list.get(3).toString(); - String type = list.get(1).toString(); - int code = list.get(0).toInt(); - if (action.get("type").getAsString().equals("redirect")) { - NanoHTTPD.Response response = NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.lookup(code), NanoHTTPD.MIME_HTML, ""); - for (Map.Entry entry : headers.entrySet()) response.addHeader(entry.getKey(), entry.getValue()); - response.addHeader(HttpHeaders.LOCATION, url); - return new Object[]{response}; - } else if (action.get("type").getAsString().equals("stream")) { - ArrayMap param = Json.toArrayMap(action.get("param")); - return new Object[]{code, type, OkHttp.newCall(url, Headers.of(headers), param).execute().body().byteStream()}; + Map headers = list.size() > 3 ? list.get(3).asMap() : null; + boolean base64 = list.size() > 4 && list.get(4).toInt() == 1; + PyObject r2 = list.get(2); + Object[] result = new Object[4]; + result[0] = list.get(0).toInt(); + result[1] = list.get(1).toString(); + result[2] = r2 == null ? null : getStream(r2, base64); + result[3] = headers; + return result; + } + + private ByteArrayInputStream getStream(PyObject o, boolean base64) { + if (o.type().toString().contains("bytes")) { + return new ByteArrayInputStream(o.toJava(byte[].class)); } else { - if (content.isEmpty()) content = OkHttp.newCall(url, Headers.of(headers)).execute().body().string(); - return new Object[]{code, type, new ByteArrayInputStream(replaceProxy(content).getBytes())}; + String content = replaceProxy(o.toString()); + if (base64 && content.contains("base64,")) content = content.split("base64,")[1]; + return new ByteArrayInputStream(base64 ? Util.decode(content) : content.getBytes()); } } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index ad4d4f651..4a20fdcfc 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -229,11 +229,13 @@ public class Spider extends com.github.catvod.crawler.Spider { private Object[] proxy1(Map params) throws Exception { JSObject object = JSUtil.toObj(ctx, params); JSONArray array = new JSONArray(((JSArray) jsObject.getJSFunction("proxy").call(object)).stringify()); + Map headers = array.length() > 3 ? Json.toMap(array.optString(3)) : null; boolean base64 = array.length() > 4 && array.optInt(4) == 1; - Object[] result = new Object[3]; - result[0] = array.opt(0); - result[1] = array.opt(1); + Object[] result = new Object[4]; + result[0] = array.optInt(0); + result[1] = array.optString(1); result[2] = getStream(array.opt(2), base64); + result[3] = headers; return result; } @@ -264,4 +266,3 @@ public class Spider extends com.github.catvod.crawler.Spider { } } } -