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 4d73daad5..dcfcd2bbb 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 @@ -28,12 +28,14 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; public class VodConfig { private static final String TAG = VodConfig.class.getSimpleName(); + private final AtomicInteger taskId = new AtomicInteger(0); private Site home; private String wall; @@ -101,103 +103,114 @@ public class VodConfig { } public void load(Callback callback) { + int id = taskId.incrementAndGet(); if (future != null && !future.isDone()) future.cancel(true); - future = App.submit(() -> loadConfig(callback)); + future = App.submit(() -> loadConfig(id, config, callback)); callback.start(); } - private void loadConfig(Callback callback) { + private void loadConfig(int id, Config config, Callback callback) { try { OkHttp.cancel(TAG); Server.get().start(); String json = Decoder.getJson(UrlUtil.convert(config.getUrl()), TAG); - checkJson(Json.parse(json).getAsJsonObject(), callback); - config.update(); + checkJson(id, config, callback, Json.parse(json).getAsJsonObject()); } catch (Throwable e) { + e.printStackTrace(); if (isCanceled(e)) return; + if (taskId.get() != id) return; if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); - e.printStackTrace(); } } - private void checkJson(JsonObject object, Callback callback) { + private void checkJson(int id, Config config, Callback callback, JsonObject object) { if (object.has("msg")) { App.post(() -> callback.error(object.get("msg").getAsString())); } else if (object.has("urls")) { - parseDepot(object, callback); + parseDepot(id, config, callback, object); } else { - parseConfig(object, callback); + parseConfig(id, config, callback, object); } } - private void parseDepot(JsonObject object, Callback callback) { + private void parseDepot(int id, Config config, Callback callback, JsonObject object) { List items = Depot.arrayFrom(object.getAsJsonArray("urls").toString()); List configs = new ArrayList<>(); for (Depot item : items) configs.add(Config.find(item, 0)); + loadConfig(id, this.config = configs.get(0), callback); Config.delete(config.getUrl()); - config = configs.get(0); - loadConfig(callback); } - private void parseConfig(JsonObject object, Callback callback) { + private void parseConfig(int id, Config config, Callback callback, JsonObject object) { try { - initSite(object); - initParse(object); - initOther(object); + initList(object); + initLive(config, object); + initWall(config, object); + initSite(config, object); + initParse(config, object); config.logo(Json.safeString(object, "logo")); String notice = Json.safeString(object, "notice"); - if (!Json.isEmpty(object, "lives")) initLive(object); + if (taskId.get() != id) return; App.post(() -> callback.success(notice)); App.post(callback::success); + config.update(); } catch (Throwable e) { e.printStackTrace(); + if (taskId.get() != id) return; App.post(() -> callback.error(Notify.getError(R.string.error_config_parse, e))); } } - private void initSite(JsonObject object) { + private void initList(JsonObject object) { + setHeaders(Header.arrayFrom(object.getAsJsonArray("headers"))); + setProxy(Proxy.arrayFrom(object.getAsJsonArray("proxy"))); + setRules(Rule.arrayFrom(object.getAsJsonArray("rules"))); + setDoh(Doh.arrayFrom(object.getAsJsonArray("doh"))); + setFlags(Json.safeListString(object, "flags")); + setHosts(Json.safeListString(object, "hosts")); + setAds(Json.safeListString(object, "ads")); + } + + private void initLive(Config config, JsonObject object) { + if (Json.isEmpty(object, "lives")) return; + Config temp = Config.find(config, 1).save(); + boolean sync = LiveConfig.get().needSync(config.getUrl()); + if (sync) LiveConfig.get().config(temp.update()).parse(object); + } + + private void initWall(Config config, JsonObject object) { + if (Json.isEmpty(object, "wallpaper")) return; + this.wall = Json.safeString(object, "wallpaper"); + Config temp = Config.find(wall, config.getName(), 2).save(); + boolean sync = WallConfig.get().needSync(wall); + if (sync) WallConfig.get().config(temp.update()); + } + + private void initSite(Config config, JsonObject object) { String spider = Json.safeString(object, "spider"); BaseLoader.get().parseJar(spider, true); setSites(Json.safeListElement(object, "sites").stream().map(element -> Site.objectFrom(element, spider)).distinct().collect(Collectors.toCollection(ArrayList::new))); Map items = Site.findAll().stream().collect(Collectors.toMap(Site::getKey, Function.identity())); + if (!getSites().isEmpty()) setHome(config, getSites().get(0), false); for (Site site : getSites()) { Site item = items.get(site.getKey()); if (item != null) site.sync(item); - if (site.getKey().equals(config.getHome())) setHome(site, false); + if (site.getKey().equals(config.getHome())) setHome(config, site, false); } } - private void initParse(JsonObject object) { + private void initParse(Config config, JsonObject object) { setParses(Json.safeListElement(object, "parses").stream().map(Parse::objectFrom).distinct().collect(Collectors.toCollection(ArrayList::new))); + if (!getParses().isEmpty()) setParse(config, getParses().get(0), false); for (Parse parse : getParses()) { if (parse.getName().equals(config.getParse()) && parse.getType() > 1) { - setParse(parse, false); + setParse(config, parse, false); break; } } } - private void initOther(JsonObject object) { - if (!parses.isEmpty()) parses.add(0, Parse.god()); - if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0), false); - if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0), false); - setHeaders(Header.arrayFrom(object.getAsJsonArray("headers"))); - setProxy(Proxy.arrayFrom(object.getAsJsonArray("proxy"))); - setRules(Rule.arrayFrom(object.getAsJsonArray("rules"))); - setDoh(Doh.arrayFrom(object.getAsJsonArray("doh"))); - setFlags(Json.safeListString(object, "flags")); - setHosts(Json.safeListString(object, "hosts")); - setWall(Json.safeString(object, "wallpaper")); - setAds(Json.safeListString(object, "ads")); - } - - private void initLive(JsonObject object) { - Config temp = Config.find(config, 1).save(); - boolean sync = LiveConfig.get().needSync(config.getUrl()); - if (sync) LiveConfig.get().config(temp.update()).parse(object); - } - public List getSites() { return sites == null ? Collections.emptyList() : sites; } @@ -211,6 +224,7 @@ public class VodConfig { } private void setParses(List parses) { + if (!parses.isEmpty()) parses.add(0, Parse.god()); this.parses = parses; } @@ -303,10 +317,10 @@ public class VodConfig { } public void setParse(Parse parse) { - setParse(parse, true); + setParse(getConfig(), parse, true); } - public void setParse(Parse parse, boolean save) { + public void setParse(Config config, Parse parse, boolean save) { this.parse = parse; this.parse.setActivated(true); config.parse(parse.getName()); @@ -315,21 +329,14 @@ public class VodConfig { } public void setHome(Site site) { - setHome(site, true); + setHome(getConfig(), site, true); } - public void setHome(Site site, boolean save) { + public void setHome(Config config, Site site, boolean save) { home = site; home.setActivated(true); config.home(home.getKey()); if (save) config.save(); getSites().forEach(item -> item.setActivated(home)); } - - private void setWall(String wall) { - this.wall = wall; - boolean sync = !TextUtils.isEmpty(wall) && WallConfig.get().needSync(wall); - Config temp = Config.find(wall, config.getName(), 2).save(); - if (sync) WallConfig.get().config(temp.update()); - } } diff --git a/catvod/src/main/java/com/github/catvod/utils/Json.java b/catvod/src/main/java/com/github/catvod/utils/Json.java index 961a51955..81d012cb4 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Json.java +++ b/catvod/src/main/java/com/github/catvod/utils/Json.java @@ -45,7 +45,12 @@ public class Json { } public static boolean isEmpty(JsonObject obj, String key) { - return !obj.has(key) || !obj.get(key).isJsonArray() || obj.get(key).getAsJsonArray().isEmpty(); + if (!obj.has(key)) return true; + JsonElement element = obj.get(key); + if (element.isJsonNull()) return true; + if (element.isJsonArray()) return element.getAsJsonArray().isEmpty(); + if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isString()) return element.getAsString().trim().isEmpty(); + return true; } public static String safeString(JsonObject obj, String key) {