Improve webview parse

pull/102/head
FongMi 4 years ago
parent 578bca6ca4
commit 01f5afc68e
  1. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 14
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  3. 16
      app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java
  4. 16
      app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java
  5. 16
      app/src/main/java/com/fongmi/android/tv/event/ServerEvent.java
  6. 46
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  7. 8
      app/src/main/java/com/fongmi/android/tv/server/Server.java
  8. 33
      app/src/main/java/com/fongmi/android/tv/ui/custom/CustomWebView.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() {

@ -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<String> 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();
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<String, String> 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);
}
}

@ -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);
}
}

@ -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<String> 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<String, String> 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<String, String> get(Map<String, String> headers) {
Map<String, String> 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<String, String> headers, String url) {
handler.removeCallbacks(mTimer);
handler.post(() -> {
stop();
Players.get().setMediaSource(headers, url);
});
}
public void stop() {
stopLoading();
loadUrl("about:blank");

Loading…
Cancel
Save