Support local config

pull/5/head
FongMi 4 years ago
parent a242c32475
commit a228957b6e
  1. 1
      app/src/main/AndroidManifest.xml
  2. 77
      app/src/main/java/com/fongmi/bear/ApiConfig.java
  3. 2
      app/src/main/java/com/fongmi/bear/net/Callback.java
  4. 7
      app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
  5. 28
      app/src/main/java/com/fongmi/bear/ui/activity/SettingActivity.java
  6. 18
      app/src/main/java/com/fongmi/bear/utils/FileUtil.java
  7. 18
      app/src/main/java/com/github/catvod/crawler/JarLoader.java

@ -4,6 +4,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-feature

@ -4,13 +4,12 @@ import android.os.Handler;
import android.os.Looper;
import android.util.Patterns;
import androidx.annotation.NonNull;
import com.fongmi.bear.bean.Live;
import com.fongmi.bear.bean.Parse;
import com.fongmi.bear.bean.Site;
import com.fongmi.bear.net.Callback;
import com.fongmi.bear.net.OKHttp;
import com.fongmi.bear.utils.FileUtil;
import com.fongmi.bear.utils.Json;
import com.fongmi.bear.utils.Prefers;
import com.github.catvod.crawler.JarLoader;
@ -18,9 +17,11 @@ import com.github.catvod.crawler.Spider;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.stream.JsonReader;
import org.json.JSONObject;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@ -28,7 +29,6 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Request;
import okhttp3.Response;
@ -72,29 +72,46 @@ public class ApiConfig {
}
public void loadConfig(Callback callback) {
if (Prefers.getUrl().isEmpty() || !Patterns.WEB_URL.matcher(Prefers.getUrl()).matches()) {
handler.post(() -> 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) {

@ -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) {
}
}

@ -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();
}
}

@ -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<String> 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

@ -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();
}
}

@ -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) {

Loading…
Cancel
Save