release
FongMi 2 weeks ago
parent 0765dc62f7
commit 07c9a45a39
  1. 11
      app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java
  2. 26
      app/src/main/java/com/fongmi/android/tv/player/engine/ExoPlayerEngine.java
  3. 7
      app/src/main/java/com/fongmi/android/tv/player/engine/PlayerEngine.java
  4. 8
      app/src/main/java/com/fongmi/android/tv/player/exo/ExoUtil.java
  5. 4
      app/src/main/java/com/fongmi/android/tv/player/exo/MediaSourceFactory.java
  6. 2
      app/src/main/java/com/fongmi/android/tv/utils/Util.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) {

@ -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<Track> 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

@ -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<Track> tracks);
void resetTrack();

@ -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();
}

@ -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);
}

@ -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() {

Loading…
Cancel
Save