Support subt

pull/102/head
FongMi 4 years ago
parent 526a756668
commit db94e737d7
  1. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 6
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  3. 41
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  4. 13
      app/src/main/java/com/fongmi/android/tv/player/Players.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());
}

@ -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<String, String> getHeaders() {
return Json.toMap(getHeader());
}

@ -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<String, String> headers, String url) {
return getSource(headers, url, null);
}
private static MediaSource getSource(Map<String, String> 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<String, String> headers, String url) {

@ -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<String, String> headers, String url) {
private void setMediaSource(Result result) {
exoPlayer.setMediaSource(ExoUtil.getSource(result));
PlayerEvent.state(0);
exoPlayer.prepare();
}
private void setMediaSource(Map<String, String> headers, String url) {
exoPlayer.setMediaSource(ExoUtil.getSource(headers, url));
PlayerEvent.state(0);
exoPlayer.prepare();
exoPlayer.play();
}
public void pause() {

Loading…
Cancel
Save