From 01f5afc68e1be737d8f5dcaf72e8e184753ce7a3 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 15 Aug 2022 15:52:36 +0800 Subject: [PATCH] Improve webview parse --- .../tv/ui/activity/DetailActivity.java | 2 +- .../tv/ui/activity/SettingActivity.java | 14 +++--- .../fongmi/android/tv/event/PlayerEvent.java | 16 ++++++- .../fongmi/android/tv/event/RefreshEvent.java | 16 ++++--- .../fongmi/android/tv/event/ServerEvent.java | 16 ++++--- .../com/fongmi/android/tv/player/Players.java | 46 ++++--------------- .../com/fongmi/android/tv/server/Server.java | 8 ++-- .../android/tv/ui/custom/CustomWebView.java | 33 ++++++++++++- 8 files changed, 82 insertions(+), 69 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 7a5471eb8..38ef27ff9 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 @@ -356,7 +356,7 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { mHistory.setVodFlag(getVodFlag().getFlag()); mHistory.setCreateTime(System.currentTimeMillis()); AppDatabase.get().getHistoryDao().update(mHistory); - EventBus.getDefault().post(RefreshEvent.history()); + RefreshEvent.history(); } private void updateHistory() { 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 644fcfa2a..e9b407f66 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 @@ -31,8 +31,6 @@ import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; -import org.greenrobot.eventbus.EventBus; - public class SettingActivity extends BaseActivity implements ConfigDialog.Callback { private final ActivityResultLauncher launcherString = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> loadConfig()); @@ -87,16 +85,16 @@ public class SettingActivity extends BaseActivity implements ConfigDialog.Callba @Override public void success() { mBinding.home.setText(ApiConfig.getHomeName()); - EventBus.getDefault().post(RefreshEvent.history()); - EventBus.getDefault().post(RefreshEvent.video()); + RefreshEvent.history(); + RefreshEvent.video(); Notify.dismiss(); } @Override public void error(int resId) { mBinding.home.setText(ApiConfig.getHomeName()); - EventBus.getDefault().post(RefreshEvent.history()); - EventBus.getDefault().post(RefreshEvent.video()); + RefreshEvent.history(); + RefreshEvent.video(); Notify.dismiss(); Notify.show(resId); } @@ -122,7 +120,7 @@ public class SettingActivity extends BaseActivity implements ConfigDialog.Callba mBinding.home.setText(item.getName()); for (int i = 0; i < adapter.size(); i++) ((Site) adapter.get(i)).setHome(item); adapter.notifyArrayItemRangeChanged(0, adapter.size()); - EventBus.getDefault().post(RefreshEvent.video()); + RefreshEvent.video(); Notify.dismiss(); } @@ -132,6 +130,6 @@ public class SettingActivity extends BaseActivity implements ConfigDialog.Callba index = index == 2 ? 0 : ++index; Prefers.putThumbnail(index); mBinding.compress.setText(array[index]); - EventBus.getDefault().post(RefreshEvent.image()); + RefreshEvent.image(); } } diff --git a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java index 86532937c..2e59a20a2 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java @@ -2,16 +2,28 @@ package com.fongmi.android.tv.event; import android.text.TextUtils; +import com.fongmi.android.tv.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; + public class PlayerEvent { private final int state; private String msg; - public PlayerEvent(int state) { + public static void error(int resId) { + EventBus.getDefault().post(new PlayerEvent(ResUtil.getString(resId))); + } + + public static void state(int state) { + EventBus.getDefault().post(new PlayerEvent(state)); + } + + private PlayerEvent(int state) { this.state = state; } - public PlayerEvent(String msg) { + private PlayerEvent(String msg) { this.state = -1; this.msg = msg; } diff --git a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java index 50b9a9162..ac3e361f5 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java @@ -1,22 +1,24 @@ package com.fongmi.android.tv.event; +import org.greenrobot.eventbus.EventBus; + public class RefreshEvent { private final Type type; - public static RefreshEvent image() { - return new RefreshEvent(Type.IMAGE); + public static void image() { + EventBus.getDefault().post(new RefreshEvent(Type.IMAGE)); } - public static RefreshEvent video() { - return new RefreshEvent(Type.VIDEO); + public static void video() { + EventBus.getDefault().post(new RefreshEvent(Type.VIDEO)); } - public static RefreshEvent history() { - return new RefreshEvent(Type.HISTORY); + public static void history() { + EventBus.getDefault().post(new RefreshEvent(Type.HISTORY)); } - public RefreshEvent(Type type) { + private RefreshEvent(Type type) { this.type = type; } diff --git a/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java index e9fa0ebcd..17850d45b 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java @@ -1,23 +1,25 @@ package com.fongmi.android.tv.event; +import org.greenrobot.eventbus.EventBus; + public class ServerEvent { private final String text; private final Type type; - public static ServerEvent search(String text) { - return new ServerEvent(Type.SEARCH, text); + public static void search(String text) { + EventBus.getDefault().post(new ServerEvent(Type.SEARCH, text)); } - public static ServerEvent push(String text) { - return new ServerEvent(Type.PUSH, text); + public static void push(String text) { + EventBus.getDefault().post(new ServerEvent(Type.PUSH, text)); } - public static ServerEvent api(String text) { - return new ServerEvent(Type.API, text); + public static void api(String text) { + EventBus.getDefault().post(new ServerEvent(Type.API, text)); } - public ServerEvent(Type type, String text) { + private ServerEvent(Type type, String text) { this.type = type; this.text = text; } 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 dffcbbad4..19380150d 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 @@ -1,8 +1,5 @@ package com.fongmi.android.tv.player; -import android.os.Handler; -import android.os.Looper; - import androidx.annotation.NonNull; import com.fongmi.android.tv.App; @@ -14,7 +11,6 @@ import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.net.Callback; import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.ui.custom.CustomWebView; -import com.fongmi.android.tv.utils.ResUtil; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; @@ -23,8 +19,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import org.greenrobot.eventbus.EventBus; - import java.io.IOException; import java.util.Formatter; import java.util.HashMap; @@ -41,7 +35,6 @@ public class Players implements Player.Listener { private StringBuilder builder; private Formatter formatter; private ExoPlayer exoPlayer; - private Handler handler; private String key; private static class Loader { @@ -55,7 +48,6 @@ public class Players implements Player.Listener { public void init() { builder = new StringBuilder(); webView = new CustomWebView(App.get()); - handler = new Handler(Looper.getMainLooper()); exoPlayer = new ExoPlayer.Builder(App.get()).build(); formatter = new Formatter(builder, Locale.getDefault()); exoPlayer.addListener(this); @@ -122,7 +114,7 @@ public class Players implements Player.Listener { public void setMediaSource(Result result) { if (result.getUrl().isEmpty()) { - EventBus.getDefault().post(new PlayerEvent(ResUtil.getString(R.string.error_play_load))); + PlayerEvent.error(R.string.error_play_load); } else if (result.getParse().equals("1") || result.getJx().equals("1")) { startParse(result); } else { @@ -158,7 +150,7 @@ public class Players implements Player.Listener { boolean useParse = (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx().equals("1"); Parse parse = getParse(result.getPlayUrl(), useParse); if (parse.getType() == 0) { - loadWebView(parse.getUrl() + result.getUrl()); + webView.start(parse.getUrl() + result.getUrl()); } else if (parse.getType() == 1) { Headers headers = new Headers.Builder().build(); if (parse.hasHeader()) headers = Headers.of(getHeaders(parse.getHeader())); @@ -179,21 +171,11 @@ public class Players implements Player.Listener { } } - private void loadWebView(String url) { - handler.removeCallbacks(mTimer); - handler.postDelayed(mTimer, 30000); - handler.post(() -> webView.start(url)); - } - public void setMediaSource(Map headers, String url) { - handler.post(() -> { - handler.removeCallbacks(mTimer); - exoPlayer.setMediaSource(ExoUtil.getSource(headers, url)); - EventBus.getDefault().post(new PlayerEvent(0)); - exoPlayer.prepare(); - exoPlayer.play(); - webView.stop(); - }); + exoPlayer.setMediaSource(ExoUtil.getSource(headers, url)); + PlayerEvent.state(0); + exoPlayer.prepare(); + exoPlayer.play(); } public void pause() { @@ -229,27 +211,15 @@ public class Players implements Player.Listener { webView.destroy(); webView = null; } - if (handler != null) { - handler = null; - } } - private final Runnable mTimer = new Runnable() { - @Override - public void run() { - EventBus.getDefault().post(new PlayerEvent(ResUtil.getString(R.string.error_play_parse))); - exoPlayer.stop(); - webView.stop(); - } - }; - @Override public void onPlayerError(@NonNull PlaybackException error) { - EventBus.getDefault().post(new PlayerEvent(ResUtil.getString(R.string.error_play_format))); + PlayerEvent.error(R.string.error_play_format); } @Override public void onPlaybackStateChanged(int state) { - EventBus.getDefault().post(new PlayerEvent(state)); + PlayerEvent.state(state); } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/Server.java b/app/src/main/java/com/fongmi/android/tv/server/Server.java index 1bb77827f..4e626207a 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Server.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Server.java @@ -7,8 +7,6 @@ import android.text.format.Formatter; import com.fongmi.android.tv.App; import com.fongmi.android.tv.event.ServerEvent; -import org.greenrobot.eventbus.EventBus; - import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; @@ -85,16 +83,16 @@ public class Server implements Nano.Listener { @Override public void onSearch(String text) { - EventBus.getDefault().post(ServerEvent.search(text)); + ServerEvent.search(text); } @Override public void onPush(String url) { - EventBus.getDefault().post(ServerEvent.push(url)); + ServerEvent.push(url); } @Override public void onApi(String url) { - EventBus.getDefault().post(ServerEvent.api(url)); + ServerEvent.api(url); } } 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 73f87cd3e..fe6f98eb1 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 @@ -3,6 +3,8 @@ package com.fongmi.android.tv.ui.custom; import android.annotation.SuppressLint; import android.content.Context; import android.net.http.SslError; +import android.os.Handler; +import android.os.Looper; import android.webkit.SslErrorHandler; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; @@ -13,7 +15,9 @@ import android.webkit.WebViewClient; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; +import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.utils.Utils; @@ -27,7 +31,9 @@ public class CustomWebView extends WebView { private WebResourceResponse empty; private List keys; + private Handler handler; private String ads; + private int retry; public CustomWebView(@NonNull Context context) { super(context); @@ -39,6 +45,7 @@ public class CustomWebView extends WebView { this.ads = ApiConfig.get().getAds(); this.keys = Arrays.asList("user-agent", "referer", "origin"); this.empty = new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes())); + this.handler = new Handler(Looper.getMainLooper()); getSettings().setUseWideViewPort(true); getSettings().setDatabaseEnabled(true); getSettings().setDomStorageEnabled(true); @@ -53,6 +60,7 @@ public class CustomWebView extends WebView { public void start(String url) { stopLoading(); loadUrl(url); + retry = 0; } private WebViewClient webViewClient() { @@ -63,8 +71,10 @@ public class CustomWebView extends WebView { String url = request.getUrl().toString(); String host = request.getUrl().getHost(); if (ads.contains(host)) return empty; + handler.removeCallbacks(mTimer); + handler.postDelayed(mTimer, 5000); Map headers = request.getRequestHeaders(); - if (Utils.isVideoFormat(url) || headers.containsKey("Range")) Players.get().setMediaSource(get(headers), url); + if (Utils.isVideoFormat(url) || headers.containsKey("Range")) post(get(headers), url); return super.shouldInterceptRequest(view, request); } @@ -80,12 +90,33 @@ public class CustomWebView extends WebView { }; } + private final Runnable mTimer = new Runnable() { + @Override + public void run() { + if (retry > 5) return; + if (retry++ == 5) { + stop(); + PlayerEvent.error(R.string.error_play_parse); + } else { + reload(); + } + } + }; + private Map get(Map headers) { Map news = new HashMap<>(); for (String key : headers.keySet()) if (keys.contains(key.toLowerCase())) news.put(key, headers.get(key)); return news; } + private void post(Map headers, String url) { + handler.removeCallbacks(mTimer); + handler.post(() -> { + stop(); + Players.get().setMediaSource(headers, url); + }); + } + public void stop() { stopLoading(); loadUrl("about:blank");