js support load jar

pull/137/head
FongMi 3 years ago
parent a578fc695e
commit d121db2c7f
  1. 6
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  2. 2
      app/src/main/java/com/fongmi/android/tv/api/Decoder.java
  3. 52
      app/src/main/java/com/fongmi/android/tv/api/JarLoader.java
  4. 46
      app/src/main/java/com/fongmi/android/tv/api/JsLoader.java
  5. 2
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  6. 4
      app/src/main/java/com/fongmi/android/tv/api/PyLoader.java
  7. 2
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  8. 2
      app/src/main/java/com/fongmi/android/tv/bean/Parse.java
  9. 2
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  10. 10
      app/src/main/java/com/fongmi/android/tv/player/ParseJob.java
  11. 2
      catvod/src/main/java/com/github/catvod/utils/Json.java
  12. 38
      drpy/src/main/java/com/hiker/drpy/Spider.java

@ -10,7 +10,7 @@ import com.fongmi.android.tv.bean.Parse;
import com.fongmi.android.tv.bean.Rule;
import com.fongmi.android.tv.bean.Site;
import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.Utils;
import com.github.catvod.bean.Doh;
@ -260,11 +260,11 @@ public class ApiConfig {
}
}
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Exception {
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Throwable {
return jarLoader.jsonExt(key, jxs, url);
}
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) throws Exception {
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) throws Throwable {
return jarLoader.jsonExtMix(flag, key, name, jxs, url);
}

@ -3,7 +3,7 @@ package com.fongmi.android.tv.api;
import android.util.Base64;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.Utils;
import com.github.catvod.net.OkHttp;
import com.google.common.io.BaseEncoding;

