From db94e737d70775bda70b57a99d0e97f1b642c60e Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 1 Sep 2022 00:11:47 +0800 Subject: [PATCH] Support subt --- .../tv/ui/activity/DetailActivity.java | 4 +- .../com/fongmi/android/tv/bean/Result.java | 6 +++ .../com/fongmi/android/tv/player/ExoUtil.java | 41 ++++++++++--------- .../com/fongmi/android/tv/player/Players.java | 13 ++++-- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 54505a59a..c71c1e16f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -183,7 +183,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen mSiteViewModel.player.observe(this, result -> { boolean useParse = (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1; mControl.parseLayout.setVisibility(useParse ? View.VISIBLE : View.GONE); - Players.get().setMediaSource(result, useParse); + Players.get().parse(result, useParse); resetFocus(useParse); }); mSiteViewModel.result.observe(this, result -> { @@ -268,7 +268,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen mBinding.error.getRoot().setVisibility(View.GONE); mBinding.progress.getRoot().setVisibility(View.VISIBLE); Result result = mSiteViewModel.getPlayer().getValue(); - if (result != null) Players.get().setMediaSource(result, true); + if (result != null) Players.get().parse(result, true); mParseAdapter.notifyArrayItemRangeChanged(0, mParseAdapter.size()); } 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 e8467c7e4..da8db2f69 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 @@ -58,6 +58,8 @@ public class Result { private String flag; @SerializedName("url") private String url; + @SerializedName("subt") + private String sub; public static Result fromJson(String str) { try { @@ -158,6 +160,10 @@ public class Result { this.url = url; } + public String getSub() { + return sub; + } + public Map getHeaders() { return Json.toMap(getHeader()); } 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 5ed888051..647e90400 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 @@ -1,43 +1,46 @@ package com.fongmi.android.tv.player; import android.net.Uri; +import android.text.TextUtils; import com.fongmi.android.tv.App; +import com.fongmi.android.tv.bean.Result; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.ext.rtmp.RtmpDataSource; +import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.source.ProgressiveMediaSource; -import com.google.android.exoplayer2.source.dash.DashMediaSource; -import com.google.android.exoplayer2.source.hls.HlsMediaSource; -import com.google.android.exoplayer2.source.rtsp.RtspMediaSource; -import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; -import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.util.MimeTypes; +import com.google.common.collect.ImmutableList; import java.util.Map; public class ExoUtil { + public static MediaSource getSource(Result result) { + return getSource(result.getHeaders(), result.getPlayUrl() + result.getUrl(), getConfig(result)); + } + public static MediaSource getSource(Map headers, String url) { + return getSource(headers, url, null); + } + + private static MediaSource getSource(Map headers, String url, MediaItem.SubtitleConfiguration config) { Uri videoUri = Uri.parse(url); DataSource.Factory factory = getFactory(headers, url); - MediaItem mediaItem = new MediaItem.Builder().setUri(videoUri).build(); - int type = Util.inferContentType(videoUri); - if (type == C.CONTENT_TYPE_HLS || url.contains("php") || url.contains("m3u8")) { - return new HlsMediaSource.Factory(factory).createMediaSource(mediaItem); - } else if (type == C.CONTENT_TYPE_DASH) { - return new DashMediaSource.Factory(factory).createMediaSource(mediaItem); - } else if (type == C.CONTENT_TYPE_SS) { - return new SsMediaSource.Factory(factory).createMediaSource(mediaItem); - } else if (type == C.CONTENT_TYPE_RTSP) { - return new RtspMediaSource.Factory().createMediaSource(mediaItem); - } else { - return new ProgressiveMediaSource.Factory(factory).createMediaSource(mediaItem); - } + MediaItem.Builder builder = new MediaItem.Builder().setUri(videoUri); + if (url.contains("php") || url.contains("m3u8")) builder.setMimeType(MimeTypes.APPLICATION_M3U8); + if (config != null) builder.setSubtitleConfigurations(ImmutableList.of(config)); + return new DefaultMediaSourceFactory(factory).createMediaSource(builder.build()); + } + + private static MediaItem.SubtitleConfiguration getConfig(Result result) { + if (TextUtils.isEmpty(result.getSub())) return null; + return new MediaItem.SubtitleConfiguration.Builder(Uri.parse(result.getSub())).setMimeType(MimeTypes.APPLICATION_SUBRIP).setSelectionFlags(C.SELECTION_FLAG_DEFAULT).build(); } private static DataSource.Factory getFactory(Map headers, String url) { 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 6e2240430..0ef0dfc92 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 @@ -125,22 +125,27 @@ public class Players implements Player.Listener, ParseTask.Callback { return getCurrentPosition() >= getDuration(); } - public void setMediaSource(Result result, boolean useParse) { + public void parse(Result result, boolean useParse) { if (result.getUrl().isEmpty()) { PlayerEvent.error(R.string.error_play_load); } else if (result.getParse(1) == 1 || result.getJx() == 1) { if (parseTask != null) parseTask.cancel(); parseTask = ParseTask.create(this).run(result, useParse); } else { - setMediaSource(result.getHeaders(), result.getPlayUrl() + result.getUrl()); + setMediaSource(result); } } - public void setMediaSource(Map headers, String url) { + private void setMediaSource(Result result) { + exoPlayer.setMediaSource(ExoUtil.getSource(result)); + PlayerEvent.state(0); + exoPlayer.prepare(); + } + + private void setMediaSource(Map headers, String url) { exoPlayer.setMediaSource(ExoUtil.getSource(headers, url)); PlayerEvent.state(0); exoPlayer.prepare(); - exoPlayer.play(); } public void pause() {