Optimize live config load

pull/605/head
jhengazuki 5 months ago
parent 591ba5ce80
commit 3130cccd0a
  1. 65
      app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java
  2. 32
      app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java
  3. 15
      app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java
  4. 22
      app/src/main/java/com/fongmi/android/tv/bean/Live.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<Live> lives;
private List<Rule> rules;
private List<String> ads;
private ExecutorService executor;
private boolean sync;
private volatile Live home;
private volatile Config config;
private volatile List<Live> lives;
private volatile List<Rule> rules;
private volatile List<String> 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<Live> 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<Live> getLives() {
return lives == null ? lives = new ArrayList<>() : lives;
}
private void setLives(List<Live> lives) {
this.lives = lives;
}
public List<Rule> getRules() {
return rules == null ? Collections.emptyList() : rules;
}
@ -297,10 +290,6 @@ public class LiveConfig {
this.ads = ads;
}
public List<Live> getLives() {
return lives == null ? lives = new ArrayList<>() : lives;
}
public Config getConfig() {
return config == null ? Config.live() : config;
}

@ -229,6 +229,22 @@ public class VodConfig {
if (sync) LiveConfig.get().clear().config(temp.update()).parse(object);
}
public List<Site> getSites() {
return sites == null ? Collections.emptyList() : sites;
}
private void setSites(List<Site> sites) {
this.sites = sites;
}
public List<Parse> getParses() {
return parses == null ? Collections.emptyList() : parses;
}
private void setParses(List<Parse> parses) {
this.parses = parses;
}
public List<Doh> getDoh() {
List<Doh> items = Doh.get(App.get());
if (doh == null) return items;
@ -249,14 +265,6 @@ public class VodConfig {
this.rules = rules;
}
public List<Site> getSites() {
return sites == null ? Collections.emptyList() : sites;
}
public List<Parse> getParses() {
return parses == null ? Collections.emptyList() : parses;
}
public List<Parse> getParses(int type) {
List<Parse> 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<Site> sites) {
this.sites = sites;
}
public void setParses(List<Parse> parses) {
this.parses = parses;
}
public List<String> getFlags() {
return flags == null ? Collections.emptyList() : flags;
}

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

@ -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<Live> arrayFrom(String str) {
Type listType = new TypeToken<List<Live>>() {}.getType();
List<Live> 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) {

Loading…
Cancel
Save