Adjust jar loader

pull/137/head
FongMi 3 years ago
parent 898ffdcdd0
commit cc23b1fd8e
  1. 29
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  2. 38
      app/src/main/java/com/fongmi/android/tv/api/JarLoader.java
  3. 26
      app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java
  4. 10
      app/src/main/java/com/fongmi/android/tv/utils/Json.java

@ -90,8 +90,7 @@ public class ApiConfig {
private void getFileConfig(String url, Callback callback) {
try {
JsonReader reader = new JsonReader(new FileReader(FileUtil.getLocal(url)));
parseConfig(new Gson().fromJson(reader, JsonObject.class), callback);
parseConfig(new Gson().fromJson(new JsonReader(new FileReader(FileUtil.getLocal(url))), JsonObject.class), callback);
} catch (Exception e) {
e.printStackTrace();
getCacheConfig(url, callback);
@ -115,9 +114,8 @@ public class ApiConfig {
private void parseConfig(JsonObject object, Callback callback) {
try {
String spider = Json.safeString(object, "spider", "");
parseJson(object);
parseJar(spider);
loader.parseJar("", Json.safeString(object, "spider", ""));
handler.post(() -> callback.success(object.toString()));
} catch (Exception e) {
e.printStackTrace();
@ -126,21 +124,21 @@ public class ApiConfig {
}
private void parseJson(JsonObject object) {
for (JsonElement element : object.get("sites").getAsJsonArray()) {
for (JsonElement element : Json.safeListElement(object, "sites")) {
Site site = Site.objectFrom(element).sync();
site.setExt(parseExt(site.getExt()));
if (site.getKey().equals(Prefers.getHome())) setHome(site);
if (!sites.contains(site)) sites.add(site);
}
for (JsonElement element : object.get("parses").getAsJsonArray()) {
for (JsonElement element : Json.safeListElement(object, "parses")) {
Parse parse = Parse.objectFrom(element);
if (parse.getName().equals(Prefers.getParse())) setParse(parse);
if (!parses.contains(parse)) parses.add(parse);
}
if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0));
if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0));
flags.addAll(Json.safeList(object, "flags"));
ads.addAll(Json.safeList(object, "ads"));
flags.addAll(Json.safeListString(object, "flags"));
ads.addAll(Json.safeListString(object, "ads"));
}
private String parseExt(String ext) {
@ -150,21 +148,6 @@ public class ApiConfig {
return ext;
}
private void parseJar(String spider) throws Exception {
String[] texts = spider.split(";md5;");
String md5 = spider.startsWith("http") && texts.length > 1 ? texts[1].trim() : "";
String url = texts[0];
if (md5.length() > 0 && FileUtil.equals(md5)) {
loader.load(FileUtil.getJar());
} else if (url.startsWith("http")) {
loader.load(FileUtil.write(FileUtil.getJar(), OKHttp.newCall(url).execute().body().bytes()));
} else if (url.startsWith("file")) {
loader.load(FileUtil.getLocal(url));
} else if (!url.isEmpty()) {
parseJar(FileUtil.convert(url));
}
}
public Spider getCSP(Site site) {
return loader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar());
}

@ -1,7 +1,6 @@
package com.fongmi.android.tv.api;
import android.content.Context;
import android.text.TextUtils;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.net.OKHttp;
@ -13,9 +12,6 @@ import org.json.JSONObject;
import java.io.File;
import java.lang.reflect.Method;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@ -36,13 +32,6 @@ public class JarLoader {
this.methods = new ConcurrentHashMap<>();
}
public void load(File file) {
loaders.clear();
spiders.clear();
methods.clear();
load("", file);
}
public void load(String key, File file) {
try {
DexClassLoader loader = new DexClassLoader(file.getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader());
@ -57,9 +46,14 @@ public class JarLoader {
}
}
private void parseJar(String key, String jar) throws Exception {
if (jar.startsWith("http")) {
load(key, FileUtil.write(FileUtil.getJar(MD5(jar)), OKHttp.newCall(jar).execute().body().bytes()));
public void parseJar(String key, String jar) throws Exception {
String[] texts = jar.split(";md5;");
String md5 = jar.startsWith("http") && texts.length > 1 ? texts[1].trim() : "";
jar = texts[0];
if (md5.length() > 0 && FileUtil.equals(jar, md5)) {
load(key, FileUtil.getJar(jar));
} else if (jar.startsWith("http")) {
load(key, FileUtil.write(FileUtil.getJar(jar), OKHttp.newCall(jar).execute().body().bytes()));
} else if (jar.startsWith("file")) {
load(key, FileUtil.getLocal(jar));
} else if (!jar.isEmpty()) {
@ -69,7 +63,7 @@ public class JarLoader {
public Spider getSpider(String key, String api, String ext, String jar) {
try {
current = MD5(jar);
current = FileUtil.getMD5(jar);
api = api.replace("csp_", "");
if (spiders.containsKey(key)) return spiders.get(key);
if (!loaders.containsKey(current)) parseJar(current, jar);
@ -119,18 +113,4 @@ public class JarLoader {
return null;
}
}
public String MD5(String src) {
try {
if (TextUtils.isEmpty(src)) return "";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(src.getBytes());
BigInteger no = new BigInteger(1, messageDigest);
StringBuilder sb = new StringBuilder(no.toString(16));
while (sb.length() < 32) sb.insert(0, "0");
return sb.toString().toLowerCase();
} catch (NoSuchAlgorithmException e) {
return "";
}
}
}

@ -16,8 +16,10 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class FileUtil {
@ -39,12 +41,8 @@ public class FileUtil {
return new File(getCacheDir(), fileName);
}
public static File getJar() {
return getCacheFile("spider.jar");
}
public static File getJar(String fileName) {
return getCacheFile(fileName.concat(".jar"));
return getCacheFile(getMD5(fileName).concat(".jar"));
}
public static File getLocal(String path) {
@ -109,8 +107,22 @@ public class FileUtil {
}
}
public static boolean equals(String md5) {
return getMd5(FileUtil.getJar()).equalsIgnoreCase(md5);
public static String getMD5(String src) {
try {
if (TextUtils.isEmpty(src)) return "";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(src.getBytes());
BigInteger no = new BigInteger(1, messageDigest);
StringBuilder sb = new StringBuilder(no.toString(16));
while (sb.length() < 32) sb.insert(0, "0");
return sb.toString().toLowerCase();
} catch (NoSuchAlgorithmException e) {
return "";
}
}
public static boolean equals(String jar, String md5) {
return getMd5(getJar(jar)).equalsIgnoreCase(md5);
}
public static void clearDir(File dir) {

@ -15,7 +15,7 @@ public class Json {
else return value;
}
public static List<String> safeList(JsonObject obj, String key) {
public static List<String> safeListString(JsonObject obj, String key) {
List<String> result = new ArrayList<>();
if (!obj.has(key)) return result;
if (obj.get(key).isJsonObject()) result.add(obj.get(key).getAsString());
@ -23,6 +23,14 @@ public class Json {
return result;
}
public static List<JsonElement> safeListElement(JsonObject obj, String key) {
List<JsonElement> result = new ArrayList<>();
if (!obj.has(key)) return result;
if (obj.get(key).isJsonObject()) result.add(obj.get(key).getAsJsonObject());
for (JsonElement opt : obj.getAsJsonArray(key)) result.add(opt.getAsJsonObject());
return result;
}
public static JsonObject safeObject(JsonElement element) {
try {
if (element.isJsonPrimitive()) element = JsonParser.parseString(element.getAsJsonPrimitive().getAsString());

Loading…
Cancel
Save