diff --git a/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java b/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java index 88cb72d6c..e2fd67195 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java +++ b/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java @@ -133,10 +133,6 @@ public class PlayerManager implements ParseCallback { return spec == null || TextUtils.isEmpty(spec.getUrl()); } - public boolean isHard() { - return engine.isHard(); - } - public boolean isPortrait() { return getVideoHeight() > getVideoWidth(); } @@ -146,11 +142,11 @@ public class PlayerManager implements ParseCallback { } public boolean isLive() { - return player.isCurrentMediaItemLive(); + return engine.isLive(); } public boolean isVod() { - return !player.isCurrentMediaItemLive(); + return engine.isVod(); } public boolean haveTrack(int type) { @@ -233,8 +229,7 @@ public class PlayerManager implements ParseCallback { public void setMetadata(MediaMetadata data) { if (spec != null) spec.setMetadata(data); - MediaItem current = player.getCurrentMediaItem(); - if (current != null) player.replaceMediaItem(player.getCurrentMediaItemIndex(), current.buildUpon().setMediaMetadata(data).build()); + engine.setMetadata(data); } public void setDanmakuView(DanmakuView view) { diff --git a/app/src/main/java/com/fongmi/android/tv/player/engine/ExoPlayerEngine.java b/app/src/main/java/com/fongmi/android/tv/player/engine/ExoPlayerEngine.java index d2f3f6bad..313f5a8e8 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/engine/ExoPlayerEngine.java +++ b/app/src/main/java/com/fongmi/android/tv/player/engine/ExoPlayerEngine.java @@ -1,5 +1,7 @@ package com.fongmi.android.tv.player.engine; +import androidx.media3.common.MediaItem; +import androidx.media3.common.MediaMetadata; import androidx.media3.common.MediaTitle; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; @@ -70,6 +72,22 @@ public class ExoPlayerEngine implements PlayerEngine { startInternal(); } + @Override + public void setMetadata(MediaMetadata data) { + MediaItem current = player.getCurrentMediaItem(); + if (current != null) player.replaceMediaItem(player.getCurrentMediaItemIndex(), current.buildUpon().setMediaMetadata(data).build()); + } + + @Override + public boolean isLive() { + return player.isCurrentMediaItemLive(); + } + + @Override + public boolean isVod() { + return !player.isCurrentMediaItemLive(); + } + @Override public void setTrack(List tracks) { TrackUtil.setTrackSelection(player, tracks); @@ -86,13 +104,13 @@ public class ExoPlayerEngine implements PlayerEngine { } @Override - public boolean haveTitle() { - return !player.getCurrentMediaTitles().isEmpty(); + public Tracks getCurrentTracks() { + return player.getCurrentTracks(); } @Override - public Tracks getCurrentTracks() { - return player.getCurrentTracks(); + public boolean haveTitle() { + return !player.getCurrentMediaTitles().isEmpty(); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/player/engine/PlayerEngine.java b/app/src/main/java/com/fongmi/android/tv/player/engine/PlayerEngine.java index 8868adef2..b069f730d 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/engine/PlayerEngine.java +++ b/app/src/main/java/com/fongmi/android/tv/player/engine/PlayerEngine.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.player.engine; +import androidx.media3.common.MediaMetadata; import androidx.media3.common.MediaTitle; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; @@ -31,6 +32,12 @@ public interface PlayerEngine { void start(PlaySpec spec); + void setMetadata(MediaMetadata data); + + boolean isLive(); + + boolean isVod(); + void setTrack(List tracks); void resetTrack(); diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java index ca1f161c1..5e1cada49 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java @@ -41,7 +41,7 @@ import io.github.anilbeesetti.nextlib.media3ext.ffdecoder.NextRenderersFactory; public class ExoUtil { public static ExoPlayer buildPlayer(int decode, Player.Listener listener) { - ExoPlayer player = new ExoPlayer.Builder(App.get()).setLoadControl(buildLoadControl()).setTrackSelector(buildTrackSelector()).setRenderersFactory(buildRenderersFactory(decode == PlayerEngine.HARD ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER)).setMediaSourceFactory(buildMediaSourceFactory()).build(); + ExoPlayer player = new ExoPlayer.Builder(App.get()).setLoadControl(buildLoadControl()).setTrackSelector(buildTrackSelector()).setRenderersFactory(buildRenderersFactory(getRenderMode(decode))).setMediaSourceFactory(buildMediaSourceFactory()).build(); if (BuildConfig.DEBUG) player.addAnalyticsListener(new EventLogger()); player.setAudioAttributes(AudioAttributes.DEFAULT, true); player.setHandleAudioBecomingNoisy(true); @@ -65,8 +65,8 @@ public class ExoUtil { } 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_STREAM; 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; + if (errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED || errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED) return MimeTypes.APPLICATION_OCTET_STREAM; return null; } @@ -76,6 +76,10 @@ public class ExoUtil { return extras.keySet().stream().filter(key -> extras.getString(key) != null).collect(Collectors.toMap(key -> key, extras::getString)); } + private static int getRenderMode(int decode) { + return decode == PlayerEngine.HARD ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER; + } + private static LoadControl buildLoadControl() { return new DefaultLoadControl.Builder().setBufferDurationsMs(DefaultLoadControl.DEFAULT_MIN_BUFFER_MS * Setting.getBuffer(), DefaultLoadControl.DEFAULT_MAX_BUFFER_MS * Setting.getBuffer(), DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS, DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS).build(); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/exo/MediaSourceFactory.java b/app/src/main/java/com/fongmi/android/tv/player/exo/MediaSourceFactory.java index 8551bfcb5..c303d1c9a 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/exo/MediaSourceFactory.java +++ b/app/src/main/java/com/fongmi/android/tv/player/exo/MediaSourceFactory.java @@ -82,11 +82,11 @@ public class MediaSourceFactory implements MediaSource.Factory { } private DataSource.Factory getDataSourceFactory() { - if (dataSourceFactory == null) dataSourceFactory = buildReadOnlyCacheDataSource(new DefaultDataSource.Factory(App.get(), getHttpDataSourceFactory())); + if (dataSourceFactory == null) dataSourceFactory = getCacheDataSource(new DefaultDataSource.Factory(App.get(), getHttpDataSourceFactory())); return dataSourceFactory; } - private CacheDataSource.Factory buildReadOnlyCacheDataSource(DataSource.Factory upstreamFactory) { + private CacheDataSource.Factory getCacheDataSource(DataSource.Factory upstreamFactory) { return new CacheDataSource.Factory().setCache(getCache()).setUpstreamDataSourceFactory(upstreamFactory).setCacheWriteDataSinkFactory(null).setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR); } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Util.java b/app/src/main/java/com/fongmi/android/tv/utils/Util.java index ce9bb60c5..81126c3e4 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Util.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Util.java @@ -123,7 +123,7 @@ public class Util { StringBuilder sb = new StringBuilder(); text = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY).toString().replace("\u00A0", " ").replace("\u3000", " "); for (String line : text.split("\\r?\\n")) sb.append(line.trim()).append("\n"); - return substring(sb.toString()); + return substring(sb.toString()).trim(); } public static String getAndroidId() {