diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e94c9a94d..5ad59f29d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
callback.error(0));
- return;
- }
- OKHttp.get().client().newCall(new Request.Builder().url(Prefers.getUrl()).build()).enqueue(new Callback() {
- @Override
- public void onResponse(@NonNull Call call, @NonNull Response response) {
- try {
- JsonObject object = new Gson().fromJson(response.body().string(), JsonObject.class);
- String spider = Json.safeString(object, "spider", "");
- parseJson(object);
- loadJar(spider);
- handler.post(callback::success);
- } catch (Exception e) {
- handler.post(() -> callback.error(R.string.error_config_parse));
- }
+ String url = Prefers.getUrl();
+ new Thread(() -> {
+ if (url.startsWith("file://")) {
+ getFileConfig(url, callback);
+ } else if (Patterns.WEB_URL.matcher(url).matches()) {
+ getWebConfig(url, callback);
+ } else {
+ handler.post(() -> callback.error(0));
}
+ }).start();
+ }
- @Override
- public void onFailure(@NonNull Call call, @NonNull IOException e) {
- handler.post(() -> callback.error(R.string.error_config_get));
- }
- });
+ 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);
+ } catch (Exception e) {
+ handler.post(() -> callback.error(R.string.error_config_get));
+ }
+ }
+
+ private void getWebConfig(String url, Callback callback) {
+ try {
+ Response response = OKHttp.get().client().newCall(new Request.Builder().url(url).build()).execute();
+ parseConfig(new Gson().fromJson(response.body().string(), JsonObject.class), callback);
+ } catch (IOException e) {
+ handler.post(() -> callback.error(R.string.error_config_get));
+ }
+ }
+
+ private void parseConfig(JsonObject object, Callback callback) {
+ try {
+ String spider = Json.safeString(object, "spider", "");
+ parseJson(object);
+ parseJar(spider);
+ handler.post(callback::success);
+ } catch (Exception e) {
+ e.printStackTrace();
+ handler.post(() -> callback.error(R.string.error_config_parse));
+ }
}
private void parseJson(JsonObject object) {
@@ -117,10 +134,14 @@ public class ApiConfig {
ads.addAll(Json.safeList(object, "ads"));
}
- private void loadJar(String spider) throws Exception {
- Request request = new Request.Builder().url(spider).build();
- Response response = OKHttp.get().client().newCall(request).execute();
- loader.load(response.body().bytes());
+ private void parseJar(String spider) throws Exception {
+ if (spider.startsWith("file://")) {
+ loader.load(FileUtil.getLocal(spider));
+ } else if (Patterns.WEB_URL.matcher(spider).matches()) {
+ Response response = OKHttp.get().client().newCall(new Request.Builder().url(spider).build()).execute();
+ FileUtil.write(FileUtil.getJar(), response.body().bytes());
+ loader.load(FileUtil.getJar());
+ }
}
public Spider getCSP(Site site) {
diff --git a/app/src/main/java/com/fongmi/bear/net/Callback.java b/app/src/main/java/com/fongmi/bear/net/Callback.java
index 113a5fbf3..5dd4de214 100644
--- a/app/src/main/java/com/fongmi/bear/net/Callback.java
+++ b/app/src/main/java/com/fongmi/bear/net/Callback.java
@@ -21,6 +21,6 @@ public abstract class Callback implements okhttp3.Callback {
}
@Override
- public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
}
}
diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
index f19d582fd..05bbfcc26 100644
--- a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
+++ b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
@@ -17,7 +17,6 @@ import com.fongmi.bear.bean.Result;
import com.fongmi.bear.bean.Vod;
import com.fongmi.bear.databinding.ActivityHomeBinding;
import com.fongmi.bear.model.SiteViewModel;
-import com.fongmi.bear.player.Players;
import com.fongmi.bear.ui.custom.CustomRowPresenter;
import com.fongmi.bear.ui.custom.CustomSelector;
import com.fongmi.bear.ui.presenter.FuncPresenter;
@@ -129,10 +128,4 @@ public class HomeActivity extends BaseActivity implements VodPresenter.OnClickLi
if (resultCode != RESULT_OK) return;
getVideo();
}
-
- @Override
- protected void onDestroy() {
- Players.get().release();
- super.onDestroy();
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
index 64152b065..aa1a9bc19 100644
--- a/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
+++ b/app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
@@ -1,18 +1,25 @@
package com.fongmi.bear.ui.activity;
+import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.util.Patterns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AlertDialog;
+import androidx.core.content.ContextCompat;
import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.leanback.widget.ItemBridgeAdapter;
import androidx.viewbinding.ViewBinding;
import com.fongmi.bear.ApiConfig;
+import com.fongmi.bear.R;
import com.fongmi.bear.bean.Site;
import com.fongmi.bear.databinding.ActivitySettingBinding;
import com.fongmi.bear.databinding.DialogConfigBinding;
@@ -31,6 +38,11 @@ public class SettingActivity extends BaseActivity {
activity.startActivityForResult(new Intent(activity, SettingActivity.class), 1000);
}
+ private final ActivityResultLauncher permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
+ if (!isGranted) Notify.show(R.string.error_config_get);
+ else loadConfig();
+ });
+
@Override
protected ViewBinding getBinding() {
return mBinding = ActivitySettingBinding.inflate(getLayoutInflater());
@@ -57,7 +69,7 @@ public class SettingActivity extends BaseActivity {
mBinding.url.setText(Prefers.getUrl());
Notify.progress(this);
ApiConfig.get().clear();
- loadConfig();
+ checkUrl();
});
bindingDialog.url.setOnEditorActionListener((textView, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
@@ -65,6 +77,20 @@ public class SettingActivity extends BaseActivity {
});
}
+ private void checkUrl() {
+ if (Patterns.WEB_URL.matcher(Prefers.getUrl()).matches()) {
+ loadConfig();
+ return;
+ }
+ if (Prefers.getUrl().startsWith("file://")) {
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
+ loadConfig();
+ } else {
+ permissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
+ }
+ }
+ }
+
private void loadConfig() {
ApiConfig.get().loadConfig(new Callback() {
@Override
diff --git a/app/src/main/java/com/fongmi/bear/utils/FileUtil.java b/app/src/main/java/com/fongmi/bear/utils/FileUtil.java
index 78932b2c1..fc736f2af 100644
--- a/app/src/main/java/com/fongmi/bear/utils/FileUtil.java
+++ b/app/src/main/java/com/fongmi/bear/utils/FileUtil.java
@@ -1,11 +1,18 @@
package com.fongmi.bear.utils;
+import android.os.Environment;
+
import com.fongmi.bear.App;
import java.io.File;
+import java.io.FileOutputStream;
public class FileUtil {
+ public static String getRootPath() {
+ return Environment.getExternalStorageDirectory().getAbsolutePath();
+ }
+
public static File getCacheDir() {
return App.get().getExternalCacheDir();
}
@@ -22,7 +29,14 @@ public class FileUtil {
return getCacheFile("spider.jar");
}
- public static String getJarPath() {
- return getJar().getAbsolutePath();
+ public static File getLocal(String path) {
+ return new File(path.replace("file:/", getRootPath()));
+ }
+
+ public static void write(File file, byte[] data) throws Exception {
+ FileOutputStream fos = new FileOutputStream(file);
+ fos.write(data);
+ fos.flush();
+ fos.close();
}
}
diff --git a/app/src/main/java/com/github/catvod/crawler/JarLoader.java b/app/src/main/java/com/github/catvod/crawler/JarLoader.java
index 0cc5795fe..087ea23ba 100644
--- a/app/src/main/java/com/github/catvod/crawler/JarLoader.java
+++ b/app/src/main/java/com/github/catvod/crawler/JarLoader.java
@@ -7,7 +7,7 @@ import com.fongmi.bear.utils.FileUtil;
import org.json.JSONObject;
-import java.io.FileOutputStream;
+import java.io.File;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -26,22 +26,10 @@ public class JarLoader {
this.spiders = new ConcurrentHashMap<>();
}
- public void writeJar(byte[] jarData) {
- try {
- FileOutputStream fos = new FileOutputStream(FileUtil.getJar());
- fos.write(jarData);
- fos.flush();
- fos.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public void load(byte[] jarData) throws Exception {
+ public void load(File file) throws Exception {
spiders.clear();
proxyFun = null;
- writeJar(jarData);
- classLoader = new DexClassLoader(FileUtil.getJarPath(), FileUtil.getCachePath(), null, App.get().getClassLoader());
+ classLoader = new DexClassLoader(file.getAbsolutePath(), FileUtil.getCachePath(), null, App.get().getClassLoader());
Class> classInit = classLoader.loadClass("com.github.catvod.spider.Init");
Class> classProxy = classLoader.loadClass("com.github.catvod.spider.Proxy");
if (classInit != null) {