Support multiple jar

pull/137/head
FongMi 3 years ago
parent 38faf1e159
commit 433530ff93
  1. 21
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  2. 67
      app/src/main/java/com/fongmi/android/tv/api/JarLoader.java
  3. 8
      app/src/main/java/com/fongmi/android/tv/bean/Site.java
  4. 17
      app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java

@ -1,9 +1,7 @@
package com.fongmi.android.tv.api;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.bean.Live;
@ -139,7 +137,7 @@ public class ApiConfig {
private String parseExt(String ext) {
if (ext.startsWith("http")) return ext;
else if (ext.startsWith("file")) return FileUtil.read(ext);
else if (ext.endsWith(".json")) return parseExt(convert(ext));
else if (ext.endsWith(".json")) return parseExt(FileUtil.convert(ext));
return ext;
}
@ -150,27 +148,16 @@ public class ApiConfig {
if (md5.length() > 0 && FileUtil.equals(md5)) {
loader.load(FileUtil.getJar());
} else if (url.startsWith("http")) {
FileUtil.write(FileUtil.getJar(), OKHttp.newCall(url).execute().body().bytes());
loader.load(FileUtil.getJar());
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(convert(url));
parseJar(FileUtil.convert(url));
}
}
private String convert(String text) {
if (TextUtils.isEmpty(text)) return "";
if (text.startsWith("clan")) return text.replace("clan", "file");
if (text.startsWith(".")) text = text.substring(1);
if (text.startsWith("/")) text = text.substring(1);
Uri uri = Uri.parse(Prefers.getUrl());
if (uri.getLastPathSegment() == null) return uri.getScheme() + "://" + text;
return uri.toString().replace(uri.getLastPathSegment(), text);
}
public Spider getCSP(Site site) {
return loader.getSpider(site.getKey(), site.getApi(), site.getExt());
return loader.getSpider(site.getKey(), site.getApi(), site.getExt(), site.getJar());
}
public Object[] proxyLocal(Map<?, ?> param) {

@ -1,8 +1,10 @@
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;
import com.fongmi.android.tv.utils.FileUtil;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderNull;
@ -11,6 +13,9 @@ 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;
@ -20,34 +25,55 @@ import dalvik.system.DexClassLoader;
public class JarLoader {
private final ConcurrentHashMap<String, DexClassLoader> loaders;
private final ConcurrentHashMap<String, Spider> spiders;
private DexClassLoader classLoader;
private Method proxyFun;
private final ConcurrentHashMap<String, Method> methods;
private String current;
public JarLoader() {
this.loaders = new ConcurrentHashMap<>();
this.spiders = new ConcurrentHashMap<>();
this.methods = new ConcurrentHashMap<>();
}
public void load(File file) {
loaders.clear();
spiders.clear();
proxyFun = null;
classLoader = new DexClassLoader(file.getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader());
methods.clear();
load("", file);
}
public void load(String key, File file) {
try {
Class<?> classInit = classLoader.loadClass("com.github.catvod.spider.Init");
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());
Class<?> classProxy = classLoader.loadClass("com.github.catvod.spider.Proxy");
proxyFun = classProxy.getMethod("proxy", Map.class);
loaders.put(key, loader);
Class<?> classProxy = loader.loadClass("com.github.catvod.spider.Proxy");
methods.put(key, classProxy.getMethod("proxy", Map.class));
} catch (Exception ignored) {
ignored.printStackTrace();
}
}
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()));
} else if (jar.startsWith("file")) {
load(key, FileUtil.getLocal(jar));
} else if (!jar.isEmpty()) {
parseJar(key, FileUtil.convert(jar));
}
}
public Spider getSpider(String key, String api, String ext) {
public Spider getSpider(String key, String api, String ext, String jar) {
try {
current = MD5(jar);
api = api.replace("csp_", "");
if (spiders.containsKey(key)) return spiders.get(key);
if (classLoader == null) return new SpiderNull();
Spider spider = (Spider) classLoader.loadClass("com.github.catvod.spider." + api).newInstance();
if (!loaders.containsKey(current)) parseJar(current, jar);
Spider spider = (Spider) loaders.get(current).loadClass("com.github.catvod.spider." + api).newInstance();
spider.init(App.get(), ext);
spiders.put(key, spider);
return spider;
@ -61,7 +87,7 @@ public class JarLoader {
try {
String clsKey = "Json" + key;
String hotClass = "com.github.catvod.parser." + clsKey;
Class<?> jsonParserCls = classLoader.loadClass(hotClass);
Class<?> jsonParserCls = loaders.get("").loadClass(hotClass);
Method mth = jsonParserCls.getMethod("parse", LinkedHashMap.class, String.class);
return (JSONObject) mth.invoke(null, jxs, url);
} catch (Exception e) {
@ -74,7 +100,7 @@ public class JarLoader {
try {
String clsKey = "Mix" + key;
String hotClass = "com.github.catvod.parser." + clsKey;
Class<?> jsonParserCls = classLoader.loadClass(hotClass);
Class<?> jsonParserCls = loaders.get("").loadClass(hotClass);
Method mth = jsonParserCls.getMethod("parse", LinkedHashMap.class, String.class, String.class, String.class);
return (JSONObject) mth.invoke(null, jxs, name, flag, url);
} catch (Exception e) {
@ -83,8 +109,9 @@ public class JarLoader {
}
}
public Object[] proxyInvoke(Map params) {
public Object[] proxyInvoke(Map<?, ?> params) {
try {
Method proxyFun = methods.get(current);
if (proxyFun != null) return (Object[]) proxyFun.invoke(null, params);
else return null;
} catch (Exception e) {
@ -92,4 +119,18 @@ 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 "";
}
}
}

@ -15,7 +15,7 @@ import com.google.gson.annotations.SerializedName;
import java.util.Collections;
import java.util.List;
@Entity(ignoredColumns = {"type", "api", "playUrl", "ext", "categories"})
@Entity(ignoredColumns = {"type", "api", "playUrl", "ext", "categories", "jar"})
public class Site {
@NonNull
@ -36,6 +36,8 @@ public class Site {
private Integer filterable;
@SerializedName("ext")
private String ext;
@SerializedName("jar")
private String jar;
@SerializedName("categories")
private List<String> categories;
@ -118,6 +120,10 @@ public class Site {
this.ext = ext;
}
public String getJar() {
return TextUtils.isEmpty(jar) ? "" : jar;
}
public List<String> getCategories() {
return categories == null ? Collections.emptyList() : categories;
}

@ -43,6 +43,10 @@ public class FileUtil {
return getCacheFile("spider.jar");
}
public static File getJar(String fileName) {
return getCacheFile(fileName.concat(".jar"));
}
public static File getLocal(String path) {
return new File(path.replace("file:/", getRootPath()));
}
@ -56,12 +60,13 @@ public class FileUtil {
return TextUtils.isEmpty(mimeType) ? "*/*" : mimeType;
}
public static void write(File file, byte[] data) throws Exception {
public static File write(File file, byte[] data) throws Exception {
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.flush();
fos.close();
chmod(file);
return file;
}
public static String read(String path) {
@ -77,6 +82,16 @@ public class FileUtil {
}
}
public static String convert(String text) {
if (TextUtils.isEmpty(text)) return "";
if (text.startsWith("clan")) return text.replace("clan", "file");
if (text.startsWith(".")) text = text.substring(1);
if (text.startsWith("/")) text = text.substring(1);
Uri uri = Uri.parse(Prefers.getUrl());
if (uri.getLastPathSegment() == null) return uri.getScheme() + "://" + text;
return uri.toString().replace(uri.getLastPathSegment(), text);
}
private static String getMd5(File file) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");

Loading…
Cancel
Save