Adjust exo error logic

pull/563/head
okjack 1 year ago
parent 6f8b52a867
commit 20f1bb97f7
  1. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
  2. 10
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 10
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  4. 4
      app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java
  5. 36
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  6. 9
      app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java
  7. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  8. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java

@ -221,8 +221,8 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.init(getExo(), getIjk());
mPlayers.setMediaSource();
setDecodeView();
onReset();
}
private void onTrack(View view) {
@ -364,11 +364,17 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
@Subscribe(threadMode = ThreadMode.MAIN)
public void onErrorEvent(ErrorEvent event) {
if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (mPlayers.addRetry() > event.getRetry()) onError(event);
if (mPlayers.addRetry() > event.getRetry()) onError(event);
else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (event.isFormat() && mPlayers.isExo()) onErrorFormat(event);
else onReset();
}
private void onErrorFormat(ErrorEvent event) {
mPlayers.setFormat(ExoUtil.getMimeType(event.getCode()));
mPlayers.setMediaSource();
}
private void onError(ErrorEvent event) {
showError(event.getMsg());
onStopped();

@ -431,8 +431,8 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, GroupP
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.init(getExo(), getIjk());
mPlayers.setMediaSource();
setDecodeView();
fetch();
}
private void hideUI() {
@ -798,11 +798,17 @@ 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.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (mPlayers.addRetry() > event.getRetry()) checkError(event);
else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (event.isFormat() && mPlayers.isExo()) onErrorFormat(event);
else fetch();
}
private void onErrorFormat(ErrorEvent event) {
mPlayers.setFormat(ExoUtil.getMimeType(event.getCode()));
mPlayers.setMediaSource();
}
private void checkError(ErrorEvent event) {
if (mChannel != null && mChannel.getPlayerType() == -1 && event.isUrl() && event.getRetry() > 0 && getToggleCount() < 2 && mPlayers.getPlayer() != Players.SYS) {
toggleCount++;

@ -1073,8 +1073,8 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.init(getExo(), getIjk());
mPlayers.setMediaSource();
setDecodeView();
onRefresh();
}
private void onTrack(View view) {
@ -1428,11 +1428,17 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
public void onErrorEvent(ErrorEvent event) {
if (isBackground()) return;
if (addErrorCount() > 20) onErrorEnd(event);
else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (mPlayers.addRetry() > event.getRetry()) checkError(event);
else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (event.isFormat() && mPlayers.isExo()) onErrorFormat(event);
else onRefresh();
}
private void onErrorFormat(ErrorEvent event) {
mPlayers.setFormat(ExoUtil.getMimeType(event.getCode()));
mPlayers.setMediaSource();
}
private void checkError(ErrorEvent event) {
if (getSite().getPlayerType() == -1 && event.isUrl() && event.getRetry() > 0 && getToggleCount() < 2 && mPlayers.getPlayer() != Players.SYS) {
toggleCount++;

@ -69,6 +69,10 @@ public class ErrorEvent {
return code / 1000 == 4;
}
public boolean isFormat() {
return code / 1000 == 3;
}
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);

@ -81,8 +81,10 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
private DanmakuView danmuView;
private ExoPlayer exoPlayer;
private ParseJob parseJob;
private List<Sub> subs;
private String format;
private String url;
private Drm drm;
private Sub sub;
private long position;
@ -169,12 +171,6 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
danmuView = view;
}
public void setSub(Sub sub) {
this.sub = sub;
if (isIjk()) return;
setMediaSource();
}
public ExoPlayer exo() {
return exoPlayer;
}
@ -183,16 +179,26 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
return ijkPlayer;
}
public Map<String, String> getHeaders() {
return headers == null ? new HashMap<>() : checkUa(headers);
public MediaSessionCompat getSession() {
return session;
}
public String getUrl() {
return url;
}
public MediaSessionCompat getSession() {
return session;
public Map<String, String> getHeaders() {
return headers == null ? new HashMap<>() : headers;
}
public void setSub(Sub sub) {
this.sub = sub;
if (isIjk()) return;
setMediaSource();
}
public void setFormat(String format) {
this.format = format;
}
public void setMetadata(MediaMetadataCompat metadata) {
@ -238,6 +244,8 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
public void clear() {
headers = null;
format = null;
subs = null;
drm = null;
url = null;
}
@ -521,8 +529,8 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
parseJob = null;
}
private void setMediaSource() {
setMediaSource(headers, url, format, null, new ArrayList<>(), Constant.TIMEOUT_PLAY);
public void setMediaSource() {
setMediaSource(headers, url, format, drm, subs, Constant.TIMEOUT_PLAY);
}
public void setMediaSource(String url) {
@ -543,7 +551,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
private void setMediaSource(Map<String, String> headers, String url, String format, Drm drm, List<Sub> subs, int timeout) {
if (isIjk() && ijkPlayer != null) ijkPlayer.setMediaSource(IjkUtil.getSource(this.headers = checkUa(headers), this.url = url), position);
if (isExo() && exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), ExoUtil.getMimeType(this.format = format, error), drm, checkSub(subs), decode), position);
if (isExo() && exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), this.format = format, this.drm = drm, checkSub(this.subs = subs), decode), position);
if (isExo() && exoPlayer != null) exoPlayer.prepare();
Logger.t(TAG).d(error + "," + url);
App.post(runnable, timeout);
@ -600,7 +608,7 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, ParseCal
}
private List<Sub> checkSub(List<Sub> subs) {
if (sub == null) return subs;
if (sub == null) return new ArrayList<>();
subs.add(0, sub);
return subs;
}

@ -83,15 +83,18 @@ public class ExoUtil {
return MimeTypes.APPLICATION_SUBRIP;
}
public static String getMimeType(String format, int errorCode) {
if (format != null) return format;
public static String getMimeType(int errorCode) {
if (errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED || errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED) return MimeTypes.APPLICATION_OCTET;
if (errorCode == PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED || errorCode == PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED || errorCode == PlaybackException.ERROR_CODE_IO_UNSPECIFIED) return MimeTypes.APPLICATION_M3U8;
return null;
}
public static int getRetry(int errorCode) {
return errorCode >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && errorCode <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED || errorCode == PlaybackException.ERROR_CODE_IO_UNSPECIFIED ? 2 : errorCode > 999 ? 1 : 0;
if (errorCode == PlaybackException.ERROR_CODE_IO_UNSPECIFIED) return 2;
if (errorCode == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) return 2;
if (errorCode >= PlaybackException.ERROR_CODE_DECODER_QUERY_FAILED && errorCode <= PlaybackException.ERROR_CODE_DECODING_FORMAT_UNSUPPORTED) return 2;
if (errorCode >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && errorCode <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) return 2;
return 1;
}
public static MediaItem getMediaItem(Map<String, String> headers, Uri uri, String mimeType, Drm drm, List<Sub> subs, int decode) {

@ -469,9 +469,9 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.init(getExo(), getIjk());
mPlayers.setMediaSource();
setDecodeView();
setR1Callback();
fetch();
}
private boolean onChoose() {
@ -865,11 +865,17 @@ 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.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (mPlayers.addRetry() > event.getRetry()) checkError(event);
else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (event.isFormat() && mPlayers.isExo()) onErrorFormat(event);
else fetch();
}
private void onErrorFormat(ErrorEvent event) {
mPlayers.setFormat(ExoUtil.getMimeType(event.getCode()));
mPlayers.setMediaSource();
}
private void checkError(ErrorEvent event) {
if (mChannel != null && mChannel.getPlayerType() == -1 && event.isUrl() && event.getRetry() > 0 && getToggleCount() < 2 && mPlayers.getPlayer() != Players.SYS) {
toggleCount++;

@ -925,9 +925,9 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void onDecode(boolean save) {
mPlayers.toggleDecode(save);
mPlayers.init(getExo(), getIjk());
mPlayers.setMediaSource();
setDecodeView();
setR1Callback();
onRefresh();
}
private void onEnding() {
@ -1380,11 +1380,17 @@ 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.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (mPlayers.addRetry() > event.getRetry()) checkError(event);
else if (event.isDecode() && mPlayers.canToggleDecode()) onDecode(false);
else if (event.isFormat() && mPlayers.isExo()) onErrorFormat(event);
else onRefresh();
}
private void onErrorFormat(ErrorEvent event) {
mPlayers.setFormat(ExoUtil.getMimeType(event.getCode()));
mPlayers.setMediaSource();
}
private void checkError(ErrorEvent event) {
if (getSite().getPlayerType() == -1 && event.isUrl() && event.getRetry() > 0 && getToggleCount() < 2 && mPlayers.getPlayer() != Players.SYS) {
toggleCount++;

Loading…
Cancel
Save