From 59b41396d860a140dd53987392acbfc28510d54d Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 6 Jan 2026 01:27:21 +0800 Subject: [PATCH] Optimize replay --- .../android/tv/ui/activity/VideoActivity.java | 13 +++-- .../com/fongmi/android/tv/bean/Result.java | 10 ++++ .../com/fongmi/android/tv/player/Players.java | 47 ++++++++----------- .../tv/player/exo/ErrorMsgProvider.java | 4 -- .../android/tv/ui/activity/VideoActivity.java | 13 +++-- 5 files changed, 48 insertions(+), 39 deletions(-) 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 8a49804b6..02ffec766 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 @@ -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() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Result.java b/app/src/main/java/com/fongmi/android/tv/bean/Result.java index 7e18ea975..1ced44cd5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Result.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Result.java @@ -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(); } 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 7d93b3dd9..f838744bd 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 @@ -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; + } } } diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/ErrorMsgProvider.java b/app/src/main/java/com/fongmi/android/tv/player/exo/ErrorMsgProvider.java index 7c1ccfb63..ef96e63a7 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/ErrorMsgProvider.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/ErrorMsgProvider.java @@ -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"; 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 f4adb7d44..032b7dd31 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 @@ -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() {