Support multiple-depot

pull/123/head
FongMi 3 years ago
parent 8587144d88
commit ab6dc3d211
  1. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  2. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java
  3. 22
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  4. 40
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  5. 40
      app/src/main/java/com/fongmi/android/tv/bean/Config.java
  6. 10
      app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java
  7. 3
      app/src/main/java/com/fongmi/android/tv/db/dao/ConfigDao.java

@ -136,11 +136,13 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
Notify.dismiss();
RefreshEvent.video();
RefreshEvent.history();
mBinding.vodUrl.setText(ApiConfig.getUrl());
mBinding.liveUrl.setText(LiveConfig.getUrl());
mBinding.wallUrl.setText(WallConfig.getUrl());
break;
case 1:
Notify.dismiss();
mBinding.liveUrl.setText(LiveConfig.getUrl());
break;
case 2:
mBinding.wallUrl.setText(WallConfig.getUrl());

@ -56,7 +56,7 @@ public class ConfigAdapter extends RecyclerView.Adapter<ConfigAdapter.ViewHolder
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Config item = mItems.get(position);
holder.binding.text.setText(item.getUrl());
holder.binding.text.setText(item.getDesc());
holder.binding.text.setOnClickListener(v -> mListener.onTextClick(item));
holder.binding.delete.setOnClickListener(v -> mListener.onDeleteClick(item));
}

