diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java index 69e4fba2b..1a66a461f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java @@ -329,9 +329,10 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List } private void onCheck(ErrorEvent event) { - if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); - else if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); - else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); + if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); + else if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.getRetry() == 1) mPlayers.init(mBinding.exo); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.isHard()) onDecode(); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODING_FAILED && mPlayers.isHard()) onDecode(); else onError(event); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index f995006c0..91ce77954 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -87,6 +87,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private Runnable mR3; private Runnable mR4; private Clock mClock; + private boolean initTrack; private int count; public static void start(Context context) { @@ -633,6 +634,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onTrackClick(Track item) { + item.setKey(mPlayers.getUrl()); + item.save(); } @Override @@ -700,6 +703,9 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { switch (event.getState()) { + case PlayerEvent.PREPARE: + setInitTrack(true); + break; case Player.STATE_BUFFERING: showProgress(); break; @@ -711,6 +717,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick break; case PlayerEvent.TRACK: setMetadata(); + setInitTrack(); mPlayers.reset(); setTrackVisible(); break; @@ -727,6 +734,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.control.speed.setVisibility(mPlayers.isVod() ? View.VISIBLE : View.GONE); } + private void setInitTrack() { + if (isInitTrack()) { + setInitTrack(false); + mPlayers.setTrack(Track.find(mPlayers.getUrl())); + } + } + private void setMetadata() { String title = mBinding.widget.name.getText().toString(); String artist = mBinding.widget.play.getText().toString(); @@ -741,9 +755,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void onCheck(ErrorEvent event) { - if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); - else if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); - else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); + if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); + else if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.getRetry() == 1) mPlayers.init(mBinding.exo); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.isHard()) onDecode(); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODING_FAILED && mPlayers.isHard()) onDecode(); else onError(event); } @@ -809,6 +824,14 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick hideCenter(); } + private boolean isInitTrack() { + return initTrack; + } + + private void setInitTrack(boolean initTrack) { + this.initTrack = initTrack; + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { if (isVisible(mBinding.control.getRoot())) setR1Callback(); 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 fe81617e4..ba56cb1f9 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 @@ -91,9 +91,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.Map; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -1098,9 +1098,10 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void onCheck(ErrorEvent event) { - if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); - else if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); - else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); + if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); + else if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.getRetry() == 1) mPlayers.init(mBinding.exo); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.isHard()) onDecode(); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODING_FAILED && mPlayers.isHard()) onDecode(); else onError(event); } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Track.java b/app/src/main/java/com/fongmi/android/tv/bean/Track.java index ff6c5f96f..1bcdce56f 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Track.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Track.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.bean; import androidx.annotation.NonNull; -import androidx.media3.common.C; import androidx.room.Entity; import androidx.room.Index; import androidx.room.PrimaryKey; @@ -98,7 +97,6 @@ public class Track { } public void save() { - if (getType() != C.TRACK_TYPE_TEXT) return; AppDatabase.get().getTrackDao().insert(this); } diff --git a/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java b/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java index c1ac0700c..d2ec7ff70 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java +++ b/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java @@ -12,7 +12,7 @@ import java.util.List; @Dao public abstract class TrackDao extends BaseDao { - @Query("SELECT * FROM Track WHERE `key` = :key and type = 3") + @Query("SELECT * FROM Track WHERE `key` = :key") public abstract List find(String key); @Insert(onConflict = OnConflictStrategy.REPLACE) 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 566b82e5d..ccb885e61 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 @@ -178,6 +178,10 @@ public class Players implements Player.Listener, ParseCallback { return exoPlayer == null ? 0 : exoPlayer.getVideoSize().height; } + public int getRetry() { + return retry; + } + public float getSpeed() { return exoPlayer == null ? 1.0f : exoPlayer.getPlaybackParameters().speed; } @@ -230,6 +234,10 @@ public class Players implements Player.Listener, ParseCallback { return decode == HARD; } + public boolean isSoft() { + return decode == SOFT; + } + public boolean isPortrait() { return getVideoHeight() > getVideoWidth(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 81ddec641..5e864f84d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -95,6 +95,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List private Runnable mR3; private Clock mClock; private boolean foreground; + private boolean initTrack; private boolean redirect; private boolean rotate; private boolean stop; @@ -681,6 +682,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Override public void onTrackClick(Track item) { + item.setKey(mPlayers.getUrl()); + item.save(); } @Override @@ -751,6 +754,9 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { switch (event.getState()) { + case PlayerEvent.PREPARE: + setInitTrack(true); + break; case Player.STATE_BUFFERING: showProgress(); break; @@ -763,6 +769,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List break; case PlayerEvent.TRACK: setMetadata(); + setInitTrack(); mPlayers.reset(); setTrackVisible(); break; @@ -779,6 +786,13 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List mBinding.control.action.speed.setVisibility(mPlayers.isVod() ? View.VISIBLE : View.GONE); } + private void setInitTrack() { + if (isInitTrack()) { + setInitTrack(false); + mPlayers.setTrack(Track.find(mPlayers.getUrl())); + } + } + private void setMetadata() { String title = mBinding.widget.name.getText().toString(); String artist = mBinding.widget.play.getText().toString(); @@ -793,9 +807,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List } private void onCheck(ErrorEvent event) { - if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); - else if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); - else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); + if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); + else if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.getRetry() == 1) mPlayers.init(mBinding.exo); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.isHard()) onDecode(); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODING_FAILED && mPlayers.isHard()) onDecode(); else onError(event); } @@ -896,6 +911,14 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List this.foreground = foreground; } + private boolean isInitTrack() { + return initTrack; + } + + private void setInitTrack(boolean initTrack) { + this.initTrack = initTrack; + } + public boolean isRedirect() { return redirect; } 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 ef704283a..76d9520d2 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 @@ -1153,9 +1153,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } private void onCheck(ErrorEvent event) { - if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); - else if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); - else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED) mPlayers.init(mBinding.exo); + if (event.getCode() == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) mPlayers.seekToDefaultPosition(); + else if (event.getCode() == PlaybackException.ERROR_CODE_IO_UNSPECIFIED || event.getCode() >= PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED && event.getCode() <= PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED) mPlayers.setFormat(ExoUtil.getMimeType(event.getCode())); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.getRetry() == 1) mPlayers.init(mBinding.exo); + else if (event.getCode() == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED && mPlayers.isHard()) onDecode(); else if (event.getCode() == PlaybackException.ERROR_CODE_DECODING_FAILED && mPlayers.isHard()) onDecode(); else onError(event); }