diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java index 38b3bb904..b100af55c 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java @@ -30,21 +30,20 @@ import com.google.gson.JsonObject; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class LiveConfig { - private Live home; - private Config config; - private List lives; - private List rules; - private List ads; - private ExecutorService executor; - - private boolean sync; + private volatile Live home; + private volatile Config config; + private volatile List lives; + private volatile List rules; + private volatile List ads; + private volatile Future future; + private volatile boolean sync; private static class Loader { static volatile LiveConfig INSTANCE = new LiveConfig(); @@ -114,14 +113,15 @@ public class LiveConfig { } public void load(Callback callback) { - if (executor != null) executor.shutdownNow(); - executor = Executors.newSingleThreadExecutor(); - executor.execute(() -> loadConfig(callback)); + if (future != null && !future.isDone()) future.cancel(true); + future = App.submit(() -> loadConfig(callback)); } private void loadConfig(Callback callback) { try { - parseConfig(Decoder.getJson(UrlUtil.convert(config.getUrl())), callback); + String text = Decoder.getJson(UrlUtil.convert(config.getUrl())); + if (!Json.isObj(text)) parseText(text, callback); + else checkJson(Json.parse(text).getAsJsonObject(), callback); } catch (Throwable e) { if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); @@ -129,18 +129,10 @@ public class LiveConfig { } } - private void parseConfig(String text, Callback callback) { - if (!Json.isObj(text)) { - parseText(text, callback); - } else { - checkJson(Json.parse(text).getAsJsonObject(), callback); - } - } - private void parseText(String text, Callback callback) { Live live = new Live(parseName(config.getUrl()), config.getUrl()).sync(); LiveParser.text(live, text); - lives.add(live); + lives = Arrays.asList(live); setHome(live, true); App.post(callback::success); } @@ -177,7 +169,6 @@ public class LiveConfig { try { initLive(object); initOther(object); - config.json(object.toString()).update(); } catch (Throwable e) { e.printStackTrace(); } finally { @@ -186,16 +177,14 @@ public class LiveConfig { } private void initLive(JsonObject object) { + List lives = new ArrayList<>(); String spider = Json.safeString(object, "spider"); BaseLoader.get().parseJar(spider, false); for (JsonElement element : Json.safeListElement(object, "lives")) { - Live live = Live.objectFrom(element); - if (lives.contains(live)) continue; - live.setApi(UrlUtil.convert(live.getApi())); - live.setExt(UrlUtil.convert(live.getExt())); - live.setJar(parseJar(live, spider)); - lives.add(live.sync()); + Live live = Live.objectFrom(element, spider); + if (!lives.contains(live)) lives.add(live); } + setLives(lives); for (Live live : lives) { if (live.getName().equals(config.getHome())) { setHome(live, true); @@ -212,10 +201,6 @@ public class LiveConfig { setAds(Json.safeListString(object, "ads")); } - private String parseJar(Live live, String spider) { - return live.getJar().isEmpty() ? spider : live.getJar(); - } - private void bootLive() { Setting.putBootLive(false); LiveActivity.start(App.get()); @@ -268,6 +253,14 @@ public class LiveConfig { return sync || TextUtils.isEmpty(config.getUrl()) || url.equals(config.getUrl()); } + public List getLives() { + return lives == null ? lives = new ArrayList<>() : lives; + } + + private void setLives(List lives) { + this.lives = lives; + } + public List getRules() { return rules == null ? Collections.emptyList() : rules; } @@ -297,10 +290,6 @@ public class LiveConfig { this.ads = ads; } - public List getLives() { - return lives == null ? lives = new ArrayList<>() : lives; - } - public Config getConfig() { return config == null ? Config.live() : config; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java index 4d764e932..5f948a3f2 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java @@ -229,6 +229,22 @@ public class VodConfig { if (sync) LiveConfig.get().clear().config(temp.update()).parse(object); } + public List getSites() { + return sites == null ? Collections.emptyList() : sites; + } + + private void setSites(List sites) { + this.sites = sites; + } + + public List getParses() { + return parses == null ? Collections.emptyList() : parses; + } + + private void setParses(List parses) { + this.parses = parses; + } + public List getDoh() { List items = Doh.get(App.get()); if (doh == null) return items; @@ -249,14 +265,6 @@ public class VodConfig { this.rules = rules; } - public List getSites() { - return sites == null ? Collections.emptyList() : sites; - } - - public List getParses() { - return parses == null ? Collections.emptyList() : parses; - } - public List getParses(int type) { List items = new ArrayList<>(); for (Parse item : getParses()) if (item.getType() == type) items.add(item); @@ -279,14 +287,6 @@ public class VodConfig { OkHttp.selector().addAll(proxy); } - public void setSites(List sites) { - this.sites = sites; - } - - public void setParses(List parses) { - this.parses = parses; - } - public List getFlags() { return flags == null ? Collections.emptyList() : flags; } diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java index 74a11df02..cce0c3278 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java @@ -23,15 +23,13 @@ import com.github.catvod.utils.Path; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class WallConfig { - private Config config; - private ExecutorService executor; - - private boolean sync; + private volatile Config config; + private volatile Future future; + private volatile boolean sync; private static class Loader { static volatile WallConfig INSTANCE = new WallConfig(); @@ -78,9 +76,8 @@ public class WallConfig { } public void load(Callback callback) { - if (executor != null) executor.shutdownNow(); - executor = Executors.newSingleThreadExecutor(); - executor.execute(() -> loadConfig(callback)); + if (future != null && !future.isDone()) future.cancel(true); + future = App.submit(() -> loadConfig(callback)); } private void loadConfig(Callback callback) { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index 5402cd577..b90cb4f66 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -14,17 +14,15 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.loader.BaseLoader; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.gson.ExtAdapter; +import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.crawler.Spider; import com.github.catvod.utils.Json; import com.google.common.net.HttpHeaders; import com.google.gson.JsonElement; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; -import java.lang.reflect.Type; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -117,14 +115,16 @@ public class Live { @Ignore private int width; - public static Live objectFrom(JsonElement element) { - return App.gson().fromJson(element, Live.class); - } - - public static List arrayFrom(String str) { - Type listType = new TypeToken>() {}.getType(); - List items = App.gson().fromJson(str, listType); - return items == null ? Collections.emptyList() : items; + public static Live objectFrom(JsonElement element, String spider) { + try { + Live live = App.gson().fromJson(element, Live.class); + if (live.getJar().isEmpty()) live.setJar(spider); + live.setApi(UrlUtil.convert(live.getApi())); + live.setExt(UrlUtil.convert(live.getExt())); + return live.sync(); + } catch (Exception e) { + return new Live(); + } } public static Live get(String name) {