diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index 89792434d..b4cb02382 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -35,17 +35,18 @@ public class ExoUtil { return new CaptionStyleCompat(Color.WHITE, Color.TRANSPARENT, Color.TRANSPARENT, CaptionStyleCompat.EDGE_TYPE_OUTLINE, Color.BLACK, null); } - public static MediaSource getSource(Result result) { - return getSource(result.getHeaders(), result.getPlayUrl() + result.getUrl(), getConfig(result)); + public static MediaSource getSource(Result result, boolean malformed) { + return getSource(result.getHeaders(), result.getPlayUrl() + result.getUrl(), malformed, getConfig(result)); } - public static MediaSource getSource(Map headers, String url) { - return getSource(headers, url, Collections.emptyList()); + public static MediaSource getSource(Map headers, String url, boolean malformed) { + return getSource(headers, url, malformed, Collections.emptyList()); } - private static MediaSource getSource(Map headers, String url, List config) { + private static MediaSource getSource(Map headers, String url, boolean malformed, List config) { MediaItem.Builder builder = new MediaItem.Builder().setUri(Uri.parse(url)); if (url.contains("m3u8")) builder.setMimeType(MimeTypes.APPLICATION_M3U8); + if (malformed) builder.setMimeType(MimeTypes.APPLICATION_OCTET); if (config.size() > 0) builder.setSubtitleConfigurations(config); return new DefaultMediaSourceFactory(getDataSourceFactory(headers)).createMediaSource(builder.build()); } 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 8c9812fa1..f44b647d7 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 @@ -27,6 +27,7 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca private Formatter formatter; private ExoPlayer exoPlayer; private ParseTask parseTask; + private boolean malformed; private int retry; public Players init() { @@ -155,15 +156,17 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca } private void setMediaSource(Result result) { - exoPlayer.setMediaSource(ExoUtil.getSource(result)); + exoPlayer.setMediaSource(ExoUtil.getSource(result, malformed)); PlayerEvent.state(0); exoPlayer.prepare(); + malformed = false; } private void setMediaSource(Map headers, String url) { - exoPlayer.setMediaSource(ExoUtil.getSource(headers, url)); + exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, malformed)); PlayerEvent.state(0); exoPlayer.prepare(); + malformed = false; } @Override @@ -179,6 +182,7 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca @Override public void onPlayerError(@NonNull PlaybackException error) { + malformed = error.errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED; PlayerEvent.error(R.string.error_play_format, true); } @@ -189,6 +193,6 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca @Override public void onAudioSinkError(@NonNull EventTime eventTime, @NonNull Exception audioSinkError) { - seekTo(1000); + seekTo(500); } }