Optimize replay

release
FongMi 4 months ago
parent f315e64d8c
commit 59b41396d8
  1. 13
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  2. 10
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  3. 47
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  4. 4
      app/src/main/java/com/fongmi/android/tv/player/exo/ErrorMsgProvider.java
  5. 13
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java

@ -239,6 +239,10 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
return mHistory != null && mHistory.getScale() != -1 ? mHistory.getScale() : Setting.getScale();
}
private boolean isReplay() {
return Setting.getReset() == 1;
}
private boolean isFromCollect() {
return getIntent().getBooleanExtra("collect", false);
}
@ -515,6 +519,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
private void setPlayer(Result result) {
result.getUrl().set(mQualityAdapter.getPosition());
if (!result.getArtwork().isEmpty()) setArtwork(result.getArtwork());
if (result.hasPosition()) mHistory.setPosition(result.getPosition());
if (!result.getDesc().isEmpty()) setText(mBinding.content, R.string.detail_content, result.getDesc());
setUseParse(VodConfig.hasParse() && ((result.getPlayUrl().isEmpty() && VodConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1));
mPlayers.start(result, isUseParse(), getSite().isChangeable() ? getSite().getTimeout() : -1);
@ -744,14 +749,14 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
}
private void onReset() {
boolean refresh = Setting.getReset() == 0;
if (refresh) onRefresh();
else onReplay();
if (isReplay()) onReplay();
else onRefresh();
}
private void onReplay() {
mHistory.setPosition(C.TIME_UNSET);
if (mPlayers.isEmpty()) onRefresh();
else mPlayers.replay(mHistory.getOpening());
else mPlayers.setMediaItem();
}
private void onRefresh() {

@ -83,6 +83,8 @@ public class Result implements Parcelable {
private String click;
@SerializedName("key")
private String key;
@SerializedName("position")
private Long position;
@SerializedName("pagecount")
private Integer pagecount;
@SerializedName("parse")
@ -267,6 +269,10 @@ public class Result implements Parcelable {
this.key = key;
}
public Long getPosition() {
return position;
}
public Integer getPageCount() {
return pagecount == null ? 0 : pagecount;
}
@ -299,6 +305,10 @@ public class Result implements Parcelable {
return !getMsg().isEmpty();
}
public boolean hasPosition() {
return getPosition() != null;
}
public String getRealUrl() {
return getPlayUrl() + getUrl().v();
}

@ -402,12 +402,6 @@ public class Players implements Player.Listener, ParseCallback {
stopParse();
}
public void replay(long time) {
seekTo(time);
prepare();
play();
}
public void release() {
stopParse();
releasePlayer();
@ -469,7 +463,7 @@ public class Players implements Player.Listener, ParseCallback {
return subs;
}
private void setMediaItem() {
public void setMediaItem() {
if (url != null) setMediaItem(headers, url, format, drm, subs, danmakus, Constant.TIMEOUT_PLAY);
}
@ -672,26 +666,25 @@ public class Players implements Player.Listener, ParseCallback {
@Override
public void onPlayerError(@NonNull PlaybackException e) {
if (++retry > 2) ErrorEvent.extract(tag, provider.get(e));
else if (provider.isInvalidLength(e)) replay(C.TIME_UNSET);
else switch (e.errorCode) {
case PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW:
seekToDefaultPosition();
break;
case PlaybackException.ERROR_CODE_DECODER_INIT_FAILED:
case PlaybackException.ERROR_CODE_DECODER_QUERY_FAILED:
case PlaybackException.ERROR_CODE_DECODING_FAILED:
toggleDecode();
break;
case PlaybackException.ERROR_CODE_IO_UNSPECIFIED:
case PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED:
case PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED:
case PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED:
case PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED:
setFormat(ExoUtil.getMimeType(e.errorCode));
break;
default:
setMediaItem();
break;
}
case PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW:
seekToDefaultPosition();
break;
case PlaybackException.ERROR_CODE_DECODER_INIT_FAILED:
case PlaybackException.ERROR_CODE_DECODER_QUERY_FAILED:
case PlaybackException.ERROR_CODE_DECODING_FAILED:
toggleDecode();
break;
case PlaybackException.ERROR_CODE_IO_UNSPECIFIED:
case PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED:
case PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED:
case PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED:
case PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED:
setFormat(ExoUtil.getMimeType(e.errorCode));
break;
default:
ErrorEvent.extract(tag, provider.get(e));
break;
}
}
}

@ -4,10 +4,6 @@ import androidx.media3.common.PlaybackException;
public class ErrorMsgProvider {
public boolean isInvalidLength(PlaybackException e) {
return e.getCause() != null && e.getCause().getMessage() != null && e.getCause().getMessage().startsWith("Invalid NAL length");
}
public String get(PlaybackException e) {
return switch (e.errorCode) {
case PlaybackException.ERROR_CODE_TIMEOUT -> "Timeout";

@ -234,6 +234,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
return mHistory != null && mHistory.getScale() != -1 ? mHistory.getScale() : Setting.getScale();
}
private boolean isReplay() {
return Setting.getReset() == 1;
}
private boolean isFromCollect() {
return getIntent().getBooleanExtra("collect", false);
}
@ -545,6 +549,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void setPlayer(Result result) {
result.getUrl().set(mQualityAdapter.getPosition());
if (!result.getArtwork().isEmpty()) setArtwork(result.getArtwork());
if (result.hasPosition()) mHistory.setPosition(result.getPosition());
if (!result.getDesc().isEmpty()) setText(mBinding.content, R.string.detail_content, result.getDesc());
setUseParse(VodConfig.hasParse() && ((result.getPlayUrl().isEmpty() && VodConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1));
if (mControlDialog != null && mControlDialog.isVisible()) mControlDialog.setParseVisible(isUseParse());
@ -776,14 +781,14 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
}
private void onReset() {
boolean refresh = Setting.getReset() == 0;
if (refresh) onRefresh();
else onReplay();
if (isReplay()) onReplay();
else onRefresh();
}
private void onReplay() {
mHistory.setPosition(C.TIME_UNSET);
if (mPlayers.isEmpty()) onRefresh();
else mPlayers.replay(mHistory.getOpening());
else mPlayers.setMediaItem();
}
private void onRefresh() {

Loading…
Cancel
Save