diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java index d79f220ec..2efb40e39 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java @@ -364,7 +364,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { - if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) onError(event); else onReset(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index f291208ab..c214dbd26 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -798,7 +798,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { if (addErrorCount() > 20) onErrorEnd(event); - else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else fetch(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 6c42d1bbb..a71bfd850 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -312,6 +312,7 @@ public class SettingActivity extends BaseActivity implements BackupCallback, Con public void setProxy(String proxy) { Source.get().stop(); Setting.putProxy(proxy); + OkHttp.selector().clear(); OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); VodConfig.load(Config.vod(), getCallback()); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 34db5bb24..5a4c66557 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -14,6 +14,7 @@ import android.text.style.ClickableSpan; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.RelativeLayout; import android.widget.TextView; @@ -549,6 +550,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mBinding.widget.title.setText(getString(R.string.detail_title, mBinding.name.getText(), episode.getName())); mBinding.display.title.setText(mBinding.widget.title.getText()); mViewModel.playerContent(getKey(), flag.getFlag(), episode.getUrl()); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); updateHistory(episode, replay); mPlayers.clear(); mPlayers.stop(); @@ -1396,6 +1398,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List if (mBinding.control.loop.isActivated()) { onReset(true); } else { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); checkNext(); } } @@ -1425,7 +1428,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List public void onErrorEvent(ErrorEvent event) { if (isBackground()) return; if (addErrorCount() > 20) onErrorEnd(event); - else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else onRefresh(); } @@ -1578,6 +1581,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void onPaused(boolean visible) { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mBinding.widget.exoDuration.setText(mPlayers.getDurationTime()); mBinding.widget.exoPosition.setText(mPlayers.getPositionTime(0)); if (visible) showInfoAndCenter(); @@ -1586,6 +1590,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void onPlay() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mPlayers.play(); hideCenter(); } diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java index 48a7f4f1e..5950ae99b 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java @@ -13,20 +13,25 @@ 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; +import com.fongmi.android.tv.bean.Rule; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.ui.activity.LiveActivity; import com.fongmi.android.tv.utils.Notify; +import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class LiveConfig { private List lives; + private List rules; + private List ads; private Config config; private boolean sync; private Live home; @@ -73,6 +78,9 @@ public class LiveConfig { public LiveConfig init() { this.home = null; + this.ads = new ArrayList<>(); + this.rules = new ArrayList<>(); + this.lives = new ArrayList<>(); return config(Config.live()); } @@ -84,8 +92,10 @@ public class LiveConfig { } public LiveConfig clear() { - getLives().clear(); this.home = null; + this.ads.clear(); + this.rules.clear(); + this.lives.clear(); return this; } @@ -118,8 +128,7 @@ public class LiveConfig { private void parseText(String text, Callback callback) { Live live = new Live(config.getUrl()).sync(); LiveParser.text(live, text); - getLives().remove(live); - getLives().add(live); + lives.add(live); setHome(live, true); App.post(callback::success); } @@ -144,15 +153,33 @@ public class LiveConfig { } private void parseConfig(JsonObject object, Callback callback) { - List lives = Json.safeListElement(object, "lives"); - if (lives.size() > 0) for (JsonElement element : lives) add(Live.objectFrom(element).check()); - for (Live live : getLives()) if (live.getName().equals(config.getHome())) setHome(live, true); - if (home == null) setHome(getLives().isEmpty() ? new Live() : getLives().get(0), true); - if (callback != null) App.post(callback::success); + try { + initLive(object); + initOther(object); + } catch (Throwable e) { + e.printStackTrace(); + } finally { + if (callback != null) App.post(callback::success); + } + } + + private void initLive(JsonObject object) { + for (JsonElement element : Json.safeListElement(object, "lives")) { + Live live = Live.objectFrom(element); + if (lives.contains(live)) continue; + lives.add(live.sync()); + } + for (Live live : lives) { + if (live.getName().equals(config.getHome())) { + setHome(live, true); + } + } } - private void add(Live live) { - if (!getLives().contains(live)) getLives().add(live.sync()); + private void initOther(JsonObject object) { + if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0), true); + setRules(Rule.arrayFrom(object.getAsJsonArray("rules"))); + setAds(Json.safeListString(object, "ads")); } private void bootLive() { @@ -208,6 +235,24 @@ public class LiveConfig { return sync || TextUtils.isEmpty(config.getUrl()) || url.equals(config.getUrl()); } + public List getRules() { + return rules == null ? Collections.emptyList() : rules; + } + + public void setRules(List rules) { + for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().addAll(rule.getHosts()); + rules.remove(Rule.create("proxy")); + this.rules = rules; + } + + public List getAds() { + return ads == null ? Collections.emptyList() : ads; + } + + private void setAds(List ads) { + this.ads = ads; + } + public List getLives() { return lives == null ? lives = new ArrayList<>() : lives; } 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 2555b1421..3f95c9b00 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 @@ -75,8 +75,12 @@ public class VodConfig { return get().getSites().indexOf(get().getHome()); } + public static boolean hasUrl() { + return getUrl() != null && getUrl().length() > 0; + } + public static boolean hasParse() { - return get().getParses().size() > 0; + return !get().getParses().isEmpty(); } public static void load(Config config, Callback callback) { @@ -302,7 +306,7 @@ public class VodConfig { } public void setRules(List rules) { - for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().setHosts(rule.getHosts()); + for (Rule rule : rules) if ("proxy".equals(rule.getName())) OkHttp.selector().addAll(rule.getHosts()); rules.remove(Rule.create("proxy")); this.rules = rules; } diff --git a/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java b/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java index e90f0fcc5..6093181e9 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java @@ -65,6 +65,10 @@ public class ErrorEvent { return code; } + public boolean isDecode() { + return code / 1000 == 4; + } + public String getMsg() { if (type == Type.URL) return ResUtil.getString(R.string.error_play_url, code); if (type == Type.FLAG) return ResUtil.getString(R.string.error_play_flag); 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 46a8f01a1..daec1b17c 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 @@ -222,8 +222,8 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal this.position = position; } - public int addCount() { - return ++count; + public boolean canToggleDecode() { + return isExo() && ++count <= 1; } public void reset() { @@ -242,8 +242,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal } public int addRetry() { - ++retry; - return retry; + return ++retry; } public String stringToTime(long time) { 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 bfe7e0106..3a8a0f47c 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 @@ -26,6 +26,7 @@ import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.impl.ParseCallback; @@ -201,7 +202,9 @@ public class CustomWebView extends WebView implements DialogInterface.OnDismissL private boolean isAd(String host) { for (String ad : VodConfig.get().getAds()) if (host.contains(ad)) return true; + for (String ad : LiveConfig.get().getAds()) if (host.contains(ad)) return true; for (String ad : VodConfig.get().getAds()) if (Pattern.compile(ad).matcher(host).find()) return true; + for (String ad : LiveConfig.get().getAds()) if (Pattern.compile(ad).matcher(host).find()) return true; return false; } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java index c61587971..cbd113615 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java @@ -3,6 +3,7 @@ package com.fongmi.android.tv.utils; import android.net.Uri; import android.text.TextUtils; +import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.bean.Rule; import com.github.catvod.utils.Json; @@ -40,6 +41,7 @@ public class Sniffer { if (uri.getHost() == null) return Rule.empty(); String hosts = TextUtils.join(",", Arrays.asList(UrlUtil.host(uri), UrlUtil.host(uri.getQueryParameter("url")))); for (Rule rule : VodConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule; + for (Rule rule : LiveConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule; return Rule.empty(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 5320c5b41..86574f88e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -863,7 +863,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { if (addErrorCount() > 20) onErrorEnd(event); - else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else fetch(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index e0597aec2..2dec1ed30 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1364,7 +1364,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo public void onErrorEvent(ErrorEvent event) { if (isRedirect()) return; if (addErrorCount() > 20) onErrorEnd(event); - else if (event.getCode() / 1000 == 4 && mPlayers.isExo() && mPlayers.addCount() <= 1) onDecode(false); + else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false); else if (mPlayers.addRetry() > event.getRetry()) checkError(event); else onRefresh(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java index 6f13cfaef..84ecd8096 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java @@ -323,6 +323,7 @@ public class SettingFragment extends BaseFragment implements BackupCallback, Con public void setProxy(String proxy) { Source.get().stop(); Setting.putProxy(proxy); + OkHttp.selector().clear(); OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); VodConfig.load(Config.vod(), getCallback()); diff --git a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java index 66e63606c..f79b60d55 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java +++ b/catvod/src/main/java/com/github/catvod/net/OkProxySelector.java @@ -12,16 +12,25 @@ import java.net.Proxy; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; +import java.util.ArrayList; import java.util.Collections; import java.util.List; public class OkProxySelector extends ProxySelector { - private List hosts; + private final List hosts; private Proxy proxy; - public void setHosts(List hosts) { - this.hosts = hosts; + public OkProxySelector() { + this.hosts = new ArrayList<>(); + } + + public void addAll(List hosts) { + this.hosts.addAll(hosts); + } + + public void clear() { + this.hosts.clear(); } public void setProxy(String proxy) { @@ -30,7 +39,7 @@ public class OkProxySelector extends ProxySelector { @Override public List select(URI uri) { - if (proxy == null || hosts == null || hosts.isEmpty() || uri.getHost() == null || "127.0.0.1".equals(uri.getHost())) return Collections.singletonList(Proxy.NO_PROXY); + if (proxy == null || hosts.isEmpty() || uri.getHost() == null || "127.0.0.1".equals(uri.getHost())) return Collections.singletonList(Proxy.NO_PROXY); for (String host : hosts) if (Util.containOrMatch(uri.getHost(), host)) return Collections.singletonList(proxy); return Collections.singletonList(Proxy.NO_PROXY); }