优化默认js/lib文件加载;

优化广告规则切片匹配;
main
于俊 12 months ago
parent 77392b3eb3
commit 32df47aa3e
  1. 8
      app/src/main/java/com/github/catvod/crawler/JsLoader.java
  2. 30
      app/src/main/java/com/github/tvbox/osc/util/FileUtils.java
  3. 18
      app/src/main/java/com/github/tvbox/osc/util/M3u8.java
  4. 1
      app/src/main/java/com/github/tvbox/osc/util/js/JsSpider.java
  5. 2
      gradle.properties

@ -24,8 +24,8 @@ import dalvik.system.DexClassLoader;
import okhttp3.Response;
public class JsLoader {
private static ConcurrentHashMap<String, Spider> spiders = new ConcurrentHashMap<>();
private static ConcurrentHashMap<String, Class<?>> classes = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<String, Spider> spiders = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<String, Class<?>> classes = new ConcurrentHashMap<>();
//当前的Js爬虫key
private volatile String recentKey = "";
@ -81,8 +81,10 @@ public class JsLoader {
}
private Class<?> loadJarInternal(String jar, String md5, String key) {
if (classes.containsKey(key))
if (classes.containsKey(key)){
Log.i("JSLoader", "echo-loadJarInternal cached");
return classes.get(key);
}
File cache = new File(App.getInstance().getFilesDir().getAbsolutePath() + "/csp/" + key + ".jar");
if (!md5.isEmpty()) {
if (cache.exists() && MD5.getFileMd5(cache).equalsIgnoreCase(md5)) {

@ -23,8 +23,12 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -253,6 +257,7 @@ public class FileUtils {
//JS 工具方法
private static final Pattern URL_JOIN = Pattern.compile("^http.*\\.(js|txt|json)", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
public static String loadModule(String name) {
try {
if (name.contains("gbk.js")) {
@ -300,17 +305,23 @@ public class FileUtils {
return name;
}
public static boolean isAsFile(String name, String path) {
try {
for (String f_name : App.getInstance().getAssets().list(path)) {
if (f_name.equals(name.trim())) {
return true;
}
private static final Map<String, Set<String>> cachedDirFiles = new HashMap<>();
public static boolean isAsFile(String name,String dir) {
// 1. 先从缓存里取目录列表
Set<String> files = cachedDirFiles.get(dir);
if (files == null) {
LOG.i("echo-读取AssetsList");
try {
String[] list = App.getInstance().getAssets().list(dir);
files = new HashSet<>(Arrays.asList(list));
} catch (IOException e) {
files = Collections.emptySet();
}
} catch (Exception e) {
e.printStackTrace();
cachedDirFiles.put(dir, files);
}
return false;
// 2. 内存查找
return files.contains(name.trim());
}
public static String getAsOpen(String name) {
@ -384,7 +395,6 @@ public class FileUtils {
return OkHttpUtil.string(str,headerMap);
}
private static final Pattern URL_JOIN = Pattern.compile("^http.*\\.(js|txt|json|m3u)", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
public static File open(String str) {
return new File(getExternalCachePath() + "/qjscache_" + str + ".js");
}

@ -32,12 +32,16 @@ public class M3u8 {
}
public static String purify(String tsUrlPre, String m3u8content) {
long start = System.currentTimeMillis();
currentAdCount = 0;
if (null == m3u8content || m3u8content.length() == 0) return null;
if (!m3u8content.startsWith("#EXTM3U")) return null;
String result = removeMinorityUrl(tsUrlPre, m3u8content);
if (result != null) return result;
return get(tsUrlPre, m3u8content);
result = get(tsUrlPre, m3u8content);
long cost = System.currentTimeMillis() - start;
LOG.i("echo-fixAdM3u8Ai 耗时:" + cost + "ms");
return result;
}
private static double maxPercent(HashMap<String, Integer> preUrlMap) {
@ -270,26 +274,28 @@ public class M3u8 {
String group = m1.group();
String groupCleaned = group.replace(TAG_ENDLIST, "");
Matcher m2 = REGEX_MEDIA_DURATION.matcher(group);
BigDecimal ft = BigDecimal.ZERO;
BigDecimal lt = BigDecimal.ZERO;
BigDecimal ft = BigDecimal.ZERO,lt = BigDecimal.ZERO,t = BigDecimal.ZERO;
int tCount = 0;
while (m2.find()) {
if (ft.equals(BigDecimal.ZERO))ft = new BigDecimal(m2.group(1));
lt = new BigDecimal(m2.group(1));
t = t.add(lt);
tCount+=1;
}
String ftStr = ft.toString();
String ltStr = lt.toString();
String ftStr = ft.toString(),ltStr = lt.toString(),tStr = t.toString();
for (String ad : ads) {
if (ad.startsWith("-")) {
String adClean = ad.substring(1);
//匹配最后一条切片
if (ltStr.startsWith(adClean)) {
needRemoveAd.add(groupCleaned);
currentAdCount+=tCount;
break;
}
} else {
if (ftStr.startsWith(ad)) {
//匹配第一条切片或广告切片总时长
if (ftStr.startsWith(ad) || tStr.startsWith(ad)) {
needRemoveAd.add(groupCleaned);
currentAdCount+=tCount;
break;

@ -162,7 +162,6 @@ public class JsSpider extends Spider {
@Override
public boolean isVideoFormat(String url) {
try {
return (Boolean) call("isVideo", url);
}catch (Exception e){
return false;

@ -18,4 +18,4 @@ android.useAndroidX=true
android.enableJetifier=true
IsDebug=true
#build on off
#org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED
org.gradle.jvmargs=-Xmx2048m --add-opens java.base/java.io=ALL-UNNAMED
Loading…
Cancel
Save