@ -28,36 +28,45 @@ public class JarLoader {
private String recent;
public JarLoader() {
this.loaders = new ConcurrentHashMap<>();
this.methods = new ConcurrentHashMap<>();
this.spiders = new ConcurrentHashMap<>();
loaders = new ConcurrentHashMap<>();
methods = new ConcurrentHashMap<>();
spiders = new ConcurrentHashMap<>();
}
public void clear() {
for (Spider spider : spiders.values()) spider.destroy();
this.loaders.clear();
this.methods.clear();
this.spiders.clear();
loaders.clear();
methods.clear();
spiders.clear();
}
public void setRecent(String recent) {
this.recent = recent;
}
private void load(String key, File file) throws Throwable {
private void load(String key, File file) {
DexClassLoader loader = new DexClassLoader(file.getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader());
Class<?> classInit = loader.loadClass("com.github.catvod.spider.Init");
Method method = classInit.getMethod("init", Context.class);
method.invoke(classInit, App.get());
loaders.put(key, loader);
putProxy(key);
setContext(key);
getProxy(key);
}
private void putProxy(String key) {
private void setContext(String key) {
try {
Class<?> classProxy = loaders.get(key).loadClass("com.github.catvod.spider.Proxy");
methods.put(key, classProxy.getMethod("proxy", Map.class));
} catch (Exception e) {
Class<?> clz = loaders.get(key).loadClass("com.github.catvod.spider.Init");
Method method = clz.getMethod("init", Context.class);
method.invoke(clz, App.get());
} catch (Throwable e) {
e.printStackTrace();
}
}
private void getProxy(String key) {
try {
Class<?> clz = loaders.get(key).loadClass("com.github.catvod.spider.Proxy");
Method method = clz.getMethod("proxy", Map.class);
methods.put(key, method);
} catch (Throwable e) {
e.printStackTrace();
}
}
@ -70,7 +79,7 @@ public class JarLoader {
}
}
public void parseJar(String key, String jar) throws Throwable {
public void parseJar(String key, String jar) {
String[] texts = jar.split(";md5;");
String md5 = !jar.startsWith("file") && texts.length > 1 ? texts[1].trim() : "";
jar = texts[0];
@ -87,6 +96,11 @@ public class JarLoader {
}
}
public DexClassLoader getLoader(String key, String jar) {
if (!loaders.containsKey(key)) parseJar(key, jar);
return loaders.get(key);
}
public Spider getSpider(String key, String api, String ext, String jar) {
try {
String jaKey = Utils.getMd5(jar);
@ -103,13 +117,13 @@ public class JarLoader {
}
}
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Exception {
public JSONObject jsonExt(String key, LinkedHashMap<String, String> jxs, String url) throws Throwable {
Class<?> clz = loaders.get("").loadClass("com.github.catvod.parser.Json" + key);
Method method = clz.getMethod("parse", LinkedHashMap.class, String.class);
return (JSONObject) method.invoke(null, jxs, url);
}
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) throws Exception {
public JSONObject jsonExtMix(String flag, String key, String name, LinkedHashMap<String, HashMap<String, String>> jxs, String url) throws Throwable {
Class<?> clz = loaders.get("").loadClass("com.github.catvod.parser.Mix" + key);
Method method = clz.getMethod("parse", LinkedHashMap.class, String.class, String.class, String.class);
return (JSONObject) method.invoke(null, jxs, name, flag, url);
@ -120,7 +134,7 @@ public class JarLoader {
Method method = methods.get(Utils.getMd5(recent));
if (method != null) return (Object[]) method.invoke(null, params);
else return null;
} catch (Exception e) {
} catch (Throwable e) {
e.printStackTrace();
return null;
}

@ -1,13 +1,9 @@
package com.fongmi.android.tv.api;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Utils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderNull;
import com.github.catvod.net.OkHttp;
import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@ -16,52 +12,28 @@ import dalvik.system.DexClassLoader;
public class JsLoader {
private final ConcurrentHashMap<String, Spider> spiders;
private final JarLoader jarLoader;
private String recent;
public JsLoader() {
jarLoader = new JarLoader();
spiders = new ConcurrentHashMap<>();
}
public void clear() {
for (Spider spider : spiders.values()) spider.destroy();
this.spiders.clear();
jarLoader.clear();
spiders.clear();
}
public void setRecent(String recent) {
this.recent = recent;
}
private File download(String jar) {
private DexClassLoader dex(String key, String jar) {
try {
return FileUtil.write(FileUtil.getJar(jar), OkHttp.newCall(jar).execute().body().bytes());
} catch (Exception e) {
return FileUtil.getJar(jar);
}
}
private File getFile(String jar) {
String[] texts = jar.split(";md5;");
String md5 = !jar.startsWith("file") && texts.length > 1 ? texts[1].trim() : "";
jar = texts[0];
if (jar.startsWith("img+")) {
return Decoder.getSpider(jar, md5);
} else if (md5.length() > 0 && FileUtil.equals(jar, md5)) {
return FileUtil.getJar(jar);
} else if (jar.startsWith("http")) {
return download(jar);
} else if (jar.startsWith("file")) {
return FileUtil.getLocal(jar);
} else if (!jar.isEmpty()) {
return getFile(Utils.convert(ApiConfig.getUrl(), jar));
} else {
return null;
}
}
private DexClassLoader dex(String jar) {
try {
return jar.isEmpty() ? null : new DexClassLoader(getFile(jar).getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader());
} catch (Exception e) {
return jar.isEmpty() ? null : jarLoader.getLoader(key, jar);
} catch (Throwable e) {
return null;
}
}
@ -69,7 +41,7 @@ public class JsLoader {
public Spider getSpider(String key, String api, String ext, String jar) {
try {
if (spiders.containsKey(key)) return spiders.get(key);
Spider spider = new com.hiker.drpy.Spider(api, dex(jar));
Spider spider = new com.hiker.drpy.Spider(api, dex(key, jar));
spider.init(App.get(), ext);
spiders.put(key, spider);
return spider;
@ -84,7 +56,7 @@ public class JsLoader {
Spider spider = spiders.get(recent);
if (spider != null) return spider.proxyLocal(params);
else return null;
} catch (Exception e) {
} catch (Throwable e) {
e.printStackTrace();
return null;
}

@ -13,7 +13,7 @@ import com.fongmi.android.tv.bean.Keep;
import com.fongmi.android.tv.bean.Live;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.Prefers;
import com.google.gson.JsonElement;

@ -23,7 +23,7 @@ public class PyLoader {
public void clear() {
for (Spider spider : spiders.values()) spider.destroy();
this.spiders.clear();
spiders.clear();
}
public void setRecent(String recent) {
@ -56,7 +56,7 @@ public class PyLoader {
Spider spider = spiders.get(recent);
if (spider != null) return spider.proxyLocal(params);
else return null;
} catch (Exception e) {
} catch (Throwable e) {
e.printStackTrace();
return null;
}

@ -6,7 +6,7 @@ import android.widget.ImageView;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ImgUtil;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.common.net.HttpHeaders;
import com.google.gson.Gson;

@ -5,7 +5,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Utils;
import com.google.gson.Gson;

@ -5,7 +5,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.fongmi.android.tv.gson.FilterAdapter;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.Trans;
import com.google.gson.Gson;
import com.google.gson.JsonElement;

@ -7,7 +7,7 @@ import com.fongmi.android.tv.bean.Parse;
import com.fongmi.android.tv.bean.Result;
import com.fongmi.android.tv.impl.ParseCallback;
import com.fongmi.android.tv.ui.custom.CustomWebView;
import com.fongmi.android.tv.utils.Json;
import com.github.catvod.utils.Json;
import com.fongmi.android.tv.utils.Utils;
import com.github.catvod.net.OkHttp;
import com.google.gson.JsonObject;
@ -71,13 +71,13 @@ public class ParseJob implements ParseCallback {
return () -> {
try {
doInBackground(result.getKey(), result.getUrl(), result.getFlag());
} catch (Exception e) {
} catch (Throwable e) {
onParseError();
}
};
}
private void doInBackground(String key, String webUrl, String flag) throws Exception {
private void doInBackground(String key, String webUrl, String flag) throws Throwable {
switch (parse.getType()) {
case 0: //嗅探
startWeb(key, parse, webUrl);
@ -106,13 +106,13 @@ public class ParseJob implements ParseCallback {
checkResult(getHeader(object), url, item.getName(), error);
}
private void jsonExtend(String webUrl) throws Exception {
private void jsonExtend(String webUrl) throws Throwable {
LinkedHashMap<String, String> jxs = new LinkedHashMap<>();
for (Parse item : ApiConfig.get().getParses()) if (item.getType() == 1) jxs.put(item.getName(), item.extUrl());
checkResult(Result.fromObject(ApiConfig.get().jsonExt(parse.getUrl(), jxs, webUrl)));
}
private void jsonMix(String webUrl, String flag) throws Exception {
private void jsonMix(String webUrl, String flag) throws Throwable {
LinkedHashMap<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
for (Parse item : ApiConfig.get().getParses()) jxs.put(item.getName(), item.mixMap());
checkResult(Result.fromObject(ApiConfig.get().jsonExtMix(flag, parse.getUrl(), parse.getName(), jxs, webUrl)));

@ -1,4 +1,4 @@
package com.fongmi.android.tv.utils;
package com.github.catvod.utils;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

@ -2,6 +2,7 @@ package com.hiker.drpy;
import android.content.Context;
import com.github.catvod.utils.Json;
import com.hiker.drpy.method.Global;
import com.hiker.drpy.method.Local;
import com.whl.quickjs.android.QuickJSLoader;
@ -128,7 +129,7 @@ public class Spider extends com.github.catvod.crawler.Spider {
if (dex != null) createDex();
ctx.evaluateModule(getContent(context), api);
jsObject = (JSObject) ctx.getProperty(ctx.getGlobalObject(), key);
jsObject.getJSFunction("init").call(extend);
jsObject.getJSFunction("init").call(Json.valid(extend) ? ctx.parse(extend) : extend);
}
private void createCtx() {
@ -140,29 +141,26 @@ public class Spider extends com.github.catvod.crawler.Spider {
private void createDex() {
try {
Class<?> apiClz = dex.loadClass("com.github.catvod.js.Method");
JSObject apiObj = ctx.getGlobalObject().getJSObject("jsapi");
injectApi(apiClz, apiObj);
} catch (Exception e) {
JSObject obj = ctx.createNewJSObject();
Class<?> clz = dex.loadClass("com.github.catvod.js.Method");
ctx.getGlobalObject().setProperty("jsapi", obj);
inject(clz, obj);
} catch (Throwable e) {
e.printStackTrace();
}
}
private void injectApi(Class<?> apiClz, JSObject apiObj) throws Exception {
for (Class<?> clz : apiClz.getDeclaredClasses()) {
Object javaObj = clz.getDeclaredConstructor(apiClz).newInstance(apiClz.getDeclaredConstructor(QuickJSContext.class).newInstance(ctx));
JSObject clzObj = ctx.createNewJSObject();
for (Method method : clz.getDeclaredMethods()) {
if (!method.isAnnotationPresent(JSMethod.class)) continue;
clzObj.setProperty(method.getName(), args -> {
try {
return method.invoke(javaObj, args);
} catch (Exception e) {
return null;
}
});
}
apiObj.setProperty(clz.getSimpleName(), clzObj);
private void inject(Class<?> clz, JSObject jsObj) throws Throwable {
Object javaObj = clz.getDeclaredConstructor(QuickJSContext.class).newInstance(ctx);
for (Method method : clz.getMethods()) {
if (!method.isAnnotationPresent(JSMethod.class)) continue;
jsObj.setProperty(method.getName(), args -> {
try {
return method.invoke(javaObj, args);
} catch (Throwable e) {
return null;
}
});
}
}

Loading…
Cancel
Save