@ -5,6 +5,7 @@ import android.text.TextUtils;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Depot;
import com.fongmi.android.tv.bean.Parse;
import com.fongmi.android.tv.bean.Site;
import com.fongmi.android.tv.net.Callback;
@ -118,7 +119,7 @@ public class ApiConfig {
private void loadConfig(Callback callback) {
try {
parseConfig(JsonParser.parseString(Decoder.getJson(config.getUrl())).getAsJsonObject(), callback);
checkJson(JsonParser.parseString(Decoder.getJson(config.getUrl())).getAsJsonObject(), callback);
} catch (Exception e) {
if (config.getUrl().isEmpty()) App.post(() -> callback.error(0));
else loadCache(callback);
@ -128,10 +129,27 @@ public class ApiConfig {
}
private void loadCache(Callback callback) {
if (!TextUtils.isEmpty(config.getJson())) parseConfig(JsonParser.parseString(config.getJson()).getAsJsonObject(), callback);
if (!TextUtils.isEmpty(config.getJson())) checkJson(JsonParser.parseString(config.getJson()).getAsJsonObject(), callback);
else App.post(() -> callback.error(R.string.error_config_get));
}
private void checkJson(JsonObject object, Callback callback) {
if (object.has("urls")) {
parseDepot(object, callback);
} else {
parseConfig(object, callback);
}
}
private void parseDepot(JsonObject object, Callback callback) {
List<Depot> items = Depot.arrayFrom(object.getAsJsonArray("urls").toString());
List<Config> configs = new ArrayList<>();
for (Depot item : items) configs.add(Config.find(item, 0));
Config.delete(config.getUrl());
config = configs.get(0);
loadConfig(callback);
}
private void parseConfig(JsonObject object, Callback callback) {
try {
initSite(object);

@ -5,6 +5,7 @@ import com.fongmi.android.tv.Product;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Depot;
import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.bean.Keep;
import com.fongmi.android.tv.bean.Live;
@ -79,32 +80,57 @@ public class LiveConfig {
private void loadConfig(Callback callback) {
try {
parseConfig(Decoder.getJson(config.getUrl()));
App.post(callback::success);
parseConfig(Decoder.getJson(config.getUrl()), callback);
} catch (Exception e) {
e.printStackTrace();
App.post(() -> callback.error(config.getUrl().isEmpty() ? 0 : R.string.error_config_get));
}
}
private void parseConfig(String json) {
if (Json.invalid(json)) parse(json);
else parse(JsonParser.parseString(json).getAsJsonObject());
private void parseConfig(String text, Callback callback) {
if (Json.invalid(text)) {
parseText(text, callback);
} else {
checkJson(JsonParser.parseString(text).getAsJsonObject(), callback);
}
}
private void parse(String text) {
private void parseText(String text, Callback callback) {
Live live = new Live(config.getUrl());
LiveParser.text(live, text);
App.post(callback::success);
lives.remove(live);
lives.add(live);
setHome(live);
}
public void parse(JsonObject object) {
private void checkJson(JsonObject object, Callback callback) {
if (object.has("urls")) {
parseDepot(object, callback);
} else {
parseConfig(object, callback);
}
}
public void parseDepot(JsonObject object, Callback callback) {
List<Depot> items = Depot.arrayFrom(object.getAsJsonArray("urls").toString());
List<Config> configs = new ArrayList<>();
for (Depot item : items) configs.add(Config.find(item, 1));
Config.delete(config.getUrl());
config = configs.get(0);
loadConfig(callback);
}
public void parseConfig(JsonObject object, Callback callback) {
if (!object.has("lives")) return;
for (JsonElement element : Json.safeListElement(object, "lives")) parse(Live.objectFrom(element).check());
if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0));
if (home.isBoot()) App.post(Product::bootLive);
if (callback != null) App.post(callback::success);
}
public void parse(JsonObject object) {
parseConfig(object, null);
}
private void parse(Live live) {

@ -1,5 +1,7 @@
package com.fongmi.android.tv.bean;
import android.text.TextUtils;
import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;
@ -18,15 +20,21 @@ public class Config {
private long time;
private String url;
private String json;
private String name;
private String home;
private String parse;
public static Config create(String url, int type) {
return new Config(url, type);
return new Config(url, "", type);
}
public static Config create(String url, String name, int type) {
return new Config(url, name, type);
}
public Config(String url, int type) {
public Config(String url, String name, int type) {
this.url = url;
this.name = name;
this.type = type;
this.id = (int) insert();
}
@ -55,6 +63,14 @@ public class Config {
this.url = url;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJson() {
return json;
}
@ -92,6 +108,11 @@ public class Config {
return this;
}
public Config name(String name) {
setName(name);
return this;
}
public Config json(String json) {
setJson(json);
return this;
@ -107,10 +128,20 @@ public class Config {
return this;
}
public String getDesc() {
if (!TextUtils.isEmpty(getName())) return getName();
if (!TextUtils.isEmpty(getUrl())) return getUrl();
return "";
}
public static List<Config> getAll(int type) {
return AppDatabase.get().getConfigDao().findByType(type);
}
public static void delete(String url) {
AppDatabase.get().getConfigDao().delete(url);
}
public static void delete(String url, int type) {
if (type == 2) AppDatabase.get().getConfigDao().delete(type);
else AppDatabase.get().getConfigDao().delete(url, type);
@ -140,6 +171,11 @@ public class Config {
return item == null ? create(url, type) : item.type(type);
}
public static Config find(Depot depot, int type) {
Config item = AppDatabase.get().getConfigDao().find(depot.getUrl(), type);
return item == null ? create(depot.getUrl(), depot.getName(), type) : item.type(type).name(depot.getName());
}
public long insert() {
return getUrl().isEmpty() ? -1 : AppDatabase.get().getConfigDao().insert(this);
}

@ -24,7 +24,7 @@ import com.fongmi.android.tv.db.dao.TrackDao;
@Database(entities = {Keep.class, Site.class, Track.class, Config.class, History.class}, version = AppDatabase.VERSION)
public abstract class AppDatabase extends RoomDatabase {
public static final int VERSION = 19;
public static final int VERSION = 20;
public static final String SYMBOL = "@@@";
private static volatile AppDatabase instance;
@ -44,6 +44,7 @@ public abstract class AppDatabase extends RoomDatabase {
.addMigrations(MIGRATION_16_17)
.addMigrations(MIGRATION_17_18)
.addMigrations(MIGRATION_18_19)
.addMigrations(MIGRATION_19_20)
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.build();
@ -118,4 +119,11 @@ public abstract class AppDatabase extends RoomDatabase {
database.execSQL("ALTER TABLE Site ADD COLUMN changeable INTEGER DEFAULT 1");
}
};
static final Migration MIGRATION_19_20 = new Migration(19, 20) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE Config ADD COLUMN name TEXT DEFAULT NULL");
}
};
}

@ -25,6 +25,9 @@ public abstract class ConfigDao extends BaseDao<Config> {
@Query("DELETE FROM Config WHERE url = :url AND type = :type")
public abstract void delete(String url, int type);
@Query("DELETE FROM Config WHERE url = :url")
public abstract void delete(String url);
@Query("DELETE FROM Config WHERE type = :type")
public abstract void delete(int type);
}

Loading…
Cancel
Save