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 2a1c67a34..8068d2f71 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 @@ -285,9 +285,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel.search.observe(this, result -> setSearch(result.getList())); mViewModel.player.observe(this, result -> { boolean useParse = (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1; - mBinding.control.parseLayout.setVisibility(useParse ? View.VISIBLE : View.GONE); startPlay(result, useParse); - resetFocus(useParse); + resetFocus(); }); mViewModel.result.observe(this, result -> { if (result.getList().isEmpty()) setEmpty(); @@ -296,7 +295,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis }); } - private void resetFocus(boolean useParse) { + private void resetFocus() { + boolean useParse = isVisible(mBinding.control.parseLayout); findViewById(R.id.timeBar).setNextFocusUpId(useParse ? R.id.parse : R.id.next); for (int i = 0; i < mBinding.control.actionLayout.getChildCount(); i++) { mBinding.control.actionLayout.getChildAt(i).setNextFocusDownId(useParse ? R.id.parse : R.id.timeBar); @@ -331,6 +331,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void startPlay(Result result, boolean useParse) { if (result != null) { + mBinding.control.parseLayout.setVisibility(mParseAdapter.size() > 0 && useParse ? View.VISIBLE : View.GONE); mPlayers.start(result, useParse); setR3Callback(); } else { @@ -817,7 +818,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void checkError(ErrorEvent event) { - if (event.isParse() && mParseAdapter.size() > 0) checkParse(); + if (event.isParse() && isVisible(mBinding.control.parseLayout)) checkParse(); else if (event.isAds()) onNext(); else checkFlag(); } diff --git a/app/src/main/java/com/fongmi/android/tv/Constant.java b/app/src/main/java/com/fongmi/android/tv/Constant.java index 1f6e2094d..cdb956f8b 100644 --- a/app/src/main/java/com/fongmi/android/tv/Constant.java +++ b/app/src/main/java/com/fongmi/android/tv/Constant.java @@ -8,12 +8,18 @@ public class Constant { public static final int INTERVAL_HIDE = 5 * 1000; //網路偵測間隔 0.5 秒 public static final int INTERVAL_TRAFFIC = 500; - //點播超時時間 30 秒 - public static final int TIMEOUT_VOD = 10 * 1000; + //點播超時時間 15 秒 + public static final int TIMEOUT_VOD = 15 * 1000; //直播超時時間 10 秒 public static final int TIMEOUT_LIVE = 10 * 1000; - //解析超時時間 5 秒 - public static final int TIMEOUT_PARSE = 5 * 1000; + //解析超時時間 30 秒 + public static final int TIMEOUT_PARSE_WEB = 15 * 1000; + //解析超時時間 10 秒 + public static final int TIMEOUT_PARSE_JSON = 10 * 1000; + //解析超時時間 15 秒 + public static final int TIMEOUT_PARSE_JSON_EXT = 15 * 1000; + //解析超時時間 15 秒 + public static final int TIMEOUT_PARSE_JSON_MIX = 15 * 1000; //網路超時時間 30 秒 public static final int TIMEOUT_HTTP = 30 * 1000; //代理超時時間 5 秒 diff --git a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java index 1f5eb521e..29bdf81e8 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java @@ -9,7 +9,6 @@ import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.net.Callback; import com.fongmi.android.tv.utils.Json; -import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.Utils; import com.github.catvod.crawler.Spider; import com.github.catvod.crawler.SpiderNull; @@ -28,7 +27,6 @@ import java.util.Map; public class ApiConfig { - private List ads; private List flags; private List parses; private List sites; @@ -36,9 +34,10 @@ public class ApiConfig { private PyLoader pyLoader; private JsLoader jsLoader; private Config config; - private String wall; private Parse parse; private Site home; + private String wall; + private String ads; private static class Loader { static volatile ApiConfig INSTANCE = new ApiConfig(); @@ -65,10 +64,10 @@ public class ApiConfig { } public ApiConfig init() { + this.ads = null; this.home = null; this.wall = null; this.config = Config.vod(); - this.ads = new ArrayList<>(); this.sites = new ArrayList<>(); this.flags = new ArrayList<>(); this.parses = new ArrayList<>(); @@ -84,9 +83,9 @@ public class ApiConfig { } public ApiConfig clear() { + this.ads = null; this.home = null; this.wall = null; - this.ads.clear(); this.sites.clear(); this.flags.clear(); this.parses.clear(); @@ -152,8 +151,8 @@ public class ApiConfig { if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0)); if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0)); flags.addAll(Json.safeListString(object, "flags")); - ads.addAll(Json.safeListString(object, "ads")); setWall(Json.safeString(object, "wallpaper")); + setAds(Json.safeListString(object, "ads")); } private void parseLive(JsonObject object) { @@ -227,22 +226,15 @@ public class ApiConfig { } public String getAds() { - return ads == null ? "" : ads.toString(); + return ads; } - public Config getConfig() { - return config == null ? Config.vod() : config; + private void setAds(List ads) { + this.ads = TextUtils.join(",", ads); } - public Parse getParse() { - return parse == null ? new Parse() : parse; - } - - public void setParse(Parse parse) { - this.parse = parse; - this.parse.setActivated(true); - config.parse(parse.getName()).update(); - for (Parse item : parses) item.setActivated(parse); + public Config getConfig() { + return config == null ? Config.vod() : config; } public String getWall() { @@ -264,4 +256,15 @@ public class ApiConfig { config.home(home.getKey()).update(); for (Site item : getSites()) item.setActivated(home); } + + public Parse getParse() { + return parse == null ? new Parse() : parse; + } + + public void setParse(Parse parse) { + this.parse = parse; + this.parse.setActivated(true); + config.parse(parse.getName()).update(); + for (Parse item : parses) item.setActivated(parse); + } } \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java b/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java index 426640e8c..762ea690b 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java @@ -56,7 +56,7 @@ public class ParseTask { private void execute(Result result) { executor.execute(() -> { try { - executor.submit(getTask(result)).get(Constant.TIMEOUT_PARSE, TimeUnit.MILLISECONDS); + executor.submit(getTask(result)).get(getTimeout(), TimeUnit.MILLISECONDS); } catch (Throwable e) { onParseError(); } @@ -73,6 +73,21 @@ public class ParseTask { }; } + private int getTimeout() { + switch (parse.getType()) { + case 0: //嗅探 + return Constant.TIMEOUT_PARSE_WEB; + case 1: //Json + return Constant.TIMEOUT_PARSE_JSON; + case 2: //Json 擴展 + return Constant.TIMEOUT_PARSE_JSON_EXT; + case 3: //聚合 + return Constant.TIMEOUT_PARSE_JSON_MIX; + default: + return Constant.TIMEOUT_VOD; + } + } + private void doInBackground(String key, String webUrl, String flag) throws Exception { switch (parse.getType()) { case 0: //嗅探 diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java index 65b6b28fd..317028d0a 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.java @@ -34,7 +34,6 @@ public class CustomWebView extends WebView { private WebResourceResponse empty; private List keys; private String key; - private String ads; public static CustomWebView create(@NonNull Context context) { return new CustomWebView(context); @@ -47,7 +46,6 @@ public class CustomWebView extends WebView { @SuppressLint("SetJavaScriptEnabled") public void initSettings() { - this.ads = ApiConfig.get().getAds(); this.keys = Arrays.asList("user-agent", "referer", "origin"); this.empty = new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())); getSettings().setUseWideViewPort(true); @@ -84,7 +82,7 @@ public class CustomWebView extends WebView { public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); String host = request.getUrl().getHost(); - if (ads.contains(host)) return empty; + if (ApiConfig.get().getAds().contains(host)) return empty; Map headers = request.getRequestHeaders(); if (isVideoFormat(url, headers)) post(headers, url); return super.shouldInterceptRequest(view, request);