From 3e5f2919f86d47610a96fed44063f189283fe9a4 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 3 Aug 2022 23:51:12 +0800 Subject: [PATCH] Fix some play bug --- .../tv/ui/activity/DetailActivity.java | 7 +- .../android/tv/ui/activity/VodActivity.java | 2 +- .../android/tv/ui/fragment/VodFragment.java | 5 +- .../com/fongmi/android/tv/bean/Result.java | 67 +++++++++++++++++++ .../android/tv/model/SiteViewModel.java | 28 ++++---- .../com/fongmi/android/tv/player/Players.java | 20 +++--- 6 files changed, 93 insertions(+), 36 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index c58c0fba3..bf0054f2c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -171,12 +171,9 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { private void setViewModel() { mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); - mSiteViewModel.player.observe(this, object -> { - if (object != null) Players.get().setMediaSource(object); - }); mSiteViewModel.result.observe(this, result -> { - if (result == null) return; - if (result.getList().isEmpty()) mBinding.progressLayout.showErrorText(); + if (result.getUrl().length() > 0) Players.get().setMediaSource(result); + else if (result.getList().isEmpty()) mBinding.progressLayout.showErrorText(); else setDetail(result.getList().get(0)); }); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java index abf730b4a..9612ca04e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java @@ -40,7 +40,7 @@ public class VodActivity extends BaseActivity { } public static void start(Activity activity, Result result) { - if (result == null || result.getTypes().isEmpty()) return; + if (result.getTypes().isEmpty()) return; Intent intent = new Intent(activity, VodActivity.class); intent.putExtra("result", result.toString()); activity.startActivity(intent); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index d2818382f..ece440f86 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.ui.fragment; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -93,8 +92,8 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo private void setViewModel() { mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mSiteViewModel.result.observe(getViewLifecycleOwner(), result -> { - mScroller.endLoading(result == null || result.getList().isEmpty()); - if (result != null) addVideo(result); + mScroller.endLoading(result.getList().isEmpty()); + if (result.getList().size() > 0) addVideo(result); }); } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index c53de544e..9fac554de 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -1,5 +1,7 @@ package com.fongmi.android.tv.bean; +import android.text.TextUtils; + import androidx.annotation.NonNull; import com.google.gson.Gson; @@ -39,6 +41,19 @@ public class Result { @SerializedName("filters") private LinkedHashMap> filters; + @SerializedName("playUrl") + private String playUrl; + @SerializedName("header") + private String header; + @SerializedName("parse") + private String parse; + @SerializedName("flag") + private String flag; + @SerializedName("jx") + private String jx; + @SerializedName("url") + private String url; + public static Result fromJson(String str) { try { Type type = new TypeToken>>() {}.getType(); @@ -60,6 +75,10 @@ public class Result { } } + public static Result objectFrom(String str) { + return new Gson().fromJson(str, Result.class); + } + public List getTypes() { return types == null ? Collections.emptyList() : types; } @@ -80,6 +99,54 @@ public class Result { return filters == null ? new LinkedHashMap<>() : filters; } + public String getPlayUrl() { + return TextUtils.isEmpty(playUrl) ? "" : playUrl; + } + + public void setPlayUrl(String playUrl) { + this.playUrl = playUrl; + } + + public String getHeader() { + return TextUtils.isEmpty(header) ? "" : header; + } + + public void setHeader(String header) { + this.header = header; + } + + public String getParse() { + return TextUtils.isEmpty(parse) ? "1" : parse; + } + + public void setParse(String parse) { + this.parse = parse; + } + + public String getFlag() { + return TextUtils.isEmpty(flag) ? "" : flag; + } + + public void setFlag(String flag) { + this.flag = flag; + } + + public String getJx() { + return TextUtils.isEmpty(jx) ? "0" : jx; + } + + public void setJx(String jx) { + this.jx = jx; + } + + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url; + } + + public void setUrl(String url) { + this.url = url; + } + @NonNull @Override public String toString() { diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 146033c29..280d2392a 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -10,8 +10,6 @@ import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.utils.Utils; import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.SpiderDebug; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import java.util.HashMap; import java.util.List; @@ -24,13 +22,11 @@ import okhttp3.HttpUrl; public class SiteViewModel extends ViewModel { - public MutableLiveData player; public MutableLiveData result; public ExecutorService service; public SiteViewModel() { this.result = new MutableLiveData<>(); - this.player = new MutableLiveData<>(); } public MutableLiveData getResult() { @@ -105,33 +101,33 @@ public class SiteViewModel extends ViewModel { public void playerContent(String key, String flag, String id) { Site site = ApiConfig.get().getSite(key); - execute(player, () -> { + execute(result, () -> { if (site.getType() == 3) { Spider spider = ApiConfig.get().getCSP(site); String playerContent = spider.playerContent(flag, id, ApiConfig.get().getFlags()); SpiderDebug.log(playerContent); - JsonObject object = JsonParser.parseString(playerContent).getAsJsonObject(); - if (!object.has("flag")) object.addProperty("flag", flag); - return object; + Result result = Result.objectFrom(playerContent); + if (result.getFlag().isEmpty()) result.setFlag(flag); + return result; } else { - JsonObject object = new JsonObject(); - object.addProperty("url", id); - object.addProperty("flag", flag); - object.addProperty("playUrl", site.getPlayerUrl()); - object.addProperty("parse", Utils.isVideoFormat(id) ? "0" : "1"); - return object; + Result result = new Result(); + result.setUrl(id); + result.setFlag(flag); + result.setPlayUrl(site.getPlayerUrl()); + result.setParse(Utils.isVideoFormat(id) ? "0" : "1"); + return result; } }); } - private void execute(MutableLiveData result, Callable callable) { + private void execute(MutableLiveData result, Callable callable) { if (service != null) service.shutdownNow(); service = Executors.newFixedThreadPool(2); service.execute(() -> { try { if (!Thread.interrupted()) result.postValue(service.submit(callable).get(5, TimeUnit.SECONDS)); } catch (Exception e) { - if (!Thread.interrupted()) result.postValue(null); + if (!Thread.interrupted()) result.postValue(new Result()); e.printStackTrace(); } }); diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 40ed8ee15..ac3c70db3 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import com.fongmi.android.tv.App; import com.fongmi.android.tv.R; +import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.ui.custom.CustomWebView; import com.fongmi.android.tv.utils.ResUtil; @@ -89,23 +90,20 @@ public class Players implements Player.Listener { return exoPlayer.isPlaying(); } - public void setMediaSource(JsonObject object) { - String parse = object.get("parse").getAsString(); - String url = object.get("url").getAsString(); - if (parse.equals("1")) { - loadWebView(url); + public void setMediaSource(Result result) { + if (result.getParse().equals("1")) { + loadWebView(result.getUrl()); } else { - setMediaSource(getPlayHeader(object), url); + setMediaSource(getPlayHeader(result), result.getUrl()); } } - private HashMap getPlayHeader(JsonObject object) { + private HashMap getPlayHeader(Result result) { HashMap headers = new HashMap<>(); - if (!object.has("header")) return headers; - String header = object.get("header").getAsString(); - JsonElement element = JsonParser.parseString(header); + if (result.getHeader().isEmpty()) return headers; + JsonElement element = JsonParser.parseString(result.getHeader()); if (element.isJsonObject()) { - object = element.getAsJsonObject(); + JsonObject object = element.getAsJsonObject(); for (String key : object.keySet()) headers.put(key, object.get(key).getAsString()); } return headers;